void GenreAddButtonClick(object sender, EventArgs e) { if (!MiscListView.isExistListViewItem(GenresListView, GenresComboBox.Text)) { ListViewItem lvi = new ListViewItem(GenresComboBox.Text); lvi.SubItems.Add(MatchMaskedTextBox.Text.Trim()); GenresListView.Items.Add(lvi); MatchMaskedTextBox.Clear(); } }
// ============================================================================================= // Анализатор копий книг // ============================================================================================= #region Анализатор копий книг // пометить в выбранной группе все "старые" книги private void CheckAllOldBooksInGroup(CompareModeEnum mode, ref BackgroundWorker bw, ref DoWorkEventArgs e) { ListView.SelectedListViewItemCollection si = m_lvResult.SelectedItems; if (si.Count > 0) { // группа для выделенной книги ListViewGroup lvg = si[0].Group; MiscListView.CheckAllListViewItemsInGroup(lvg, false); _CheckAllOldBooksInGroup(mode, lvg, false, ref bw, ref e); } }
void GenreDownButtonClick(object sender, EventArgs e) { if (GenresListView.Items.Count > 0 && GenresListView.SelectedItems.Count > 0) { if (GenresListView.SelectedItems.Count == 1) { MiscListView.moveDownSelectedItem(GenresListView); } else { MessageBox.Show("Выберите только один Жанр для перемещения!", m_sTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } GenresListView.Select(); }
void AuthorDownButtonClick(object sender, EventArgs e) { if (AuthorsListView.Items.Count > 0 && AuthorsListView.SelectedItems.Count > 0) { if (AuthorsListView.SelectedItems.Count == 1) { MiscListView.moveDownSelectedItem(AuthorsListView); } else { MessageBox.Show("Выберите только одного Автора для перемещения!", m_sTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } AuthorsListView.Select(); }
// пометить в каждой группе все "старые" книги private void CheckAllOldBooksInAllGroups(CompareModeEnum mode, ref BackgroundWorker bw, ref DoWorkEventArgs e) { int iter = 0; ProgressBar.Maximum = m_lvResult.Groups.Count; MiscListView.UnCheckAllListViewItems(m_lvResult.CheckedItems); // перебор всех групп foreach (ListViewGroup lvg in m_lvResult.Groups) { if ((bw.CancellationPending)) { e.Cancel = true; return; } // перебор всех книг в выбранной группе _CheckAllOldBooksInGroup(mode, lvg, true, ref bw, ref e); bw.ReportProgress(++iter); } }
// поиск одинаковых fb2-файлов private void bw_DoWork(object sender, DoWorkEventArgs e) { m_dtStart = DateTime.Now; BackgroundWorker worker = sender as BackgroundWorker; ControlPanel.Enabled = false; m_FilesList.Clear(); if (string.IsNullOrEmpty(m_fromXmlPath)) { /* непрерывный поиск */ StatusLabel.Text += "Создание списка файлов для поиска копий fb2 книг...\r"; List <string> lDirList = new List <string>(); // сканировать все подпапки исходной папки m_AllDirs = FilesWorker.recursionDirsSearch(m_SourceDir, ref lDirList, true); m_AllFiles = FilesWorker.makeFilesListFromDirs(ref worker, ref e, ref lDirList, ref m_FilesList, true); // проверка, есть ли хоть один файл в папке для сканирования if (m_AllFiles == 0) { MessageBox.Show("В папке сканирования не найдено ни одного файла!\nРабота прекращена.", m_sMessTitle, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } this.Text += String.Format(": Всего {0} каталогов; {1} файлов", m_AllDirs, m_AllFiles); StatusLabel.Text += String.Format("Осталось проверить {0} книг...\r", m_AllFiles); lDirList.Clear(); } else { /* возобновление поиска */ // загрузка данных из xml StatusLabel.Text += "Возобновление поиска невалидных fb2 книг из xml файла:\r"; StatusLabel.Text += m_fromXmlPath + "\r"; StatusLabel.Text += "Загрузка списка непроверенных книг из xml файла...\r"; XElement xTree = XElement.Load(m_fromXmlPath); //загрузка данных о ходе сравнения XElement xCompareData = xTree.Element("SearchData"); m_AllDirs = Convert.ToInt32(xCompareData.Element("AllDirs").Value); m_AllFiles = Convert.ToInt32(xCompareData.Element("AllFiles").Value); this.Text += String.Format(": Всего {0} каталогов; {1} файлов", m_AllDirs, m_AllFiles); // заполнение списка необработанных файлов IEnumerable <XElement> files = xTree.Element("NotWorkingFiles").Elements("File"); int NotWorkingFiles = files.ToList().Count; StatusLabel.Text += String.Format("Осталось проверить {0} книг...\r", NotWorkingFiles.ToString()); ProgressBar.Maximum = NotWorkingFiles; int i = 0; foreach (XElement element in files) { m_FilesList.Add(element.Value); worker.ReportProgress(i++); } // загрузка из xml-файла в хэш-лист данных о невалидных книгах StatusLabel.Text += "Создание визуального списка невалидных книг из xml файла...\r"; files = xTree.Element("FB2NotValidate").Elements("File"); ProgressBar.Maximum = files.ToList().Count; i = 0; foreach (XElement element in files) { if ((worker.CancellationPending)) { e.Cancel = true; return; } createNotValidateBookItem(element.Value, m_fb2Genres, m_fv2Validator, m_sharpZipLib); worker.ReportProgress(i++); } } ControlPanel.Enabled = true; if ((worker.CancellationPending)) { e.Cancel = true; return; } // Создание списка невалидных fb2-книг searchNotValidateFiles(sender, e, m_FilesList); if (m_autoResizeColumns) { MiscListView.AutoResizeColumns(m_listViewFB2Files); } }
// Отображение результата поиска сравнения private void ViewDupProgressData() { MiscListView.ListViewStatus(m_lvFilesCount, (int)FilesCountViewDupCollumnEnum.AllGroups, m_StatusView.Group); MiscListView.ListViewStatus(m_lvFilesCount, (int)FilesCountViewDupCollumnEnum.AllBooksInAllGroups, m_StatusView.AllFB2InGroups); }
// загрузка из xml-файла в хэш таблицу данных о копиях книг private void loadCopiesListFromXML(ref BackgroundWorker bw, ref DoWorkEventArgs e, string FromXML) { XElement xmlTree = XElement.Load(FromXML); // выставляем режим сравнения m_cboxMode.SelectedIndex = Convert.ToInt16(xmlTree.Element("CompareMode").Attribute("index").Value); // устанавливаем данные настройки поиска-сравнения m_tboxSourceDir.Text = xmlTree.Element("SourceDir").Value; m_chBoxScanSubDir.Checked = Convert.ToBoolean(xmlTree.Element("Settings").Element("ScanSubDirs").Value); //загрузка данных о ходе сравнения XElement compareData = xmlTree.Element("CompareData"); m_StatusView.Group = Convert.ToInt32(compareData.Element("Groups").Value); m_StatusView.AllFB2InGroups = Convert.ToInt32(compareData.Element("AllFB2InGroups").Value); ViewDupProgressData(); // данные поиска Hashtable htBookGroups = new Hashtable(); // хеш-таблица групп одинаковых книг ListViewGroup lvg = null; // группа одинаковых книг ListViewItem lvi = null; ProgressBar.Maximum = Convert.ToInt32(xmlTree.Element("Groups").Attribute("books").Value); IEnumerable <XElement> Groups = xmlTree.Element("Groups").Elements("Group"); // перебор всех групп копий int i = 0; foreach (XElement Group in Groups) { if ((bw.CancellationPending)) { e.Cancel = true; return; } string GroupName = Group.Attribute("name").Value; // перебор всех книг в группе IEnumerable <XElement> books = Group.Elements("Book"); foreach (XElement book in books) { // в список - только существующие на диске книги if (File.Exists(book.Element("Path").Value)) { string lviForeColor = book.Element("ForeColor").Value; string lviBackColor = book.Element("BackColor").Value; lvg = new ListViewGroup(GroupName); lvi = new ListViewItem(book.Element("Path").Value); lvi.ForeColor = Color.FromName(lviForeColor); lvi.BackColor = Color.FromName(lviBackColor); lvi.SubItems.Add(book.Element("BookTitle").Value); lvi.SubItems.Add(book.Element("Authors").Value); lvi.SubItems.Add(book.Element("Genres").Value); lvi.SubItems.Add(book.Element("BookLang").Value); lvi.SubItems.Add(book.Element("BookID").Value); lvi.SubItems.Add(book.Element("Version").Value); lvi.SubItems.Add(book.Element("Encoding").Value); lvi.SubItems.Add(book.Element("Validation").Value); lvi.SubItems.Add(book.Element("FileLength").Value); lvi.SubItems.Add(book.Element("FileCreationTime").Value); lvi.SubItems.Add(book.Element("FileLastWriteTime").Value); // заносим группу в хеш, если она там отсутствует AddBookGroupInHashTable(ref htBookGroups, ref lvg); // присваиваем группу книге m_listViewFB2Files.Groups.Add((ListViewGroup)htBookGroups[GroupName]); lvi.Group = (ListViewGroup)htBookGroups[GroupName]; lvi.Checked = Convert.ToBoolean(book.Element("IsChecked").Value); m_listViewFB2Files.Items.Add(lvi); } else { --m_StatusView.AllFB2InGroups; } bw.ReportProgress(++i); } } ViewDupProgressData(); m_LastSelectedItem = Convert.ToInt32(xmlTree.Element("SelectedItem").Value); MiscListView.SelectedItemEnsureVisible(m_listViewFB2Files, m_LastSelectedItem == -1 ? 0 : m_LastSelectedItem); }
// загрузка из xml-файла в хэш таблицу данных о копиях книг private void loadListFromXML(ref BackgroundWorker bw, ref DoWorkEventArgs e, string FromXML) { XElement xmlTree = XElement.Load(FromXML); if (xmlTree != null) { XElement xmlBooks = xmlTree.Element("Books"); if (xmlBooks != null) { ProgressBar.Maximum = Convert.ToInt32(xmlBooks.Attribute("count").Value); // устанавливаем данные настройки поиска-сравнения m_textBoxAddress.Text = xmlTree.Element("SourceDir").Value; // перебор книг int i = 0; ListViewItem lvi = null; IEnumerable <XElement> Books = xmlBooks.Elements("Book"); foreach (XElement book in Books) { if ((bw.CancellationPending)) { e.Cancel = true; return; } string BookPath = book.Attribute("path").Value; string type = book.Attribute("type").Value; // в список - только существующие на диске книги и каталоги bool IsExist = false; if (type == "dir") { IsExist = Directory.Exists(BookPath) ? true : false; } else { IsExist = File.Exists(BookPath) ? true : false; } if (IsExist) { string FileName = book.Element("FileName").Value; string sForeColor = book.Element("ForeColor").Value; string sBackColor = book.Element("BackColor").Value; if (type == "dir") { if (FileName == "..") { lvi = new ListViewItem(FileName, 3); lvi.Tag = new ListViewItemType("dUp", BookPath); } else { lvi = new ListViewItem(FileName, 0); lvi.Tag = new ListViewItemType("d", BookPath); } } else { lvi = new ListViewItem(FileName, FilesWorker.isFB2File(BookPath) ? 1 : 2); lvi.Tag = new ListViewItemType("f", BookPath); } lvi.ForeColor = Color.FromName(sForeColor); lvi.BackColor = Color.FromName(sBackColor); lvi.SubItems.Add(book.Element("BookTitle").Value); lvi.SubItems.Add(book.Element("Authors").Value); lvi.SubItems.Add(book.Element("Genres").Value); lvi.SubItems.Add(book.Element("Sequence").Value); lvi.SubItems.Add(book.Element("Lang").Value); lvi.SubItems.Add(book.Element("BookID").Value); lvi.SubItems.Add(book.Element("Version").Value); lvi.SubItems.Add(book.Element("Encoding").Value); lvi.SubItems.Add(book.Element("Validation").Value); lvi.SubItems.Add(book.Element("Format").Value); lvi.SubItems.Add(book.Element("FileLength").Value); lvi.SubItems.Add(book.Element("FileCreationTime").Value); lvi.SubItems.Add(book.Element("FileLastWriteTime").Value); lvi.Checked = Convert.ToBoolean(book.Element("IsChecked").Value); m_listViewFB2Files.Items.Add(lvi); } bw.ReportProgress(++i); } m_LastSelectedItem = Convert.ToInt32(xmlTree.Element("SelectedItem").Value); MiscListView.SelectedItemEnsureVisible(m_listViewFB2Files, m_LastSelectedItem == -1 ? 0 : m_LastSelectedItem); } } }
void AuthorsListViewColumnClick(object sender, ColumnClickEventArgs e) { MiscListView.SortColumnClick(AuthorsListView, m_lvwColumnSorter, e); }
void AuthorDeleteAllButtonClick(object sender, EventArgs e) { MiscListView.deleteAllItems(AuthorsListView, m_sTitle, "Авторов Книг"); }
void GenreDeleteAllButtonClick(object sender, EventArgs e) { MiscListView.deleteAllItems(GenresListView, m_sTitle, "Жанров"); }