diff --git a/WPFHexaEditor.Control/HexaEditor.xaml.cs b/WPFHexaEditor.Control/HexaEditor.xaml.cs index b88099ac..99701061 100644 --- a/WPFHexaEditor.Control/HexaEditor.xaml.cs +++ b/WPFHexaEditor.Control/HexaEditor.xaml.cs @@ -323,14 +323,12 @@ public Brush ForegroundOffSetHeaderColor DependencyProperty.Register(nameof(ForegroundOffSetHeaderColor), typeof(Brush), typeof(HexEditor), new FrameworkPropertyMetadata(Brushes.Gray, Control_ForegroundOffSetHeaderColorPropertyChanged)); - private static void Control_ForegroundOffSetHeaderColorPropertyChanged(DependencyObject d, - DependencyPropertyChangedEventArgs e) + private static void Control_ForegroundOffSetHeaderColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl && e.NewValue != e.OldValue) - { - ctrl.UpdateHeader(); - ctrl.UpdateLinesOffSet(); - } + if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return; + + ctrl.UpdateHeader(); + ctrl.UpdateLinesOffSet(); } public new Brush Background @@ -381,8 +379,7 @@ public Brush ForegroundContrast DependencyProperty.Register(nameof(Background), typeof(Brush), typeof(HexEditor), new FrameworkPropertyMetadata(Brushes.White, Control_BackgroundColorPropertyChanged)); - private static void Control_BackgroundColorPropertyChanged(DependencyObject d, - DependencyPropertyChangedEventArgs e) + private static void Control_BackgroundColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is HexEditor ctrl && e.NewValue != e.OldValue) ctrl.BaseGrid.Background = (Brush) e.NewValue; @@ -497,19 +494,17 @@ public DataVisualType DataStringVisual new FrameworkPropertyMetadata(DataVisualType.Hexadecimal, DataStringVisualTypeProperty_PropertyChanged)); - private static void DataStringVisualTypeProperty_PropertyChanged(DependencyObject d, - DependencyPropertyChangedEventArgs e) + private static void DataStringVisualTypeProperty_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl && e.NewValue != e.OldValue) - { - ctrl.UpdateHeader(); + if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return; - ctrl.TraverseHexBytes(hctrl => - { - hctrl.UpdateDataVisualWidth(); - hctrl.UpdateLabelFromByte(); - }); - } + ctrl.UpdateHeader(); + + ctrl.TraverseHexBytes(hctrl => + { + hctrl.UpdateDataVisualWidth(); + hctrl.UpdateLabelFromByte(); + }); } #endregion Miscellaneous property/methods @@ -532,14 +527,12 @@ public CharacterTableType TypeOfCharacterTable new FrameworkPropertyMetadata(CharacterTableType.Ascii, TypeOfCharacterTable_PropertyChanged)); - private static void TypeOfCharacterTable_PropertyChanged(DependencyObject d, - DependencyPropertyChangedEventArgs e) + private static void TypeOfCharacterTable_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl) - { - ctrl.RefreshView(true); - ctrl.TypeOfCharacterTableChanged?.Invoke(ctrl, new EventArgs()); - } + if (!(d is HexEditor ctrl)) return; + + ctrl.RefreshView(true); + ctrl.TypeOfCharacterTableChanged?.Invoke(ctrl, new EventArgs()); } /// @@ -570,18 +563,17 @@ private static void TBLShowMTE_PropetyChanged(DependencyObject d, DependencyProp /// public void LoadTblFile(string fileName) { - if (File.Exists(fileName)) - { - _tblCharacterTable = new TblStream(fileName); + if (!File.Exists(fileName)) return; - TblLabel.Visibility = Visibility.Visible; - TblLabel.ToolTip = $"TBL file : {fileName}"; + _tblCharacterTable = new TblStream(fileName); - UpdateTblBookMark(); + TblLabel.Visibility = Visibility.Visible; + TblLabel.ToolTip = $"TBL file : {fileName}"; - BuildDataLines(MaxVisibleLine, true); - RefreshView(true); - } + UpdateTblBookMark(); + + BuildDataLines(MaxVisibleLine, true); + RefreshView(true); } /// @@ -606,9 +598,10 @@ public void LoadDefaultTbl(DefaultCharacterTableType type = DefaultCharacterTabl private void UpdateTblBookMark() { //Load from loaded TBL bookmark - if (_tblCharacterTable != null) - foreach (var mark in _tblCharacterTable.BookMarks) - SetScrollMarker(mark); + if (_tblCharacterTable == null) return; + + foreach (var mark in _tblCharacterTable.BookMarks) + SetScrollMarker(mark); } /// @@ -718,11 +711,10 @@ private static void ReadOnlyMode_PropertyChanged(DependencyObject d, DependencyP private void Provider_ReadOnlyChanged(object sender, EventArgs e) { - if (ByteProvider.CheckIsOpen(_provider)) - { - ReadOnlyMode = _provider.ReadOnlyMode; - ReadOnlyChanged?.Invoke(this, new EventArgs()); - } + if (!ByteProvider.CheckIsOpen(_provider)) return; + + ReadOnlyMode = _provider.ReadOnlyMode; + ReadOnlyChanged?.Invoke(this, new EventArgs()); } #endregion ReadOnly property/event @@ -989,45 +981,34 @@ private void Control_MoveUp(object sender, EventArgs e) private void Control_Click(object sender, EventArgs e) { - if (sender is IByteControl ctrl) - { - if (Keyboard.Modifiers == ModifierKeys.Shift) - SelectionStop = ctrl.BytePositionInFile; - else - { - SelectionStart = ctrl.BytePositionInFile; - SelectionStop = ctrl.BytePositionInFile; - } - - if (ctrl is StringByte) - UpdateSelectionColor(FirstColor.StringByteData); - else - UpdateSelectionColor(FirstColor.HexByteData); + if (!(sender is IByteControl ctrl)) return; - UpdateVisual(); + if (Keyboard.Modifiers == ModifierKeys.Shift) + SelectionStop = ctrl.BytePositionInFile; + else + { + SelectionStart = ctrl.BytePositionInFile; + SelectionStop = ctrl.BytePositionInFile; } + + UpdateSelectionColor(ctrl is StringByte ? FirstColor.StringByteData : FirstColor.HexByteData); + UpdateVisual(); } private void Control_MouseSelection(object sender, EventArgs e) { //Prevent false mouse selection on file open - if (SelectionStart == -1) - return; + if (SelectionStart == -1) return; - if (sender is IByteControl bCtrl) - { - var focusedControl = Keyboard.FocusedElement; + if (!(sender is IByteControl bCtrl)) return; - //update selection - SelectionStop = bCtrl.BytePositionInFile != -1 ? bCtrl.BytePositionInFile : LastVisibleBytePosition; + var focusedControl = Keyboard.FocusedElement; - if (focusedControl is HexByte) - UpdateSelectionColor(FirstColor.HexByteData); - else - UpdateSelectionColor(FirstColor.StringByteData); + //update selection + SelectionStop = bCtrl.BytePositionInFile != -1 ? bCtrl.BytePositionInFile : LastVisibleBytePosition; - UpdateSelection(); - } + UpdateSelectionColor(focusedControl is HexByte ? FirstColor.HexByteData : FirstColor.StringByteData); + UpdateSelection(); } /// @@ -1056,39 +1037,35 @@ public long SelectionStart private static object SelectionStart_CoerceValueCallBack(DependencyObject d, object baseValue) { - if (d is HexEditor ctrl) - { - var value = (long) baseValue; + if (!(d is HexEditor ctrl)) return -1L; - if (value < -1) - return -1L; + var value = (long) baseValue; - return !ByteProvider.CheckIsOpen(ctrl._provider) ? -1L : baseValue; - } + if (value < -1) + return -1L; - return -1L; + return !ByteProvider.CheckIsOpen(ctrl._provider) ? -1L : baseValue; } private static void SelectionStart_ChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl) - if (e.NewValue != e.OldValue) - { - ctrl.SelectionByte = ByteProvider.CheckIsOpen(ctrl._provider) - ? ctrl._provider.GetByte(ctrl.SelectionStart).singleByte - : null; - - ctrl.UpdateSelection(); - ctrl.UpdateSelectionLine(); - ctrl.UpdateVisual(); - ctrl.UpdateStatusBar(); - ctrl.UpdateLinesOffSet(); - ctrl.UpdateHeader(true); - ctrl.SetScrollMarker(0, ScrollMarker.SelectionStart); - - ctrl.SelectionStartChanged?.Invoke(ctrl, new EventArgs()); - ctrl.SelectionLenghtChanged?.Invoke(ctrl, new EventArgs()); - } + if (!(d is HexEditor ctrl)) return; + if (e.NewValue == e.OldValue) return; + + ctrl.SelectionByte = ByteProvider.CheckIsOpen(ctrl._provider) + ? ctrl._provider.GetByte(ctrl.SelectionStart).singleByte + : null; + + ctrl.UpdateSelection(); + ctrl.UpdateSelectionLine(); + ctrl.UpdateVisual(); + ctrl.UpdateStatusBar(); + ctrl.UpdateLinesOffSet(); + ctrl.UpdateHeader(true); + ctrl.SetScrollMarker(0, ScrollMarker.SelectionStart); + + ctrl.SelectionStartChanged?.Invoke(ctrl, new EventArgs()); + ctrl.SelectionLenghtChanged?.Invoke(ctrl, new EventArgs()); } /// @@ -1107,33 +1084,28 @@ public long SelectionStop private static object SelectionStop_CoerceValueCallBack(DependencyObject d, object baseValue) { - if (d is HexEditor ctrl) - { - var value = (long) baseValue; + if (!(d is HexEditor ctrl)) return baseValue; - if (value < -1) - return -1L; + var value = (long) baseValue; - if (!ByteProvider.CheckIsOpen(ctrl._provider)) - return -1L; + if (value < -1) + return -1L; - if (value >= ctrl._provider.Length) - return ctrl._provider.Length; - } + if (!ByteProvider.CheckIsOpen(ctrl._provider)) + return -1L; - return baseValue; + return value >= ctrl._provider.Length ? ctrl._provider.Length : baseValue; } private static void SelectionStop_ChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl && e.NewValue != e.OldValue) - { - ctrl.UpdateSelection(); - ctrl.UpdateSelectionLine(); + if (!(d is HexEditor ctrl) || e.NewValue == e.OldValue) return; - ctrl.SelectionStopChanged?.Invoke(ctrl, new EventArgs()); - ctrl.SelectionLenghtChanged?.Invoke(ctrl, new EventArgs()); - } + ctrl.UpdateSelection(); + ctrl.UpdateSelectionLine(); + + ctrl.SelectionStopChanged?.Invoke(ctrl, new EventArgs()); + ctrl.SelectionLenghtChanged?.Invoke(ctrl, new EventArgs()); } /// @@ -1482,12 +1454,12 @@ public void SetPosition(long position, long byteLenght) /// /// Get the line number of position in parameter /// - public double GetLineNumber(long position) => position / BytePerLine; - + public double GetLineNumber(long position) => (position - ByteShiftLeft) / BytePerLine; + /// /// Get the column number of the position /// - internal int GetColumnNumber(long position) => (int) position % BytePerLine; + internal int GetColumnNumber(long position) => (int) (position - ByteShiftLeft) % BytePerLine; /// /// Set position in control at position in parameter @@ -1530,21 +1502,22 @@ private static object Visibility_CoerceValue(DependencyObject d, object baseValu private static void HexDataVisibility_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl) - switch ((Visibility) e.NewValue) - { - case Visibility.Visible: - ctrl.HexDataStackPanel.Visibility = Visibility.Visible; + if (!(d is HexEditor ctrl)) return; - if (ctrl.HeaderVisibility == Visibility.Visible) - ctrl.HexHeaderStackPanel.Visibility = Visibility.Visible; - break; + switch ((Visibility) e.NewValue) + { + case Visibility.Visible: + ctrl.HexDataStackPanel.Visibility = Visibility.Visible; - case Visibility.Collapsed: - ctrl.HexDataStackPanel.Visibility = Visibility.Collapsed; - ctrl.HexHeaderStackPanel.Visibility = Visibility.Collapsed; - break; - } + if (ctrl.HeaderVisibility == Visibility.Visible) + ctrl.HexHeaderStackPanel.Visibility = Visibility.Visible; + break; + + case Visibility.Collapsed: + ctrl.HexDataStackPanel.Visibility = Visibility.Collapsed; + ctrl.HexHeaderStackPanel.Visibility = Visibility.Collapsed; + break; + } } /// @@ -1600,16 +1573,17 @@ public Visibility StringDataVisibility private static void StringDataVisibility_ValidateValue(DependencyObject d, DependencyPropertyChangedEventArgs e) { - if (d is HexEditor ctrl) - switch ((Visibility) e.NewValue) - { - case Visibility.Visible: - ctrl.StringDataStackPanel.Visibility = Visibility.Visible; - break; - case Visibility.Collapsed: - ctrl.StringDataStackPanel.Visibility = Visibility.Collapsed; - break; - } + if (!(d is HexEditor ctrl)) return; + + switch ((Visibility) e.NewValue) + { + case Visibility.Visible: + ctrl.StringDataStackPanel.Visibility = Visibility.Visible; + break; + case Visibility.Collapsed: + ctrl.StringDataStackPanel.Visibility = Visibility.Collapsed; + break; + } } /// @@ -1895,46 +1869,45 @@ private void OpenFile(string filename) /// private void OpenStream(MemoryStream stream) { - if (stream.CanRead) - { - CloseProvider(); + if (!stream.CanRead) return; - _provider = new ByteProvider(stream); + CloseProvider(); - if (_provider.IsEmpty) - { - CloseProvider(); - return; - } + _provider = new ByteProvider(stream); - _provider.ReadOnlyChanged += Provider_ReadOnlyChanged; - _provider.DataCopiedToClipboard += Provider_DataCopied; - _provider.ChangesSubmited += ProviderStream_ChangesSubmited; - _provider.Undone += Provider_Undone; - _provider.LongProcessChanged += Provider_LongProcessProgressChanged; - _provider.LongProcessStarted += Provider_LongProcessProgressStarted; - _provider.LongProcessCompleted += Provider_LongProcessProgressCompleted; - _provider.LongProcessCanceled += Provider_LongProcessProgressCompleted; - _provider.FillWithByteCompleted += Provider_FillWithByteCompleted; - _provider.ReplaceByteCompleted += Provider_ReplaceByteCompleted; - _provider.BytesAppendCompleted += Provider_BytesAppendCompleted; + if (_provider.IsEmpty) + { + CloseProvider(); + return; + } - UpdateScrollBar(); - UpdateHeader(); + _provider.ReadOnlyChanged += Provider_ReadOnlyChanged; + _provider.DataCopiedToClipboard += Provider_DataCopied; + _provider.ChangesSubmited += ProviderStream_ChangesSubmited; + _provider.Undone += Provider_Undone; + _provider.LongProcessChanged += Provider_LongProcessProgressChanged; + _provider.LongProcessStarted += Provider_LongProcessProgressStarted; + _provider.LongProcessCompleted += Provider_LongProcessProgressCompleted; + _provider.LongProcessCanceled += Provider_LongProcessProgressCompleted; + _provider.FillWithByteCompleted += Provider_FillWithByteCompleted; + _provider.ReplaceByteCompleted += Provider_ReplaceByteCompleted; + _provider.BytesAppendCompleted += Provider_BytesAppendCompleted; - RefreshView(true); + UpdateScrollBar(); + UpdateHeader(); - UnSelectAll(); + RefreshView(true); - UpdateTblBookMark(); - UpdateSelectionColor(FirstColor.HexByteData); + UnSelectAll(); - //Update count of byte - UpdateByteCount(); + UpdateTblBookMark(); + UpdateSelectionColor(FirstColor.HexByteData); - //Debug - Debug.Print("STREAM OPENED"); - } + //Update count of byte + UpdateByteCount(); + + //Debug + Debug.Print("STREAM OPENED"); } private void Provider_LongProcessProgressCompleted(object sender, EventArgs e) @@ -2265,7 +2238,7 @@ public void RefreshView(bool controlResize = false, bool refreshData = true) if (controlResize) { UpdateScrollMarkerPosition(); - UpdateHeader(); + UpdateHeader(true); } #if DEBUG Debug.Print($"REFRESH TIME: {(DateTime.Now - start).Milliseconds} ms"); @@ -2577,47 +2550,48 @@ private void UpdateHeader(bool clear = false) //Clear before refresh if (clear) HexHeaderStackPanel.Children.Clear(); - if (ByteProvider.CheckIsOpen(_provider)) - for (var i = HexHeaderStackPanel.Children.Count; i < BytePerLine; i++) - { - if (ByteSpacerPositioning == ByteSpacerPosition.Both || - ByteSpacerPositioning == ByteSpacerPosition.HexBytePanel) - AddByteSpacer(HexHeaderStackPanel, i, true); - - var hlHeader = HighLightSelectionStart && - GetColumnNumber(SelectionStart) == i && - SelectionStart > -1; + if (!ByteProvider.CheckIsOpen(_provider)) return; - //Create control - var headerLabel = new FastTextLine(this) - { - Height = LineHeight, - AutoWidth = false, - FontWeight = hlHeader ? FontWeights.Bold: FontWeights.Normal, - Foreground = hlHeader ? ForegroundHighLightOffSetHeaderColor : ForegroundOffSetHeaderColor, - RenderPoint = new Point(2, 0), - ToolTip = $"Column : {i}" - }; + for (var i = HexHeaderStackPanel.Children.Count; i < BytePerLine; i++) + { + if (ByteSpacerPositioning == ByteSpacerPosition.Both || + ByteSpacerPositioning == ByteSpacerPosition.HexBytePanel) + AddByteSpacer(HexHeaderStackPanel, i, true); - #region Set text visual of header + var hlHeader = HighLightSelectionStart && + GetColumnNumber(SelectionStart) == i && + SelectionStart > -1; - switch (DataStringVisual) - { - case DataVisualType.Hexadecimal: - headerLabel.Text = ByteToHex((byte) i); - headerLabel.Width = 20; - break; - case DataVisualType.Decimal: - headerLabel.Text = i.ToString("d3"); - headerLabel.Width = 25; - break; - } + //Create control + var headerLabel = new FastTextLine(this) + { + Height = LineHeight, + AutoWidth = false, + FontWeight = hlHeader ? FontWeights.Bold: FontWeights.Normal, + Foreground = hlHeader ? ForegroundHighLightOffSetHeaderColor : ForegroundOffSetHeaderColor, + RenderPoint = new Point(2, 0), + ToolTip = $"Column : {i}" + }; - #endregion + #region Set text visual of header - //Add to stackpanel - HexHeaderStackPanel.Children.Add(headerLabel); + switch (DataStringVisual) + { + case DataVisualType.Hexadecimal: + headerLabel.Text = ByteToHex((byte) i); + headerLabel.Width = 20; + break; + case DataVisualType.Decimal: + headerLabel.Text = i.ToString("d3"); + headerLabel.Width = 25; + break; } + + #endregion + + //Add to stackpanel + HexHeaderStackPanel.Children.Add(headerLabel); + } } /// @@ -3904,7 +3878,6 @@ public void ReverseSelection() #endregion - #region Line offset coloring... /// diff --git a/WPFHexaEditorExample/MainWindow.xaml b/WPFHexaEditorExample/MainWindow.xaml index 094ac4c6..1918256a 100644 --- a/WPFHexaEditorExample/MainWindow.xaml +++ b/WPFHexaEditorExample/MainWindow.xaml @@ -222,7 +222,7 @@ - +