Changeset 6620


Ignore:
Timestamp:
Nov 17, 2015, 1:59:51 PM (6 years ago)
Author:
kopal
Message:

TextOutput:

  • optimized behaviour of UI elements -> now textoutput does not do anything if the UI is closed

CrypWin:

  • Fixed NullReference bug when closing a tab

fixes #885

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/TextOutput/TextOutput.cs

    r6567 r6620  
    140140
    141141            textOutputPresentation = new TextOutputPresentation();
     142            textOutputPresentation._textOutput = this;
    142143            setStatusBar();
    143144        }
     
    212213        }
    213214
    214         private void ShowInPresentation(object value)
    215         {
    216             //textOutputPresentation.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    217             //{
    218             //    if (!settings.Append)
    219             //        textOutputPresentation.textBox.Text = null;
    220             //    clearStatusBar();
    221             //}, null);
     215        internal void ShowInPresentation(object value)
     216        {
     217            if (!Presentation.IsVisible)
     218            {
     219                return;
     220            }
    222221
    223222            if (value == null) return;
     
    251250            else if (value is BigInteger)
    252251            {
    253                 //fillValue = BigIntegerHelper.ToBaseString((BigInteger)value, 10);
    254252                fillValue = value.ToString();   // ~ 2x faster than ToBaseString
    255253            }
     
    263261                AddMessage("WARNING - String is too large (" + (fillValue.Length / 1024).ToString("0.00") + " kB), output will be truncated to " + (settings.MaxLength / 1024).ToString("0.00") + "kB", NotificationLevel.Warning);
    264262                fillValue = fillValue.Substring(0, settings.MaxLength);
    265             }           
    266            
    267             Presentation.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    268             {               
    269                 string oldtext = (CurrentValue == null ? String.Empty : CurrentValue);
    270                 string newtext = String.Empty;
    271                 if (settings.Append)
    272                 {
    273                     // append line breaks only if not first line
    274                     if (!string.IsNullOrEmpty(oldtext))
     263            }
     264
     265            //Check if we are in the UI thread
     266            if (Thread.CurrentThread == Application.Current.Dispatcher.Thread)
     267            {
     268                //we are in the UI thread, thus we can directly call
     269                UpdateTextControls(fillValue);
     270            }
     271            else
     272            {
     273                //we are not in the UI thread, thus we have to get into
     274                Presentation.Dispatcher.Invoke(DispatcherPriority.Background, (SendOrPostCallback)delegate
     275                {                   
     276                    UpdateTextControls(fillValue);
     277                }, fillValue);
     278                try
     279                {
     280                    //we give the others component some time to work with the UI thread
     281                    Thread.Sleep(20);
     282                }
     283                catch (Exception ex)
     284                {
     285                    //wtf?
     286                }
     287            }
     288        }
     289
     290        private void UpdateTextControls(string fillValue)
     291        {
     292            if (!Presentation.IsVisible)
     293            {
     294                return;
     295            }
     296            string oldtext = (CurrentValue == null ? String.Empty : CurrentValue);
     297            string newtext = String.Empty;
     298            if (settings.Append)
     299            {
     300                // append line breaks only if not first line
     301                if (!string.IsNullOrEmpty(oldtext))
     302                {
     303                    for (int i = 0; i < settings.AppendBreaks; i++)
     304                        textOutputPresentation.textBox.AppendText("\r");
     305                }
     306                textOutputPresentation.textBox.AppendText(fillValue);
     307                textOutputPresentation.textBox.ScrollToEnd();
     308                newtext = new TextRange(textOutputPresentation.textBox.Document.ContentStart, textOutputPresentation.textBox.Document.ContentEnd).Text;
     309            }
     310            else
     311            {
     312                textOutputPresentation.textBox.Document.Blocks.Clear();
     313                fillValue = fillValue.Replace("\n", "");
     314                textOutputPresentation.textBox.AppendText(fillValue);
     315                newtext = new TextRange(textOutputPresentation.textBox.Document.ContentStart, textOutputPresentation.textBox.Document.ContentEnd).Text;
     316            }
     317
     318            if (settings.ShowChanges == 1 || settings.ShowChanges == 2)
     319            {
     320                var diff = new diff_match_patch();
     321                var diffs = diff.diff_main(oldtext, newtext, true);
     322                diff.diff_cleanupSemanticLossless(diffs);
     323
     324                if (textOutputPresentation.textBox.Document == null)
     325                {
     326                    textOutputPresentation.textBox.Document = new FlowDocument();
     327                }
     328                else
     329                {
     330                    textOutputPresentation.textBox.Document.Blocks.Clear();
     331                }
     332                var para = new Paragraph();
     333                foreach (var d in diffs)
     334                {
     335                    switch (d.operation)
    275336                    {
    276                         for (int i = 0; i < settings.AppendBreaks; i++)
    277                             textOutputPresentation.textBox.AppendText("\r");
    278                     }                   
    279                     textOutputPresentation.textBox.AppendText(fillValue);
    280                     textOutputPresentation.textBox.ScrollToEnd();
    281                     newtext = new TextRange(textOutputPresentation.textBox.Document.ContentStart, textOutputPresentation.textBox.Document.ContentEnd).Text;                   
     337                        case Operation.EQUAL:
     338                            para.Inlines.Add(new Run(d.text));
     339                            break;
     340                        case Operation.INSERT:
     341                            if (settings.ShowChanges == 1)
     342                            {
     343                                var run = new Run(d.text);
     344                                run.Background = new SolidColorBrush(Colors.LightBlue);
     345                                para.Inlines.Add(run);
     346                            }
     347                            else if (settings.ShowChanges == 2)
     348                            {
     349                                var run = new Run(d.text);
     350                                run.Background = new SolidColorBrush(Colors.LightGreen);
     351                                para.Inlines.Add(run);
     352                            }
     353                            break;
     354                        case Operation.DELETE:
     355                            if (settings.ShowChanges == 2 && d.text.Trim().Length > 0)
     356                            {
     357                                var run = new Run(d.text);
     358                                run.Background = new SolidColorBrush(Color.FromRgb((byte)0xF3, (byte)0x6D, (byte)0x74));
     359                                para.Inlines.Add(run);
     360                            }
     361                            break;
     362                    }
     363                }
     364                textOutputPresentation.textBox.Document.Blocks.Add(para);
     365            }
     366            else if (settings.ShowChanges == 3)
     367            {
     368                if (textOutputPresentation.textBox.Document == null)
     369                {
     370                    textOutputPresentation.textBox.Document = new FlowDocument();
    282371                }
    283372                else
    284373                {
    285                     textOutputPresentation.textBox.Document = new FlowDocument();
    286                     fillValue = fillValue.Replace("\n", "");
    287                     textOutputPresentation.textBox.AppendText(fillValue);
    288                     newtext = new TextRange(textOutputPresentation.textBox.Document.ContentStart, textOutputPresentation.textBox.Document.ContentEnd).Text;                   
    289                 }
    290 
    291                 if (settings.ShowChanges == 1 || settings.ShowChanges == 2)
    292                 {
    293                     var diff = new diff_match_patch();
    294                     var diffs = diff.diff_main(oldtext, newtext, true);
    295                     diff.diff_cleanupSemanticLossless(diffs);
    296 
    297                     textOutputPresentation.textBox.Document = new FlowDocument();
    298                     var para = new Paragraph();
    299                     foreach (var d in diffs)
     374                    textOutputPresentation.textBox.Document.Blocks.Clear();
     375                }
     376                var para = new Paragraph();
     377                var position = 0;
     378                while (position < newtext.Length)
     379                {
     380                    var run = new Run("" + newtext[position]);
     381                    if (oldtext.Length == 0 || position > oldtext.Length || (position < oldtext.Length && oldtext[position] != newtext[position]))
    300382                    {
    301                         switch (d.operation)
    302                         {
    303                             case Operation.EQUAL:
    304                                 para.Inlines.Add(new Run(d.text));
    305                                 break;
    306                             case Operation.INSERT:
    307                                 if (settings.ShowChanges == 1)
    308                                 {
    309                                     var run = new Run(d.text);
    310                                     run.Background = new SolidColorBrush(Colors.LightBlue);
    311                                     para.Inlines.Add(run);
    312                                 }
    313                                 else if (settings.ShowChanges == 2)
    314                                 {
    315                                     var run = new Run(d.text);
    316                                     run.Background = new SolidColorBrush(Colors.LightGreen);
    317                                     para.Inlines.Add(run);
    318                                 }
    319                                 break;
    320                             case Operation.DELETE:
    321                                 if (settings.ShowChanges == 2 && d.text.Trim().Length > 0)
    322                                 {
    323                                     var run = new Run(d.text);
    324                                     run.Background = new SolidColorBrush(Color.FromRgb((byte)0xF3, (byte)0x6D, (byte)0x74));
    325                                     para.Inlines.Add(run);
    326                                 }
    327                                 break;
    328                         }
     383                        run.Background = new SolidColorBrush(Colors.LightBlue);
    329384                    }
    330                     textOutputPresentation.textBox.Document.Blocks.Add(para);
    331                 }
    332                 else if(settings.ShowChanges == 3)
    333                 {
    334                     textOutputPresentation.textBox.Document = new FlowDocument();
    335                     var para = new Paragraph();
    336                     var position = 0;
    337                     while (position < newtext.Length)
    338                     {
    339                         var run = new Run("" + newtext[position]);
    340                         if (oldtext.Length == 0 || position > oldtext.Length || (position < oldtext.Length && oldtext[position] != newtext[position]))
    341                         {
    342                             run.Background = new SolidColorBrush(Colors.LightBlue);
    343                         }
    344                         para.Inlines.Add(run);
    345                         position++;
    346                     }
    347                     textOutputPresentation.textBox.Document.Blocks.Add(para);
    348                 }
    349                 CurrentValue = newtext;
    350                 setStatusBar();
    351 
    352             }, fillValue);
    353 
    354             //if the presentation is visible we wait some ms to avoid a "hanging" of the application
    355             if (Presentation.IsVisible)
    356             {
    357                 try
    358                 {
    359                     Thread.Sleep(5);
    360                 }
    361                 catch (Exception ex)
    362                 {
    363                     GuiLogMessage(String.Format("Error during Thread.Sleep of TextOutput: {0}", ex.Message), NotificationLevel.Warning);
    364                 }
    365             }
    366         }
     385                    para.Inlines.Add(run);
     386                    position++;
     387                }
     388                textOutputPresentation.textBox.Document.Blocks.Add(para);
     389            }
     390            CurrentValue = newtext;
     391            setStatusBar();
     392        }
     393
    367394
    368395        void clearStatusBar()
  • trunk/CrypPlugins/TextOutput/TextOutputPresentation.xaml

    r6563 r6620  
    44    xmlns:Properties="clr-namespace:Cryptool.PluginBase.Properties;assembly=CrypPluginBase"
    55    Height="Auto" Width="Auto" Margin="0" MinHeight="30" MinWidth="100">
    6     <Grid>
     6    <Grid IsVisibleChanged="UserControl_IsVisibleChanged">
    77    <Grid.RowDefinitions>
    88      <RowDefinition Height="Auto" />
  • trunk/CrypPlugins/TextOutput/TextOutputPresentation.xaml.cs

    r2579 r6620  
    3838  public partial class TextOutputPresentation : UserControl
    3939  {
    40     public TextOutputPresentation()
    41     {
    42       InitializeComponent();
    43       this.Width = double.NaN;
    44       this.Height = double.NaN;
    45     }
     40      public TextOutput _textOutput = null;
     41
     42      public TextOutputPresentation()
     43      {
     44          InitializeComponent();
     45          this.Width = double.NaN;
     46          this.Height = double.NaN;
     47      }
     48
     49      private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs args)
     50      {
     51          if (_textOutput != null && ((bool)args.NewValue))
     52          {
     53              _textOutput.ShowInPresentation(_textOutput.Input);
     54          }
     55      }
    4656  }
    4757}
  • trunk/CrypWin/Helper/CTTabItem.xaml.cs

    r6617 r6620  
    137137            if (OnClose != null)
    138138                OnClose();
    139 
    140             this.Editor.HasBeenClosed = true;
    141 
    142 
     139            if (this.Editor != null)
     140            {
     141                this.Editor.HasBeenClosed = true;
     142            }
    143143        }
    144144
Note: See TracChangeset for help on using the changeset viewer.