예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="combi"></param>
        /// <param name="clearAfterCopy"></param>
        /// <returns></returns>
        public IClipBoardCombi CopyCombiToClipBoard(ICombi combi, bool clearAfterCopy)
        {
            // Copy combi.
            IClipBoardCombi clipBoardCombi = null;

            if (combi.PcgRoot.Content != null)
            {
                clipBoardCombi = new ClipBoardCombi(combi);
                Combis.CopiedPatches.Add(clipBoardCombi);

                if (clearAfterCopy)
                {
                    combi.Clear();
                }

                // Copy references (timbres).
                if (!CutPasteSelected)
                {
                    foreach (var timbre in combi.Timbres.TimbresCollection)
                    {
                        CopyTimbreOfCombiToClipboard(timbre, clipBoardCombi);
                    }
                }
            }

            return(clipBoardCombi);
        }
예제 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="clipBoardPatches"></param>
        private void FixPasteProgramReferencesInCombis(IEnumerable <IClipBoardPatch> clipBoardPatches)
        {
            foreach (IClipBoardPatch program in clipBoardPatches)
            {
                foreach (IClipBoardPatch clipBoardPatch in Combis.CopiedPatches)
                {
                    IClipBoardCombi combi = (IClipBoardCombi)clipBoardPatch;
                    for (int timbreIndex = 0; timbreIndex < combi.References.CopiedPatches.Count; timbreIndex++)
                    {
                        IClipBoardPatch timbre = combi.References.CopiedPatches[timbreIndex];
                        if (timbre != program)
                        {
                            continue;
                        }

                        // Program used by timbre in combi.
                        if ((program.PasteDestination != null) && (combi.PasteDestination != null))
                        {
                            // When pasting to the same file, then it is not wanted to fix references,
                            // because a duplicate program/combi can exist before the original reference
                            // so it will be changed unnecessarily.
                            if (program.OriginalLocation.Root != PastePcgMemory)
                            {
                                ((ICombi)(combi.PasteDestination)).Timbres.TimbresCollection[timbreIndex].UsedProgram =
                                    (IProgram)program.PasteDestination;
                            }
                            combi.References.CopiedPatches[timbreIndex] = null; // Prevent fixing it again
                        }
                    }
                }
            }
        }
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="timbre"></param>
        /// <param name="clipBoardCombi"></param>
        private void CopyTimbreOfCombiToClipboard(ITimbre timbre, IClipBoardCombi clipBoardCombi)
        {
            IClipBoardProgram clipBoardProgramToAdd = null;
            var usedProgramBank = timbre.UsedProgramBank;
            var usedProgram     = (usedProgramBank == null) ? null : timbre.UsedProgram;

            if (ShouldTimbreBeCopied(timbre, usedProgramBank, usedProgram))
            {
                clipBoardProgramToAdd = FindProgram(usedProgram) as IClipBoardProgram ??
                                        CopyProgramToClipBoard(usedProgram, false);
            }

            clipBoardCombi.References.CopiedPatches.Add(clipBoardProgramToAdd);
        }