Beispiel #1
0
        public void Process(IDiff diff, IKoreFolderInfo source, IKoreFolderInfo destination)
        {
            IsNotNull(diff);

            if (diff.Relation == DiffRelation.Identical)
            {
                return;
            }

            if (diff.Relation == DiffRelation.DestinationOrphan)
            {
                diff.Destination.Delete();
                return;
            }

            IsNotNull(source);
            IsNotNull(destination);

            var sourceFileInfo      = diff.Source;
            var destinationFileInfo = diff.Destination;

            if (diff.Relation == DiffRelation.SourceNew)
            {
                var sourceInnerFullPath = BuildRelativePath(diff.Source, source);
                destinationFileInfo = new KoreFileInfo(Path.Combine(destination.FullName, sourceInnerFullPath));
            }
            else if (diff.Relation == DiffRelation.SourceOlder)
            {
                sourceFileInfo      = destinationFileInfo;
                destinationFileInfo = diff.Source;
            }

            _fileCopier.Copy(sourceFileInfo, destinationFileInfo);
        }
Beispiel #2
0
        public void ReadSettings()
        {
            _currentTest = Path.Combine(CurrentWorkingFolder, "test6");

            EnsureFolderExists(_currentTest);

            var sourceFolder      = "C:\\Music";
            var destinationFolder = "D:\\Backups\\Music";

            _settingsManager.Data.SyncPairs.Add(new SyncPair {
                Source = _currentTest, Destination = _currentTest
            });

            var settingsFile = new KoreFileInfo(Path.Combine(_currentTest, "settings.bin"));

            _kontrol.WriteSettings(settingsFile);

            var settingsManager = new SettingsManager <ISettings>(new BinarySerializer <ISettings>());

            var kontrol = new Kontrol(settingsManager, _syncManager);

            kontrol.ReadSettings(settingsFile);

            Assert.IsNotNull(settingsManager.Data);
            Assert.IsNotNull(settingsManager.Data.SyncPairs);
            Assert.AreEqual(1, settingsManager.Data.SyncPairs.Count);
            Assert.AreEqual(sourceFolder, settingsManager.Data.SyncPairs[0].Source);
            Assert.AreEqual(destinationFolder, settingsManager.Data.SyncPairs[0].Destination);

            Assert.IsTrue(settingsFile.Exists);
        }
Beispiel #3
0
        public ImageForm(KoreFileInfo kfi, TabPage tabPage, IArchiveAdapter parentAdapter, TabPage parentTabPage)
        {
            InitializeComponent();

            Kfi = kfi;

            _currentTab    = tabPage;
            _parentTab     = parentTabPage;
            _parentAdapter = parentAdapter;
            _bestBitmaps   = _imageAdapter.BitmapInfos.Select(x => (Bitmap)x.Image.Clone()).ToArray();

            imbPreview.Image = _imageAdapter.BitmapInfos.FirstOrDefault()?.Image;
            tsbFormat.DropDownItems.AddRange(_imageAdapter.FormatInfos?.Select(f => new ToolStripMenuItem {
                Text = f.FormatName, Tag = f, Checked = f.FormatIndex == _selectedBitmapInfo.FormatInfo.FormatIndex
            }).ToArray());
            if (tsbFormat.DropDownItems.Count > 0)
            {
                foreach (var tsb in tsbFormat.DropDownItems)
                {
                    ((ToolStripMenuItem)tsb).Click += tsbFormat_Click;
                }
            }

            tsbImageBorderStyle.DropDownItems.AddRange(Enum.GetNames(typeof(ImageBoxBorderStyle)).Select(s => new ToolStripMenuItem {
                Image = (Image)Resources.ResourceManager.GetObject(_stylesImages[s]), Text = _stylesText[s], Tag = s
            }).ToArray());
            foreach (var tsb in tsbImageBorderStyle.DropDownItems)
            {
                ((ToolStripMenuItem)tsb).Click += tsbImageBorderStyle_Click;
            }

            UpdateForm();
            UpdatePreview();
            UpdateImageList();
        }
Beispiel #4
0
        public void NotCopyAnIdenticalFile()
        {
            SetupCurrentTestFolder("test-identical-files");

            var sourceFileInfo = new KoreFileInfo(Path.Combine(_sourceFolder, _primaryTestFileName));

            sourceFileInfo.EnsureExists();

            using (var streamWriter = new StreamWriter(sourceFileInfo.FullName))
            {
                streamWriter.Write('c');
            }

            var destinationFileInfo = new KoreFileInfo(Path.Combine(_destinationFolder, _primaryTestFileName));

            destinationFileInfo.EnsureExists();

            var now = DateTime.Now;

            sourceFileInfo.LastWriteTime      = now;
            destinationFileInfo.LastWriteTime = now;


            _kontrol.Sync();

            Assert.IsTrue(destinationFileInfo.Exists);
            Assert.IsTrue(sourceFileInfo.Exists);
            Assert.AreEqual(0, destinationFileInfo.Size);
        }
Beispiel #5
0
        /// <summary>
        /// Saves a Kfi
        /// </summary>
        private void SaveFile(KoreFileInfo kfi, string newSaveLocation = "", int version = 0)
        {
            if (!kfi.HasChanges && newSaveLocation == string.Empty)
            {
                return;
            }

            // Save files
            var ksi = new KoreSaveInfo(kfi, _tempFolder)
            {
                Version = version, NewSaveFile = newSaveLocation
            };
            var savedKfi = _fileManager.SaveFile(ksi);

            if (savedKfi.ParentKfi != null)
            {
                savedKfi.ParentKfi.HasChanges = true;
            }

            // Update all corresponsing tabs
            var kuriimuForm = GetTabPageForKfi(kfi).Controls[0] as IKuriimuForm;

            kuriimuForm.Kfi = savedKfi;
            if (kuriimuForm is IArchiveForm archiveForm)
            {
                archiveForm.UpdateChildTabs(savedKfi);
                archiveForm.UpdateParent();
            }
            kuriimuForm.UpdateForm();
        }
Beispiel #6
0
        private bool CloseFile(KoreFileInfo kfi, bool leaveFileStreamOpen, bool firstIteration)
        {
            if (kfi.ChildKfi != null && kfi.ChildKfi.Count > 0)
            {
                foreach (var child in kfi.ChildKfi)
                {
                    CloseFile(child, false, false);
                }
            }

            if (OpenFiles.Contains(kfi))
            {
                OpenFiles.Remove(kfi);
            }

            kfi.Adapter.Dispose();
            if (!leaveFileStreamOpen)
            {
                kfi.StreamFileInfo.FileData.Close();
            }

            if (firstIteration)
            {
                kfi.ParentKfi?.ChildKfi.Remove(kfi);
            }

            return(true);
        }
Beispiel #7
0
        // Constructor
        public TextEditor2ViewModel(FileManager fileManager, PluginLoader pluginLoader, KoreFileInfo koreFile)
        {
            _fileManager  = fileManager;
            _pluginLoader = pluginLoader;
            KoreFile      = koreFile;

            _adapter     = KoreFile.Adapter as ITextAdapter;
            GameAdapters = _pluginLoader.GetAdapters <IGameAdapter>().Select(ga => new GameAdapter(ga)).ToList();

            // TODO: Implement game adapter persistence
            SelectedGameAdapter = GameAdapters.FirstOrDefault();
            SelectedZoomLevel   = 1;

            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "84D2BD62-7AC6-459B-B3BB-3A65855135F6") ?? GameAdapters.First();
                SelectedZoomLevel   = 2;
            }
            else if (Keyboard.IsKeyDown(Key.LeftAlt))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "B344166C-F1BE-49B2-9ADC-38771D0A15DA") ?? GameAdapters.First();
                SelectedZoomLevel   = 1;
            }

            SelectedEntry = Entries?.FirstOrDefault();
        }
        // Constructor
        public TextEditor2ViewModel(KoreManager kore, KoreFileInfo koreFile)
        {
            _kore    = kore;
            KoreFile = koreFile;

            _adapter     = KoreFile.Adapter as ITextAdapter;
            GameAdapters = _kore.GetAdapters <IGameAdapter>().Select(ga => new GameAdapter(ga)).ToList();

            // TODO: Implement game adapter persistence
            SelectedGameAdapter = GameAdapters.FirstOrDefault();
            SelectedZoomLevel   = 1;

            if (Keyboard.IsKeyDown(Key.LeftShift))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "84D2BD62-7AC6-459B-B3BB-3A65855135F6") ?? GameAdapters.First();
                SelectedZoomLevel   = 2;
            }
            else if (Keyboard.IsKeyDown(Key.LeftAlt))
            {
                SelectedGameAdapter = GameAdapters.FirstOrDefault(ga => ga.Adapter.GetType().GetCustomAttribute <PluginInfoAttribute>().ID == "B344166C-F1BE-49B2-9ADC-38771D0A15DA") ?? GameAdapters.First();
                SelectedZoomLevel   = 1;
            }

            // Direct entry loading is now dead since GameAdapters have become a thing
            //if (_adapter != null)
            //    Entries = new ObservableCollection<TextEntry>(_adapter.Entries);

            SelectedEntry = Entries?.FirstOrDefault();
        }
Beispiel #9
0
        private TabPage AddTabPage(KoreFileInfo kfi, Color tabColor, KoreFileInfo parentKfi = null)
        {
            var tabPage = new TabPage
            {
                BackColor = SystemColors.Window,
                Padding   = new Padding(0, 2, 2, 1)
            };

            IKuriimuForm tabControl = null;

            try
            {
                if (kfi.Adapter is ITextAdapter)
                {
                    tabControl = new TextForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi), _pluginLoader.GetAdapters <IGameAdapter>());
                }
                else if (kfi.Adapter is IImageAdapter)
                {
                    tabControl = new ImageForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi));
                }
                else if (kfi.Adapter is ILayoutAdapter)
                {
                    tabControl = new LayoutForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi));
                }
                else if (kfi.Adapter is IArchiveAdapter)
                {
                    tabControl = new ArchiveForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi), _tempFolder, _pluginLoader);
                    (tabControl as IArchiveForm).OpenTab        += Kuriimu2_OpenTab;
                    (tabControl as IArchiveForm).GetAdapterById += Kuriimu2_GetAdapterById;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "Exception catched.");
                return(null);
            }

            tabControl.TabColor = tabColor;

            if (tabControl is UserControl uc)
            {
                uc.Dock = DockStyle.Fill;
            }

            tabControl.SaveTab        += TabControl_SaveTab;
            tabControl.CloseTab       += TabControl_CloseTab;
            tabControl.ReportProgress += Report_ProgressChanged;

            tabPage.Controls.Add(tabControl as UserControl);

            openFiles.TabPages.Add(tabPage);
            tabPage.ImageKey      = "close-button"; // setting ImageKey before adding, makes the image not working
            openFiles.SelectedTab = tabPage;

            return(tabPage);
        }
Beispiel #10
0
        public void DeleteAnOrphanDestinationFile()
        {
            SetupCurrentTestFolder("test-oprhanr-destination-file");

            var destinationFileInfo = new KoreFileInfo(Path.Combine(_destinationFolder, _primaryTestFileName));

            destinationFileInfo.EnsureExists();

            _kontrol.Sync();

            Assert.IsFalse(destinationFileInfo.Exists);
        }
Beispiel #11
0
        public void SupportMultipleSyncPairs()
        {
            _currentTest = Path.Combine(CurrentWorkingFolder, "test-multiple-sync-pairs");

            var sourceFolder1 = Path.Combine(_currentTest, "src1");

            EnsureFolderExists(sourceFolder1);

            var sourceFolder2 = Path.Combine(_currentTest, "src2");

            EnsureFolderExists(sourceFolder2);

            var destinationFolder1 = Path.Combine(_currentTest, "dest1");

            EnsureFolderExists(destinationFolder1);

            var destinationFolder2 = Path.Combine(_currentTest, "dest2");

            EnsureFolderExists(destinationFolder2);

            var fileName1       = "file1.txt";
            var sourceFileInfo1 = new KoreFileInfo(Path.Combine(sourceFolder1, fileName1));

            sourceFileInfo1.EnsureExists();

            var fileName2       = "file2.exe";
            var sourceFileInfo2 = new KoreFileInfo(Path.Combine(sourceFolder2, fileName2));

            sourceFileInfo2.EnsureExists();

            _kontrol.Settings.SyncPairs.Add(new SyncPair
            {
                Source      = sourceFolder1,
                Destination = destinationFolder1,
                Level       = SyncLevel.Flat
            });

            _kontrol.Settings.SyncPairs.Add(new SyncPair
            {
                Source      = sourceFolder2,
                Destination = destinationFolder2,
                Level       = SyncLevel.Flat
            });

            _kontrol.Sync();

            var destinationFileInfo1 = new KoreFileInfo(Path.Combine(destinationFolder1, fileName1));
            var destinationFileInfo2 = new KoreFileInfo(Path.Combine(destinationFolder2, fileName2));

            Assert.IsTrue(destinationFileInfo1.Exists);
            Assert.IsTrue(destinationFileInfo2.Exists);
        }
Beispiel #12
0
        private FullPathNode CreateFullPathTree(KoreFileInfo kfi)
        {
            var newNode = new FullPathNode(kfi.FullPath);

            if (kfi.ChildKfi != null)
            {
                foreach (var child in kfi.ChildKfi)
                {
                    newNode.Nodes.Add(CreateFullPathTree(child));
                }
            }
            return(newNode);
        }
Beispiel #13
0
        public void CopiesContentAtDestinationUnderSourceParentIfLevelIsParent()
        {
            SetupCurrentTestFolder("test-sync-options-copy-content", SyncLevel.Parent);

            var sourceFileInfo = new KoreFileInfo(Path.Combine(_sourceFolder, _primaryTestFileName));

            sourceFileInfo.EnsureExists();

            _kontrol.Sync();

            var destinationFileInfo = new KoreFileInfo(Path.Combine(_destinationFolder, "src", _primaryTestFileName));

            Assert.IsTrue(destinationFileInfo.Exists);
        }
Beispiel #14
0
        public LayoutForm(KoreFileInfo kfi, TabPage tabPage, IArchiveAdapter parentAdapter, TabPage parentTabPage)
        {
            InitializeComponent();

            Kfi            = kfi;
            _currentTab    = tabPage;
            _parentTab     = parentTabPage;
            _parentAdapter = parentAdapter;

            imgLayout.Image = new Bitmap(500, 500);

            UpdateForm();
            UpdateLayout();
        }
Beispiel #15
0
        public void CopyANewSourceFile()
        {
            SetupCurrentTestFolder("test-new-source-file");

            var sourceFileInfo = new KoreFileInfo(Path.Combine(_sourceFolder, _primaryTestFileName));

            sourceFileInfo.EnsureExists();

            _kontrol.Sync();

            var destinationFileInfo = new KoreFileInfo(Path.Combine(_destinationFolder, _primaryTestFileName));

            Assert.IsTrue(destinationFileInfo.Exists);
        }
        // Constructor
        public TextEditor1ViewModel(KoreFileInfo koreFile)
        {
            KoreFile = koreFile;

            DisplayName = KoreFile.DisplayName;
            _adapter    = KoreFile.Adapter as ITextAdapter;

            if (_adapter != null)
            {
                Entries = new ObservableCollection <TextEntry>(_adapter.Entries);
            }

            SelectedEntry = Entries.First();
        }
Beispiel #17
0
        /// <summary>
        /// Close a Kfi and its corresponding tabs
        /// </summary>
        /// <param name="kfi">The initial Kfi to close</param>
        /// <param name="ignoreChildWarning">Ignore showing child close warning</param>
        /// <returns>If the closing was successful</returns>
        private bool CloseFile(KoreFileInfo kfi, bool leaveOpen = false, bool ignoreChildWarning = false)
        {
            // Security question, so the user knows that every sub file will be closed
            if (kfi.ChildKfi != null && kfi.ChildKfi.Count > 0 && !ignoreChildWarning)
            {
                var result = MessageBox.Show("Every file opened from this one and below will be closed too. Continue?", "Dependant files", MessageBoxButtons.YesNo);
                switch (result)
                {
                case DialogResult.Yes:
                    break;

                case DialogResult.No:
                default:
                    return(false);
                }
            }

            // Save unchanged saves, if wanted
            if (kfi.HasChanges)
            {
                var result = MessageBox.Show($"Changes were made to \"{kfi.FullPath}\" or its opened sub files. Do you want to save those changes?", "Unsaved changes", MessageBoxButtons.YesNoCancel);
                switch (result)
                {
                case DialogResult.Yes:
                    TabControl_SaveTab(this, new SaveTabEventArgs(kfi));
                    break;

                case DialogResult.No:
                    break;

                case DialogResult.Cancel:
                default:
                    return(false);
                }
            }

            // Remove all tabs related to KFIs
            CloseOpenTabs(kfi);

            // Update parent, if existent
            if (kfi.ParentKfi != null)
            {
                var parentTab = GetTabPageForKfi(kfi.ParentKfi);
                (parentTab.Controls[0] as IArchiveForm).RemoveChildTab(GetTabPageForKfi(kfi));
            }

            // Close all KFIs
            return(_fileManager.CloseFile(kfi, leaveOpen));
        }
Beispiel #18
0
        private KoreFileInfo ReopenFiles(KoreFileInfo kfi, FullPathNode fullPathTree, string tempFolder, bool isChild)
        {
            var guid = Guid.NewGuid().ToString();

            // Open this file
            KoreFileInfo newKfi;

            if (isChild)
            {
                var parentFiles = (kfi.Adapter as IArchiveAdapter)?.Files;
                var foundAfi    = parentFiles.FirstOrDefault(x => x.FileName == fullPathTree.FullPath.Remove(0, kfi.FullPath.Length + 1));
                if (foundAfi == null)
                {
                    throw new InvalidOperationException($"While reopening files, the ArchiveFileInfo with FullPath \"{fullPathTree.FullPath}\" couldn't be found.");
                }

                newKfi = LoadFile(new KoreLoadInfo(foundAfi.FileData, foundAfi.FileName)
                {
                    LeaveOpen  = true,
                    Adapter    = kfi.Adapter,
                    FileSystem = NodeFactory.FromArchiveFileInfos((kfi.Adapter as IArchiveAdapter).Files)
                });
                // new VirtualFileSystem(kfi.Adapter as IArchiveAdapter, tempFolder)

                newKfi.ParentKfi = kfi;
                newKfi.ChildKfi  = new List <KoreFileInfo>();
            }
            else
            {
                var openedFile = File.Open(fullPathTree.FullPath, FileMode.Open);

                newKfi = LoadFile(new KoreLoadInfo(openedFile, fullPathTree.FullPath)
                {
                    LeaveOpen  = true,
                    Adapter    = kfi.Adapter,
                    FileSystem = NodeFactory.FromDirectory(Path.GetDirectoryName(fullPathTree.FullPath))
                });

                newKfi.ChildKfi = new List <KoreFileInfo>();
            }

            // Open Childs
            foreach (var child in fullPathTree.Nodes)
            {
                newKfi.ChildKfi.Add(ReopenFiles(newKfi, child, tempFolder, true));
            }

            return(newKfi);
        }
        // Constructor
        public ImageEditorViewModel(FileManager fileManager, KoreFileInfo koreFile)
        {
            _fileManager = fileManager;
            KoreFile     = koreFile;

            _adapter = KoreFile.Adapter as IImageAdapter;

            if (_adapter?.BitmapInfos != null)
            {
                Bitmaps = new ObservableCollection <BitmapEntry>(_adapter.BitmapInfos.Select(bi => new BitmapEntry(bi)));
            }

            SelectedBitmap    = Bitmaps?.FirstOrDefault();
            SelectedZoomLevel = 1;
        }
Beispiel #20
0
        public TextForm(KoreFileInfo kfi, TabPage tabPage, IArchiveAdapter parentAdapter, TabPage parentTabPage, IList <IGameAdapter> gameAdapters)
        {
            InitializeComponent();

            Kfi = kfi;

            _currentTab    = tabPage;
            _parentTab     = parentTabPage;
            _parentAdapter = parentAdapter;

            LoadGameAdapters(gameAdapters);
            LoadEntries(_textAdapter.Entries);

            UpdatePreview();
            UpdateForm();
        }
Beispiel #21
0
        public void WriteSettings()
        {
            _currentTest = Path.Combine(CurrentWorkingFolder, "test5");

            EnsureFolderExists(_currentTest);

            _settingsManager.Data.SyncPairs.Add(new SyncPair {
                Source = _currentTest, Destination = _currentTest
            });

            var settingsFile = new KoreFileInfo(Path.Combine(_currentTest, "settings.bin"));

            _kontrol.WriteSettings(settingsFile);

            Assert.IsTrue(settingsFile.Exists);
        }
Beispiel #22
0
        private TabPage GetTabPageForKfi(KoreFileInfo kfi)
        {
            if (kfi == null)
            {
                return(null);
            }

            foreach (TabPage page in openFiles.TabPages)
            {
                if (page.Controls[0] is IKuriimuForm kuriimuForm)
                {
                    if (kuriimuForm.Kfi == kfi)
                    {
                        return(page);
                    }
                }
            }

            return(null);
        }
Beispiel #23
0
        public void CopyANewerDestinationFile()
        {
            SetupCurrentTestFolder("test-newer-destination-file");

            var now = DateTime.Now;

            var sourceFileInfo = new KoreFileInfo(Path.Combine(_sourceFolder, _primaryTestFileName));

            sourceFileInfo.EnsureExists();
            sourceFileInfo.LastWriteTime = now.AddSeconds(-1);

            var destinationFileInfo = new KoreFileInfo(Path.Combine(_destinationFolder, _primaryTestFileName));

            destinationFileInfo.EnsureExists();
            destinationFileInfo.LastWriteTime = now;

            _kontrol.Sync();

            Assert.AreEqual(now, sourceFileInfo.LastWriteTime);
        }
Beispiel #24
0
        public ArchiveForm(KoreFileInfo kfi, TabPage tabPage, IArchiveAdapter parentAdapter, TabPage parentTabPage, string tempFolder, PluginLoader pluginLoader)
        {
            InitializeComponent();

            // Overwrite window themes
            //Win32.SetWindowTheme(treDirectories.Handle, "explorer", null);
            //Win32.SetWindowTheme(lstFiles.Handle, "explorer", null);

            // Populate image list
            imlFiles.Images.Add("tree-directory", Resources.tree_directory);
            imlFiles.Images.Add("tree-directory-open", Resources.tree_directory_open);
            imlFiles.Images.Add("tree-text-file", Resources.tree_text_file);
            imlFiles.Images.Add("tree-image-file", Resources.tree_image_file);
            imlFiles.Images.Add("tree-archive-file", Resources.tree_archive_file);
            imlFilesLarge.Images.Add("tree-directory", Resources.tree_directory_32);
            imlFilesLarge.Images.Add("tree-directory-open", Resources.tree_directory_open);
            imlFilesLarge.Images.Add("tree-text-file", Resources.tree_text_file_32);
            imlFilesLarge.Images.Add("tree-image-file", Resources.tree_image_file_32);
            imlFilesLarge.Images.Add("tree-archive-file", Resources.tree_archive_file_32);

            Kfi = kfi;
            Kfi.PropertyChanged += Kfi_PropertyChanged;

            _currentTab = tabPage;
            _parentTab  = parentTabPage;

            _tempFolder = tempFolder;
            _subFolder  = Guid.NewGuid().ToString();
            _childTabs  = new List <TabPage>();

            _pluginLoader = pluginLoader;

            if (!Directory.Exists(Path.Combine(tempFolder, _subFolder)))
            {
                Directory.CreateDirectory(Path.Combine(tempFolder, _subFolder));
            }

            LoadDirectories();
            UpdateForm();
        }
Beispiel #25
0
        public void MakeScanInformationAvailable()
        {
            SetupCurrentTestFolder("test-scan-info");

            var now = DateTime.Now;

            var sourceFileInfo = new KoreFileInfo(Path.Combine(_sourceFolder, _primaryTestFileName));

            sourceFileInfo.EnsureExists();
            sourceFileInfo.LastWriteTime = now;

            var destinationFileInfo = new KoreFileInfo(Path.Combine(_destinationFolder, _primaryTestFileName));

            destinationFileInfo.EnsureExists();
            destinationFileInfo.LastWriteTime = now.AddSeconds(-1);

            _kontrol.Sync();

            Assert.AreEqual(1u, _kontrol.SyncInfo.SourceFiles);
            Assert.AreEqual(1u, _kontrol.SyncInfo.DestinationFiles);
            Assert.AreEqual(SyncStatus.Complete, _kontrol.SyncInfo.Status);
        }
Beispiel #26
0
        private void CloseOpenTabs(KoreFileInfo kfi)
        {
            if (kfi.ChildKfi != null)
            {
                foreach (var child in kfi.ChildKfi)
                {
                    CloseOpenTabs(child);
                }
            }

            foreach (TabPage page in openFiles.TabPages)
            {
                if (page.Controls[0] is IKuriimuForm kuriimuForm)
                {
                    if (kuriimuForm.Kfi == kfi)
                    {
                        openFiles.TabPages.Remove(page);
                        break;
                    }
                }
            }
        }
Beispiel #27
0
        public ImageForm(KoreFileInfo kfi, TabPage tabPage, IArchiveAdapter parentAdapter, TabPage parentTabPage)
        {
            InitializeComponent();

            Kfi            = kfi;
            _currentTab    = tabPage;
            _parentTab     = parentTabPage;
            _parentAdapter = parentAdapter;

            try
            {
                if (_imageAdapter.BitmapInfos == null)
                {
                    throw new ArgumentNullException(nameof(_imageAdapter.BitmapInfos));
                }
                if (_imageAdapter.ImageEncodingInfos == null)
                {
                    throw new ArgumentNullException(nameof(_imageAdapter.ImageEncodingInfos));
                }
                if (_imageAdapter is IIndexedImageAdapter indexAdapter)
                {
                    if (indexAdapter.PaletteEncodingInfos == null)
                    {
                        throw new ArgumentNullException(nameof(indexAdapter.PaletteEncodingInfos));
                    }
                }
            }
            catch
            {
                throw new InvalidOperationException($"The plugin missed to implement a property.");
            }

            _bestBitmaps = _imageAdapter.BitmapInfos.Select(x => (Bitmap)x.Image.Clone()).ToArray();

            imbPreview.Image = _imageAdapter.BitmapInfos.FirstOrDefault()?.Image;

            // Populate format dropdown
            tsbFormat.DropDownItems.AddRange(_imageAdapter.ImageEncodingInfos?.Select(f => new ToolStripMenuItem {
                Text = f.EncodingName, Tag = f, Checked = f.EncodingIndex == _selectedBitmapInfo.ImageEncoding.EncodingIndex
            }).ToArray());
            if (tsbFormat.DropDownItems.Count > 0)
            {
                foreach (var tsb in tsbFormat.DropDownItems)
                {
                    ((ToolStripMenuItem)tsb).Click += tsbFormat_Click;
                }
            }

            // populate palette format dropdown
            if (_imageAdapter is IIndexedImageAdapter indexAdapter2 && _selectedBitmapInfo is IndexedBitmapInfo indexInfo)
            {
                tsbPalette.DropDownItems.AddRange(indexAdapter2.PaletteEncodingInfos?.Select(f => new ToolStripMenuItem {
                    Text = f.EncodingName, Tag = f, Checked = f.EncodingIndex == indexInfo.PaletteEncoding.EncodingIndex
                }).ToArray());
                if (tsbPalette.DropDownItems.Count > 0)
                {
                    foreach (var tsb in tsbPalette.DropDownItems)
                    {
                        ((ToolStripMenuItem)tsb).Click += tsbPalette_Click;
                    }
                }
            }

            tsbImageBorderStyle.DropDownItems.AddRange(Enum.GetNames(typeof(ImageBoxBorderStyle)).Select(s => new ToolStripMenuItem {
                Image = (Image)Resources.ResourceManager.GetObject(_stylesImages[s]), Text = _stylesText[s], Tag = s
            }).ToArray());
            foreach (var tsb in tsbImageBorderStyle.DropDownItems)
            {
                ((ToolStripMenuItem)tsb).Click += tsbImageBorderStyle_Click;
            }

            UpdateForm();
            UpdatePreview();
            UpdateImageList();
        }
Beispiel #28
0
        // TODO: We want to somehow reflect these names and also possibly return a class holding the Type and a DisplayName vs. the plain interface name.

        /// <summary>
        /// Load a file using Kore.
        /// </summary>
        /// <param name="kli"></param>
        /// <returns></returns>
        public KoreFileInfo LoadFile(KoreLoadInfo kli)
        {
            if (kli.Adapter == null)
            {
                // Select adapter automatically and if failed select it manually
                var adapter = SelectAdapter(kli) ?? SelectAdapterManually(kli);

                // If still no adapter was chosen, return
                if (adapter == null)
                {
                    return(null);
                }

                kli.Adapter = adapter;
            }

            // Instantiate a new instance of the adapter
            // ReSharper disable once SuspiciousTypeConversion.Global
            kli.Adapter = _pluginLoader.CreateNewAdapter <ILoadFiles>((IPlugin)kli.Adapter);

            // Load files(s)
            // TODO: Make KLI contain a StreamInfo of the given file
            kli.FileData.Position = 0;
            var streamInfo = new StreamInfo
            {
                FileData = kli.FileData,
                FileName = kli.FileName
            };

            try
            {
                // TODO: Subject to remove
                kli.Adapter.LeaveOpen = kli.LeaveOpen;
                // Try to load the file via adapter
                kli.Adapter.Load(streamInfo, kli.FileSystem);
            }
            catch (Exception ex)
            {
                // Catch any exception thrown by the plugin and expose it
                var pi  = _pluginLoader.GetMetadata <PluginInfoAttribute>(kli.Adapter);
                var msg = $"The {pi?.Name} plugin failed to load \"{Path.GetFileName(kli.FileName)}\".";
                throw new LoadFileException(msg, ex);
            }

            // TODO: Subject to remove
            // Check if the stream still follows the LeaveOpen restriction
            if (!kli.FileData.CanRead && kli.LeaveOpen)
            {
                throw new InvalidOperationException($"Plugin with ID {_pluginLoader.GetMetadata<PluginInfoAttribute>(kli.Adapter).ID} closed the streams while loading the file.");
            }

            // Create a KoreFileInfo to keep track of the now open file.
            var kfi = new KoreFileInfo
            {
                StreamFileInfo = streamInfo,
                HasChanges     = false,
                Adapter        = kli.Adapter
            };

            if (kli.TrackFile)
            {
                OpenFiles.Add(kfi);
            }

            return(kfi);
        }
Beispiel #29
0
        //public void SaveFile(KoreSaveInfo ksi)
        //{
        //    // Save data with the adapter
        //    var guid = Guid.NewGuid().ToString();
        //    var fs = new PhysicalFileSystem(RelativePath.Combine(tempFolder, guid));
        //    if (kfi.Adapter is IMultipleFiles multFileAdapter)
        //        multFileAdapter.FileSystem = fs;
        //    kfi.Adapter.LeaveOpen = false;
        //    var streaminfo = new StreamInfo { FileData = fs.CreateFile(RelativePath.GetFileName(kfi.StreamFileInfo.FileName)), FileName = RelativePath.GetFileName(kfi.StreamFileInfo.FileName) };
        //    (kfi.Adapter as ISaveFiles).Save(streaminfo, ksi.Version);

        //    // Replace files in adapter
        //    if (kfi.ParentKfi != null)
        //    {
        //        var parentArchiveAdapter = kfi.ParentKfi.Adapter as IArchiveAdapter;
        //        RecursiveUpdate(parentArchiveAdapter, fs, RelativePath.Combine(RelativePath.GetFullPath(tempFolder), guid));
        //    }
        //    else
        //    {
        //        // TODO: Implement save if no parent is given
        //        // Get intial directory
        //        var initialDir = RelativePath.GetDirectoryName(ksi.Kfi.FullPath);

        //        // Close current initial file
        //        ksi.Kfi.StreamFileInfo.FileData.Close();

        //        // Close current FileSystem, if set
        //        if (ksi.Kfi is IMultipleFiles multFileAdapter2 && multFileAdapter2.FileSystem != null)
        //            multFileAdapter2.FileSystem.Dispose();

        //        // All open filestreams of the initial file should be closed by now
        //        if (string.IsNullOrEmpty(ksi.NewSaveLocation))
        //        {
        //            // Move saved files to intial location
        //            SaveFileSystem(fs, initialDir);
        //        }
        //        else
        //        {

        //        }

        //        // Reopen
        //    }

        //    // Update archive file states in this level
        //    if (kfi.Adapter is IArchiveAdapter archiveAdapter)
        //        foreach (var afi in archiveAdapter.Files)
        //            afi.State = ArchiveFileState.Archived;

        //    // Update archive file states up the parent tree
        //    if (kfi.ParentKfi != null)
        //        kfi.UpdateState(ArchiveFileState.Replaced);
        //}

        /// <summary>
        /// Closes an open file.
        /// </summary>
        /// <param name="kfi">The file to be closed.</param>
        /// <param name="leaveFileStreamOpen">If the file stream should be left open.</param>
        /// <returns>True if file was closed, False otherwise.</returns>
        public bool CloseFile(KoreFileInfo kfi, bool leaveFileStreamOpen = false)
        {
            return(CloseFile(kfi, leaveFileStreamOpen, true));
        }
Beispiel #30
0
 public CloseTabEventArgs(KoreFileInfo kfi)
 {
     Kfi = kfi;
 }