From 56d4729f10f017efbfdf7071e85e150cec6702ea Mon Sep 17 00:00:00 2001 From: Emanuel Albu Date: Fri, 6 Dec 2024 18:32:53 +0200 Subject: [PATCH] Toolkit 7.0.1.1 - SDLCOM-5180: Use SegmentVisitor instead of directly manipulating XML --- .gitignore | 1 + .../Properties/AssemblyInfo.cs | 2 +- .../SDLXLIFFSliceOrChange/ReplaceManager.cs | 221 +- .../SDLXLIFFSliceOrChange.cs | 4919 +++++++++-------- .../SDLXLIFFSliceOrChange.csproj | 1 + .../Data/DataSearcher.cs | 2 +- .../File/FileReadProcessor.cs | 2 +- .../File/FileReplaceProcessor.cs | 348 +- .../File/FileStatusUpdateProcessor.cs | 150 - .../File/FilesAnalyzer.cs | 210 +- .../File/SegmentVisitor.cs | 96 + .../Properties/AssemblyInfo.cs | 2 +- .../ReplaceSettings.cs | 0 .../SdlXliff.Toolkit.Integration.csproj | 1 + .../Properties/AssemblyInfo.cs | 2 +- .../pluginpackage.manifest.xml | 2 +- 16 files changed, 2631 insertions(+), 3328 deletions(-) delete mode 100644 Toolkit/SdlXliff.Toolkit.Integration/File/FileStatusUpdateProcessor.cs create mode 100644 Toolkit/SdlXliff.Toolkit.Integration/File/SegmentVisitor.cs rename Toolkit/{SDLXLIFFSliceOrChange => SdlXliff.Toolkit.Integration}/ReplaceSettings.cs (100%) diff --git a/.gitignore b/.gitignore index b387da2cce..869a3ad958 100644 --- a/.gitignore +++ b/.gitignore @@ -270,3 +270,4 @@ TMX_TranslationProvider/TMX_TranslationProviderWithUITest.sln StarTransit/.editorconfig DSI Viewer/.editorconfig MicrosoftTranslatorProvider/.editorconfig +Toolkit/.editorconfig diff --git a/Toolkit/SDLXLIFFSliceOrChange/Properties/AssemblyInfo.cs b/Toolkit/SDLXLIFFSliceOrChange/Properties/AssemblyInfo.cs index aa35fba258..74c1986ac6 100644 --- a/Toolkit/SDLXLIFFSliceOrChange/Properties/AssemblyInfo.cs +++ b/Toolkit/SDLXLIFFSliceOrChange/Properties/AssemblyInfo.cs @@ -28,4 +28,4 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("7.0.0.0")] -[assembly: AssemblyFileVersion("7.0.1.0")] +[assembly: AssemblyFileVersion("7.0.1.1")] diff --git a/Toolkit/SDLXLIFFSliceOrChange/ReplaceManager.cs b/Toolkit/SDLXLIFFSliceOrChange/ReplaceManager.cs index 7962c49444..3898dc8f5f 100644 --- a/Toolkit/SDLXLIFFSliceOrChange/ReplaceManager.cs +++ b/Toolkit/SDLXLIFFSliceOrChange/ReplaceManager.cs @@ -1,204 +1,25 @@ -using System; -using System.IO; -using System.Linq; -using System.Net; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using NLog; +using NLog; +using Sdl.FileTypeSupport.Framework.Core.Utilities.BilingualApi; +using Sdl.FileTypeSupport.Framework.Core.Utilities.IntegrationApi; +using Sdl.FileTypeSupport.Framework.IntegrationApi; +using SdlXliff.Toolkit.Integration.File; namespace SDLXLIFFSliceOrChange { - public static class ReplaceManager - { - private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); - - public static void DoReplaceInFile(string file, ReplaceSettings settings, SdlxliffSliceOrChange sdlxliffSliceOrChange) - { - try - { - sdlxliffSliceOrChange.StepProcess("Replaceing in file: " + file + "..."); - - string fileContent; - using (var sr = new StreamReader(file)) - { - fileContent = sr.ReadToEnd(); - } - fileContent = Regex.Replace(fileContent, "\t", ""); - - using (var sw = new StreamWriter(file, false)) - { - sw.Write(fileContent); - } - - var xDoc = new XmlDocument - { - PreserveWhitespace = true - }; - xDoc.Load(file); - - var xmlEncoding = "utf-8"; - if (xDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) - { - // Get the encoding declaration. - var decl = (XmlDeclaration) xDoc.FirstChild; - xmlEncoding = decl.Encoding; - } - - var fileList = xDoc.DocumentElement?.GetElementsByTagName("file"); - if (fileList != null) - { - ParseFileElements(fileList, settings); - } - - Encoding encoding = new UTF8Encoding(); - if (!string.IsNullOrEmpty(xmlEncoding)) - encoding = Encoding.GetEncoding(xmlEncoding); - - using (var writer = new XmlTextWriter(file, encoding)) - { - xDoc.Save(writer); - } - - using (var sr = new StreamReader(file)) - { - fileContent = sr.ReadToEnd(); - } - fileContent = Regex.Replace(fileContent, "", "\t"); - - using (var sw = new StreamWriter(file, false)) - { - sw.Write(fileContent); - } - sdlxliffSliceOrChange.StepProcess("All information replaced in file: " + file + "."); - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - - private static void ParseFileElements(XmlNodeList fileList, ReplaceSettings settings) - { - if (fileList != null) - { - foreach (var fileElement in fileList.OfType()) - { - var bodyElement = (XmlElement)(fileElement.GetElementsByTagName("body")[0]); - var groupElements = bodyElement.GetElementsByTagName("group"); - - foreach (var groupElement in groupElements.OfType()) - { - //look in segments - var transUnits = groupElement.GetElementsByTagName("trans-unit"); - foreach (var transUnit in transUnits.OfType()) - { - var source = transUnit.GetElementsByTagName("source"); - if (source.Count > 0) //in mrk, g si innertext - ReplaceAllChildsValue((XmlElement)source[0], settings); - var segSource = transUnit.GetElementsByTagName("seg-source"); - if (segSource.Count > 0) //in mrk, g si innertext - ReplaceAllChildsValue((XmlElement)segSource[0], settings); - var target = transUnit.GetElementsByTagName("target"); - if (target.Count > 0) //in mrk, g si innertext - ReplaceAllChildsValue((XmlElement)target[0], settings, false); - } - } - - //look in segments not located in groups - var transUnitsInBody = bodyElement.ChildNodes; - foreach (var transUnit in transUnitsInBody.OfType()) - { - if (transUnit.Name != "trans-unit") - continue; - var source = transUnit.GetElementsByTagName("source"); - if (source.Count > 0) //in mrk, g si innertext - ReplaceAllChildsValue((XmlElement)source[0], settings); - var segSource = transUnit.GetElementsByTagName("seg-source"); - if (segSource.Count > 0) //in mrk, g si innertext - ReplaceAllChildsValue((XmlElement)segSource[0], settings); - var target = transUnit.GetElementsByTagName("target"); - if (target.Count > 0) //in mrk, g si innertext - ReplaceAllChildsValue((XmlElement)target[0], settings, false); - } - } - } - } - - private static void GetLastNode(ReplaceSettings settings, bool inSource, XmlElement currentNode) - { - var childNodes = currentNode.ChildNodes.OfType().ToList(); - - foreach (var innerChild in childNodes) - { - if (innerChild.Name.Equals("mrk") && innerChild.HasAttribute("mtype")) - { - ReplaceValue(settings, inSource, innerChild); - } - GetLastNode(settings, inSource, innerChild); - } - } - - private static void ReplaceAllChildsValue(XmlElement target, ReplaceSettings settings, bool inSource = true) - { - foreach (var child in target.ChildNodes.OfType()) - { - if (!child.IsEmpty) - { - if (child.Name.Equals("mrk") && child.HasAttribute("mtype")) - { - ReplaceValue(settings, inSource, child); - } - else - { - GetLastNode(settings, inSource, child); - } - } - } - } - - private static void ReplaceValue(ReplaceSettings settings, bool inSource, XmlElement child) - { - var segmentHtml = child.InnerXml; - if (!string.IsNullOrEmpty(segmentHtml)) - { - if (settings.UseRegEx) - { - var options = !settings.MatchCase ? RegexOptions.IgnoreCase & RegexOptions.Multiline : RegexOptions.None & RegexOptions.Multiline; - - if (!string.IsNullOrEmpty(segmentHtml)) - { - ReplaceRegexText(settings, options, segmentHtml, child, inSource); - } - } - else - { - var remove = Regex.Escape(inSource ? settings.SourceSearchText : settings.TargetSearchText); - var pattern = settings.MatchWholeWord ? string.Format(@"(\b(? _replaceResults; - private FileDataManager _searchDataManager; - private List _searchResults; - private SearchResults _searchResultsForm; - private List _segmentsToBeSliced = new List(); - private List _structureInformationTypes = new List(); - private readonly Logger _logger = LogManager.GetCurrentClassLogger(); - - public SdlxliffSliceOrChange() - { - InitializeComponent(); - SliceManager = new SliceManager(this); - UpdateManager = new UpdateManager(this); - _errorProvider = new ErrorProvider(); - } - - public SliceManager SliceManager { get; } - - public UpdateManager UpdateManager { get; } - - public List GetTranslationStatusForSearch() - { - var statuses = new List(); - - if (ckNotTranslated.Checked) statuses.Add(ConfirmationLevel.Unspecified.ToString()); - if (ckDraft.Checked) statuses.Add(ConfirmationLevel.Draft.ToString()); - if (ckTranslated.Checked) statuses.Add(ConfirmationLevel.Translated.ToString()); - if (ckTranslationRejected.Checked) statuses.Add(ConfirmationLevel.RejectedTranslation.ToString()); - if (ckTranslationApproved.Checked) statuses.Add(ConfirmationLevel.ApprovedTranslation.ToString()); - if (ckSignOffRejected.Checked) statuses.Add(ConfirmationLevel.RejectedSignOff.ToString()); - if (ckSignedOff.Checked) statuses.Add(ConfirmationLevel.ApprovedSignOff.ToString()); - - return statuses; - } - - public void ShowProcess() - { - _setFormSizeChanged = false; - panelStatus.Visible = true; - progressBar.Value = progressBar.Minimum = 0; - progressBar.Maximum = 100; - if (tabControl1.SelectedIndex == 2) - { - panelCommands.Visible = false; - } - - _setFormSizeChanged = true; - } - - public void StepProcess(string message, bool lastStep = false) - { - Invoke((MethodInvoker)delegate - { - try - { - progressBar.Focus(); - if (progressBar.Value + 1 < progressBar.Maximum) - progressBar.Value++; - - if (lastStep) - { - progressBar.Value = progressBar.Maximum; - HideProcess(); - } - } - catch (Exception ex) - { - if (lastStep) - { - HideProcess(); - } - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - }); - } - - protected override bool ProcessCmdKey(ref Message message, Keys keys) - { - if (ControlHasFocus() && keys == (Keys.Control | Keys.Shift | Keys.Space)) - { - UpdateFocusedTextBox(new[] { '\u00A0' }); - - return true; - } - - return base.ProcessCmdKey(ref message, keys); - } - - private static ProjectsController GetProjectController() - { - return SdlTradosStudio.Application.GetController(); - } - - private List AddNonExistingSegments(List sourceSegments, - List targetSegments) - { - foreach (var targetSegment in targetSegments) - { - if (sourceSegments.All(segment => segment.SegmentId != targetSegment.SegmentId)) - { - var maxSID = sourceSegments.Count == 0 ? -1 : sourceSegments.Select(segData => segData.Sid).Max(); - - var sData = new SegmentData(maxSID + 1, targetSegment.SegmentId, - targetSegment.SegmentText, targetSegment.SegmentStatus, - targetSegment.SegmentContent) - { - Tags = targetSegment.Tags, - SearchResults = targetSegment.SearchResults - }; - - sourceSegments.Add(sData); - } - } - - return sourceSegments; - } - - private void BindDDL(ComboBox comboBox, List> items) - { - comboBox.ValueMember = "Key"; - comboBox.DisplayMember = "Value"; - comboBox.DataSource = items; - } - - private void BindFilesGrid(XLIFFFiles dsFiles) - { - gridXLIFFFiles.DataSource = dsFiles; - gridXLIFFFiles.DataMember = dsFiles.Files.TableName; - } - - private void BindReplaceResults(DataGridView grView) - { - grView.ReadOnly = true; - grView.Columns.Clear(); - grView.Columns.Add("ID", "#"); - grView.Columns.Add("Status", "#"); - grView.Columns.Add(new ControlColumn()); - grView.Columns.Add("File", "#"); - SetDetailReplaceGridView(grView); - - grView.DataSource = _replaceDataManager?.DetailFilteredData; - } - - private void BindReplaceResults() - { - Invoke((MethodInvoker)delegate - { - gridReplaceResults.DataSource = null; - if (_replaceResults != null) - { - _replaceDataManager = new FileDataManager(_replaceResults); - gridReplaceResults.RowCount = _replaceDataManager.SetDetailDataSearch(); - if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) - { - _searchResultsForm.SearchResultsGrid.DataSource = null; - _searchResultsForm.SearchResultsGrid.RowCount = gridReplaceResults.RowCount; - } - if (!_replaceDataManager.IsSearchResultEmpty()) - { - BindReplaceResults(gridReplaceResults); - if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) - { - BindReplaceResults(_searchResultsForm.SearchResultsGrid); - } - } - } - }); - } - - private void BindSearchResults(DataGridView grView) - { - grView.ReadOnly = true; - grView.Columns.Clear(); - grView.Columns.Add("ID", "#"); - grView.Columns.Add("Status", "#"); - grView.Columns.Add(new ControlColumn()); - grView.Columns.Add("File", "#"); - SetDetailGridView(grView); - - grView.DataSource = _searchDataManager?.DetailFilteredData; - } - - private void BindSearchResults() - { - Invoke((MethodInvoker)delegate - { - gridSearchResults.DataSource = null; - if (_searchResults != null) - { - _searchDataManager = new FileDataManager(_searchResults); - gridSearchResults.RowCount = _searchDataManager.SetDetailDataSearch(); - if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) - { - _searchResultsForm.SearchResultsGrid.DataSource = null; - _searchResultsForm.SearchResultsGrid.RowCount = gridSearchResults.RowCount; - } - if (!_searchDataManager.IsSearchResultEmpty()) - { - BindSearchResults(gridSearchResults); - if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) - { - BindSearchResults(_searchResultsForm.SearchResultsGrid); - } - } - } - }); - } - - private void btnChangeit_Click(object sender, EventArgs e) - { - var resources = new UIResources(Settings.GetSavedCulture()); - if (gridXLIFFFiles.SelectedRows.Count == 0) - { - MessageBox.Show(resources.ErrorNoFilesSelected, resources.ErrorTitleNoFilesSelected, - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - ShowProcess(); - var selectedTabIndex = tabControl1.SelectedIndex; - var indexes = listDocumentStructure.SelectedIndices.Cast().ToList(); - var doCopySourceToTarget = ckCopySourceToTarget.Checked; - var doOR = cmbOperator.SelectedIndex == 0; - StepProcess("Changing files based on selected options..."); - var t = new Thread(() => DoChangeNow(selectedTabIndex, indexes, doCopySourceToTarget, doOR)); - t.Start(); - } - - private void btnClearit_Click(object sender, EventArgs e) - { - var resources = new UIResources(Settings.GetSavedCulture()); - if (gridXLIFFFiles.SelectedRows.Count == 0) - { - MessageBox.Show(resources.ErrorNoFilesSelected, resources.ErrorTitleNoFilesSelected, - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - ShowProcess(); - StepProcess("Clearing target segments from selected files ..."); - var selectedTabIndex = tabControl1.SelectedIndex; - var selectedDSIndexes = listDocumentStructure.SelectedIndices.Cast().ToList(); - var doOR = cmbOperator.SelectedIndex == 0; - var t = new Thread(() => DoClearDow(selectedTabIndex, selectedDSIndexes, doOR)); - t.Start(); - } - - private void btnExpandReplaceResults_Click(object sender, EventArgs e) - { - var grView = new DataGridView(); - grView.AllowUserToAddRows = false; - grView.AllowUserToDeleteRows = false; - grView.AllowUserToResizeRows = false; - grView.BackgroundColor = System.Drawing.SystemColors.Window; - grView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - grView.GridColor = SystemColors.Control; - grView.Location = new System.Drawing.Point(166, 92); - grView.Name = "grView"; - grView.RowHeadersVisible = false; - grView.Size = new System.Drawing.Size(676, 151); - grView.TabIndex = 7; - grView.VirtualMode = true; - grView.CellValueNeeded += gridReplaceResults_CellValueNeeded; - grView.DataBindingComplete += gridReplaceResults_DataBindingComplete; - - BindReplaceResults(grView); - - var location = new Point(); - var size = new Size(); - var setSizeAndLocation = false; - if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) - { - location = _searchResultsForm.Location; - size = _searchResultsForm.Size; - setSizeAndLocation = true; - _searchResultsForm.Close(); - } - - _searchResultsForm = new SearchResults(grView) { Dock = DockStyle.Fill }; - if (setSizeAndLocation) - { - _searchResultsForm.Location = location; - _searchResultsForm.Size = size; - } - _searchResultsForm.Show(); - } - - private void btnExpandSearchResults_Click(object sender, EventArgs e) - { - var grView = new DataGridView(); - grView.AllowUserToAddRows = false; - grView.AllowUserToDeleteRows = false; - grView.AllowUserToResizeRows = false; - grView.BackgroundColor = System.Drawing.SystemColors.Window; - grView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - grView.GridColor = System.Drawing.SystemColors.Control; - grView.Location = new System.Drawing.Point(166, 92); - grView.Name = "grView"; - grView.RowHeadersVisible = false; - grView.Size = new System.Drawing.Size(676, 151); - grView.TabIndex = 7; - grView.VirtualMode = true; - grView.CellValueNeeded += gridSearchResults_CellValueNeeded; - grView.DataBindingComplete += gridSearchResults_DataBindingComplete; - BindSearchResults(grView); - - var location = new Point(); - var size = new Size(); - var setSizeAndLocation = false; - if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) - { - location = _searchResultsForm.Location; - size = _searchResultsForm.Size; - setSizeAndLocation = true; - _searchResultsForm.Close(); - } - - _searchResultsForm = new SearchResults(grView); - if (setSizeAndLocation) - { - _searchResultsForm.Location = location; - _searchResultsForm.Size = size; - } - _searchResultsForm.Show(); - } - - private void btnFindAll_Click(object sender, EventArgs e) - { - if (gridXLIFFFiles.SelectedRows.Count == 0 || - (String.IsNullOrEmpty(txtSourceSearch.Text) && String.IsNullOrEmpty(txtTargetSearch.Text))) - return; - ShowProcess(); - StepProcess("Finding in files ..."); - var doOR = cmbOperator.SelectedIndex == 0; - var t = new Thread(() => DoFindNow(doOR)); - t.Start(); - } - - private void btnFindAllInReplace_Click(object sender, EventArgs e) - { - if (gridXLIFFFiles.SelectedRows.Count == 0) - return; - if (String.IsNullOrEmpty(txtReplaceSourceSearch.Text) && String.IsNullOrEmpty(txtReplaceTargetSearch.Text)) - return; - - _doUpdateStatus = false; - ShowProcess(); - StepProcess("Finding in files before replace ..."); - - var sourceSettings = String.IsNullOrEmpty(txtReplaceSourceSearch.Text) - ? null - : new SearchSettings() - { - SearchText = txtReplaceSourceSearch.Text, - ReplaceText = txtReplaceSourceSearch.Text, - SearchInSource = true, - SearchInTarget = false, - MatchCase = ckReplaceMatchCase.Checked, - MatchWholeWord = ckReplaceMatchWholeWord.Checked, - UseRegex = ckReplaceUseRegEx.Checked, - SearchInTag = false, - SearchInLocked = true, - NotSearchStatus = new List(), - LockSegment = false, - UnlockContent = false, - NewStatus = ConfirmationLevel.Unspecified, - UpdateStatus = false - }; - - var targetSettings = String.IsNullOrEmpty(txtReplaceTargetSearch.Text) - ? null - : new SearchSettings() - { - SearchText = txtReplaceTargetSearch.Text, - ReplaceText = txtReplaceTargetSearch.Text, - SearchInSource = false, - SearchInTarget = true, - MatchCase = ckReplaceMatchCase.Checked, - MatchWholeWord = ckReplaceMatchWholeWord.Checked, - UseRegex = ckReplaceUseRegEx.Checked, - SearchInTag = false, - SearchInLocked = true, - NotSearchStatus = new List(), - LockSegment = false, - UnlockContent = false, - NewStatus = ConfirmationLevel.Unspecified, - UpdateStatus = false - }; - var t = new Thread(() => DoFindForReplaceNow(sourceSettings, targetSettings)); - t.Start(); - } - - private void btnGenerateDSI_Click(object sender, EventArgs e) - { - ShowProcess(); - var files = - (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); - _structureInformationTypes.Clear(); - StepProcess("Reading Document Structure information from files...", false); - var trd = new Thread(() => - { - foreach (var file in files) - { - StepProcess( - "Reading Document Structure information from file: " + Path.GetFileName(file) + ".", false); - using (var reader = XmlReader.Create(file)) - { - while (reader.Read()) - { - if (reader.Name == "cxt-defs") - { - var cxtDoc = new XmlDocument(); - cxtDoc.PreserveWhitespace = true; - cxtDoc.LoadXml(reader.ReadOuterXml()); - var cxtDefs = cxtDoc.DocumentElement.GetElementsByTagName("cxt-def"); - - foreach (var cxtDef in cxtDefs.OfType()) - { - var type = cxtDef.Attributes["type"].Value; - var id = cxtDef.Attributes["id"].Value; - - var cxt = - _structureInformationTypes.FirstOrDefault(t => t.InternalName == type); - if (cxt == null) - _structureInformationTypes.Add(new StructureInformationType() - { - IDs = - new List>>() - { - new KeyValuePair>(file, - new List() - { - id - }) - }, - InternalName = type, - DisplayName = type - }); - else - { - if (cxt.IDs.Any(f => f.Key == file)) - { - var idsPerFile = - cxt.IDs.FirstOrDefault(f => f.Key == file); - if (!idsPerFile.Value.Contains(id)) - idsPerFile.Value.Add(id); - } - else - { - cxt.IDs.Add(new KeyValuePair>(file, - new List() - { - id - })); - } - } - } - } - } - } - } - StepProcess("Displaying Document Structure information ...", true); - DisplayDSI(); - }); - trd.Start(); - } - - private void btnPreview_Click(object sender, EventArgs e) - { - if (gridXLIFFFiles.SelectedRows.Count == 0) - return; - if (string.IsNullOrEmpty(txtReplaceSourceSearch.Text) && String.IsNullOrEmpty(txtReplaceTargetSearch.Text)) - return; - - _doUpdateStatus = false; - ShowProcess(); - StepProcess("Generating replace preview ..."); - var t = new Thread(() => - { - DoReplacePreviewOperation(); - - BindReplaceResults(); - StepProcess("Preview generated.", true); - }); - t.Start(); - } - - private void btnReplace_Click(object sender, EventArgs e) - { - var files = - (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()); - if (!files.Any()) - return; - ShowProcess(); - StepProcess("Replacing in files ..."); - var t = new Thread(() => DoReplaceNow(files)); - t.Start(); - } - - private void btnReverseSelection_Click(object sender, EventArgs e) - { - foreach (var c in pageStatuses.Controls.OfType()) - { - foreach (var ck in c.Controls.OfType()) - { - ck.Checked = !ck.Checked; - } - foreach (var list in c.Controls.OfType()) - { - var selectedItems = - list.Items.Cast().Where(item => !list.SelectedItems.Contains(item)).ToList(); - list.SelectedItems.Clear(); - foreach (var selItem in selectedItems) - list.SelectedItems.Add(selItem); - } - } - } - - private void btnSelectFolder_Click(object sender, EventArgs e) - { - var selectFolder = new FolderSelectDialog(); - selectFolder.InitialDirectory = GetProjectPath(); - if (selectFolder.ShowDialog()) - { - var dsFiles = new XLIFFFiles(); - var files = Directory.GetFiles(selectFolder.FileName, "*.sdlxliff"); - foreach (var file in files) - { - var fileRow = dsFiles.Files.NewFilesRow(); - fileRow.Path = file; - fileRow.Name = Path.GetFileName(file); - fileRow.Size = ((decimal)(new FileInfo(file)).Length / 1000).ToString(CultureInfo.InvariantCulture); - fileRow.Date = (new FileInfo(file)).CreationTime.ToString(CultureInfo.InvariantCulture); - dsFiles.Files.AddFilesRow(fileRow); - } - BindFilesGrid(dsFiles); - } - } - - private void btnSelectProjectFile_Click(object sender, EventArgs e) - { - selectProjectFile.InitialDirectory = GetProjectPath(); - selectProjectFile.CheckFileExists = true; - selectProjectFile.Filter = "SDL Project Files (.sdlproj)|*.sdlproj"; - selectProjectFile.Multiselect = false; - if (selectProjectFile.ShowDialog() == DialogResult.OK) - { - var phisicalFilesPath = GetPhisicalFilesPathFromProjectFile(selectProjectFile.FileName); - - var dsFiles = new XLIFFFiles(); - foreach (var file in phisicalFilesPath) - { - var fileRow = dsFiles.Files.NewFilesRow(); - fileRow.Path = string.Format("{0}\\{1}", Path.GetDirectoryName(selectProjectFile.FileName), file); - fileRow.Name = file; - fileRow.Size = - ((decimal)(new FileInfo(fileRow.Path)).Length / 1000).ToString(CultureInfo.InvariantCulture); - fileRow.Date = (new FileInfo(fileRow.Path)).CreationTime.ToString(CultureInfo.InvariantCulture); - dsFiles.Files.AddFilesRow(fileRow); - } - BindFilesGrid(dsFiles); - } - } - - private void btnSelectSDLXLIFFFiles_Click(object sender, EventArgs e) - { - selectProjectFile.InitialDirectory = GetProjectPath(); - selectProjectFile.CheckFileExists = true; - selectProjectFile.Filter = "SDLXLIFF Files (.sdlxliff)|*.sdlxliff"; - selectProjectFile.Multiselect = true; - if (selectProjectFile.ShowDialog() == DialogResult.OK) - { - var dsFiles = new XLIFFFiles(); - var files = selectProjectFile.FileNames; - foreach (var file in files) - { - var fileRow = dsFiles.Files.NewFilesRow(); - fileRow.Path = file; - fileRow.Name = Path.GetFileName(file); - fileRow.Size = ((decimal)(new FileInfo(file)).Length / 1000).ToString(CultureInfo.InvariantCulture); - fileRow.Date = (new FileInfo(file)).CreationTime.ToString(CultureInfo.InvariantCulture); - dsFiles.Files.AddFilesRow(fileRow); - } - BindFilesGrid(dsFiles); - } - } - - private void btnSliceit_Click(object sender, EventArgs e) - { - var resources = new UIResources(Settings.GetSavedCulture()); - if (gridXLIFFFiles.SelectedRows.Count == 0) - { - MessageBox.Show(resources.ErrorNoFilesSelected, resources.ErrorTitleNoFilesSelected, - MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - - var studioFolder = GetStudioVersion(); - var folder = new FolderSelectDialog - { - InitialDirectory = string.Format(@"{0}\{1}\Projects", - Environment.GetFolderPath( - Environment.SpecialFolder.MyDocuments), studioFolder) - }; - if (folder.ShowDialog()) - { - _folderForSlicedFiles = folder.FileName; - - var files = - (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()) - .ToList(); - if (files.Count == 0) - { - return; - } - ShowProcess(); - StepProcess("Sliceing files ...", false); - - var selectedTabIndex = tabControl1.SelectedIndex; - var selectedDSIndexes = listDocumentStructure.SelectedIndices.Cast().ToList(); - var doMerge = ckMerge.Checked; - var doOR = cmbOperator.SelectedIndex == 0; - var t = new Thread(() => DoSliceNow(selectedTabIndex, selectedDSIndexes, doMerge, doOR)); - t.Start(); - } - } - - private void ChangeInFiles(IEnumerable files) - { - var settings = new ReplaceSettings() - { - MatchCase = ckReplaceMatchCase.Checked, - MatchWholeWord = ckReplaceMatchWholeWord.Checked, - UseRegEx = ckReplaceUseRegEx.Checked, - SourceSearchText = txtReplaceSourceSearch.Text, - SourceReplaceText = txtReplaceSourceReplace.Text, - TargetSearchText = txtReplaceTargetSearch.Text, - TargetReplaceText = txtReplaceTargetReplace.Text - }; - var threads = new List(); - foreach (var file in files) - { - var t = new Thread(() => ReplaceManager.DoReplaceInFile(file, settings, this)); - t.Start(); - threads.Add(t); - } - - foreach (var thread in threads) - thread.Join(); - } - - private void ckChangeToNotTranslated_CheckedChanged(object sender, EventArgs e) - { - _checkedChangedBeforeClick = true; - } - - private void ckChangeToNotTranslated_Click(object sender, EventArgs e) - { - if (!_checkedChangedBeforeClick && ((RadioButton)sender).Checked) - ((RadioButton)sender).Checked = false; - _checkedChangedBeforeClick = false; - } - - private void ClearFiles() - { - if (_segmentsToBeSliced.Count == 0) - return; - - var threads = new List(); - foreach (var sliceInfo in _segmentsToBeSliced) - { - StepProcess("Clearing file: " + Path.GetFileName(sliceInfo.File) + "."); - - var t = new Thread(() => ClearManager.ClearFile(sliceInfo, this)); - t.Start(); - threads.Add(t); - } - foreach (var thread in threads) - thread.Join(); - } - - private void cmbLanguages_SelectedIndexChanged(object sender, EventArgs e) - { - var culture = cmbLanguages.SelectedValue.ToString(); - if (_saveCultrue) - Settings.SaveSelectedCulture(culture); - EnsureUIBasedOnCultureInfo(culture); - } - - private bool ControlHasFocus() - { - return txtSourceSearch.Focused || - txtTargetSearch.Focused || - txtReplaceSourceSearch.Focused || - txtReplaceSourceReplace.Focused || - txtReplaceTargetSearch.Focused || - txtReplaceTargetReplace.Focused; - } - - private void CopyFiles() - { - if (_segmentsToBeSliced.Count == 0) - return; - - var threads = new List(); - foreach (var sliceInfo in _segmentsToBeSliced) - { - StepProcess("Copying in file: " + Path.GetFileName(sliceInfo.File) + "."); - - var t = new Thread(() => ClearManager.CopyFile(sliceInfo, this)); - t.Start(); - threads.Add(t); - } - foreach (var thread in threads) - thread.Join(); - } - - private void CopyFilesFromTempFolder(List>> filesPerLanguage) - { - foreach (var keyValuePair in filesPerLanguage) - foreach (var file in keyValuePair.Value) - { - File.Copy(file, - Path.Combine(_folderForSlicedFiles, - Path.GetFileName(file).Replace(".sdlxliff", "_sliced.sdlxliff"))); - } - } - - private void DisplayDSI() - { - Invoke((MethodInvoker)delegate - { - listDocumentStructure.Items.Clear(); - listDocumentStructure.Items.AddRange( - _structureInformationTypes.Select(type => type.DisplayName).ToArray()); - }); - } - - private void DoChangeNow(int selectedTabIndex, IEnumerable indexes, bool doCopySourceToTarget, bool doOR) - { - if (selectedTabIndex == 1) - { - StartFind(true, doOR); - } - else - { - ProcessFileBasedOnStatuses(indexes); - } - - if (doCopySourceToTarget) - { - StepProcess("Copying source to target in selected files ..."); - DoCopySourceNow(selectedTabIndex, indexes, doOR); - } - - StepProcess("Files are changed based on selected options.", true); - } - - private void DoClearDow(int selectedTabIndex, List selectedDSIndexes, bool doOR) - { - StepProcess("Processing files ..."); - if (selectedTabIndex == 1) - { - _doUpdateStatus = false; - FindInFiles(doOR); - _segmentsToBeSliced.Clear(); - foreach (var searchResult in _searchResults) - { - foreach (var searchSourceResult in searchResult.SearchSourceResults) - { - var SegmentId = searchSourceResult.Value.SegmentId.ToString(CultureInfo.InvariantCulture); - var transUnitID = - searchSourceResult.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id; - var file = searchResult.FilePath; - - if (transUnitID != String.Empty && SegmentId != String.Empty) - { - var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); - if (fileSliceInfo == null) - { - _segmentsToBeSliced.Add(new SliceInfo() - { - File = file, - Segments = new List>>() - { - new KeyValuePair>(transUnitID, - new List() {SegmentId}) - } - }); - } - else - { - if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) - fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, - new List() - { - SegmentId - })); - else - { - var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); - if (!segSliceInfo.Value.Contains(SegmentId)) - segSliceInfo.Value.Add(SegmentId); - } - } - } - } - } - } - else - { - _segmentsToBeSliced.Clear(); - ProcessFileBasedOnStatuses(selectedDSIndexes, true); - } - StepProcess("Clearing files ..."); - ClearFiles(); - StepProcess("Target segments from selected files are clear.", true); - } - - private void DoCopySourceNow(int selectedTabIndex, IEnumerable selectedDSIndexes, bool doOR) - { - StepProcess("Processing files ..."); - if (selectedTabIndex == 1) - { - _doUpdateStatus = false; - FindInFiles(doOR); - _segmentsToBeSliced.Clear(); - foreach (var searchResult in _searchResults) - { - foreach (var searchSourceResult in searchResult.SearchSourceResults) - { - var SegmentId = searchSourceResult.Value.SegmentId.ToString(CultureInfo.InvariantCulture); - var transUnitID = - searchSourceResult.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id; - var file = searchResult.FilePath; - - if (transUnitID != String.Empty && SegmentId != string.Empty) - { - var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); - if (fileSliceInfo == null) - { - _segmentsToBeSliced.Add(new SliceInfo() - { - File = file, - Segments = new List>>() - { - new KeyValuePair>(transUnitID, - new List() {SegmentId}) - } - }); - } - else - { - if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) - fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, - new List() - { - SegmentId - })); - else - { - var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); - if (!segSliceInfo.Value.Contains(SegmentId)) - segSliceInfo.Value.Add(SegmentId); - } - } - } - } - } - } - else - { - _segmentsToBeSliced.Clear(); - ProcessFileBasedOnStatuses(selectedDSIndexes, true); - } - StepProcess("Copying source to target ..."); - CopyFiles(); - StepProcess("Source segments from selected files are copied to target.", true); - } - - private void DoFindForReplaceNow(SearchSettings sourceSettings, SearchSettings targetSettings) - { - FindInFilesForReplace(sourceSettings, targetSettings); - - BindReplaceResults(); - StepProcess("Find before replace completed.", true); - } - - private void DoFindNow(bool doOR) - { - StartFind(false, doOR); - StepProcess("Find completed.", true); - } - - private void DoReplaceNow(IEnumerable files) - { - if (_replaceResults == null || _replaceResults.Count == 0) - DoReplacePreviewOperation(); - ChangeInFiles(files); - BindReplaceResults(); - StepProcess("Replace completed.", true); - } - - private void DoReplacePreviewOperation() - { - StepProcess("Preparing files for replace operation ..."); - var sourceSettings = string.IsNullOrEmpty(txtReplaceSourceSearch.Text) - ? null - : new SearchSettings() - { - SearchText = txtReplaceSourceSearch.Text, - ReplaceText = txtReplaceSourceSearch.Text, - SearchInSource = true, - SearchInTarget = false, - MatchCase = ckReplaceMatchCase.Checked, - MatchWholeWord = ckReplaceMatchWholeWord.Checked, - UseRegex = ckReplaceUseRegEx.Checked, - SearchInTag = false, - SearchInLocked = true, - NotSearchStatus = new List(), - LockSegment = false, - UnlockContent = false, - NewStatus = ConfirmationLevel.Unspecified, - UpdateStatus = false - }; - - var targetSettings = string.IsNullOrEmpty(txtReplaceTargetSearch.Text) - ? null - : new SearchSettings() - { - SearchText = txtReplaceTargetSearch.Text, - ReplaceText = txtReplaceTargetSearch.Text, - SearchInSource = false, - SearchInTarget = true, - MatchCase = ckReplaceMatchCase.Checked, - MatchWholeWord = ckReplaceMatchWholeWord.Checked, - UseRegex = ckReplaceUseRegEx.Checked, - SearchInTag = false, - SearchInLocked = true, - NotSearchStatus = new List(), - LockSegment = false, - UnlockContent = false, - NewStatus = ConfirmationLevel.Unspecified, - UpdateStatus = false - }; - - FindInFilesForReplace(sourceSettings, targetSettings); - ReplaceInResultsForReplacePreview(); - } - - private void DoSliceNow(int selectedTab, IEnumerable indexes, bool doMerge, bool doOR) - { - StepProcess("Processing files based on slice information ...", false); - var filesToBeSliced = SplitMergedXliffFiles(); - if (!filesToBeSliced.Any()) return; - if (selectedTab == 1) - { - _doUpdateStatus = false; - FindInFiles(doOR, filesToBeSliced.Values.ToList()); - - _segmentsToBeSliced.Clear(); - foreach (var searchResult in _searchResults) - { - foreach (var searchSourceResult in searchResult.SearchSourceResults) - { - var SegmentId = searchSourceResult.Value.SegmentId.ToString(CultureInfo.InvariantCulture); - var transUnitID = searchSourceResult.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id; - var file = searchResult.FilePath; - - if (transUnitID != String.Empty && SegmentId != String.Empty) - { - var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); - if (fileSliceInfo == null) - { - _segmentsToBeSliced.Add(new SliceInfo() - { - File = file, - Segments = new List>>() { new KeyValuePair>(transUnitID, new List() { SegmentId }) } - }); - } - else - { - if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) - fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, new List() { SegmentId })); - else - { - var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); - if (!segSliceInfo.Value.Contains(SegmentId)) - segSliceInfo.Value.Add(SegmentId); - } - } - } - } - } - } - else - { - _segmentsToBeSliced.Clear(); - ProcessFileBasedOnStatuses(indexes, true, filesToBeSliced); - } - - StepProcess("Slice files ...", false); - SliceFiles(doMerge); - - var folder = Path.GetDirectoryName(filesToBeSliced.Values.ToList()[0]); - if (folder != null) Directory.Delete(folder, true); - - StepProcess("Files were successfully sliced.", true); - } - - private void EnsureUIBasedOnCultureInfo(string culture) - { - var resources = new UIResources(culture); - - btnSelectSDLXLIFFFiles.Text = resources.SelectXLIFF; - toolStripButton1.Text = resources.ClearFiles; - ckMerge.Text = resources.Merge; - ckCopySourceToTarget.Text = resources.CopySourceToTarget; - groupReplace.Text = resources.ReplaceGroup; - groupReplaceOptions.Text = resources.Options; - ckReplaceMatchCase.Text = resources.SearchMatchCase; - ckReplaceMatchWholeWord.Text = resources.SearchMatchWholeWord; - ckReplaceUseRegEx.Text = resources.SearchRegEx; - lblReplaceSourceSearch.Text = resources.SearchSource; - lblReplaceTargetSearch.Text = resources.SearchTarget; - lblReplaceSourceReplace.Text = lblReplaceTargetReplace.Text = resources.ReplaceWith; - btnFindAllInReplace.Text = resources.FindAll; - btnPreview.Text = resources.Preview; - btnReplace.Text = resources.Replace; - - pageStatuses.Text = resources.Statuses; - pageSearch.Text = resources.Search; - groupChange.Text = resources.Change; - groupSlice.Text = resources.Slice; - labelSliceComments.Text = resources.SliceComments; - btnSliceit.Text = resources.Sliceit; - btnChangeit.Text = resources.Changeit; - labelChangeComments.Text = resources.ChangeComments; - groupChangeToStatusOr.Text = resources.ChangeToStatusOr; - groupChangeLocked.Text = resources.ChangeLocked; - groupChangeTranslationStatus.Text = resources.ChangeTranslationStatus; - ckChangeToSignedOff.Text = resources.ChangeToSignedOff; - ckChangeToSignOffRejected.Text = resources.ChangeToSignOffRejected; - ckChangeToTranslationApproved.Text = resources.ChangeToTranslationApproved; - ckChangeToTranslationRejected.Text = resources.ChangeToTranslationRejected; - ckChangeToTranslated.Text = resources.ChangeToTranslated; - ckChangeToDraft.Text = resources.ChangeToDraft; - ckChangeToNotTranslated.Text = resources.ChangeToNotTranslated; - ckChangeToUnlocked.Text = resources.ChangeToUnlocked; - ckChangeToLocked.Text = resources.ChangeToLocked; - btnSelectFolder.Text = resources.SelectFolder; - btnSelectProjectFile.Text = resources.ProjectFile; - groupScore.Text = resources.Score; - ckMatchValues.Text = resources.MatchValues; - ckContextMatch.Text = resources.ContextMatch; - ckPerfectMatch.Text = resources.PerfectMatch; - groupStatusesLocked.Text = resources.StatusesLocked; - ckUnlocked.Text = resources.Unlocked; - ckLocked.Text = resources.Locked; - groupStatusesTranslationStatus.Text = resources.StatusesTranslationStatus; - ckSignedOff.Text = resources.ApprovedSignOff; - ckSignOffRejected.Text = resources.RejectedSignOff; - ckTranslationApproved.Text = resources.ApprovedTranslation; - ckTranslationRejected.Text = resources.RejectedTranslation; - ckTranslated.Text = resources.Translated; - ckDraft.Text = resources.Draft; - ckNotTranslated.Text = resources.NotTranslated; - groupTranslationOrigin.Text = resources.TranslationOrigin; - ckAutoPropagated.Text = resources.AutoPropagated; - ckNeuralMachineTranslation.Text = resources.NeuralMT; - ckAutomatedTranslation.Text = resources.AutomatedTranslation; - ckInteractive.Text = resources.Interactive; - ckTranslationMemory.Text = resources.TranslationMemory; - groupSystem.Text = resources.System; - ckPropagated.Text = resources.Propagated; - ckSystemTranslationMemory.Text = resources.SystemTranslationMemory; - ckSystemMachineTranslation.Text = resources.SystemMachineTranslation; - groupDocumentStructure.Text = resources.DocumentStructure; - btnGenerateDSI.Text = resources.GenerateDSI; - labelGenerateDSIComments.Text = resources.GenerateDSIComments; - colPath.HeaderText = resources.FileLocation; - colName.HeaderText = resources.Name; - colSize.HeaderText = resources.Size; - colDate.HeaderText = resources.Date; - groupOptions.Text = resources.Options; - ckSearchInTags.Text = resources.SearchInTags; - ckSearchRegEx.Text = resources.SearchRegEx; - ckSearchMatchWholeWord.Text = resources.SearchMatchWholeWord; - ckSearchMatchCase.Text = resources.SearchMatchCase; - groupSearch.Text = resources.Search; - labelSearchTarget.Text = resources.SearchTarget; - labelSearchSource.Text = resources.SearchSource; - btnFindAll.Text = resources.FindAll; - btnReverseSelection.Text = resources.ReverseSelection; - - var selIndex = cmbOperator.SelectedIndex; - - cmbOperator.Items.Clear(); - cmbOperator.Items.Add(resources.OR); - cmbOperator.Items.Add(resources.AND); - cmbOperator.SelectedIndex = selIndex == -1 ? 0 : selIndex; - - groupClear.Text = resources.Clear; - btnClearit.Text = resources.Clearit; - lblClearit.Text = resources.ClearitDescription; - } - - private void FindInFiles(bool doOR, List filesToBeSliced = null) - { - var files = filesToBeSliced ?? (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); - if (_searchResults != null) - _searchResults.Clear(); - StepProcess("Looking in source segments ..."); - var settings = new SearchSettings() - { - SearchText = txtSourceSearch.Text, - ReplaceText = txtSourceSearch.Text, - SearchInSource = true, - SearchInTarget = false, - MatchCase = ckSearchMatchCase.Checked, - MatchWholeWord = ckSearchMatchWholeWord.Checked, - UseRegex = ckSearchRegEx.Checked, - SearchInTag = ckSearchInTags.Checked, - SearchInLocked = true, - NotSearchStatus = new List(), - LockSegment = ckChangeToLocked.Checked, - UnlockContent = ckChangeToUnlocked.Checked - }; - if (GetTranslationStatus() != null) - { - settings.NewStatus = GetTranslationStatus().Value; - settings.UpdateStatus = _doUpdateStatus; - } - else - { - settings.UpdateStatus = false; - } - SearchSettings sourceSettings = null; - if (!string.IsNullOrEmpty(settings.SearchText)) - { - sourceSettings = settings; - var analyzer = new FilesAnalyzer(files); - analyzer.SearchInFiles(settings); - _searchResults = analyzer.FileResults; - } - var searchInTarget = !string.IsNullOrEmpty(txtTargetSearch.Text); - SearchSettings targetSettings = null; - if (searchInTarget) - { - StepProcess("Looking in target segments ..."); - settings.SearchText = txtTargetSearch.Text; - settings.ReplaceText = txtTargetSearch.Text; - settings.SearchInSource = false; - settings.SearchInTarget = true; - - targetSettings = settings; - - var analyzer = new FilesAnalyzer(files); - analyzer.SearchInFiles(settings); - var targetResult = analyzer.FileResults; - - if (_searchResults == null || _searchResults.Count == 0) - _searchResults = targetResult; - else - { - StepProcess("Merging source and target segments ..."); - var fileDataToBeAdded = new List(); - var fileDataToBeRemoved = new List(); - foreach (var fileData in _searchResults) - { - var file = fileData.FilePath; - var targetFileData = targetResult.FirstOrDefault(data => data.FilePath == file); - if (targetFileData != null) - { - //create new FileData containing source result search from source and target result search from target - var fileToBeAdded = doOR - ? UnionSourceAndTarget(fileData, targetFileData, file) - : IntersectSourceAndTarget(fileData, targetFileData, file); - if (fileToBeAdded != null) - fileDataToBeAdded.Add(fileToBeAdded); - fileDataToBeRemoved.Add(fileData); - } - } - - var lenghtOfFilesToBeAdded = fileDataToBeAdded.Count; - for (var i = 0; i < fileDataToBeRemoved.Count; i++) - { - _searchResults.Remove(fileDataToBeRemoved[i]); - if (i < lenghtOfFilesToBeAdded) - _searchResults.Insert(i, fileDataToBeAdded[i]); - } - } - } - PostProcessSearchResult(_searchResults, sourceSettings, targetSettings); - - if (_doUpdateStatus) - { - UpdateFileBasedOnResults(_searchResults); - _doUpdateStatus = false; - FindInFiles(doOR); - PostProcessSearchResult(_searchResults, sourceSettings, targetSettings); - } - else - BindSearchResults(); - } - - private void FindInFilesForReplace(SearchSettings sourceSettings = null, SearchSettings targeSettings = null) - { - var files = - (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); - if (_replaceResults != null) - _replaceResults.Clear(); - StepProcess("Processing source segments ..."); - - if (sourceSettings != null && !String.IsNullOrEmpty(sourceSettings.SearchText)) - { - var analyzer = new FilesAnalyzer(files); - analyzer.SearchInFiles(sourceSettings); - _replaceResults = analyzer.FileResults; - } - var searchInTarget = false; - searchInTarget = targeSettings != null && !String.IsNullOrEmpty(targeSettings.SearchText); - if (searchInTarget) - { - StepProcess("Processing target segments ..."); - var analyzer = new FilesAnalyzer(files); - analyzer.SearchInFiles(targeSettings); - var targetResult = analyzer.FileResults; - - if (_replaceResults == null || _replaceResults.Count == 0) - _replaceResults = targetResult; - else - { - var fileDataToBeAdded = new List(); - var fileDataToBeRemoved = new List(); - foreach (var fileData in _replaceResults) - { - var file = fileData.FilePath; - var targetFileData = targetResult.FirstOrDefault(data => data.FilePath == file); - if (targetFileData != null) - { - //create new FileData containing source result search from source and target result search from target - var fileToBeAdded = UnionSourceAndTarget(fileData, targetFileData, file); - if (fileToBeAdded != null) - fileDataToBeAdded.Add(fileToBeAdded); - fileDataToBeRemoved.Add(fileData); - } - } - - var lenghtOfFilesToBeAdded = fileDataToBeAdded.Count; - for (var i = 0; i < fileDataToBeRemoved.Count; i++) - { - _replaceResults.Remove(fileDataToBeRemoved[i]); - if (i < lenghtOfFilesToBeAdded) - _replaceResults.Insert(i, fileDataToBeAdded[i]); - } - } - } - - PostProcessSearchResult(_replaceResults, sourceSettings, targeSettings); - } - - private List> GetAllAvailableLanguages() - { - var assembly = Assembly.GetExecutingAssembly(); - var dir = Path.GetDirectoryName(assembly.Location); - if (string.IsNullOrEmpty(dir)) - return new List>(); - var languageFiles = Directory.GetFiles(dir, "*.resx"); - - var cultures = new List>(); - foreach (var languageFile in languageFiles) - { - var langs = languageFile.Split('.'); - var cultureID = langs[langs.Count() - 2]; - var cultureName = new CultureInfo(cultureID).NativeName.Split(' ')[0]; - cultures.Add(new KeyValuePair(cultureID, cultureName)); - } - return cultures; - } - - private IEnumerable GetPhisicalFilesPathFromProjectFile(string projectFile) - { - var sourceCulture = GetProjectSourceLanguageCode(projectFile) + "\\"; - var phisicalFilesPath = new List(); - try - { - var projectsFile = new XPathDocument(projectFile); - var nav = projectsFile.CreateNavigator(); - const string expression = "//FileVersion"; - var fileVersions = nav.Select(expression); - while (fileVersions.MoveNext()) - { - var filePath = fileVersions.Current.SelectSingleNode("@PhysicalPath"); - if (filePath != null) - { - var fileName = filePath.Value; - if (fileName.IndexOf(".sdlxliff", StringComparison.Ordinal) != -1 && - !phisicalFilesPath.Contains(fileName) && !fileName.Contains(sourceCulture)) - phisicalFilesPath.Add(fileName); - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - return phisicalFilesPath; - } - - private string GetProjectPath() - { - var projectsController = GetProjectController(); - if (projectsController?.CurrentProject != null) - { - var currentProject = projectsController.CurrentProject; - var projectPath = Path.GetDirectoryName(currentProject.FilePath); - return projectPath; - } - - return $@"{Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)}\{GetStudioVersion()}\Projects"; - } - - private string GetProjectSourceLanguageCode(string projectPath) - { - var document = new XmlDocument(); - document.PreserveWhitespace = true; - document.Load(projectPath); - var selectSingleNode = document.SelectSingleNode("//SourceLanguageCode"); - if (selectSingleNode != null) - return selectSingleNode.InnerText; - - return string.Empty; - } - - private string GetStudioVersion() - { - var studioVersionService = new StudioVersionService(); - var studioVersion = studioVersionService.GetStudioVersion(); - - if (studioVersion != null && studioVersion.Version.Equals("Studio16")) - { - return studioVersion.StudioDocumentsFolderName; - } - return string.Empty; - } - - private ConfirmationLevel? GetTranslationStatus() - { - if (!GroupHasCheckedRadioButtons(groupChangeTranslationStatus)) return null; - return ckChangeToNotTranslated.Checked ? ConfirmationLevel.Unspecified : ckChangeToDraft.Checked - ? ConfirmationLevel.Draft : ckChangeToTranslated.Checked - ? ConfirmationLevel.Translated : ckChangeToTranslationRejected.Checked - ? ConfirmationLevel.RejectedTranslation : ckChangeToTranslationApproved.Checked - ? ConfirmationLevel.ApprovedTranslation : ckChangeToSignOffRejected.Checked - ? ConfirmationLevel.RejectedSignOff : ckChangeToSignedOff.Checked - ? ConfirmationLevel.ApprovedSignOff : ConfirmationLevel.Unspecified; - } - - private void gridReplaceResults_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) - { - try - { - if (_replaceDataManager.DetailFilteredData != null && _replaceDataManager.DetailFilteredData.Count > 0) - { - ((DataGridView)sender).Rows[e.RowIndex].MinimumHeight = 0x38; - if (e.ColumnIndex == 0) - { - e.Value = _replaceDataManager.DetailFilteredData[e.RowIndex].SegID; - } - else if (e.ColumnIndex == 1) - { - e.Value = (new UIResources(Settings.GetSavedCulture())).GetString(_replaceDataManager.DetailFilteredData[e.RowIndex].SegStatus); - } - else if (e.ColumnIndex == 2) - { - e.Value = _replaceDataManager.DetailFilteredData[e.RowIndex]; - } - else - { - e.Value = $"{Path.GetFileName(Path.GetDirectoryName(_replaceDataManager.DetailFilteredData[e.RowIndex].FileName))}{Path.GetFileName(_replaceDataManager.DetailFilteredData[e.RowIndex].FileName)}"; - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - - private void gridReplaceResults_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) - { - if (((DataGridView)sender).ColumnCount > 3) - { - for (var i = 4; i < ((DataGridView)sender).ColumnCount; i++) - { - ((DataGridView)sender).Columns[i].Visible = false; - } - ((DataGridView)sender).Columns[1].Width = 80; - ((DataGridView)sender).Columns[2].Width = ((DataGridView)sender).Width - - ((DataGridView)sender).Columns[1].Width - - ((DataGridView)sender).Columns[0].Width - 55; - } - } - - private void gridSearchResults_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) - { - try - { - if (_searchDataManager?.DetailFilteredData != null && _searchDataManager?.DetailFilteredData.Count > 0) - { - ((DataGridView)sender).Rows[e.RowIndex].MinimumHeight = 0x38; - if (e.ColumnIndex == 0) - { - e.Value = _searchDataManager.DetailFilteredData[e.RowIndex].SegID; - } - else if (e.ColumnIndex == 1) - { - e.Value = - (new UIResources(Settings.GetSavedCulture())).GetString( - _searchDataManager.DetailFilteredData[e.RowIndex].SegStatus); - } - else if (e.ColumnIndex == 2) - { - e.Value = _searchDataManager.DetailFilteredData[e.RowIndex]; - } - else - { - e.Value = $"{Path.GetFileName(Path.GetDirectoryName(_searchDataManager.DetailFilteredData[e.RowIndex].FileName))}{Path.GetFileName(_searchDataManager.DetailFilteredData[e.RowIndex].FileName)}"; - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - - private void gridSearchResults_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) - { - if (((DataGridView)sender).ColumnCount > 3) - { - for (var i = 4; i < ((DataGridView)sender).ColumnCount; i++) - { - ((DataGridView)sender).Columns[i].Visible = false; - } - ((DataGridView)sender).Columns[1].Width = 80; - ((DataGridView)sender).Columns[2].Width = ((DataGridView)sender).Width - - ((DataGridView)sender).Columns[1].Width - - ((DataGridView)sender).Columns[0].Width - 55; - } - } - - private void gridXLIFFFiles_DragDrop(object sender, DragEventArgs e) - { - var data = (string[])e.Data.GetData(DataFormats.FileDrop, false); - var dsFiles = new XLIFFFiles(); - var projectFiles = data.Where(file => file.Contains(".sdlproj")); - foreach (var projectFile in projectFiles) - { - var phisicalFilesPath = GetPhisicalFilesPathFromProjectFile(projectFile); - - foreach (var file in phisicalFilesPath) - { - var fileRow = dsFiles.Files.NewFilesRow(); - fileRow.Path = String.Format("{0}\\{1}", Path.GetDirectoryName(projectFile), file); - fileRow.Name = file; - fileRow.Size = - ((decimal)(new FileInfo(fileRow.Path)).Length / 1000).ToString(CultureInfo.InvariantCulture); - fileRow.Date = (new FileInfo(fileRow.Path)).CreationTime.ToString(CultureInfo.InvariantCulture); - dsFiles.Files.AddFilesRow(fileRow); - } - } - - var xliffFiles = data.Where(file => file.Contains(".sdlxliff")); - foreach (var xliffFile in xliffFiles) - { - var fileRow = dsFiles.Files.NewFilesRow(); - fileRow.Path = xliffFile; - fileRow.Name = Path.GetFileName(xliffFile); - fileRow.Size = ((decimal)(new FileInfo(xliffFile)).Length / 1000).ToString(CultureInfo.InvariantCulture); - fileRow.Date = (new FileInfo(xliffFile)).CreationTime.ToString(CultureInfo.InvariantCulture); - dsFiles.Files.AddFilesRow(fileRow); - } - BindFilesGrid(dsFiles); - } - - private void gridXLIFFFiles_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; - } - - private void gridXLIFFFiles_SelectionChanged(object sender, EventArgs e) - { - listDocumentStructure.Items.Clear(); - } - - private bool GroupHasCheckedCheckBoxes(GroupBox groupBox) - { - var checkBoxes = groupBox.Controls.OfType(); - foreach (var checkBox in checkBoxes) - { - if (checkBox.Checked) - return true; - } - - return false; - } - - private bool GroupHasCheckedRadioButtons(GroupBox groupBox) - { - var checkBoxes = groupBox.Controls.OfType(); - foreach (var checkBox in checkBoxes) - { - if (checkBox.Checked) - return true; - } - - return false; - } - - private void HideProcess() - { - _setFormSizeChanged = false; - if (tabControl1.SelectedIndex == 2) - { - panelCommands.Visible = false; - } - else - { - panelCommands.Visible = true; - } - - panelStatus.Visible = false; - _setFormSizeChanged = true; - } - - private FileData IntersectSourceAndTarget(FileData fileData, FileData targetFileData, string filePath) - { - //add all non existing segmens from target (sourceSearchResult) into source - var sourceSegments = RemoveNotExistingSegments(fileData.SearchSourceResults.Values.ToList(), - targetFileData.SearchSourceResults.Values - .ToList()); - - //add all non existing segmens from source (targetSearchResult) into target - var targetSegments = - RemoveNotExistingSegments(targetFileData.SearchTargetResults.Values.ToList(), - fileData.SearchTargetResults.Values.ToList()); - - targetSegments = UpdateSIDsInTargetSegments(sourceSegments, targetSegments); - var fileToBeAdded = new FileData(filePath, - sourceSegments.OrderBy(seg => seg.SegmentId).ToList(), - targetSegments.OrderBy(seg => seg.SegmentId).ToList()); - return fileToBeAdded; - } - - private void PostProcessSearchResult(IEnumerable results, SearchSettings sourceSettings = null, SearchSettings targetSettings = null) - { - StepProcess("Post processing search result ..."); - - foreach (var fileData in results) - { - StepProcess("Post processing search result for file: " + Path.GetFileName(fileData.FilePath) + " ..."); - if (sourceSettings != null && sourceSettings.SearchInTag && fileData.SearchSourceResults.Any(ssr => ssr.Value.Tags.Count > 0)) - { - var sResults = fileData.SearchSourceResults.Where(ssr => ssr.Value.Tags.Count > 0); - foreach (var sResult in sResults) - { - for (var i = 0; i < sResult.Value.Tags.Count; i++) - { - var tag = sResult.Value.Tags[i]; - if (tag.TagText.StartsWith("(); - sResult.Value.SearchResults.Add(new IndexData(tag.TagPosition, nextTag.TagPosition - tag.TagPosition)); - } - } - } - - if (sourceSettings != null && sourceSettings.UseRegex && - fileData.SearchSourceResults.Any(sr => sr.Value.MatchesCount > 0)) - { - StepProcess("Post processing source result ..."); - var sResults = fileData.SearchSourceResults.Where(sr => sr.Value.MatchesCount > 0); - foreach (var sResult in sResults) - { - var sResultText = sResult.Value.SegmentText; - var searchResultsToRemove = new List(); - foreach (var searchResult in sResult.Value.SearchResults) - { - if (!Regex.IsMatch(sResultText, sourceSettings.SearchText, !sourceSettings.MatchCase ? RegexOptions.IgnoreCase : RegexOptions.None)) - { - searchResultsToRemove.Add(searchResult); - } - } - - foreach (var indexData in searchResultsToRemove) - { - sResult.Value.SearchResults.Remove(indexData); - } - } - } - - if (targetSettings != null && targetSettings.SearchInTag && fileData.SearchTargetResults.Any(ssr => ssr.Value.Tags.Count > 0)) - { - var sResults = fileData.SearchTargetResults.Where(ssr => ssr.Value.Tags.Count > 0); - foreach (var sResult in sResults) - { - for (var i = 0; i < sResult.Value.Tags.Count; i++) - { - var tag = sResult.Value.Tags[i]; - if (tag.TagText.StartsWith("(); - sResult.Value.SearchResults.Add(new IndexData(tag.TagPosition, nextTag.TagPosition - tag.TagPosition)); - } - } - } - - if (targetSettings != null && targetSettings.UseRegex && - fileData.SearchTargetResults.Any(sr => sr.Value.MatchesCount > 0)) - { - StepProcess("Post processing target result ..."); - var sResults = fileData.SearchTargetResults.Where(sr => sr.Value.MatchesCount > 0); - foreach (var sResult in sResults) - { - var tResultText = sResult.Value.SegmentText; - var searchResultsToRemove = new List(); - foreach (var searchResult in sResult.Value.SearchResults) - { - if (!Regex.IsMatch(tResultText, targetSettings.SearchText, !targetSettings.MatchCase ? RegexOptions.IgnoreCase : RegexOptions.None)) - { - searchResultsToRemove.Add(searchResult); - } - } - - foreach (var indexData in searchResultsToRemove) - { - sResult.Value.SearchResults.Remove(indexData); - } - } - } - } - StepProcess("Post processing completed."); - } - - private void ProcessFileBasedOnStatuses(IEnumerable indexes, bool forSlice = false, Dictionary filesToBeSliced = null) - { - var files = filesToBeSliced != null ? filesToBeSliced.Values.ToList() : (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); - var threads = new List(); - foreach (var file in files) - { - var t = new Thread(() => ProcessOneFileBasedOnStatuses(forSlice, file, indexes, filesToBeSliced)); - t.Start(); - threads.Add(t); - } - foreach (var thread in threads) - { - thread.Join(); - } - } - - private void ProcessOneFileBasedOnStatuses(bool forSlice, string file, IEnumerable DSSelectedIndexes, Dictionary filesToBeSliced) - { - StepProcess("Processing file: " + Path.GetFileName(file) + ". ", false); - var xDoc = new XmlDocument(); - xDoc.PreserveWhitespace = true; - - if (!string.IsNullOrEmpty(file)) - { - xDoc.Load(file); - } - var xmlEncoding = "utf-8"; - try - { - if (xDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) - { - // Get the encoding declaration. - var decl = (XmlDeclaration) xDoc.FirstChild; - xmlEncoding = decl.Encoding; - } - - var originalFile = file; - if (filesToBeSliced != null) - { - originalFile = filesToBeSliced.FirstOrDefault(f => f.Value == file).Key; - if (string.IsNullOrEmpty(originalFile)) - originalFile = file; - } - - var fileList = xDoc.DocumentElement?.GetElementsByTagName("file"); - if (fileList != null) - { - foreach (var fileElement in fileList.OfType()) - { - var bodyElement = (XmlElement)(fileElement.GetElementsByTagName("body")[0]); - var groupElements = bodyElement.GetElementsByTagName("group"); - foreach (var groupElement in groupElements.OfType()) - { - ProcessOnFileBasedOnStatusesInBody(forSlice, file, DSSelectedIndexes, originalFile, groupElement); - } - ProcessOnFileBasedOnStatusesInBody(forSlice, file, DSSelectedIndexes, originalFile, bodyElement); - } - } - - if (!forSlice) - { - Encoding encoding = new UTF8Encoding(); - if (!string.IsNullOrEmpty(xmlEncoding)) - encoding = Encoding.GetEncoding(xmlEncoding); - using (var writer = new XmlTextWriter(file, encoding)) - { - xDoc.Save(writer); - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - - private void ProcessOnFileBasedOnStatusesInBody(bool forSlice, string file, IEnumerable DSSelectedIndexes, string originalFile, object groupElement) - { - try - { - var doUpdateElement = false; - //look in cxts - if (DSSelectedIndexes.Any()) - { - var selectedIDs = new List(); - foreach (var index in DSSelectedIndexes) - { - if (_structureInformationTypes[index].IDs.Any(f => f.Key == originalFile)) - { - var fileIDs = _structureInformationTypes[index].IDs.FirstOrDefault(f => f.Key == originalFile); - selectedIDs.AddRange(fileIDs.Value); - } - } - var cxtDefs = ((XmlNode)groupElement).ChildNodes; - foreach (var cxtDef in cxtDefs.OfType()) - { - if (cxtDef.Name != "sdl:cxts") - continue; - - var cxts = cxtDef.ChildNodes; - foreach (var cxt in cxts.OfType()) - { - if (cxt.Name != "sdl:cxt") - continue; - - var id = cxt.Attributes["id"].Value; - if (selectedIDs.Contains(id)) - { - doUpdateElement = true; - break; - } - } - if (doUpdateElement) - break; - } - } - else - doUpdateElement = true; - - //if structure type not in the slected ones ... go to the next element - if (!doUpdateElement) - return; - - //look in segments - var transUnits = ((XmlElement)groupElement).ChildNodes; ; - foreach (var transUnit in transUnits.OfType()) - { - if ((transUnit).Name != "trans-unit") - continue; - - var transUnitID = (transUnit).Attributes["id"].Value; - - var segDefs = (transUnit).ChildNodes; - foreach (var segDef in segDefs.OfType()) - { - if ((segDef).Name != "sdl:seg-defs") - continue; - - var segments = (segDef).ChildNodes; - - #region segments - - foreach (var segment in segments.OfType()) - { - if (segment.Name != "sdl:seg") - continue; - - var segmentId = (segment).Attributes["id"].Value; - doUpdateElement = true; - try - { - //look in tranlsation statuses - if (GroupHasCheckedCheckBoxes(groupStatusesTranslationStatus)) - doUpdateElement = UpdateManager.DoUpdateElementBasedOnTranslatioStatus(segment); - - //look if locked / unlocked - if (GroupHasCheckedCheckBoxes(groupStatusesLocked)) - doUpdateElement = UpdateManager.DoUpdateElementBasedOnLockedInformation(segment); - //look in score - if (GroupHasCheckedCheckBoxes(groupScore)) - doUpdateElement = UpdateManager.DoUpdateElementBasedOnScoreInformation(segment); - //look in translation origin - if (GroupHasCheckedCheckBoxes(groupTranslationOrigin)) - doUpdateElement = UpdateManager.DoUpdateElementBasedOnTranslationOriginInformation(segment); - //look in system - if (GroupHasCheckedCheckBoxes(groupSystem)) - doUpdateElement = UpdateManager.DoUpdateElementBasedOnSystemInformation(segment); - - if (doUpdateElement) - { - if (forSlice && !string.IsNullOrEmpty(transUnitID) && !string.IsNullOrEmpty(segmentId)) - { - var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); - if (fileSliceInfo == null) - { - _segmentsToBeSliced.Add(new SliceInfo - { - File = file, - Segments = new List>> - {new KeyValuePair>(transUnitID, new List {segmentId})} - }); - } - else - { - if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) - fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, new List {segmentId})); - else - { - var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); - if (!segSliceInfo.Value.Contains(segmentId)) - segSliceInfo.Value.Add(segmentId); - } - } - } - else - { - //update the element - if (ckChangeToUnlocked.Checked && segment.HasAttribute("locked")) - (segment).RemoveAttribute("locked"); - if (ckChangeToLocked.Checked) - (segment).SetAttribute("locked", "true"); - - if (GetTranslationStatus() != null) - { - var translationStatus = GetTranslationStatus().Value.ToString(); - if (string.IsNullOrEmpty(translationStatus)) - { - if ((segment).HasAttribute("conf")) - (segment).RemoveAttribute("conf"); - } - else - { - (segment).SetAttribute("conf", translationStatus); - } - } - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - - #endregion segments - - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - - private List RemoveNotExistingSegments(List sourceSegments, - List targetSegments) - { - var segmentsToBeRemoved = new List(); - foreach (var sourceSegment in sourceSegments) - { - if (targetSegments.Any(segment => segment.SegmentId == sourceSegment.SegmentId)) - continue; - segmentsToBeRemoved.Add(sourceSegment); - } - foreach (var segmentData in segmentsToBeRemoved) - sourceSegments.Remove(segmentData); - - return sourceSegments; - } - - private void ReplaceInResultsForReplacePreview() - { - var fileDataToBeAdded = new List(); - var fileDataToBeRemoved = new List(); - foreach (var fileData in _replaceResults) - { - StepProcess("Preparing replace information for file:" + Path.GetFileName(fileData.FilePath) + " ..."); - var sourceSegments = new List(); - var targetSegments = new List(); - foreach (var sourceSegment in fileData.SearchSourceResults) - { - var newText = ReplaceSegmentTextForPreview(sourceSegment.Value.SegmentText, - txtReplaceSourceSearch.Text, - txtReplaceSourceReplace.Text); - var sData = new SegmentData(sourceSegment.Value.Sid, sourceSegment.Value.SegmentId, - newText, - sourceSegment.Value.SegmentStatus, - sourceSegment.Value.SegmentContent) - { - Tags = sourceSegment.Value.Tags, - SearchResults = sourceSegment.Value.SearchResults, - }; - if (sData.SearchResults != null && sData.SearchResults.Count > 0) - { - var lenDif = (newText.Length - sourceSegment.Value.SegmentText.Length) / sData.SearchResults.Count; - - for (var index = 0; index < sData.SearchResults.Count; index++) - { - var searchResult = sData.SearchResults[index]; - searchResult.Length += lenDif; - searchResult.IndexStart += (index * lenDif); - } - } - sourceSegments.Add(sData); - } - foreach (var targetSegment in fileData.SearchTargetResults) - { - var newText = ReplaceSegmentTextForPreview(targetSegment.Value.SegmentText, - txtReplaceTargetSearch.Text, - txtReplaceTargetReplace.Text); - var sData = new SegmentData(targetSegment.Value.Sid, targetSegment.Value.SegmentId, - newText, targetSegment.Value.SegmentStatus, - targetSegment.Value.SegmentContent) - { - Tags = targetSegment.Value.Tags, - SearchResults = targetSegment.Value.SearchResults - }; - if (sData.SearchResults != null && sData.SearchResults.Count > 0) - { - var lenDif = (newText.Length - targetSegment.Value.SegmentText.Length) / sData.SearchResults.Count; - - for (var index = 0; index < sData.SearchResults.Count; index++) - { - var searchResult = sData.SearchResults[index]; - searchResult.Length += lenDif; - searchResult.IndexStart += (index * lenDif); - } - } - targetSegments.Add(sData); - } - var fileToBeAdded = new FileData(fileData.FilePath, - sourceSegments.OrderBy(seg => seg.SegmentId).ToList(), - targetSegments.OrderBy(seg => seg.SegmentId).ToList()); - - fileDataToBeAdded.Add(fileToBeAdded); - fileDataToBeRemoved.Add(fileData); - StepProcess("File:" + Path.GetFileName(fileData.FilePath) + " ready."); - } - - StepProcess("Preparing the view ..."); - var lenghtOfFilesToBeAdded = fileDataToBeAdded.Count; - for (var i = 0; i < fileDataToBeRemoved.Count; i++) - { - _replaceResults.Remove(fileDataToBeRemoved[i]); - if (i < lenghtOfFilesToBeAdded) - _replaceResults.Insert(i, fileDataToBeAdded[i]); - } - } - - private string ReplaceSegmentTextForPreview(string segmentText, string pattern, string replaceString) - { - var text = segmentText; - if (ckReplaceUseRegEx.Checked) - { - var options = RegexOptions.None; - if (!ckReplaceMatchCase.Checked) - options = RegexOptions.IgnoreCase; - return Regex.Replace(text, pattern, replaceString, options); - } - - var remove = Regex.Escape(pattern); - var replacePattern = ckReplaceMatchWholeWord.Checked - ? string.Format(@"(\b(?>>(); - foreach (var sliceInfo in _segmentsToBeSliced) - { - var destinationDirectory = Path.Combine(tempFolderForSlicedFiles, Path.GetFileName(Path.GetDirectoryName(sliceInfo.File))); - if (!Directory.Exists(destinationDirectory)) - Directory.CreateDirectory(destinationDirectory); - var destinationFile = Path.Combine(destinationDirectory, Path.GetFileName(sliceInfo.File)); - File.Copy(sliceInfo.File, destinationFile, true); - - var language = string.Empty; - try - { - language = Path.GetFileName(Path.GetDirectoryName(sliceInfo.File)); - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - if (filesPerLanguage.Any(f => f.Key == language)) - { - var languageItem = filesPerLanguage.FirstOrDefault(f => f.Key == language); - if (!languageItem.Value.Contains(destinationFile)) - languageItem.Value.Add(destinationFile); - } - else - filesPerLanguage.Add(new KeyValuePair>(language, new List { destinationFile })); - - SliceManager.SliceFile(destinationFile, sliceInfo); - } - - if (doMerge) - { - StepProcess("Merging sliced files ...", false); - SliceManager.MergeSplitFiles(filesPerLanguage); - } - else - { - CopyFilesFromTempFolder(filesPerLanguage); - } - Directory.Delete(tempFolderForSlicedFiles, true); - } - - private Dictionary SplitMergedXliffFile(string filePath, string folder) - { - var splitedFiles = new Dictionary(); - var xDoc = new XmlDocument(); - xDoc.PreserveWhitespace = true; - xDoc.Load(filePath); - var docInfoText = string.Empty; - var docInfos = xDoc.DocumentElement.GetElementsByTagName("doc-info"); - if (docInfos.Count > 0) - { - foreach (var docInfo in docInfos.OfType()) - { - docInfoText += docInfo.OuterXml; - } - } - var fileList = xDoc.DocumentElement.GetElementsByTagName("file"); - - var xliffBeginText = @""; - var xliffEndText = @""; - - if (!Directory.Exists(folder)) - Directory.CreateDirectory(folder); - - var fileNameTemplate = Path.Combine(folder, string.Format("{0}{1}.{2}", Path.GetFileNameWithoutExtension(filePath), "_{0}", Path.GetExtension(filePath))); - foreach (var file in fileList.OfType()) - { - var fileText = file.OuterXml; - var fileName = string.Format(fileNameTemplate, Guid.NewGuid().ToString()); - using (var sw = new StreamWriter(fileName, false)) - { - sw.Write(xliffBeginText); - sw.Write(docInfoText); - sw.Write(fileText); - sw.Write(xliffEndText); - } - splitedFiles.Add(filePath, fileName); - } - fileList = null; - xDoc = null; - return splitedFiles; - } - - private Dictionary SplitMergedXliffFiles() - { - var files = (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); - var splitedFiles = new Dictionary(); - var folder = Path.Combine(_folderForSlicedFiles, Guid.NewGuid().ToString()); - foreach (var file in files) - { - var result = SplitMergedXliffFile(file, folder); - foreach (var key in result.Keys) splitedFiles.Add(key, result[key]); - } - - return splitedFiles; - } - - private void StartFind(bool updateStatus, bool doOR) - { - _doUpdateStatus = updateStatus; - FindInFiles(doOR); - } - - private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) - { - _setFormSizeChanged = false; - groupSlice.Enabled = groupChange.Enabled = groupClear.Enabled = tabControl1.SelectedIndex != 2; - if (tabControl1.SelectedIndex == 1) - BindSearchResults(); - if (tabControl1.SelectedIndex == 2) - { - panelCommands.Visible = false; - BindReplaceResults(); - } - else - { - panelCommands.Visible = true; - } - _setFormSizeChanged = true; - - if (tabControl1.SelectedIndex == 1) - { - var resources = new UIResources(Settings.GetSavedCulture()); - var selIndex = cmbOperator.SelectedIndex; - cmbOperator.Items.Clear(); - cmbOperator.Items.Add(resources.OR); - cmbOperator.Items.Add(resources.AND); - cmbOperator.SelectedIndex = selIndex == -1 ? 0 : selIndex; - } - } - private void toolStripButton1_Click(object sender, EventArgs e) - { - if (gridXLIFFFiles.DataSource != null) - { - var dsFiles = (XLIFFFiles)((XLIFFFiles)gridXLIFFFiles.DataSource).Copy(); - var files = - (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); - - var rowsToBeRemoved = new List(); - foreach (var fileRow in dsFiles.Files) - { - if (files.Contains(fileRow.Path)) - rowsToBeRemoved.Add(fileRow); - } - - foreach (var filesRow in rowsToBeRemoved) - dsFiles.Files.RemoveFilesRow(filesRow); - - BindFilesGrid(dsFiles); - } - } - - private void txtReplaceSourceSearch_Validating(object sender, System.ComponentModel.CancelEventArgs e) - { - var pattern = txtReplaceSourceSearch.Text; - try - { - new Regex(pattern); - _errorProvider.SetError(txtReplaceSourceSearch, ""); - } - catch - { - _errorProvider.SetError(txtReplaceSourceSearch, "Invalid regular expression"); - } - } - - private void txtReplaceTargetSearch_Validating(object sender, System.ComponentModel.CancelEventArgs e) - { - var pattern = txtReplaceTargetSearch.Text; - try - { - new Regex(pattern); - _errorProvider.SetError(txtReplaceTargetSearch, ""); - } - catch - { - _errorProvider.SetError(txtReplaceTargetSearch, "Invalid regular expression"); - } - } - - private FileData UnionSourceAndTarget(FileData fileData, FileData targetFileData, string filePath) - { - //add all non existing segments from target (sourceSearchResult) into source - var sourceSegments = AddNonExistingSegments(fileData.SearchSourceResults.Values.ToList(), targetFileData.SearchSourceResults.Values.ToList()); - - //add all non existing segments from source (targetSearchResult) into target - var targetSegments = AddNonExistingSegments(targetFileData.SearchTargetResults.Values.ToList(), fileData.SearchTargetResults.Values.ToList()); - - var fileToBeAdded = new FileData(filePath, sourceSegments.OrderBy(seg => seg.SegmentId).ToList(), targetSegments.OrderBy(seg => seg.SegmentId).ToList()); - return fileToBeAdded; - } - - private void UpdateFileBasedOnResults(List searchResult) - { - foreach (var fileData in searchResult) - { - StepProcess("Updating file: " + Path.GetFileName(fileData.FilePath) + " ..."); - - if (fileData.SearchSourceResults.Count == 0) - continue; - - var filePath = fileData.FilePath; - var xDoc = new XmlDocument(); - xDoc.PreserveWhitespace = true; - xDoc.Load(filePath); - var xmlEncoding = "utf-8"; - try - { - if (xDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) - { - // Get the encoding declaration. - var decl = (XmlDeclaration) xDoc.FirstChild; - xmlEncoding = decl.Encoding; - } - - var fileList = xDoc.DocumentElement.GetElementsByTagName("file"); - foreach (var fileElement in fileList.OfType()) - { - var bodyElement = (XmlElement) (fileElement.GetElementsByTagName("body")[0]); - var groupElements = bodyElement.GetElementsByTagName("group"); - foreach (var groupElement in groupElements.OfType()) - { - UpdateFileBasedOnResultsInBody(groupElement, fileData); - } - - UpdateFileBasedOnResultsInBody(bodyElement, fileData); - } - - Encoding encoding = new UTF8Encoding(); - if (!string.IsNullOrEmpty(xmlEncoding)) - encoding = Encoding.GetEncoding(xmlEncoding); - using (var writer = new XmlTextWriter(filePath, encoding)) - { - xDoc.Save(writer); - } - - StepProcess("File: " + Path.GetFileName(fileData.FilePath) + " was updated."); - } - - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - } - - private void UpdateFileBasedOnResultsInBody(object groupElement, FileData fileData) - { - var elements = ((XmlElement)groupElement).ChildNodes; - foreach (var element in elements.OfType()) - { - try - { - if (!element.HasAttribute("id")) continue; - - var id = element.Attributes["id"].Value; - var segmentData = fileData.SearchSourceResults - .FirstOrDefault(result => result.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id == id) - .Value; - if (segmentData != null) - { - var segmentId = segmentData.SegmentId; - var segDefs = element.ChildNodes; - foreach (var segDef in segDefs.OfType()) - { - if (segDef.Name != "sdl:seg-defs") continue; - var segments = segDef.ChildNodes; - foreach (var segment in segments.OfType()) - { - if (segment.Name != "sdl:seg") continue; - - if (Convert.ToInt32(segment.Attributes["id"].Value) == segmentId) - { - if (ckChangeToUnlocked.Checked && segment.HasAttribute("locked")) - segment.RemoveAttribute("locked"); - if (ckChangeToLocked.Checked) - segment.SetAttribute("locked", "true"); - - if (GetTranslationStatus() != null) - { - var translationStatus = GetTranslationStatus().Value.ToString(); - if (string.IsNullOrEmpty(translationStatus)) - { - if (segment.HasAttribute("conf")) - segment.RemoveAttribute("conf"); - } - else - { - segment.SetAttribute("conf", translationStatus); - } - } - } - } - } - } - } - catch (Exception ex) - { - _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); - } - } - } - private void UpdateFocusedTextBox(IEnumerable chars) - { - var str = chars.Cast().Aggregate(string.Empty, (current, c) => current + c.ToString()); - - if (txtSourceSearch.Focused) - { - txtSourceSearch.SelectedText = str; - } - else if (txtTargetSearch.Focused) - { - txtTargetSearch.SelectedText = str; - } - else if (txtReplaceSourceSearch.Focused) - { - txtReplaceSourceSearch.SelectedText = str; - } - else if (txtReplaceSourceReplace.Focused) - { - txtReplaceSourceReplace.SelectedText = str; - } - else if (txtReplaceTargetSearch.Focused) - { - txtReplaceTargetSearch.SelectedText = str; - } - else if (txtReplaceTargetReplace.Focused) - { - txtReplaceTargetReplace.SelectedText = str; - } - } - - private List UpdateSIDsInTargetSegments(List sourceSegments, - List targetSegments) - { - var segments = new List(); - - foreach (var targetSegment in targetSegments) - { - var sourceSegment = - sourceSegments.FirstOrDefault(seg => seg.SegmentId == targetSegment.SegmentId); - if (sourceSegment == null) - throw new InvalidDataException("sourceSegment"); - - var sData = new SegmentData(sourceSegment.Sid, targetSegment.SegmentId, - targetSegment.SegmentText, targetSegment.SegmentStatus, - targetSegment.SegmentContent) - { - Tags = targetSegment.Tags, - SearchResults = targetSegment.SearchResults - }; - - segments.Add(sData); - } - - return segments; - } - } + public partial class SdlxliffSliceOrChange : UserControl, IUIControl + { + private bool _checkedChangedBeforeClick; + private bool _doUpdateStatus; + private bool _setFormSizeChanged = true; + private bool _formSizeChanged; + private bool _saveCultrue = true; + private ErrorProvider _errorProvider; + public string _folderForSlicedFiles; + private FileDataManager _replaceDataManager; + private List _replaceResults; + private FileDataManager _searchDataManager; + private List _searchResults; + private SearchResults _searchResultsForm; + private List _segmentsToBeSliced = new List(); + private List _structureInformationTypes = new List(); + private readonly Logger _logger = LogManager.GetCurrentClassLogger(); + + public SdlxliffSliceOrChange() + { + InitializeComponent(); + SliceManager = new SliceManager(this); + UpdateManager = new UpdateManager(this); + _errorProvider = new ErrorProvider(); + } + + public SliceManager SliceManager { get; } + + public UpdateManager UpdateManager { get; } + + public List GetTranslationStatusForSearch() + { + var statuses = new List(); + + if (ckNotTranslated.Checked) statuses.Add(ConfirmationLevel.Unspecified.ToString()); + if (ckDraft.Checked) statuses.Add(ConfirmationLevel.Draft.ToString()); + if (ckTranslated.Checked) statuses.Add(ConfirmationLevel.Translated.ToString()); + if (ckTranslationRejected.Checked) statuses.Add(ConfirmationLevel.RejectedTranslation.ToString()); + if (ckTranslationApproved.Checked) statuses.Add(ConfirmationLevel.ApprovedTranslation.ToString()); + if (ckSignOffRejected.Checked) statuses.Add(ConfirmationLevel.RejectedSignOff.ToString()); + if (ckSignedOff.Checked) statuses.Add(ConfirmationLevel.ApprovedSignOff.ToString()); + + return statuses; + } + + public void ShowProcess() + { + _setFormSizeChanged = false; + panelStatus.Visible = true; + progressBar.Value = progressBar.Minimum = 0; + progressBar.Maximum = 100; + if (tabControl1.SelectedIndex == 2) + { + panelCommands.Visible = false; + } + + _setFormSizeChanged = true; + } + + public void StepProcess(string message, bool lastStep = false) + { + Invoke((MethodInvoker)delegate + { + try + { + progressBar.Focus(); + if (progressBar.Value + 1 < progressBar.Maximum) + progressBar.Value++; + + if (lastStep) + { + progressBar.Value = progressBar.Maximum; + HideProcess(); + } + } + catch (Exception ex) + { + if (lastStep) + { + HideProcess(); + } + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + }); + } + + protected override bool ProcessCmdKey(ref Message message, Keys keys) + { + if (ControlHasFocus() && keys == (Keys.Control | Keys.Shift | Keys.Space)) + { + UpdateFocusedTextBox(new[] { '\u00A0' }); + + return true; + } + + return base.ProcessCmdKey(ref message, keys); + } + + private static ProjectsController GetProjectController() + { + return SdlTradosStudio.Application.GetController(); + } + + private List AddNonExistingSegments(List sourceSegments, + List targetSegments) + { + foreach (var targetSegment in targetSegments) + { + if (sourceSegments.All(segment => segment.SegmentId != targetSegment.SegmentId)) + { + var maxSID = sourceSegments.Count == 0 ? -1 : sourceSegments.Select(segData => segData.Sid).Max(); + + var sData = new SegmentData(maxSID + 1, targetSegment.SegmentId, + targetSegment.SegmentText, targetSegment.SegmentStatus, + targetSegment.SegmentContent) + { + Tags = targetSegment.Tags, + SearchResults = targetSegment.SearchResults + }; + + sourceSegments.Add(sData); + } + } + + return sourceSegments; + } + + private void BindDDL(ComboBox comboBox, List> items) + { + comboBox.ValueMember = "Key"; + comboBox.DisplayMember = "Value"; + comboBox.DataSource = items; + } + + private void BindFilesGrid(XLIFFFiles dsFiles) + { + gridXLIFFFiles.DataSource = dsFiles; + gridXLIFFFiles.DataMember = dsFiles.Files.TableName; + } + + private void BindReplaceResults(DataGridView grView) + { + grView.ReadOnly = true; + grView.Columns.Clear(); + grView.Columns.Add("ID", "#"); + grView.Columns.Add("Status", "#"); + grView.Columns.Add(new ControlColumn()); + grView.Columns.Add("File", "#"); + SetDetailReplaceGridView(grView); + + grView.DataSource = _replaceDataManager?.DetailFilteredData; + } + + private void BindReplaceResults() + { + Invoke((MethodInvoker)delegate + { + gridReplaceResults.DataSource = null; + if (_replaceResults != null) + { + _replaceDataManager = new FileDataManager(_replaceResults); + gridReplaceResults.RowCount = _replaceDataManager.SetDetailDataSearch(); + if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) + { + _searchResultsForm.SearchResultsGrid.DataSource = null; + _searchResultsForm.SearchResultsGrid.RowCount = gridReplaceResults.RowCount; + } + if (!_replaceDataManager.IsSearchResultEmpty()) + { + BindReplaceResults(gridReplaceResults); + if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) + { + BindReplaceResults(_searchResultsForm.SearchResultsGrid); + } + } + } + }); + } + + private void BindSearchResults(DataGridView grView) + { + grView.ReadOnly = true; + grView.Columns.Clear(); + grView.Columns.Add("ID", "#"); + grView.Columns.Add("Status", "#"); + grView.Columns.Add(new ControlColumn()); + grView.Columns.Add("File", "#"); + SetDetailGridView(grView); + + grView.DataSource = _searchDataManager?.DetailFilteredData; + } + + private void BindSearchResults() + { + Invoke((MethodInvoker)delegate + { + gridSearchResults.DataSource = null; + if (_searchResults != null) + { + _searchDataManager = new FileDataManager(_searchResults); + gridSearchResults.RowCount = _searchDataManager.SetDetailDataSearch(); + if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) + { + _searchResultsForm.SearchResultsGrid.DataSource = null; + _searchResultsForm.SearchResultsGrid.RowCount = gridSearchResults.RowCount; + } + if (!_searchDataManager.IsSearchResultEmpty()) + { + BindSearchResults(gridSearchResults); + if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) + { + BindSearchResults(_searchResultsForm.SearchResultsGrid); + } + } + } + }); + } + + private void btnChangeit_Click(object sender, EventArgs e) + { + var resources = new UIResources(Settings.GetSavedCulture()); + if (gridXLIFFFiles.SelectedRows.Count == 0) + { + MessageBox.Show(resources.ErrorNoFilesSelected, resources.ErrorTitleNoFilesSelected, + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + ShowProcess(); + var selectedTabIndex = tabControl1.SelectedIndex; + var indexes = listDocumentStructure.SelectedIndices.Cast().ToList(); + var doCopySourceToTarget = ckCopySourceToTarget.Checked; + var doOR = cmbOperator.SelectedIndex == 0; + StepProcess("Changing files based on selected options..."); + var t = new Thread(() => DoChangeNow(selectedTabIndex, indexes, doCopySourceToTarget, doOR)); + t.Start(); + } + + private void btnClearit_Click(object sender, EventArgs e) + { + var resources = new UIResources(Settings.GetSavedCulture()); + if (gridXLIFFFiles.SelectedRows.Count == 0) + { + MessageBox.Show(resources.ErrorNoFilesSelected, resources.ErrorTitleNoFilesSelected, + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + ShowProcess(); + StepProcess("Clearing target segments from selected files ..."); + var selectedTabIndex = tabControl1.SelectedIndex; + var selectedDSIndexes = listDocumentStructure.SelectedIndices.Cast().ToList(); + var doOR = cmbOperator.SelectedIndex == 0; + var t = new Thread(() => DoClearDow(selectedTabIndex, selectedDSIndexes, doOR)); + t.Start(); + } + + private void btnExpandReplaceResults_Click(object sender, EventArgs e) + { + var grView = new DataGridView(); + grView.AllowUserToAddRows = false; + grView.AllowUserToDeleteRows = false; + grView.AllowUserToResizeRows = false; + grView.BackgroundColor = System.Drawing.SystemColors.Window; + grView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + grView.GridColor = SystemColors.Control; + grView.Location = new System.Drawing.Point(166, 92); + grView.Name = "grView"; + grView.RowHeadersVisible = false; + grView.Size = new System.Drawing.Size(676, 151); + grView.TabIndex = 7; + grView.VirtualMode = true; + grView.CellValueNeeded += gridReplaceResults_CellValueNeeded; + grView.DataBindingComplete += gridReplaceResults_DataBindingComplete; + + BindReplaceResults(grView); + + var location = new Point(); + var size = new Size(); + var setSizeAndLocation = false; + if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) + { + location = _searchResultsForm.Location; + size = _searchResultsForm.Size; + setSizeAndLocation = true; + _searchResultsForm.Close(); + } + + _searchResultsForm = new SearchResults(grView) { Dock = DockStyle.Fill }; + if (setSizeAndLocation) + { + _searchResultsForm.Location = location; + _searchResultsForm.Size = size; + } + _searchResultsForm.Show(); + } + + private void btnExpandSearchResults_Click(object sender, EventArgs e) + { + var grView = new DataGridView(); + grView.AllowUserToAddRows = false; + grView.AllowUserToDeleteRows = false; + grView.AllowUserToResizeRows = false; + grView.BackgroundColor = System.Drawing.SystemColors.Window; + grView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + grView.GridColor = System.Drawing.SystemColors.Control; + grView.Location = new System.Drawing.Point(166, 92); + grView.Name = "grView"; + grView.RowHeadersVisible = false; + grView.Size = new System.Drawing.Size(676, 151); + grView.TabIndex = 7; + grView.VirtualMode = true; + grView.CellValueNeeded += gridSearchResults_CellValueNeeded; + grView.DataBindingComplete += gridSearchResults_DataBindingComplete; + BindSearchResults(grView); + + var location = new Point(); + var size = new Size(); + var setSizeAndLocation = false; + if (_searchResultsForm != null && !_searchResultsForm.IsDisposed) + { + location = _searchResultsForm.Location; + size = _searchResultsForm.Size; + setSizeAndLocation = true; + _searchResultsForm.Close(); + } + + _searchResultsForm = new SearchResults(grView); + if (setSizeAndLocation) + { + _searchResultsForm.Location = location; + _searchResultsForm.Size = size; + } + _searchResultsForm.Show(); + } + + private void btnFindAll_Click(object sender, EventArgs e) + { + if (gridXLIFFFiles.SelectedRows.Count == 0 || + (String.IsNullOrEmpty(txtSourceSearch.Text) && String.IsNullOrEmpty(txtTargetSearch.Text))) + return; + ShowProcess(); + StepProcess("Finding in files ..."); + var doOR = cmbOperator.SelectedIndex == 0; + var t = new Thread(() => DoFindNow(doOR)); + t.Start(); + } + + private void btnFindAllInReplace_Click(object sender, EventArgs e) + { + if (gridXLIFFFiles.SelectedRows.Count == 0) + return; + if (String.IsNullOrEmpty(txtReplaceSourceSearch.Text) && String.IsNullOrEmpty(txtReplaceTargetSearch.Text)) + return; + + _doUpdateStatus = false; + ShowProcess(); + StepProcess("Finding in files before replace ..."); + + var sourceSettings = String.IsNullOrEmpty(txtReplaceSourceSearch.Text) + ? null + : new SearchSettings() + { + SearchText = txtReplaceSourceSearch.Text, + ReplaceText = txtReplaceSourceSearch.Text, + SearchInSource = true, + SearchInTarget = false, + MatchCase = ckReplaceMatchCase.Checked, + MatchWholeWord = ckReplaceMatchWholeWord.Checked, + UseRegex = ckReplaceUseRegEx.Checked, + SearchInTag = false, + SearchInLocked = true, + NotSearchStatus = new List(), + LockSegment = false, + UnlockContent = false, + NewStatus = ConfirmationLevel.Unspecified, + UpdateStatus = false + }; + + var targetSettings = String.IsNullOrEmpty(txtReplaceTargetSearch.Text) + ? null + : new SearchSettings() + { + SearchText = txtReplaceTargetSearch.Text, + ReplaceText = txtReplaceTargetSearch.Text, + SearchInSource = false, + SearchInTarget = true, + MatchCase = ckReplaceMatchCase.Checked, + MatchWholeWord = ckReplaceMatchWholeWord.Checked, + UseRegex = ckReplaceUseRegEx.Checked, + SearchInTag = false, + SearchInLocked = true, + NotSearchStatus = new List(), + LockSegment = false, + UnlockContent = false, + NewStatus = ConfirmationLevel.Unspecified, + UpdateStatus = false + }; + var t = new Thread(() => DoFindForReplaceNow(sourceSettings, targetSettings)); + t.Start(); + } + + private void btnGenerateDSI_Click(object sender, EventArgs e) + { + ShowProcess(); + var files = + (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); + _structureInformationTypes.Clear(); + StepProcess("Reading Document Structure information from files...", false); + var trd = new Thread(() => + { + foreach (var file in files) + { + StepProcess( + "Reading Document Structure information from file: " + Path.GetFileName(file) + ".", false); + using (var reader = XmlReader.Create(file)) + { + while (reader.Read()) + { + if (reader.Name == "cxt-defs") + { + var cxtDoc = new XmlDocument(); + cxtDoc.PreserveWhitespace = true; + cxtDoc.LoadXml(reader.ReadOuterXml()); + var cxtDefs = cxtDoc.DocumentElement.GetElementsByTagName("cxt-def"); + + foreach (var cxtDef in cxtDefs.OfType()) + { + var type = cxtDef.Attributes["type"].Value; + var id = cxtDef.Attributes["id"].Value; + + var cxt = + _structureInformationTypes.FirstOrDefault(t => t.InternalName == type); + if (cxt == null) + _structureInformationTypes.Add(new StructureInformationType() + { + IDs = + new List>>() + { + new KeyValuePair>(file, + new List() + { + id + }) + }, + InternalName = type, + DisplayName = type + }); + else + { + if (cxt.IDs.Any(f => f.Key == file)) + { + var idsPerFile = + cxt.IDs.FirstOrDefault(f => f.Key == file); + if (!idsPerFile.Value.Contains(id)) + idsPerFile.Value.Add(id); + } + else + { + cxt.IDs.Add(new KeyValuePair>(file, + new List() + { + id + })); + } + } + } + } + } + } + } + StepProcess("Displaying Document Structure information ...", true); + DisplayDSI(); + }); + trd.Start(); + } + + private void btnPreview_Click(object sender, EventArgs e) + { + if (gridXLIFFFiles.SelectedRows.Count == 0) + return; + if (string.IsNullOrEmpty(txtReplaceSourceSearch.Text) && String.IsNullOrEmpty(txtReplaceTargetSearch.Text)) + return; + + _doUpdateStatus = false; + ShowProcess(); + StepProcess("Generating replace preview ..."); + var t = new Thread(() => + { + DoReplacePreviewOperation(); + + BindReplaceResults(); + StepProcess("Preview generated.", true); + }); + t.Start(); + } + + private void btnReplace_Click(object sender, EventArgs e) + { + var files = + (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()); + if (!files.Any()) + return; + ShowProcess(); + StepProcess("Replacing in files ..."); + var t = new Thread(() => DoReplaceNow(files)); + t.Start(); + } + + private void btnReverseSelection_Click(object sender, EventArgs e) + { + foreach (var c in pageStatuses.Controls.OfType()) + { + foreach (var ck in c.Controls.OfType()) + { + ck.Checked = !ck.Checked; + } + foreach (var list in c.Controls.OfType()) + { + var selectedItems = + list.Items.Cast().Where(item => !list.SelectedItems.Contains(item)).ToList(); + list.SelectedItems.Clear(); + foreach (var selItem in selectedItems) + list.SelectedItems.Add(selItem); + } + } + } + + private void btnSelectFolder_Click(object sender, EventArgs e) + { + var selectFolder = new FolderSelectDialog(); + selectFolder.InitialDirectory = GetProjectPath(); + if (selectFolder.ShowDialog()) + { + var dsFiles = new XLIFFFiles(); + var files = Directory.GetFiles(selectFolder.FileName, "*.sdlxliff"); + foreach (var file in files) + { + var fileRow = dsFiles.Files.NewFilesRow(); + fileRow.Path = file; + fileRow.Name = Path.GetFileName(file); + fileRow.Size = ((decimal)(new FileInfo(file)).Length / 1000).ToString(CultureInfo.InvariantCulture); + fileRow.Date = (new FileInfo(file)).CreationTime.ToString(CultureInfo.InvariantCulture); + dsFiles.Files.AddFilesRow(fileRow); + } + BindFilesGrid(dsFiles); + } + } + + private void btnSelectProjectFile_Click(object sender, EventArgs e) + { + selectProjectFile.InitialDirectory = GetProjectPath(); + selectProjectFile.CheckFileExists = true; + selectProjectFile.Filter = "SDL Project Files (.sdlproj)|*.sdlproj"; + selectProjectFile.Multiselect = false; + if (selectProjectFile.ShowDialog() == DialogResult.OK) + { + var phisicalFilesPath = GetPhisicalFilesPathFromProjectFile(selectProjectFile.FileName); + + var dsFiles = new XLIFFFiles(); + foreach (var file in phisicalFilesPath) + { + var fileRow = dsFiles.Files.NewFilesRow(); + fileRow.Path = string.Format("{0}\\{1}", Path.GetDirectoryName(selectProjectFile.FileName), file); + fileRow.Name = file; + fileRow.Size = + ((decimal)(new FileInfo(fileRow.Path)).Length / 1000).ToString(CultureInfo.InvariantCulture); + fileRow.Date = (new FileInfo(fileRow.Path)).CreationTime.ToString(CultureInfo.InvariantCulture); + dsFiles.Files.AddFilesRow(fileRow); + } + BindFilesGrid(dsFiles); + } + } + + private void btnSelectSDLXLIFFFiles_Click(object sender, EventArgs e) + { + selectProjectFile.InitialDirectory = GetProjectPath(); + selectProjectFile.CheckFileExists = true; + selectProjectFile.Filter = "SDLXLIFF Files (.sdlxliff)|*.sdlxliff"; + selectProjectFile.Multiselect = true; + if (selectProjectFile.ShowDialog() == DialogResult.OK) + { + var dsFiles = new XLIFFFiles(); + var files = selectProjectFile.FileNames; + foreach (var file in files) + { + var fileRow = dsFiles.Files.NewFilesRow(); + fileRow.Path = file; + fileRow.Name = Path.GetFileName(file); + fileRow.Size = ((decimal)(new FileInfo(file)).Length / 1000).ToString(CultureInfo.InvariantCulture); + fileRow.Date = (new FileInfo(file)).CreationTime.ToString(CultureInfo.InvariantCulture); + dsFiles.Files.AddFilesRow(fileRow); + } + BindFilesGrid(dsFiles); + } + } + + private void btnSliceit_Click(object sender, EventArgs e) + { + var resources = new UIResources(Settings.GetSavedCulture()); + if (gridXLIFFFiles.SelectedRows.Count == 0) + { + MessageBox.Show(resources.ErrorNoFilesSelected, resources.ErrorTitleNoFilesSelected, + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + var studioFolder = GetStudioVersion(); + var folder = new FolderSelectDialog + { + InitialDirectory = string.Format(@"{0}\{1}\Projects", + Environment.GetFolderPath( + Environment.SpecialFolder.MyDocuments), studioFolder) + }; + if (folder.ShowDialog()) + { + _folderForSlicedFiles = folder.FileName; + + var files = + (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()) + .ToList(); + if (files.Count == 0) + { + return; + } + ShowProcess(); + StepProcess("Sliceing files ...", false); + + var selectedTabIndex = tabControl1.SelectedIndex; + var selectedDSIndexes = listDocumentStructure.SelectedIndices.Cast().ToList(); + var doMerge = ckMerge.Checked; + var doOR = cmbOperator.SelectedIndex == 0; + var t = new Thread(() => DoSliceNow(selectedTabIndex, selectedDSIndexes, doMerge, doOR)); + t.Start(); + } + } + + private void ChangeInFiles(IEnumerable files) + { + var settings = new ReplaceSettings() + { + MatchCase = ckReplaceMatchCase.Checked, + MatchWholeWord = ckReplaceMatchWholeWord.Checked, + UseRegEx = ckReplaceUseRegEx.Checked, + SourceSearchText = txtReplaceSourceSearch.Text, + SourceReplaceText = txtReplaceSourceReplace.Text, + TargetSearchText = txtReplaceTargetSearch.Text, + TargetReplaceText = txtReplaceTargetReplace.Text + }; + var threads = new List(); + foreach (var file in files) + { + var t = new Thread(() => ReplaceManager.DoReplaceInFile(file, settings, this)); + t.Start(); + threads.Add(t); + } + + foreach (var thread in threads) + thread.Join(); + } + + private void ckChangeToNotTranslated_CheckedChanged(object sender, EventArgs e) + { + _checkedChangedBeforeClick = true; + } + + private void ckChangeToNotTranslated_Click(object sender, EventArgs e) + { + if (!_checkedChangedBeforeClick && ((RadioButton)sender).Checked) + ((RadioButton)sender).Checked = false; + _checkedChangedBeforeClick = false; + } + + private void ClearFiles() + { + if (_segmentsToBeSliced.Count == 0) + return; + + var threads = new List(); + foreach (var sliceInfo in _segmentsToBeSliced) + { + StepProcess("Clearing file: " + Path.GetFileName(sliceInfo.File) + "."); + + var t = new Thread(() => ClearManager.ClearFile(sliceInfo, this)); + t.Start(); + threads.Add(t); + } + foreach (var thread in threads) + thread.Join(); + } + + private void cmbLanguages_SelectedIndexChanged(object sender, EventArgs e) + { + var culture = cmbLanguages.SelectedValue.ToString(); + if (_saveCultrue) + Settings.SaveSelectedCulture(culture); + EnsureUIBasedOnCultureInfo(culture); + } + + private bool ControlHasFocus() + { + return txtSourceSearch.Focused || + txtTargetSearch.Focused || + txtReplaceSourceSearch.Focused || + txtReplaceSourceReplace.Focused || + txtReplaceTargetSearch.Focused || + txtReplaceTargetReplace.Focused; + } + + private void CopyFiles() + { + if (_segmentsToBeSliced.Count == 0) + return; + + var threads = new List(); + foreach (var sliceInfo in _segmentsToBeSliced) + { + StepProcess("Copying in file: " + Path.GetFileName(sliceInfo.File) + "."); + + var t = new Thread(() => ClearManager.CopyFile(sliceInfo, this)); + t.Start(); + threads.Add(t); + } + foreach (var thread in threads) + thread.Join(); + } + + private void CopyFilesFromTempFolder(List>> filesPerLanguage) + { + foreach (var keyValuePair in filesPerLanguage) + foreach (var file in keyValuePair.Value) + { + File.Copy(file, + Path.Combine(_folderForSlicedFiles, + Path.GetFileName(file).Replace(".sdlxliff", "_sliced.sdlxliff"))); + } + } + + private void DisplayDSI() + { + Invoke((MethodInvoker)delegate + { + listDocumentStructure.Items.Clear(); + listDocumentStructure.Items.AddRange( + _structureInformationTypes.Select(type => type.DisplayName).ToArray()); + }); + } + + private void DoChangeNow(int selectedTabIndex, IEnumerable indexes, bool doCopySourceToTarget, bool doOR) + { + if (selectedTabIndex == 1) + { + StartFind(true, doOR); + } + else + { + ProcessFileBasedOnStatuses(indexes); + } + + if (doCopySourceToTarget) + { + StepProcess("Copying source to target in selected files ..."); + DoCopySourceNow(selectedTabIndex, indexes, doOR); + } + + StepProcess("Files are changed based on selected options.", true); + } + + private void DoClearDow(int selectedTabIndex, List selectedDSIndexes, bool doOR) + { + StepProcess("Processing files ..."); + if (selectedTabIndex == 1) + { + _doUpdateStatus = false; + FindInFiles(doOR); + _segmentsToBeSliced.Clear(); + foreach (var searchResult in _searchResults) + { + foreach (var searchSourceResult in searchResult.SearchSourceResults) + { + var SegmentId = searchSourceResult.Value.SegmentId.ToString(CultureInfo.InvariantCulture); + var transUnitID = + searchSourceResult.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id; + var file = searchResult.FilePath; + + if (transUnitID != String.Empty && SegmentId != String.Empty) + { + var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); + if (fileSliceInfo == null) + { + _segmentsToBeSliced.Add(new SliceInfo() + { + File = file, + Segments = new List>>() + { + new KeyValuePair>(transUnitID, + new List() {SegmentId}) + } + }); + } + else + { + if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) + fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, + new List() + { + SegmentId + })); + else + { + var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); + if (!segSliceInfo.Value.Contains(SegmentId)) + segSliceInfo.Value.Add(SegmentId); + } + } + } + } + } + } + else + { + _segmentsToBeSliced.Clear(); + ProcessFileBasedOnStatuses(selectedDSIndexes, true); + } + StepProcess("Clearing files ..."); + ClearFiles(); + StepProcess("Target segments from selected files are clear.", true); + } + + private void DoCopySourceNow(int selectedTabIndex, IEnumerable selectedDSIndexes, bool doOR) + { + StepProcess("Processing files ..."); + if (selectedTabIndex == 1) + { + _doUpdateStatus = false; + FindInFiles(doOR); + _segmentsToBeSliced.Clear(); + foreach (var searchResult in _searchResults) + { + foreach (var searchSourceResult in searchResult.SearchSourceResults) + { + var SegmentId = searchSourceResult.Value.SegmentId.ToString(CultureInfo.InvariantCulture); + var transUnitID = + searchSourceResult.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id; + var file = searchResult.FilePath; + + if (transUnitID != String.Empty && SegmentId != string.Empty) + { + var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); + if (fileSliceInfo == null) + { + _segmentsToBeSliced.Add(new SliceInfo() + { + File = file, + Segments = new List>>() + { + new KeyValuePair>(transUnitID, + new List() {SegmentId}) + } + }); + } + else + { + if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) + fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, + new List() + { + SegmentId + })); + else + { + var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); + if (!segSliceInfo.Value.Contains(SegmentId)) + segSliceInfo.Value.Add(SegmentId); + } + } + } + } + } + } + else + { + _segmentsToBeSliced.Clear(); + ProcessFileBasedOnStatuses(selectedDSIndexes, true); + } + StepProcess("Copying source to target ..."); + CopyFiles(); + StepProcess("Source segments from selected files are copied to target.", true); + } + + private void DoFindForReplaceNow(SearchSettings sourceSettings, SearchSettings targetSettings) + { + FindInFilesForReplace(sourceSettings, targetSettings); + + BindReplaceResults(); + StepProcess("Find before replace completed.", true); + } + + private void DoFindNow(bool doOR) + { + StartFind(false, doOR); + StepProcess("Find completed.", true); + } + + private void DoReplaceNow(IEnumerable files) + { + if (_replaceResults == null || _replaceResults.Count == 0) + DoReplacePreviewOperation(); + ChangeInFiles(files); + BindReplaceResults(); + StepProcess("Replace completed.", true); + } + + private void DoReplacePreviewOperation() + { + StepProcess("Preparing files for replace operation ..."); + var sourceSettings = string.IsNullOrEmpty(txtReplaceSourceSearch.Text) + ? null + : new SearchSettings() + { + SearchText = txtReplaceSourceSearch.Text, + ReplaceText = txtReplaceSourceSearch.Text, + SearchInSource = true, + SearchInTarget = false, + MatchCase = ckReplaceMatchCase.Checked, + MatchWholeWord = ckReplaceMatchWholeWord.Checked, + UseRegex = ckReplaceUseRegEx.Checked, + SearchInTag = false, + SearchInLocked = true, + NotSearchStatus = new List(), + LockSegment = false, + UnlockContent = false, + NewStatus = ConfirmationLevel.Unspecified, + UpdateStatus = false + }; + + var targetSettings = string.IsNullOrEmpty(txtReplaceTargetSearch.Text) + ? null + : new SearchSettings() + { + SearchText = txtReplaceTargetSearch.Text, + ReplaceText = txtReplaceTargetSearch.Text, + SearchInSource = false, + SearchInTarget = true, + MatchCase = ckReplaceMatchCase.Checked, + MatchWholeWord = ckReplaceMatchWholeWord.Checked, + UseRegex = ckReplaceUseRegEx.Checked, + SearchInTag = false, + SearchInLocked = true, + NotSearchStatus = new List(), + LockSegment = false, + UnlockContent = false, + NewStatus = ConfirmationLevel.Unspecified, + UpdateStatus = false + }; + + FindInFilesForReplace(sourceSettings, targetSettings); + ReplaceInResultsForReplacePreview(); + } + + private void DoSliceNow(int selectedTab, IEnumerable indexes, bool doMerge, bool doOR) + { + StepProcess("Processing files based on slice information ...", false); + var filesToBeSliced = SplitMergedXliffFiles(); + if (!filesToBeSliced.Any()) return; + if (selectedTab == 1) + { + _doUpdateStatus = false; + FindInFiles(doOR, filesToBeSliced.Values.ToList()); + + _segmentsToBeSliced.Clear(); + foreach (var searchResult in _searchResults) + { + foreach (var searchSourceResult in searchResult.SearchSourceResults) + { + var SegmentId = searchSourceResult.Value.SegmentId.ToString(CultureInfo.InvariantCulture); + var transUnitID = searchSourceResult.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id; + var file = searchResult.FilePath; + + if (transUnitID != String.Empty && SegmentId != String.Empty) + { + var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); + if (fileSliceInfo == null) + { + _segmentsToBeSliced.Add(new SliceInfo() + { + File = file, + Segments = new List>>() { new KeyValuePair>(transUnitID, new List() { SegmentId }) } + }); + } + else + { + if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) + fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, new List() { SegmentId })); + else + { + var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); + if (!segSliceInfo.Value.Contains(SegmentId)) + segSliceInfo.Value.Add(SegmentId); + } + } + } + } + } + } + else + { + _segmentsToBeSliced.Clear(); + ProcessFileBasedOnStatuses(indexes, true, filesToBeSliced); + } + + StepProcess("Slice files ...", false); + SliceFiles(doMerge); + + var folder = Path.GetDirectoryName(filesToBeSliced.Values.ToList()[0]); + if (folder != null) Directory.Delete(folder, true); + + StepProcess("Files were successfully sliced.", true); + } + + private void EnsureUIBasedOnCultureInfo(string culture) + { + var resources = new UIResources(culture); + + btnSelectSDLXLIFFFiles.Text = resources.SelectXLIFF; + toolStripButton1.Text = resources.ClearFiles; + ckMerge.Text = resources.Merge; + ckCopySourceToTarget.Text = resources.CopySourceToTarget; + groupReplace.Text = resources.ReplaceGroup; + groupReplaceOptions.Text = resources.Options; + ckReplaceMatchCase.Text = resources.SearchMatchCase; + ckReplaceMatchWholeWord.Text = resources.SearchMatchWholeWord; + ckReplaceUseRegEx.Text = resources.SearchRegEx; + lblReplaceSourceSearch.Text = resources.SearchSource; + lblReplaceTargetSearch.Text = resources.SearchTarget; + lblReplaceSourceReplace.Text = lblReplaceTargetReplace.Text = resources.ReplaceWith; + btnFindAllInReplace.Text = resources.FindAll; + btnPreview.Text = resources.Preview; + btnReplace.Text = resources.Replace; + + pageStatuses.Text = resources.Statuses; + pageSearch.Text = resources.Search; + groupChange.Text = resources.Change; + groupSlice.Text = resources.Slice; + labelSliceComments.Text = resources.SliceComments; + btnSliceit.Text = resources.Sliceit; + btnChangeit.Text = resources.Changeit; + labelChangeComments.Text = resources.ChangeComments; + groupChangeToStatusOr.Text = resources.ChangeToStatusOr; + groupChangeLocked.Text = resources.ChangeLocked; + groupChangeTranslationStatus.Text = resources.ChangeTranslationStatus; + ckChangeToSignedOff.Text = resources.ChangeToSignedOff; + ckChangeToSignOffRejected.Text = resources.ChangeToSignOffRejected; + ckChangeToTranslationApproved.Text = resources.ChangeToTranslationApproved; + ckChangeToTranslationRejected.Text = resources.ChangeToTranslationRejected; + ckChangeToTranslated.Text = resources.ChangeToTranslated; + ckChangeToDraft.Text = resources.ChangeToDraft; + ckChangeToNotTranslated.Text = resources.ChangeToNotTranslated; + ckChangeToUnlocked.Text = resources.ChangeToUnlocked; + ckChangeToLocked.Text = resources.ChangeToLocked; + btnSelectFolder.Text = resources.SelectFolder; + btnSelectProjectFile.Text = resources.ProjectFile; + groupScore.Text = resources.Score; + ckMatchValues.Text = resources.MatchValues; + ckContextMatch.Text = resources.ContextMatch; + ckPerfectMatch.Text = resources.PerfectMatch; + groupStatusesLocked.Text = resources.StatusesLocked; + ckUnlocked.Text = resources.Unlocked; + ckLocked.Text = resources.Locked; + groupStatusesTranslationStatus.Text = resources.StatusesTranslationStatus; + ckSignedOff.Text = resources.ApprovedSignOff; + ckSignOffRejected.Text = resources.RejectedSignOff; + ckTranslationApproved.Text = resources.ApprovedTranslation; + ckTranslationRejected.Text = resources.RejectedTranslation; + ckTranslated.Text = resources.Translated; + ckDraft.Text = resources.Draft; + ckNotTranslated.Text = resources.NotTranslated; + groupTranslationOrigin.Text = resources.TranslationOrigin; + ckAutoPropagated.Text = resources.AutoPropagated; + ckNeuralMachineTranslation.Text = resources.NeuralMT; + ckAutomatedTranslation.Text = resources.AutomatedTranslation; + ckInteractive.Text = resources.Interactive; + ckTranslationMemory.Text = resources.TranslationMemory; + groupSystem.Text = resources.System; + ckPropagated.Text = resources.Propagated; + ckSystemTranslationMemory.Text = resources.SystemTranslationMemory; + ckSystemMachineTranslation.Text = resources.SystemMachineTranslation; + groupDocumentStructure.Text = resources.DocumentStructure; + btnGenerateDSI.Text = resources.GenerateDSI; + labelGenerateDSIComments.Text = resources.GenerateDSIComments; + colPath.HeaderText = resources.FileLocation; + colName.HeaderText = resources.Name; + colSize.HeaderText = resources.Size; + colDate.HeaderText = resources.Date; + groupOptions.Text = resources.Options; + ckSearchInTags.Text = resources.SearchInTags; + ckSearchRegEx.Text = resources.SearchRegEx; + ckSearchMatchWholeWord.Text = resources.SearchMatchWholeWord; + ckSearchMatchCase.Text = resources.SearchMatchCase; + groupSearch.Text = resources.Search; + labelSearchTarget.Text = resources.SearchTarget; + labelSearchSource.Text = resources.SearchSource; + btnFindAll.Text = resources.FindAll; + btnReverseSelection.Text = resources.ReverseSelection; + + var selIndex = cmbOperator.SelectedIndex; + + cmbOperator.Items.Clear(); + cmbOperator.Items.Add(resources.OR); + cmbOperator.Items.Add(resources.AND); + cmbOperator.SelectedIndex = selIndex == -1 ? 0 : selIndex; + + groupClear.Text = resources.Clear; + btnClearit.Text = resources.Clearit; + lblClearit.Text = resources.ClearitDescription; + } + + private void FindInFiles(bool doOR, List filesToBeSliced = null) + { + var files = filesToBeSliced ?? (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); + if (_searchResults != null) + _searchResults.Clear(); + StepProcess("Looking in source segments ..."); + var settings = new SearchSettings() + { + SearchText = txtSourceSearch.Text, + ReplaceText = txtSourceSearch.Text, + SearchInSource = true, + SearchInTarget = false, + MatchCase = ckSearchMatchCase.Checked, + MatchWholeWord = ckSearchMatchWholeWord.Checked, + UseRegex = ckSearchRegEx.Checked, + SearchInTag = ckSearchInTags.Checked, + SearchInLocked = true, + NotSearchStatus = new List(), + LockSegment = ckChangeToLocked.Checked, + UnlockContent = ckChangeToUnlocked.Checked + }; + if (GetTranslationStatus() != null) + { + settings.NewStatus = GetTranslationStatus().Value; + settings.UpdateStatus = _doUpdateStatus; + } + else + { + settings.UpdateStatus = false; + } + SearchSettings sourceSettings = null; + if (!string.IsNullOrEmpty(settings.SearchText)) + { + sourceSettings = settings; + var analyzer = new FilesAnalyzer(files); + analyzer.SearchInFiles(settings); + _searchResults = analyzer.FileResults; + } + var searchInTarget = !string.IsNullOrEmpty(txtTargetSearch.Text); + SearchSettings targetSettings = null; + if (searchInTarget) + { + StepProcess("Looking in target segments ..."); + settings.SearchText = txtTargetSearch.Text; + settings.ReplaceText = txtTargetSearch.Text; + settings.SearchInSource = false; + settings.SearchInTarget = true; + + targetSettings = settings; + + var analyzer = new FilesAnalyzer(files); + analyzer.SearchInFiles(settings); + var targetResult = analyzer.FileResults; + + if (_searchResults == null || _searchResults.Count == 0) + _searchResults = targetResult; + else + { + StepProcess("Merging source and target segments ..."); + var fileDataToBeAdded = new List(); + var fileDataToBeRemoved = new List(); + foreach (var fileData in _searchResults) + { + var file = fileData.FilePath; + var targetFileData = targetResult.FirstOrDefault(data => data.FilePath == file); + if (targetFileData != null) + { + //create new FileData containing source result search from source and target result search from target + var fileToBeAdded = doOR + ? UnionSourceAndTarget(fileData, targetFileData, file) + : IntersectSourceAndTarget(fileData, targetFileData, file); + if (fileToBeAdded != null) + fileDataToBeAdded.Add(fileToBeAdded); + fileDataToBeRemoved.Add(fileData); + } + } + + var lenghtOfFilesToBeAdded = fileDataToBeAdded.Count; + for (var i = 0; i < fileDataToBeRemoved.Count; i++) + { + _searchResults.Remove(fileDataToBeRemoved[i]); + if (i < lenghtOfFilesToBeAdded) + _searchResults.Insert(i, fileDataToBeAdded[i]); + } + } + } + PostProcessSearchResult(_searchResults, sourceSettings, targetSettings); + + if (_doUpdateStatus) + { + UpdateFileBasedOnResults(_searchResults); + _doUpdateStatus = false; + FindInFiles(doOR); + PostProcessSearchResult(_searchResults, sourceSettings, targetSettings); + } + else + BindSearchResults(); + } + + private void FindInFilesForReplace(SearchSettings sourceSettings = null, SearchSettings targeSettings = null) + { + var files = + (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); + if (_replaceResults != null) + _replaceResults.Clear(); + StepProcess("Processing source segments ..."); + + if (sourceSettings != null && !String.IsNullOrEmpty(sourceSettings.SearchText)) + { + var analyzer = new FilesAnalyzer(files); + analyzer.SearchInFiles(sourceSettings); + _replaceResults = analyzer.FileResults; + } + var searchInTarget = false; + searchInTarget = targeSettings != null && !String.IsNullOrEmpty(targeSettings.SearchText); + if (searchInTarget) + { + StepProcess("Processing target segments ..."); + var analyzer = new FilesAnalyzer(files); + analyzer.SearchInFiles(targeSettings); + var targetResult = analyzer.FileResults; + + if (_replaceResults == null || _replaceResults.Count == 0) + _replaceResults = targetResult; + else + { + var fileDataToBeAdded = new List(); + var fileDataToBeRemoved = new List(); + foreach (var fileData in _replaceResults) + { + var file = fileData.FilePath; + var targetFileData = targetResult.FirstOrDefault(data => data.FilePath == file); + if (targetFileData != null) + { + //create new FileData containing source result search from source and target result search from target + var fileToBeAdded = UnionSourceAndTarget(fileData, targetFileData, file); + if (fileToBeAdded != null) + fileDataToBeAdded.Add(fileToBeAdded); + fileDataToBeRemoved.Add(fileData); + } + } + + var lenghtOfFilesToBeAdded = fileDataToBeAdded.Count; + for (var i = 0; i < fileDataToBeRemoved.Count; i++) + { + _replaceResults.Remove(fileDataToBeRemoved[i]); + if (i < lenghtOfFilesToBeAdded) + _replaceResults.Insert(i, fileDataToBeAdded[i]); + } + } + } + + PostProcessSearchResult(_replaceResults, sourceSettings, targeSettings); + } + + private List> GetAllAvailableLanguages() + { + var assembly = Assembly.GetExecutingAssembly(); + var dir = Path.GetDirectoryName(assembly.Location); + if (string.IsNullOrEmpty(dir)) + return new List>(); + var languageFiles = Directory.GetFiles(dir, "*.resx"); + + var cultures = new List>(); + foreach (var languageFile in languageFiles) + { + var langs = languageFile.Split('.'); + var cultureID = langs[langs.Count() - 2]; + var cultureName = new CultureInfo(cultureID).NativeName.Split(' ')[0]; + cultures.Add(new KeyValuePair(cultureID, cultureName)); + } + return cultures; + } + + private IEnumerable GetPhisicalFilesPathFromProjectFile(string projectFile) + { + var sourceCulture = GetProjectSourceLanguageCode(projectFile) + "\\"; + var phisicalFilesPath = new List(); + try + { + var projectsFile = new XPathDocument(projectFile); + var nav = projectsFile.CreateNavigator(); + const string expression = "//FileVersion"; + var fileVersions = nav.Select(expression); + while (fileVersions.MoveNext()) + { + var filePath = fileVersions.Current.SelectSingleNode("@PhysicalPath"); + if (filePath != null) + { + var fileName = filePath.Value; + if (fileName.IndexOf(".sdlxliff", StringComparison.Ordinal) != -1 && + !phisicalFilesPath.Contains(fileName) && !fileName.Contains(sourceCulture)) + phisicalFilesPath.Add(fileName); + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + return phisicalFilesPath; + } + + private string GetProjectPath() + { + var projectsController = GetProjectController(); + if (projectsController?.CurrentProject != null) + { + var currentProject = projectsController.CurrentProject; + var projectPath = Path.GetDirectoryName(currentProject.FilePath); + return projectPath; + } + + return $@"{Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)}\{GetStudioVersion()}\Projects"; + } + + private string GetProjectSourceLanguageCode(string projectPath) + { + var document = new XmlDocument(); + document.PreserveWhitespace = true; + document.Load(projectPath); + var selectSingleNode = document.SelectSingleNode("//SourceLanguageCode"); + if (selectSingleNode != null) + return selectSingleNode.InnerText; + + return string.Empty; + } + + private string GetStudioVersion() + { + var studioVersionService = new StudioVersionService(); + var studioVersion = studioVersionService.GetStudioVersion(); + + if (studioVersion != null && studioVersion.Version.Equals("Studio16")) + { + return studioVersion.StudioDocumentsFolderName; + } + return string.Empty; + } + + private ConfirmationLevel? GetTranslationStatus() + { + if (!GroupHasCheckedRadioButtons(groupChangeTranslationStatus)) return null; + return ckChangeToNotTranslated.Checked ? ConfirmationLevel.Unspecified : ckChangeToDraft.Checked + ? ConfirmationLevel.Draft : ckChangeToTranslated.Checked + ? ConfirmationLevel.Translated : ckChangeToTranslationRejected.Checked + ? ConfirmationLevel.RejectedTranslation : ckChangeToTranslationApproved.Checked + ? ConfirmationLevel.ApprovedTranslation : ckChangeToSignOffRejected.Checked + ? ConfirmationLevel.RejectedSignOff : ckChangeToSignedOff.Checked + ? ConfirmationLevel.ApprovedSignOff : ConfirmationLevel.Unspecified; + } + + private void gridReplaceResults_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) + { + try + { + if (_replaceDataManager.DetailFilteredData != null && _replaceDataManager.DetailFilteredData.Count > 0) + { + ((DataGridView)sender).Rows[e.RowIndex].MinimumHeight = 0x38; + if (e.ColumnIndex == 0) + { + e.Value = _replaceDataManager.DetailFilteredData[e.RowIndex].SegID; + } + else if (e.ColumnIndex == 1) + { + e.Value = (new UIResources(Settings.GetSavedCulture())).GetString(_replaceDataManager.DetailFilteredData[e.RowIndex].SegStatus); + } + else if (e.ColumnIndex == 2) + { + e.Value = _replaceDataManager.DetailFilteredData[e.RowIndex]; + } + else + { + e.Value = $"{Path.GetFileName(Path.GetDirectoryName(_replaceDataManager.DetailFilteredData[e.RowIndex].FileName))}{Path.GetFileName(_replaceDataManager.DetailFilteredData[e.RowIndex].FileName)}"; + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + + private void gridReplaceResults_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) + { + if (((DataGridView)sender).ColumnCount > 3) + { + for (var i = 4; i < ((DataGridView)sender).ColumnCount; i++) + { + ((DataGridView)sender).Columns[i].Visible = false; + } + ((DataGridView)sender).Columns[1].Width = 80; + ((DataGridView)sender).Columns[2].Width = ((DataGridView)sender).Width - + ((DataGridView)sender).Columns[1].Width - + ((DataGridView)sender).Columns[0].Width - 55; + } + } + + private void gridSearchResults_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) + { + try + { + if (_searchDataManager?.DetailFilteredData != null && _searchDataManager?.DetailFilteredData.Count > 0) + { + ((DataGridView)sender).Rows[e.RowIndex].MinimumHeight = 0x38; + if (e.ColumnIndex == 0) + { + e.Value = _searchDataManager.DetailFilteredData[e.RowIndex].SegID; + } + else if (e.ColumnIndex == 1) + { + e.Value = + (new UIResources(Settings.GetSavedCulture())).GetString( + _searchDataManager.DetailFilteredData[e.RowIndex].SegStatus); + } + else if (e.ColumnIndex == 2) + { + e.Value = _searchDataManager.DetailFilteredData[e.RowIndex]; + } + else + { + e.Value = $"{Path.GetFileName(Path.GetDirectoryName(_searchDataManager.DetailFilteredData[e.RowIndex].FileName))}{Path.GetFileName(_searchDataManager.DetailFilteredData[e.RowIndex].FileName)}"; + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + + private void gridSearchResults_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) + { + if (((DataGridView)sender).ColumnCount > 3) + { + for (var i = 4; i < ((DataGridView)sender).ColumnCount; i++) + { + ((DataGridView)sender).Columns[i].Visible = false; + } + ((DataGridView)sender).Columns[1].Width = 80; + ((DataGridView)sender).Columns[2].Width = ((DataGridView)sender).Width - + ((DataGridView)sender).Columns[1].Width - + ((DataGridView)sender).Columns[0].Width - 55; + } + } + + private void gridXLIFFFiles_DragDrop(object sender, DragEventArgs e) + { + var data = (string[])e.Data.GetData(DataFormats.FileDrop, false); + var dsFiles = new XLIFFFiles(); + var projectFiles = data.Where(file => file.Contains(".sdlproj")); + foreach (var projectFile in projectFiles) + { + var phisicalFilesPath = GetPhisicalFilesPathFromProjectFile(projectFile); + + foreach (var file in phisicalFilesPath) + { + var fileRow = dsFiles.Files.NewFilesRow(); + fileRow.Path = String.Format("{0}\\{1}", Path.GetDirectoryName(projectFile), file); + fileRow.Name = file; + fileRow.Size = + ((decimal)(new FileInfo(fileRow.Path)).Length / 1000).ToString(CultureInfo.InvariantCulture); + fileRow.Date = (new FileInfo(fileRow.Path)).CreationTime.ToString(CultureInfo.InvariantCulture); + dsFiles.Files.AddFilesRow(fileRow); + } + } + + var xliffFiles = data.Where(file => file.Contains(".sdlxliff")); + foreach (var xliffFile in xliffFiles) + { + var fileRow = dsFiles.Files.NewFilesRow(); + fileRow.Path = xliffFile; + fileRow.Name = Path.GetFileName(xliffFile); + fileRow.Size = ((decimal)(new FileInfo(xliffFile)).Length / 1000).ToString(CultureInfo.InvariantCulture); + fileRow.Date = (new FileInfo(xliffFile)).CreationTime.ToString(CultureInfo.InvariantCulture); + dsFiles.Files.AddFilesRow(fileRow); + } + BindFilesGrid(dsFiles); + } + + private void gridXLIFFFiles_DragEnter(object sender, DragEventArgs e) + { + e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; + } + + private void gridXLIFFFiles_SelectionChanged(object sender, EventArgs e) + { + listDocumentStructure.Items.Clear(); + } + + private bool GroupHasCheckedCheckBoxes(GroupBox groupBox) + { + var checkBoxes = groupBox.Controls.OfType(); + foreach (var checkBox in checkBoxes) + { + if (checkBox.Checked) + return true; + } + + return false; + } + + private bool GroupHasCheckedRadioButtons(GroupBox groupBox) + { + var checkBoxes = groupBox.Controls.OfType(); + foreach (var checkBox in checkBoxes) + { + if (checkBox.Checked) + return true; + } + + return false; + } + + private void HideProcess() + { + _setFormSizeChanged = false; + if (tabControl1.SelectedIndex == 2) + { + panelCommands.Visible = false; + } + else + { + panelCommands.Visible = true; + } + + panelStatus.Visible = false; + _setFormSizeChanged = true; + } + + private FileData IntersectSourceAndTarget(FileData fileData, FileData targetFileData, string filePath) + { + //add all non existing segmens from target (sourceSearchResult) into source + var sourceSegments = RemoveNotExistingSegments(fileData.SearchSourceResults.Values.ToList(), + targetFileData.SearchSourceResults.Values + .ToList()); + + //add all non existing segmens from source (targetSearchResult) into target + var targetSegments = + RemoveNotExistingSegments(targetFileData.SearchTargetResults.Values.ToList(), + fileData.SearchTargetResults.Values.ToList()); + + targetSegments = UpdateSIDsInTargetSegments(sourceSegments, targetSegments); + var fileToBeAdded = new FileData(filePath, + sourceSegments.OrderBy(seg => seg.SegmentId).ToList(), + targetSegments.OrderBy(seg => seg.SegmentId).ToList()); + return fileToBeAdded; + } + + private void PostProcessSearchResult(IEnumerable results, SearchSettings sourceSettings = null, SearchSettings targetSettings = null) + { + StepProcess("Post processing search result ..."); + + if (results is null || !results.Any()) return; + + foreach (var fileData in results) + { + StepProcess("Post processing search result for file: " + Path.GetFileName(fileData.FilePath) + " ..."); + if (sourceSettings != null && sourceSettings.SearchInTag && fileData.SearchSourceResults.Any(ssr => ssr.Value.Tags.Count > 0)) + { + var sResults = fileData.SearchSourceResults.Where(ssr => ssr.Value.Tags.Count > 0); + foreach (var sResult in sResults) + { + for (var i = 0; i < sResult.Value.Tags.Count; i++) + { + var tag = sResult.Value.Tags[i]; + if (tag.TagText.StartsWith("(); + sResult.Value.SearchResults.Add(new IndexData(tag.TagPosition, nextTag.TagPosition - tag.TagPosition)); + } + } + } + + if (sourceSettings != null && sourceSettings.UseRegex && + fileData.SearchSourceResults.Any(sr => sr.Value.MatchesCount > 0)) + { + StepProcess("Post processing source result ..."); + var sResults = fileData.SearchSourceResults.Where(sr => sr.Value.MatchesCount > 0); + foreach (var sResult in sResults) + { + var sResultText = sResult.Value.SegmentText; + var searchResultsToRemove = new List(); + foreach (var searchResult in sResult.Value.SearchResults) + { + if (!Regex.IsMatch(sResultText, sourceSettings.SearchText, !sourceSettings.MatchCase ? RegexOptions.IgnoreCase : RegexOptions.None)) + { + searchResultsToRemove.Add(searchResult); + } + } + + foreach (var indexData in searchResultsToRemove) + { + sResult.Value.SearchResults.Remove(indexData); + } + } + } + + if (targetSettings != null && targetSettings.SearchInTag && fileData.SearchTargetResults.Any(ssr => ssr.Value.Tags.Count > 0)) + { + var sResults = fileData.SearchTargetResults.Where(ssr => ssr.Value.Tags.Count > 0); + foreach (var sResult in sResults) + { + for (var i = 0; i < sResult.Value.Tags.Count; i++) + { + var tag = sResult.Value.Tags[i]; + if (tag.TagText.StartsWith("(); + sResult.Value.SearchResults.Add(new IndexData(tag.TagPosition, nextTag.TagPosition - tag.TagPosition)); + } + } + } + + if (targetSettings != null && targetSettings.UseRegex && + fileData.SearchTargetResults.Any(sr => sr.Value.MatchesCount > 0)) + { + StepProcess("Post processing target result ..."); + var sResults = fileData.SearchTargetResults.Where(sr => sr.Value.MatchesCount > 0); + foreach (var sResult in sResults) + { + var tResultText = sResult.Value.SegmentText; + var searchResultsToRemove = new List(); + foreach (var searchResult in sResult.Value.SearchResults) + { + if (!Regex.IsMatch(tResultText, targetSettings.SearchText, !targetSettings.MatchCase ? RegexOptions.IgnoreCase : RegexOptions.None)) + { + searchResultsToRemove.Add(searchResult); + } + } + + foreach (var indexData in searchResultsToRemove) + { + sResult.Value.SearchResults.Remove(indexData); + } + } + } + } + StepProcess("Post processing completed."); + } + + private void ProcessFileBasedOnStatuses(IEnumerable indexes, bool forSlice = false, Dictionary filesToBeSliced = null) + { + var files = filesToBeSliced != null ? filesToBeSliced.Values.ToList() : (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); + var threads = new List(); + foreach (var file in files) + { + var t = new Thread(() => ProcessOneFileBasedOnStatuses(forSlice, file, indexes, filesToBeSliced)); + t.Start(); + threads.Add(t); + } + foreach (var thread in threads) + { + thread.Join(); + } + } + + private void ProcessOneFileBasedOnStatuses(bool forSlice, string file, IEnumerable DSSelectedIndexes, Dictionary filesToBeSliced) + { + StepProcess("Processing file: " + Path.GetFileName(file) + ". ", false); + var xDoc = new XmlDocument(); + xDoc.PreserveWhitespace = true; + + if (!string.IsNullOrEmpty(file)) + { + xDoc.Load(file); + } + var xmlEncoding = "utf-8"; + try + { + if (xDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) + { + // Get the encoding declaration. + var decl = (XmlDeclaration)xDoc.FirstChild; + xmlEncoding = decl.Encoding; + } + + var originalFile = file; + if (filesToBeSliced != null) + { + originalFile = filesToBeSliced.FirstOrDefault(f => f.Value == file).Key; + if (string.IsNullOrEmpty(originalFile)) + originalFile = file; + } + + var fileList = xDoc.DocumentElement?.GetElementsByTagName("file"); + if (fileList != null) + { + foreach (var fileElement in fileList.OfType()) + { + var bodyElement = (XmlElement)(fileElement.GetElementsByTagName("body")[0]); + var groupElements = bodyElement.GetElementsByTagName("group"); + foreach (var groupElement in groupElements.OfType()) + { + ProcessOnFileBasedOnStatusesInBody(forSlice, file, DSSelectedIndexes, originalFile, groupElement); + } + ProcessOnFileBasedOnStatusesInBody(forSlice, file, DSSelectedIndexes, originalFile, bodyElement); + } + } + + if (!forSlice) + { + Encoding encoding = new UTF8Encoding(); + if (!string.IsNullOrEmpty(xmlEncoding)) + encoding = Encoding.GetEncoding(xmlEncoding); + using (var writer = new XmlTextWriter(file, encoding)) + { + xDoc.Save(writer); + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + + private void ProcessOnFileBasedOnStatusesInBody(bool forSlice, string file, IEnumerable DSSelectedIndexes, string originalFile, object groupElement) + { + try + { + var doUpdateElement = false; + //look in cxts + if (DSSelectedIndexes.Any()) + { + var selectedIDs = new List(); + foreach (var index in DSSelectedIndexes) + { + if (_structureInformationTypes[index].IDs.Any(f => f.Key == originalFile)) + { + var fileIDs = _structureInformationTypes[index].IDs.FirstOrDefault(f => f.Key == originalFile); + selectedIDs.AddRange(fileIDs.Value); + } + } + var cxtDefs = ((XmlNode)groupElement).ChildNodes; + foreach (var cxtDef in cxtDefs.OfType()) + { + if (cxtDef.Name != "sdl:cxts") + continue; + + var cxts = cxtDef.ChildNodes; + foreach (var cxt in cxts.OfType()) + { + if (cxt.Name != "sdl:cxt") + continue; + + var id = cxt.Attributes["id"].Value; + if (selectedIDs.Contains(id)) + { + doUpdateElement = true; + break; + } + } + if (doUpdateElement) + break; + } + } + else + doUpdateElement = true; + + //if structure type not in the slected ones ... go to the next element + if (!doUpdateElement) + return; + + //look in segments + var transUnits = ((XmlElement)groupElement).ChildNodes; ; + foreach (var transUnit in transUnits.OfType()) + { + if ((transUnit).Name != "trans-unit") + continue; + + var transUnitID = (transUnit).Attributes["id"].Value; + + var segDefs = (transUnit).ChildNodes; + foreach (var segDef in segDefs.OfType()) + { + if ((segDef).Name != "sdl:seg-defs") + continue; + + var segments = (segDef).ChildNodes; + + #region segments + + foreach (var segment in segments.OfType()) + { + if (segment.Name != "sdl:seg") + continue; + + var segmentId = (segment).Attributes["id"].Value; + doUpdateElement = true; + try + { + //look in tranlsation statuses + if (GroupHasCheckedCheckBoxes(groupStatusesTranslationStatus)) + doUpdateElement = UpdateManager.DoUpdateElementBasedOnTranslatioStatus(segment); + + //look if locked / unlocked + if (GroupHasCheckedCheckBoxes(groupStatusesLocked)) + doUpdateElement = UpdateManager.DoUpdateElementBasedOnLockedInformation(segment); + //look in score + if (GroupHasCheckedCheckBoxes(groupScore)) + doUpdateElement = UpdateManager.DoUpdateElementBasedOnScoreInformation(segment); + //look in translation origin + if (GroupHasCheckedCheckBoxes(groupTranslationOrigin)) + doUpdateElement = UpdateManager.DoUpdateElementBasedOnTranslationOriginInformation(segment); + //look in system + if (GroupHasCheckedCheckBoxes(groupSystem)) + doUpdateElement = UpdateManager.DoUpdateElementBasedOnSystemInformation(segment); + + if (doUpdateElement) + { + if (forSlice && !string.IsNullOrEmpty(transUnitID) && !string.IsNullOrEmpty(segmentId)) + { + var fileSliceInfo = _segmentsToBeSliced.FirstOrDefault(slice => slice.File == file); + if (fileSliceInfo == null) + { + _segmentsToBeSliced.Add(new SliceInfo + { + File = file, + Segments = new List>> + {new KeyValuePair>(transUnitID, new List {segmentId})} + }); + } + else + { + if (fileSliceInfo.Segments.All(s => s.Key != transUnitID)) + fileSliceInfo.Segments.Add(new KeyValuePair>(transUnitID, new List { segmentId })); + else + { + var segSliceInfo = fileSliceInfo.Segments.FirstOrDefault(s => s.Key == transUnitID); + if (!segSliceInfo.Value.Contains(segmentId)) + segSliceInfo.Value.Add(segmentId); + } + } + } + else + { + //update the element + if (ckChangeToUnlocked.Checked && segment.HasAttribute("locked")) + (segment).RemoveAttribute("locked"); + if (ckChangeToLocked.Checked) + (segment).SetAttribute("locked", "true"); + + if (GetTranslationStatus() != null) + { + var translationStatus = GetTranslationStatus().Value.ToString(); + if (string.IsNullOrEmpty(translationStatus)) + { + if ((segment).HasAttribute("conf")) + (segment).RemoveAttribute("conf"); + } + else + { + (segment).SetAttribute("conf", translationStatus); + } + } + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + + #endregion segments + + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + + private List RemoveNotExistingSegments(List sourceSegments, + List targetSegments) + { + var segmentsToBeRemoved = new List(); + foreach (var sourceSegment in sourceSegments) + { + if (targetSegments.Any(segment => segment.SegmentId == sourceSegment.SegmentId)) + continue; + segmentsToBeRemoved.Add(sourceSegment); + } + foreach (var segmentData in segmentsToBeRemoved) + sourceSegments.Remove(segmentData); + + return sourceSegments; + } + + private void ReplaceInResultsForReplacePreview() + { + var fileDataToBeAdded = new List(); + var fileDataToBeRemoved = new List(); + + if (_replaceResults is null || !_replaceResults.Any()) return; + + foreach (var fileData in _replaceResults) + { + StepProcess("Preparing replace information for file:" + Path.GetFileName(fileData.FilePath) + " ..."); + var sourceSegments = new List(); + var targetSegments = new List(); + foreach (var sourceSegment in fileData.SearchSourceResults) + { + var newText = ReplaceSegmentTextForPreview(sourceSegment.Value.SegmentText, + txtReplaceSourceSearch.Text, + txtReplaceSourceReplace.Text); + var sData = new SegmentData(sourceSegment.Value.Sid, sourceSegment.Value.SegmentId, + newText, + sourceSegment.Value.SegmentStatus, + sourceSegment.Value.SegmentContent) + { + Tags = sourceSegment.Value.Tags, + SearchResults = sourceSegment.Value.SearchResults, + }; + if (sData.SearchResults != null && sData.SearchResults.Count > 0) + { + var lenDif = (newText.Length - sourceSegment.Value.SegmentText.Length) / sData.SearchResults.Count; + + for (var index = 0; index < sData.SearchResults.Count; index++) + { + var searchResult = sData.SearchResults[index]; + searchResult.Length += lenDif; + searchResult.IndexStart += (index * lenDif); + } + } + sourceSegments.Add(sData); + } + foreach (var targetSegment in fileData.SearchTargetResults) + { + var newText = ReplaceSegmentTextForPreview(targetSegment.Value.SegmentText, + txtReplaceTargetSearch.Text, + txtReplaceTargetReplace.Text); + var sData = new SegmentData(targetSegment.Value.Sid, targetSegment.Value.SegmentId, + newText, targetSegment.Value.SegmentStatus, + targetSegment.Value.SegmentContent) + { + Tags = targetSegment.Value.Tags, + SearchResults = targetSegment.Value.SearchResults + }; + if (sData.SearchResults != null && sData.SearchResults.Count > 0) + { + var lenDif = (newText.Length - targetSegment.Value.SegmentText.Length) / sData.SearchResults.Count; + + for (var index = 0; index < sData.SearchResults.Count; index++) + { + var searchResult = sData.SearchResults[index]; + searchResult.Length += lenDif; + searchResult.IndexStart += (index * lenDif); + } + } + targetSegments.Add(sData); + } + var fileToBeAdded = new FileData(fileData.FilePath, + sourceSegments.OrderBy(seg => seg.SegmentId).ToList(), + targetSegments.OrderBy(seg => seg.SegmentId).ToList()); + + fileDataToBeAdded.Add(fileToBeAdded); + fileDataToBeRemoved.Add(fileData); + StepProcess("File:" + Path.GetFileName(fileData.FilePath) + " ready."); + } + + StepProcess("Preparing the view ..."); + var lenghtOfFilesToBeAdded = fileDataToBeAdded.Count; + for (var i = 0; i < fileDataToBeRemoved.Count; i++) + { + _replaceResults.Remove(fileDataToBeRemoved[i]); + if (i < lenghtOfFilesToBeAdded) + _replaceResults.Insert(i, fileDataToBeAdded[i]); + } + } + + private string ReplaceSegmentTextForPreview(string segmentText, string pattern, string replaceString) + { + var text = segmentText; + if (ckReplaceUseRegEx.Checked) + { + var options = RegexOptions.None; + if (!ckReplaceMatchCase.Checked) + options = RegexOptions.IgnoreCase; + return Regex.Replace(text, pattern, replaceString, options); + } + + var remove = Regex.Escape(pattern); + var replacePattern = ckReplaceMatchWholeWord.Checked + ? string.Format(@"(\b(?>>(); + foreach (var sliceInfo in _segmentsToBeSliced) + { + var destinationDirectory = Path.Combine(tempFolderForSlicedFiles, Path.GetFileName(Path.GetDirectoryName(sliceInfo.File))); + if (!Directory.Exists(destinationDirectory)) + Directory.CreateDirectory(destinationDirectory); + var destinationFile = Path.Combine(destinationDirectory, Path.GetFileName(sliceInfo.File)); + File.Copy(sliceInfo.File, destinationFile, true); + + var language = string.Empty; + try + { + language = Path.GetFileName(Path.GetDirectoryName(sliceInfo.File)); + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + if (filesPerLanguage.Any(f => f.Key == language)) + { + var languageItem = filesPerLanguage.FirstOrDefault(f => f.Key == language); + if (!languageItem.Value.Contains(destinationFile)) + languageItem.Value.Add(destinationFile); + } + else + filesPerLanguage.Add(new KeyValuePair>(language, new List { destinationFile })); + + SliceManager.SliceFile(destinationFile, sliceInfo); + } + + if (doMerge) + { + StepProcess("Merging sliced files ...", false); + SliceManager.MergeSplitFiles(filesPerLanguage); + } + else + { + CopyFilesFromTempFolder(filesPerLanguage); + } + Directory.Delete(tempFolderForSlicedFiles, true); + } + + private Dictionary SplitMergedXliffFile(string filePath, string folder) + { + var splitedFiles = new Dictionary(); + var xDoc = new XmlDocument(); + xDoc.PreserveWhitespace = true; + xDoc.Load(filePath); + var docInfoText = string.Empty; + var docInfos = xDoc.DocumentElement.GetElementsByTagName("doc-info"); + if (docInfos.Count > 0) + { + foreach (var docInfo in docInfos.OfType()) + { + docInfoText += docInfo.OuterXml; + } + } + var fileList = xDoc.DocumentElement.GetElementsByTagName("file"); + + var xliffBeginText = @""; + var xliffEndText = @""; + + if (!Directory.Exists(folder)) + Directory.CreateDirectory(folder); + + var fileNameTemplate = Path.Combine(folder, string.Format("{0}{1}.{2}", Path.GetFileNameWithoutExtension(filePath), "_{0}", Path.GetExtension(filePath))); + foreach (var file in fileList.OfType()) + { + var fileText = file.OuterXml; + var fileName = string.Format(fileNameTemplate, Guid.NewGuid().ToString()); + using (var sw = new StreamWriter(fileName, false)) + { + sw.Write(xliffBeginText); + sw.Write(docInfoText); + sw.Write(fileText); + sw.Write(xliffEndText); + } + splitedFiles.Add(filePath, fileName); + } + fileList = null; + xDoc = null; + return splitedFiles; + } + + private Dictionary SplitMergedXliffFiles() + { + var files = (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); + var splitedFiles = new Dictionary(); + var folder = Path.Combine(_folderForSlicedFiles, Guid.NewGuid().ToString()); + foreach (var file in files) + { + var result = SplitMergedXliffFile(file, folder); + foreach (var key in result.Keys) splitedFiles.Add(key, result[key]); + } + + return splitedFiles; + } + + private void StartFind(bool updateStatus, bool doOR) + { + _doUpdateStatus = updateStatus; + FindInFiles(doOR); + } + + private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) + { + _setFormSizeChanged = false; + groupSlice.Enabled = groupChange.Enabled = groupClear.Enabled = tabControl1.SelectedIndex != 2; + if (tabControl1.SelectedIndex == 1) + BindSearchResults(); + if (tabControl1.SelectedIndex == 2) + { + panelCommands.Visible = false; + BindReplaceResults(); + } + else + { + panelCommands.Visible = true; + } + _setFormSizeChanged = true; + + if (tabControl1.SelectedIndex == 1) + { + var resources = new UIResources(Settings.GetSavedCulture()); + var selIndex = cmbOperator.SelectedIndex; + cmbOperator.Items.Clear(); + cmbOperator.Items.Add(resources.OR); + cmbOperator.Items.Add(resources.AND); + cmbOperator.SelectedIndex = selIndex == -1 ? 0 : selIndex; + } + } + private void toolStripButton1_Click(object sender, EventArgs e) + { + if (gridXLIFFFiles.DataSource != null) + { + var dsFiles = (XLIFFFiles)((XLIFFFiles)gridXLIFFFiles.DataSource).Copy(); + var files = + (from DataGridViewRow row in gridXLIFFFiles.SelectedRows select row.Cells[0].Value.ToString()).ToList(); + + var rowsToBeRemoved = new List(); + foreach (var fileRow in dsFiles.Files) + { + if (files.Contains(fileRow.Path)) + rowsToBeRemoved.Add(fileRow); + } + + foreach (var filesRow in rowsToBeRemoved) + dsFiles.Files.RemoveFilesRow(filesRow); + + BindFilesGrid(dsFiles); + } + } + + private void txtReplaceSourceSearch_Validating(object sender, System.ComponentModel.CancelEventArgs e) + { + var pattern = txtReplaceSourceSearch.Text; + try + { + new Regex(pattern); + _errorProvider.SetError(txtReplaceSourceSearch, ""); + } + catch + { + _errorProvider.SetError(txtReplaceSourceSearch, "Invalid regular expression"); + } + } + + private void txtReplaceTargetSearch_Validating(object sender, System.ComponentModel.CancelEventArgs e) + { + var pattern = txtReplaceTargetSearch.Text; + try + { + new Regex(pattern); + _errorProvider.SetError(txtReplaceTargetSearch, ""); + } + catch + { + _errorProvider.SetError(txtReplaceTargetSearch, "Invalid regular expression"); + } + } + + private FileData UnionSourceAndTarget(FileData fileData, FileData targetFileData, string filePath) + { + //add all non existing segments from target (sourceSearchResult) into source + var sourceSegments = AddNonExistingSegments(fileData.SearchSourceResults.Values.ToList(), targetFileData.SearchSourceResults.Values.ToList()); + + //add all non existing segments from source (targetSearchResult) into target + var targetSegments = AddNonExistingSegments(targetFileData.SearchTargetResults.Values.ToList(), fileData.SearchTargetResults.Values.ToList()); + + var fileToBeAdded = new FileData(filePath, sourceSegments.OrderBy(seg => seg.SegmentId).ToList(), targetSegments.OrderBy(seg => seg.SegmentId).ToList()); + return fileToBeAdded; + } + + private void UpdateFileBasedOnResults(List searchResult) + { + foreach (var fileData in searchResult) + { + StepProcess("Updating file: " + Path.GetFileName(fileData.FilePath) + " ..."); + + if (fileData.SearchSourceResults.Count == 0) + continue; + + var filePath = fileData.FilePath; + var xDoc = new XmlDocument(); + xDoc.PreserveWhitespace = true; + xDoc.Load(filePath); + var xmlEncoding = "utf-8"; + try + { + if (xDoc.FirstChild.NodeType == XmlNodeType.XmlDeclaration) + { + // Get the encoding declaration. + var decl = (XmlDeclaration)xDoc.FirstChild; + xmlEncoding = decl.Encoding; + } + + var fileList = xDoc.DocumentElement.GetElementsByTagName("file"); + foreach (var fileElement in fileList.OfType()) + { + var bodyElement = (XmlElement)(fileElement.GetElementsByTagName("body")[0]); + var groupElements = bodyElement.GetElementsByTagName("group"); + foreach (var groupElement in groupElements.OfType()) + { + UpdateFileBasedOnResultsInBody(groupElement, fileData); + } + + UpdateFileBasedOnResultsInBody(bodyElement, fileData); + } + + Encoding encoding = new UTF8Encoding(); + if (!string.IsNullOrEmpty(xmlEncoding)) + encoding = Encoding.GetEncoding(xmlEncoding); + using (var writer = new XmlTextWriter(filePath, encoding)) + { + xDoc.Save(writer); + } + + StepProcess("File: " + Path.GetFileName(fileData.FilePath) + " was updated."); + } + + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + } + + private void UpdateFileBasedOnResultsInBody(object groupElement, FileData fileData) + { + var elements = ((XmlElement)groupElement).ChildNodes; + foreach (var element in elements.OfType()) + { + try + { + if (!element.HasAttribute("id")) continue; + + var id = element.Attributes["id"].Value; + var segmentData = fileData.SearchSourceResults + .FirstOrDefault(result => result.Value.SegmentContent.ParentParagraphUnit.Properties.ParagraphUnitId.Id == id) + .Value; + if (segmentData != null) + { + var segmentId = segmentData.SegmentId; + var segDefs = element.ChildNodes; + foreach (var segDef in segDefs.OfType()) + { + if (segDef.Name != "sdl:seg-defs") continue; + var segments = segDef.ChildNodes; + foreach (var segment in segments.OfType()) + { + if (segment.Name != "sdl:seg") continue; + + if (Convert.ToInt32(segment.Attributes["id"].Value) == segmentId) + { + if (ckChangeToUnlocked.Checked && segment.HasAttribute("locked")) + segment.RemoveAttribute("locked"); + if (ckChangeToLocked.Checked) + segment.SetAttribute("locked", "true"); + + if (GetTranslationStatus() != null) + { + var translationStatus = GetTranslationStatus().Value.ToString(); + if (string.IsNullOrEmpty(translationStatus)) + { + if (segment.HasAttribute("conf")) + segment.RemoveAttribute("conf"); + } + else + { + segment.SetAttribute("conf", translationStatus); + } + } + } + } + } + } + } + catch (Exception ex) + { + _logger.Error($"{MethodBase.GetCurrentMethod().Name} \n {ex}"); + } + } + } + private void UpdateFocusedTextBox(IEnumerable chars) + { + var str = chars.Cast().Aggregate(string.Empty, (current, c) => current + c.ToString()); + + if (txtSourceSearch.Focused) + { + txtSourceSearch.SelectedText = str; + } + else if (txtTargetSearch.Focused) + { + txtTargetSearch.SelectedText = str; + } + else if (txtReplaceSourceSearch.Focused) + { + txtReplaceSourceSearch.SelectedText = str; + } + else if (txtReplaceSourceReplace.Focused) + { + txtReplaceSourceReplace.SelectedText = str; + } + else if (txtReplaceTargetSearch.Focused) + { + txtReplaceTargetSearch.SelectedText = str; + } + else if (txtReplaceTargetReplace.Focused) + { + txtReplaceTargetReplace.SelectedText = str; + } + } + + private List UpdateSIDsInTargetSegments(List sourceSegments, + List targetSegments) + { + var segments = new List(); + + foreach (var targetSegment in targetSegments) + { + var sourceSegment = + sourceSegments.FirstOrDefault(seg => seg.SegmentId == targetSegment.SegmentId); + if (sourceSegment == null) + throw new InvalidDataException("sourceSegment"); + + var sData = new SegmentData(sourceSegment.Sid, targetSegment.SegmentId, + targetSegment.SegmentText, targetSegment.SegmentStatus, + targetSegment.SegmentContent) + { + Tags = targetSegment.Tags, + SearchResults = targetSegment.SearchResults + }; + + segments.Add(sData); + } + + return segments; + } + } } \ No newline at end of file diff --git a/Toolkit/SDLXLIFFSliceOrChange/SDLXLIFFSliceOrChange.csproj b/Toolkit/SDLXLIFFSliceOrChange/SDLXLIFFSliceOrChange.csproj index a30651b412..7d6bc7747c 100644 --- a/Toolkit/SDLXLIFFSliceOrChange/SDLXLIFFSliceOrChange.csproj +++ b/Toolkit/SDLXLIFFSliceOrChange/SDLXLIFFSliceOrChange.csproj @@ -42,6 +42,7 @@ SdlCommunity.snk $(MSBuildProgramFiles32)\Trados\Trados Studio\Studio18 + latest diff --git a/Toolkit/SdlXliff.Toolkit.Integration/Data/DataSearcher.cs b/Toolkit/SdlXliff.Toolkit.Integration/Data/DataSearcher.cs index 1d7dab80b5..b7dd199485 100644 --- a/Toolkit/SdlXliff.Toolkit.Integration/Data/DataSearcher.cs +++ b/Toolkit/SdlXliff.Toolkit.Integration/Data/DataSearcher.cs @@ -39,7 +39,7 @@ public DataSearcher(SearchSettings settings) /// true - locked /// segment status /// true - process - public bool CheckSegment(bool isLocked, ConfirmationLevel status) + public bool ShouldBeProcessed(bool isLocked, ConfirmationLevel status) { if (_settings != null) { diff --git a/Toolkit/SdlXliff.Toolkit.Integration/File/FileReadProcessor.cs b/Toolkit/SdlXliff.Toolkit.Integration/File/FileReadProcessor.cs index 8e8616ed19..1bb2c79ed3 100644 --- a/Toolkit/SdlXliff.Toolkit.Integration/File/FileReadProcessor.cs +++ b/Toolkit/SdlXliff.Toolkit.Integration/File/FileReadProcessor.cs @@ -58,7 +58,7 @@ public override void ProcessParagraphUnit(IParagraphUnit paragraphUnit) var targetLContent = _dataExtractor.LockedContent; // perform search - if (_searcher.CheckSegment(item.Properties.IsLocked, item.Properties.ConfirmationLevel)) + if (_searcher.ShouldBeProcessed(item.Properties.IsLocked, item.Properties.ConfirmationLevel)) { if (_searchSettings.SearchInSource && (sourceText.Length > 0 || sourceTags.Count > 0)) { diff --git a/Toolkit/SdlXliff.Toolkit.Integration/File/FileReplaceProcessor.cs b/Toolkit/SdlXliff.Toolkit.Integration/File/FileReplaceProcessor.cs index bc107d43eb..d76d309936 100644 --- a/Toolkit/SdlXliff.Toolkit.Integration/File/FileReplaceProcessor.cs +++ b/Toolkit/SdlXliff.Toolkit.Integration/File/FileReplaceProcessor.cs @@ -1,347 +1,31 @@ -using System.Collections.Generic; -using Sdl.Core.Globalization; -using Sdl.FileTypeSupport.Framework.BilingualApi; -using SdlXliff.Toolkit.Integration.Data; -using SdlXliff.Toolkit.Integration.Helpers; +using Sdl.FileTypeSupport.Framework.BilingualApi; +using SDLXLIFFSliceOrChange; +using System.Text.RegularExpressions; namespace SdlXliff.Toolkit.Integration.File { - class FileReplaceProcessor : AbstractBilingualContentProcessor + public class FileReplaceProcessor : AbstractBilingualContentProcessor { - private string _filePath; - private SearchSettings _searchSettings; - private DataExtractor _dataExtractor; - private DataSearcher _searcher; - - private List _resultSrc; - private List _resultTrg; - private List _resultReplace; - private List _resultWarnings; - - private int _lockedCharactersCount = 0; - private int _charactersShift = 0; - - /// - /// list of SegmentData objects - source segment data in one file - /// - public List ResultSource + public FileReplaceProcessor(ReplaceSettings settings) { - get { return _resultSrc; } - set { _resultSrc = value; } - } - /// - /// list of SegmentData objects - search matches data (target) in one file - /// - public List ResultTarget - { - get { return _resultTrg; } - set { _resultTrg = value; } + SegmentVisitor = new SegmentVisitor(settings); + IsSource = settings.SourceSearchText is not null && !string.IsNullOrEmpty(settings.SourceSearchText); } - /// - /// list of SegmentData objects - replacements data in one file - /// - public List ResultOfReplace - { - get { return _resultReplace; } - set { _resultReplace = value; } - } - /// - /// list of WarningData objects - warnings data in one file - /// - public List Warnings - { - get { return _resultWarnings; } - set { _resultWarnings = value; } - } - - public FileReplaceProcessor(string filePath, SearchSettings settings) - { - _filePath = filePath; - _searchSettings = settings; - _dataExtractor = new DataExtractor(); - _searcher = new DataSearcher(_searchSettings); + private bool IsSource { get; set; } - _resultSrc = new List(); - _resultTrg = new List(); - _resultReplace = new List(); - _resultWarnings = new List(); - } - - public override void SetFileProperties(IFileProperties fileInfo) - { - base.SetFileProperties(fileInfo); - } + private SegmentVisitor SegmentVisitor { get; } public override void ProcessParagraphUnit(IParagraphUnit paragraphUnit) { - ISegment sourceSegment; - string sourceText; - - ISegment targetSegment; - string targetText; - List targetLContent; - SegmentData segmentSearch; - - ConfirmationLevel itemStatus; - - if (paragraphUnit.IsStructure) - { - base.ProcessParagraphUnit(paragraphUnit); - return; - } - - foreach (ISegmentPair item in paragraphUnit.SegmentPairs) - { - sourceSegment = item.Source; - targetSegment = item.Target; - itemStatus = item.Properties.ConfirmationLevel; - if (_searcher.CheckSegment(item.Properties.IsLocked, itemStatus)) - { - _dataExtractor.Process(targetSegment); - targetText = _dataExtractor.PlainText.ToString(); - targetLContent = _dataExtractor.LockedContent; - if (targetText.Length > 0) - { - // do search & save found results - _searcher.SearchInSegment(targetText, targetLContent); - - // if matches in target were found - if (SegmentHelper.ContainMatches(_searcher.ResultsInText)) - { - #region extract source text - _dataExtractor.Process(sourceSegment); - sourceText = _dataExtractor.PlainText.ToString(); - #endregion - CollectResults(item.Properties.Id.Id, sourceText, itemStatus, sourceSegment, null, true); - CollectResults(item.Properties.Id.Id, targetText, itemStatus, targetSegment, _searcher.ResultsInText, false); - - segmentSearch = _resultTrg[_resultTrg.Count - 1]; - - ISegment originalSegment = (ISegment)targetSegment.Clone(); - // unlock selections - if (_searchSettings.UnlockContent) - StatusUpdateHelper.UnlockContent(targetSegment, ItemFactory, PropertiesFactory); - - #region REPLACE Logic - int textLoc = 0; - int cnt = 0; - int status = 0; - for (int i = segmentSearch.SearchResults.Count - 1; i >= 0; i--) - { - // add warning - cannot be replaced - if (segmentSearch.SearchResults[i].IsIndexOverlap) - { - status = -4; - _resultWarnings.Add(new WarningData(segmentSearch.Sid, - segmentSearch.SearchResults[i], - WarningData.WarningType.IndexOverlap)); - } - else - { - // DO REPLACE - success - status = PerformReplace(targetSegment, segmentSearch.SearchResults[i], ref textLoc); - #region report warning - fail - if (status != 0) - { - if (status == -1) - _resultWarnings.Add(new WarningData(segmentSearch.Sid, - segmentSearch.SearchResults[i], - WarningData.WarningType.TagFound, - segmentSearch.SearchResults[i].Length + textLoc)); - else if (status == -2) - _resultWarnings.Add(new WarningData(segmentSearch.Sid, - segmentSearch.SearchResults[i], - WarningData.WarningType.ContainLContent, - segmentSearch.SearchResults[i].Length + textLoc)); - else if (status == -3) - _resultWarnings.Add(new WarningData(segmentSearch.Sid, - segmentSearch.SearchResults[i], - WarningData.WarningType.ContainComment, - segmentSearch.SearchResults[i].Length + textLoc)); - else - _resultWarnings.Add(new WarningData(segmentSearch.Sid, - segmentSearch.SearchResults[i], - WarningData.WarningType.Other)); - } - #endregion - } - - if (i == segmentSearch.SearchResults.Count - 1) - { - // collect results - _resultReplace.Add(new SegmentData(_resultReplace.Count, - segmentSearch.SegmentId, - segmentSearch.SegmentText, - segmentSearch.SegmentStatus, - segmentSearch.SegmentContent)); - _resultReplace[_resultReplace.Count - 1].SearchResults = new List(); - } - - // if replace was successful - if (status == 0) - { - _resultReplace[_resultReplace.Count - 1].SearchResults.Add(segmentSearch.SearchResults[i]); - _resultReplace[_resultReplace.Count - 1].SearchResults[cnt++].RealStartIndex = textLoc; - } - } - #endregion - - #region UPDATE STATUSES Logic - // if replace occured - if (_resultReplace[_resultReplace.Count - 1].IndexMatchesCount > 0) - { - // update segment properties - StatusUpdateHelper.UpdateSegmentProperties(item, _searchSettings); - } - else - { - item.Target.Clear(); - originalSegment.MoveAllItemsTo(item.Target); - } - #endregion - } - } - } - } + if (IsSource) + foreach (var segmentPair in paragraphUnit.SegmentPairs) + segmentPair.Source.AcceptVisitor(SegmentVisitor); + else + foreach (var segmentPair in paragraphUnit.SegmentPairs) + segmentPair.Target.AcceptVisitor(SegmentVisitor); base.ProcessParagraphUnit(paragraphUnit); } - - - #region private - private int PerformReplace(ISegment textSegment, IndexData searchData, ref int textIndex) - { - int textIndexStart = searchData.IndexStart; - int textLength = searchData.Length; - textIndex = 0; - _charactersShift = 0; - - // iterator to find IText object the search text is placed in - Location textLocation = new Location(textSegment, true); - - return PerformReplaceIterator(textLocation, textIndexStart, textLength, ref textIndex); - } - private int PerformReplaceIterator(Location textLocation, int textIndexStart, int textLength, ref int textIndex) - { - bool isWarning = false; - _lockedCharactersCount = 0; - TextCharacterCountingIterator iterator = new TextCharacterCountingIterator(textLocation); - do - { - // if (iterator.CharacterCount + iterator.CharactersToNextLocation > textIndexStart) - if (iterator.CharacterCount + iterator.CharactersToNextLocation + _charactersShift > textIndexStart) - { - // text with tags - do not replace, report warning - //if (iterator.CharacterCount + iterator.CharactersToNextLocation < textIndexStart + textLength) - if (iterator.CharacterCount + iterator.CharactersToNextLocation + _charactersShift < textIndexStart + textLength) - { - //textIndex = (iterator.CharacterCount + iterator.CharactersToNextLocation) - (textIndexStart + textLength); - textIndex = (iterator.CharacterCount + iterator.CharactersToNextLocation + _charactersShift) - (textIndexStart + textLength); - isWarning = true; - } - - #region IText - IText text = iterator.CurrentLocation.ItemAtLocation as IText; - if (text != null && !isWarning) - { - // real index in IText - textIndex = textIndexStart - (iterator.CharacterCount + _charactersShift); - - // replace the text of IText - string replacedText = TextReplace(text.Properties.Text, textIndex, textLength); - iterator.CurrentLocation.ItemAtLocation.Parent[iterator.CurrentLocation.ItemAtLocation.IndexInParent] = - ItemFactory.CreateText(PropertiesFactory.CreateTextProperties(replacedText)); - return 0; - } - #endregion - - #region Tags - if (isWarning) - { - IPlaceholderTag phTag = iterator.CurrentLocation.ItemAtLocation as IPlaceholderTag; - ITagPair tagPair = iterator.CurrentLocation.ItemAtLocation as ITagPair; - if (phTag != null || tagPair != null) - return -1; - tagPair = iterator.CurrentLocation.BottomLevel.Parent as ITagPair; - if (iterator.CurrentLocation.BottomLevel.IsAtEndOfParent && tagPair != null) - return -1; - } - #endregion - - #region Comment - if (isWarning) - { - ICommentMarker comment = iterator.CurrentLocation.ItemAtLocation as ICommentMarker; - if (comment != null) - return -3; - comment = iterator.CurrentLocation.BottomLevel.Parent as ICommentMarker; - if (iterator.CurrentLocation.BottomLevel.IsAtEndOfParent && comment != null) - return -3; - } - #endregion - - } - - #region LockedContent - ILockedContent content = iterator.CurrentLocation.ItemAtLocation as ILockedContent; - if (content != null) - { - if (isWarning) - return -2; - // real index in ILockedContent - textIndex = textIndexStart - (iterator.CharacterCount + _charactersShift); - - // call the iterator for Locked Content - Location lockedLocation = new Location((IAbstractMarkupDataContainer)content.Content, true); - int sts = PerformReplaceIterator(lockedLocation, textIndex, textLength, ref textIndex); - - // CODE TO FIX TextCharacterCountingIterator BUG !!! >> - // if TextCharacterCountingIterator failed to get CharactersToNextLocation, - // we calculate it manually and save as _charactersShift - if (iterator.CharactersToNextLocation == 0) - _charactersShift += _lockedCharactersCount; - if (sts != -4) - return sts; - } - content = iterator.CurrentLocation.BottomLevel.Parent as ILockedContent; - if (iterator.CurrentLocation.BottomLevel.IsAtEndOfParent && content != null) - if (isWarning) - return -1; - #endregion - - } while (iterator.MoveNext()); - - _lockedCharactersCount = iterator.CharacterCount; - - return -4; - } - private string TextReplace(string text, int startIndex, int length) - { - return string.Format("{0}{1}{2}", - text.Substring(0, startIndex), - _searchSettings.ReplaceText, - text.Substring(startIndex + length)); - } - - private void CollectResults(string SegmentId, string segmentText, ConfirmationLevel segmentStatus, ISegment segmentContent, - List matches, bool isSource) - { - int sID; - if (int.TryParse(SegmentId, out sID)) - { - if (isSource) - { - _resultSrc.Add(new SegmentData(_resultSrc.Count, sID, segmentText, segmentStatus, segmentContent)); - } - else - { - _resultTrg.Add(new SegmentData(_resultTrg.Count, sID, segmentText, segmentStatus, segmentContent)); - _resultTrg[_resultTrg.Count - 1].SearchResults = matches; - } - } - } - - #endregion } -} +} \ No newline at end of file diff --git a/Toolkit/SdlXliff.Toolkit.Integration/File/FileStatusUpdateProcessor.cs b/Toolkit/SdlXliff.Toolkit.Integration/File/FileStatusUpdateProcessor.cs deleted file mode 100644 index 837369c954..0000000000 --- a/Toolkit/SdlXliff.Toolkit.Integration/File/FileStatusUpdateProcessor.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System.Collections.Generic; -using Sdl.Core.Globalization; -using Sdl.FileTypeSupport.Framework.BilingualApi; -using SdlXliff.Toolkit.Integration.Data; -using SdlXliff.Toolkit.Integration.Helpers; - -namespace SdlXliff.Toolkit.Integration.File -{ - class FileStatusUpdateProcessor : AbstractBilingualContentProcessor - { - private string _filePath; - private DataExtractor _dataExtractor; - private DataSearcher _searcher; - private List _resultSrc; - private List _resultTrg; - - protected SearchSettings _searchSettings; - - /// - /// list of SegmentData objects - search matches data in source in one file - /// - public List ResultInSource - { - get { return _resultSrc; } - } - /// - /// list of SegmentData objects - search matches data in target in one file - /// - public List ResultInTarget - { - get { return _resultTrg; } - } - - public FileStatusUpdateProcessor(string filePath, SearchSettings settings) - { - _filePath = filePath; - _searchSettings = settings; - _dataExtractor = new DataExtractor(); - _searcher = new DataSearcher(_searchSettings); - - _resultSrc = new List(); - _resultTrg = new List(); - } - - public override void SetFileProperties(IFileProperties fileInfo) - { - base.SetFileProperties(fileInfo); - } - - public override void ProcessParagraphUnit(IParagraphUnit paragraphUnit) - { - ISegment sourceSegment; - string sourceText; - List sourceTags; - List sourceLContent; - List sourceResult; - - ISegment targetSegment; - string targetText; - List targetTags; - List targetLContent; - List targetResult; - - ConfirmationLevel itemStatus; - - if (!paragraphUnit.IsStructure) - foreach (ISegmentPair item in paragraphUnit.SegmentPairs) - { - sourceTags = null; - sourceResult = null; - targetTags = null; - targetResult = null; - - // extract text and tags from Segment - sourceSegment = item.Source; - _dataExtractor.Process(sourceSegment); - sourceText = _dataExtractor.PlainText.ToString(); - sourceTags = _dataExtractor.Tags; - sourceLContent = _dataExtractor.LockedContent; - - targetSegment = item.Target; - _dataExtractor.Process(targetSegment); - targetText = _dataExtractor.PlainText.ToString(); - targetTags = _dataExtractor.Tags; - targetLContent = _dataExtractor.LockedContent; - - // perform search - if (_searcher.CheckSegment(item.Properties.IsLocked, item.Properties.ConfirmationLevel)) - { - if (_searchSettings.SearchInSource && (sourceText.Length > 0 || sourceTags.Count > 0)) - { - _searcher.SearchInSegment(sourceText, sourceTags, sourceLContent); - sourceResult = _searcher.ResultsInText; - sourceTags = _searcher.ResultsInTags; - } - - if (_searchSettings.SearchInTarget && (targetText.Length > 0 || targetTags.Count > 0)) - { - _searcher.SearchInSegment(targetText, targetTags, targetLContent); - targetResult = _searcher.ResultsInText; - targetTags = _searcher.ResultsInTags; - } - - // collect results - if (SegmentHelper.ContainMatches(sourceResult, sourceTags) || SegmentHelper.ContainMatches(targetResult, targetTags)) - { - itemStatus = (_searchSettings.UpdateStatus ? _searchSettings.NewStatus : item.Properties.ConfirmationLevel); - - CollectResults(item.Properties.Id.Id, sourceText, itemStatus, sourceSegment, sourceResult, sourceTags, true); - CollectResults(item.Properties.Id.Id, targetText, itemStatus, targetSegment, targetResult, targetTags, false); - - // unlock selections - if (_searchSettings.UnlockContent) - StatusUpdateHelper.UnlockContent(targetSegment, ItemFactory, PropertiesFactory); - - // update segment properties - StatusUpdateHelper.UpdateSegmentProperties(item, _searchSettings); - } - } - } - - base.ProcessParagraphUnit(paragraphUnit); - } - - #region private - private void CollectResults(string SegmentId, string segmentText, ConfirmationLevel segmentStatus, - ISegment segmentContent, List matches, List tags, bool isSource) - { - int sID; - if (int.TryParse(SegmentId, out sID)) - if (isSource) - { - _resultSrc.Add(new SegmentData(_resultSrc.Count, - sID, segmentText, segmentStatus, segmentContent)); - _resultSrc[_resultSrc.Count - 1].SearchResults = matches; - _resultSrc[_resultSrc.Count - 1].Tags = tags; - } - else - { - _resultTrg.Add(new SegmentData(_resultTrg.Count, - sID, segmentText, segmentStatus, segmentContent)); - _resultTrg[_resultTrg.Count - 1].SearchResults = matches; - _resultTrg[_resultTrg.Count - 1].Tags = tags; - } - } - - - #endregion - } -} diff --git a/Toolkit/SdlXliff.Toolkit.Integration/File/FilesAnalyzer.cs b/Toolkit/SdlXliff.Toolkit.Integration/File/FilesAnalyzer.cs index 07e68c82d5..46413dfa5b 100644 --- a/Toolkit/SdlXliff.Toolkit.Integration/File/FilesAnalyzer.cs +++ b/Toolkit/SdlXliff.Toolkit.Integration/File/FilesAnalyzer.cs @@ -1,35 +1,31 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Sdl.Core.PluginFramework; +using Sdl.Core.PluginFramework; using Sdl.FileTypeSupport.Framework.BilingualApi; -using Sdl.FileTypeSupport.Framework.Core.Utilities.BilingualApi; using Sdl.FileTypeSupport.Framework.Core.Utilities.IntegrationApi; - - using Sdl.FileTypeSupport.Framework.IntegrationApi; using Sdl.FileTypeSupport.Framework.NativeApi; +using System; +using System.Collections.Generic; +using System.IO; namespace SdlXliff.Toolkit.Integration.File { public class FilesAnalyzer { - private List _files; - private List _fileResults; - private const string _ext = ".sdlxliff"; + private List _fileResults; + private List _files; /// - /// + /// /// /// file to analyze (search or replace in) public FilesAnalyzer(string file) { - _files = new List {file}; + _files = new List { file }; } /// - /// + /// /// /// files to analyze (search or replace in) public FilesAnalyzer(List files) @@ -54,13 +50,12 @@ public IFileExtractor GetFileExtractor(string filePath) foreach (IExtension extension in extensionPoint.Extensions) { IFileTypeComponentBuilder extensionFileTypeComponentBuilder = - (IFileTypeComponentBuilder) extension.CreateInstance(); + (IFileTypeComponentBuilder)extension.CreateInstance(); extensionFileTypeComponentBuilder.FileTypeManager = fileTypeManager; IFileTypeInformation extensionFileTypeInformation = extensionFileTypeComponentBuilder.BuildFileTypeInformation(string.Empty); string extensionFileTypeDefinitionId = extensionFileTypeInformation.FileTypeDefinitionId.Id; - if (Equals(extensionFileTypeDefinitionId, "SDL XLIFF 1.0 v 1.0.0.0")) { var extractor = extensionFileTypeComponentBuilder.BuildFileExtractor(filePath); @@ -71,20 +66,13 @@ public IFileExtractor GetFileExtractor(string filePath) return null; } - public void SetFileExtractorProperties(IFileExtractor extractor,IMultiFileConverter converter) - { - extractor.ItemFactory = converter.ItemFactory; - extractor.BilingualParser.ItemFactory = converter.ItemFactory; - } - - public IFileProperties GetFileProperties(IMultiFileConverter converter,string filePath) + public IFileProperties GetFileProperties(IMultiFileConverter converter, string filePath) { var fileProperties = converter.ItemFactory.CreateFileProperties(); fileProperties.FileConversionProperties.InputFilePath = filePath; fileProperties.FileConversionProperties.OriginalFilePath = filePath; return fileProperties; - } /// @@ -96,7 +84,7 @@ public void SearchInFiles(SearchSettings _settings) validateSetts(_settings, false); _fileResults = new List(); - + var fileTypeManager = DefaultFileTypeManager.CreateInstance(true); foreach (string filePath in _files) { @@ -106,17 +94,15 @@ public void SearchInFiles(SearchSettings _settings) if (extractor != null) { - var converter = fileTypeManager.GetConverter(extractor.BilingualParser); - SetFileExtractorProperties(extractor,converter); - + SetFileExtractorProperties(extractor, converter); + var parserProperties = extractor.BilingualParser as INativeContentCycleAware; var fileProperties = GetFileProperties(converter, filePath); - - parserProperties?.SetFileProperties(fileProperties); + parserProperties?.SetFileProperties(fileProperties); // create object to process each file text to perform search FileReadProcessor readProcessor = new FileReadProcessor(filePath, _settings); @@ -126,8 +112,14 @@ public void SearchInFiles(SearchSettings _settings) converter.SynchronizeDocumentProperties(); converter.AddBilingualProcessor(readProcessor); - // start parsing the file - converter.Parse(); + try + { + converter.Parse(); + } + catch (Exception) + { + // ignored + } // save search results _fileResults.Add(new FileData(filePath, readProcessor.ResultInSource, readProcessor.ResultInTarget)); @@ -135,158 +127,12 @@ public void SearchInFiles(SearchSettings _settings) } } - /// - /// searches for matches in files and performs replace of found ones - /// - /// - public void ReplaceInFiles(SearchSettings _settings) + public void SetFileExtractorProperties(IFileExtractor extractor, IMultiFileConverter converter) { - validateSetts(_settings, true); - - _fileResults = new List(); - - foreach (string filePath in _files) - { - validateFile(filePath); - - createBackupFile(filePath); - - - var fileTypeManager = DefaultFileTypeManager.CreateInstance(true); - var extensionPoint = PluginManager.DefaultPluginRegistry.GetExtensionPoint(); - //IFileExtractor parser = null; - IBilingualDocumentGenerator writer = null; - foreach (IExtension extension in extensionPoint.Extensions) - { - IFileTypeComponentBuilder extensionFileTypeComponentBuilder = (IFileTypeComponentBuilder)extension.CreateInstance(); - extensionFileTypeComponentBuilder.FileTypeManager = fileTypeManager; - IFileTypeInformation extensionFileTypeInformation = extensionFileTypeComponentBuilder.BuildFileTypeInformation(string.Empty); - string extensionFileTypeDefinitionId = extensionFileTypeInformation.FileTypeDefinitionId.Id; - FileTypeComponentBuilderAttribute attr = extension.ExtensionAttribute as FileTypeComponentBuilderAttribute; - - if (Equals(extensionFileTypeDefinitionId, "SDL XLIFF 1.0 v 1.0.0.0")) - { - - //parser = extensionFileTypeComponentBuilder.BuildFileExtractor(filePath); - writer = extensionFileTypeComponentBuilder.BuildBilingualGenerator(filePath); - } - } - //XliffFileReader parser = new XliffFileReader(filePath); - // var parser = FileReaderHelper.FileReader(filePath); - - var extractor = GetFileExtractor(filePath); - if (extractor != null) - { - var converter = fileTypeManager.GetConverter(extractor.BilingualParser); - - SetFileExtractorProperties(extractor, converter); - - var parserProperties = extractor.BilingualParser as INativeContentCycleAware; - - var fileProperties = GetFileProperties(converter, filePath); - - parserProperties?.SetFileProperties(fileProperties); - - // var extractor = fileTypeManager.BuildFileExtractor(parser.BilingualParser, null); - - // var writer = FileWriterHelper.FileWriter(filePath); - - // create object to update file to replace found text - FileReplaceProcessor replaceProcessor = new FileReplaceProcessor(filePath, _settings); - - // set extractor and processors - // extractor.BilingualParser = parser.BilingualParser; - // converter.AddExtractor(extractor); - - converter.SynchronizeDocumentProperties(); - converter.AddBilingualProcessor(replaceProcessor); - - if (writer != null) converter.AddBilingualProcessor(new BilingualContentHandlerAdapter(writer.Input)); - - // start parsing the file - converter.Parse(); - - // save replace results - FileData fData = new FileData(filePath, replaceProcessor.ResultSource, replaceProcessor.ResultTarget); - fData.ReplaceResults = replaceProcessor.ResultOfReplace; - fData.Warnings = replaceProcessor.Warnings; - _fileResults.Add(fData); - - if (fData.ReplaceResults.Count < 1) - removeCreatedFile(filePath); - else if (!_settings.MakeBackup) - removeBackupFile(filePath); - } - } + extractor.ItemFactory = converter.ItemFactory; + extractor.BilingualParser.ItemFactory = converter.ItemFactory; } - /// - /// searches for matches in files and updates segment statuses - /// - /// - //public void UpdateStatus(SearchSettings _settings) - //{ - // validateSetts(_settings, false); - - // _fileResults = new List(); - - // foreach (string filePath in _files) - // { - // validateFile(filePath); - - - // //XliffFileReader parser = new XliffFileReader(filePath); - // // var parser = FileReaderHelper.FileReader(filePath); - // var fileTypeManager = DefaultFileTypeManager.CreateInstance(true); - - // var extensionPoint = PluginManager.DefaultPluginRegistry.GetExtensionPoint(); - // IFileExtractor parser = null; - // IBilingualDocumentGenerator writer = null; - // foreach (IExtension extension in extensionPoint.Extensions) - // { - // IFileTypeComponentBuilder extensionFileTypeComponentBuilder = (IFileTypeComponentBuilder)extension.CreateInstance(); - // extensionFileTypeComponentBuilder.FileTypeManager = fileTypeManager; - // IFileTypeInformation extensionFileTypeInformation = extensionFileTypeComponentBuilder.BuildFileTypeInformation(string.Empty); - // string extensionFileTypeDefinitionId = extensionFileTypeInformation.FileTypeDefinitionId.Id; - // FileTypeComponentBuilderAttribute attr = extension.ExtensionAttribute as FileTypeComponentBuilderAttribute; - - // if (Equals(extensionFileTypeDefinitionId, "SDL XLIFF 1.0 v 1.0.0.0") && attr.IsTemplate) - // { - - // parser = extensionFileTypeComponentBuilder.BuildFileExtractor(filePath); - // writer = extensionFileTypeComponentBuilder.BuildBilingualGenerator(filePath); - // } - // } - - // if (parser != null) - // { - // var converter = fileTypeManager.GetConverter(parser.BilingualParser); - - // var extractor = fileTypeManager.BuildFileExtractor(parser.BilingualParser, null); - - // // var writer = FileWriterHelper.FileWriter(filePath); - - // // create object to process each file text to perform search - // FileStatusUpdateProcessor updateProcessor = new FileStatusUpdateProcessor(filePath, _settings); - - // // set extractor and processor - // extractor.BilingualParser = parser.BilingualParser; - // converter.AddExtractor(extractor); - // converter.SynchronizeDocumentProperties(); - // converter.AddBilingualProcessor(updateProcessor); - // converter.AddBilingualProcessor(new BilingualContentHandlerAdapter(writer.Input)); - - // // start parsing the file - // converter.Parse(); - - // // save search results - // _fileResults.Add(new FileData(filePath, updateProcessor.ResultInSource, updateProcessor.ResultInTarget)); - // } - // } - //} - - #region private - private void createBackupFile(string filePath) { string fname = string.Format("{0}.backup", filePath); @@ -331,7 +177,5 @@ private void validateSetts(SearchSettings settings, bool isReplace) // if (settings.ReplaceText == null || settings.ReplaceText.Length == 0) // throw new ArgumentOutOfRangeException("Replace Text cannot be empty."); } - - #endregion } -} +} \ No newline at end of file diff --git a/Toolkit/SdlXliff.Toolkit.Integration/File/SegmentVisitor.cs b/Toolkit/SdlXliff.Toolkit.Integration/File/SegmentVisitor.cs new file mode 100644 index 0000000000..0898f137a9 --- /dev/null +++ b/Toolkit/SdlXliff.Toolkit.Integration/File/SegmentVisitor.cs @@ -0,0 +1,96 @@ +using Sdl.FileTypeSupport.Framework.BilingualApi; +using SDLXLIFFSliceOrChange; +using System.Text.RegularExpressions; + +namespace SdlXliff.Toolkit.Integration.File +{ + internal class SegmentVisitor : IMarkupDataVisitor + { + public SegmentVisitor(ReplaceSettings settings) + { + SetUp(settings); + } + + private RegexOptions RegexOptions { get; set; } + + private string ReplacementText { get; set; } + + private string SearchPattern { get; set; } + + public void VisitCommentMarker(ICommentMarker commentMarker) + { + foreach (var element in commentMarker) + element.AcceptVisitor(this); + } + + public void VisitLocationMarker(ILocationMarker location) + { + } + + public void VisitLockedContent(ILockedContent lockedContent) + { + } + + public void VisitOtherMarker(IOtherMarker marker) + { + foreach (var element in marker) + element.AcceptVisitor(this); + } + + public void VisitPlaceholderTag(IPlaceholderTag tag) + { + } + + public void VisitRevisionMarker(IRevisionMarker revisionMarker) + { + foreach (var element in revisionMarker) + element.AcceptVisitor(this); + } + + public void VisitSegment(ISegment segment) + { + foreach (var element in segment) + element.AcceptVisitor(this); + } + + public void VisitTagPair(ITagPair tagPair) + { + foreach (var element in tagPair) + { + element.AcceptVisitor(this); + } + } + + public void VisitText(IText text) + { + var originalText = text.Properties.Text; + var replacedText = Regex.Replace(originalText, SearchPattern, ReplacementText, RegexOptions); + text.Properties.Text = replacedText; + } + + private void SetUp(ReplaceSettings settings) + { + var isSource = settings.SourceSearchText is not null && !string.IsNullOrEmpty(settings.SourceSearchText); + + if (isSource) + { + SearchPattern = settings.SourceSearchText; + ReplacementText = settings.SourceReplaceText; + } + else + { + SearchPattern = settings.TargetSearchText; + ReplacementText = settings.TargetReplaceText; + } + + RegexOptions = !settings.MatchCase + ? RegexOptions.IgnoreCase | RegexOptions.Multiline + : RegexOptions.None | RegexOptions.Multiline; + + if (settings.UseRegEx) return; + + SearchPattern = Regex.Escape(SearchPattern); + SearchPattern = settings.MatchWholeWord ? string.Format(@"(\b(? SdlCommunity.snk $(MSBuildProgramFiles32)\Trados\Trados Studio\Studio18 + latest diff --git a/Toolkit/SdlXliffToolkit/Properties/AssemblyInfo.cs b/Toolkit/SdlXliffToolkit/Properties/AssemblyInfo.cs index 23caf7815e..f9ecdc5eb4 100644 --- a/Toolkit/SdlXliffToolkit/Properties/AssemblyInfo.cs +++ b/Toolkit/SdlXliffToolkit/Properties/AssemblyInfo.cs @@ -28,4 +28,4 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("7.0.0.0")] -[assembly: AssemblyFileVersion("7.0.1.0")] +[assembly: AssemblyFileVersion("7.0.1.1")] diff --git a/Toolkit/SdlXliffToolkit/pluginpackage.manifest.xml b/Toolkit/SdlXliffToolkit/pluginpackage.manifest.xml index ab75fb9a5a..3e26ae2a0a 100644 --- a/Toolkit/SdlXliffToolkit/pluginpackage.manifest.xml +++ b/Toolkit/SdlXliffToolkit/pluginpackage.manifest.xml @@ -1,7 +1,7 @@ SDLXLIFF Toolkit - 7.0.1.0 + 7.0.1.1 SdlXliff Toolkit Trados AppStore Team