From 5793aea40435fdf0c7168f4ad9da0b5b26bce117 Mon Sep 17 00:00:00 2001 From: alcexhim Date: Mon, 31 Aug 2015 16:14:36 -0400 Subject: [PATCH] UEv5 branch with emphasis on cross-platform UEPackage definitions --- .../UniversalEditor.Bootstrapper/App.config | 8 + .../UniversalEditor.Bootstrapper/Program.cs | 51 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../Properties/Resources.resources | Bin 0 -> 180 bytes .../Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + .../UniversalEditor.Bootstrapper.csproj | 95 + .../metro-mainicon.ico | Bin 0 -> 44367 bytes .../App.config | 8 + .../Program.cs | 33 + .../Properties/AssemblyInfo.cs | 36 + ...UniversalEditor.ConsoleBootstrapper.csproj | 73 + .../console.ico | Bin 0 -> 25214 bytes .../console.png | Bin 0 -> 272 bytes .../metro-mainicon.ico | Bin 0 -> 44367 bytes .../Associations/Chunked.xml | 38 + .../Associations/DataLink.xml | 26 + .../Associations/Executable.xml | 85 + .../Associations/FileSystem.xml | 35 + .../Associations/FormattedText.xml | 26 + .../Associations/Markup.xml | 47 + .../Associations/PropertyList.xml | 110 + .../Associations/SecurityCertificate.xml | 40 + .../Associations/Shortcut.xml | 41 + .../Branding/MainIcon.ico | Bin 0 -> 77123 bytes .../Branding/SplashScreen.png | Bin 0 -> 4774 bytes .../Configuration/Application.upl | Bin 0 -> 68 bytes .../Configuration/Application.xml | 14 + .../Configuration/CommandBars.xml | 24 + .../Configuration/Commands.xml | 354 + .../Configuration/MainMenu.xml | 16 + .../Configuration/ObjectModels.xml | 14 + .../Configuration/SplashScreen.upl | Bin 0 -> 47 bytes .../Configuration/StartPage.xml | 29 + .../Images/Commands/mnuDebugBreak.png | Bin 0 -> 314 bytes .../Images/Commands/mnuDebugStart.png | Bin 0 -> 370 bytes .../Images/Commands/mnuDebugStop.png | Bin 0 -> 412 bytes .../ImageList/16x16/IcarusCommandAffect.png | Bin 0 -> 262 bytes .../ImageList/16x16/IcarusCommandCamera.png | Bin 0 -> 265 bytes .../16x16/IcarusCommandControlFlowDo.png | Bin 0 -> 223 bytes .../16x16/IcarusCommandControlFlowDoWait.png | Bin 0 -> 225 bytes .../16x16/IcarusCommandControlFlowWait.png | Bin 0 -> 223 bytes .../ImageList/16x16/IcarusCommandDeclare.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandElse.png | Bin 0 -> 226 bytes .../ImageList/16x16/IcarusCommandFlush.png | Bin 0 -> 240 bytes .../ImageList/16x16/IcarusCommandFree.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandIf.png | Bin 0 -> 226 bytes .../ImageList/16x16/IcarusCommandKill.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandLoop.png | Bin 0 -> 266 bytes .../ImageList/16x16/IcarusCommandMove.png | Bin 0 -> 256 bytes .../ImageList/16x16/IcarusCommandPlay.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandPrint.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandRem.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandRemove.png | Bin 0 -> 279 bytes .../ImageList/16x16/IcarusCommandRotate.png | Bin 0 -> 302 bytes .../ImageList/16x16/IcarusCommandRun.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandSet.png | Bin 0 -> 218 bytes .../ImageList/16x16/IcarusCommandSignal.png | Bin 0 -> 249 bytes .../ImageList/16x16/IcarusCommandSound.png | Bin 0 -> 242 bytes .../ImageList/16x16/IcarusCommandTask.png | Bin 0 -> 262 bytes .../ImageList/16x16/IcarusCommandTemplate.png | Bin 0 -> 211 bytes .../ImageList/16x16/IcarusCommandUse.png | Bin 0 -> 309 bytes .../ImageList/16x16/IcarusCommandWait.png | Bin 0 -> 256 bytes .../16x16/IcarusCommandWaitSignal.png | Bin 0 -> 234 bytes .../Images/Attribute.png | Bin 0 -> 189 bytes .../Images/Comment.png | Bin 0 -> 214 bytes .../Images/Entity.png | Bin 0 -> 528 bytes .../Images/Preprocessor.png | Bin 0 -> 386 bytes .../Images/Tag.png | Bin 0 -> 316 bytes .../Images/ImageList/16x16/Message.png | Bin 0 -> 643 bytes .../Images/ImageList/16x16/Service.png | Bin 0 -> 837 bytes .../Images/ImageList/32x32/Message.png | Bin 0 -> 741 bytes .../Images/ImageList/32x32/Service.png | Bin 0 -> 976 bytes .../Commands.xml | 11 + .../KeyBindings.xml | 11 + .../AddressBook/Associations/Contact.xml | 35 + .../Associations/Concert/AniMikuConcert.xml | 25 + .../FileSystem/AniMikuTexturePackage.xml | 20 + .../AniMiku/Associations/Model/AniMikuPMD.xml | 20 + .../AniMiku/Associations/Model/InivisAC3D.xml | 25 + .../AniMiku/Associations/Model/Super6.xml | 25 + .../Associations/Motion/AniMikuMotion.xml | 25 + .../Associations/Playlist/ASX.xml | 25 + .../Associations/Playlist/CompactDisc.xml | 27 + .../Associations/Playlist/HTML.xml | 25 + .../Associations/Playlist/M3U.xml | 26 + .../Associations/Playlist/Notepad++.xml | 25 + .../Associations/Playlist/PLS.xml | 25 + .../Associations/Playlist/SMIL.xml | 28 + .../Associations/Playlist/XSPF.xml | 25 + .../Associations/Project/LMMS.xml | 35 + .../Associations/SynthesizedAudio/MIDI.xml | 26 + .../SynthesizedAudio/MusicXML.xml | 20 + .../Associations/SynthesizedAudio/NIFF.xml | 27 + .../Associations/SynthesizedAudio/UST.xml | 20 + .../SynthesizedAudio/Vocaloid.xml | 35 + .../Associations/SynthesizedAudio/XMI.xml | 27 + .../Associations/Voicebank/DirectWave.xml | 25 + .../Associations/Voicebank/Vocaloid.xml | 29 + .../Associations/VoicebankIndex/Vocaloid.xml | 26 + .../WaveformAudio/AdvancedAudioCodec.xml | 20 + .../Associations/WaveformAudio/FLAC.xml | 28 + .../WaveformAudio/MPEG2Layer3.xml | 27 + .../WaveformAudio/MPEG4Part14.xml | 39 + .../WaveformAudio/MicrosoftWave.xml | 33 + .../WaveformAudio/MonkeysAudio.xml | 35 + .../Associations/WaveformAudio/Ogg.xml | 23 + .../WaveformAudio/PropellerheadRecycle.xml | 28 + .../Associations/WaveformAudio/RealAudio.xml | 25 + .../WaveformAudio/ShortenAudio.xml | 20 + .../Associations/WaveformAudio/SunAU.xml | 25 + .../Associations/WaveformAudio/WavPack.xml | 20 + .../Associations/TextureFont/TextureFont.xml | 25 + .../Associations/Concert/Concert.xml | 35 + .../Associations/Library/LibraryXML.xml | 20 + .../Associations/Model/ConcertroidMDL.xml | 20 + .../16x16/Database Project.png | Bin 0 -> 366 bytes .../32x32/Database Project.png | Bin 0 -> 657 bytes .../FileSystem/Associations/7Zip.xml | 26 + .../FileSystem/Associations/ALTools.xml | 46 + .../Extensions/FileSystem/Associations/AR.xml | 26 + .../FileSystem/Associations/ARC.xml | 25 + .../FileSystem/Associations/ARJ.xml | 25 + .../Associations/Apple/HFS/HFSDataFormat.xml | 28 + .../FileSystem/Associations/Archive.xml | 29 + .../FileSystem/Associations/BPlus.xml | 22 + .../FileSystem/Associations/BinHex.xml | 25 + .../FileSystem/Associations/CFL.xml | 25 + .../FileSystem/Associations/CPIO.xml | 34 + .../FileSystem/Associations/FAT.xml | 35 + .../FileSystem/Associations/ISO9660.xml | 20 + .../FileSystem/Associations/IZArc.xml | 29 + .../Associations/InstallShield/Cabinet.xml | 45 + .../Associations/InstallShield/Z.xml | 25 + .../FileSystem/Associations/LHA.xml | 20 + .../Associations/Microsoft/Cabinet.xml | 25 + .../Microsoft/CompoundDocument.xml | 25 + .../Associations/Microsoft/MSCompressed.xml | 34 + .../Associations/Microsoft/WindowsImage.xml | 26 + .../FileSystem/Associations/NeroDiscImage.xml | 28 + .../FileSystem/Associations/PKZip.xml | 34 + .../FileSystem/Associations/REEVEsoft.xml | 25 + .../FileSystem/Associations/SPIS.xml | 26 + .../FileSystem/Associations/StudioALCE.xml | 25 + .../FileSystem/Associations/StuffIt.xml | 25 + .../FileSystem/Associations/TapeArchive.xml | 31 + .../FileSystem/Associations/UUEncoding.xml | 25 + .../FileSystem/Associations/WinACE.xml | 26 + .../FileSystem/Associations/WinRAR.xml | 25 + .../Associations/YamazakiZipper.xml | 25 + .../FileSystem/Associations/ZipTVBlakHole.xml | 25 + .../AudioCollection/Synthesized/SPC2.xml | 26 + .../Associations/Cyberlore/Cyberlore.xml | 40 + .../GameDeveloper/Associations/Descent.xml | 41 + .../Associations/FileSystem/187RideOrDie.xml | 20 + .../Associations/FileSystem/2NBFPCK.xml | 25 + .../Associations/FileSystem/Abomination.xml | 40 + .../FileSystem/AlienNationsGD.xml | 20 + .../Associations/FileSystem/AquarnoidGOB.xml | 25 + .../Associations/FileSystem/Arcanum.xml | 20 + .../FileSystem/BurikoGeneralInterpreter.xml | 45 + .../FileSystem/ChaosWorksEngine.xml | 25 + .../FileSystem/CompressedHunks.xml | 25 + .../Associations/FileSystem/DoomWAD.xml | 28 + .../Associations/FileSystem/DreamfallPAK.xml | 25 + .../FileSystem/DynamixStarsiegeVOL.xml | 25 + .../Associations/FileSystem/Eighting.xml | 25 + .../FileSystem/ElectronicArtsBIGF.xml | 36 + .../Associations/FileSystem/FMODSoundBank.xml | 25 + .../Associations/FileSystem/GainaxLBX.xml | 20 + .../FileSystem/GameProgrammersWiki.xml | 27 + .../Associations/FileSystem/GarenaYanghx.xml | 25 + .../Associations/FileSystem/GotDGCD.xml | 20 + .../GremlinInteractiveActuaSoccerMAD.xml | 20 + .../Associations/FileSystem/Hardball.xml | 26 + .../FileSystem/HeroesOfThePacific.xml | 25 + .../FileSystem/HighwayPursuit.xml | 30 + .../Associations/FileSystem/Homeworld.xml | 29 + .../Associations/FileSystem/HostileWaters.xml | 25 + .../FileSystem/HostileWatersDAT.xml | 20 + .../FileSystem/HoyleCasino99PRF.xml | 26 + .../Associations/FileSystem/HyPack.xml | 25 + .../FileSystem/IllusionGamesPP.xml | 20 + .../FileSystem/IndianaJonesGOB.xml | 25 + .../FileSystem/JackOrlandoPAK.xml | 27 + .../Associations/FileSystem/JadeEmpire.xml | 25 + .../Associations/FileSystem/KensLabyrinth.xml | 20 + .../Associations/FileSystem/Kronosaur.xml | 20 + .../FileSystem/MementoMoriRES.xml | 25 + .../Associations/FileSystem/MoPaQ.xml | 25 + .../FileSystem/MoeroDownhillNightPKD.xml | 25 + .../Associations/FileSystem/N2M-CTAR.xml | 25 + .../Associations/FileSystem/NScripter.xml | 20 + .../Associations/FileSystem/NamcoTales.xml | 25 + .../Nintendo/Optical/NintendoOpticalDisc.xml | 20 + .../Associations/FileSystem/NvidiaNPK.xml | 25 + .../FileSystem/PlayStation/PKG.xml | 26 + .../FileSystem/PrincessWaltzARC.xml | 20 + .../FileSystem/RoxorInTheGroove.xml | 25 + .../FileSystem/SecretFilesTunguska.xml | 25 + .../Associations/FileSystem/SegaFARC.xml | 31 + .../Associations/FileSystem/SinisterGames.xml | 20 + .../FileSystem/StellaGamesLzmaPack.xml | 20 + .../FileSystem/TerminalRealityPOD.xml | 20 + .../FileSystem/TheLearningCompany.xml | 25 + .../Associations/FileSystem/TropicoHPK.xml | 28 + .../FileSystem/ValveGameCacheFile.xml | 25 + .../IcarusBinaryDataFormatAssociation.xml | 26 + .../IcarusTextDataFormatAssociation.xml | 20 + .../Multimedia3D/Model/AvalancheVBUF.xml | 20 + .../Multimedia3D/Model/HalfLife2SMD.xml | 25 + .../Multimedia3D/Model/IDSoftware.xml | 65 + .../Multimedia3D/Model/SegaAuth3D.xml | 45 + .../Multimedia3D/Model/ShaiyaOnline3DC.xml | 20 + .../Multimedia3D/Model/UltimateStuntsGLB.xml | 25 + .../Multimedia3D/Scene/IDSoftware.xml | 25 + .../NewWorldComputing/NWCCampaign.xml | 25 + .../NewWorldComputing/NWCFileSystem.xml | 85 + .../NewWorldComputing/NWCFont.xml | 20 + .../NewWorldComputing/NWCGameSave.xml | 20 + .../Associations/NewWorldComputing/NWCMap.xml | 74 + .../NewWorldComputing/NWCPalette.xml | 20 + .../NewWorldComputing/NWCPicture.xml | 36 + .../NewWorldComputing/NWCResourceBIN.xml | 20 + .../NewWorldComputing/NWCSound.xml | 20 + .../GameDeveloper/Associations/Nintendo.xml | 25 + .../Associations/Picture/AvalancheTBODY.xml | 20 + .../Picture/BurikoGeneralInterpreter.xml | 26 + .../Associations/Picture/ChaosWorksSprite.xml | 25 + .../Associations/Picture/GIM.xml | 28 + .../ReflexiveEntertainment/FRM16.xml | 25 + .../Associations/SynthesizedAudio/PSF.xml | 25 + .../Associations/SynthesizedAudio/SPC.xml | 25 + .../UnrealPackage/UnrealPackage.xml | 27 + .../Associations/UnrealPackage/UnrealUMOD.xml | 25 + .../Associations/Video/IdROQ.xml | 25 + .../Video/NintendoGameCubeTHP.xml | 26 + .../Associations/Video/RADTools.xml | 45 + .../Associations/WaveformAudio/BRSTM.xml | 30 + .../Associations/WaveformAudio/OSLib.xml | 25 + ...{94E32BE3-D458-4786-A7E0-59DE5F769CDC}.xml | 27 + .../Palette/Adobe/ACOColorPalette.xml | 25 + .../Palette/Adobe/AdobeSwatchExchange.xml | 25 + .../Associations/Palette/GIMPColorPalette.xml | 25 + .../Associations/Palette/JASCPaintShopPro.xml | 25 + .../Associations/Picture/ARGB.xml | 25 + .../Picture/DirectDrawSurface.xml | 25 + .../Picture/GraphicsInterchange.xml | 28 + .../Associations/Picture/I16.xml | 20 + .../Associations/Picture/JPEG.xml | 22 + .../Associations/Picture/LEADToolsImage.xml | 25 + .../Picture/PortableAnyMapImage.xml | 43 + .../Picture/PortableNetworkGraphics.xml | 27 + .../Associations/Picture/TMH.xml | 25 + .../Associations/Picture/TrueVisionTarga.xml | 20 + .../Picture/WaveletScalarQuantization.xml | 25 + .../Associations/Picture/WebP.xml | 27 + .../Associations/Picture/WindowsBitmap.xml | 61 + .../Associations/Picture/WindowsCursor.xml | 25 + .../Associations/Picture/WindowsIcon.xml | 33 + .../Picture/WindowsPaintbrushPicture.xml | 28 + .../VectorImage/ExpressionDesign.xml | 26 + .../Accessory/PolygonMovieMaker.xml | 20 + .../Associations/Accessory/QAvimator.xml | 20 + .../Associations/Model/Blender.xml | 20 + .../Associations/Model/InivisAC3D.xml | 25 + .../Associations/Model/Metasequoia.xml | 20 + .../Associations/Model/PolygonMovieMaker.xml | 60 + .../Associations/Model/Super6.xml | 25 + .../Associations/Model/ThreeDStudioMax.xml | 20 + .../Associations/Model/TriangleEditor.xml | 26 + .../Associations/Model/WavefrontOBJ.xml | 20 + .../Motion/BiovisionHierarchy.xml | 35 + .../Associations/Motion/PolygonMovieMaker.xml | 55 + .../Associations/Pose/PolygonMovieMaker.xml | 25 + .../Associations/Scene/Cinema4D.xml | 20 + .../Associations/Scene/PolygonMovieMaker.xml | 35 + .../FileSystem/ImageCollection.xml | 20 + .../Associations/FileSystem/InivisAC3D.xml | 25 + .../Associations/FileSystem/OmpSkin.xml | 25 + .../Moosta/Associations/FileSystem/Super6.xml | 25 + .../Moosta/Associations/Model/Mcha.xml | 25 + .../Associations/MotionPackage/MoPkg.xml | 25 + .../Associations/ATRDataFormat.xml | 20 + .../Associations/BALDataFormat.xml | 20 + .../Associations/RSCDataFormat.xml | 20 + .../Associations/Fixture/QLCFixture.xml | 20 + .../Associations/Michelangelo.xml | 20 + .../Associations/CodeObjectModel/Ada.xml | 20 + .../Associations/CodeObjectModel/Boo.xml | 20 + .../Associations/CodeObjectModel/COBOL.xml | 22 + .../Associations/CodeObjectModel/CSharp.xml | 20 + .../Associations/CodeObjectModel/FORTRAN.xml | 21 + .../Associations/CodeObjectModel/FSharp.xml | 20 + .../Associations/CodeObjectModel/Go.xml | 20 + .../Associations/CodeObjectModel/Java.xml | 25 + .../CodeObjectModel/VisualBasicNET.xml | 20 + .../ExecutableObjectModel/ELF.xml | 26 + .../Associations/Project/VisualStudio.xml | 28 + .../PropertyList/VisualStudio.xml | 20 + .../Associations/Solution/VisualStudio.xml | 26 + ...{8891C1AE-6699-45DA-8B22-13BCEBB63364}.xml | 77 + ...{F184B08F-C81C-45F6-A57F-5ABD9991F28F}.xml | 46 + ...{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.xml | 42 + .../Adobe/AIR/Basic Project.xml | 28 + .../Adobe/AIR/Images/Application_16x16.png | Bin 0 -> 702 bytes .../Adobe/AIR/Images/Application_32x32.png | Bin 0 -> 1408 bytes .../Arduino/BlankProject.xml | 34 + .../Software Development/Arduino/Blink.xml | 55 + .../Arduino/Images/Blank.ico | Bin 0 -> 4406 bytes .../Arduino/Images/Blank_16x16.png | Bin 0 -> 728 bytes .../Arduino/Images/Blank_32x32.png | Bin 0 -> 1544 bytes .../Arduino/Images/Blink.ico | Bin 0 -> 5430 bytes .../Arduino/Images/Blink.xcf | Bin 0 -> 4564 bytes .../Arduino/Images/Blink_16x16.png | Bin 0 -> 811 bytes .../Arduino/Images/Blink_32x32.png | Bin 0 -> 1832 bytes .../C/GTK+ Application.xml | 61 + .../COBOL/Class Library.xml | 37 + .../COBOL/Console Application.xml | 43 + .../COBOL/Database.xml | 64 + .../COBOL/Images/Application_16x16.png | Bin 0 -> 770 bytes .../COBOL/Images/Application_32x32.png | Bin 0 -> 1521 bytes .../COBOL/Images/Blank_16x16.png | Bin 0 -> 651 bytes .../COBOL/Images/Blank_32x32.png | Bin 0 -> 1178 bytes .../COBOL/Images/COBOL.xcf | Bin 0 -> 13945 bytes .../COBOL/Images/Console_16x16.png | Bin 0 -> 818 bytes .../COBOL/Images/Console_32x32.png | Bin 0 -> 1629 bytes .../COBOL/Images/ControlLibrary_16x16.png | Bin 0 -> 780 bytes .../COBOL/Images/ControlLibrary_32x32.png | Bin 0 -> 1504 bytes .../COBOL/Images/Database_16x16.png | Bin 0 -> 808 bytes .../COBOL/Images/Database_32x32.png | Bin 0 -> 1787 bytes .../COBOL/Images/Library_16x16.png | Bin 0 -> 791 bytes .../COBOL/Images/Library_32x32.png | Bin 0 -> 1686 bytes .../COBOL/Images/Service_16x16.png | Bin 0 -> 804 bytes .../COBOL/Images/Service_32x32.png | Bin 0 -> 1655 bytes .../COBOL/Images/Silverlight_16x16.png | Bin 0 -> 1752 bytes .../COBOL/Images/Silverlight_32x32.png | Bin 0 -> 1752 bytes .../COBOL/Silverlight.xml | 20 + .../COBOL/Windows Forms Application.xml | 20 + .../CSharp/Class Library.xml | 37 + .../CSharp/Console Application.xml | 43 + .../CSharp/Database.xml | 64 + .../CSharp/Images/Application.ico | Bin 0 -> 5430 bytes .../CSharp/Images/Application.xcf | Bin 0 -> 4172 bytes .../CSharp/Images/Application_16x16.png | Bin 0 -> 845 bytes .../CSharp/Images/Application_32x32.png | Bin 0 -> 1260 bytes .../CSharp/Images/Blank.ico | Bin 0 -> 5430 bytes .../CSharp/Images/Blank.xcf | Bin 0 -> 3808 bytes .../CSharp/Images/Blank_16x16.png | Bin 0 -> 726 bytes .../CSharp/Images/Blank_32x32.png | Bin 0 -> 992 bytes .../CSharp/Images/Console.ico | Bin 0 -> 5430 bytes .../CSharp/Images/Console.xcf | Bin 0 -> 4530 bytes .../CSharp/Images/Console_16x16.png | Bin 0 -> 958 bytes .../CSharp/Images/Console_32x32.png | Bin 0 -> 1525 bytes .../CSharp/Images/ControlLibrary_16x16.png | Bin 0 -> 853 bytes .../CSharp/Images/ControlLibrary_32x32.png | Bin 0 -> 1738 bytes .../CSharp/Images/Database_16x16.png | Bin 0 -> 905 bytes .../CSharp/Images/Database_32x32.png | Bin 0 -> 1996 bytes .../CSharp/Images/Library.ico | Bin 0 -> 5430 bytes .../CSharp/Images/Library.xcf | Bin 0 -> 4172 bytes .../CSharp/Images/Library_16x16.png | Bin 0 -> 836 bytes .../CSharp/Images/Library_32x32.png | Bin 0 -> 1393 bytes .../CSharp/Images/Silverlight_16x16.png | Bin 0 -> 879 bytes .../CSharp/Images/Silverlight_32x32.png | Bin 0 -> 2018 bytes .../CSharp/Images/Test_16x16.png | Bin 0 -> 901 bytes .../CSharp/Images/Test_32x32.png | Bin 0 -> 2017 bytes .../CSharp/Silverlight.xml | 20 + .../CSharp/Windows Forms Application.xml | 154 + .../IronPython/Console Application.xml | 84 + .../IronPython/Images/Application_16x16.png | Bin 0 -> 796 bytes .../IronPython/Images/Application_32x32.png | Bin 0 -> 1691 bytes .../IronPython/Images/Blank_16x16.png | Bin 0 -> 726 bytes .../IronPython/Images/Blank_32x32.png | Bin 0 -> 1404 bytes .../IronPython/Images/Console_16x16.png | Bin 0 -> 904 bytes .../IronPython/Images/Console_32x32.png | Bin 0 -> 1818 bytes .../IronPython/Images/Library_16x16.png | Bin 0 -> 814 bytes .../IronPython/Images/Library_32x32.png | Bin 0 -> 1831 bytes .../IronPython/Native Application.xml | 25 + .../IronPython/Windows Forms Application.xml | 24 + .../JSharp/Console Application.xml | 84 + .../JSharp/Images/Application_16x16.png | Bin 0 -> 851 bytes .../JSharp/Images/Application_32x32.png | Bin 0 -> 1816 bytes .../JSharp/Images/Blank_16x16.png | Bin 0 -> 726 bytes .../JSharp/Images/Blank_32x32.png | Bin 0 -> 1404 bytes .../JSharp/Images/Console_16x16.png | Bin 0 -> 969 bytes .../JSharp/Images/Console_32x32.png | Bin 0 -> 1874 bytes .../JSharp/Images/ControlLibrary_16x16.png | Bin 0 -> 850 bytes .../JSharp/Images/ControlLibrary_32x32.png | Bin 0 -> 1806 bytes .../JSharp/Images/Library_16x16.png | Bin 0 -> 845 bytes .../JSharp/Images/Library_32x32.png | Bin 0 -> 1866 bytes .../JSharp/Windows Forms Application.xml | 155 + .../VisualBasic/Class Library.xml | 35 + .../VisualBasic/Console Application.xml | 40 + .../VisualBasic/Database.xml | 64 + .../VisualBasic/Images/Application_16x16.png | Bin 0 -> 809 bytes .../VisualBasic/Images/Application_32x32.png | Bin 0 -> 1585 bytes .../VisualBasic/Images/Blank_16x16.png | Bin 0 -> 677 bytes .../VisualBasic/Images/Blank_32x32.png | Bin 0 -> 1253 bytes .../VisualBasic/Images/Console_16x16.png | Bin 0 -> 918 bytes .../VisualBasic/Images/Console_32x32.png | Bin 0 -> 1756 bytes .../Images/ControlLibrary_16x16.png | Bin 0 -> 825 bytes .../Images/ControlLibrary_32x32.png | Bin 0 -> 1593 bytes .../VisualBasic/Images/Database_16x16.png | Bin 0 -> 893 bytes .../VisualBasic/Images/Database_32x32.png | Bin 0 -> 1923 bytes .../VisualBasic/Images/Library_16x16.png | Bin 0 -> 822 bytes .../VisualBasic/Images/Library_32x32.png | Bin 0 -> 1735 bytes .../VisualBasic/Images/Service_16x16.png | Bin 0 -> 864 bytes .../VisualBasic/Images/Service_32x32.png | Bin 0 -> 1744 bytes .../Images/SliverlightApplication_16x16.png | Bin 0 -> 845 bytes .../Images/SliverlightApplication_32x32.png | Bin 0 -> 1911 bytes .../VisualBasic/Images/Test_16x16.png | Bin 0 -> 885 bytes .../VisualBasic/Images/Test_32x32.png | Bin 0 -> 1848 bytes .../VisualBasic/Silverlight.xml | 20 + .../VisualBasic/Windows Forms Application.xml | 154 + .../Images/MSOfficeAddin_16x16.png | Bin 0 -> 855 bytes .../Images/MSOfficeAddin_32x32.png | Bin 0 -> 1812 bytes .../Images/UniversalEditorAddin_16x16.png | Bin 0 -> 696 bytes .../Images/UniversalEditorAddin_32x32.png | Bin 0 -> 1276 bytes .../Pascal/Blank Project.xml | 19 + .../Pascal/Class Library.xml | 19 + .../Pascal/Console Application.xml | 19 + .../Pascal/GUI Application.xml | 19 + .../Pascal/Images/Application_16x16.png | Bin 0 -> 2082 bytes .../Pascal/Images/Application_32x32.png | Bin 0 -> 2082 bytes .../Pascal/Images/Blank_16x16.png | Bin 0 -> 865 bytes .../Pascal/Images/Blank_32x32.png | Bin 0 -> 1968 bytes .../Pascal/Images/Console_16x16.png | Bin 0 -> 933 bytes .../Pascal/Images/Console_32x32.png | Bin 0 -> 2217 bytes .../Pascal/Images/Library_16x16.png | Bin 0 -> 903 bytes .../Pascal/Images/Library_32x32.png | Bin 0 -> 2315 bytes .../Visual Basic 6.0/ActiveX Application.xml | 19 + .../Visual Basic 6.0/Blank Project.xml | 19 + .../Visual Basic 6.0/Class Library.xml | 19 + .../Visual Basic 6.0/Control Library.xml | 19 + .../Images/ActiveXApplication_16x16.png | Bin 0 -> 625 bytes .../Images/ActiveXApplication_32x32.png | Bin 0 -> 521 bytes .../Images/Application_16x16.png | Bin 0 -> 639 bytes .../Images/Application_32x32.png | Bin 0 -> 523 bytes .../Images/BlankProject_16x16.png | Bin 0 -> 654 bytes .../Images/BlankProject_32x32.png | Bin 0 -> 589 bytes .../Images/ControlLibrary_16x16.png | Bin 0 -> 661 bytes .../Images/ControlLibrary_32x32.png | Bin 0 -> 460 bytes .../Visual Basic 6.0/Images/Library_16x16.png | Bin 0 -> 558 bytes .../Visual Basic 6.0/Images/Library_32x32.png | Bin 0 -> 455 bytes .../Visual Basic 6.0/Images/Wizard_16x16.png | Bin 0 -> 495 bytes .../Visual Basic 6.0/Images/Wizard_32x32.png | Bin 0 -> 527 bytes .../Visual Basic 6.0/Standard Application.xml | 19 + ...{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.png | Bin 0 -> 533 bytes .../CSharp/16x16/Class Library.png | Bin 0 -> 459 bytes .../CSharp/16x16/Console Application.png | Bin 0 -> 309 bytes .../CSharp/16x16/Empty Project.png | Bin 0 -> 329 bytes .../CSharp/16x16/Server Control.png | Bin 0 -> 663 bytes .../CSharp/16x16/WPF Application.png | Bin 0 -> 324 bytes .../CSharp/16x16/WPF Browser Application.png | Bin 0 -> 625 bytes .../16x16/WPF Custom Control Library.png | Bin 0 -> 368 bytes .../CSharp/16x16/WPF User Control Library.png | Bin 0 -> 454 bytes .../CSharp/16x16/Web Application.png | Bin 0 -> 513 bytes .../CSharp/16x16/Web Site.png | Bin 0 -> 744 bytes .../16x16/Windows Forms Application.png | Bin 0 -> 358 bytes .../16x16/Windows Forms Control Library.png | Bin 0 -> 282 bytes .../CSharp/16x16/Windows Service.png | Bin 0 -> 269 bytes .../CSharp/32x32/Class Library.png | Bin 0 -> 921 bytes .../CSharp/32x32/Console Application.png | Bin 0 -> 667 bytes .../CSharp/32x32/Empty Project.png | Bin 0 -> 732 bytes .../CSharp/32x32/Server Control.png | Bin 0 -> 1298 bytes .../CSharp/32x32/WPF Application.png | Bin 0 -> 698 bytes .../CSharp/32x32/WPF Browser Application.png | Bin 0 -> 1415 bytes .../32x32/WPF Custom Control Library.png | Bin 0 -> 738 bytes .../CSharp/32x32/WPF User Control Library.png | Bin 0 -> 918 bytes .../CSharp/32x32/Web Site.png | Bin 0 -> 1426 bytes .../32x32/Windows Forms Application.png | Bin 0 -> 562 bytes .../32x32/Windows Forms Control Library.png | Bin 0 -> 703 bytes .../CSharp/32x32/Windows Service.png | Bin 0 -> 595 bytes .../FSharp/16x16/Class Library.png | Bin 0 -> 426 bytes .../FSharp/16x16/Console Application.png | Bin 0 -> 296 bytes .../FSharp/16x16/Silverlight Library.png | Bin 0 -> 670 bytes .../FSharp/16x16/Tutorial.png | Bin 0 -> 419 bytes .../FSharp/32x32/Class Library.png | Bin 0 -> 665 bytes .../FSharp/32x32/Console Application.png | Bin 0 -> 450 bytes .../FSharp/32x32/Silverlight Library.png | Bin 0 -> 900 bytes .../FSharp/32x32/Tutorial.png | Bin 0 -> 800 bytes .../Generic/16x16/Extension.png | Bin 0 -> 283 bytes .../Generic/16x16/WPF Toolbox Control.png | Bin 0 -> 348 bytes .../16x16/Windows Forms Toolbox Control.png | Bin 0 -> 288 bytes .../Generic/32x32/Extension.png | Bin 0 -> 305 bytes .../Generic/32x32/WPF Toolbox Control.png | Bin 0 -> 433 bytes .../32x32/Windows Forms Toolbox Control.png | Bin 0 -> 317 bytes .../Associations/Setup/ArkAngles/Catalog.xml | 20 + .../Associations/Setup/ArkAngles/Setup.xml | 20 + .../InstallShield/InstallShieldScript.xml | 67 + .../Setup/Microsoft/ACME/BootstrapScript.xml | 20 + .../RebelSoftware/InstallationPackage.xml | 20 + .../RebelSoftware/InstallationScript.xml | 21 + ...{13A1DBF5-B527-4218-9442-F1D165033AEB}.xml | 11 + .../Associations/BluRay/HDMV.xml | 26 + .../Associations/BluRay/INDX.xml | 26 + .../Associations/BluRay/MOBJ.xml | 26 + .../Associations/BluRay/MPLS.xml | 26 + .../Associations/Subtitle/QuickSub.xml | 25 + .../Associations/Subtitle/SubRip.xml | 20 + .../Associations/Subtitle/SubStationAlpha.xml | 21 + .../Video/AudioVideoInterleaved.xml | 20 + .../Associations/AddressBook.xml | 20 + .../Associations/CascadingStyleSheet.xml | 20 + .../WebsiteDeveloper/Associations/HTML.xml | 22 + .../Associations/MimeHTML.xml | 22 + .../Associations/WebServiceDescription.xml | 20 + ...{A0786B88-2ADB-4C21-ABE8-AA2D79766269}.xml | 11 + ...{AB211699-2C6A-4FCC-97FB-F629B1023277}.xml | 24 + .../Templates/Document/Web/HTMLPage.ico | Bin 0 -> 4150 bytes .../Templates/Document/Web/HTMLPage.xml | 34 + .../Templates/Document/Web/MasterPage.ico | Bin 0 -> 3618 bytes .../Templates/Document/Web/MasterPage.xml | 48 + .../Templates/Document/Web/TravelRequest.xsn | Bin 0 -> 15855 bytes .../Templates/Document/Web/WebForm.ico | Bin 0 -> 4150 bytes .../Templates/Document/Web/WebForm.xml | 49 + .../Templates/Document/Web/WebService.ico | Bin 0 -> 4150 bytes .../Templates/Document/Web/WebService.xml | 68 + .../Templates/Document/Web/WebUserControl.ico | Bin 0 -> 3638 bytes .../Templates/Document/Web/WebUserControl.xml | 35 + .../IronPython/Images/Website_16x16.png | Bin 0 -> 886 bytes .../IronPython/Images/Website_32x32.png | Bin 0 -> 1998 bytes .../IronPython/IronPython Web Project.xml | 28 + .../ColdFusion/ColdFusion Project.xml | 30 + .../ColdFusion/Images/Project.ico | Bin 0 -> 135607 bytes .../ColdFusion/Images/Project.xcf | Bin 0 -> 177376 bytes .../ColdFusion/Images/Project_16x16.png | Bin 0 -> 861 bytes .../ColdFusion/Images/Project_32x32.png | Bin 0 -> 2137 bytes .../Website Development/PHP/MainIcon.ico | Bin 0 -> 5430 bytes .../Website Development/PHP/MainIcon.xcf | Bin 0 -> 4286 bytes .../PHP/MainIcon_16x16.png | Bin 0 -> 892 bytes .../PHP/MainIcon_32x32.png | Bin 0 -> 1877 bytes .../PHP/PHP Web Project.xml | 27 + .../Languages/English.xml | 166 + .../Languages/Japanese.xml | 122 + ...odels.FileSystem.FileSystemObjectModel.xml | 7 + ...s.PropertyList.PropertyListObjectModel.xml | 7 + ...ectModels.Shortcut.ShortcutObjectModel.xml | 7 + ...Models.Text.Plain.PlainTextObjectModel.xml | 7 + .../OptionPanels/Application.xml | 53 + ...{EA90755A-4A5D-4FA4-B676-F7BBD8CF0D84}.xml | 33 + .../Properties/AssemblyInfo.cs | 36 + .../Document/Database/AssetsDatabase.xml | 18 + .../Document/Database/ContactsDatabase.xml | 18 + .../Document/Database/EventsDatabase.xml | 18 + .../Document/Database/FacultyDatabase.xml | 18 + .../Document/Database/IssuesDatabase.xml | 18 + .../Database/MarketingProjectsDatabase.xml | 18 + .../Document/Database/NorthwindDatabase.xml | 18 + .../Document/Database/ProjectsDatabase.xml | 18 + .../Database/SalesPipelineDatabase.xml | 18 + .../Document/Database/StudentsDatabase.xml | 18 + .../Document/Database/TasksDatabase.xml | 18 + .../Templates/Document/Database/database.ico | Bin 0 -> 169086 bytes .../Document/FileSystem/WindowsFileSystem.xml | 63 + .../Document/FileSystem/windows_16x16.png | Bin 0 -> 939 bytes .../Document/FileSystem/windows_32x32.png | Bin 0 -> 2622 bytes .../Document/Form/Asset Tracking.xml | 62 + .../Document/Form/Expense Report.xml | 62 + .../Document/Form/Meeting Agenda.xml | 62 + .../Templates/Document/Form/Status Report.xml | 62 + .../Document/Form/Travel Request.xml | 14 + .../Templates/Document/Form/icon_16x16.png | Bin 0 -> 846 bytes .../Templates/Document/Form/icon_32x32.png | Bin 0 -> 2082 bytes .../Templates/Document/Form/icon_48x48.png | Bin 0 -> 3637 bytes .../Project/AutoDesk/Images/AutoCAD_16x16.png | Bin 0 -> 666 bytes .../Project/AutoDesk/Images/AutoCAD_32x32.png | Bin 0 -> 514 bytes .../AutoDesk/Images/Inventor_16x16.png | Bin 0 -> 672 bytes .../AutoDesk/Images/Inventor_32x32.png | Bin 0 -> 490 bytes .../AutoDesk/Images/NavisWorks_16x16.png | Bin 0 -> 669 bytes .../AutoDesk/Images/NavisWorks_32x32.png | Bin 0 -> 629 bytes .../AutoDesk/Images/RevitManifest_16x16.png | Bin 0 -> 865 bytes .../AutoDesk/Images/RevitManifest_32x32.png | Bin 0 -> 845 bytes .../Project/AutoDesk/Images/Revit_16x16.png | Bin 0 -> 692 bytes .../Project/AutoDesk/Images/Revit_32x32.png | Bin 0 -> 504 bytes .../Project/Concertroid/ConcertProject.xml | 17 + .../Project/Concertroid/Images/Concert.ico | Bin 0 -> 142595 bytes .../Project/Concertroid/Images/Concert.xcf | Bin 0 -> 91701 bytes .../Concertroid/Images/Concert_16x16.png | Bin 0 -> 823 bytes .../Concertroid/Images/Concert_32x32.png | Bin 0 -> 2082 bytes .../Project/Concertroid/Images/Library.ico | Bin 0 -> 155910 bytes .../Project/Concertroid/Images/Library.xcf | Bin 0 -> 173596 bytes .../Concertroid/Images/Library_16x16.png | Bin 0 -> 896 bytes .../Concertroid/Images/Library_32x32.png | Bin 0 -> 2314 bytes .../Project/Concertroid/LibraryProject.xml | 17 + .../File Distribution/EmptyFileSystem.xml | 18 + .../File Distribution/EmptyTorrent.xml | 18 + .../File Distribution/FileSystem_16x16.png | Bin 0 -> 647 bytes .../File Distribution/FileSystem_32x32.png | Bin 0 -> 1473 bytes .../File Distribution/Images/Torrent.ico | Bin 0 -> 124126 bytes .../File Distribution/Images/Torrent.xcf | Bin 0 -> 65889 bytes .../Images/Torrent_16x16.png | Bin 0 -> 715 bytes .../Images/Torrent_32x32.png | Bin 0 -> 1631 bytes .../Dark/Images/Commands/FileClose.png | Bin 0 -> 342 bytes .../Dark/Images/Commands/FileExit.png | Bin 0 -> 327 bytes .../Dark/Images/Commands/FileNewFile.png | Bin 0 -> 356 bytes .../Dark/Images/Commands/FileNewProject.png | Bin 0 -> 408 bytes .../Images/Commands/FileNewTeamProject.png | Bin 0 -> 461 bytes .../Dark/Images/Commands/FileNewWebSite.png | Bin 0 -> 512 bytes .../Dark/Images/Commands/FileOpenFile.png | Bin 0 -> 483 bytes .../Dark/Images/Commands/FileOpenProject.png | Bin 0 -> 510 bytes .../Images/Commands/FileOpenTeamProject.png | Bin 0 -> 404 bytes .../Dark/Images/Commands/FileOpenWebSite.png | Bin 0 -> 549 bytes .../Dark/Images/Commands/FilePageSetup.png | Bin 0 -> 279 bytes .../Dark/Images/Commands/FilePrint.png | Bin 0 -> 264 bytes .../Dark/Images/Commands/FileSave.png | Bin 0 -> 260 bytes .../Dark/Images/Commands/FileSaveAll.png | Bin 0 -> 319 bytes .../Project/16x16/Blank Solution.png | Bin 0 -> 427 bytes .../Templates/Project/16x16/Package.png | Bin 0 -> 587 bytes .../Images/Templates/Project/16x16/Plugin.png | Bin 0 -> 415 bytes .../Project/16x16/Shell Isolated.png | Bin 0 -> 266 bytes .../Project/32x32/Blank Solution.png | Bin 0 -> 816 bytes .../Templates/Project/32x32/Package.png | Bin 0 -> 683 bytes .../Images/Templates/Project/32x32/Plugin.png | Bin 0 -> 532 bytes .../Project/32x32/Shell Isolated.png | Bin 0 -> 291 bytes .../Dark/Images/TreeView/CSharp.png | Bin 0 -> 367 bytes .../Dark/Images/TreeView/CSharp_Project.png | Bin 0 -> 360 bytes .../Dark/Images/TreeView/Control.png | Bin 0 -> 303 bytes .../Dark/Images/TreeView/Form.png | Bin 0 -> 242 bytes .../Dark/Images/TreeView/PropertiesFolder.png | Bin 0 -> 345 bytes .../Dark/Images/TreeView/Reference.png | Bin 0 -> 218 bytes .../Dark/Images/TreeView/Resources.png | Bin 0 -> 315 bytes .../Dark/Images/TreeView/Solution.png | Bin 0 -> 385 bytes .../Dark/Images/TreeView/UserControl.png | Bin 0 -> 354 bytes .../Dark/Images/TreeView/generic-file.png | Bin 0 -> 243 bytes .../Images/TreeView/generic-folder-closed.png | Bin 0 -> 269 bytes .../Images/TreeView/generic-folder-open.png | Bin 0 -> 337 bytes .../Images/TreeView/hidden-folder-closed.png | Bin 0 -> 248 bytes .../Images/TreeView/hidden-folder-open.png | Bin 0 -> 302 bytes .../Themes/VisualStudio2012/Dark/Theme.xml | 30 + .../Images/TreeView/generic-folder-closed.png | Bin 0 -> 223 bytes .../Images/TreeView/generic-folder-open.png | Bin 0 -> 339 bytes ...lEditor.Content.PlatformIndependent.csproj | 679 + .../WindowLayouts/Default.xml | 24 + .../WindowLayouts/VisualStudio2013.xml | 41 + .../Controls/DocumentTypeSelector.Designer.cs | 106 + .../Controls/DocumentTypeSelector.cs | 236 + .../Controls/DocumentTypeSelector.resx | 120 + .../Controls/ErrorList.Designer.cs | 480 + .../Controls/ErrorList.cs | 59 + .../Controls/ErrorList.resx | 205 + .../Controls/OutputWindow.Designer.cs | 214 + .../Controls/OutputWindow.cs | 35 + .../Controls/OutputWindow.resx | 214 + .../Controls/SolutionExplorer.Designer.cs | 457 + .../Controls/SolutionExplorer.cs | 412 + .../Controls/SolutionExplorer.resx | 280 + .../SolutionExplorerSelectionChangedEvent.cs | 20 + .../SolutionExplorerSelectionChangingEvent.cs | 20 + .../Dialogs/AboutDialog.Designer.cs | 666 + .../Dialogs/AboutDialog.cs | 308 + .../Dialogs/AboutDialog.resx | 916 + .../Dialogs/CrashDialog.Designer.cs | 213 + .../Dialogs/CrashDialog.cs | 31 + .../Dialogs/CrashDialog.resx | 120 + .../Dialogs/CustomOptionsDialog.Designer.cs | 116 + .../Dialogs/CustomOptionsDialog.cs | 253 + .../Dialogs/CustomOptionsDialog.resx | 120 + .../Dialogs/DataFormatAboutDialog.Designer.cs | 100 + .../Dialogs/DataFormatAboutDialog.cs | 41 + .../Dialogs/DataFormatAboutDialog.resx | 120 + .../DocumentPropertiesDialog.Designer.cs | 228 + .../Dialogs/DocumentPropertiesDialog.cs | 486 + .../Dialogs/DocumentPropertiesDialog.resx | 123 + .../Dialogs/ExportOptionsDialog.Designer.cs | 144 + .../Dialogs/ExportOptionsDialog.cs | 184 + .../Dialogs/ExportOptionsDialog.resx | 120 + .../Dialogs/GenericBrowserPopup.Designer.cs | 117 + .../Dialogs/GenericBrowserPopup.cs | 124 + .../Dialogs/GenericBrowserPopup.resx | 120 + .../Dialogs/NewDialog.Designer.cs | 354 + .../Dialogs/NewDialog.cs | 406 + .../Dialogs/NewDialog.resx | 120 + .../Dialogs/OptionsDialog.Designer.cs | 147 + .../Dialogs/OptionsDialog.cs | 142 + .../Dialogs/OptionsDialog.resx | 126 + .../SelectPerspectiveDialog.Designer.cs | 193 + .../Dialogs/SelectPerspectiveDialog.cs | 50 + .../Dialogs/SelectPerspectiveDialog.resx | 120 + .../Dialogs/SessionDialog.Designer.cs | 164 + .../Dialogs/SessionDialog.cs | 135 + .../Dialogs/SessionDialog.resx | 120 + .../UnsavedDocumentsDialog.Designer.cs | 121 + .../Dialogs/UnsavedDocumentsDialog.cs | 52 + .../Dialogs/UnsavedDocumentsDialog.resx | 120 + .../IconMethods.cs | 268 + .../LocalConfiguration.cs | 142 + .../MainWindow.Designer.cs | 971 ++ .../MainWindow.cs | 2290 +++ .../MainWindow.resx | 963 ++ .../DocumentsOptionPanel.Designer.cs | 443 + .../Application/DocumentsOptionPanel.cs | 41 + .../Application/DocumentsOptionPanel.resx | 120 + .../GeneralOptionPanel.Designer.cs | 249 + .../Application/GeneralOptionPanel.cs | 81 + .../Application/GeneralOptionPanel.resx | 120 + .../Page.Designer.cs | 37 + .../Page.cs | 23 + .../Pages/EditorPage.Designer.cs | 106 + .../Pages/EditorPage.cs | 397 + .../Pages/EditorPage.resx | 120 + .../Pages/EmbeddedEditorPage.Designer.cs | 61 + .../Pages/EmbeddedEditorPage.cs | 138 + .../Pages/EmbeddedEditorPage.resx | 120 + .../Pages/ExplorerPage.Designer.cs | 64 + .../Pages/ExplorerPage.cs | 31 + .../Pages/ExplorerPage.resx | 120 + .../Pages/FilePage.Designer.cs | 37 + .../Pages/FilePage.cs | 50 + .../Pages/GenericErrorPage.Designer.cs | 60 + .../Pages/GenericErrorPage.cs | 30 + .../Pages/GenericErrorPage.resx | 120 + .../Pages/InvalidFormatPage.Designer.cs | 62 + .../Pages/InvalidFormatPage.cs | 26 + .../Pages/InvalidFormatPage.resx | 120 + .../Pages/MultipleObjectModelPage.Designer.cs | 37 + .../Pages/MultipleObjectModelPage.cs | 20 + .../Pages/StartPage.Designer.cs | 209 + .../Pages/StartPage.cs | 70 + .../Pages/StartPage.resx | 156 + .../Pages/UnknownFormatPage.Designer.cs | 37 + .../Pages/UnknownFormatPage.cs | 17 + .../Panel.Designer.cs | 37 + .../Panel.cs | 23 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 93 + .../Properties/Resources.resx | 130 + .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + .../Resources/mainicon.ico | Bin 0 -> 100348 bytes .../Resources/ueproj-icon.ico | Bin 0 -> 4406 bytes .../Resources/uesln-icon.ico | Bin 0 -> 12782 bytes .../SplashScreenWindow.Designer.cs | 141 + .../SplashScreenWindow.cs | 116 + .../SplashScreenWindow.resx | 455 + .../TemporaryFileManager.cs | 63 + ...niversalEditor.Engines.WindowsForms.csproj | 335 + .../WindowsFormsEngine.cs | 441 + .../CommonDialog.cs | 41 + .../Controls/DocumentTypeSelector.Designer.cs | 132 + .../Controls/DocumentTypeSelector.cs | 305 + .../Controls/DocumentTypeSelector.resources | Bin 0 -> 180 bytes .../Controls/DocumentTypeSelector.resx | 126 + .../Controls/ErrorMessage.Designer.cs | 182 + .../Controls/ErrorMessage.cs | 25 + .../Controls/ErrorMessage.resx | 1049 ++ .../LocalFileSystemExplorer.Designer.cs | 251 + .../Controls/LocalFileSystemExplorer.cs | 119 + .../Controls/LocalFileSystemExplorer.resx | 126 + .../Controls/ProgressPanel.Designer.cs | 89 + .../Controls/ProgressPanel.cs | 46 + .../Controls/ProgressPanel.resx | 120 + .../Dialog.cs | 13 + .../FileSystem/CommentDialog.Designer.cs | 95 + .../Dialogs/FileSystem/CommentDialog.cs | 17 + .../Dialogs/FileSystem/CommentDialog.resx | 120 + .../FileSystem/FilePropertiesDialog.cs | 32 + .../FilePropertiesDialogImpl.Designer.cs | 525 + .../Internal/FilePropertiesDialogImpl.cs | 230 + .../Internal/FilePropertiesDialogImpl.resx | 120 + .../PropertyDetailsDialog.Designer.cs | 171 + .../PropertyList/PropertyDetailsDialog.cs | 95 + .../PropertyList/PropertyDetailsDialog.resx | 120 + .../Editor.Designer.cs | 45 + .../Editor.cs | 494 + .../Editor.resx | 120 + .../Editors/FileSystemEditor.Designer.cs | 886 + .../Editors/FileSystemEditor.cs | 1051 ++ .../Editors/FileSystemEditor.resx | 426 + .../Editors/FormattedTextEditor.Designer.cs | 62 + .../Editors/FormattedTextEditor.cs | 80 + .../Editors/FormattedTextEditor.resx | 120 + .../Editors/MarkupEditor.Designer.cs | 285 + .../Editors/MarkupEditor.cs | 174 + .../Editors/MarkupEditor.resx | 126 + .../Editors/PlainTextEditor.Designer.cs | 64 + .../Editors/PlainTextEditor.cs | 83 + .../Editors/PlainTextEditor.resx | 120 + .../Editors/PropertyListEditor.Designer.cs | 324 + .../Editors/PropertyListEditor.cs | 645 + .../Editors/PropertyListEditor.resx | 129 + .../Editors/ShortcutEditor.Designer.cs | 356 + .../Editors/ShortcutEditor.cs | 94 + .../Editors/ShortcutEditor.resx | 120 + .../ExtensionMethods.cs | 19 + ...iversalEditor.Plugins.Multimedia.Fakes.dll | Bin 0 -> 512000 bytes ...ditor.Plugins.Multimedia.Fakes.fakesconfig | Bin 0 -> 22550 bytes ...iversalEditor.Plugins.Multimedia.Fakes.xml | 14165 ++++++++++++++++ .../HostApplication.cs | 16 + .../IHostApplicationWindow.cs | 30 + .../IconMethods.cs | 204 + .../ImageListExtensionMethods.cs | 111 + .../MenuBar.cs | 146 + .../OptionPanel.Designer.cs | 37 + .../OptionPanel.cs | 42 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 93 + .../Properties/Resources.resx | 130 + .../Resources/AddExisting.png | Bin 0 -> 555 bytes .../Resources/AddNew.bmp | Bin 0 -> 822 bytes .../Resources/AddNew.png | Bin 0 -> 680 bytes .../Resources/AddNewFolder.png | Bin 0 -> 756 bytes .../TemporaryFileManager.cs | 62 + ...alEditor.UserInterface.WindowsForms.csproj | 239 + .../VirtualFileDataObject.cs | 25 + ...ComplexObjectPropertiesControl.Designer.cs | 115 + .../ComplexObjectPropertiesControl.cs | 53 + .../ComplexObjectPropertiesControl.resx | 120 + .../Contact/EmailPropertiesDialog.Designer.cs | 200 + .../Dialogs/Contact/EmailPropertiesDialog.cs | 109 + .../Contact/EmailPropertiesDialog.resx | 120 + .../Contact/LabelPropertiesDialog.Designer.cs | 179 + .../Dialogs/Contact/LabelPropertiesDialog.cs | 76 + .../Contact/LabelPropertiesDialog.resx | 120 + .../Contact/NamePropertiesDialog.Designer.cs | 239 + .../Dialogs/Contact/NamePropertiesDialog.cs | 74 + .../Dialogs/Contact/NamePropertiesDialog.resx | 120 + .../Editors/Contact/ContactEditor.Designer.cs | 230 + .../Editors/Contact/ContactEditor.cs | 167 + .../Editors/Contact/ContactEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + ...ressBook.UserInterface.WindowsForms.csproj | 128 + .../AttachmentPropertiesDialog.Designer.cs | 121 + .../ArkAngles/AttachmentPropertiesDialog.cs | 67 + .../ArkAngles/AttachmentPropertiesDialog.resx | 120 + .../CategoryPropertiesDialog.Designer.cs | 106 + .../ArkAngles/CategoryPropertiesDialog.cs | 59 + .../ArkAngles/CategoryPropertiesDialog.resx | 120 + .../KeywordPropertiesDialog.Designer.cs | 106 + .../ArkAngles/KeywordPropertiesDialog.cs | 58 + .../ArkAngles/KeywordPropertiesDialog.resx | 120 + .../ListingPropertiesDialog.Designer.cs | 106 + .../ArkAngles/ListingPropertiesDialog.cs | 59 + .../ArkAngles/ListingPropertiesDialog.resx | 120 + .../PlatformPropertiesDialog.Designer.cs | 106 + .../ArkAngles/PlatformPropertiesDialog.cs | 59 + .../ArkAngles/PlatformPropertiesDialog.resx | 120 + .../ProductPropertiesDialog.Designer.cs | 422 + .../ArkAngles/ProductPropertiesDialog.cs | 283 + .../ArkAngles/ProductPropertiesDialog.resx | 120 + .../ActionPropertiesDialog.Designer.cs | 47 + .../Setup/ArkAngles/ActionPropertiesDialog.cs | 29 + .../ArkAngles/ActionPropertiesDialog.resx | 120 + .../ArkAnglesCatalogEditor.Designer.cs | 556 + .../ArkAngles/ArkAnglesCatalogEditor.cs | 386 + .../ArkAngles/ArkAnglesCatalogEditor.resx | 120 + .../ArkAnglesSetupEditor.Designer.cs | 734 + .../Setup/ArkAngles/ArkAnglesSetupEditor.cs | 149 + .../Setup/ArkAngles/ArkAnglesSetupEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 83 + .../Properties/Resources.resx | 127 + .../Resources/Setup.ico | Bin 0 -> 766 bytes .../Resources/Uninstall.ico | Bin 0 -> 766 bytes ...rkAngles.UserInterface.WindowsForms.csproj | 177 + .../Editors/FixtureEditor.Designer.cs | 37 + .../Editors/FixtureEditor.cs | 17 + .../Editors/LightingScriptEditor.Designer.cs | 37 + .../Editors/LightingScriptEditor.cs | 17 + .../Properties/AssemblyInfo.cs | 36 + ...luminous.UserInterface.WindowsForms.csproj | 112 + .../Executable/ExecutableEditor.Designer.cs | 271 + .../Editors/Executable/ExecutableEditor.cs | 203 + .../Editors/Executable/ExecutableEditor.resx | 123 + .../Properties/AssemblyInfo.cs | 36 + ...ecutable.UserInterface.WindowsForms.csproj | 89 + .../IcarusExpressionTextBox.Designer.cs | 76 + .../Icarus/IcarusExpressionTextBox.cs | 37 + .../Icarus/IcarusExpressionTextBox.resx | 120 + .../IcarusExpressionTextBox.Designer.cs | 76 + .../Icarus/IcarusExpressionTextBox.cs | 37 + .../Icarus/IcarusExpressionTextBox.resx | 120 + .../IcarusExpressionHelperDialog.Designer.cs | 285 + .../Icarus/IcarusExpressionHelperDialog.cs | 27 + .../Icarus/IcarusExpressionHelperDialog.resx | 120 + .../IcarusExpressionHelperDialog.Designer.cs | 285 + .../Icarus/IcarusExpressionHelperDialog.cs | 27 + .../Icarus/IcarusExpressionHelperDialog.resx | 120 + .../Icarus/IcarusScriptEditor.Designer.cs | 149 + .../Editors/Icarus/IcarusScriptEditor.cs | 456 + .../Editors/Icarus/IcarusScriptEditor.resx | 126 + .../Icarus/IcarusScriptEditor.Designer.cs | 149 + .../Icarus/IcarusScriptEditor.cs | 447 + .../Icarus/IcarusScriptEditor.resx | 126 + .../Strip/StripEditor.Designer.cs | 236 + .../RavenSoftware/Strip/StripEditor.cs | 118 + .../RavenSoftware/Strip/StripEditor.resx | 120 + .../WeaponData/WeaponDataEditor.Designer.cs | 37 + .../WeaponData/WeaponDataEditor.cs | 18 + .../Properties/AssemblyInfo.cs | 36 + ...s.Icarus.UserInterface.WindowsForms.csproj | 103 + .../Actor/ActorEditor.Designer.cs | 129 + .../KnowledgeAdventure/Actor/ActorEditor.cs | 51 + .../KnowledgeAdventure/Actor/ActorEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + ...dventure.UserInterface.WindowsForms.csproj | 84 + .../Michelangelo/CanvasControl.Designer.cs | 45 + .../Controls/Michelangelo/CanvasControl.cs | 43 + .../Controls/Michelangelo/CanvasControl.resx | 120 + .../Canvas/CanvasEditor.Designer.cs | 270 + .../Michelangelo/Canvas/CanvasEditor.cs | 24 + .../Michelangelo/Canvas/CanvasEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + ...elangelo.UserInterface.WindowsForms.csproj | 106 + .../BootstrapFilePropertiesDialog.Designer.cs | 140 + .../BootstrapFilePropertiesDialog.cs | 85 + .../BootstrapFilePropertiesDialog.resx | 120 + .../ManageOperatingSystemsDialog.Designer.cs | 188 + .../ManageOperatingSystemsDialog.cs | 184 + .../ManageOperatingSystemsDialog.resx | 120 + ...peratingSystemPropertiesDialog.Designer.cs | 126 + .../OperatingSystemPropertiesDialog.cs | 59 + .../OperatingSystemPropertiesDialog.resx | 120 + .../BootstrapScriptEditor.Designer.cs | 457 + .../BootstrapScript/BootstrapScriptEditor.cs | 338 + .../BootstrapScriptEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 73 + .../Properties/Resources.resx | 124 + .../Resources/setup.ico | Bin 0 -> 766 bytes ...ft.Setup.UserInterface.WindowsForms.csproj | 124 + .../ExtensionMethods.cs | 96 + .../Properties/AssemblyInfo.cs | 36 + ....Plugins.Multimedia.Binders.GdiPlus.csproj | 62 + .../PianoRoll/PianoRollControl.Designer.cs | 37 + .../Synthesized/PianoRoll/PianoRollControl.cs | 30 + .../Synthesized/PianoRoll/PianoRollTool.cs | 14 + .../Synthesized/PianoRollEditor.Designer.cs | 111 + .../Audio/Synthesized/PianoRollEditor.cs | 101 + .../Audio/Synthesized/PianoRollEditor.resx | 126 + .../Audio/Synthesized/PianoRollEditorTool.cs | 14 + .../Audio/Waveform/WaveformTrackList/Track.cs | 31 + .../WaveformTrackList/TrackChannel.cs | 18 + .../WaveformTrackListControl.Designer.cs | 46 + .../WaveformTrackListControl.cs | 82 + .../WaveformTrackListControl.resx | 120 + .../Palette/ColorListControl.Designer.cs | 47 + .../Multimedia/Palette/ColorListControl.cs | 155 + .../Multimedia/Palette/ColorListControl.resx | 120 + .../Audio/NoteExpressionProperty.Designer.cs | 419 + .../Audio/NoteExpressionProperty.cs | 15 + .../Audio/NoteExpressionProperty.resx | 120 + .../Audio/ProgressDialog.Designer.cs | 108 + .../Multimedia/Audio/ProgressDialog.cs | 15 + .../Multimedia/Audio/ProgressDialog.resx | 120 + .../SynthesizerPropertiesDialog.Designer.cs | 36 + .../SynthesizerPropertiesDialog.cs | 15 + .../Audio/VoicebankEditorDialog.Designer.cs | 425 + .../Multimedia/Audio/VoicebankEditorDialog.cs | 15 + .../Audio/VoicebankEditorDialog.resx | 120 + .../Picture/ToolSettingsDialog.Designer.cs | 124 + .../Multimedia/Picture/ToolSettingsDialog.cs | 27 + .../PlaylistEntryPropertiesDialog.Designer.cs | 244 + .../Playlist/PlaylistEntryPropertiesDialog.cs | 15 + .../PlaylistEntryPropertiesDialog.resx | 120 + .../SynthesizedAudioEditor.Designer.cs | 281 + .../Synthesized/SynthesizedAudioEditor.cs | 129 + .../Synthesized/SynthesizedAudioEditor.resx | 123 + .../Voicebank/VoicebankEditor.Designer.cs | 286 + .../Audio/Voicebank/VoicebankEditor.cs | 158 + .../Audio/Voicebank/VoicebankEditor.resx | 273 + .../VoicebankIndexEditor.Designer.cs | 299 + .../Audio/Voicebank/VoicebankIndexEditor.cs | 70 + .../Audio/Voicebank/VoicebankIndexEditor.resx | 126 + .../Waveform/WaveformAudioEditor.Designer.cs | 73 + .../Audio/Waveform/WaveformAudioEditor.cs | 52 + .../Audio/Waveform/WaveformAudioEditor.resx | 120 + .../Palette/PaletteEditor.Designer.cs | 743 + .../Multimedia/Palette/PaletteEditor.cs | 112 + .../Multimedia/Palette/PaletteEditor.resx | 120 + .../PictureCollectionEditor.Designer.cs | 547 + .../Collection/PictureCollectionEditor.cs | 188 + .../Collection/PictureCollectionEditor.resx | 120 + .../Picture/PictureEditor.Designer.cs | 46 + .../Multimedia/Picture/PictureEditor.cs | 82 + .../Multimedia/Picture/PictureEditor.resx | 120 + .../Subtitle/SubtitleEditor.Designer.cs | 371 + .../Multimedia/Subtitle/SubtitleEditor.cs | 72 + .../Multimedia/Subtitle/SubtitleEditor.resx | 120 + .../VectorImage/VectorImageEditor.Designer.cs | 37 + .../VectorImage/VectorImageEditor.cs | 43 + .../MyCursors.cs | 50 + .../Synthesized/EditorOptionPanel.Designer.cs | 382 + .../Audio/Synthesized/EditorOptionPanel.cs | 24 + .../Synthesized/EditorOptionPanel.layout | 182 + .../Audio/Synthesized/EditorOptionPanel.resx | 120 + .../ExternalProgramsOptionPanel.layout | 63 + .../Audio/Synthesized/MIDIOptionPanel.layout | 57 + .../PhonemeDictionaryOptionPanel.layout | 45 + .../SingingStyleDefaultsOptionPanel.layout | 123 + .../SynthesizersOptionPanel.layout | 49 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 83 + .../Properties/Resources.resx | 127 + .../Resources/Eraser.cur | Bin 0 -> 4286 bytes .../Resources/Pen.cur | Bin 0 -> 4286 bytes ...ltimedia.UserInterface.WindowsForms.csproj | 271 + .../TexturePropertiesDialog.Designer.cs | 320 + .../Dialogs/TexturePropertiesDialog.cs | 80 + .../Dialogs/TexturePropertiesDialog.resx | 120 + .../Editors/ModelEditor.cs | 431 + ...ner (miku's conflicted copy 2012-10-08).cs | 574 + .../Editors/ModelEditor.designer.cs | 1014 ++ .../Editors/ModelEditor.resx | 123 + .../Editors/Multimedia3D/Model/ModelEditor.cs | 488 + .../Model/ModelEditor.designer.cs | 1026 ++ .../Multimedia3D/Model/ModelEditor.resx | 123 + .../Motion/MotionEditor.Designer.cs | 192 + .../Multimedia3D/Motion/MotionEditor.cs | 30 + .../Multimedia3D/Motion/MotionEditor.resx | 120 + .../Model/GeneralOptionPanel.Designer.cs | 488 + .../Multimedia3D/Model/GeneralOptionPanel.cs | 32 + .../Model/GeneralOptionPanel.resx | 120 + .../Motion/TimelinePanel.Designer.cs | 60 + .../Multimedia3D/Motion/TimelinePanel.cs | 18 + .../Multimedia3D/Motion/TimelinePanel.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + ...imedia3D.UserInterface.WindowsForms.csproj | 137 + .../Map/MapEditor.Designer.cs | 75 + .../NewWorldComputing/Map/MapEditor.cs | 26 + .../NewWorldComputing/Map/MapEditor.resx | 120 + .../Scene/DesignerAreas/BasicDesignerArea.cs | 64 + .../DesignerObjectClasses/NwcButtonClass.cs | 166 + .../NwcGenericControlClass.cs | 182 + .../Scene/SceneEditor.Designer.cs | 397 + .../NewWorldComputing/Scene/SceneEditor.cs | 226 + .../NewWorldComputing/Scene/SceneEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + ...omputing.UserInterface.WindowsForms.csproj | 109 + .../InstallationScriptEditor.Designer.cs | 453 + .../InstallationScriptEditor.cs | 179 + .../InstallationScriptEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 153 + .../Properties/Resources.resx | 148 + .../Screenshot_Install_01_Welcome.bmp | Bin 0 -> 518454 bytes .../Screenshot_Install_02_License.bmp | Bin 0 -> 518454 bytes .../Screenshot_Install_03_Destination.bmp | Bin 0 -> 518454 bytes .../Screenshot_Install_04_Summary.bmp | Bin 0 -> 518454 bytes .../Screenshot_Install_05_Progress.bmp | Bin 0 -> 518454 bytes .../Screenshot_Install_06_Finish.bmp | Bin 0 -> 518454 bytes .../Screenshot_Uninstall_01_Welcome.bmp | Bin 0 -> 518454 bytes .../Screenshot_Uninstall_02_Progress.bmp | Bin 0 -> 518454 bytes .../Screenshot_Uninstall_03_Finish.bmp | Bin 0 -> 518454 bytes ...Software.UserInterface.WindowsForms.csproj | 121 + .../ObjectPropertiesDialog.Designer.cs | 117 + .../Dialogs/ObjectPropertiesDialog.cs | 41 + .../Dialogs/ObjectPropertiesDialog.resx | 120 + .../Editors/CodeEditor.Designer.cs | 215 + .../Editors/CodeEditor.cs | 580 + .../Editors/CodeEditor.resx | 126 + .../AppearanceOptionPanel.Designer.cs | 362 + .../CodeEditor/AppearanceOptionPanel.cs | 31 + .../CodeEditor/AppearanceOptionPanel.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + .../ApplicationPropertySheet.Designer.cs | 45 + .../ApplicationPropertySheet.cs | 17 + .../ApplicationPropertySheet.resx | 120 + ...elopment.UserInterface.WindowsForms.csproj | 115 + .../Editors/StoryEditor.Designer.cs | 250 + .../Editors/StoryEditor.cs | 91 + .../Editors/StoryEditor.resx | 132 + .../IconMethods.cs | 250 + .../Properties/AssemblyInfo.cs | 36 + ...ryWriter.UserInterface.WindowsForms.csproj | 90 + ...portTableEntryPropertiesDialog.Designer.cs | 356 + .../ExportTableEntryPropertiesDialog.cs | 17 + .../ExportTableEntryPropertiesDialog.resx | 120 + .../UnrealPackageEditor.Designer.cs | 559 + .../UnrealEngine/UnrealPackageEditor.cs | 325 + .../UnrealEngine/UnrealPackageEditor.resx | 126 + .../Properties/AssemblyInfo.cs | 36 + .../TemporaryFileManager.cs | 63 + ...alEngine.UserInterface.WindowsForms.csproj | 98 + .../MeasurementUpDownControl.Designer.cs | 110 + .../MeasurementUpDownControl.cs | 109 + .../MeasurementUpDownControl.resx | 120 + .../StyleSheet/StyleSheetEditor.Designer.cs | 511 + .../Web/StyleSheet/StyleSheetEditor.cs | 50 + .../Web/StyleSheet/StyleSheetEditor.resx | 120 + .../WebServiceDescriptionEditor.Designer.cs | 57 + .../WebServiceDescriptionEditor.cs | 69 + .../WebServiceDescriptionEditor.resx | 120 + .../Properties/AssemblyInfo.cs | 36 + ...gins.Web.UserInterface.WindowsForms.csproj | 135 + .../Common/BlockType.cs | 13 + .../Common/BurrowsWheelerTransform.cs | 44 + .../Common/CompressionTracingSwitch.cs | 36 + .../Common/DecodeHelper.cs | 292 + .../Common/HuffmanTree.cs | 211 + .../Common/InputBuffer.cs | 155 + .../Common/MT19937ar.cs | 101 + .../Common/Match.cs | 64 + .../Common/RunLengthEncoding.cs | 67 + .../Common/Sorting.cs | 36 + .../CompressionFailureException.cs | 71 + .../CompressionMethod.cs | 28 + .../CompressionMode.cs | 12 + .../CompressionModule.cs | 79 + .../CompressionModules.cs | 23 + .../UniversalEditor.Compression/LZ/LZ.cs | 484 + .../LZH/LZHStream.cs | 19 + .../LZMA/LZMAStream.cs | 70 + .../LZPL2/LZPL2CompressionModule.cs | 61 + .../UniversalEditor.Compression/LZSS/LZSS2.cs | 277 + .../LZSS/LZSSCompressionModule.cs | 80 + .../LZW/Internal/Element.cs | 17 + .../LZW/LZWStream.cs | 180 + .../Modules/Bzip2/Bzip2CompressionModule.cs | 35 + .../Modules/Bzip2/Internal/BZip2.cs | 105 + .../Modules/Bzip2/Internal/BZip2Constants.cs | 197 + .../Modules/Bzip2/Internal/BZip2Exception.cs | 90 + .../Bzip2/Internal/BZip2InputStream.cs | 1113 ++ .../Bzip2/Internal/BZip2OutputStream.cs | 1918 +++ .../Modules/Bzip2/Internal/StreamUtils.cs | 247 + .../Deflate/DeflateCompressionModule.cs | 46 + .../Deflate/DeflateStreamAsyncResult.cs | 111 + .../Modules/Deflate/Internal/DeflateInput.cs | 51 + .../Modules/Deflate/Internal/Deflater.cs | 31 + .../Modules/Deflate/Internal/FastEncoder.cs | 294 + .../Deflate/Internal/FastEncoderStatics.cs | 751 + .../Deflate/Internal/FastEncoderWindow.cs | 266 + .../Modules/Deflate/Internal/Inflater.cs | 784 + .../Modules/Deflate/Internal/OutputWindow.cs | 134 + .../Explode/ExplodeCompressionModule.cs | 534 + .../Explode/Internal/ExplodeDelegates.cs | 10 + .../Explode/Internal/ExplodeHuffman.cs | 25 + .../Modules/Explode/Internal/ExplodeInfo.cs | 13 + .../Modules/Explode/Internal/ExplodeState.cs | 56 + .../Modules/Gzip/GzipCompressionModule.cs | 45 + .../Modules/Gzip/GzipStream.cs | 54 + .../Modules/Gzip/Internal/GzipDecoder.cs | 341 + .../Modules/Gzip/Internal/GzipHeaderState.cs | 27 + .../Modules/LZRW1/LZRW1CompressionModule.cs | 103 + .../Modules/LZX/Internal/Constants.cs | 38 + .../Modules/LZX/LZXCompressionModule.cs | 773 + .../Modules/Puyo/CNX.cs | 182 + .../Modules/Puyo/CXLZ.cs | 120 + .../Modules/Puyo/Compression.cs | 131 + .../Modules/Puyo/CompressionFormat.cs | 18 + .../LzBufferDictionary.cs | 114 + .../LzWindowDictionary.cs | 126 + .../Puyo/Internal/CompressionDictionary.cs | 10 + .../Modules/Puyo/LZ00.cs | 227 + .../Modules/Puyo/LZ01.cs | 149 + .../Modules/Puyo/LZSS.cs | 142 + .../Modules/Puyo/ONZ.cs | 222 + .../Modules/Puyo/PRS.cs | 142 + .../Modules/Puyo/PuyoCompressionModule.cs | 106 + .../XMemLZX/XMemLZXCompressionModule.cs | 24 + .../Modules/Zlib/Internal/Adler32.cs | 108 + .../Modules/Zlib/Internal/Deflate.cs | 1799 ++ .../Modules/Zlib/Internal/InfBlocks.cs | 720 + .../Modules/Zlib/Internal/InfCodes.cs | 716 + .../Modules/Zlib/Internal/InfTree.cs | 377 + .../Modules/Zlib/Internal/Inflate.cs | 450 + .../Modules/Zlib/Internal/StaticTree.cs | 93 + .../Modules/Zlib/Internal/SupportClass.cs | 171 + .../Modules/Zlib/Internal/Tree.cs | 349 + .../Modules/Zlib/Internal/ZInputStream.cs | 181 + .../Modules/Zlib/Internal/ZOutputStream.cs | 282 + .../Modules/Zlib/Internal/ZStream.cs | 233 + .../Modules/Zlib/Internal/ZStreamException.cs | 58 + .../Modules/Zlib/Internal/Zlib.cs | 83 + .../Modules/Zlib/ZlibCompressionModule.cs | 42 + .../OutOfInputException.cs | 11 + .../PPmD/PPmDStream.cs | 70 + .../Properties/AssemblyInfo.cs | 36 + .../RLEW/RLEWCompressionModule.cs | 152 + .../UniversalEditor.Compression.csproj | 140 + .../UnsupportedWindowSizeRangeException.cs | 11 + .../UniversalEditor.Core/Accessor.cs | 215 + .../UniversalEditor.Core/AccessorReference.cs | 83 + .../Accessors/FileAccessor.cs | 134 + .../Accessors/MemoryAccessor.cs | 127 + .../Accessors/StreamAccessor.cs | 92 + .../Accessors/StringAccessor.cs | 127 + .../UniversalEditor.Core/Association.cs | 186 + .../AssociationCriteria.cs | 31 + .../Checksum/ChecksumModule.cs | 69 + .../Modules/Adler32/Adler32ChecksumModule.cs | 217 + .../Modules/CRC32/CRC32ChecksumModule.cs | 208 + .../StrangeCRC/StrangeCRCChecksumModule.cs | 198 + .../UniversalEditor.Core/Common/Path.cs | 58 + .../UniversalEditor.Core/Common/Strings.cs | 28 + .../UniversalEditor.Core/CustomDataFormat.cs | 179 + .../CustomDataFormatItem.cs | 39 + .../UniversalEditor.Core/CustomOption.cs | 352 + .../DataCorruptedException.cs | 15 + .../UniversalEditor.Core/DataFormat.cs | 110 + .../DataFormatCapabilities.cs | 16 + .../DataFormatException.cs | 14 + .../UniversalEditor.Core/DataFormatFilter.cs | 297 + .../DataFormatHintComparison.cs | 18 + .../DataFormatReference.cs | 236 + .../UniversalEditor.Core/Document.cs | 219 + .../UniversalEditor.Core/Endpoint.cs | 25 + .../UniversalEditor.Core/ExtensionMethods.cs | 799 + .../UniversalEditor.Core/IO/Array.cs | 21 + .../UniversalEditor.Core/IO/Encoding.cs | 334 + .../IO/EndOfStreamException.cs | 14 + .../UniversalEditor.Core/IO/Endianness.cs | 44 + .../IO/NewLineSequence.cs | 32 + .../UniversalEditor.Core/IO/Reader.cs | 1464 ++ .../IO/ReaderWriterBase.cs | 69 + .../UniversalEditor.Core/IO/SeekOrigin.cs | 27 + .../UniversalEditor.Core/IO/Writer.cs | 712 + .../InvalidDataFormatException.cs | 32 + .../UniversalEditor.Core/LastUsedAccessor.cs | 17 + .../Localization/StringTable.cs | 29 + .../UniversalEditor.Core/ObjectModel.cs | 72 + .../ObjectModelCustomProperty.cs | 75 + .../ObjectModelNotSupportedException.cs | 27 + .../ObjectModelReference.cs | 293 + .../UniversalEditor.Core/ProgressEvent.cs | 57 + .../Properties/AssemblyInfo.cs | 36 + .../V5/Libraries/UniversalEditor.Core/Ptr.cs | 213 + .../UniversalEditor.Core/References.cs | 38 + .../UniversalEditor.Core.csproj | 100 + .../Collections/Generic/AutoDictionary.cs | 49 + .../Generic/BidirectionalDictionary.cs | 123 + .../Collections/Generic/KeyValuePairList.cs | 39 + .../Common/Reflection.cs | 686 + .../UniversalEditor.Essential/Condition.cs | 379 + .../UniversalEditor.Essential/Converter.cs | 95 + .../AbstractSyntax/DER/DERDataFormat.cs | 43 + .../DataFormats/Chunked/REV/REVDataFormat.cs | 31 + .../Chunked/RIFF/RIFFDataFormat.cs | 272 + .../CoreObject/CoreObjectDataFormat.cs | 196 + .../FileSystem/UXT/UXTDataFormat.cs | 93 + .../DataFormats/Markup/EBML/EBMLDataFormat.cs | 322 + .../DataFormats/Markup/XML/XMLDataFormat.cs | 1580 ++ .../Markup/XML/XMLDataFormatSettings.cs | 150 + .../ExtensibleConfigurationDataFormat.cs | 211 + .../ExtensibleConfigurationSettings.cs | 55 + .../Text/TextPropertyListDataFormat.cs | 154 + .../Text/TextPropertyListSettings.cs | 22 + .../UniversalPropertyListDataFormat.cs | 416 + .../UniversalPropertyList/VariantType.cs | 30 + .../WindowsConfigurationDataFormat.cs | 140 + .../XML/XMLPropertyListDataFormat.cs | 353 + .../RichTextMarkup/RTML/RTMLDataFormat.cs | 137 + .../RichTextMarkup/RTML/RTMLSettings.cs | 26 + .../DER/DERCertificateDataFormat.cs | 48 + .../Security/Key/RSA/RSAKeyAlgorithm.cs | 13 + .../Security/Key/RSA/RSAKeyDataFormat.cs | 128 + .../Security/Key/RSA/RSAKeyType.cs | 18 + .../FreeDesktop/DesktopShortcutAction.cs | 51 + .../FreeDesktop/DesktopShortcutDataFormat.cs | 417 + .../DesktopShortcutStartupNotifyBehavior.cs | 14 + .../FreeDesktop/DesktopShortcutType.cs | 14 + .../Formatted/RichText/RTFCharacterSet.cs | 28 + .../Text/Formatted/RichText/RTFDataFormat.cs | 204 + .../Text/Formatted/RichText/RTFGenerator.cs | 16 + .../UEPackage/UEPackageXMLDataFormat.cs | 1168 ++ .../ExpandedString.cs | 331 + .../NameValuePair.cs | 120 + .../NameValuePairGroup.cs | 202 + .../AbstractSyntaxObjectModel.cs | 20 + .../Chunked/ChunkedObjectModel.cs | 45 + .../ObjectModels/Chunked/RIFFChunk.cs | 52 + .../ObjectModels/Chunked/RIFFDataChunk.cs | 50 + .../ObjectModels/Chunked/RIFFGroupChunk.cs | 40 + .../ObjectModels/Chunked/RIFFMetadata.cs | 246 + .../CoreObject/CoreObjectAttribute.cs | 79 + .../CoreObject/CoreObjectGroup.cs | 113 + .../CoreObject/CoreObjectObjectModel.cs | 48 + .../CoreObject/CoreObjectProperty.cs | 152 + .../DataLink/DataLinkObjectModel.cs | 74 + .../ObjectModels/FileSystem/CompressedFile.cs | 14 + .../FileSystem/DataRequestEvent.cs | 17 + .../ObjectModels/FileSystem/File.cs | 282 + .../ObjectModels/FileSystem/File.cs.bak | 275 + .../ObjectModels/FileSystem/FileAttributes.cs | 21 + .../ObjectModels/FileSystem/FileSource.cs | 19 + .../FileSystem/FileSourceTransformation.cs | 36 + .../FileSources/AccessorFileSource.cs | 31 + .../FileSources/EmbeddedFileSource.cs | 51 + .../FileSources/MemoryFileSource.cs | 31 + .../FileSources/PhysicalFileSource.cs | 27 + .../FileSystem/FileSystemObjectModel.cs | 437 + .../ObjectModels/FileSystem/Folder.cs | 189 + .../FileSystem/IFileSystemContainer.cs | 14 + .../FileSystem/IFileSystemObject.cs | 17 + .../FileSystem/IFileSystemObjectType.cs | 15 + .../ObjectModels/Markup/MarkupAttribute.cs | 156 + .../Markup/MarkupCommentElement.cs | 30 + .../Markup/MarkupContainerElement.cs | 92 + .../ObjectModels/Markup/MarkupElement.cs | 203 + .../Markup/MarkupLiteralElement.cs | 19 + .../ObjectModels/Markup/MarkupObjectModel.cs | 144 + .../Markup/MarkupPreprocessorElement.cs | 38 + .../Markup/MarkupStringElement.cs | 19 + .../ObjectModels/Markup/MarkupTagElement.cs | 51 + .../ObjectModels/Project/ProjectFile.cs | 86 + .../ObjectModels/Project/ProjectFileSystem.cs | 39 + .../ObjectModels/Project/ProjectFolder.cs | 80 + .../Project/ProjectObjectModel.cs | 76 + .../ObjectModels/Project/Reference.cs | 50 + .../ObjectModels/PropertyList/Group.cs | 226 + .../ObjectModels/PropertyList/Property.cs | 143 + .../PropertyList/PropertyListObjectModel.cs | 290 + .../PropertyList/PropertyValueType.cs | 20 + .../RichTextMarkup/RichTextMarkupItem.cs | 49 + .../RichTextMarkup/RichTextMarkupItemGroup.cs | 32 + .../RichTextMarkupItemLiteral.cs | 24 + .../RichTextMarkup/RichTextMarkupItemTag.cs | 24 + .../RichTextMarkupObjectModel.cs | 26 + .../Certificate/CertificateObjectModel.cs | 28 + .../Security/Key/RSA/RSAKeyObjectModel.cs | 82 + .../Shortcut/ShortcutObjectModel.cs | 78 + .../Solution/SolutionObjectModel.cs | 49 + .../Text/Formatted/FormattedTextFont.cs | 29 + .../Text/Formatted/FormattedTextFontFamily.cs | 43 + .../Text/Formatted/FormattedTextItem.cs | 27 + .../Formatted/FormattedTextObjectModel.cs | 50 + .../Text/Formatted/FormattedTextStyle.cs | 22 + .../Text/Formatted/FormattedTextStyleGroup.cs | 16 + .../Formatted/IFormattedTextItemParent.cs | 12 + .../Formatted/Items/FormattedTextItemBold.cs | 20 + .../Items/FormattedTextItemContainer.cs | 13 + .../Items/FormattedTextItemFontSize.cs | 29 + .../Items/FormattedTextItemHyperlink.cs | 30 + .../Items/FormattedTextItemLiteral.cs | 28 + .../Items/FormattedTextItemParagraph.cs | 20 + .../Text/Plain/PlainTextObjectModel.cs | 55 + .../UEPackage/UEPackageObjectModel.cs | 64 + .../UniversalEditor.Essential/ProjectTask.cs | 76 + .../ProjectTaskAction.cs | 102 + .../ProjectTaskActionConvert.cs | 77 + .../ProjectTaskActionExecute.cs | 79 + .../ProjectTaskActionPackage.cs | 59 + .../ProjectTaskEvent.cs | 19 + .../UniversalEditor.Essential/ProjectType.cs | 68 + .../ProjectTypeVariable.cs | 40 + .../Properties/AssemblyInfo.cs | 36 + .../UniversalEditor.Essential/Template.cs | 238 + .../UniversalEditor.Essential.csproj | 177 + .../BookmarksManager.cs | 95 + .../UniversalEditor.UserInterface/Command.cs | 83 + .../CommandBar.cs | 25 + .../CommandDisplayStyle.cs | 15 + .../CommandItem.cs | 25 + .../CommandShortcutKey.cs | 176 + .../Common/Reflection.cs | 229 + .../ConfigurationManager.cs | 103 + .../CustomOptionDialogType.cs | 13 + .../EditorReference.cs | 36 + .../UniversalEditor.UserInterface/Engine.cs | 1324 ++ .../EngineMainMenu.cs | 16 + .../HostApplication.cs | 27 + .../HostApplicationMessage.cs | 149 + .../HostApplicationOutputWindow.cs | 65 + .../IEditorImplementation.cs | 44 + .../IHostApplicationWindow.cs | 76 + .../IOptionPanelImplementation.cs | 18 + .../UniversalEditor.UserInterface/Language.cs | 54 + .../UniversalEditor.UserInterface/MenuBar.cs | 183 + .../ObjectModelChangingEvent.cs | 24 + .../Perspective.cs | 25 + .../Properties/AssemblyInfo.cs | 36 + .../PropertyMapping.cs | 24 + .../RecentFileManager.cs | 108 + .../SessionManager.cs | 251 + .../Settings/SettingsManager.cs | 18 + .../SingleInstanceManager.cs | 123 + .../StockCommandType.cs | 9 + .../UniversalEditor.UserInterface/Toolbar.cs | 38 + .../UniversalEditor.UserInterface/Toolbox.cs | 107 + .../UniversalEditor.UserInterface.csproj | 126 + .../UnsavedDocumentOption.cs | 13 + .../WindowState.cs | 15 + .../Color.cs | 144 + .../Project/LMMS/LMMSCompressedDataFormat.cs | 31 + .../Project/LMMS/LMMSProjectDataFormat.cs | 31 + .../Audio/Synthesized/MIDI/MIDICommand.cs | 130 + .../Audio/Synthesized/MIDI/MIDICommandType.cs | 16 + .../Audio/Synthesized/MIDI/MIDIDataFormat.cs | 146 + .../MusicXML/MusicXMLDataFormat.cs | 157 + .../Audio/Synthesized/NIFF/NIFFDataFormat.cs | 17 + .../Audio/Synthesized/SPC/SPC700DataFormat.cs | 156 + .../Audio/Synthesized/UTAU/USTDataFormat.cs | 97 + .../Synthesized/Vocaloid/VSQDataFormat.cs | 119 + .../Synthesized/Vocaloid/VSQXDataFormat.cs | 824 + .../DirectWave/DirectWavePatchDataFormat.cs | 52 + .../Vocaloid/VocaloidVoicebankDataFormat.cs | 81 + .../AdvancedAudioCodec/AACDataFormat.cs | 23 + .../Audio/Waveform/BRSTM/BRSTMDataFormat.cs | 77 + .../Audio/Waveform/FLAC/FLACDataFormat.cs | 53 + .../FLAC/Internal/FLACMetadataBlock.cs | 11 + .../FLAC/Internal/FLACMetadataBlockHeader.cs | 43 + .../Internal/FLACMetadataBlockStreamInfo.cs | 115 + .../FLAC/Internal/FLACMetadataBlockType.cs | 16 + .../Audio/Waveform/MP3/MP3DataFormat.cs | 41 + .../Audio/Waveform/MP4/MP4DataFormat.cs | 28 + .../MicrosoftWave/MicrosoftWaveDataFormat.cs | 145 + .../Waveform/MonkeyAudio/APEDataFormat.cs | 24 + .../Waveform/MonkeyAudio/APLDataFormat.cs | 22 + .../Audio/Waveform/OGG/OGGDataFormat.cs | 23 + .../Audio/Waveform/REX2/REX2DataFormat.cs | 36 + .../Waveform/RealAudio/RealAudioDataFormat.cs | 203 + .../Waveform/Shorten/ShortenDataFormat.cs | 23 + .../Audio/Waveform/SunAu/SunAuDataFormat.cs | 292 + .../Audio/Waveform/SunAu/SunAuEncoding.cs | 30 + .../Waveform/WavPack/WavPackDataFormat.cs | 23 + .../DataFormats/BluRay/HDMVDataFormat.cs | 29 + .../DataFormats/BluRay/INDXDataFormat.cs | 28 + .../DataFormats/BluRay/MOBJDataFormat.cs | 28 + .../DataFormats/BluRay/MPLSDataFormat.cs | 31 + .../Project/LMMS/LMMSCompressedDataFormat.cs | 35 + .../Project/LMMS/LMMSProjectDataFormat.cs | 30 + .../Synthesized/ExtendedMIDI/XMIDataFormat.cs | 51 + .../Audio/Synthesized/MIDI/MIDICommand.cs | 130 + .../Audio/Synthesized/MIDI/MIDICommandType.cs | 16 + .../Audio/Synthesized/MIDI/MIDIDataFormat.cs | 160 + .../MusicXML/MusicXMLDataFormat.cs | 166 + .../Audio/Synthesized/NIFF/NIFFDataFormat.cs | 42 + .../Audio/Synthesized/PSF/PSFDataFormat.cs | 74 + .../Audio/Synthesized/PSF/PSFPlatform.cs | 47 + .../Audio/Synthesized/SPC/SPC700DataFormat.cs | 153 + .../Audio/Synthesized/SPC/SPC700Emulator.cs | 31 + .../Synthesized/SPC/SPC700ExtendedID666Tag.cs | 30 + .../Audio/Synthesized/SPC/SPC700ID666Tag.cs | 72 + .../Audio/Synthesized/SPC/SPC700Memory.cs | 39 + .../Audio/Synthesized/SPC/SPC700Registers.cs | 48 + .../Audio/Synthesized/UTAU/USTDataFormat.cs | 150 + .../Synthesized/Vocaloid/VSQDataFormat.cs | 116 + .../Synthesized/Vocaloid/VSQXDataFormat.cs | 830 + .../DirectWave/DirectWavePatchDataFormat.cs | 51 + .../Vocaloid/VocaloidVoicebankDataFormat.cs | 86 + .../VoicebankIndex/Vocaloid/DDIDataFormat.cs | 154 + .../VoicebankIndex/Vocaloid/DDIParameter.cs | 24 + .../PhonemeDictionaryXMLDataFormat.cs | 99 + .../AdvancedAudioCodec/AACDataFormat.cs | 22 + .../Audio/Waveform/BRSTM/BRSTMDataFormat.cs | 76 + .../Audio/Waveform/FLAC/FLACDataFormat.cs | 52 + .../FLAC/Internal/FLACMetadataBlock.cs | 11 + .../FLAC/Internal/FLACMetadataBlockHeader.cs | 43 + .../Internal/FLACMetadataBlockStreamInfo.cs | 115 + .../FLAC/Internal/FLACMetadataBlockType.cs | 16 + .../Audio/Waveform/MP3/MP3DataFormat.cs | 40 + .../Audio/Waveform/MP4/MP4DataFormat.cs | 22 + .../MicrosoftWave/MicrosoftWaveDataFormat.cs | 159 + .../Waveform/MonkeyAudio/APEDataFormat.cs | 23 + .../Waveform/MonkeyAudio/APLDataFormat.cs | 21 + .../Audio/Waveform/OGG/OGGDataFormat.cs | 22 + .../Audio/Waveform/REX2/REX2DataFormat.cs | 47 + .../Waveform/RealAudio/RealAudioDataFormat.cs | 202 + .../Waveform/Shorten/ShortenDataFormat.cs | 22 + .../Audio/Waveform/SunAu/SunAuDataFormat.cs | 291 + .../Audio/Waveform/SunAu/SunAuEncoding.cs | 30 + .../Waveform/WavPack/WavPackDataFormat.cs | 22 + .../Synthesized/SPC2/SPC2DataFormat.cs | 142 + .../Multimedia/BluRay/BDJODataFormat.cs | 37 + .../Multimedia/BluRay/HDMVDataFormat.cs | 28 + .../Multimedia/BluRay/INDXDataFormat.cs | 27 + .../Multimedia/BluRay/MOBJDataFormat.cs | 27 + .../Multimedia/BluRay/MPLSDataFormat.cs | 30 + .../Multimedia/Palette/Adobe/ACODataFormat.cs | 115 + .../Multimedia/Palette/Adobe/ASEDataFormat.cs | 110 + .../Multimedia/Palette/GIMP/GPLDataFormat.cs | 71 + .../PaintShop/PaintShopPaletteDataFormat.cs | 54 + .../Multimedia/Picture/ARGB/ARGBDataFormat.cs | 79 + .../Picture/Bitmap/BitmapBitsPerPixel.cs | 73 + .../Picture/Bitmap/BitmapCompression.cs | 39 + .../Picture/Bitmap/BitmapDataFormat.cs | 263 + .../Picture/Bitmap/BitmapInfoHeader.cs | 124 + .../Multimedia/Picture/BitmapDataFormat.cs | 174 + .../Multimedia/Picture/CURDataFormat.cs | 23 + .../Picture/ChaosWorks/CWESpriteDataFormat.cs | 58 + .../CompressedBG/CompressedBGDataFormat.cs | 369 + .../Picture/CompressedBG/Internal/NodeCBG.cs | 12 + .../Multimedia/Picture/GIM/GIMDataFormat.cs | 358 + .../Multimedia/Picture/GIM/GIMImageFormat.cs | 55 + .../Picture/GIM/GIMPaletteFormat.cs | 35 + .../Multimedia/Picture/GIM/GIMPartType.cs | 24 + .../Multimedia/Picture/GIM/GIMPixelOrder.cs | 25 + .../Picture/GIM/GIMSwizzleEncoder.cs | 58 + .../GraphicsInterchangeDataFormat.cs | 83 + .../GraphicsInterchangeExtensionBlock.cs | 73 + .../Picture/GraphicsInterchangeDataFormat.cs | 24 + .../Multimedia/Picture/I16/I16DataFormat.cs | 56 + .../Multimedia/Picture/ICODataFormat.cs | 24 + .../Icon/Microsoft/GroupICODataFormat.cs | 67 + .../Picture/Icon/Microsoft/ICODataFormat.cs | 58 + .../Multimedia/Picture/JPEG/JPEGDataFormat.cs | 186 + .../Multimedia/Picture/JPEG/JPEGMarker.cs | 191 + .../Multimedia/Picture/JPEGDataFormat.cs | 23 + .../Multimedia/Picture/LEAD/CMPDataFormat.cs | 61 + .../Microsoft/Bitmap/BitmapBitsPerPixel.cs | 73 + .../Microsoft/Bitmap/BitmapCompression.cs | 39 + .../Microsoft/Bitmap/BitmapDataFormat.cs | 260 + .../Microsoft/Bitmap/BitmapInfoHeader.cs | 125 + .../DirectDraw/DirectDrawSurfaceDataFormat.cs | 351 + .../DirectDraw/Internal/DXTDecompression.cs | 268 + .../Internal/DirectDrawSurfaceCaps1.cs | 27 + .../Internal/DirectDrawSurfaceCaps2.cs | 46 + .../Internal/DirectDrawSurfaceFormat.cs | 220 + .../Internal/DirectDrawSurfaceHeaderFlags.cs | 19 + .../Internal/DirectDrawSurfaceLoadInfo.cs | 58 + .../Internal/DirectDrawSurfacePixelFormat.cs | 34 + .../DirectDrawSurfacePixelFormatFlags.cs | 16 + .../Picture/Microsoft/Paint/MSPDataFormat.cs | 96 + .../PortableNetworkGraphics/PNGChunk.cs | 80 + .../PortableNetworkGraphics/PNGColorType.cs | 28 + .../PNGCompressionMethod.cs | 12 + .../PNGCompressionModule.cs | 166 + .../PortableNetworkGraphics/PNGDataFormat.cs | 92 + .../PortableNetworkGraphics/PNGFilterType.cs | 16 + .../PNGPredictionType.cs | 31 + .../Picture/PortablePixelmap/PPMDataFormat.cs | 139 + .../Multimedia/Picture/TMH/TMHDataFormat.cs | 54 + .../Picture/Targa/TargaExtensionArea.cs | 49 + .../Targa/TargaFirstPixelDestination.cs | 34 + .../Targa/TargaHorizontalTransferOrder.cs | 26 + .../Picture/Targa/TargaImageType.cs | 42 + .../Picture/Targa/TargaRLEPacketType.cs | 22 + .../Targa/TargaVerticalTransferOrder.cs | 26 + .../Picture/Targa/TrueVisionTGADataFormat.cs | 1179 ++ .../Internal/Constants.cs | 44 + .../Internal/WsqHelper.cs | 227 + .../WSQDataFormat.cs | 1683 ++ .../Multimedia/Picture/WebP/WebPDataFormat.cs | 45 + .../Picture/WirelessBitmap/WBMPDataFormat.cs | 75 + .../Multimedia/Playlist/ASXDataFormat.cs | 241 + .../Playlist/CDDA/CDDADataFormat.cs | 103 + .../Playlist/HTMLPlaylistDataFormat.cs | 50 + .../Multimedia/Playlist/M3UDataFormat.cs | 104 + .../Playlist/NotepadPlusPlaylistDataFormat.cs | 93 + .../Multimedia/Playlist/PLSDataFormat.cs | 89 + .../Multimedia/Playlist/SMILDataFormat.cs | 194 + .../Multimedia/Playlist/XSPFDataFormat.cs | 109 + .../QuickSub/QuickSubTextDataFormat.cs | 125 + .../Subtitle/SubRip/SubRipDataFormat.cs | 96 + .../SubStationAlphaDataFormat.cs | 121 + .../ExpressionDesignDataFormat.cs | 49 + .../Multimedia/Video/AVI/AVIDataFormat.cs | 36 + .../Video/RAD/Bink/BinkDataFormat.cs | 100 + .../Video/RAD/Smacker/SmackerDataFormat.cs | 52 + .../Multimedia/Video/ROQ/ROQChunk.cs | 47 + .../Multimedia/Video/ROQ/ROQDataFormat.cs | 71 + .../Multimedia/Video/THP/THPDataFormat.cs | 76 + .../Multimedia/Video/UEV/UEVDataFormat.cs | 95 + .../Multimedia/Video/UVS/UVSColorspace.cs | 20 + .../Multimedia/Video/UVS/UVSDataFormat.cs | 66 + .../Multimedia/Video/UVS/UVSFlags.cs | 14 + .../Multimedia/Video/UVS/UVSLayoutID.cs | 78 + .../Picture/Bitmap/BitmapBitsPerPixel.cs | 73 + .../Picture/Bitmap/BitmapCompression.cs | 39 + .../Picture/Bitmap/BitmapDataFormat.cs | 214 + .../Picture/Bitmap/BitmapInfoHeader.cs | 120 + .../DataFormats/Picture/BitmapDataFormat.cs | 174 + .../DataFormats/Picture/CURDataFormat.cs | 24 + .../CompressedBG/CompressedBGDataFormat.cs | 277 + .../GraphicsInterchangeDataFormat.cs | 84 + .../GraphicsInterchangeExtensionBlock.cs | 73 + .../Picture/GraphicsInterchangeDataFormat.cs | 24 + .../DataFormats/Picture/ICODataFormat.cs | 24 + .../Icon/Microsoft/GroupICODataFormat.cs | 60 + .../Picture/Icon/Microsoft/ICODataFormat.cs | 59 + .../Picture/JPEG/JPEGDataFormat.cs | 186 + .../DataFormats/Picture/JPEG/JPEGMarker.cs | 191 + .../DataFormats/Picture/JPEGDataFormat.cs | 23 + .../Picture/MicrosoftDDSDataFormat.cs | 39 + .../PortableNetworkGraphics/PNGChunk.cs | 80 + .../PortableNetworkGraphics/PNGDataFormat.cs | 86 + .../Picture/Targa/TargaExtensionArea.cs | 49 + .../Targa/TargaFirstPixelDestination.cs | 34 + .../Targa/TargaHorizontalTransferOrder.cs | 26 + .../Picture/Targa/TargaImageType.cs | 42 + .../Picture/Targa/TargaRLEPacketType.cs | 22 + .../Targa/TargaVerticalTransferOrder.cs | 26 + .../Picture/Targa/TrueVisionTGADataFormat.cs | 701 + .../Internal/Constants.cs | 44 + .../Internal/WsqHelper.cs | 227 + .../WSQDataFormat.cs | 1684 ++ .../DataFormats/Playlist/ASXDataFormat.cs | 243 + .../Playlist/CDDA/CDDADataFormat.cs | 101 + .../Playlist/HTMLPlaylistDataFormat.cs | 39 + .../DataFormats/Playlist/M3UDataFormat.cs | 105 + .../Playlist/NotepadPlusPlaylistDataFormat.cs | 94 + .../DataFormats/Playlist/PLSDataFormat.cs | 89 + .../DataFormats/Playlist/SMILDataFormat.cs | 193 + .../DataFormats/Playlist/XSPFDataFormat.cs | 108 + .../DataFormats/Video/AVI/AVIDataFormat.cs | 34 + .../Video/RAD/Bink/BinkDataFormat.cs | 101 + .../Video/RAD/Smacker/SmackerDataFormat.cs | 53 + .../DataFormats/Video/ROQ/ROQChunk.cs | 47 + .../DataFormats/Video/ROQ/ROQDataFormat.cs | 70 + .../DataFormats/Video/THP/THPDataFormat.cs | 77 + .../DataFormats/Video/UEV/UEVDataFormat.cs | 95 + .../Dialogs/Audio/NoteExpressionProperty.cs | 333 + .../Audio/NoteExpressionProperty.resources | Bin 0 -> 180 bytes .../Dialogs/Audio/ProgressDialog.cs | 86 + .../Dialogs/Audio/ProgressDialog.resources | Bin 0 -> 180 bytes .../Dialogs/Audio/VoicebankEditorDialog.cs | 323 + .../Audio/VoicebankEditorDialog.resources | Bin 0 -> 180 bytes .../SynthesizerPropertiesDialog.cs | 36 + .../SynthesizerPropertiesDialog.resources | Bin 0 -> 180 bytes .../Dialogs/Picture/ToolSettingsDialog.cs | 138 + .../Picture/ToolSettingsDialog.resources | Bin 0 -> 180 bytes .../Playlist/PlaylistEntryPropertiesDialog.cs | 184 + .../PlaylistEntryPropertiesDialog.resources | Bin 0 -> 180 bytes .../ExtensionMethods.cs | 238 + .../ObjectModels/Audio/AudioObjectModel.cs | 9 + .../AudioObjectModelDocumentProperties.cs | 139 + .../Audio/AudioObjectModelInformation.cs | 167 + .../Audio/Project/AudioProjectObjectModel.cs | 21 + .../Synthesized/SynthesizedAudioCommand.cs | 34 + .../SynthesizedAudioCommandNote.cs | 298 + .../SynthesizedAudioCommandRest.cs | 7 + .../SynthesizedAudioCommandTempo.cs | 37 + .../SynthesizedAudioCommandText.cs | 37 + .../SynthesizedAudioCommandTimeSignature.cs | 87 + .../SynthesizedAudioObjectModel.cs | 47 + .../SynthesizedAudioPredefinedNote.cs | 75 + .../SynthesizedAudioStylePlugin.cs | 43 + .../Synthesized/SynthesizedAudioTrack.cs | 156 + .../SynthesizedAudioVibratoType.cs | 8 + .../Audio/Voicebank/VoicebankObjectModel.cs | 81 + .../Audio/Voicebank/VoicebankSample.cs | 63 + .../Voicebank/VoicebankSynthesisParameters.cs | 30 + .../Waveform/WaveformAudioExtendedHeader.cs | 55 + .../Audio/Waveform/WaveformAudioHeader.cs | 59 + .../Waveform/WaveformAudioKnownFormat.cs | 843 + .../Waveform/WaveformAudioObjectModel.cs | 100 + .../Multimedia/Audio/AudioObjectModel.cs | 9 + .../AudioObjectModelDocumentProperties.cs | 139 + .../Audio/AudioObjectModelInformation.cs | 134 + .../Audio/Project/AudioProjectObjectModel.cs | 21 + .../Audio/Soundfont/SoundfontObjectModel.cs | 17 + .../Synthesized/SynthesizedAudioCommand.cs | 34 + .../SynthesizedAudioCommandNote.cs | 286 + .../SynthesizedAudioCommandRest.cs | 7 + .../SynthesizedAudioCommandTempo.cs | 37 + .../SynthesizedAudioCommandText.cs | 37 + .../SynthesizedAudioCommandTimeSignature.cs | 87 + .../SynthesizedAudioObjectModel.cs | 47 + .../SynthesizedAudioPredefinedNote.cs | 75 + .../SynthesizedAudioStylePlugin.cs | 43 + .../Synthesized/SynthesizedAudioTrack.cs | 159 + .../SynthesizedAudioVibratoType.cs | 8 + .../Multimedia/Audio/Voicebank/Phoneme.cs | 26 + .../Audio/Voicebank/PhonemeGroup.cs | 33 + .../Audio/Voicebank/VoicebankObjectModel.cs | 88 + .../Audio/Voicebank/VoicebankSample.cs | 97 + .../Voicebank/VoicebankSynthesisParameters.cs | 30 + .../VoicebankIndexObjectModel.cs | 53 + .../VoicebankPhonemeDictionary/Phoneme.cs | 39 + .../PhonemeDictionaryObjectModel.cs | 38 + .../VoicebankPhonemeDictionary/PhonemeList.cs | 41 + .../Waveform/WaveformAudioExtendedHeader.cs | 55 + .../Audio/Waveform/WaveformAudioHeader.cs | 59 + .../Waveform/WaveformAudioKnownFormat.cs | 843 + .../Waveform/WaveformAudioObjectModel.cs | 123 + .../SynthesizedAudioCollectionObjectModel.cs | 39 + .../SynthesizedAudioCollectionTrack.cs | 60 + .../Multimedia/Palette/PaletteEntry.cs | 41 + .../Multimedia/Palette/PaletteObjectModel.cs | 39 + .../PictureCollectionObjectModel.cs | 67 + .../Multimedia/Picture/PictureItem.cs | 75 + .../Multimedia/Picture/PictureItemType.cs | 10 + .../Multimedia/Picture/PictureObjectModel.cs | 200 + .../Multimedia/Picture/PicturePathItem.cs | 50 + .../Playlist/PlaylistAlbumInformation.cs | 31 + .../Multimedia/Playlist/PlaylistEntry.cs | 154 + .../Playlist/PlaylistObjectModel.cs | 119 + .../ObjectModels/Multimedia/Subtitle/Actor.cs | 26 + .../ObjectModels/Multimedia/Subtitle/Event.cs | 45 + .../ObjectModels/Multimedia/Subtitle/Style.cs | 114 + .../Subtitle/SubtitleObjectModel.cs | 77 + .../VectorImage/VectorImageObjectModel.cs | 30 + .../Multimedia/Video/AudioTrack.cs | 44 + .../Multimedia/Video/VideoFrame.cs | 31 + .../Multimedia/Video/VideoObjectModel.cs | 47 + .../Multimedia/Video/VideoTrack.cs | 103 + .../ObjectModels/Picture/PictureItem.cs | 75 + .../ObjectModels/Picture/PictureItemType.cs | 10 + .../Picture/PictureObjectModel.cs | 240 + .../ObjectModels/Picture/PicturePathItem.cs | 50 + .../Playlist/PlaylistAlbumInformation.cs | 31 + .../ObjectModels/Playlist/PlaylistEntry.cs | 154 + .../Playlist/PlaylistObjectModel.cs | 119 + .../ObjectModels/Video/AudioTrack.cs | 44 + .../ObjectModels/Video/VideoFrame.cs | 31 + .../ObjectModels/Video/VideoObjectModel.cs | 47 + .../ObjectModels/Video/VideoTrack.cs | 103 + .../Synthesized/EditorOptionPanel.layout | 182 + .../ExternalProgramsOptionPanel.layout | 63 + .../Audio/Synthesized/MIDIOptionPanel.layout | 57 + .../PhonemeDictionaryOptionPanel.layout | 45 + .../SingingStyleDefaultsOptionPanel.layout | 123 + .../SynthesizersOptionPanel.layout | 49 + .../PositionVector2.cs | 106 + .../Properties/AssemblyInfo.cs | 33 + .../UniversalEditor.Plugins.Multimedia.csproj | 344 + .../app.manifest | 55 + .../Accessors/HTTPAccessor.cs | 147 + .../DataFormats/StyleSheet/CSSDataFormat.cs | 83 + .../DataFormats/Text/HTML/HTMLDataFormat.cs | 163 + .../DataFormats/Text/MHTML/MHTMLDataFormat.cs | 155 + .../DataFormats/Text/MHTML/MHTMLHeader.cs | 94 + .../Web/StyleSheet/CSSDataFormat.cs | 97 + .../Description/WSDL/WSDLDataFormat.cs | 203 + .../NumericStringSplitter.cs | 88 + .../StyleSheet/StyleSheetAttribute.cs | 37 + .../StyleSheet/StyleSheetKnownProperty.cs | 128 + .../StyleSheet/StyleSheetObjectModel.cs | 42 + .../StyleSheet/StyleSheetProperty.cs | 130 + .../ObjectModels/StyleSheet/StyleSheetRule.cs | 39 + .../ObjectModels/Web/Measurement.cs | 47 + .../Web/MeasurementExtensionMethods.cs | 23 + .../ObjectModels/Web/MeasurementUnit.cs | 29 + .../Web/StyleSheet/StyleSheetAttribute.cs | 37 + .../Web/StyleSheet/StyleSheetKnownProperty.cs | 128 + .../Web/StyleSheet/StyleSheetObjectModel.cs | 55 + .../Web/StyleSheet/StyleSheetProperty.cs | 140 + .../Web/StyleSheet/StyleSheetRule.cs | 46 + .../Web/WebService/Description/Fault.cs | 21 + .../Web/WebService/Description/Input.cs | 21 + .../Web/WebService/Description/Message.cs | 32 + .../Web/WebService/Description/MessagePart.cs | 21 + .../Web/WebService/Description/Operation.cs | 30 + .../Web/WebService/Description/Output.cs | 21 + .../Web/WebService/Description/Port.cs | 24 + .../WebServiceDescriptionObjectModel.cs | 42 + .../Properties/AssemblyInfo.cs | 36 + .../UniversalEditor.Plugins.Web.csproj | 83 + CSharp/V5/UniversalEditor.sln | 171 + 1731 files changed, 176702 insertions(+) create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/App.config create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Program.cs create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.resources create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.resx create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.Designer.cs create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.settings create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/UniversalEditor.Bootstrapper.csproj create mode 100644 CSharp/V5/Applications/UniversalEditor.Bootstrapper/metro-mainicon.ico create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/App.config create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Program.cs create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/UniversalEditor.ConsoleBootstrapper.csproj create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/console.ico create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/console.png create mode 100644 CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/metro-mainicon.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Chunked.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/DataLink.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Executable.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FileSystem.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FormattedText.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Markup.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/PropertyList.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/SecurityCertificate.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Shortcut.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Branding/MainIcon.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Branding/SplashScreen.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Application.upl create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/CommandBars.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Commands.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/MainMenu.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/ObjectModels.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/SplashScreen.upl create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/StartPage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugBreak.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugStart.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugStop.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandAffect.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandCamera.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowDo.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowDoWait.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowWait.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandDeclare.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandElse.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandFlush.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandFree.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandIf.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandKill.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandLoop.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandMove.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandPlay.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandPrint.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandRem.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandRemove.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandRotate.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandRun.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSet.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSignal.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSound.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandTask.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandTemplate.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandUse.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandWait.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandWaitSignal.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Attribute.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Comment.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Entity.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Preprocessor.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Tag.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/16x16/Message.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/16x16/Service.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/32x32/Message.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/32x32/Service.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.UserInterface.WindowsForms.Editors.FileSystemEditor/Commands.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.UserInterface.WindowsForms.Editors.FileSystemEditor/KeyBindings.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AddressBook/Associations/Contact.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Concert/AniMikuConcert.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/FileSystem/AniMikuTexturePackage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/AniMikuPMD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/InivisAC3D.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/Super6.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Motion/AniMikuMotion.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/ASX.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/CompactDisc.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/HTML.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/M3U.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/Notepad++.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/PLS.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/SMIL.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/XSPF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Project/LMMS.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MIDI.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MusicXML.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/NIFF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/UST.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/Vocaloid.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/XMI.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/DirectWave.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/Vocaloid.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/VoicebankIndex/Vocaloid.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/AdvancedAudioCodec.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/FLAC.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG2Layer3.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG4Part14.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MicrosoftWave.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MonkeysAudio.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/Ogg.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/PropellerheadRecycle.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/RealAudio.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/ShortenAudio.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/SunAU.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/WavPack.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Caltron/Associations/TextureFont/TextureFont.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Concert/Concert.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Library/LibraryXML.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Model/ConcertroidMDL.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/DatabaseAdministrator/Themes/VisualStudio2012/Images/Templates/Project/Database Administrator/16x16/Database Project.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/DatabaseAdministrator/Themes/VisualStudio2012/Images/Templates/Project/Database Administrator/32x32/Database Project.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/7Zip.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ALTools.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/AR.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARC.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARJ.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Apple/HFS/HFSDataFormat.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Archive.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BPlus.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BinHex.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CFL.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CPIO.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/FAT.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ISO9660.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/IZArc.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Cabinet.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Z.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/LHA.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/Cabinet.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/CompoundDocument.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/MSCompressed.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/WindowsImage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/NeroDiscImage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/PKZip.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/REEVEsoft.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/SPIS.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StudioALCE.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StuffIt.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/TapeArchive.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/UUEncoding.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinACE.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinRAR.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/YamazakiZipper.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ZipTVBlakHole.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/AudioCollection/Synthesized/SPC2.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Cyberlore/Cyberlore.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Descent.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/187RideOrDie.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/2NBFPCK.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Abomination.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AlienNationsGD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AquarnoidGOB.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Arcanum.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/BurikoGeneralInterpreter.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ChaosWorksEngine.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/CompressedHunks.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DoomWAD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DreamfallPAK.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DynamixStarsiegeVOL.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Eighting.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ElectronicArtsBIGF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/FMODSoundBank.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GainaxLBX.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GameProgrammersWiki.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GarenaYanghx.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GotDGCD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GremlinInteractiveActuaSoccerMAD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Hardball.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HeroesOfThePacific.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HighwayPursuit.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Homeworld.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWaters.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWatersDAT.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HoyleCasino99PRF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HyPack.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IllusionGamesPP.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IndianaJonesGOB.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JackOrlandoPAK.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JadeEmpire.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KensLabyrinth.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Kronosaur.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MementoMoriRES.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoPaQ.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoeroDownhillNightPKD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/N2M-CTAR.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NScripter.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NamcoTales.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Nintendo/Optical/NintendoOpticalDisc.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NvidiaNPK.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PlayStation/PKG.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PrincessWaltzARC.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/RoxorInTheGroove.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SecretFilesTunguska.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SegaFARC.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SinisterGames.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/StellaGamesLzmaPack.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TerminalRealityPOD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TheLearningCompany.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TropicoHPK.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ValveGameCacheFile.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusBinaryDataFormatAssociation.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusTextDataFormatAssociation.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/AvalancheVBUF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/HalfLife2SMD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/IDSoftware.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/SegaAuth3D.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/ShaiyaOnline3DC.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/UltimateStuntsGLB.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Scene/IDSoftware.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCCampaign.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFileSystem.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFont.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCGameSave.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCMap.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPalette.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPicture.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCResourceBIN.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCSound.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Nintendo.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/AvalancheTBODY.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/BurikoGeneralInterpreter.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/ChaosWorksSprite.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/GIM.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/ReflexiveEntertainment/FRM16.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/PSF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/SPC.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealPackage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealUMOD.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/IdROQ.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/NintendoGameCubeTHP.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/RADTools.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/BRSTM.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/OSLib.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/ProjectTypes/{94E32BE3-D458-4786-A7E0-59DE5F769CDC}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/ACOColorPalette.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/AdobeSwatchExchange.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/GIMPColorPalette.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/JASCPaintShopPro.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/ARGB.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/DirectDrawSurface.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/GraphicsInterchange.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/I16.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/JPEG.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/LEADToolsImage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableAnyMapImage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableNetworkGraphics.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TMH.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TrueVisionTarga.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WaveletScalarQuantization.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WebP.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsBitmap.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsCursor.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsIcon.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsPaintbrushPicture.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/VectorImage/ExpressionDesign.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/PolygonMovieMaker.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/QAvimator.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Blender.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/InivisAC3D.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Metasequoia.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/PolygonMovieMaker.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Super6.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/ThreeDStudioMax.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/TriangleEditor.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/WavefrontOBJ.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/BiovisionHierarchy.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/PolygonMovieMaker.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Pose/PolygonMovieMaker.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/Cinema4D.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/PolygonMovieMaker.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/ImageCollection.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/InivisAC3D.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/OmpSkin.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/Super6.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/Model/Mcha.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/MotionPackage/MoPkg.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/ATRDataFormat.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/BALDataFormat.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/LightingWorkstation/Associations/Fixture/QLCFixture.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Michelangelo/Associations/Michelangelo.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Ada.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Boo.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/COBOL.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/CSharp.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FORTRAN.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FSharp.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Go.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Java.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/VisualBasicNET.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/ExecutableObjectModel/ELF.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Project/VisualStudio.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/PropertyList/VisualStudio.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Solution/VisualStudio.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{8891C1AE-6699-45DA-8B22-13BCEBB63364}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{F184B08F-C81C-45F6-A57F-5ABD9991F28F}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Basic Project.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/BlankProject.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Blink.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blank.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blink.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blink.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blink_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blink_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/C/GTK+ Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Class Library.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Console Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Database.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/COBOL.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Console_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Console_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/ControlLibrary_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/ControlLibrary_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Database_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Database_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Service_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Service_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Silverlight_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Silverlight_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Silverlight.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Windows Forms Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Class Library.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Console Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Database.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Blank.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Blank.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/ControlLibrary_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/ControlLibrary_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Database_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Database_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Silverlight_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Silverlight_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Test_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Test_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Silverlight.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Windows Forms Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Console Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Console_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Console_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Native Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Windows Forms Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Console Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Console_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Console_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/ControlLibrary_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/ControlLibrary_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Windows Forms Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Class Library.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Console Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Database.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Console_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Console_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/ControlLibrary_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/ControlLibrary_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Database_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Database_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Service_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Service_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/SliverlightApplication_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/SliverlightApplication_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Test_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Test_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Silverlight.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Windows Forms Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/MSOfficeAddin_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/MSOfficeAddin_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/UniversalEditorAddin_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/UniversalEditorAddin_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Blank Project.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Class Library.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Console Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/GUI Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Blank_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Blank_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Console_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Console_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/ActiveX Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Blank Project.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Class Library.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Control Library.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ActiveXApplication_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ActiveXApplication_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Application_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Application_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/BlankProject_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/BlankProject_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ControlLibrary_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ControlLibrary_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Wizard_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Wizard_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Standard Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/ProjectTypes/32x32/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Class Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Console Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Empty Project.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Server Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Browser Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Custom Control Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF User Control Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Web Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Web Site.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Windows Forms Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Windows Forms Control Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Windows Service.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Class Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Console Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Empty Project.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Server Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF Browser Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF Custom Control Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF User Control Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Web Site.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Forms Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Forms Control Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Service.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Class Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Console Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Silverlight Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Tutorial.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Class Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Console Application.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Silverlight Library.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Tutorial.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/16x16/Extension.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/16x16/WPF Toolbox Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/16x16/Windows Forms Toolbox Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/32x32/Extension.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/32x32/WPF Toolbox Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/32x32/Windows Forms Toolbox Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Catalog.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Setup.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/InstallShield/InstallShieldScript.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/Microsoft/ACME/BootstrapScript.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationPackage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationScript.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/UniversalEditorDeveloper/ProjectTypes/{13A1DBF5-B527-4218-9442-F1D165033AEB}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/HDMV.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/INDX.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MOBJ.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MPLS.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/QuickSub.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubRip.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubStationAlpha.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Video/AudioVideoInterleaved.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/AddressBook.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/CascadingStyleSheet.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/HTML.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/MimeHTML.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/WebServiceDescription.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{A0786B88-2ADB-4C21-ABE8-AA2D79766269}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{AB211699-2C6A-4FCC-97FB-F629B1023277}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/TravelRequest.xsn create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebForm.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebForm.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ASP.NET/IronPython/Images/Website_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ASP.NET/IronPython/Images/Website_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ASP.NET/IronPython/IronPython Web Project.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/ColdFusion Project.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/MainIcon.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/MainIcon.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/MainIcon_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/MainIcon_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/PHP Web Project.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/English.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/Japanese.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.FileSystem.FileSystemObjectModel.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Shortcut.ShortcutObjectModel.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Text.Plain.PlainTextObjectModel.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/OptionPanels/Application.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ProjectTypes/{EA90755A-4A5D-4FA4-B676-F7BBD8CF0D84}.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/AssetsDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ContactsDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/EventsDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/FacultyDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/IssuesDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/MarketingProjectsDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/NorthwindDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ProjectsDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/SalesPipelineDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/StudentsDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/TasksDatabase.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/database.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/windows_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/windows_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Asset Tracking.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Expense Report.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Meeting Agenda.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Status Report.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Travel Request.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_48x48.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/AutoCAD_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/AutoCAD_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Inventor_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Inventor_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/NavisWorks_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/NavisWorks_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/RevitManifest_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/RevitManifest_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Revit_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Revit_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/ConcertProject.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/LibraryProject.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyFileSystem.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyTorrent.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/FileSystem_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/FileSystem_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent.ico create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent.xcf create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent_16x16.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent_32x32.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileClose.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileExit.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewFile.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewProject.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewTeamProject.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewWebSite.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenFile.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenProject.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenTeamProject.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenWebSite.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FilePageSetup.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FilePrint.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileSave.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileSaveAll.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/16x16/Blank Solution.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/16x16/Package.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/16x16/Plugin.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/16x16/Shell Isolated.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Blank Solution.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Package.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Plugin.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Shell Isolated.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/CSharp.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/CSharp_Project.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Control.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Form.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/PropertiesFolder.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Reference.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Resources.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Solution.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/UserControl.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/generic-file.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/generic-folder-closed.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/generic-folder-open.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/hidden-folder-closed.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/hidden-folder-open.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Theme.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2013/Dark/Images/TreeView/generic-folder-closed.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2013/Dark/Images/TreeView/generic-folder-open.png create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/Default.xml create mode 100644 CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/VisualStudio2013.xml create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangedEvent.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangingEvent.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/IconMethods.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/LocalConfiguration.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.settings create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/mainicon.ico create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/ueproj-icon.ico create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/uesln-icon.ico create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/TemporaryFileManager.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/UniversalEditor.Engines.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/WindowsFormsEngine.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/CommonDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.resources create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/FilePropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ExtensionMethods.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/FakesAssemblies/UniversalEditor.Plugins.Multimedia.Fakes.dll create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/FakesAssemblies/UniversalEditor.Plugins.Multimedia.Fakes.fakesconfig create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/FakesAssemblies/UniversalEditor.Plugins.Multimedia.Fakes.xml create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/HostApplication.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IHostApplicationWindow.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IconMethods.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ImageListExtensionMethods.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/MenuBar.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddExisting.png create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddNew.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddNew.png create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddNewFolder.png create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/TemporaryFileManager.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/UniversalEditor.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/VirtualFileDataObject.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Resources/Setup.ico create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Resources/Uninstall.ico create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Resources/setup.ico create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/UniversalEditor.Plugins.Microsoft.Setup.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/ExtensionMethods.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollTool.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditorTool.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/Track.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/TrackChannel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/MyCursors.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.layout create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/ExternalProgramsOptionPanel.layout create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/MIDIOptionPanel.layout create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/PhonemeDictionaryOptionPanel.layout create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SingingStyleDefaultsOptionPanel.layout create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SynthesizersOptionPanel.layout create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Resources/Eraser.cur create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Resources/Pen.cur create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer (miku's conflicted copy 2012-10-08).cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerAreas/BasicDesignerArea.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcButtonClass.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcGenericControlClass.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_01_Welcome.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_02_License.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_03_Destination.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_04_Summary.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_05_Progress.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_06_Finish.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_01_Welcome.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_02_Progress.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_03_Finish.bmp create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/IconMethods.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.Designer.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.resx create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/UniversalEditor.Plugins.Web.UserInterface.WindowsForms.csproj create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/BlockType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/BurrowsWheelerTransform.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/CompressionTracingSwitch.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/DecodeHelper.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/HuffmanTree.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/InputBuffer.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/MT19937ar.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/Match.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/RunLengthEncoding.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Common/Sorting.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/CompressionFailureException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMethod.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMode.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModules.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZ/LZ.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZH/LZHStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZMA/LZMAStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZPL2/LZPL2CompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSS2.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSSCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZW/Internal/Element.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/LZW/LZWStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Bzip2CompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Constants.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Exception.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2InputStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2OutputStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/StreamUtils.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateStreamAsyncResult.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/DeflateInput.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Deflater.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoder.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderStatics.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderWindow.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Inflater.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/OutputWindow.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/ExplodeCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeDelegates.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeHuffman.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeInfo.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeState.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipDecoder.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipHeaderState.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZRW1/LZRW1CompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/Internal/Constants.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/LZXCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CNX.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CXLZ.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Compression.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CompressionFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzBufferDictionary.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzWindowDictionary.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionary.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ00.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ01.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZSS.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/ONZ.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PRS.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PuyoCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/XMemLZX/XMemLZXCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Adler32.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Deflate.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfBlocks.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfCodes.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfTree.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Inflate.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/StaticTree.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/SupportClass.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Tree.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZInputStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZOutputStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStreamException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Zlib.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/ZlibCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/OutOfInputException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/PPmD/PPmDStream.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/RLEW/RLEWCompressionModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/UniversalEditor.Compression.csproj create mode 100644 CSharp/V5/Libraries/UniversalEditor.Compression/UnsupportedWindowSizeRangeException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Accessor.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/AccessorReference.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Accessors/FileAccessor.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Accessors/MemoryAccessor.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StreamAccessor.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StringAccessor.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Association.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/AssociationCriteria.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Checksum/ChecksumModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/Adler32/Adler32ChecksumModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/CRC32/CRC32ChecksumModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/StrangeCRC/StrangeCRCChecksumModule.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Common/Path.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Common/Strings.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormatItem.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/CustomOption.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataCorruptedException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataFormatCapabilities.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataFormatException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataFormatFilter.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataFormatHintComparison.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/DataFormatReference.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Document.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Endpoint.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/ExtensionMethods.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/Array.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/Encoding.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/EndOfStreamException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/Endianness.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/NewLineSequence.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/Reader.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/ReaderWriterBase.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/SeekOrigin.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/IO/Writer.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/InvalidDataFormatException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/LastUsedAccessor.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Localization/StringTable.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/ObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelCustomProperty.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelNotSupportedException.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelReference.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/ProgressEvent.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/Ptr.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/References.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Core/UniversalEditor.Core.csproj create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/AutoDictionary.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/BidirectionalDictionary.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/KeyValuePairList.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Common/Reflection.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Condition.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Converter.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/AbstractSyntax/DER/DERDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/REV/REVDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/RIFF/RIFFDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/CoreObject/CoreObjectDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/FileSystem/UXT/UXTDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/EBML/EBMLDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormatSettings.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListSettings.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/UniversalPropertyListDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/VariantType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/WindowsConfigurationDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/XML/XMLPropertyListDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLSettings.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Certificate/DER/DERCertificateDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyAlgorithm.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFCharacterSet.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFGenerator.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ExpandedString.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePair.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePairGroup.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/AbstractSyntax/AbstractSyntaxObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/ChunkedObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFChunk.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFDataChunk.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFGroupChunk.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFMetadata.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectAttribute.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectGroup.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectProperty.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/DataLink/DataLinkObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/CompressedFile.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs.bak create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileAttributes.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSourceTransformation.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/AccessorFileSource.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/EmbeddedFileSource.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/PhysicalFileSource.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/Folder.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemContainer.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObject.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObjectType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupAttribute.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupCommentElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupContainerElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupLiteralElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupPreprocessorElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupStringElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupTagElement.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFile.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFileSystem.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFolder.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/Reference.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Group.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Property.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyListObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyValueType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItem.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemGroup.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemLiteral.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemTag.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Certificate/CertificateObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Key/RSA/RSAKeyObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Solution/SolutionObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFont.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFontFamily.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextItem.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyle.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyleGroup.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/IFormattedTextItemParent.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemBold.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemContainer.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemFontSize.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemHyperlink.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemLiteral.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemParagraph.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/UEPackage/UEPackageObjectModel.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTask.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskAction.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionConvert.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionExecute.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionPackage.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskEvent.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTypeVariable.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/Template.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/BookmarksManager.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Command.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandBar.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandDisplayStyle.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandItem.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandShortcutKey.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Common/Reflection.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/ConfigurationManager.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/CustomOptionDialogType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/EditorReference.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Engine.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/EngineMainMenu.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplication.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationMessage.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationOutputWindow.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/IEditorImplementation.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/IHostApplicationWindow.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/IOptionPanelImplementation.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Language.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/MenuBar.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/ObjectModelChangingEvent.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Perspective.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/PropertyMapping.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/RecentFileManager.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/SessionManager.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Settings/SettingsManager.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/SingleInstanceManager.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/StockCommandType.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbar.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbox.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/UnsavedDocumentOption.cs create mode 100644 CSharp/V5/Libraries/UniversalEditor.UserInterface/WindowState.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Color.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSCompressedDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSProjectDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommand.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommandType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDIDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/NIFF/NIFFDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/SPC/SPC700DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/UTAU/USTDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/BRSTM/BRSTMDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/FLACDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP3/MP3DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP4/MP4DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APEDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/OGG/OGGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/REX2/REX2DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/RealAudio/RealAudioDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/Shorten/ShortenDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuEncoding.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/WavPack/WavPackDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/HDMVDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/INDXDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MOBJDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MPLSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSCompressedDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSProjectDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/ExtendedMIDI/XMIDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommand.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommandType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDIDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/NIFF/NIFFDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFPlatform.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/UTAU/USTDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIParameter.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryXMLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/BRSTM/BRSTMDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/FLACDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP3/MP3DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP4/MP4DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APEDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/OGG/OGGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/REX2/REX2DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/RealAudio/RealAudioDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/Shorten/ShortenDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuEncoding.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/WavPack/WavPackDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/BDJODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/HDMVDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/INDXDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MOBJDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MPLSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ACODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ASEDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/GIMP/GPLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/PaintShop/PaintShopPaletteDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ARGB/ARGBDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapBitsPerPixel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapCompression.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapInfoHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/BitmapDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CURDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ChaosWorks/CWESpriteDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/CompressedBGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/Internal/NodeCBG.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMImageFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPaletteFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPartType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPixelOrder.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMSwizzleEncoder.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchangeDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/I16/I16DataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ICODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/GroupICODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/ICODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGMarker.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/LEAD/CMPDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapBitsPerPixel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapCompression.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapInfoHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/DirectDrawSurfaceDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DXTDecompression.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps1.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps2.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceHeaderFlags.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceLoadInfo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormatFlags.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Paint/MSPDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGChunk.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGColorType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionMethod.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionModule.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGFilterType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGPredictionType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortablePixelmap/PPMDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/TMH/TMHDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFirstPixelDestination.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaHorizontalTransferOrder.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaImageType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaRLEPacketType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaVerticalTransferOrder.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/Constants.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/WSQDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WebP/WebPDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WirelessBitmap/WBMPDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/ASXDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/CDDA/CDDADataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/HTMLPlaylistDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/M3UDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/NotepadPlusPlaylistDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/PLSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/SMILDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/XSPFDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/QuickSub/QuickSubTextDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubRip/SubRipDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubStationAlpha/SubStationAlphaDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/VectorImage/Microsoft/ExpressionDesign/ExpressionDesignDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/AVI/AVIDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Bink/BinkDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Smacker/SmackerDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQChunk.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/THP/THPDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UEV/UEVDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSColorspace.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSFlags.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSLayoutID.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapBitsPerPixel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapCompression.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapInfoHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/BitmapDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CURDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CompressedBG/CompressedBGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchangeDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/ICODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/GroupICODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/ICODataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGMarker.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/MicrosoftDDSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGChunk.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaExtensionArea.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaFirstPixelDestination.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaHorizontalTransferOrder.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaImageType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaRLEPacketType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaVerticalTransferOrder.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TrueVisionTGADataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/Constants.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/WSQDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/ASXDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/CDDA/CDDADataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/HTMLPlaylistDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/M3UDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/NotepadPlusPlaylistDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/PLSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/SMILDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/XSPFDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/AVI/AVIDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Bink/BinkDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Smacker/SmackerDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQChunk.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/THP/THPDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/UEV/UEVDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.resources create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/ProgressDialog.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/ProgressDialog.resources create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/VoicebankEditorDialog.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/VoicebankEditorDialog.resources create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/OptionPanels/Editors/Audio/Synthesized/SynthesizerPropertiesDialog.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/OptionPanels/Editors/Audio/Synthesized/SynthesizerPropertiesDialog.resources create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Picture/ToolSettingsDialog.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Picture/ToolSettingsDialog.resources create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Playlist/PlaylistEntryPropertiesDialog.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Playlist/PlaylistEntryPropertiesDialog.resources create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ExtensionMethods.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelDocumentProperties.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelInformation.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Project/AudioProjectObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommand.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandNote.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandRest.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTempo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandText.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioStylePlugin.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioVibratoType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSample.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSynthesisParameters.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioExtendedHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioKnownFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelDocumentProperties.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelInformation.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Project/AudioProjectObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Soundfont/SoundfontObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommand.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandNote.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandRest.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTempo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandText.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioStylePlugin.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioVibratoType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSample.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSynthesisParameters.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankIndex/VoicebankIndexObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/Phoneme.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeList.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioExtendedHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioKnownFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteEntry.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/Collection/PictureCollectionObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItem.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItemType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PicturePathItem.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistAlbumInformation.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistEntry.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Actor.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Event.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Style.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/SubtitleObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/VectorImage/VectorImageObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Video/AudioTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Video/VideoFrame.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Video/VideoObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Video/VideoTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Picture/PictureItem.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Picture/PictureItemType.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Picture/PictureObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Picture/PicturePathItem.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Playlist/PlaylistAlbumInformation.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Playlist/PlaylistEntry.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Playlist/PlaylistObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Video/AudioTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Video/VideoFrame.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Video/VideoObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Video/VideoTrack.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.layout create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/OptionPanels/Editors/Audio/Synthesized/ExternalProgramsOptionPanel.layout create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/OptionPanels/Editors/Audio/Synthesized/MIDIOptionPanel.layout create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/OptionPanels/Editors/Audio/Synthesized/PhonemeDictionaryOptionPanel.layout create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/OptionPanels/Editors/Audio/Synthesized/SingingStyleDefaultsOptionPanel.layout create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/OptionPanels/Editors/Audio/Synthesized/SynthesizersOptionPanel.layout create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/PositionVector2.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/app.manifest create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/Accessors/HTTPAccessor.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/DataFormats/StyleSheet/CSSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/DataFormats/Text/HTML/HTMLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/DataFormats/Text/MHTML/MHTMLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/DataFormats/Text/MHTML/MHTMLHeader.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/DataFormats/Web/StyleSheet/CSSDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/DataFormats/Web/WebService/Description/WSDL/WSDLDataFormat.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/NumericStringSplitter.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/StyleSheet/StyleSheetAttribute.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/StyleSheet/StyleSheetKnownProperty.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/StyleSheet/StyleSheetObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/StyleSheet/StyleSheetProperty.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/StyleSheet/StyleSheetRule.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/Measurement.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/MeasurementExtensionMethods.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/MeasurementUnit.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/StyleSheet/StyleSheetAttribute.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/StyleSheet/StyleSheetKnownProperty.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/StyleSheet/StyleSheetObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/StyleSheet/StyleSheetProperty.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/StyleSheet/StyleSheetRule.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/Fault.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/Input.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/Message.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/MessagePart.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/Operation.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/Output.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/Port.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/ObjectModels/Web/WebService/Description/WebServiceDescriptionObjectModel.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/Properties/AssemblyInfo.cs create mode 100644 CSharp/V5/Plugins/UniversalEditor.Plugins.Web/UniversalEditor.Plugins.Web.csproj create mode 100644 CSharp/V5/UniversalEditor.sln diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/App.config b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/App.config new file mode 100644 index 00000000..3f3aad40 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/App.config @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Program.cs b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Program.cs new file mode 100644 index 00000000..54866166 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Program.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Bootstrapper +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + try + { + string path = + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + + System.IO.Path.DirectorySeparatorChar.ToString() + + "UniversalEditor.UserInterface.dll"; + + Assembly asm = System.Reflection.Assembly.LoadFile(path); + } + catch + { + MessageBox.Show("The file 'UniversalEditor.UserInterface.dll' is required for this software to run, but is either missing or corrupted. Please re-install the software and try again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + // why do we do this? because, if the class was static, it tries to load the 'Engine' type + // from another library immediately... if it can't be found, it crashes. this way, if it + // can't be found, we can still catch it since it's loaded on-demand rather than + // immediately. + (new BootstrapperInstance()).Main(); + } + + private class BootstrapperInstance + { + public void Main() + { + if (!Engine.Execute()) + { + MessageBox.Show("No engines are available to launch this application.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + } +} diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/AssemblyInfo.cs b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a4ab2f22 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor platform bootstrapper")] +[assembly: AssemblyDescription("Provides a customizable launcher for applications built on the Universal Editor platform.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1dadbca9-3758-422e-a7fa-7992be9b2f5c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.Designer.cs b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.Designer.cs new file mode 100644 index 00000000..ee4b7225 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Bootstrapper.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Bootstrapper.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.resources b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Resources.resources new file mode 100644 index 0000000000000000000000000000000000000000..06c24d06c1cab750788146ce052b37770f3fa530 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.Designer.cs b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.Designer.cs new file mode 100644 index 00000000..f2649176 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Bootstrapper.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.settings b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/UniversalEditor.Bootstrapper.csproj b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/UniversalEditor.Bootstrapper.csproj new file mode 100644 index 00000000..eebbe8cc --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/UniversalEditor.Bootstrapper.csproj @@ -0,0 +1,95 @@ + + + + + Debug + AnyCPU + {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2} + WinExe + Properties + UniversalEditor.Bootstrapper + UniversalEditor + v4.0 + 512 + 10.0.0 + 2.0 + + + + x86 + true + full + false + ..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\..\Output\Release\ + TRACE + prompt + 4 + + + metro-mainicon.ico + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + + + \ No newline at end of file diff --git a/CSharp/V5/Applications/UniversalEditor.Bootstrapper/metro-mainicon.ico b/CSharp/V5/Applications/UniversalEditor.Bootstrapper/metro-mainicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ac00229952812a75e0183746537a408a9807da3c GIT binary patch literal 44367 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/App.config b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/App.config new file mode 100644 index 00000000..3f3aad40 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/App.config @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Program.cs b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Program.cs new file mode 100644 index 00000000..0723419a --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Program.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.ConsoleBootstrapper +{ + class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + if (!Engine.Execute()) + { + ConsoleColor oldcolor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("ERROR: No engines are available to launch this application."); + Console.ForegroundColor = oldcolor; + + Pause(); + } + } + + private static void Pause() + { + Console.Write("Press any key to continue . . . "); + Console.ReadKey(true); + } + } +} diff --git a/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Properties/AssemblyInfo.cs b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a314c97f --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor platform bootstrapper (console)")] +[assembly: AssemblyDescription("Provides a customizable launcher with a debug console for applications built on the Universal Editor platform.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("78501f14-ac94-478c-913c-b325e8d5f438")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/UniversalEditor.ConsoleBootstrapper.csproj b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/UniversalEditor.ConsoleBootstrapper.csproj new file mode 100644 index 00000000..1c2732d7 --- /dev/null +++ b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/UniversalEditor.ConsoleBootstrapper.csproj @@ -0,0 +1,73 @@ + + + + + Debug + AnyCPU + {62CFC025-B8CF-42AA-880A-92F27377FCAF} + Exe + Properties + UniversalEditor.ConsoleBootstrapper + UniversalEditorConsole + v4.0 + 512 + 10.0.0 + 2.0 + + + + AnyCPU + true + full + false + ..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\..\Output\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + + + \ No newline at end of file diff --git a/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/console.ico b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/console.ico new file mode 100644 index 0000000000000000000000000000000000000000..b557fa772debb99478fcb86dfe8cb68553b849a1 GIT binary patch literal 25214 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 OL_u5iAS7Tp;{O3g*#@8h literal 0 HcmV?d00001 diff --git a/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/console.png b/CSharp/V5/Applications/UniversalEditor.ConsoleBootstrapper/console.png new file mode 100644 index 0000000000000000000000000000000000000000..de173f18cfec355e5f684b2eed0f779ed7b4974b GIT binary patch literal 272 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Chunked.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Chunked.xml new file mode 100644 index 00000000..38eee6c0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Chunked.xml @@ -0,0 +1,38 @@ + + + + + + + + + *.riff + + + + RIFF + + + RIFX + + + FORM + + + LIST + + + CAT + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/DataLink.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/DataLink.xml new file mode 100644 index 00000000..6ebb7d14 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/DataLink.xml @@ -0,0 +1,26 @@ + + + + + + + + + *.udl + + + + [oledb] + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Executable.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Executable.xml new file mode 100644 index 00000000..64fccdec --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Executable.xml @@ -0,0 +1,85 @@ + + + + + + + + + *.exe + *.com + *.dll + *.rll + *.fon + *.olb + *.tlb + + + + MZ + + + + + + + + + + + + + + + + *.axf + *.bin + *.elf + *.o + *.prx + *.puff + *.so + + + + 7F + ELF + + + + + + + + + + + + + + + + *.dylib + *.bundle + + + + + FEEDFACE + + + + CEFAEDFE + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FileSystem.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FileSystem.xml new file mode 100644 index 00000000..9c91a5d2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FileSystem.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + *.uxt + + + + Universal Editor extension file + 00 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FormattedText.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FormattedText.xml new file mode 100644 index 00000000..0a42ef1f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/FormattedText.xml @@ -0,0 +1,26 @@ + + + + + + + + *.xps + *.oxps + + + + 1A45DFA3 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Markup.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Markup.xml new file mode 100644 index 00000000..8dccaab1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Markup.xml @@ -0,0 +1,47 @@ + + + + + + + + + *.ebml + + + + 1A45DFA3 + + + + + + + + + + + + + + + + + *.xml + + + + <?xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/PropertyList.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/PropertyList.xml new file mode 100644 index 00000000..a80b42a3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/PropertyList.xml @@ -0,0 +1,110 @@ + + + + + + + + + *.ini + *.inf + + + + + + + + + + + + + + + *.vcs + *.ics + *.vcf + + + + + + + + + + + + + + + *.inix + *.xni + + + + + + + + + + + + + + + *.tpl + + + + #TPL-1.0 + + + + + + + + + + + + + + + + *.upl + + + + UPLF + + + + + + + + + + + + + + + + *.cfg + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/SecurityCertificate.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/SecurityCertificate.xml new file mode 100644 index 00000000..287c4ebe --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/SecurityCertificate.xml @@ -0,0 +1,40 @@ + + + + + + + + + *.cer + *.der + *.p7b + + + + 3082 + + + + + + *.cer + *.der + *.p7b + + + + -----BEGIN CERTIFICATE-----\r\n + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Shortcut.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Shortcut.xml new file mode 100644 index 00000000..002965e3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Associations/Shortcut.xml @@ -0,0 +1,41 @@ + + + + + + + + *.desktop + *.directory + + + + + + + + + + + + + + + *.lnk + + + + 4C000000 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Branding/MainIcon.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Branding/MainIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cae06de020d39a6e8357638f5da457bf2e1ef09c GIT binary patch literal 77123 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 BrA7b% literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Branding/SplashScreen.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Branding/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a82b6b38126cc8268eff45c4737d02bd2cbb6dfc GIT binary patch literal 4774 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Application.upl b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Application.upl new file mode 100644 index 0000000000000000000000000000000000000000..1e09ee881768bbdd3093f03724fe6c93a9760d9a GIT binary patch literal 68 zcmWFy@Nr{cXs~x-fC5G!?O0HdlbM`Yl9`{!0OErHe@JFYPAY?QeqM5FQAtsLW{RRh La7k%OW + + + + + + + + C:\Temp\UETEST\uetest.farc + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/CommandBars.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/CommandBars.xml new file mode 100644 index 00000000..8e2e7703 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/CommandBars.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Commands.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Commands.xml new file mode 100644 index 00000000..16ea1f17 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/Commands.xml @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/MainMenu.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/MainMenu.xml new file mode 100644 index 00000000..5275d841 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/MainMenu.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/ObjectModels.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/ObjectModels.xml new file mode 100644 index 00000000..2f96c0e7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/ObjectModels.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/SplashScreen.upl b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/SplashScreen.upl new file mode 100644 index 0000000000000000000000000000000000000000..9d7f75525ee42818dba95d64f3ad69ad25905483 GIT binary patch literal 47 wcmWFy@Nr{cXt39300Kr30R;TP1v!bu8Nta#si}Fcd5K9msVNL4MWv|>0NiK`YybcN literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/StartPage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/StartPage.xml new file mode 100644 index 00000000..6aeb42df --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Configuration/StartPage.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugBreak.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugBreak.png new file mode 100644 index 0000000000000000000000000000000000000000..abf9e61a1579fc14f8648709e25d3ed8000571f3 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)n-DJpXPUwjA)t_KW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6rbnm;uvCa`t1cnK1W9Zwg>-n=lMNid-p)bt9(J&4%R|W z^8n8;GOTlLQqszgWw~t3Pl?n1Sbjg{`}vfH`Tn7NVbNz-b)Ej%a&$?2E?;y1^v#K{ zYc<$cb$!%G*ls_ojN65EuT}F5pWUpQnh^|YMsM>cuzY8Cc+bDoI%mR#55hhzopr E0Iu_grT_o{ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugStop.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/Commands/mnuDebugStop.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3c06eaae2f17e25f4f8d9de696bc162cd8a896 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)n-DL9*lUfK&w)a+nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^0|O(2r;B5V#p$;bPWv)D3b3AD9eYTD{gHyeB*so{76+yd z4v*IEiF^0|{N}U0eYLLg?;e-C_ZE6DZL>fBtion*w6XD(DN(#@z1E7FI)}d8eeCh! zwFrw+xpI?Px1xf+IZFLEJ8{(xE&C}`~&UAd9rt@>t zf-vWjgm3KEF3hM&aSX9IeRpyoUxNXMbM*WA6-AqVE%a7<6*EQuXSUOQ zt`vvVn{6u0AJlknXGBdZujM~+HvEF7gYk0_$qhBKyTt?q>x`br&AXn^$DnfeHy@`; wzopr03_;G`2YX_ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandCamera.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandCamera.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa00737774ac22d9a5c14e34171a6fb13314b16 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix>|xcX)EeU!ag|W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6wmc^aSX9IeROgl7lR^)%kg*h8rC;&&%cwkF*d_qh{dzk zn8S1V;YAJ~EPZF2CmKy&vPsdBbE^I6YQA$!FWm2!e`uJp^5Ukdz4KRJzgJzTKlpG5!&bhgy-InzOh7L3boFyt=akR{04APS A0ssI2 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowDo.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowDo.png new file mode 100644 index 0000000000000000000000000000000000000000..9a897e3830372a7efd3c99e1ab2e12f8adb464d0 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix>}!y4J6zn?NDi%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dB<|_r7-DfcIbnf-fzrnRlNa~1I_rIjX!n6$u zp%MMAYXo=C^qJCja0TNNsSouLt&HEM-0)CPHV85_4&-6jev*B$A;;eBAbUJr{an^L HB{Ts54?;qG literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowDoWait.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandControlFlowDoWait.png new file mode 100644 index 0000000000000000000000000000000000000000..31e4f7ef68b59e42474f8ee65f61197bb0063a97 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!3HFMCO(@Aq}Y|gW!U_%O?XxI14-? zi-9VIL70(Y)*K0-AbW|YuPggq7BL=HaZ!tA6QGc6W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6nFJ>aSYKopPZ7A@Z-FLN}!&R&h^K%kIpW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J68Cg*46!(!oUlN^KxyOu$&340W0x`ZuVdTc`(ILGVcLd- z;D~T*3H6>O*}*E912(H#{_y4T21f19=#Bd9g2MJHG5D$R1BuKbLh* G2~7Z%&Ox34 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandDeclare.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandDeclare.png new file mode 100644 index 0000000000000000000000000000000000000000..a79a3934b4ac3de6637a4ac8ec66c1d1c9b3def5 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{`1>gwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{Jr+)J(JL(7B@WwMKum~rL}tvJ}@vGYZX@F)LOL&WR<6@ KpUXO@geCx^4nXAq literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandFlush.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandFlush.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2d1b675d9be32e81ce623b801d83bcbbaa9e89 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{^VTi==sKzRn)%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dC?4YJ;uvCa`fZS*&;bJurhos_t-enBwrEr7%GpehRvx&1 z(AMz5)EWM2wbxIuYHnVr?XmHPZQzvzf$zLbh5L`h9r?`Ce7kdTr$J(uz1lvf($9gwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{Jr+)J(JL(7B@WwMKum~rL}tvJ}@vGYZX@F)LOL&WR<6@ KpUXO@geCx^4nXAq literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandKill.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandKill.png new file mode 100644 index 0000000000000000000000000000000000000000..a79a3934b4ac3de6637a4ac8ec66c1d1c9b3def5 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{`1>gwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{JrXVbhk^KHA=vithB!|BACJoYjX)vU%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD4yc!;uvCa`e<-8*8u|#?&7kvwqh)!R-uKB6I3coXV zP7{N|3)Pt!&!1#Wm~h2+-Zt57C5bZUg94c+PAi=?H+ktL8DVX6`;IBB$Bc8@YqT#$ q$35QlUU7DUn;)mk6aRmQ{#!6uuauR)vqb+i$RVDtelF{r5}E+)nNrRG literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandPlay.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandPlay.png new file mode 100644 index 0000000000000000000000000000000000000000..a79a3934b4ac3de6637a4ac8ec66c1d1c9b3def5 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{`1>gwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{JrgwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{JrgwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{Jr}+63?lN7l1;tnIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P`ujH#WBR<^wmj$d!|TEehZWo69y#G4EZXBN~>US*ywaq7Xe1WvJ?tLF3Ei7j3(I;He5N9jFV zorAx2oewDceC~r^_`Cznj4!7bylKz-*;8JypS${{d`pI%+RN?bA0JyV2wqD5d+B{f PAIN>4u6{1-oD!M}smVvr;0#HacGbEzKIX^cyHLnE7WngeFN=+cV_8QIs69B_!#^gmNuAZdwMoa=z69yDLi1)T?J7E z_IC=Z3F|(wNHT;Lu|_h5owWVI8BqH7vfQ3e)+ZdY`4}?JI>vRE-15HJ`{uRn4d0X> m*BB$#742*OB=gwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{Jr}+!T;g~Gk`*}nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P~6Vb#WBRHQp00i_>zopr0K~*V A2><{9 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSignal.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSignal.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef94ff202dccd231150b02c22bcbe615ca137d4 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{`H&V!xlFMvX_nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P(0St#WBR<^wCMT`5F{>oWmdg|NrS@=0ri2SxGm9uU|5j zN}N{2V6uAA9Hyz>yOy`VelX`xdo&Nv5CA kbGhahZ7}NGcHrMG2E8Uxp(8>boFyt=akR{0HX_2`Tzg` literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSound.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandSound.png new file mode 100644 index 0000000000000000000000000000000000000000..ef38926ab931039f7a4b4f335bd92b81fc752a37 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{`Hb#m4teV~wRW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6c6)saSX9IeRk48z5@z8PMRP8*GuYKcP%PD=~0#aa4bB<(x bRR0$y>!K(q%kVpJ3CLaSX9IeRpyoUxNXMbM*WA6-AqVE%a7<6*EQuXSUOQ zt`vvVn{6u0AJlknXGBdZujM~+HvEF7gYk0_$qhBKyTt?q>x`br&AXn^$DnfeHy@`; wzopr03_;G`2YX_ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandTemplate.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..e68c90371635137f9d7350fff5808677b8f71388 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix>~9NRQ#AKA@0nW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6gT&DaSX9Iotz+%aiHVO&+`X9$RGUKKOs5gPyZ4|SAOBJ vgwRV=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>9vys`3@`aIL9x$$GvXb?AFPZ^1`A^TD+ol zpDGK89OwI>qVn)vu-?lvcWX~Et`TS2a*ZV*TT;%H!Anz2de+S=kqV7Z-kmykOk(BI z*4@?(;Y&nUu3OP>@#sw23%{Jr z$iBetd3qYxe4*!+JsUJU9Um$DnA6F|sGhzI r>WfZ+p`u$#SFMV&+Eu&#(@%B3iLGW54pANdKo0SA^>bP0l+XkKIZ;*C literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandWaitSignal.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Icarus.IcarusScriptEditor/Images/ImageList/16x16/IcarusCommandWaitSignal.png new file mode 100644 index 0000000000000000000000000000000000000000..acabd03db06bc5c6c816df7b74f5dd8adfeeb8fb GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)ix{`H%&~-U7od=AW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6!-IVaSX9I{Wjn<7lQ&%(Zm1$H^pjotk5mv`n09pO6`Nq z8gZr)MJX#kX;zyv%ccolddU#`=-irxDb7ny7ZfGF_&%XA<*du;Hv&ag%}xDWZ>I1o T?vR-K31p?GtDnm{r-UW|Pq#{5 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Attribute.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Attribute.png new file mode 100644 index 0000000000000000000000000000000000000000..913bfaafad6d1f045146d74ef73d016e246fa800 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)i-dqWe+X+qDo{u^GbEzKIX^cyHLnE7WngeFN=+o7?DrZ2(d%F6$taD0e0s!)qJp2Fv literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Entity.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Entity.png new file mode 100644 index 0000000000000000000000000000000000000000..3d673c259e713f841ee23a9cf27e7c2f1af32b3e GIT binary patch literal 528 zcmV+r0`L8aP)WFU8GbZ8()Nlj2>E@cM*00DGKL_t(I%f*wwOWQ#h z#y{^R+Nebc4mt$?g?1@8=+aHFoh&FgbSMOuT7%F*8qYu|)JaPQ1^)oMxL8_Cr)KFt z(50iGPy|IIP0-|?4&OvHKQM#P8(xm*xX*jf^K$UNm$ehKRHq#7o#2r{Sx^*VBS-xE zod8emg|HpN+MKm&u2~Sa7F`ZY70!|u{22(;o(UDZvamv^8Ww|-LC;X>t_)lo;^%0W z^xcH$ZhQRIBRH<3GM-TIcHxF-9kT?)JT*akYULZ#D zU{4LDJ#I0eS)nV#(vaPP-m!Ye-A)$f04kKe0OW{$65%=MFW4(#A3^6=RNi+2B%<!TiNt1=^5SJ;B_VAzx zHrkrCeu9lf5UsD`-n3ZA({})+$Dj|O-=IsOQ=tO<7>6(ex-e|P6Y}@=8~*_WJbWu# S$R)S{0000QY)Uzk52=;6R%wBIiL0-#5t;;1RohL3gIhcRq=)}X; zhrTo2x;J4-Skp2Cv4=Tx1$QvpovvBdG{L*!N3-YE*~^+Xs5!juePhs*&9A$7lNfvT Zb$M@_2nBD*Y literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Tag.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.MarkupEditor/Images/Tag.png new file mode 100644 index 0000000000000000000000000000000000000000..7b21ac675a22b7ab4765f7b959bf5da7ee1083c7 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)i-drh9%Ff66;MbvGbEzKIX^cyHLnE7WngeFN=+eP1lp&GNs;t4x_Ji^Tu_p>{tKD`gwy3VC za^hOR+!D#8W&9!d!o4>62a<=RV(x7Soi2W&vFw3*n)2E@U;TTl*Pc4_XXTF#0ge${ zH+&FF%DWKW;p*FQ(zs8z-!I+AZVBs)FUj^#*p8~kZ_^8NtOj|))78&qol`;+0AMz1 AX8-^I literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/16x16/Message.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/16x16/Message.png new file mode 100644 index 0000000000000000000000000000000000000000..0e94ffdbcb73b274ddf43c9ce7b19451275784e2 GIT binary patch literal 643 zcmV-}0(||6P)WFU8GbZ8()Nlj2>E@cM*00HMoL_t(I%dL}5PZLoT zhM!wnCPG^av?dc#5Q8QrlHdYtbSJ_14_y08+_-b;-WdOatu)cZ01FI;VkD@GCZ=@w zD4iMT*L>ZXadE5Bb-A09+?+h;ecyAh0Epul02%bKj`y&eHEi>Uj@6>y?Gc8O)TqW- zW`bN^C$HZ|pIJn^ltp~0JdXi{l*m{pP!!_J0W?&VFd}j#0D*|`0(GBY$de3w7Xa(m zTZ${I08A7LAW{HCz5{^MYhgD}0NCID#>>}AP15(3?1kkAY?dnk6rVh1vM>dJ@2LUZ z(=)1@I{=JmSvv0d1zB(cAAsq(TOG61A=Y1Y?10ASiG?UVKhsf?$#;JNsIbU_we6*9JIvsEgqK#R-V%Z&rzwk-gR z1A|hz4uD=r;11rz@Cu|C0PywGM{;v_)ie|8bprse(^b`Vn7^R`u)W_${sDNA3h7NL zMub1r&Yc*m7Xr}kr~%!sN5@gUjvxP3Fti2n?{BPDUQqkKOFpkrxHiqCex0#I3wgT3 zd1H^}aT~)*(=eyFvv{A?XRrPT02n{sb5Psm$T+0cv^XlsYCz(002ovPDHLkV1mfB6r=zE literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/16x16/Service.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/16x16/Service.png new file mode 100644 index 0000000000000000000000000000000000000000..1abfe1af19e6f181ea03bac5f732082fef3ed3ae GIT binary patch literal 837 zcmV-L1G@Z)P)WFU8GbZ8()Nlj2>E@cM*00OB=L_t(I%Z-vvNK|_m z#()3QnQ_c!#>}J-5h)o9$|8bl(KQz(f#Gcxt%_(_tDvN5Q&dQc76ol;k(DjFQFgC) ztf*G$bSaF~8Y)d4(`oY9%y`axALqRbX_ZPZyqg!^hab=LC=uaz=2C0FM4~bNY_6ex z*DCe%t}pcTd9C`Fo! z(xoM&l4(riD`uvEv&2ozm_#KFWIGit%4*qjGyAscDO$-XJ|UPOG`h*5k%FcHToaU%>blrhbc0g@z*H(43fNo_NB< zRbD-BSJaf5mOwB>&sYw$96vtvq7~^#MJ-zCGK@FRXgSnG!}-SRG`Q{?rK z$p|=#F-6Bp#IXyC(O`hGnK=Jmzc8nOwr%q|qLFV*d>P?oM?0qILl&<03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00K!#L_t(o!|j(%YZFlv zhM(zI&^9&ILDGhxO3@V#J^zD1{6fQs8o!iR9yrlP5O~0 zlQv&7nXkAwgLne2JB!@SaGx1w?tSOH=bUR0j()$-zr%Ao0GRvV0cccBb@LsKINaNts9=~#OoVck-!JQ z@dlLg^&CF{Ah11!T|;=!)z6=}0>cH2xsI)X`TG?BnUz(=XHuy!NX8Wp981luPAzoJ zf#Ta+-vD^_!i$&!j-#V}Vfiiq8@asVnTHPmIGZ}BxYN@Lwhxa0C~SOId^9G$Z`sGg zAdFZHSgxbM?EH1PF|f3cuh#)sx_?in(!P%B!iP-&E?+&b_- zcwEt`#1sJU*WV~!Z|K~9&>WSw#Cy6Hgl=)1U>JlEive4wavJpp0GrvI&XAd90B$EH z6}OwFnpbuz0AzC|#nUO-t8IJ3Ul6%G;41L--COBq=WpqMTbFC8R8hRwYU_CzRM)P= z6yMtJN)H)11$u$bWG}NaH~e3^&RfFGj<0yLr4?+qB?GoB{a(xI4}&n83o!n7HZ0_y z0#N+%Mb36fiR#qFS?LYam*fmMB3-a|C_UhDS;h1$N)0#)YlrWO8zy7o^fS|AQUfl`Nr$wsBKcwIk$l)NqM^Va X8DHcUM>Yrz00000NkvXXu0mjf?Bzqe literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/32x32/Service.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.Editors.Web.WebService.Description.WebServiceDescriptionEditor/Images/ImageList/32x32/Service.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3dd09125199ca11ba8c29ab62cde05dbade68c GIT binary patch literal 976 zcmV;>126oEP)WFU8GbZ8()Nlj2>E@cM*00T5hL_t(o!`0PGY)oMo z#_|6do#|BRR8?IfBGI%Yg3v@aQcWZX!NO%hqLD7xOEg9zgt#m$L}Gyj5gUmFRVr#l zi%6?Vt8`pSF-$u%J=0DvI-kY!+1Y3$ojIG6b8_a)dEf7Of1hKF;eQ^dPqrC=Z{a8a zTQ(O1P_cTB^S9?cOz@F4-XGTAPZ@xo?gRjPs`DIxET3LkR5%-ekD+$}__9U~z{7@a z02VKqmmVE(#+!ko$GQwauGbI1l>A%(h6a-W#N96d47e!(yuPUbM590T$4(@}JJ8me zGyu12djN2g{Q$H)Z2+Jzu1Z&wZ34jW&jH}ehsOZys#>3+9XN96tpS)?s5SL?ya3#- zy#m0Y;6?!Q0;>36@G<~%=dA@`FrlgW5NgU$2YO>#^W?8Q07izD@}CjS_o|8#2jFeT zHv{1J`ZNvkQDr0M0x;P>KSMHb@|J85M`iowGTHvMB@Dom#t{I1d326PngKAA)LfG) zRi(b^07SwM0H~?im}VWQ@0RVKe<-EZWwQOuy$%DA98*QJhQ9((TC6o}c&W8tQX<=% zuIqjM2|b@k#MGftZHAvd)d5gg5KFTT9K9#ovpupsf0}F`9FXm9M7Fy_O1&@F+8(jC z56Jeh&T;_4VTt#;?KS{`z+CN;MU?=Ql)g{14z%{j_S%=4^Mtki`2*P=|6}_aYkQ8Q z`}jHhQK=4MV0VtSZZO@YJb=PEj zuuAh9n4*eF-?Zcx=dE~q1yJER)?+D3u zuSd4Ku56FRWxKy{{aj``7@qMpa>UKv@_Xvb&^L>35B_J#KAJS=*ard%>9Q-??x+!=_;6vV{QL zzxGHsdiwxqf2QlDTldQLR}$~lLu>m?Yx`1bd+L3LPQjnO;K_?O2B0OX>wT3<^Sb@# y3_w?NqfNWDeYb2saY?psUoYDi%qhsM4EzSgI8E3AOw;NB0000 + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.UserInterface.WindowsForms.Editors.FileSystemEditor/KeyBindings.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.UserInterface.WindowsForms.Editors.FileSystemEditor/KeyBindings.xml new file mode 100644 index 00000000..d5c99637 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Editors/UniversalEditor.UserInterface.WindowsForms.Editors.FileSystemEditor/KeyBindings.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AddressBook/Associations/Contact.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AddressBook/Associations/Contact.xml new file mode 100644 index 00000000..80592915 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AddressBook/Associations/Contact.xml @@ -0,0 +1,35 @@ + + + + + + + + *.contact + + + + + + + + + + + + + + + *.vcf + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Concert/AniMikuConcert.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Concert/AniMikuConcert.xml new file mode 100644 index 00000000..64d8c9d0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Concert/AniMikuConcert.xml @@ -0,0 +1,25 @@ + + + + + + + + *.amp + + + AMPV2\r\n + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/FileSystem/AniMikuTexturePackage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/FileSystem/AniMikuTexturePackage.xml new file mode 100644 index 00000000..384d7731 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/FileSystem/AniMikuTexturePackage.xml @@ -0,0 +1,20 @@ + + + + + + + + *.amt + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/AniMikuPMD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/AniMikuPMD.xml new file mode 100644 index 00000000..7cc9c419 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/AniMikuPMD.xml @@ -0,0 +1,20 @@ + + + + + + + + *.apmd + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/InivisAC3D.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/InivisAC3D.xml new file mode 100644 index 00000000..bd73b99d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/InivisAC3D.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ac + + + + AC3Db + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/Super6.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/Super6.xml new file mode 100644 index 00000000..4b3d20ec --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Model/Super6.xml @@ -0,0 +1,25 @@ + + + + + + + + *.6kt + + + + FFFFFF9B + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Motion/AniMikuMotion.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Motion/AniMikuMotion.xml new file mode 100644 index 00000000..9b8df35d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AniMiku/Associations/Motion/AniMikuMotion.xml @@ -0,0 +1,25 @@ + + + + + + + + *.amd + + + + amd + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/ASX.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/ASX.xml new file mode 100644 index 00000000..0ac3da22 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/ASX.xml @@ -0,0 +1,25 @@ + + + + + + + + *.asx + + + + <?xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/CompactDisc.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/CompactDisc.xml new file mode 100644 index 00000000..cec5f77b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/CompactDisc.xml @@ -0,0 +1,27 @@ + + + + + + + + *.cda + + + + RIFF + + CDDA + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/HTML.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/HTML.xml new file mode 100644 index 00000000..9ff3b3d7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/HTML.xml @@ -0,0 +1,25 @@ + + + + + + + + *.html + + + + <?xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/M3U.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/M3U.xml new file mode 100644 index 00000000..dcc2f79f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/M3U.xml @@ -0,0 +1,26 @@ + + + + + + + + *.m3u + *.m3u8 + + + + #EXTM3U + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/Notepad++.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/Notepad++.xml new file mode 100644 index 00000000..cc448559 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/Notepad++.xml @@ -0,0 +1,25 @@ + + + + + + + + session.xml + + + + <?xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/PLS.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/PLS.xml new file mode 100644 index 00000000..61279f97 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/PLS.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pls + + + + [playlist + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/SMIL.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/SMIL.xml new file mode 100644 index 00000000..b0f7bf23 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/SMIL.xml @@ -0,0 +1,28 @@ + + + + + + + + *.wpl + *.zpl + *.smil + + + + <?xml + <?zpl + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/XSPF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/XSPF.xml new file mode 100644 index 00000000..f254d340 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Playlist/XSPF.xml @@ -0,0 +1,25 @@ + + + + + + + + *.xspf + + + + <?xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Project/LMMS.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Project/LMMS.xml new file mode 100644 index 00000000..d04aa6e2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Project/LMMS.xml @@ -0,0 +1,35 @@ + + + + + + + + *.mmp + + + + + + + + + + + + + + + *.mmpz + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MIDI.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MIDI.xml new file mode 100644 index 00000000..c8909a76 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MIDI.xml @@ -0,0 +1,26 @@ + + + + + + + + *.mid + *.midi + + + + MThd + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MusicXML.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MusicXML.xml new file mode 100644 index 00000000..349b9eae --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/MusicXML.xml @@ -0,0 +1,20 @@ + + + + + + + + *.mxl + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/NIFF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/NIFF.xml new file mode 100644 index 00000000..947df917 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/NIFF.xml @@ -0,0 +1,27 @@ + + + + + + + + *.nif + + + + RIFX + + NIFF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/UST.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/UST.xml new file mode 100644 index 00000000..eff0ec76 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/UST.xml @@ -0,0 +1,20 @@ + + + + + + + + *.ust + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/Vocaloid.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/Vocaloid.xml new file mode 100644 index 00000000..f992f3a0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/Vocaloid.xml @@ -0,0 +1,35 @@ + + + + + + + + *.vsq + + + + + + + + + + + + + + + *.vsqx + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/XMI.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/XMI.xml new file mode 100644 index 00000000..2104d4c4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/SynthesizedAudio/XMI.xml @@ -0,0 +1,27 @@ + + + + + + + + *.xmi + + + + FORM + + XDIRINFO + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/DirectWave.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/DirectWave.xml new file mode 100644 index 00000000..a4be2280 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/DirectWave.xml @@ -0,0 +1,25 @@ + + + + + + + + *.dwp + + + + DwPr + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/Vocaloid.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/Vocaloid.xml new file mode 100644 index 00000000..dd9bbdb3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/Voicebank/Vocaloid.xml @@ -0,0 +1,29 @@ + + + + + + + + *.ddb + + + + F- + 0000 + + + FRM2 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/VoicebankIndex/Vocaloid.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/VoicebankIndex/Vocaloid.xml new file mode 100644 index 00000000..9d195e85 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/VoicebankIndex/Vocaloid.xml @@ -0,0 +1,26 @@ + + + + + + + + *.ddi + + + + + DBSe + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/AdvancedAudioCodec.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/AdvancedAudioCodec.xml new file mode 100644 index 00000000..83a0afa4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/AdvancedAudioCodec.xml @@ -0,0 +1,20 @@ + + + + + + + + *.aac + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/FLAC.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/FLAC.xml new file mode 100644 index 00000000..468674c4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/FLAC.xml @@ -0,0 +1,28 @@ + + + + + + + + *.flac + + + + 102 + 76 + 97 + 67 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG2Layer3.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG2Layer3.xml new file mode 100644 index 00000000..efa850d1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG2Layer3.xml @@ -0,0 +1,27 @@ + + + + + + + + *.mp3 + + + + 73 + 68 + 51 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG4Part14.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG4Part14.xml new file mode 100644 index 00000000..2a7993d8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MPEG4Part14.xml @@ -0,0 +1,39 @@ + + + + + + + + *.mp4 + *.m4a + *.m4p + *.m4b + *.m4r + *.m4v + + + + 00000018 + ftypmp42 + + + 00000014 + ftypisom + + + 0000001C + ftypmp42 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MicrosoftWave.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MicrosoftWave.xml new file mode 100644 index 00000000..eb9f8921 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MicrosoftWave.xml @@ -0,0 +1,33 @@ + + + + + + + + *.wav + *.wave + + + + RIFF + + WAVEfmt + + + + + + *.at3 + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MonkeysAudio.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MonkeysAudio.xml new file mode 100644 index 00000000..cba20ba6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/MonkeysAudio.xml @@ -0,0 +1,35 @@ + + + + + + + + *.ape + + + + + + + + + + + + + + + *.apl + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/Ogg.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/Ogg.xml new file mode 100644 index 00000000..a7c96478 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/Ogg.xml @@ -0,0 +1,23 @@ + + + + + + + + *.ogg + *.ogm + *.oga + *.ogv + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/PropellerheadRecycle.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/PropellerheadRecycle.xml new file mode 100644 index 00000000..9fa0d3f7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/PropellerheadRecycle.xml @@ -0,0 +1,28 @@ + + + + + + + + *.rex + *.rx2 + + + + RIFF + + REX2 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/RealAudio.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/RealAudio.xml new file mode 100644 index 00000000..6a429946 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/RealAudio.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ra + + + + 2E7261FD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/ShortenAudio.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/ShortenAudio.xml new file mode 100644 index 00000000..a55866f6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/ShortenAudio.xml @@ -0,0 +1,20 @@ + + + + + + + + *.shn + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/SunAU.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/SunAU.xml new file mode 100644 index 00000000..687491e7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/SunAU.xml @@ -0,0 +1,25 @@ + + + + + + + + *.au + + + + .snd + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/WavPack.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/WavPack.xml new file mode 100644 index 00000000..e78b2502 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/AudioWorkstation/Associations/WaveformAudio/WavPack.xml @@ -0,0 +1,20 @@ + + + + + + + + *.wv + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Caltron/Associations/TextureFont/TextureFont.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Caltron/Associations/TextureFont/TextureFont.xml new file mode 100644 index 00000000..f3c86712 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Caltron/Associations/TextureFont/TextureFont.xml @@ -0,0 +1,25 @@ + + + + + + + + *.txf + + + + GLTEXFNT + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Concert/Concert.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Concert/Concert.xml new file mode 100644 index 00000000..80e0e32c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Concert/Concert.xml @@ -0,0 +1,35 @@ + + + + + + + + *.concert + + + + + + + + + + + + + + + *.cvb + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Library/LibraryXML.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Library/LibraryXML.xml new file mode 100644 index 00000000..c8a0cbd3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Library/LibraryXML.xml @@ -0,0 +1,20 @@ + + + + + + + + *.library + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Model/ConcertroidMDL.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Model/ConcertroidMDL.xml new file mode 100644 index 00000000..68da8745 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Concertroid/Associations/Model/ConcertroidMDL.xml @@ -0,0 +1,20 @@ + + + + + + + + *.mdl + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/DatabaseAdministrator/Themes/VisualStudio2012/Images/Templates/Project/Database Administrator/16x16/Database Project.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/DatabaseAdministrator/Themes/VisualStudio2012/Images/Templates/Project/Database Administrator/16x16/Database Project.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6b0a15b0ab0ce445bee3c8df0077a18c6449cc GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D>H*3r&q@8OF$vn%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD1OP)#WBRZ*4 zals7+F^R?N*Y~URy1KevDP%0&v!URj(;TjQ`)a*oB<}33?tge@=H>!UVc}%9)Kpcr z#KgosZ5s@L;LYvr^B;bFZO)^r>RQk_Z=PM-_56DV5i@2BmL2^0`MHE%?5-B2jk&kQ z*lcZWAMrR`Gcnkhkel57kd+MxoSl`YxHR(`94dNzclUP*vz!S2=^Pv!DFI<&N-vn) xs;kY}q@`E?fBDi=Vv=$Cxnzr?Clbnb%nZLaJ8!7Co_!zWZBJJ}mvv4FO#pW4e;fb+ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/DatabaseAdministrator/Themes/VisualStudio2012/Images/Templates/Project/Database Administrator/32x32/Database Project.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/DatabaseAdministrator/Themes/VisualStudio2012/Images/Templates/Project/Database Administrator/32x32/Database Project.png new file mode 100644 index 0000000000000000000000000000000000000000..a4741c3ce0817d1951427f9ddeaf255c5f849494 GIT binary patch literal 657 zcmV;C0&e|@P)WFU8GbZ8()Nlj2>E@cM*00H$$L_t(o!|hi+Z^AGT zeNMuVs1qIONEutEKsWla0OGe)6(chnd)03IhL%nRb%SK`j2XjNriw;F!kvr^*hvr( zRaH(x#O5ydeE05r0RLSG0F+84en_XBa}Yw{c^)xz3UT|KbFJPkV#$kEt96hFwA<~~ zv+>&;I07)@h<7jmgpgkWV5v4cosJTas9#lS%KNgO{Cl(6+_Kx71F|C(7_r_=vCuJe z`QL>Tgpk!o*d=XLh7Pd`gz6-^6v?2XIA(1cGR6>wVQeqAZF`FoQAE}Ow}jzxxkR_y zMGypVoD-ZE3MicC*ObR>0yZ9FKL0`(hR9?xFilfQ&ZOyFRe@m`2!a6hdIQ093f~*z z`RQ>@xmYa1EnVR(mqV}jg2iG1(==D9k-v2n5?O}zdIN87uNaL+N@YqZD5WTu%ec9{ z!=V4J48H)8q_?b + + + + + + + *.7z + + + + 7z + BCAF271C + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ALTools.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ALTools.xml new file mode 100644 index 00000000..c81aed46 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ALTools.xml @@ -0,0 +1,46 @@ + + + + + + + + *.egg + + + + EGGA + + + + + + + + + + + + + + + + *.alz + + + + ALZ + 01 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/AR.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/AR.xml new file mode 100644 index 00000000..fcbb359e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/AR.xml @@ -0,0 +1,26 @@ + + + + + + + + *.ar + *.deb + + + + !<arch> + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARC.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARC.xml new file mode 100644 index 00000000..39fc3946 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARC.xml @@ -0,0 +1,25 @@ + + + + + + + + *.arc + + + + 1A + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARJ.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARJ.xml new file mode 100644 index 00000000..c0837eca --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ARJ.xml @@ -0,0 +1,25 @@ + + + + + + + + *.arj + + + + 60EA + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Apple/HFS/HFSDataFormat.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Apple/HFS/HFSDataFormat.xml new file mode 100644 index 00000000..4ea05f0b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Apple/HFS/HFSDataFormat.xml @@ -0,0 +1,28 @@ + + + + + + + + *.hfs + *.hfv + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Archive.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Archive.xml new file mode 100644 index 00000000..2f6352d4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Archive.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BPlus.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BPlus.xml new file mode 100644 index 00000000..759243e1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BPlus.xml @@ -0,0 +1,22 @@ + + + + + + + + + 3F5F0300 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BinHex.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BinHex.xml new file mode 100644 index 00000000..967a8940 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/BinHex.xml @@ -0,0 +1,25 @@ + + + + + + + + *.hqx + + + + (This file must be converted with BinHex + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CFL.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CFL.xml new file mode 100644 index 00000000..3affa1be --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CFL.xml @@ -0,0 +1,25 @@ + + + + + + + + *.cfl + + + + CFL3 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CPIO.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CPIO.xml new file mode 100644 index 00000000..807762a0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/CPIO.xml @@ -0,0 +1,34 @@ + + + + + + + + *.cpio + + + + C771 + + + 71C7 + + + 070701 + + + 070702 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/FAT.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/FAT.xml new file mode 100644 index 00000000..94a85405 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/FAT.xml @@ -0,0 +1,35 @@ + + + + + + + + *.fat + *.fat16 + *.fat32 + + + + + IBM 3.3 + MSDOS5.0 + MSWIN4.1 + IBM 7.1 + mkdosfs + FreeDOS + (lesTHIC + WINIMAGE + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ISO9660.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ISO9660.xml new file mode 100644 index 00000000..39e88d80 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ISO9660.xml @@ -0,0 +1,20 @@ + + + + + + + + *.iso + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/IZArc.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/IZArc.xml new file mode 100644 index 00000000..a68f468f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/IZArc.xml @@ -0,0 +1,29 @@ + + + + + + + + *.bza + *.gza + + + + \0\0\0\0BZ2\0 + + + \0\0\0\0GZIP + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Cabinet.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Cabinet.xml new file mode 100644 index 00000000..4f7a15f6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Cabinet.xml @@ -0,0 +1,45 @@ + + + + + + + + *.cab + + + + ISc( + + + + + + + + + + + + + + + + *.hdr + + + + ISc( + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Z.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Z.xml new file mode 100644 index 00000000..6a0ab550 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/InstallShield/Z.xml @@ -0,0 +1,25 @@ + + + + + + + + *.z + + + + 135D658C3A010200 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/LHA.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/LHA.xml new file mode 100644 index 00000000..b3c66cbe --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/LHA.xml @@ -0,0 +1,20 @@ + + + + + + + + *.lha + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/Cabinet.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/Cabinet.xml new file mode 100644 index 00000000..fedf314a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/Cabinet.xml @@ -0,0 +1,25 @@ + + + + + + + + *.cab + + + + MSCF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/CompoundDocument.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/CompoundDocument.xml new file mode 100644 index 00000000..562f24d3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/CompoundDocument.xml @@ -0,0 +1,25 @@ + + + + + + + + *.cbf + + + + D0CF11E0A1B11AE1 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/MSCompressed.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/MSCompressed.xml new file mode 100644 index 00000000..467018ba --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/MSCompressed.xml @@ -0,0 +1,34 @@ + + + + + + + + *.??_ + + + + KWAJ + 88F027D1 + + + SZDD + 88F02733 + + + SZ + 88F02733D1 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/WindowsImage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/WindowsImage.xml new file mode 100644 index 00000000..a598b6aa --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/Microsoft/WindowsImage.xml @@ -0,0 +1,26 @@ + + + + + + + + *.wim + *.swm + + + + MSWIM + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/NeroDiscImage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/NeroDiscImage.xml new file mode 100644 index 00000000..0ee170c1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/NeroDiscImage.xml @@ -0,0 +1,28 @@ + + + + + + + + *.nrb + *.nri + *.nrg + + + + 0E + NeroISO0.02.03 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/PKZip.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/PKZip.xml new file mode 100644 index 00000000..2d07a1b8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/PKZip.xml @@ -0,0 +1,34 @@ + + + + + + + + *.zip + *.zipx + *.zipfs + *.pk3 + *.pk4 + *.scs + *.xpi + *.maff + *.lwtp + *.fwtp + + + + PK + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/REEVEsoft.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/REEVEsoft.xml new file mode 100644 index 00000000..bf611d82 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/REEVEsoft.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ice + + + + FR + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/SPIS.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/SPIS.xml new file mode 100644 index 00000000..0b012eb0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/SPIS.xml @@ -0,0 +1,26 @@ + + + + + + + + *.dsk + + + + SPIS + 0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StudioALCE.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StudioALCE.xml new file mode 100644 index 00000000..6e1237b1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StudioALCE.xml @@ -0,0 +1,25 @@ + + + + + + + + *.box + + + + BOX FILE + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StuffIt.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StuffIt.xml new file mode 100644 index 00000000..805199f3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/StuffIt.xml @@ -0,0 +1,25 @@ + + + + + + + + *.sit + + + + StuffIt (c)1997-2001 Aladdin Systems, Inc., http://www.aladdinsys.com/StuffIt/\r\n + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/TapeArchive.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/TapeArchive.xml new file mode 100644 index 00000000..1a37cc3b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/TapeArchive.xml @@ -0,0 +1,31 @@ + + + + + + + + *.tar + *.tar.gz + *.tgz + *.tar.bz2 + *.tbz2 + *.tb2 + *.taz + *.tar.z + *.tlz + *.tar.lz + *.txz + *.tar.xz + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/UUEncoding.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/UUEncoding.xml new file mode 100644 index 00000000..67f68111 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/UUEncoding.xml @@ -0,0 +1,25 @@ + + + + + + + + *.uue + + + + begin + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinACE.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinACE.xml new file mode 100644 index 00000000..8d36d544 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinACE.xml @@ -0,0 +1,26 @@ + + + + + + + + *.ace + + + + + **ACE** + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinRAR.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinRAR.xml new file mode 100644 index 00000000..b2e124bf --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/WinRAR.xml @@ -0,0 +1,25 @@ + + + + + + + + *.rar + + + + Rar! + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/YamazakiZipper.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/YamazakiZipper.xml new file mode 100644 index 00000000..feba5222 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/YamazakiZipper.xml @@ -0,0 +1,25 @@ + + + + + + + + *.yz1 + + + + yz010600 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ZipTVBlakHole.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ZipTVBlakHole.xml new file mode 100644 index 00000000..57162e4c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/FileSystem/Associations/ZipTVBlakHole.xml @@ -0,0 +1,25 @@ + + + + + + + + *.bh + + + + BH + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/AudioCollection/Synthesized/SPC2.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/AudioCollection/Synthesized/SPC2.xml new file mode 100644 index 00000000..0f1b2889 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/AudioCollection/Synthesized/SPC2.xml @@ -0,0 +1,26 @@ + + + + + + + + *.kspc + + + + KXPC + 1A + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Cyberlore/Cyberlore.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Cyberlore/Cyberlore.xml new file mode 100644 index 00000000..c6881788 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Cyberlore/Cyberlore.xml @@ -0,0 +1,40 @@ + + + + + + + + *.cam + + + + CYLBPC + + + + + + + + + + + + + + + + *.pict + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Descent.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Descent.xml new file mode 100644 index 00000000..f955a814 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Descent.xml @@ -0,0 +1,41 @@ + + + + + + + + *.hog + + + + DHF + + + + + + + + + + + + + + + + *.txb + *.ctb + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/187RideOrDie.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/187RideOrDie.xml new file mode 100644 index 00000000..e24c442a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/187RideOrDie.xml @@ -0,0 +1,20 @@ + + + + + + + + *.mfd + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/2NBFPCK.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/2NBFPCK.xml new file mode 100644 index 00000000..fdc4db50 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/2NBFPCK.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pck + + + + 2NBF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Abomination.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Abomination.xml new file mode 100644 index 00000000..7c9a4852 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Abomination.xml @@ -0,0 +1,40 @@ + + + + + + + + *.awf + + + + + + + + + + + + + + + *.clt + + + + AWAD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AlienNationsGD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AlienNationsGD.xml new file mode 100644 index 00000000..338360e0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AlienNationsGD.xml @@ -0,0 +1,20 @@ + + + + + + + + *.gd + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AquarnoidGOB.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AquarnoidGOB.xml new file mode 100644 index 00000000..e77d2ca7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/AquarnoidGOB.xml @@ -0,0 +1,25 @@ + + + + + + + + *.gob + + + + GOB\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Arcanum.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Arcanum.xml new file mode 100644 index 00000000..7a06730c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Arcanum.xml @@ -0,0 +1,20 @@ + + + + + + + + *.dat + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/BurikoGeneralInterpreter.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/BurikoGeneralInterpreter.xml new file mode 100644 index 00000000..02dc7008 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/BurikoGeneralInterpreter.xml @@ -0,0 +1,45 @@ + + + + + + + + *.hvl + + + + BHV_____\0\0\0\0 + + + + + + + + + + + + + + + + *.arc + + + + PackFile + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ChaosWorksEngine.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ChaosWorksEngine.xml new file mode 100644 index 00000000..200db86b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ChaosWorksEngine.xml @@ -0,0 +1,25 @@ + + + + + + + + *.vol + + + + 02420243 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/CompressedHunks.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/CompressedHunks.xml new file mode 100644 index 00000000..cf38c8f4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/CompressedHunks.xml @@ -0,0 +1,25 @@ + + + + + + + + *.chd + + + + MComprHD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DoomWAD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DoomWAD.xml new file mode 100644 index 00000000..0bf63778 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DoomWAD.xml @@ -0,0 +1,28 @@ + + + + + + + + *.wad + + + + IWAD + + + PWAD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DreamfallPAK.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DreamfallPAK.xml new file mode 100644 index 00000000..7f03d522 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DreamfallPAK.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pak + + + + tlj_pack0001 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DynamixStarsiegeVOL.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DynamixStarsiegeVOL.xml new file mode 100644 index 00000000..24a8bb04 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/DynamixStarsiegeVOL.xml @@ -0,0 +1,25 @@ + + + + + + + + *.vol + + + + PVOL + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Eighting.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Eighting.xml new file mode 100644 index 00000000..81ad6a6c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Eighting.xml @@ -0,0 +1,25 @@ + + + + + + + + *.fpk + + + + xJ\0\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ElectronicArtsBIGF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ElectronicArtsBIGF.xml new file mode 100644 index 00000000..ae7834a2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ElectronicArtsBIGF.xml @@ -0,0 +1,36 @@ + + + + + + + + *.abg + *.ama + *.big + *.dua + *.fra + *.gea + *.poa + *.spa + *.swa + *.uka + *.hog + *.viv" + + + + BIGF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/FMODSoundBank.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/FMODSoundBank.xml new file mode 100644 index 00000000..7ae672f2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/FMODSoundBank.xml @@ -0,0 +1,25 @@ + + + + + + + + *.fsb + + + + FSB3 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GainaxLBX.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GainaxLBX.xml new file mode 100644 index 00000000..493230aa --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GainaxLBX.xml @@ -0,0 +1,20 @@ + + + + + + + + *.lbx + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GameProgrammersWiki.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GameProgrammersWiki.xml new file mode 100644 index 00000000..27ce81fe --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GameProgrammersWiki.xml @@ -0,0 +1,27 @@ + + + + + + + + *.gpw + + + + 8988 + GpW + 0D0A1A + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GarenaYanghx.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GarenaYanghx.xml new file mode 100644 index 00000000..e1401496 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GarenaYanghx.xml @@ -0,0 +1,25 @@ + + + + + + + + * + + + + yanghx\0\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GotDGCD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GotDGCD.xml new file mode 100644 index 00000000..83cf82a6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GotDGCD.xml @@ -0,0 +1,20 @@ + + + + + + + + *.gcd + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GremlinInteractiveActuaSoccerMAD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GremlinInteractiveActuaSoccerMAD.xml new file mode 100644 index 00000000..8a0ac83b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/GremlinInteractiveActuaSoccerMAD.xml @@ -0,0 +1,20 @@ + + + + + + + + *.mad + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Hardball.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Hardball.xml new file mode 100644 index 00000000..865cd6fc --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Hardball.xml @@ -0,0 +1,26 @@ + + + + + + + + *.glu + + + + MB6 + 00 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HeroesOfThePacific.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HeroesOfThePacific.xml new file mode 100644 index 00000000..3fd73c6f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HeroesOfThePacific.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ffs + + + + FFS + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HighwayPursuit.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HighwayPursuit.xml new file mode 100644 index 00000000..97efcee3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HighwayPursuit.xml @@ -0,0 +1,30 @@ + + + + + + + + *.hfd + *.hgd + *.hmd + *.hod + *.hsd + *.hvd + + + + HPDT + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Homeworld.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Homeworld.xml new file mode 100644 index 00000000..4738d94e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Homeworld.xml @@ -0,0 +1,29 @@ + + + + + + + + *.vce + *.wxd + + + + VCE0 + + + WXD1 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWaters.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWaters.xml new file mode 100644 index 00000000..b605ba6c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWaters.xml @@ -0,0 +1,25 @@ + + + + + + + + *.mng + + + + ZGWH + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWatersDAT.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWatersDAT.xml new file mode 100644 index 00000000..4312da73 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HostileWatersDAT.xml @@ -0,0 +1,20 @@ + + + + + + + + *.dat + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HoyleCasino99PRF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HoyleCasino99PRF.xml new file mode 100644 index 00000000..059fdcd8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HoyleCasino99PRF.xml @@ -0,0 +1,26 @@ + + + + + + + + *.prf + + + + + PRF\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HyPack.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HyPack.xml new file mode 100644 index 00000000..8b5c9cee --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/HyPack.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pak + + + + HyPack + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IllusionGamesPP.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IllusionGamesPP.xml new file mode 100644 index 00000000..ce2e76b9 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IllusionGamesPP.xml @@ -0,0 +1,20 @@ + + + + + + + + *.pp + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IndianaJonesGOB.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IndianaJonesGOB.xml new file mode 100644 index 00000000..ff9b899d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/IndianaJonesGOB.xml @@ -0,0 +1,25 @@ + + + + + + + + *.gob + + + + GOB + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JackOrlandoPAK.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JackOrlandoPAK.xml new file mode 100644 index 00000000..9667b092 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JackOrlandoPAK.xml @@ -0,0 +1,27 @@ + + + + + + + + *.pak + *.phk + *.ph2 + + + + PAK\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JadeEmpire.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JadeEmpire.xml new file mode 100644 index 00000000..063df41c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/JadeEmpire.xml @@ -0,0 +1,25 @@ + + + + + + + + *.rim + + + + RIM V1.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KensLabyrinth.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KensLabyrinth.xml new file mode 100644 index 00000000..e89a5acc --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/KensLabyrinth.xml @@ -0,0 +1,20 @@ + + + + + + + + *.kzp + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Kronosaur.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Kronosaur.xml new file mode 100644 index 00000000..d16bff9e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Kronosaur.xml @@ -0,0 +1,20 @@ + + + + + + + + *.tdb + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MementoMoriRES.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MementoMoriRES.xml new file mode 100644 index 00000000..f7cee7e4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MementoMoriRES.xml @@ -0,0 +1,25 @@ + + + + + + + + *.res + + + + C\0e\0n\0t\0a\0u\0r\0i\0 \0P\0r\0o\0d\0u\0c\0t\0i\0o\0n\0 \0R\0e\0s\0o\0u\0r\0c\0e\0 \0F\0i\0l\0e\0 \03\0.\01\00\0\xa\0\xa\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoPaQ.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoPaQ.xml new file mode 100644 index 00000000..b5ad3ce2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoPaQ.xml @@ -0,0 +1,25 @@ + + + + + + + + *.mpq + + + + MPQ + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoeroDownhillNightPKD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoeroDownhillNightPKD.xml new file mode 100644 index 00000000..ddf45494 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/MoeroDownhillNightPKD.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pkd + + + + PACK + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/N2M-CTAR.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/N2M-CTAR.xml new file mode 100644 index 00000000..440dc928 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/N2M-CTAR.xml @@ -0,0 +1,25 @@ + + + + + + + + *.n2m + + + + C2AR + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NScripter.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NScripter.xml new file mode 100644 index 00000000..34b55d3f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NScripter.xml @@ -0,0 +1,20 @@ + + + + + + + + *.nsa + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NamcoTales.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NamcoTales.xml new file mode 100644 index 00000000..e3c700c7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NamcoTales.xml @@ -0,0 +1,25 @@ + + + + + + + + *.dat + + + + TLZC + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Nintendo/Optical/NintendoOpticalDisc.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Nintendo/Optical/NintendoOpticalDisc.xml new file mode 100644 index 00000000..b5d49112 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/Nintendo/Optical/NintendoOpticalDisc.xml @@ -0,0 +1,20 @@ + + + + + + + + *.gcm + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NvidiaNPK.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NvidiaNPK.xml new file mode 100644 index 00000000..8594def7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/NvidiaNPK.xml @@ -0,0 +1,25 @@ + + + + + + + + *.npk + + + + BEEFCAFE + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PlayStation/PKG.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PlayStation/PKG.xml new file mode 100644 index 00000000..37c87ca7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PlayStation/PKG.xml @@ -0,0 +1,26 @@ + + + + + + + + *.pkg + + + + 7F + PKG + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PrincessWaltzARC.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PrincessWaltzARC.xml new file mode 100644 index 00000000..04c424ef --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/PrincessWaltzARC.xml @@ -0,0 +1,20 @@ + + + + + + + + *.arc + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/RoxorInTheGroove.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/RoxorInTheGroove.xml new file mode 100644 index 00000000..8f9ddd69 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/RoxorInTheGroove.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pck + + + + PCKF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SecretFilesTunguska.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SecretFilesTunguska.xml new file mode 100644 index 00000000..520d2a87 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SecretFilesTunguska.xml @@ -0,0 +1,25 @@ + + + + + + + + *.spr + + + + SPCD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SegaFARC.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SegaFARC.xml new file mode 100644 index 00000000..0a568503 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SegaFARC.xml @@ -0,0 +1,31 @@ + + + + + + + + *.farc + + + + FArC + + + FArc + + + FARC + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SinisterGames.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SinisterGames.xml new file mode 100644 index 00000000..d807de9b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/SinisterGames.xml @@ -0,0 +1,20 @@ + + + + + + + + *.gut + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/StellaGamesLzmaPack.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/StellaGamesLzmaPack.xml new file mode 100644 index 00000000..15d3dfa5 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/StellaGamesLzmaPack.xml @@ -0,0 +1,20 @@ + + + + + + + + *.pack + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TerminalRealityPOD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TerminalRealityPOD.xml new file mode 100644 index 00000000..b51879ae --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TerminalRealityPOD.xml @@ -0,0 +1,20 @@ + + + + + + + + *.pod + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TheLearningCompany.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TheLearningCompany.xml new file mode 100644 index 00000000..027044ff --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TheLearningCompany.xml @@ -0,0 +1,25 @@ + + + + + + + + *.tld + + + + TLCD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TropicoHPK.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TropicoHPK.xml new file mode 100644 index 00000000..ea571da3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/TropicoHPK.xml @@ -0,0 +1,28 @@ + + + + + + + + *.hpk + + + + BPUL + + + ZLIB + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ValveGameCacheFile.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ValveGameCacheFile.xml new file mode 100644 index 00000000..8e1c0452 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/FileSystem/ValveGameCacheFile.xml @@ -0,0 +1,25 @@ + + + + + + + + *.gcf + + + + 00000001 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusBinaryDataFormatAssociation.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusBinaryDataFormatAssociation.xml new file mode 100644 index 00000000..a7e40736 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusBinaryDataFormatAssociation.xml @@ -0,0 +1,26 @@ + + + + + + + + *.ibi + + + + IBI + 0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusTextDataFormatAssociation.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusTextDataFormatAssociation.xml new file mode 100644 index 00000000..fa422013 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/IcarusScriptingEngine/IcarusTextDataFormatAssociation.xml @@ -0,0 +1,20 @@ + + + + + + + + *.icarus + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/AvalancheVBUF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/AvalancheVBUF.xml new file mode 100644 index 00000000..d9591408 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/AvalancheVBUF.xml @@ -0,0 +1,20 @@ + + + + + + + + *.vbuf + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/HalfLife2SMD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/HalfLife2SMD.xml new file mode 100644 index 00000000..6f29fe67 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/HalfLife2SMD.xml @@ -0,0 +1,25 @@ + + + + + + + + *.smd + + + + version 1 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/IDSoftware.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/IDSoftware.xml new file mode 100644 index 00000000..2e690ffa --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/IDSoftware.xml @@ -0,0 +1,65 @@ + + + + + + + + *.md2 + + + + IDP2 + + + + + + + + + + + + + + + + *.md3 + + + + IDP3 + + + + + + + + + + + + + + + + *.glm + + + + 2LGM + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/SegaAuth3D.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/SegaAuth3D.xml new file mode 100644 index 00000000..937029f4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/SegaAuth3D.xml @@ -0,0 +1,45 @@ + + + + + + + + *.a3da + + + + #A3DA__________ + + + + + + + + + + + + + + + + *.a3da + + + + #A3DC__________ + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/ShaiyaOnline3DC.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/ShaiyaOnline3DC.xml new file mode 100644 index 00000000..06b817c3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/ShaiyaOnline3DC.xml @@ -0,0 +1,20 @@ + + + + + + + + *.3dc + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/UltimateStuntsGLB.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/UltimateStuntsGLB.xml new file mode 100644 index 00000000..da04b0a1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Model/UltimateStuntsGLB.xml @@ -0,0 +1,25 @@ + + + + + + + + *.glb + + + + \0GLB + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Scene/IDSoftware.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Scene/IDSoftware.xml new file mode 100644 index 00000000..71d51adb --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Multimedia3D/Scene/IDSoftware.xml @@ -0,0 +1,25 @@ + + + + + + + + *.bsp + + + + IBSP + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCCampaign.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCCampaign.xml new file mode 100644 index 00000000..1011da8d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCCampaign.xml @@ -0,0 +1,25 @@ + + + + + + + + *.h4c + + + + H4CAMPAIGN + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFileSystem.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFileSystem.xml new file mode 100644 index 00000000..b975d83e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFileSystem.xml @@ -0,0 +1,85 @@ + + + + + + + + *.agg + + + + + + + + + + + + + + + *.vid + + + + + + + + + + + + + + + *.snd + + + + + + + + + + + + + + + *.lod + + + + LOD\0 + + + + + + + + + + + + + + + + *.cc + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFont.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFont.xml new file mode 100644 index 00000000..5399e979 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCFont.xml @@ -0,0 +1,20 @@ + + + + + + + + *.fnt + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCGameSave.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCGameSave.xml new file mode 100644 index 00000000..68c2ba13 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCGameSave.xml @@ -0,0 +1,20 @@ + + + + + + + + *.h4s + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCMap.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCMap.xml new file mode 100644 index 00000000..bbaff359 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCMap.xml @@ -0,0 +1,74 @@ + + + + + + + + *.mp2 + + + + 5C000000 + + + + + + *.mx2 + + + + 5C000000 + + + + + + *.hxc + + + + 5C000000 + + + + + + + + + + + + + + + + *.h3m + + + + 0E000000 + + + 15000000 + + + 1C000000 + + + 33000000 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPalette.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPalette.xml new file mode 100644 index 00000000..4faf4ac9 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPalette.xml @@ -0,0 +1,20 @@ + + + + + + + + *.pal + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPicture.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPicture.xml new file mode 100644 index 00000000..e6d9db04 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCPicture.xml @@ -0,0 +1,36 @@ + + + + + + + + *.bmp + + + + + + + + + + + + + + + *.icn + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCResourceBIN.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCResourceBIN.xml new file mode 100644 index 00000000..814d839c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCResourceBIN.xml @@ -0,0 +1,20 @@ + + + + + + + + *.bin + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCSound.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCSound.xml new file mode 100644 index 00000000..cdd1faf7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/NewWorldComputing/NWCSound.xml @@ -0,0 +1,20 @@ + + + + + + + + *.82m + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Nintendo.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Nintendo.xml new file mode 100644 index 00000000..8197eca9 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Nintendo.xml @@ -0,0 +1,25 @@ + + + + + + + + *.smc + *.sfc + *.swc + *.fig + *.ufo + *.?gm + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/AvalancheTBODY.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/AvalancheTBODY.xml new file mode 100644 index 00000000..c67cc937 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/AvalancheTBODY.xml @@ -0,0 +1,20 @@ + + + + + + + + *.tbody + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/BurikoGeneralInterpreter.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/BurikoGeneralInterpreter.xml new file mode 100644 index 00000000..374bedb7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/BurikoGeneralInterpreter.xml @@ -0,0 +1,26 @@ + + + + + + + + *.cbg + + + + CompressedBG___ + 0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/ChaosWorksSprite.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/ChaosWorksSprite.xml new file mode 100644 index 00000000..2dd771a3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/ChaosWorksSprite.xml @@ -0,0 +1,25 @@ + + + + + + + + *.sph + + + + CWE sprite + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/GIM.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/GIM.xml new file mode 100644 index 00000000..800949d8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Picture/GIM.xml @@ -0,0 +1,28 @@ + + + + + + + + *.gim + + + + MIG. + + + .GIM + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/ReflexiveEntertainment/FRM16.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/ReflexiveEntertainment/FRM16.xml new file mode 100644 index 00000000..7c0d3a94 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/ReflexiveEntertainment/FRM16.xml @@ -0,0 +1,25 @@ + + + + + + + + *.frm16 + + + + 3210 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/PSF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/PSF.xml new file mode 100644 index 00000000..146a44b5 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/PSF.xml @@ -0,0 +1,25 @@ + + + + + + + + *.psf + + + + PSF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/SPC.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/SPC.xml new file mode 100644 index 00000000..8dcf06b1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/SynthesizedAudio/SPC.xml @@ -0,0 +1,25 @@ + + + + + + + + *.spc + + + + SNES-SPC700 Sound File Data + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealPackage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealPackage.xml new file mode 100644 index 00000000..c6d19597 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealPackage.xml @@ -0,0 +1,27 @@ + + + + + + + + *.u + *.utx + *.upk + + + + C1832A9E + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealUMOD.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealUMOD.xml new file mode 100644 index 00000000..0cd4abe5 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/UnrealPackage/UnrealUMOD.xml @@ -0,0 +1,25 @@ + + + + + + + + *.umod + + + + A3C5E39F + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/IdROQ.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/IdROQ.xml new file mode 100644 index 00000000..d4e634a7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/IdROQ.xml @@ -0,0 +1,25 @@ + + + + + + + + *.roq + + + + 8410FFFFFFFF1E00 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/NintendoGameCubeTHP.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/NintendoGameCubeTHP.xml new file mode 100644 index 00000000..a7c21dfd --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/NintendoGameCubeTHP.xml @@ -0,0 +1,26 @@ + + + + + + + + *.thp + + + + THP + 0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/RADTools.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/RADTools.xml new file mode 100644 index 00000000..588430c6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/Video/RADTools.xml @@ -0,0 +1,45 @@ + + + + + + + + *.bik + + + + SMK4 + + + + + + + + + + + + + + + + *.smk + + + + SMK4 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/BRSTM.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/BRSTM.xml new file mode 100644 index 00000000..4178faf1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/BRSTM.xml @@ -0,0 +1,30 @@ + + + + + + + + *.brstm + + + + 77 + 84 + 83 + 82 + 255 + 254 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/OSLib.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/OSLib.xml new file mode 100644 index 00000000..7d649886 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/Associations/WaveformAudio/OSLib.xml @@ -0,0 +1,25 @@ + + + + + + + + *.bgm + + + + OSLBGM v01\0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/ProjectTypes/{94E32BE3-D458-4786-A7E0-59DE5F769CDC}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/ProjectTypes/{94E32BE3-D458-4786-A7E0-59DE5F769CDC}.xml new file mode 100644 index 00000000..0e42008d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GameDeveloper/ProjectTypes/{94E32BE3-D458-4786-A7E0-59DE5F769CDC}.xml @@ -0,0 +1,27 @@ + + + + + + + Star Wars: Jedi Knight II: Jedi Outcast engine + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/ACOColorPalette.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/ACOColorPalette.xml new file mode 100644 index 00000000..06d440c0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/ACOColorPalette.xml @@ -0,0 +1,25 @@ + + + + + + + + *.aco + + + + GIMP Palette + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/AdobeSwatchExchange.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/AdobeSwatchExchange.xml new file mode 100644 index 00000000..6a019525 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/Adobe/AdobeSwatchExchange.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ase + + + + ASEF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/GIMPColorPalette.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/GIMPColorPalette.xml new file mode 100644 index 00000000..d96e084b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/GIMPColorPalette.xml @@ -0,0 +1,25 @@ + + + + + + + + *.gpl + + + + GIMP Palette + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/JASCPaintShopPro.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/JASCPaintShopPro.xml new file mode 100644 index 00000000..a2bd91e6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Palette/JASCPaintShopPro.xml @@ -0,0 +1,25 @@ + + + + + + + + *.pal + + + + JASC-PAL + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/ARGB.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/ARGB.xml new file mode 100644 index 00000000..c904e419 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/ARGB.xml @@ -0,0 +1,25 @@ + + + + + + + + *.argb + + + + BGRA + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/DirectDrawSurface.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/DirectDrawSurface.xml new file mode 100644 index 00000000..b851c0a4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/DirectDrawSurface.xml @@ -0,0 +1,25 @@ + + + + + + + + *.dds + + + + 44445320 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/GraphicsInterchange.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/GraphicsInterchange.xml new file mode 100644 index 00000000..18666145 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/GraphicsInterchange.xml @@ -0,0 +1,28 @@ + + + + + + + + *.gif + + + + GIF87a + + + GIF89a + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/I16.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/I16.xml new file mode 100644 index 00000000..3898f647 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/I16.xml @@ -0,0 +1,20 @@ + + + + + + + + *.i16 + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/JPEG.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/JPEG.xml new file mode 100644 index 00000000..8e58b8a1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/JPEG.xml @@ -0,0 +1,22 @@ + + + + + + + + *.jpg + *.jpe + *.jpeg + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/LEADToolsImage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/LEADToolsImage.xml new file mode 100644 index 00000000..dcde65d2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/LEADToolsImage.xml @@ -0,0 +1,25 @@ + + + + + + + + *.cmp + + + + LEAD + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableAnyMapImage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableAnyMapImage.xml new file mode 100644 index 00000000..c2fd719f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableAnyMapImage.xml @@ -0,0 +1,43 @@ + + + + + + + + *.ppm + *.pgm + *.pbm + *.pam + + + + P1 + + + P2 + + + P3 + + + P4 + + + P5 + + + P6 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableNetworkGraphics.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableNetworkGraphics.xml new file mode 100644 index 00000000..073e1773 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/PortableNetworkGraphics.xml @@ -0,0 +1,27 @@ + + + + + + + + *.png + + + + 89 + PNG + 0D0A1A0A + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TMH.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TMH.xml new file mode 100644 index 00000000..53669d84 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TMH.xml @@ -0,0 +1,25 @@ + + + + + + + + *.tmh + + + + .TMH0.14 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TrueVisionTarga.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TrueVisionTarga.xml new file mode 100644 index 00000000..a70893de --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/TrueVisionTarga.xml @@ -0,0 +1,20 @@ + + + + + + + + *.tga + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WaveletScalarQuantization.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WaveletScalarQuantization.xml new file mode 100644 index 00000000..e538ac9f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WaveletScalarQuantization.xml @@ -0,0 +1,25 @@ + + + + + + + + *.wsq + + + + A0FF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WebP.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WebP.xml new file mode 100644 index 00000000..8217275a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WebP.xml @@ -0,0 +1,27 @@ + + + + + + + + *.webp + + + + RIFF + + WEBP + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsBitmap.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsBitmap.xml new file mode 100644 index 00000000..2898bfa0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsBitmap.xml @@ -0,0 +1,61 @@ + + + + + + + + *.bmp + *.spa + *.sph + + + + + BM + + + + BA + + + + CI + + + + + IC + + + + PT + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsCursor.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsCursor.xml new file mode 100644 index 00000000..369eaa23 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsCursor.xml @@ -0,0 +1,25 @@ + + + + + + + + *.cur + + + + 00000002 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsIcon.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsIcon.xml new file mode 100644 index 00000000..37032579 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsIcon.xml @@ -0,0 +1,33 @@ + + + + + + + + *.ico + + + + 00000001 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsPaintbrushPicture.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsPaintbrushPicture.xml new file mode 100644 index 00000000..5b63e8be --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/Picture/WindowsPaintbrushPicture.xml @@ -0,0 +1,28 @@ + + + + + + + + *.msp + + + + DanM + + + LinS + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/VectorImage/ExpressionDesign.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/VectorImage/ExpressionDesign.xml new file mode 100644 index 00000000..63ba085b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner/Associations/VectorImage/ExpressionDesign.xml @@ -0,0 +1,26 @@ + + + + + + + + *.design + + + + <XDFV:9> + 0A + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/PolygonMovieMaker.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/PolygonMovieMaker.xml new file mode 100644 index 00000000..7d7fa776 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/PolygonMovieMaker.xml @@ -0,0 +1,20 @@ + + + + + + + + *.vac + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/QAvimator.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/QAvimator.xml new file mode 100644 index 00000000..d8f1b363 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Accessory/QAvimator.xml @@ -0,0 +1,20 @@ + + + + + + + + *.prp + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Blender.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Blender.xml new file mode 100644 index 00000000..06e48aee --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Blender.xml @@ -0,0 +1,20 @@ + + + + + + + + *.blend + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/InivisAC3D.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/InivisAC3D.xml new file mode 100644 index 00000000..bd73b99d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/InivisAC3D.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ac + + + + AC3Db + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Metasequoia.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Metasequoia.xml new file mode 100644 index 00000000..587b6e1a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Metasequoia.xml @@ -0,0 +1,20 @@ + + + + + + + + *.mqo + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/PolygonMovieMaker.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/PolygonMovieMaker.xml new file mode 100644 index 00000000..17f6c640 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/PolygonMovieMaker.xml @@ -0,0 +1,60 @@ + + + + + + + + *.pmd + + + + Pmd + + + + + + + + + + + + + + + + *.pmx + + + + PMX + + + + + + + + + + + + + + + + *.pmax + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Super6.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Super6.xml new file mode 100644 index 00000000..4b3d20ec --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/Super6.xml @@ -0,0 +1,25 @@ + + + + + + + + *.6kt + + + + FFFFFF9B + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/ThreeDStudioMax.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/ThreeDStudioMax.xml new file mode 100644 index 00000000..8f78e42e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/ThreeDStudioMax.xml @@ -0,0 +1,20 @@ + + + + + + + + *.max + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/TriangleEditor.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/TriangleEditor.xml new file mode 100644 index 00000000..d8b0d49d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/TriangleEditor.xml @@ -0,0 +1,26 @@ + + + + + + + + *.ted + + + + 14 + TriangleEditor_V.1.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/WavefrontOBJ.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/WavefrontOBJ.xml new file mode 100644 index 00000000..d1bdb21d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Model/WavefrontOBJ.xml @@ -0,0 +1,20 @@ + + + + + + + + *.obj + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/BiovisionHierarchy.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/BiovisionHierarchy.xml new file mode 100644 index 00000000..742804f4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/BiovisionHierarchy.xml @@ -0,0 +1,35 @@ + + + + + + + + *.bvh + + + + HIERARCHY + + + + + + *.avm + + + + HIERARCHY + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/PolygonMovieMaker.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/PolygonMovieMaker.xml new file mode 100644 index 00000000..2d37dcbe --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Motion/PolygonMovieMaker.xml @@ -0,0 +1,55 @@ + + + + + + + + *.vmd + + + + Vocaloid Motion Data file + + + + + + *.vmd + + + + Vocaloid Motion Data 0002 + + + + + + + + + + + + + + + + *.mvd + + + + Motion Vector Data file + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Pose/PolygonMovieMaker.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Pose/PolygonMovieMaker.xml new file mode 100644 index 00000000..c8c8aea8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Pose/PolygonMovieMaker.xml @@ -0,0 +1,25 @@ + + + + + + + + *.vpd + + + + Vocaloid Pose Data file + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/Cinema4D.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/Cinema4D.xml new file mode 100644 index 00000000..a67311ed --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/Cinema4D.xml @@ -0,0 +1,20 @@ + + + + + + + + *.c4d + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/PolygonMovieMaker.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/PolygonMovieMaker.xml new file mode 100644 index 00000000..5db68131 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Associations/Scene/PolygonMovieMaker.xml @@ -0,0 +1,35 @@ + + + + + + + + *.mmd + + + + Polygon Movie maker 0001 + + + + + + *.pmm + + + + Polygon Movie maker 0001 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/ImageCollection.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/ImageCollection.xml new file mode 100644 index 00000000..3e4e0400 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/ImageCollection.xml @@ -0,0 +1,20 @@ + + + + + + + + *.imc + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/InivisAC3D.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/InivisAC3D.xml new file mode 100644 index 00000000..bd73b99d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/InivisAC3D.xml @@ -0,0 +1,25 @@ + + + + + + + + *.ac + + + + AC3Db + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/OmpSkin.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/OmpSkin.xml new file mode 100644 index 00000000..f08f697d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/OmpSkin.xml @@ -0,0 +1,25 @@ + + + + + + + + *.cos + + + + OmpSkin + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/Super6.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/Super6.xml new file mode 100644 index 00000000..4b3d20ec --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/FileSystem/Super6.xml @@ -0,0 +1,25 @@ + + + + + + + + *.6kt + + + + FFFFFF9B + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/Model/Mcha.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/Model/Mcha.xml new file mode 100644 index 00000000..d82fff55 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/Model/Mcha.xml @@ -0,0 +1,25 @@ + + + + + + + + *.mcha + + + + Mcha + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/MotionPackage/MoPkg.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/MotionPackage/MoPkg.xml new file mode 100644 index 00000000..701ec31a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/GraphicDesigner3D/Extensions/Moosta/Associations/MotionPackage/MoPkg.xml @@ -0,0 +1,25 @@ + + + + + + + + *.mopkg + + + + MoPkg + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/ATRDataFormat.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/ATRDataFormat.xml new file mode 100644 index 00000000..3a6812b6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/ATRDataFormat.xml @@ -0,0 +1,20 @@ + + + + + + + + *.atr + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/BALDataFormat.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/BALDataFormat.xml new file mode 100644 index 00000000..9c0883bf --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/BALDataFormat.xml @@ -0,0 +1,20 @@ + + + + + + + + *.bal + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml new file mode 100644 index 00000000..baec0694 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/KnowledgeAdventure/Associations/RSCDataFormat.xml @@ -0,0 +1,20 @@ + + + + + + + + *.rsc + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/LightingWorkstation/Associations/Fixture/QLCFixture.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/LightingWorkstation/Associations/Fixture/QLCFixture.xml new file mode 100644 index 00000000..24594ac2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/LightingWorkstation/Associations/Fixture/QLCFixture.xml @@ -0,0 +1,20 @@ + + + + + + + + *.xml + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Michelangelo/Associations/Michelangelo.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Michelangelo/Associations/Michelangelo.xml new file mode 100644 index 00000000..030290e6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/Michelangelo/Associations/Michelangelo.xml @@ -0,0 +1,20 @@ + + + + + + + + *.mcv + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Ada.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Ada.xml new file mode 100644 index 00000000..4c1ccc5b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Ada.xml @@ -0,0 +1,20 @@ + + + + + + + + *.ada + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Boo.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Boo.xml new file mode 100644 index 00000000..ddf491f6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Boo.xml @@ -0,0 +1,20 @@ + + + + + + + + *.boo + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/COBOL.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/COBOL.xml new file mode 100644 index 00000000..114a6b9e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/COBOL.xml @@ -0,0 +1,22 @@ + + + + + + + + *.cob + *.cbl + *.cobol + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/CSharp.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/CSharp.xml new file mode 100644 index 00000000..c1563e08 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/CSharp.xml @@ -0,0 +1,20 @@ + + + + + + + + *.cs + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FORTRAN.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FORTRAN.xml new file mode 100644 index 00000000..db66c047 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FORTRAN.xml @@ -0,0 +1,21 @@ + + + + + + + + *.for + *.fortran + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FSharp.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FSharp.xml new file mode 100644 index 00000000..4228ecde --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/FSharp.xml @@ -0,0 +1,20 @@ + + + + + + + + *.fs + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Go.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Go.xml new file mode 100644 index 00000000..a7284440 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Go.xml @@ -0,0 +1,20 @@ + + + + + + + + *.go + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Java.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Java.xml new file mode 100644 index 00000000..3affe59b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/Java.xml @@ -0,0 +1,25 @@ + + + + + + + + *.class + + + + BEBAFECA + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/VisualBasicNET.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/VisualBasicNET.xml new file mode 100644 index 00000000..43940aa2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/CodeObjectModel/VisualBasicNET.xml @@ -0,0 +1,20 @@ + + + + + + + + *.vb + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/ExecutableObjectModel/ELF.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/ExecutableObjectModel/ELF.xml new file mode 100644 index 00000000..22ff6962 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/ExecutableObjectModel/ELF.xml @@ -0,0 +1,26 @@ + + + + + + + + *.elf + + + + 7F + ELF + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Project/VisualStudio.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Project/VisualStudio.xml new file mode 100644 index 00000000..df411d1a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Project/VisualStudio.xml @@ -0,0 +1,28 @@ + + + + + + + + *.vbproj + *.csproj + *.jsproj + *.wixproj + *.fsproj + *.pyproj + *.sqlproj + *.phpproj + *.proj + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/PropertyList/VisualStudio.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/PropertyList/VisualStudio.xml new file mode 100644 index 00000000..8f837986 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/PropertyList/VisualStudio.xml @@ -0,0 +1,20 @@ + + + + + + + + *.suo + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Solution/VisualStudio.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Solution/VisualStudio.xml new file mode 100644 index 00000000..fd27a9ab --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Associations/Solution/VisualStudio.xml @@ -0,0 +1,26 @@ + + + + + + + + *.sln + + + + EFBBBF0D0A + Microsoft Visual Studio Solution File, Format Version + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{8891C1AE-6699-45DA-8B22-13BCEBB63364}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{8891C1AE-6699-45DA-8B22-13BCEBB63364}.xml new file mode 100644 index 00000000..cead2fc1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{8891C1AE-6699-45DA-8B22-13BCEBB63364}.xml @@ -0,0 +1,77 @@ + + + + + + + C++ Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{F184B08F-C81C-45F6-A57F-5ABD9991F28F}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{F184B08F-C81C-45F6-A57F-5ABD9991F28F}.xml new file mode 100644 index 00000000..922d478c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{F184B08F-C81C-45F6-A57F-5ABD9991F28F}.xml @@ -0,0 +1,46 @@ + + + + + VB.NET Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.xml new file mode 100644 index 00000000..c7417411 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/ProjectTypes/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.xml @@ -0,0 +1,42 @@ + + + + + + + C# Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Basic Project.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Basic Project.xml new file mode 100644 index 00000000..497725d8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Basic Project.xml @@ -0,0 +1,28 @@ + + + + + + Basic AIR Project + BasicAIR + Creates an Adobe AIR application with one form. + + + Software Development + Adobe + AIR + + + + + + + + +]]> + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..997510b59a0bebff03352da57c09b73298afe751 GIT binary patch literal 702 zcmV;v0zv(WP)WFU8GbZ8()Nlj2>E@cM*00JUOL_t(I%cYY)NY!x^ z#XsNQ`)L^_S_(PjCI+DxEkc_hG_%=3UO^!abaGE*H*N0pQ1t_*oRFszsz0sCuC05fzK5ScZxQ z4lTo>1}d7N;t@N-`KKGd9|nM2Z{&r)g852|(p*4l5MM7)0)v2NE?BbL3Jx zq3=2>@MiH7@9z)Q3ButX?wy1H>yICiyn9P?2%HlkjE}Q7JIjG8dgm^!vkPbo~Cam;ocQ=6EeV`hfNsVRz4#D0iSHN+rE)4vJa9Rm)`C?pB{0|PV;4)Swh zfl{$Z0oXN16jYrgk&_JELA367yOz*BH%HIN2rpY&*esX1m(8*^J)ChRuBW2 zgBUolOQ5j2%GIqchO$|j+S+LA>Y{6Ol>BBHRYw(4krNBxsGdwOU9LU$ixhN>ScIJN*0k}6~K zuTcw#8lsS@BjSiTY3hg?gbZ?8!ME>gEPwujh>?mQqNJ*b2r7oCqN0e^QBBz_mg?tw kKL6prKk?@6G0t3n08=AnYixi3kN^Mx07*qoM6N<$f(aiVx&QzG literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Images/Application_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Adobe/AIR/Images/Application_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..51bef30530f9d949c538440b793ee7bc917ca327 GIT binary patch literal 1408 zcmV-`1%LX9P)2`03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00iVoL_t(o!|j(#h+Rbx zhQFG7?o2Xaf{7*~*=R(?7etL9z7XBG67cjasZY>4y? zF_WNQ^A`HnKs<8%p1* zV#l+`8Qpm|io_uWoIn2y?y(gFo11{@;zcfh@-d5MESa$=v1EqKa5HQ&p#jR}WhygD zcS*M0O6yAK}*VCB>)&K^2M`PX06 zWGF(6Gwzb%5j0KU;oBRa9J?anTLMi4BNF}w6bBBle9JA#OL^0*D40pq5;frY=2A=8 zq$gq<4xuzzymzCy2{3{zw)ser*`b%=l9>ocJ5>%F_l=$>#I=j zfgFmB$9xWW7uTsPV>y*rIe3u!PoHM@4L2|<3ch;jB{oJQG#c^w(W4xd@N2JS?c6yW zQsE-&i9RoQY~ulCrgktyis^|v%lF*Fo||rBVKf3@eA{jO?apdd;X8K%aPZhMF4r~F z2&NKsBt0(W1eT*<9tXPY){-Wt;VCegOmfLc3I5@C-^C6bVExi19(?&_1l;@l^E76B z_QDH^2VMNPI)%ID8=!8nx+2zuSU2ORFTUXWlPB4K`|V8r_yc$6&L^Mbnp~BO<~H%{4&1`?JNh#99QDB_AF+Lb0?&U6uq;6a{;4zM13S ze8ckIy#Sm)bB0T6YhXs*)q_@V$_4Wwh!g>#9*SCGn%!e&P*q)0k~@E%JvxhC|5DqYY$2-h|c3@Tvca=ez=szJ22J#s(s%rgM&0M?|;0SEr3B=8Hkt+%;}n9?aw>a3b3D*RKtN + + + + + Simple Arduino Project + SimpleArduino + Creates a simple Arduino project framework. + + + Software Development + Arduino + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Blink.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Blink.xml new file mode 100644 index 00000000..ce9fa9a3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Blink.xml @@ -0,0 +1,55 @@ + + + + + + Blinking Arduino + BlinkingArduino + Creates an Arduino project that blinks an LED. + + + Software Development + Arduino + + + + + + +/// The setup routine, which runs once each time the board is reset. +/// +void setup() +{ + // the first thing you do is to initialize pin 13 as an output pin with the line + pinMode(13, OUTPUT); +} + +/// +/// The main loop routine, which runs over and over again forever. +/// +void loop() +{ + // you turn the LED on with the line + digitalWrite(13, HIGH); + // which supplies 5 volts to pin 13, creating a voltage difference across the pins of the LED, lighting it up. + + // do nothing for 1000 milliseconds (one second), giving enough time for a person to see the change + delay(1000); + + // Then you turn it off with the line + digitalWrite(13, LOW); + // which takes pin 13 back to 0 volts, turning the LED off. +}]]> + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blank.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blank.ico new file mode 100644 index 0000000000000000000000000000000000000000..730d7ed35bce9814cae45898b2bed8961193e444 GIT binary patch literal 4406 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 TKD-EQ+@zL1yaGGPwn+F7gK3`W literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blink_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Arduino/Images/Blink_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee3754fd8fd36a2305cd91bdf0485ae4935df44 GIT binary patch literal 811 zcmV+`1JwM9P)WFU8GbZ8()Nlj2>E@cM*00NImL_t(I%bko%NR(j| zhM#Zz=b}TIQko@7PHGZmh2f=0D&mWZnEq`Y<4^e+~tz!^? zOZ9Dj^A~Al%$#k^Ow^bkGsc8}8Z#O;=D^W&egJD$+AQe)=RtacAqrQdvM)WI$*9C7 z;%E&7co_0&$~(r7jnb3W}-j?Zd3g z#bjjg!|ftJ&V3MAZaEuV(DR=6GJqFgQ5M*owCNVf+uHiifU zh)Rhtg5Al>_F4kiu`-SFj!r_yYS@*Qjx7yYO?TOoxt4>^I%%GmU>5L>j6f*FtZids zNOCzd9SA5(OQFi=LtME=X?q)qH?LEX>7#MSUUsIg=1TW#q%jZ-!ssY-N}&z75MB!) zYQx2?MV!pr!29q7xkY6pT5iT7Q7&vO=0j>5;m@CN3=d-*f?y=Vw32A>S_04pY;8z# zCs2~&!ImJk0U#WFU8GbZ8()Nlj2>E@cM*00xXnL_t(o!^M|fj8#_^ z$A9~rbMMTZnLB*UOxjSuGUJTejt!#LCX9*LA~e%N5v`Dc zgH23)Flh-bqb- z?DfC@^|d$rpMM5`&5tUoAOfm@g3O)^D4-I`RKu~>$%tg4;aH<_RZj_ZPYjtV0568J zc3t$bt!-L;G+Gy_112-yGV7aIHcS85(HRUlGx^Yn6P?MCRtM3<%p?#sb4ZpW9l}FXf=_W;)h7j%-l!k;;Xsfje|AHsy-K@7^wGk-Mjvou~r`^kqqi$ zWfp*48y{!q_VsiByn?FEiakZB#+KGxuUea{#$jOvL^NLe<*%OOr4vK*FmMwOgaNFm zn$UQi;i}PUz}EoPi7T&a&dgJ@Gv0x|BpXIyT19u`!+=I?l;W zn`!ovpm42NV%7dZ3YAKjR^>AL4(+GkYeiOm4X2|6&Yq=rc$gJK$C(hH{m=$npOc1V zYh&Z>sT3nyzDM@)9prZG;I*~uXmnk!`DH%0cMpnUMY!kHS142}v?P-JY0Y~6GMb@3 zC-9l&IDLK4*9Sd4m~@)Ffz1JYcUi~t^VWf1{Np$nL+654E^m8`<>{6%>J`>3xq~ZP zx3jFNnS!e2~$->5mX2gJ1xLhc*Adw*DdXxi8@7}>UZG5r(`#W1mxe4~&zm5%W zz8==EZ#|4_3?lHs8wcql%z4lE;l>Rpl`z>XHV6n*34lPAdlF4wzf9@b7=Vi67(>xo zRKdk?@{vs;I9rQ&Re1LFshGGI&isq#R;?zmmX$#f3s@1nd>+Qfp`ih$rU-nWKm@Cb zRn<1v>j9Fn3k0~gqXXXxyE7R?4GG63;kbB?gXg%2D1ZLwB8RVx#sCICy1+YEM=2DF zv}CiP0TC#bU}6HUUx!?dAY#CVwoHTPE(TIgec9c4*WG~f^}_MxXQL82l;zc zEv*RZ`(LR`#f{%Bp32I z6vI=!U*?7Tz7d@-l$Tbo<%!SU4V4NFYNE7N@O{YV(OeEGm8e*Y)H)oF;s6P6M(2y( zPp@3X54w7Id-O7y>1jlvvn9=%+wY(~nZk-7n7H=;q-P~xDO7Ox4MqVSrXR&3#u%*c zBO)>V0IuV>vj8Zz+HMt=HZ`-gvpa03s$mDLYxAO7Ydi|KHK#dM$kX8_Xe^gW>$+jd5QYJ%rYt(bwq=xvUGVD2Y>W44!w7T z(&QxLm(J6iQYI&IBpVw@H#agic7>uQC{2y+{jgkoJ!#wz4ZyBH9MJ9GegGSvBQ-W? zRZ*!wSk&aUUN=4?g!A7%Kfw6tdG6ov1dXX?4i4_3P;r@}o%as>ZtkgA1WpfUup(Hi zhzNld#41(=u@cH8l!+)}B?Kvgiq^@5>FG&Sl?&(3;(A_P3VyX z#%vTsRpZt5a2!Q`bxjpBJx)tfdF#mEa2$uOHn==CM$_$Wx8}w(Ffj1;z`%e4tDBmd z?(6UG*Y57_S7+-vpB4ZSalDZFpin574I4Jl($c~$0|2 + + + + + + GTK+ Application + GtkPlusApplication + + + Software Development + C/C++ + + + + + + + + + + + + $(GtkPath)/include + $(GtkPath)/include/atk-1.0 + $(GtkPath)/include/gtk-2.0 + $(GtkPath)/lib/gtk-2.0/include + $(GtkPath)/include/gdk-pixbuf-2.0 + $(GtkPath)/include/gio-win32-2.0 + $(GtkPath)/include/cairo + $(GtkPath)/include/glib-2.0 + $(GtkPath)/lib/glib-2.0/include + $(GtkPath)/include/freetype2 + $(GtkPath)/include/pango-1.0 + $(GtkPath)/include/libpng14 + + + $(GtkPath)/lib + + + gtk-win32-2.0 + gdk-win32-2.0 + atk-1.0 + gio-2.0 + pangowin32-1.0 + gdi32 + pangocairo-1.0 + gdk_pixbuf-2.0 + lpango-1.0 + cairo + gmodule-2.0 + gobject-2.0 + gthread-2.0 + glib-2.0 + intl + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Class Library.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Class Library.xml new file mode 100644 index 00000000..ea749294 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Class Library.xml @@ -0,0 +1,37 @@ + + + + + + + Class Library + ClassLibrary + + + Software Development + Common Language Runtime + COBOL + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Console Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Console Application.xml new file mode 100644 index 00000000..c5ef848b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Console Application.xml @@ -0,0 +1,43 @@ + + + + + + + Console Application + ConsoleApplication + + + Software Development + Common Language Runtime + COBOL + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Database.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Database.xml new file mode 100644 index 00000000..bbfe5a9e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Database.xml @@ -0,0 +1,64 @@ + + + + + + + Database Project + Database + + + Software Development + Common Language Runtime + COBOL + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..de8f117890d16957e801d60e202851dc37fd12ca GIT binary patch literal 770 zcmV+d1O5DoP)*|03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00L%7L_t(I%cYY`XjNAf zhQD)jOrp7JOz?%$5?>gdDGr<{6$G6)696j5+0 zIEb%-IM66~t2C)3n#Vo&p0oFQIJlQ2N^#*6C>^vgH@a)1<|m~z|!95wi5_anwW1P-5G%cdRO zh!|=h>WDgO38N!b07|o8)Eut<{+i<#db#m%D;f;b22{+a0b&qh1R#A=`E;P%_J-kq zpCBT{qLU;YdbE&WnuCjl7vzV96Ym@H5<#k9m<*pK5bB{R&z=o7|%D;wR|_n&aLOv;U0e8yB_<{ zK}(u&{kI{W4^FV`$9C>r`Uh2r(lAITYXw+AmIp+P;ZK3S8@=Gl{El{B434wEZx!aw ztB2#HttHeT#wH-ka?l#JdcfRSRGx!ciil$lNeTYEQeiPY*w`>R;-LvDHS($KpaA>_nRXXUakiXil#J(|q?mJ?rW zW7>CU&w1ed?YobBY|2^ET_$P=q7V$s{hRCj8H#PJTpZ_+761SM07*qoM6N<$f*r?9 A(f|Me literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Application_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Application_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f6eb14be500e2d939748dfe45e889bacf8e57baf GIT binary patch literal 1521 zcmVWFU8GbZ8()Nlj2>E@cM*00mV^L_t(o!|j(@s8&@J z$AA0YYg(E4qJ)iRNeYz|R@nSdG(1GqLo{IZU=bQ=85%@1KtTmr3B5E*MFUh&7)_E? zQeAIZXmq=n*`(>0_d49+>^1bT_jkT?KCclN^wNRzowN5od#|1BPQbp8E~(+_v)B?5nqpke{tN%{Jxy)b8f20MJ$S=0pyuP4Mz=E?PJ2Z4U0; zPvz^@x83Y4ZFYT7{%pw z2iyDiqTm~LRUogz*5bd)vE}93HBhIlPNCJzR~$I=g)Pj#?xMZ%aB$DY4J@~f{BDjp zn1Q*s+U~gz)WFQkzIz^elnYC>Ks>gq4 zQnOQ9(T96L%@8rv^zR*TPd|Hh3I`q1iF>Gt%H2_OUV8XP09L>AM>+SLOD6+x$t_1_ zN-78$h#6L;VDqnyPetuCQ{(%MTM$)D9WmqJ2?sH_OX*(MhnS&eeDdWw7F>TNogLwC zg`30&<^eNHNB}BU*FX_v&fybRSHd^k6kPcF*NXv|b;Ji?f?L6=HHW24cISYxsg9j= z`b6g5dpz5F_weAY8vwX)-jOZtD}ofYng%)w(TZ`!T?sDW%B+*$0N{~(&IT(8L%R_X zp1HS=5%HAU=7=Pv4-YAmri^9Ml(DIHxL2r4PqlUg3Mq|m8@!w`JpzqhHR;Oe`lp$0GA*9XALH z@4#Z(57xeQ2O_O#*LM$ad)C0z6UGB@{!K^m#mm2ydMN9M8m3+sp<4uvj6^LzT(j(W zv{Fu+JDR#93S!Q;#e3X3??%p@dw4QZsy*ERA>{IGX+ID(+^YzPf<~}{B1)bdn6t2# zVz3_>Y9K>(1U`H1_C$k7Yvb{Jp3LuB(SvE;&YK8S#=2ruumaB%Xcpebj~-Xz649wd+cQlc!9?s}6`NSj4PI3+AZbfACn$L*CKS&S#oX zP|432>FMdouK9c9d!pWB}L)Es}Sq5%=Zb%eNc3o&ZB&0e^4W6FZT2HK{9 zcb~frH4ssrd*$_9?~|jrmB%m7dvq%ey>`Y1=xX#gShn(HMr0<_j}atO@b>*vQ^d_P zom$pH$^cbIRQc%D$HM;nGwND$^A+U+&%VCeH6u_KBTWTJGsjIz%t2K4`>$E;Kq6v@ z!se~RsnTVG>bU||PsQ#;`IjAN^f!3^l{XoYNKpteMv5X5W4eo&QniQ?i4j%ZZwLMY X5s7m(^hv5$00000NkvXXu0mjfO(WI4 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Blank_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Blank_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..95c0b965a384849e6e2286751362925d5fdd63e0 GIT binary patch literal 651 zcmV;60(AX}P)WFU8GbZ8()Nlj2>E@cM*00HkwL_t(I%gvHIYgADb zg}*ynlTz@Rp-KY~tXF7CQDe=Kv*C zvkZX3Qdkn@u_cy&D+=U_{K=SMrgS~3J?Md@PKQNc2Tv!U3~pG%jxb`LSnEqMcPon90X)$ zD*!349+B7c5EhUW;K8kLG_P-9_u&mpjV@p=NFd8r0l;fvb8?8ofm2)9cd`Yy{Pkbn z8N)*et!@y?pF_*1So=Z=NJNrPE3-!Fewj2aVD$~YjEwQ7Zve9(GsDcu+%YrU0&~aB lu_ni791rKmWFU8GbZ8()Nlj2>E@cM*00aI>L_t(o!|j&Oi36Xk%%xx34sX`L5rxMz@$ZLVXM%>en2$@EdpIcw8*G`AX>O> zl`|uiG-D*ffKXDK86797_nfE2z3+YR`_A_}wQDmMzP$II``&ZT`#jG%_X}&|e;%Qp zJj3@A;0Q-3*&R??dw$lo_Sy;Q*_^4@!1=TI5~K|FU1eIdUYN%?@hsf z88s48$c`f#Y3|)5;+I=OtEvohUrmItu<$o8?mN%uokM&zHNlrt6MS)gf;&cs_<4FE zQj%!Nf$JZMB5$5CnMj+N;s1ufrRhZgPMqF>D`nj-_l$A6o zVD40vV{WS_aPxY_Z5!4_xFw{}64lwsD*$}^&F}flBL}wt@Z>9Z$KaWg1|d0A?zpdl zfCRUX4zhg1V&*lZ$;m)iT_ZVBud62D?wKB|yrqG`K0T;es#A)B;gKkv@jaV3{N8-37qp(OD|*E-doe{wV-< z?AjP9a5(qLRsQ(x7EiyiJ?o+F6K2+51G&2;zTf<894YcrnKGmyWiY;H6ED1dFD~)< zsmlO-{qa1*>(^yHSWzV|VW$2GD8JnB?G9mp++NkuiKnt__4lDb2%+f(iu6Y63|Aiw zQjK?|MMJrLKWK5{ptKtO#E$d0{n=H6T+&Fxk+882IPx*uwO2LJ^K zsSQh*8}9umpsClgA{@2(EGojvdm`=C`j~z0$LxE{*m|CNcROy5`X%5FKV7;KyH%>! zDv8DvTWIWLanD_Ng48@ZHWz-6^XPHM)%bBOFf;ut=IXD3V<$gMj-%7)Jc`CW1yK{c sw#RuCBeg9F7O5yhwfOSnq@xm+T`Qr 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 PcneNu|G#BBvxE5`9=Xq) literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Console_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Console_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..79aa0dee2d8807230e2b9ca8e85ac0dfe3b06ea4 GIT binary patch literal 818 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Service_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Service_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bbdb09b040608853ba8634dee557dae8de7df6ef GIT binary patch literal 804 zcmV+<1Ka$GP)WFU8GbZ8()Nlj2>E@cM*00M|fL_t(I%cYY`NL5i3 zhQD*}!FSS&d|%UyD4{{opax-5VOTWkK{N>(q)`MBA%vwwkAZ>oP9Z3e0tY?V(*W4B6Ey<2&c5gPrIp<7UXS(+MhB+K$ZrE>!1H|ooZ;bq3EAHm z8SX|aAK%R+A@MPtPjlF?rI_aWK^``bvTRivoAzW;ur?hdg6FA#KqNv+!goRz*p^_l zU?~sFvKbl~#SX#2+T|1#r!mm~BTgVQ1it4nWs=Fx+W^3^3s6xuNn~u2vO}7XlTKrG zKiT=olp|5)a zC&5M=@csA*o*TuDMFB`l3Xz)PkdmB;-}{WMwN+R)v|Jse^WGSX3sbNNw(*<5ccX|c z7y%+{yUx{C^Tg>-EZaExg#tsSYZW8o%r_}>l)fmhr_vN#wVh0000WFU8GbZ8()Nlj2>E@cM*00rAgL_t(o!|j({j9pa~ z$A6od&J;Q=lZdkiT8oFh@4n~U4g~bU7fy2TIcuM@ z_FDV@|F5;rf%lL9^Wi!dU*hj(fMO_y#c>5J+M3Rtv9hhWc<%aiY?6Pl$N01Z=r3mT z5f+vlEd4r@mIGT)f+vnsc)I)S7*i?cNppeX3JFj^qdVdXRsqJID~I8dPxr1X%s58^ zR+_}pMBM;xj_2JRDfcGWJAMKMFEU+#ya-#D|02g4r|Z=~nX)p4S_)rC;M`vw;o7f$ z?nFEc%wli_jkXf6)ldUfP_wRW7RNvoR4t9&a{C>O{bUXV-tM^R%6%LdpH22zA6vw> zyVj+^ouFpK;H2Q4`(|MQ2M-=VMCYbpE;XpV%{_Bz;($iH*4`w-$|a)Zy&(E76R1z- zeCP7#S+j142mZ1#tj3JHzc)_h`8uoCFX{&FAV8!@yXTNhpixB7cY}Z${Bx`hz;}Oq zR-7MO1m6;)GJov+Z z0kHSciR63UB})MK{I^y_N(u-mcvZAW!5fFF=0#CaUfq8LFM^8URavm;6dKdQ*uDy0 z6;b6+&+X&7tG-CzN$wqm8^i}{4pj|E0OGZ*fh_lYaCmQF`HHE4d0selF#zjN`va)Q zG~$~=P|DS!Y7l{$s0WXc%_1K^8k4HZ*{g^JO;qJb52bZ?D^ThIeNIo z&w)h2mv3H!C_K2c0>I;U zzs|t?z7DHVh=z!j6KLm>pfA!9AatqDMLUftl-9vF+a=LSgt^q`=Q*5np&ds(s0wOD z4dfnE9}viVT3vAJ@Mf5TNC+ficqQ>HV$7fCP<1qBgvN~Y^b|`AlHM}Ra}Sz>=H$6g z?RCR-<7CYm`D_(wRngWYnuq=1>2r=SG&Kb)w*&CfSe@&m23CD|2!IQ}v68<&^q-`M z)IUT~v9btFbC8^NF6qH%?_3*TPbdUr#Ej`}n^}F={cMht9DC}Uti9p;tXR2*1q+8$ zbpSXQ+p~uKz>8v5M8FG34w{kWJ~}%#ZXG9U)bPzJzF9`#$)!^zh^xmY`M~6HmMmSt z$x*mc(1S|c&N~Pc?)B%nfM!^vK%!cozT=DlUCcc6enSQ7S6y1(wCeTP^{lk-caFY3 zhbg!|m_OK`&Fi+|kENU)h%eE?GW|6%+6xpgF1;xtGNCQ@5=~%^_;syyqT%df6k%>7oPY z^ThT)C;OVMyLqirq2*!0&~WJes_05(%bhiwx^o|YCU#(TS^YOE3`*oc8 zA&-v~JaX$QR099kKen^v)b2^(cy)pwY~RA@=qSsUEpzYX%c%dxEmtIm`*-g(i3p@- zB;aeqT(s+anza_KdW&qT%{5zhb9CY`$0sM4nW_KRpJt^O67Ll+@Wz|1(CK0q{M!0^ zIrRE|YPHGmj%bFUJonl&?6~1-07gbe7#JA%-x8?Ss{Hcd-_iCtS?0;}oGi;}w^}qB zGqhSwyce?EBi=J~>S9JmM*$cZ7+_>%#J$%9-U8ZiD|HjfPUQdq002ovPDHLkV1io4 BD<=Q| literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Silverlight_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Images/Silverlight_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a90405c7d69e0ad3e1e73eade509f1b3ce99fe GIT binary patch literal 1752 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 + + + + + + Silverlight Application + SilverlightApplication + + + Software Development + Common Language Runtime + COBOL + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Windows Forms Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Windows Forms Application.xml new file mode 100644 index 00000000..39ad7fa1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/COBOL/Windows Forms Application.xml @@ -0,0 +1,20 @@ + + + + + + + Windows Forms Application + WindowsApplication + + + Software Development + Common Language Runtime + COBOL + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Class Library.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Class Library.xml new file mode 100644 index 00000000..fd8fb133 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Class Library.xml @@ -0,0 +1,37 @@ + + + + + + + Class Library + ClassLibrary + + + Software Development + Common Language Runtime + C# + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Console Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Console Application.xml new file mode 100644 index 00000000..ddc18feb --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Console Application.xml @@ -0,0 +1,43 @@ + + + + + + + Console Application + ConsoleApplication + + + Software Development + Common Language Runtime + C# + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Database.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Database.xml new file mode 100644 index 00000000..cfb3d2c0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Database.xml @@ -0,0 +1,64 @@ + + + + + + + Database Project + Database + + + Software Development + Common Language Runtime + C# + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application.ico new file mode 100644 index 0000000000000000000000000000000000000000..a564b626542ef55e0a2da0cbf71d5fc75447a09a GIT binary patch literal 5430 zcmeHLe{5UT6@E-;%7y^{!>wiV>@@)`C23pbQ3$1%q139|S^ILq{{0A0@DwMK)%KBS(qr1Km9dB>JdsSuFS5bnBKjmY-#m#>yalBvk=Yu#m z1zh+V_;M1{6Dlr_Mc~_7f@dEwzx?#WX2^jU&RsFSWsiP;D8G{H>JUZAJ9>F&rH|h)Z8i;G3~ef!G(gaPk=9A05US|6Z(EW^(Kq z7(mO3lVbhnjpg|Goh|6x;l#wLLEOCaCM;{ohO$)wzP$`v+Y_|M6#g|jNc-01 z>J-|}jA;D3HsW|y2@Y-Fg!hBHvAFJb;2WSLvLCN?7bC~F9Dn@a1z>6tBZuF^>PLR+ z=!^^_5G8GC*EEie^=j)c0w>jeM87zV49|D*{kOh{;pj)?$sw#+ez)U8HHrh1=g}Qi zad0Gx_D@F86dJ+gCqtzFM%=gOmqLGGU>)-Ps|2uRP!SM+MhDXs6 zj$r@b8T{j97=7*gDCTMOM7wZyGJ?sev&5YtG)zsL#b*Ouc=7RHIk-M{xn6mBhJ4EB zw^R>t;Hz_@CiwXi|9lKjwynU9{=Z^!=mh?-B3rEg`?gX?V*O>ho2Gv*PLp>Rv^~yE z;_~?zF2%pX3x}S?rLU*(+39|~^5lbJ{p+Z$sXy|Q3{fFMqmI(DJ9y%sgC zRd{P}6{;GyqO#77osDnfjh$t1dt9*QWr_7qH~h}Aq|c5!d+oR@xCTqR^Rf7d4R^FZ zjvw!{;?~^{;Fg-Zaq~74Zg6Gd#!a{4x(zqs_J@~<^-ne0%d+>cg2ne+s+X0xzuAWS z>K?-{YI5=O?aQ%r%Y!hL-iyVr-h&?%-Gv|i-h>}KcN=cAn#$%oU-LZ&6s1H5H56_Z zbE1RhQ&B>%@mlUPnS^Bo?nnQ>=5~OplKj%pROv!fg%jTLVt6+f!&6!a_l5$v*B8K5 zWQTK|4bHVT6hD)T;(RNp2XlER)-Uv)6{W5TGlb=Ii@%xpW2(@=It0`(;-icZ;*lg+2m7#4&eZprKh^UlkkMYjsq+;j4DRNA)E@--E12@RR3G;%5!PHsX&{ zZ`CzuUXTwmCo0v3?giHb*QNL@=JebQ1rcWqO6awes42hDkmUEmIT{xlf(LvWKWX6j z16PP&)F^TIC{CeOI}A-U}b z?C_8JVQI05Iqx8yA$o_Oht!~UmeRbS_^CD}KYQ+BenNPF-q){W{K@+F887;`u{AbUZpP^EJoAZ(yxHjkH*Lnud zYiC!+FEu3ixwjLC#!va8i#>1B`D4^)=e>yEO&;@}3IF3U#LlbWS_n`r$o$XL!Tp4L zIrl2=nat0gH<51E5TpLW8e)+!c|jNofuE~Xx2%)F&q8WQ@UsTy^hKJG+nOupSexW! z9rB*vmFIzbCiiW@Pksn~U4zU8*QBURI-Bx*I)~z-cKCdH2WOu@=HRoyBZIk9y%6zJ z4RFsXTxk{j9B+dEDl{}v?-q5&J%Y|5$E)=qr}#WGW*NU&!}+K0j$kYC({Bfke_qe~ z$oHOrfH*7k`$X)e*ZQ3OlC;VA)4bp_!tqnjpFc}4gf`+2b!xv|t~!2cN~#9- zBEg^HL5c>BKTQjtKk}b@F8_A9c78ns)&c{Aqd6HKh5V z=b!myEwDCvM|h$0vj*o&wpsDpn(fGKupzgOP^+Ul7uHI`HbMoV+zQKPLMdS*VS@!( z>j_1Kb%d9)U|vgjhLE2H(<+7;rj>*|!lPywb4&s={bzo2&lS*RhpE%1;Q)dN+XVms literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application.xcf b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application.xcf new file mode 100644 index 0000000000000000000000000000000000000000..468cb6405b41014538d2a19efb6f9ff55bb6db0e GIT binary patch literal 4172 zcmd5#qc=SpM2-ORd&YZCYWrGW(i}3ah#H zQi9C-zo9g8xhY!*wQ=nTWxbpp%xYG_TzE5KD?8m{s;PcVKYyKmK4W?IfR+uyekBT$ zqxPBlRJ9K;bkn5%v`PKxlloUp>d%_|OXa=Z^kdt>hkgzKQ8$4D{$aU9-c#wp3I(l?1TBAoubce*!b2Q`hH!}lY{U6By@tl zxWyKkxd^2m8j8G=f8;oA*u1Iz)BOWqo%{5|cXWq)6E8e(^K3kPpu^kd*>&rNzYdKI zO0f-k{cZWT-+Jp^Xvon84!*P;EL?!j62Agj^%s>0ElEKWEyP;_}W8DjoUYy}9(jUrN@{Q;)yhM!)`d_rR=$h#Kfv%(!O{mBJsz z`ahl+r=#SHhj+gQ{6{C-&xogDv6DxZdftPTJ(o;)D;|6N@kf^~U5>m*4;^@S-&Qs= zt1`3HW;&ftY)19$RsXHm(*UOG>5T7raP_JER6|ow*K6u0?nRrS|07oZT2;Q;+IQcz z?(Vx7_5ZM?Gsg={=RTGcG_5MIrL&hZ0Gc)}*(=!KUc}Rs$-o3Nb|?@Hd2Rc5a%va)6YbPNf3TV2+Fj zaWraR-T}-3P{2GHLxB29Rdfo~5FS)VgXA(iTg68Z5LH<6W(=}u7Pyf?y9yy9d5e)0 z<)U1e4|4vb&qlJyFa`?*Mp1V$ijt}1Ya1a^yUi9Q3O#sn(?gHqU8 zhcp~gG zxHuQ@6zqJ%s7;R=Y;`X1#z{QFc%R@+ z6=$$va8hTjsxlc2rNsx+Ne^xU)S*REb=F&oRvmz6CkDN#zy z6UYw4d%C;3I@;Snx5<&#%#c}uuT|2+$i}pr466y8{kG{Q2%^y6AG#S%S51N=ygUL0 zn~2Mjv`WdTnPyQT!4p9qA#%b2M2}?>!2xjr^nt-rw^?O0luroY3p_dE#L+FsFHr(` z69^}Ng_*Z*hl9ksj7Sn=vA#$o)Efx&Y$Y5?CEzg(8lccEOC3fe%A5@K5a%RGY$ORB z3Is4=EI1I`%TY|0p+p#eQS56;L>z*nR|FcOW2tQ!ipV$g{BLv3aLS}pj zV-eOsN`xF8gvebY7=k$#J!PmD;}~oQA#pJP4l!ghq(qkDvDPxwgX0mnWH?woe$_Es4Fh@(gZW-ZFf;uFzCy`JbELu%M4&E`)gb7$nVkFdDg4#r}o2?fobNGB*j>97M!H#CuAue>f zsRVh%SQjB_4~yb`Ei%S&Nd$AIFw#_nJh2$$#a2*`gWKNq@QC&GMYsqbiu5{)P;0EW zO_o&;V!+bo@wB$KuzGHCI2wx(l&VKr|CA(h;&`mbysWHj3AaQj(G;aOiU-HJ_=F^i zF)o(uF=sYQqBR~0^>V#jfbU5eGw85V`fQJ|EpllKr3|I%OF}5%^%@T>}MO? zlqy#MWh|JHpcP4OPUSB)*nHFlSHTcm1y&X+&AS!XTvWpBCV)H04z@~IzZFH@F09@J zlwy+~%$PA@l*=UnHDN<_P~$^NOqip;3WZ(HNeqXMK{Soth}2S@CVWdHyG literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..fabb154c3236b0723f3efde855d86ba846aa15ab GIT binary patch literal 845 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 IM6N<$g0(U^J^%m! literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Blank_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Blank_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c750cda85a444b7f989d9a36dcf5719de7f1816e GIT binary patch literal 992 zcmV<610Vc}P)WFU8GbZ8()Nlj2>E@cM*00TrxL_t(o!|j$oXd_1y z#(y?btiT5nq&UG9w}*--Rqk*jLz?+iv#P{pl1l2%oyApg7hiFlQ=OYD za&RU|w=N8u!jN=Y$ih7EfK#k?cV_?C)-~7ofj}e8%=dloeQ##qK0b3SrC$ce{cCLm z49N!&16aS6##eyR*;p6;#|Q$}7{mww!JBXiK-p{>e(11k6zQfQ2wbIvl1)XRVL;Cb zi2)IDh-(8}LF=z}wxzmrt_>z{R-RE`K_BsxnDPNx3B7J-lSC zMcNK013L6S*#nKaO3w&h!2@m6DtVwp;Ay%+f8hwSpAeJeG@JeB7(jDylTt=x88*o0NeON5H5 zf$90wY3XFXUVwn9QGQF7Mju8190ZfBBm!_HP6^aP;HJF7t5`NYpK=gP02p@nvbN1S ziMtS}0r!9~4mr6zA(9Ayey2~{^BvX0?j8rhgz@T_NI;9^`&g~0?(Bg%_|e4?+wZrX zzxV&#=iQ5Uj_UF1n1f)#=xoG~UysqsbMJ{-52UHGO*fA)4m0pUXTYz|-?I5=Gr3%% zfMItJfbr^>(OHED3<%=*N!9gw)%fJ{Bm;lhI|N|ui#1vwTXdVx7<7i2YR3a&rTw-H zR4Gp*t-1fePv#1EGa%6KG$FAl0I~j{q+qcD1sNp{Z2pW^NT6Fzwhuzbjt4g z9l|)Ir5dhkf!Wq|_Fj-0k+mnG6v`k5+MdthH@{>g)_+^)^xspOs!8wRx7l=mrOQlU z7Q-x-xe3b#tUU)x;1=uc$9>iw_Bg&c0-)P`%EqG&L=vOTwyv|oCW@=~vrVWL0T%zx5BOh&Aqmq!o7$zvg$wJoT4akaiPx#Y28U{<7ka8>5kAk zO(Tv2+c%U~ZCb5vUAI(qyq2r3ElgKen5V02t+S`{gZ=@G`26P`9|M;z0KHy(eepED zzVI1v>pHqFccJr(F3?y@P;Y-Tkf`0LvBp_mR(}-NPPhH*?#ZM0`|c8ax^*?q9o~mp zpBu_M3KHrPu;}N zJEqi4!SU`!xc^Xx=I&-JZdr`@L-EKwo{93Z3M_m1dG*3y4y)U4eS`ih|3L73J9^)* zz^R%oIC=0L)b^16T?$@2{36mnOovjX;8Oo3v3B~zS>(+cul9P5se8V>kKhdwF?0lj z=>EJ5O&6Qc)!BvImRwAtn3l9I!KO`RSe2TfUORJ2-S^c!+`oPW|Gae*!RuFX=UN}W zy4;6*f$JzFex zY`%6MZy#;MEFZ@jG;XUI;|LuNcw`5~!;j37eGe^C7^;+WP_D`DM-LnV# zt9IdcJAZ@UzqJh&o8CZ*$%MJ{=3++DOe9QAz?f&p!0B|t*W*K0_A4kYFsYo!mf9+H zL2d!II^V>`&0FAn>rIqx-i-8&bj;73k9jZ8Lt;`QjMI&nIB6or>c`@#r=P)wS2M!T zrjQ|;JLwwW~i8poSkU@csVocu+|wq_&Cl0|!@V{Qs*nVAT~l*w?uW)aVCJEW?X z^|{C_$;SM(S;%_Biqw@E$XK-yX+>uId}%sT7N=lV4tcR48OAhvevT0f7ta#U7t}6M zCv@5nf69i59ZT{2XN7p~Q!B#{_JI6Pq$GS-QPwj?MMn#*M+5hnIKoT<_oM&k;kp4u!d+DX_YMbKPCHy%?5Hj) zMrCOcDoct`vBn0+YAe-;74~Ij*b7Z!tuX+F(Liu(_L6%JH%m{n-+OASscHEUJnIRe zljhDw1Q>0M1_VwtAV}B29xpmtX&!(8^&tNPhCX(jOEWyeF8S z1e1mb`PYZ@?^a~wDZRt9KY12%|Bm<<4-e&^Ut2U0zsj{Pq}<(4CW)ECfFBR=bGnu zWe?)d!{wj%mH98y@U!R4&+t=EjXI>+~yGwd86M-K2L^82Iwc~p&zG5bxkC{)DjWDMZ-^?3;sb3 zG8bHvqAuxd%Jb>yraaN_GRK*mMDI*58DX4ejL_iNNIi+-;KA|pkX~?p`2Hdb_3FXF z@rL;yK?A=Vm{Lr`YG7TCGKcV?p+5ARsO4vminaXzf#;?)Q>2DR^n!aN=ZSl;j9>m9 zH0-UUcU#-T$g{%A$g#qlV}{v6$TUM}7^-7PK8AW>FSR4~=~&`7Jvu*YiqJqh1~r6r zM9arCs!L66a;@mb=%9dy zGl!k(I9fgge>fixyf9@_O?*o}#2KahKMH>|ZqeW93~BQr>SDxvJbX_1{rPd?7cpz| zAnP=uE~4Z^=48nEaC{3t*Qp#@AEXZL+HhW&ufOBQav3Y>>Wf6o%1TfPQng?lltBkLK$Hrp_Fo4LRdpsO;}02 zcm-h@q0k6@9)o@xatIberUAM%Is=5E`DcDZ+b}p`gTB=oLKDsOuA@I)i88{*SUgcmD2aixCg$<^SyvPdI;o*9iU#_>Txy6J tqT#XQm%fk&!+*ht;rRd8`RDU=TTuz435vQtgwZrJMm-LC>Hf#XzX4xK0Z{+| literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console.xcf b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console.xcf new file mode 100644 index 0000000000000000000000000000000000000000..d9cce98f3b06d0f811968bd247a9022def0b4831 GIT binary patch literal 4530 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 SeoDrohoFoj<4`o2g8mJ9){3oJedFh03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00SaPL_t(I%UzP)YgTmt z$3N#h=Xu?p7q_YC*eqyP;-;-!C7D89cp-=tffs^Uqr!p(LGR?nE-L5`unXBmg%{m4 zMmkV@+(j8oH!RGlQCrbA+B5b%XXp2Je!p|N5G(rJe?NTr^7Q~-`uf;Mab@8Y*2lU8 zY=Y4#iP1=z5=(`Y4y!Cm3XD!sI;J>ZJ{16@iBEQ80}`K{=i%Z6tj0(mPYPmjR}ur!%lKolwReujcg2y{ZpCe*aS8iO+yqZFm?K74@g zq)p9*@-?VOMQ{H=i4!(rTj^wo?*i+M+fJ>qWAn2w{$R4LaJNxZ40Ajx91; z=f;hnP*SpcU=NK@kq%of19T^Q;1#R&=&2xO%3 zTnimruHIDCuP>8C4az0QrpJHd`NC^=zhg`CjgyCtjMG`gko|SK)dS6=_;gi$*h~SSX*r@YSb3 gr12tNb_@UKZ^3G`RJ0Nwc>n+a07*qoM6N<$g0NPwod5s; literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Console_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..efa049df5e81f86d44b1d8a2b5e0a4e03ab29939 GIT binary patch literal 1525 zcmVWFU8GbZ8()Nlj2>E@cM*00mh|L_t(o!_AjJXj@kl z#(ydrWN_gLYLaSs+XokvksMV!amm+s4o}4I! zf|a4z9f})hK^Y86zz_utR))}*!5~2keh|aGpbNLd`!C6M|17=mc)HSi_xsLwzH{zX z0zm(<3BZlr9W9gug?j-~0g>-U<^w>9U@nG!M@b|^<{*^>p!>6(NHR1gEIU3Qe!vGo z!oVlwE-EEVC=ebYsX$5@BQ6v$fb_Er03!rW9SVfUJ_MI8P@q5rTt&eNz@-Y8O#U}; zKgu!SCqy2k@FW7lw*IvTCcG$9N|GA#fHB4cBLuR?B|48b$9N!hra(f))e1l&sQ~E( zATTd2(WT03CoO26v$%JElY95$gofuaa5V&|WW)!qNre&!5&Gan0<|w|eEn6G8y}ZW z1Re&Li~>eUh=BkRRpb-`0Ja^Lq)%k~$8Cz2uONb&k3=ow3IrsCaKU5g5N8vxENkSu zUmk9;e04dLJR0?o0)EuOtBTb5_yB?ALyF*+=vjTB z-?szV0ZJd10^rj1D*>=us-sc+ibPXn7zX`*KQQRuZbZXI8>#1U;NCo)PE&ZVfN7d! zrZTkm+BCjz1mu$deO1&#L2&_!3v;2YgiXfJnNX6)dmY-pZH|~q3`R{@SS(QfsElcv zbe%3zNw$C5Mn+R06l9E6tdZb9qJ(#s!M*i3^N*r7O_Rjk1P50SV!L8MAle$w0!PYI z!N)~CJPgAKFkBDF5ZsZ4u)dLF)3LM&ON+T69a}%tVIk-8uj@)mSxd?*^LqiWr(HY z6kq^HLLrx>n42M$ayP6_rxUBK#`6Yi`)dGHW-Ig$`)-GgHX_T5NC)H* zD2MAGt+gJwml$X*gnJ#maxXE^y7#K5*+8>_F1N~h$KKJ)zbH)H(0bkC$T_0^^Bae>)59HoXQ@d4+(ubT5(WXBIx;2LF*d}locz#R1%Cy;7{++^2)|~$Dnev zNMA}WJh;GWb~P5YKW2;>W^&y`an_AKG2Mt%0Rrjt-96nSQTS}M3M@0l?Q40;3uUUE zDvcKn*9$Xcs(V%JW1ETOL@a8M=$qP8IbP=pfcnOkb`Ok_x6WG>7jt2UR*@~)dwF6q zg*ge$m!oB9Bn|9qHb%-IaW~-t%WfjvOYETOC8kR*0sp@tKx5a^ON+T!I~BwK@sg04 zOp%%dNA_tvcU8zvWhtI7xc literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/ControlLibrary_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/ControlLibrary_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a69b54f02fe7869b698e5ff248fe1f18fee861f9 GIT binary patch literal 853 zcmV-b1FHOqP)WFU8GbZ8()Nlj2>E@cM*00Oy5L_t(I%e9eBXq;6T zg`e-68S^uf^w+ecTBog1FcAzza3e-hNO7U9x^N@zq8k_fphd7QiWU@H2yR`}AOxx? zN+hC=HBdrICAFnRV$w<5G)_vJ$z*2k{qFm|*G0QUw2FHOAoVY;dI zj)h26L&XSQ30??J@a;h61n-2b9q>-@Ug)ltj^zQ+)OGaLh?WB&1SJWIIVEccv>ouR zK(i&ZS{cDZz1?EZVz0{sY|rlJ(ZX{CA25liDk_FzXikw1LlZ?ijov%ESZ=IvN9^Im z#Yyr2+nPf>J9v;7A;ySW#0>6fYdHOA*Z2O=S4^Q!S!L395cKIZ)55LL5 z@(TcbvoygY=`(~NGKo1f;wYK=_n_CtoK(cEZYqU8U)lHy%La(aQqixryA z)79BY&*pw6f2veY&YZ5O7-oj*t+Z&EDWy`Wk^p=*K6PaE`px$tMWFU8GbZ8()Nlj2>E@cM*00u5eL_t(o!|j)Ej9o<; z#(#6}-CbHJ?TS>WHMT6$W`&~G7^C5X#-a@+X{?FWQYD1C)HePrq*zd>mJlVYKuoqx z6ChYXQ~iWQ8oz-t3a(Hn3#GP}Zb}ieWxIdxIrIMU!<>8WEek18;}@OePwzCpsd3=3 zzlQpo8O^@v@Y}LAbJQFaM^%yX9mR>!kf?|lF(yJW8nH-Yg(wo07#)eq`Oho>p#Dy! zGPMM*j;bNzh$<4xzO=w&2^34vLahAFks=Xpw(K2&H#1j9)X?&g=!iHmCL#$q0aZjw zQe9ydQmUb<)!Z`_m^#w)FL?klYGMR&>Y{YLg$HJ9cgq9VOadRBx|YrBKQ}`GcW`$c za04r2qwJew4rXBPRa~zHI_iO17C3n7MHY4~VPaYkh40_l&jD^d^Ab2ExF>KY5wT|M zEpT@ShgvPr*^!Y2sAYk956q&u+1y}w_$aD&W)D=L4n_iRW@&)o>32)C%puF5qn6Rt z5%}BGLA>2dB?}Qn?F6vC@dy z+saNUyElQo)py6t3FYh|1hNpoTmNac?>_w<0Co-y&`}G7K-vkWZ@mk=%D$yU`^3oy zX>A>-hfo$u zQ%B6ulBtTN*o>$553%{HtI0ArJ~hm5UU`&L#V7!4d)9N|S?}ZKwybaH-N??N0d_3! zXM9R&NORtjKoMozd*?mTCV}Cm-~z5-f?F)#1xJT3C(8oAIJ}3xCpMg>-W`A0!DB1; zvGavi);pH>vvX*GTL-uBz02;RqZSZNX9z%6h_-<%?nn^#5M?SNcRqwwVfT1@Ia6|9LL}+KbtRn>U^GJZv}qu$9E%Ud}96;%)Fy5Gkd|YA7Vch7xa5j40 z0_e6Gr(_5avOqm>TGl`KaDNq>Lm`ftV%{<#ZUQFkxNaV6S1!k_DHVu1QJq54>CoAc zanFlgFbuDZA0-gz?10zvVXoeHCEvd6rYh^N^ju$^L_Kqsa&j!)1KPF?vls;|f)$7e zYA`aUygE{F_(X%RZ@UXMXcWrmgz~FL_wmI=>i~G@&>p_^r>`-1^7m~1!v>B`9OLZz z+5GS${gpy_;hgyLB#pu-#BopcgsGRiph(-yH4-JF<}?ap)7IO0{`u#~W28|Si?4c+ zXP({9iPuMXS8XBNm)=>CSoQd4dGf@Q%Zuh{5QD5G9$iR)ZosZZ`1O^Qd7)I0)?a#E|{c3Q=Ok|zmds? zFfncX=a;UAev4*vjTu9X`;nf zJ;=kiEvr1RY3uD=vt~7UjKtDFPYpg>O=#|^ge&VuE1hm`)xI}RV`|>=fQaFm6USZy zpb#UEUafi41MQyBlE8fr@5SB9Y`v_G(v@lERrYwR->fmJqI6_*gnNE_Il1&Q|Gaci zoXG={$n(2L`oq8VRTS={zP0c3)g(Xr`QskNx#^qVAjY(Bqk8!b;N>BbB>qpe83oDu gzRmo<{Wse`0k)>uhh?ln(f|Me07*qoM6N<$g1AUT82|tP literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Database_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Database_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6695cc4e6263f5fa4746366fad5a4955b8a82e27 GIT binary patch literal 905 zcmV;419tq0P)WFU8GbZ8()Nlj2>E@cM*00QkvL_t(I%bk-;h}Cr* z#XtYYHSbji&AC?2U?DSVIy4yMG(`mw1QtOm7C}y%#6=Ing|u-Y5fMZ!QZgueT8&a9 zm6aQNs6h`#t!d21%;Y@s&dj}c?w$L8{eHjix5XsUrl7Mqo5O)~4u_tD5Ac7{aZei_ zK+mE3l(2y~L9Jko!z2!qTGGUl#g;5Fq?b9dFcom7_jfM@2=Wo(m6LdQI1#c;AhX!S zqOrw9hBz`ru^~;A`bC6+3zU_B||{cO6y@`_AlUbH0mW zeI8R|zwqh{PbFbX@!GyhX)!mpzsZVaK0lm(o%WkHVvjnkBshhMq{MsY-saOaFLT#w z53gwfUF*8}`s3c`!b_zJrP3cnjg&Y}kSt?p@+^<8>S62g?d%=f&+?`=wq5@Ot#g)Q z%Aa7O8qs$N63|A6H8+Bw+p0Nv)jD73fuy*Cor{CKB4FG*d^rQD*d2-{q{?CPI73&{<`rq$* f%N?u#^U{9;4*{#u`8c*j00000NkvXXu0mjfWFVZD literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Database_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Database_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..86bff988aecc65ef1190159ff50a1766b15e3e3a GIT binary patch literal 1996 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

pdDEx9Hh=l8G8 I0y-=3AGzXWX#fBK literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library.xcf b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library.xcf new file mode 100644 index 0000000000000000000000000000000000000000..a9eeac22a88b31c7a5c95b8f1a5546f8c98f4b35 GIT binary patch literal 4172 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 a)=KdWP%&x-c=25tp<%@j(e`EoBL4=1piiX$ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Library_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..85ffbc0f7cc341373a3061b45a010d14095bf512 GIT binary patch literal 836 zcmV-K1H1f*P)WFU8GbZ8()Nlj2>E@cM*00O8K9XgdHEsv5hDz>D`U{Zq{Z{zXFk_Z8Ud_pi|3;=;3l@g&nNverk z79FP~iKP`wY$~Y53HhWOfDmAiA?An=G6zQEtiW516asP@=>;y-v~^mvFxWWYj(Wr) z_GP>LbN#-5qm=il_CATdZ#2B0sC)0V_gZ=X)rBEno$&tWUr%^|wzrZoAO(002v9x~ z?Jj)Bi+GeX&rUHj56Vd11{jclHxL9crbf6sSzuZROv)M?E_}wezU_?0pp<=`L3o3;w^xq=;qF*>R_y=2-@8asnHKw=sF!cAAd_I38tpt?L0Bv)77v9XZ*79-RU#wqY zxPIq%dIn~qokTl{vQSkc9DRD2i|Yz>w|5aG4(W8}pc+k5ipnIhMmB3$WqBUmWl#Su zb`G$NtRDS#97{xJ-(Jli_$#pPq&WCj71oM`3Q@d5i%uZRRXLEYx zLFV?X=A*79CWFU8GbZ8()Nlj2>E@cM*00h-ZL_t(o!|j(nXj@kl z$A1p5a0MNnAcF-NqT)am9EgkywIPckLtMJJQ=F-&bZFAa9y1l2E^?PzWQiyQ;tavb z5UdU*&R~!N4OXBK1rqWMHatNL?|~oO1HPaR??dlNN?Ipld*Pz@ao+i#kN-XA2>$D9 zEWW5bSnO#dU{x<3YtPVV)adq#Ft9y$-uJlfp0{T&jC^#Ic)KUsm6yMx$W0`l(o|BP3b<%Sy z?=cKOSs`#oI-})G_M1~D@m@wKkP+aC*O6TPWj%ausYqU*zyR|O&qv4®WoG61#C zT4)@=v1H_|6M+u^U`4r(uG5O^FYDAgYXDp?Eg{h<88p)RAaD!Zz@c%_z!x8Y#fe1< zs>t%wzSq}FOVm1RRHv)>LBBYqYk_s56A($?eZ9eVJJ&KIH`_OPeC2V*>*{osT4#;r zXUnWiR>L&BmxSr2ktSX0y&E_Qcx9r(=H)FG&Mbrt#_w>wv;;tPx|-oYXuLv@44?W2 zNS+%%)$jwMcB{?y!!=fZUX2<`m&UzSuwdimMgm^RFETeiPwi5j%0z{dJwSYJ4c!CCTi2-l;!s)G#y=9~FKAkis%!^B;c^KK z^b$VksMf30iAa0Bax#0gIm(DV!Y- z>nz|Lx#TQ`vcMIG^AA6x{<@y=I$p(3OF(q~;{hg)fEZ{$ZKIC_=fDM^`Nu92_(&jl zhdzZX&~7yu&lma1o@13&HufSe_=?r`Do)^#w{i*dW72w8d;OVV1hFj4Qk^0pLNEfk$xzlAHU)iLw*F>p2Q+Ap8GxLaq14`d(L4twmH%LN}EO1h-kT73> zXaEn-0LFtLl$+C2%uX&MfFDFtlj)ab35I)!FwhG`(sNuqTIoy#w240oS?~ESzBqW# z9ZDA#G9%i^?io*9qf#IO+dC~pG~Qts5oor2M7)rMzQ9Fr{&W!$L_D-FFzM0V7h0`$ zUpXPmWuX5H^3LJK(ps1*m+=CSpaW)?*|PLY?^~OOuPMyL9_7%7d7L8`ji!EY6Og_E zLtRsbKu1L20TO`Qb&)bO+u>v@f#3xK6X3QbihxG@9!!P`w(qZveat^2OAHi?^C8n^ z7cnm9&uO%dqhRykKu{Mz8I1zQO@Zw@E*rnLJ_o%^EJz+L00000NkvXXu0mjf#2Rwm literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Silverlight_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Silverlight_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..acceb5a3bb73de22c472aed88999520442caf55d GIT binary patch literal 879 zcmV-#1CacQP)=+s*wNy03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00PrVL_t(I%Z<=WXk29& z#_|7m=FCjSGovO`3_1}@i(-wYRzh@B34(}11;I*DP{e{31Qj-W8{i&WE{{q3I3fAJWudFj9oHTgc`1hI91*BC160b2|>)eKn`k4ESi333#@ zlhlF{rk|Q&u3e{`FEjq_D4y|nWAt6VjHcHDhcEW$YDK4;H=EIJeZrNsf;{*^6IqrS$tksp2y}=wnowSr#50@|j!BXvB_@<&B(PYLZ&PTERNO zsRH01?N}ymD{-dLiS+DJVtVbizC5}4 z_?z2?ALa&l^|n3s&cyIY5Qay}ml`}hRx{7tTYZ%q^bePnrQ`KBbVvXI002ovPDHLk FV1i}Gm~H?7 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Silverlight_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Silverlight_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b42d12319ca505fb9c276c35d3e0f8067e2b8861 GIT binary patch literal 2018 zcmV<82Oao{P)WFU8GbZ8()Nlj2>E@cM*00%}%L_t(o!>yNHY#h}U z$A9VtWi}K%7ZW7quvWDil%}WL7gH_5HE=HNMqcXOB?g~oYQRVGhG+x**n`` zyby8`Y3)D8QX-;wQM^;U_qhC>Iweg7mwKEN(ljHKrb3!zbBXh~)RU%)OFg~+T6J*( zOM-jJz`f$V;GE*T$ECUM=E2h(D9u3=C;2zUB^hDh(-UY~?iJ@V*L$zHRB=v8(}my} zP@4LTKtAuB;F64p_p&sB>d4jqR}A2UzzN1Fq4Tul=Uxhn%+AexJO;Q(4BSwCkUbB4 z>0_i+K~+&e1tcE}xh{$*h=8chk5vf+OCd4@)^Mc!U#=*wXJ*dx_>cEtKaKm999%PS zB_kq@vCf05YW^Dt14ALSSPOwQbUk0n&l4sl#_(P~nLra%LCC-xRtg~GfRfQ_SRGhH z6k3V}%Za%o8KZnZ$y49UClHu-`$t@#>oi@?0{3SR#t>Loo?G3hHqQ?~OBh;O3L)bC z(gZZOHY3ph)_GkO$rMx-V+__BtN~*(_PSuNM-P7&fWe^wqR>$%|1%P|5zK_d`SMlhfd8>DA+|A(708eh+$4t#rsnqaG5oiE4&t4aLC7ZLx5Cn$b z9NW*Xzdy8S{g2*$lHY&%&-{FW)j!;}kHMh0CH(pg|YVJ=Zl*M#wz znBy1bI1?+eZ=5-dSI3&*_g!;8zuxfzcdx!1fT5}P*tKzYMrhkU9)D}^d<;Z}C<>PL zKrMEhm`OO7S}KXBnktdC6lw{Vm!QA1K*1PZ89Uen|LM)o;JtEl-)(djzQ?An>-pCD zZ!eK!rVwd)ohdvoui7y$TY|4!}(NrJlry<{lWC zjyvBu7pr*X&c2B5VmMzqbiRnFX6d&5vXB+UfHcq3<1?ceV`zyiA0{W+_Rl6;G4QOvt#8~h*Kp_l*w<*QBQ=_DN{39+=yfym8cTdQ(>m& zxof%dhf~VyRnKM13iP%FERPJKfr2%hi-n`p38l!=-xjc;J*1Kf6UNdTUCDRWe;);$ zSIV=F)MbUt8bjiQnVMv`XXL!m%2ok{hj*zZ`Wm%A&b=@l`XC13r zL$2!xDFueJu`*iqR3+ucwtzk{C`#&-Bo(}5mNu_$Ra8u-=N++%5{}I{>T|;6tZ;3I zWnCelXrR@_gkq>A$~zU$`B>>MS>o6+9xEs6Sx?tjFr2+G&9Nh+h-%it<^7|GWRGV3 zV?!6onp;&NoJ@ox0#_{$IXvswR8Za=JI{uq!x;D=wj7TwD+@w7QI0xzziKF2!!2!& z()c(}|MJD`OhudZ0L{jdU)Sio-smv^%+KDvpf%uYYdSbn_dIu`LT_YP-BTj6aA>kd zp*3W4cagKP=N}WZv_>I2uj$~6J&|d#hR-75ilSk-oKkbbWu<^EeI*W#R5)6R@do0$ zvZl3z!&5Pbj-De5ERWo@k}q_Bc5ncD+p0Fx78w3EK1-X0p0DSg z)%eRlN3i8GJ3rscj=q9v4Y(v?SGGmmenpAX<(S_cs}P7#5J%NJB5SFgp5ny2qikpq z_S~_ayH~ZE&d^|uxg-QkAgu#oi4Nb${xPDc?CE0wVIw%$fcJ50SVP;&L?ph5C8xG07*qoM6N<$f=AiK AE&u=k literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Test_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Test_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6e28270552bd4d64f1f204d2246bf50b1b35c391 GIT binary patch literal 901 zcmV;01A6?4P)WFU8GbZ8()Nlj2>E@cM*00QYrL_t(I%Z-s;Xw`KX z$3Or7`Jc_Rm}i6ag3xs4keb#K+C@;A;zgs3CQOQ=@}fJtkg<{zxF9J(EQ*B{5hQex z3C5x~P9h{uuq(H-nrpP<=3#SnUUts@FTb~^i`i8qeQq9j`0{}*LPScj}7zqGekWjhaf-{2C4y_C-7IX|rB&f)tVxK#*8+r2HeN@{+ z>}-nbUJ(G^9vwR(|ABQPN{b{)%fYT z_EPvBtj31?wIBGdIL7$WI5vVrMfkJVRtEa+?|J-2Ic9#bL9w*LT&d37!XnCrJbP{* zePBGpFBY}-9~@sQ!LeL7^?|xOBc>Ox_wqWcLACcNQI=OM*jB~$juyN)B4Q} zKagXz@E&_NK7#(+4D57-aW*Jr4!^X5AjCtTQu}4M)`F4k5G!2 zFvb$-I7U(efKL-MO0<{mnJV#Z`Avaem3&X b|Iz;qmvqsk5I**v00000NkvXXu0mjftL~Qz literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Test_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Images/Test_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..8449ce8be20037038e4067a033ac7407133449ad GIT binary patch literal 2017 zcmV<72Oju|P)WFU8GbZ8()Nlj2>E@cM*00%`$L_t(o!_Aj}kd{>y z$3M@*yDQ7DRVqg`kRL1JLMW&M=;%1kSZPkpFvUa^)0B!^8i<*}Skr_~I<~3N%z_M} z2&I)x3duAz8Ki<~K+du`uxzklvcj_a?(X~JdG0;u^v8YPcb5t=ZKj@?XYP;pdGGg} z@A=+y&xQZ-6Pa0c@Wp37Ya)uNVNMZM%p2+z6-B+Em2qXxRpzrfZ(%H}X|1XuYKS*P1fR9e8_p@-3EnHt1%sSZTpH$5FAR@I&@<47cfyDE zoC`qi-BP8Z0bC3b#e2hx;9b`DgW%ycoEL`2BbhpG24iZ+QkNS=$FX*{@83~f_gxuK z^;`@ufqD_cJHva!xuM`1z@6Z{Fmv1t=8eCGNn;!6Dj&n8!ibtbo!Wq6$CUS^0lYHI zE0H(qYwEb*!&4bkSI@}8NTv>(&L_5ik_|K0Gq!6iFBqrkzfjjVSrY~W~hN?eN%vlIEMNSb>V;6T95BvM=p-&J<)}T za#{nbpax0+R|Pdg0VS*+0dWjb6os$smo@W& zjU!mn*u=L#@*r;N4XeeKtoan?+}d|@zP5XTX4|XWQ&h{~;nGYH|@rlfNF{QLqm`W%{d7QL&5x zFCY#yC3QZ~uMt<=v7fZq%NfJlx%m3$S$5@Jl&nZksfVH!sQX|YFLgY}q{&OUZQ6>e zPVxhS7sU+XSTnDEI7`$JBm2D?0s&32ECiB?Y;i620BH`m}?rJA3 z^)UMe;o%p)&-^)`sT$Ceo*k9n(jgttm>@^<+sdtceZh38y^Bp#`P580|Z zc$8P_1g#jDRo(zO?-i2-*LO5jvucRKM^|)^mU@|SjZltD%$+co9WQQY^vqFoyxzf- z^BU;0JU$h6@7|4CP`73Eqh?B1(~Q;7R}IB&RRi6<-8{1GViMoT)QKLSg<$KdNvIgh zpB1|LyYO|w_;C|xf4Q9r6VE3vd5W%pB%TdV{R~yhl2@o=LM{n&*kC`@7=sl{?(QY? zqsrj%XZ~Q4F;GcHJ`q|EzD`Yjj#6z2Nj!a;r%)*3@+nag^ZTDZ9KEMoQS{i!1&Q~H z7wGIN&rIprdhVD^=11{{&%YP|Kj-vL_?o4R&d>J00000NkvXXu0mjf0NKv4 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Silverlight.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Silverlight.xml new file mode 100644 index 00000000..1b8d64ae --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Silverlight.xml @@ -0,0 +1,20 @@ + + + + + + + Silverlight Application + SilverlightApplication + + + Software Development + Common Language Runtime + C# + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Windows Forms Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Windows Forms Application.xml new file mode 100644 index 00000000..6a1a5c12 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/CSharp/Windows Forms Application.xml @@ -0,0 +1,154 @@ + + + + + + + Windows Forms Application + WindowsFormsApplication + + + Software Development + Common Language Runtime + C# + + + + + + + + + + + + + + + + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new $(Project.MainFormName)()); + } + } +} +]]> + + + + + + + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + ///

+ /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "$(Project.MainFormName)"; + } + + #endregion + } +} + +]]> + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Console Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Console Application.xml new file mode 100644 index 00000000..b79274ec --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Console Application.xml @@ -0,0 +1,84 @@ + + + + + + + Console Application + ConsoleApplication + + + Software Development + Common Language Runtime + IronPython + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..181e9de3ba64f49fad62cba43308988dddcaabe7 GIT binary patch literal 796 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 IM6N<$f{@rX82|tP literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Blank_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Blank_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a7852adc73c2ad5786bc70750910f9bc7accd074 GIT binary patch literal 1404 zcmV-?1%vvDP)WFU8GbZ8()Nlj2>E@cM*00iJkL_t(o!|j$ah+S0> zhQB%YzTG7Vf;J0+1|f}2Op2(@ZV<5&l0svl2*ysxE~FE&(P$wOOoVhcc1fp=g(4fZ z3K~oZC@zv{LR>YHjl0Rdd+#~(Tbz5}eY?qvrA-c8-t3uk=FH6h&&SV`o8A*_2L_w4h$-hnaxe+mHHyS}BqxR75F*?&I(5Sx~1t0veVgTj1HxDho3n`)$ zQ4>*JL99_#;c*C6g{loy5AiWs)etomsw-62(9|f_5VNhV>%FV9BRPyDjr}Nph9QJ( zEL8@=`U{<=J#XFR{>E*~#T^_l>kS%U${#jnYU|&&8AoM(=b$DykS1}!WhCx^y`WJb z3hFTq#1{L!7g{bDQARzwV?>9B&R*ujiNCIHPSHo7e6Bk!cPS-TOs=MJRkdqaCEco$ z)`v-Jx1w&`jJm!S_4hxGuC3Pk^Lnk-^+p?2Qr)=fpD*b8TGYjrp_Z>~=%qtPbUOrh zSOO#=fjlQwEr#-}bAh)qfJ^ zIP)db17l`7kW#|$mH}6jsAe=k~KzZzN3kk&N zB=75>ydCrYvA!^cf)On51GpQ>ovG3Y!I&zII`*#HnJ*}h9R{FTJW5QWX+(6#eNqNm zoJL08eihpju(PLgYcM0cyqn^Qg0OOlVEOU#$%69rrx_GRF&1@PJeuqNzyj+V&f3sP z(MgjWaJBe%q?y~76-%GyKDBloTRw;8_TjVJ^O-G^rT8#M9T$%h4=eysoI1|7nZUN` zKumr&4rClXwT|rFpLfqLWiFgu%8A-NM{Jz9@)bYRq#i`=}42~UUP#9&%uuaT> zJeQcpYFqRBVEG*UehEAMSw1(vpP1VIu%&v^i+$9CjspuvsiUZ)aurO3fWEX+*MN4- z30RmIHg9VWVE58$qr~!hf_{-2gAwZu<|QD zx1Z!<`ux|-Ts+U#i8CH`#{s&aT(~D(6CKc~^?J$|nB9(c?8KJOjqopmQM_}I^2kB7 zzM3!JcR%jAy5yVs$N&9Aa`b20^(Mf~0=RDLFI$K)X`~TK;O1eH_o*i4axh-nv&z1kb$ldx#wx;f~IoH2o{VOMT|}r zMOhfZoH9Tip^8r3IG&&^VOWdR^+@Wbsdq$7xKDzheN@_95yK{r-sIq(&kU1ij&vis z)eY;I&$RoJkXw63cyct!0e86Y<1e{ewe=cX(j?^;nmbw6bp~_EX2ZSCarJgwc`tX+ z2^=`|=KEupX^m&nxVMj}f4tkza_${;du{Znm%INl?yY-keEka(d3`h=APbWK0000< KMNUMnLSTZ(J(KSM literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Console_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Console_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1352e2429b06a7b4b6d9b27a23ba15dc1706fe GIT binary patch literal 904 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Library_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Images/Library_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc04de0cd26ffa557fba3a7cd4344378b3b0395 GIT binary patch literal 1831 zcmV+?2iW+DP)WFU8GbZ8()Nlj2>E@cM*00xUmL_t(o!|j(_jFndv z$A8~&m>X?pD8o%Fw1EIc(rIa;m{6>~*uB)Y<1H~7sakEK<-rH~ zQjOTumbBQWDVLUubf7b+AVRqe;|$DXn9DieW$(S#@?n4HoEc_F8XKSVOV0Un&bRko z|NUR<|6luq|Me>YNYfO6-@WxE6H!!^;1yLPco0z}C?N^=Z0AC@W+i_DlIVgv(Ez^PJr!w10!rSK6*<_s4C&MQSQ zT!{a9ujHY*Zp()WuF9<7B8s;dIQNDtgBD)Nyis$8^8xP_AB@5WpcC&E=OMV}+H)8< ze0k%4u?ChmY5;UDfa>_y*!A>d7=~GbnPEoxG1Nd5Fc3A&6tM)%P%}h9q+D8?V}d5A z#w?CZ5QJK87|k(;p(Q{fZp`4u$W>Hz z{uEgGWtNmo%w!?5(vrZ!$}|%b{f&98t=+6x(u)hm_3;8rz!bEcSKoOZY>?Xkm=l~j z3t(y}(6+FJiHUxWoOo*1)b6fc9{KbiNm@EFuZYfO&@?JZBw#A@tH3an`j(r)0W^uZ zwR)a_Wj&9w{qZsGS@{GLll@$}`T`$Y(n?2bOJi==q6I8lTwzg1f&!uRk=x6#oLHx< z?gJ(uGlI|F{e!WPYnK=uJH(wG!z^FCkoBKvr>%09P#k6HT{pP1qe3uk)W947IxFW* z>g%$xl9`5b(o3AX@GH(=d=7xN*2Nq-@f3Xn-{P)C3n<(KM~-jj#HpQBDqZ9*N?OVk z%%g&&&VCF|%)41jS=qDV6Z{l6#tyTr=MnB(wS(@iUIvH%#Er3oTpNCcYV9)4-(=H< z@6y)VP41=%B8b@S09Ye9l$Bf8bopCtcHwQ?vJZgCs;5$^@WB1w<9Od!894g`()0@5 zUA=5r`wjm3K@}|}sy1H=vM#>;!{0D5mGQ!!Q@s7^v+VxaPs#F}_GFls_k5EDNy5OX zlXGg|gW;UfN#Wv9&OIxiU|G+jr0Ep^9)95G)N-W=L}Lnq$}K8*ao=S-f9*YX?R=8g zUOLB`d*9{H{S|h6Wd|#I7V+ZqKcQ{oCZ75Jv#eb4ah5OrEZZL+W80Q}R8uYcMPz8I z>RG>LS3@O>yLvfyB}Gl6CunreMhXtTZMJgBYVP>tm-+QCud?&W!%R+QJhq|A$^E-I zlscAvZWCEGW7XD_mkvKie!$^2oJP;A=IQNwqSX?O%IiGBYWPcnsx(qiiQP`=?7V~a z_D$-Si(ZJxz{hS3>_pW0#peFq7;u{Q31-$c^)@@eHnn~tSwl*A5RMD9# zC<>u};1soL&d|^>BF6Ez`p9Z2S(-C3GC|K5l{3fsD6*71%Nf6UoytZcfW#WMs|rJ7 zj^4E~MF3-y9<`Q+t&1pS{0Jb=0-xEk8GzRhoFRluY}vLRvp^!AYXddT1Y`ZDHlPTm zfeTjxgHt1f;BWDbDAZFIYG8^=QW{#_*5irDW-^fF%@cyC;k`h}NX%iODD@r?Ef4}? zMPt18AvPMNv~bD}sHi3wTJFB-t|HoyatR=wk-UqC4Cg)OYnVEa7|c13w-iy2Faxj) zP5NhAI7uV#b!XGk!qft)GgOeJf&?Yc1ESzufG`a@g8>(CR*L{;Fd!k$spsEH12e5N zQ17gzn;WRyBEzEaymRy@X|-T%bOh%D$BvJarzu%AWpX0L9uh9U_b-YpBhON5lT|7k zK}0xx`ZQ`9`-oa}I*koSRN^T~6+_VSIWuLLrk>54A7*;mF4^8;*sr~nnz!}alQ z-k9|CY-vGlAwkc`v+$SqjjZO$YB`hD6kX>T?Jvl(Dp{6MOnE9B<0AX_{y6zh-ikUqe;WaWpsZQ* zd4f~2{C%7sV(tAI-o-a2_1(NWtaPmMv + + + + + + Native Application + NativeApplication + + + Software Development + Python + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Windows Forms Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Windows Forms Application.xml new file mode 100644 index 00000000..873971a3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/IronPython/Windows Forms Application.xml @@ -0,0 +1,24 @@ + + + + + + + Windows Forms Application + WindowsFormsApplication + + + Software Development + Common Language Runtime + IronPython + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Console Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Console Application.xml new file mode 100644 index 00000000..abc2a1ca --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Console Application.xml @@ -0,0 +1,84 @@ + + + + + + + Console Application + ConsoleApplication + + + Software Development + Common Language Runtime + J# + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..545e52a83071ea382975b1e84d08d95cfab00db1 GIT binary patch literal 851 zcmV-Z1FZasP)WFU8GbZ8()Nlj2>E@cM*00Os3L_t(I%cYY`Xk2v^ z#((#J@6E%`#25`R4H^X(R;Y`Df%<@ew&_DDA`P`_-Rhz~Rvi$rw2O+U*sY?Af{zy5 z6p>b~ii)CLsWh!R)HGv4Lfa%Wlezc*J}yRFcGGY5gYzxU`3@gkrxJkKdpL6ALtARW z8oYHlWAWBtjKyk$HMYyvW1Yvv1OZMptFLDOu|yAUeS)~Uj1+C8(pDUVPk?8g$@cU2}xxDdu54s zK8Tz;O$PAmrrqp({&7S=Li#%@@7C8OuHy@<8+ocWkk3Ep|Kf9C7blddv%>3jMI?x6bVF^Zkj_}N8nG0UjQ zUG%VP8b@mKMq^K`~HwC+>aj$;JrP(z~8}U96B$7!e@m6C!gdikJF>_&o zToNwS8{Gc;D4jy%L&UjAhym|~PN&`7;N&mWgOzn7ljHZs$>$y&!G=+shr)Qy{rMOB zYp>K0)fXiYLPTOD#7K;hN@d-*3Ba50ojh{e*!tRXQ=_d#8;dcXxyD64c;kiSy6U=P d-+^n+{{SP)WFU8GbZ8()Nlj2>E@cM*00w+XL_t(o!|j(*j8#V& z$A5Fqxx2TB-2w$6#Oy+`8d?luVo{WB8qmHNh+1r-PsV6s;$qOGsXm#szEsz4P4q>L z^+B_ZCdP*nwW%mHQ4H3Swkk_(DHOJp?cQZCd+(W<@B4h1bI-lIr8TjSI?3eBnK?7_ z|9{{A`(_UOuNP-#^~?EPjrv7#s5!(y%n=QuIU?y9dQ}|}hgU~12RwCMb_(70}NyI|Lday{Um#9#sW3LjlFoxF%R?P~?u`AxE>3(Y)}FS_5f3Svp2R zDivmLy17}+*tB9@wW(OEQCmO_Tn3p-tZg8&vXf6R+;B99GeiV^GYi-X{W_Nx#=tp8 zoBQFJgdiVVC_GjVB3aEY*;%& z_Ss$JcjRQVFOs>md9gdE_|jc8az{SEIv$=(aerunc1Kz4DiRf`0Yn)vnP4V3iy&=G z7T_ayr?EdACCgUhuC;J8&tQ8Gpc}`Mu$Cn=$RAFu3;^`~cb6)2wP; zV)##wrv>+alDYY-RH45tdgRl6){UM9CMNOG@X=Bf^Z=AWYSRz8qnBU+Y}a^doH~X( zbqqF*;@6Kd)F@JPEI-T0ru(eJM5Tcb?4wgE3)dndwp@g!F-TUC&b7_>_fPmoJmY`!gAxN6*V|BuKrh-!38!$&2=3_DS=4$75CThXP&V18rr$S&aF4F{-%Pt))Eihe-D@EJtzM1EVpfc zFGU7ELKzhw6cs26=z62ou1F0WXrh8vAyz~Y(12MS87WTJ5QH~xk1vJUac0img@2E8SvL`xg+b-|pQpdZoDUi=U`3v_JXfag)jd zbuyBaJW?OEOVl8W@Y|n#$NkrTMec_z`!R`8i2^UZ(j{sVji@1JRhv3bs2L%~xBP3i z48UA#jz_0|MTi0KBOwHQ41|!X4=GfA5Ml_32>&l{wfq}T$8ZPJ<@sR%0000WFU8GbZ8()Nlj2>E@cM*00KHmL_t(I%cYacOO#<0 z#(&>C7Y8e&ZLPY{!c8tBO3|WwgjrOJ2wJtU)@}L=Y8NFfT@*wRLPU$8i;J{^3N(Z+ z6d6Q`X3jXyeDl4xb6RMr+kD{Rz*#&zhaU%4s083!D_5c=^MF-oC^Sf@Yo3%mHOW!e z0yQzzW1hMgB9v}SOygvC3CKm63C5>@r8nyG4C zRjZ;pC-XafHlQ<6_4=JB3Sa<|w2CT3QG8IGi`Y!CX(X$9d@WFV^%#jD_xlMcl&2;E z$p3AjD2Yih2E;+JWN?j0v86!pkh~qld>kQpH$>Aau-5ahfdV25qc1S$c3_G*3atsb zVvgdqOOyuhVFqrZtJfl3JvWam>|=!~czGgt+J^#2AS&5*Ft4OnIJv-|a{L{fXO;oM*-Q1CBq3yQc>vX8-^I07*qo IM6N<$f{@rX82|tP literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Blank_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Blank_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a7852adc73c2ad5786bc70750910f9bc7accd074 GIT binary patch literal 1404 zcmV-?1%vvDP)WFU8GbZ8()Nlj2>E@cM*00iJkL_t(o!|j$ah+S0> zhQB%YzTG7Vf;J0+1|f}2Op2(@ZV<5&l0svl2*ysxE~FE&(P$wOOoVhcc1fp=g(4fZ z3K~oZC@zv{LR>YHjl0Rdd+#~(Tbz5}eY?qvrA-c8-t3uk=FH6h&&SV`o8A*_2L_w4h$-hnaxe+mHHyS}BqxR75F*?&I(5Sx~1t0veVgTj1HxDho3n`)$ zQ4>*JL99_#;c*C6g{loy5AiWs)etomsw-62(9|f_5VNhV>%FV9BRPyDjr}Nph9QJ( zEL8@=`U{<=J#XFR{>E*~#T^_l>kS%U${#jnYU|&&8AoM(=b$DykS1}!WhCx^y`WJb z3hFTq#1{L!7g{bDQARzwV?>9B&R*ujiNCIHPSHo7e6Bk!cPS-TOs=MJRkdqaCEco$ z)`v-Jx1w&`jJm!S_4hxGuC3Pk^Lnk-^+p?2Qr)=fpD*b8TGYjrp_Z>~=%qtPbUOrh zSOO#=fjlQwEr#-}bAh)qfJ^ zIP)db17l`7kW#|$mH}6jsAe=k~KzZzN3kk&N zB=75>ydCrYvA!^cf)On51GpQ>ovG3Y!I&zII`*#HnJ*}h9R{FTJW5QWX+(6#eNqNm zoJL08eihpju(PLgYcM0cyqn^Qg0OOlVEOU#$%69rrx_GRF&1@PJeuqNzyj+V&f3sP z(MgjWaJBe%q?y~76-%GyKDBloTRw;8_TjVJ^O-G^rT8#M9T$%h4=eysoI1|7nZUN` zKumr&4rClXwT|rFpLfqLWiFgu%8A-NM{Jz9@)bYRq#i`=}42~UUP#9&%uuaT> zJeQcpYFqRBVEG*UehEAMSw1(vpP1VIu%&v^i+$9CjspuvsiUZ)aurO3fWEX+*MN4- z30RmIHg9VWVE58$qr~!hf_{-2gAwZu<|QD zx1Z!<`ux|-Ts+U#i8CH`#{s&aT(~D(6CKc~^?J$|nB9(c?8KJOjqopmQM_}I^2kB7 zzM3!JcR%jAy5yVs$N&9Aa`b20^(Mf~0=RDLFI$K)X`~TK;O1eH_o*i4axh-nv&z1kb$ldx#wx;f~IoH2o{VOMT|}r zMOhfZoH9Tip^8r3IG&&^VOWdR^+@Wbsdq$7xKDzheN@_95yK{r-sIq(&kU1ij&vis z)eY;I&$RoJkXw63cyct!0e86Y<1e{ewe=cX(j?^;nmbw6bp~_EX2ZSCarJgwc`tX+ z2^=`|=KEupX^m&nxVMj}f4tkza_${;du{Znm%INl?yY-keEka(d3`h=APbWK0000< KMNUMnLSTZ(J(KSM literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Console_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Console_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5c18028bb9acb127ba4918b2b7f8d219bf3e94 GIT binary patch literal 969 zcmV;)12+7LP)WFU8GbZ8()Nlj2>E@cM*00S*aL_t(I%T>}}Xw_vL z$MN@b&Ts$DjBRJml!1s#+2+`?+8-%&3Ly(BQ|OOGHxVI0QAB?T+z6`Ogd|ZE-E2f% z)zvCTOqzl@H_6%`ylBo@nAY0a&iVa*=lMR*^ZPwr2w9)|_v`AT0Is$(SigT@C=tPl z!5V`T!H8hAMzmnWV2#Dt1e<~f#tL;q0YF-Yx&x1ruC3zZ5 zc<;_zz^@NH!|5CAy!QH=jE|3#$te1I`xqS^Ax%@9b69H;W3XZnqlu%4n)cpX0DyCj zD2iBEn5SGW)7jZY6oq870md4PSd0-w1g(WQim)!Z4dik;W@cvS=;$Dq%P}|m3(h52 z>o8)F|HLAiIF50NBlzw5%D(06aeumZ0FNT;Qp7mcB*j{TwGI)3h(?PbS|ehJq6lXb zf?|~I@7X!o-?JluL?F?S#GJWQ%MaiFNhVu~bq=ldzev6zPj7Dz8}6(pD1~LzCdbY4 zQ7S7u&L`N^)6(Ji`kUu?@s(FuxHyRsjTlQ?TN}sU9cIt!WyXRQGR0URHDt1mrhFA! znsRL2QcLsZIua@={Jlb{RARNTMr&&u-@Wq&dvbSCmSB3qGdrc2o8sDsLA;YGxLo>s0Ee8#Mfq5Aua8*t9~SUl^I<>#ON zK<$4F-a7`rFTQlJxiXK%6I8^+VIN6?I&hf(?aa&-zpyNR_KNuVW$}LEE1$OGz4u%F zK(qI|ne-nYAM!_9&w1~Md^3Cf;{5F=PMrO5I1EcVj3Uz1G5Eq$G!Go|S4(F5wzobV r=F1P1I`;OE@5!E5N}U3rWf%Vd?9uQ##c>hw00000NkvXXu0mjf#O}ja literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Console_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Console_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5bec4ec1ae08ff1a003a83bb4c5467986db8a76e GIT binary patch literal 1874 zcmV-Y2d(&tP)+~fAq4;c03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00y>6L_t(o!_AjnjFv|g z$A9zgQkRMfEYQNj?iTu?QX=A#ZbF(}j3~QFg&Pu~iAtj(df~blds8fyq~2&i(!_WL zF`80>iBh7(lmuus#UR)kKN6I>?6&(MZdqvx?>lqO94}_x_kErP+QchQGMSHOX3qbd z^FK55H~=#PU~Ju-)BqxmXbv?{bBKYMLr8U~m*@~2K01OyFo%zoJVs+qunNJNYsKIP zQ|Jqs_`})D9GNu-(}yvXL#a?op)3WWW~usiJBCP z5=00=2oeY(7j6@8#B!k&#Bb4&>OeV+;%oVrEUnl1q?sk${Adl=^`8(rCx` z^8i41clRx0Cr|#GZQHgHRg=5xAT%Hv2r769*>b^4(F*~ey`fRx8^E4DPx18AdmFA# zwGlNf6pctGl}JE?Albrt>_hMb@9{q1gHQbs2;LK8@<8jI0E~~1H{1@ebLW?dF%mVh zMUXo2nr(raaF1EHR=n^4s&T^M_N<7f2|LT2xawv~0QN zZ<5c0k_UVcI_AGzNbHD31rsoZC|C@+_MCn7-bT7L0c6Xw#iE+BK$?e;s-mJSSh%pv z0WVrmu9!uf31$j0WaSBfyZJ7XbG)f2S*)Sy`clkQX) z-n!BBKnP7&`yj09T2i{AV=hKaZB2J#jKvv|>> zq-mYbaa3IL#?4w}$$|=> z-_#5AGB!4bh%{VYtyVdA?p(=g_7A7_?gLCrO*cajL_q^Yj}Q5@Q^$tkztj7*^L*#W zf8y=`RH^LS3F|Ag{P8TUEsl9}Tj23e!ukp;T9nnRSJTa4||AR-rah|@fpW55{(UkiyK64*Y4K;AiG5>=tFmEdy*bOfngo!Kgg_KTQIAeThK0LU#3}!Y5 z_7B_bpVYY={`t!`Fa=8S&|bm+QoAkgq7`W2t}3i)eagnx7o~WqQB+bju6ND_;3=$N!`J7Xo||Qtc{N1poj5 M07*qoM6N<$f<3Hv-v9sr literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/ControlLibrary_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/ControlLibrary_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..26dc25682d0059690f6a9d0a7db3c9bd8ec212e6 GIT binary patch literal 850 zcmV-Y1FigtP)WFU8GbZ8()Nlj2>E@cM*00Op2L_t(I%e9a@Xx()j z#XtX79_>xNjfUbasQ4HfiP(z4CA47M6da_4M(yYlM1+QGV;Y!MM%+}uoK+M$b& zw3>LKpoU^JskKr=5=pg9X&$}L-~adcejToZyLgs!IB?*c1OE{bz;Z9A?;AMqR5yQk<(WC&sKK}~cf31)Q@S0%T?#FibV7A9ti7*;tLX6djsIU!tca>^Z zL?!V9k*Mio?*Ac_chX=xuIjUY>u_K%LyeDebq{;Y6zVU_sbho~x|t*~gz z6KQc)NNF2AidswC)Hq43c;|^1S2jocpL%lN>YAZyBa%%A{==Znj9e*YymA06PICHMnJNWT7zeMjgpt9mR2o8fc95R;4&!${M^qjs>)VaSG0CNKg#LrjQ^IvWNONfs zA3U+mo0N(xkl3p-UosTskIHn=RDo} z2(t@&Da5xBpD{E0J9loaa`mSbTo8N^oD+fsyjSY=YOBGGn=#fzM6-)5|5m1MES()4 zbQMc{HT7-z^30X8_ljsB1VKdzB8Uiu!q##G@bTEC(YtG#ry#+4#Ro+sV)EjJGxO79 cZ}WfRZ>RN^;YBE65C8xG07*qoM6N<$f(R;xv;Y7A literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/ControlLibrary_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/ControlLibrary_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b1b86314f7235d5aad9c246242ae3284ad2570 GIT binary patch literal 1806 zcmV+p2l4ocP)WFU8GbZ8()Nlj2>E@cM*00weNL_t(o!|j(_jFndv z$AA0#zB4mY$|ZnB(1KVZ8liSDs4+sLP;E_H@q+adHSwX*$Pm$_=>wXyYGR6n!Rk{@ zOtp!S^vN`BQ)6gLFV=v9qQwD*mXUIqVeWIzxA)p>`LMrp&dfmTgT@zK$(OUQYya0; z|F!l$@V_q3%vznZ-L+Onai}?>K{SULh&hDx8=9Xw1cz5gFbL-GnpI=8)&$E4*4`@y zyDyw~#cV{&cl-dNU{SCjm@h#*R+gwVpe(Vnj`;>Ut!-rk3nk`D%zFqP6AzMf&6XdY zTM9rnW7MYoSo$0e!!QS~6nS%PKB7#2mi0#~})VroP07pItiVFtgV8 zlZPL-tBI;vjA|0qLQpHcTBD3MRYsd=L>r$H8=Vvz9v2%L3pP07?c%Vvk%?gSGMW!+ z{_lUW;c>D4^9}18sM{B}f8VYQ!Bxbd0tlwbsaD0%G|j1jR&5MwMMhU=MxHtH%u)Mb z-sYFW*|TSeQTdkuT8A2F6;V}CGZauP&1-_C21V}Z>~M6|GP(v{ZgC*ZCr^t+V#UJj z4G%YKS!`NaUA3vKR-@$sHEo6$#dNB=4W}^yx((8?G^HyHv`c1{G%*e za2Yo-it9UyZM+j*x-t=KMlpkYZ?al;>_N8m0FWQp$DFQ=Ih`32wao!9ahm@lW)WwC z#t}?Lu#LASy+@wMW!F$Ub|@|F-bhqyg{w_oYgsMZddLs#1EAKslUnX5vJ|$a2MX_{ zb@;lw7ti3smiNu&u3K`}uKxrJ4nM~67YA8(@Cg8pFZn2Mk5zq`l|AuuJ&AM&_EBqc zpl1(W3@?_lpc#S?1T2CkAgkZGij_C4Wa)|(Ot^WBG;-?i*#yA+lP_@XiRbW(ucx+Z zemgs6-eqL_+g693iUS)qQ!ka#Ng+mS11LjmxgMbJ#A(i)Jj1CI{XG4LehweI#NgVG z0kGt;2k97mm6027-Wno_RTyOX$Ka|@fU zd^a){2m*0>8ipXC0n{TRM1`TT$hjfUsn;6peP};XL2pW7&^hyv58uh~=s4DWGp_F_ zowqDXb2n`wL_hV!QG0I?!j3)yn zD%K1^kO;BzKnO@Q%AkCH>m7_w)_HZ{B2x{eSo1E1e)Jn&8F-Clb>+{0JH_oE-%Q87 zKPSsT)M%837bQrB9jdGj%HU`qYWrr5QPJuhQiKpeJ*EK>LBzO!_g+dL2ww0Kxaa;K zvts#m%$qxhp^;HOz4fg;{o(FjEW4R4H02(fvaYLkc&)n*7p zF!eYUVvI;Mc7N|XOg4mxy7IujeOL6yCR4^VyrN3th*ej$8VxU~wy$n8!_-x442_C4 z0Z5FX0j=slsEWm^+aKnUUF#@An8ArM1VTli!+$*5QmAG`O^Q>hC8n!sEAQ3PSgN2E z2SgN$fiQL+po*LEt6l3DpR5zS%-}@usgMBt;@6L2rj@l;y^hi=Mz#F_!P@QS8>1=3 z(8v(IkFO=j8Wt}Ce-#eQ?n?sClaD;${;hvS?jeeM?*3Fu$%DUq!h#sz-rhq9iWf_H wEvYa`OqHzpocd456%UfHe7%SN%YRe;3C!~}9~WS93jhEB07*qoM6N<$g5$VN*8l(j literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Library_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Library_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1443f70f62471e2fe2efa0cb9ae61cb94726a7 GIT binary patch literal 845 zcmV-T1G4;yP)WFU8GbZ8()Nlj2>E@cM*00OZ|L_t(I%e9bAXk2v^ z#eeT(W*R%GlZ1kbGz;rO1u+qWC_+UW8@f?Sf-Sgk=|WIkD2TWawF?p5+g;Px7HVv3 zKhic9>7v9z3?9q04zVv*AKt4 z`xB=NtTvcJV|77MXtXNOh3;x?(Z*sVzys%6y$53e$x*e@eaO8HeAdQyT1a{iNfRVZ z@aYC@rbwpnDkJcoEg>AeTT?N>;%ocqzq3l=!1@SX9zgeRNA-nh2~a*nxe)CGg6cN( zdXsjkhCg?n7+`*QoW1Y8h43-JeBW1ApiJV>bFyl)SHC=eu(!T z@!hcat|!vvQZ=Uh`2oDvlrK#Yg&u3{g98WyqRDTFTtRtho}R0xsZ?WXQ(qC}n(+5a zgtNy{yC%q#!#LAD0lI5KfYmzT)$?%q1hV&C0w6r}1<~MBxYs8DsLURPoo`_7H;}w% z?99bKIrPI})T`qZGgAb=PSY8FiKX>b0POB@q6#dI5 zTsY3?t`6BFJLvmp8hPdg^z2~*+-dOl z#!uKVVXbqW#>&q;JM<>j3C0Lc9M*a|op!fDk|@fRoUD^matU#uC`^t#loFLA|J#)d zb4N}toE7hIPVgc)5k!P)b?fC=sbWjo>P2O3R+^SuH&XJ7A-TOt<9hMO^yJKo{Ga#- Xn`M;FILGvz00000NkvXXu0mjfyK#V{ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Library_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Images/Library_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..86925d5329b4d19e4480d66838c5326b207455bb GIT binary patch literal 1866 zcmV-Q2etT#P)WFU8GbZ8()Nlj2>E@cM*00yo}L_t(o!|j(_Y+P3r zhQEF0j5CZ&6HL+sP?NR^K{7?HT`6@$9J z#6^@B8mUz&g3?P+($J&|%_vD@2zA=n*u>Z1%Z%rov(MgZ@vzU#*ltoJ`Up!pnlt;d z_P_r1uf6wy|8+9}stUk(e_2}{fVPd{N}Ak3=V@8L#~jk!AexL(H@g) zM6R8=PT>dBQzl-E=wk=J2i~FHp}9kC2F{{chPV{649ybMrpStS%~CYaP@AFFLT*uK z!3AGy?fciZ01&Ne)fGP)9)m$q)D(0TyeXzLq1982H?7H?8SgSFrmhBHOvj-CjD`oZ z!qwXUW+epB(BA^6Hv!;prU6ld=LWe~$Th+#*cBRZMeajeRA|BA)L`3l3{D`Yw0764V{M^C+=H!=}b??s&#&2!Pril&*@X6Ch#daXB|E-pKruRFcIltOHRw<$`-YKFMrOkjSmhqSh6a6`g&Bb!9_kU4-`@c`pWZjed;@ zj!`hiP>LXqpj-+dlCJ6^;Gaq@HYb>TI9ban!!gx z$BEyDeX2f>8M%NCK7wqyBaB&dx|DtxqIL%luf2g8yPC>T*j1Lx-_Wu}(u3 ztOf9kU;j- zsZ_23aPOX-fyVL%#BIj!_#~w(!vXccUOu$>RyG`X9I38HezH3(a?5%|Ldlhn9K!E< zu#HXb=*2DNMT%yHpjjii|}F)@kv!kObWlI4V3Hf&|v&fRRe=hKv~45Qs2 zWU+6M#o6mr@7+c9#pmFm4~Iqi9w7IM`NB|#1*bGmIjj>h8%o@JLA-VVq^V=~KtBL4 zzVs%}U1eZ!C#b_vC27oHKewOwonidP@21oZshy?%3@Lq^Ft(w&=r^3 zQP&q8f|BLRLfzp7oELOu3X&x6Togpfa}O>7%@IFO*7yMb+BC?fA3sYb2}^E<>Bd!- zy1ME4+T+}{tq&(knkm)^xr@+07g6WJ++vQG&dKV%Ai9PDfZPh+3pUSDw~UGfZ)r?j zrA&Oi$0JunsaO*jx|~aSW+d78(xUI!&b|M30EBWWeE_ zkY=Goto4vLKrHwSfXUf0-0hP%$q}^x%r@R(>aW-M%swBEXaNx=wGNTa(XFbem|~0~ zUQk)ZK+bDtPSae@n46u#TF>jRUnglcNgGWT7Mtijp3yg^NRuX6(qwsYnYb66^VDiJ zL=`W=aVWK*bWv&7y=Z6)JE*K?ps(*f>UB%KF@nu6v8UgH_o#>I>l=7!!Lf0`;I)jC z3U;oW@x@6*gkK$d1`#c8N8uJD(z$@3o%hxqqh;+feD&0Gq={v6YL2|$bN0NFEaxQ4 zDT|FJeurb`d`6Ni2Nsqbac^+)%5M&v|LUvA{44;-bK$N#_mSs9lAg!r*Vxh9#AVG; zPHqFw|I<_5nxoE9p^K{a@Y+)|{PO4t^L{?f;?@Z^GBQTJKF!2L4d*;BpYCCH&M^Lu z8Qyw(gonQV5#~=)0>9>+xxVC14P6b_pO-)BLDyZ07*qoM6N<$ Ef=wEV^Z)<= literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Windows Forms Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Windows Forms Application.xml new file mode 100644 index 00000000..92bedd5c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/JSharp/Windows Forms Application.xml @@ -0,0 +1,155 @@ + + + + + + + Windows Forms Application + WindowsFormsApplication + + + Software Development + Common Language Runtime + J# + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Class Library.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Class Library.xml new file mode 100644 index 00000000..3004e70c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Class Library.xml @@ -0,0 +1,35 @@ + + + + + + + Class Library + ClassLibrary + + + Software Development + Common Language Runtime + Visual Basic + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Console Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Console Application.xml new file mode 100644 index 00000000..0f282f26 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Console Application.xml @@ -0,0 +1,40 @@ + + + + + + + Console Application + ConsoleApplication + + + Software Development + Common Language Runtime + Visual Basic + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Database.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Database.xml new file mode 100644 index 00000000..4de16518 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Database.xml @@ -0,0 +1,64 @@ + + + + + + + Database Project + Database + + + Software Development + Common Language Runtime + Visual Basic + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..154d6603fc7715569a374a9b9bbf142dc72b31a0 GIT binary patch literal 809 zcmV+^1J?YBP)WFU8GbZ8()Nlj2>E@cM*00NCkL_t(I%cYY)Xq{yg zhoASo?~O_CmBylYlXz_M3 zf<-#0(5BSdq-mO@i7~x5_xs-OJ%1c-W|tl~(}5ocp63VmI04|T4=u%p7xYcVdhzU0;7c0f=bb@As%Ph=Qom2;^eq;$(4}Vu(0J$3ZEz z_;cx2od6yzq0%@Dg`N-NW>rf}?X&yzp2=M2K!X{mJ$}Or%IV1==Z)T$xC1jy@8(x?c0qsXj%Wn_HP*uMO!P zY?F&pijYdvFt90R`_BR34&qMl@xV7f{KnrOJk9OxhD$ewoO&}WkFdP5F%D>Qh08dg zJK2JmDBMQ~E$ZAL``oR-%TFFe#M%B=X^NsnNhMc!92;itxPqEf)Ty!{>SGJ>eaz!6 zMG-TSYlSowjex3S`9b=Y~2rWFU8GbZ8()Nlj2>E@cM*00osvL_t(o!|j(zh+S10 z$A9-#CFRqAZPLU*Ei^H98zJbTO@X~IE|eg;Fu{eiqKkkCDo)+fy%0o22uPzY6cvr) zJP;>PNI;{FK^vzOiIR$?Wl|<(`BGJ}@`ii9!NocE-uJ2!1zX&-7asSXbBFVN|KU5| zga7v; zQ%4=tJpR-X1#<{$sKtAxAeP=!$1FbM9_PA`t?%sypf(Q@0EaA_o27#Tp5f^^cPEQ) z0C651cgorH<}r`jG4FT^q>QTTTrQSA?!8N8%zggYA^;EMZ4 zSkRx*m%+mRjB6hm<;**FQ6H%FEN&h%S9i=D5k>810;piGpf|7JziZtxKAy_iHax=# z^**)@&+ze7&Ry%40Z<>vIDVjyMfDoTEv!+iWsw3vRWa3L2jD4NFFjn1&7l*F^+QXd zpLb68oYxO6;q&npdk(f4nP@RG(PpgC;gpjHSXA#v%@HxwVgUX7zCCoes9kPq%P;ur z+3Xq_$J7xsG(D(dacsta{`(m>ZM=+CgLTdutg~tRBv-Fp%BJm;oHtl!)nJ_~9vI>2 z;hCPKE?K#V*Zy$^hmQzih9wI6^C15k{KLCl=^JheF5n6#xP^4id3(n)ELFq}YZkM8 z%Q&|^JqEyo8&~uq`S4!=xc1Re9{TVQpO3fbt7R#%A^_2@HxzdxbHQD~LRvfqkhNwJ z5zL|0i8O2-p5gVqvs|)r5vvC4JpnxM<^cdc9GL}R)nJ|7V@*U2(;|Re%Ec#}7nC=} z3{jm&$HnIxJ9mEx8T@(q$!u7&nAi8tvSH0)TDehQSjp;!E#o~D9BwHK`f8|kArL|Z zbsmJ%PFdQcMk_^V@mixu&73D+dW(&hU&K{wmy!pgF(cIfxNsf?PrUOTS3mO&TRv!T z(b*?O7Zd?>f+pydZaQM|iIvS$C36Z-!@h|Q`wxE4Hor63WAC_ARwBer zA_BQ2&wII;TXog~5p%>Kh(vE2smR2_b2JM6w)#Xa9a_Tv?>d+%=G_z|p@kr2$vo%! zJ>;!v!jT5rZeZ;xEF1ygqgQW5Bvv#ls${Ae2O5E=u0Nfpj#6Jn548EA8Tqde$dk=9 z&#g^!z&wjtcQ>cz zsHAfU(N^W+b9;cUUDdh*RKv>v#Bl8p4j&{0O;E#y{~V1jXg1I}8hC5-ji`Z$^3f-s zVhK{U_+ho^b2G!-O5dBuIW?~|(3oy;-I1uzM0+RAAA5dGcp*UGx}bPk7rk>&xDC^ULqKCIkv`sTThSNOts+S5aZxbN|kM z@xP+%vEHUs#1MsVCfZ2iP?Pt)s0B`$X%P8!yW+-lgD0MUg^mRBTnHhM=YbI7FAveG jc?d`ds4Bl7|LgH1g*2IpT~rmg00000NkvXXu0mjfeG%)^ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Blank_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Blank_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..15a293cda9d5aeba5a220a08387229795f6d7183 GIT binary patch literal 677 zcmV;W0$TlvP)WFU8GbZ8()Nlj2>E@cM*00Id~L_t(I%cYY$YgADb zg}-~}Dj5t6iC_{#AfSylA%cyCjfFozi>XrB*x4!O7ieXpqLqqR3Th$#0ErL;C52B^g)tXYRDZ4!< zCV~i}sQ++314&XCs=mH7p8!mpp13i!O4OXBo8%kcPigEs6tNA zXtrqY{U+@=&9>5PIql3a1vN*_G3THdBGOiOFvsVmivJ5D=6hZBv>m*j2H$K1fBfRD z1H=HCIPQ73AP&IX(-i-9K^f)tp@ z&W;s{BPd@ST1aNP+j~HgiNB)!gs3?Tl7OnLaf{X*l6iwafFlX*L={ z5IMAiz61M(IY~Z}I#_^f=Sl=|YCA$4CxoB_0_!{K{R0IY!-;bC*ootaxBzjK-~Xjx z`Nt{?i(gSSg5>f$(3AUw-)SpLpTw4UUXIRpOA&wAOrL00000 LNkvXXu0mjfMhqK% literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Blank_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Blank_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a876cb9cfa6920abd6254014fcf46e91b56df23d GIT binary patch literal 1253 zcmVWFU8GbZ8()Nlj2>E@cM*00c=%L_t(o!|j$&h*nh? z#((F|KR+4}9a3W!ffzJ_)Iyw1pi2o{q`NY5(W2-Nv?Mck3N+dYxoDva zrBy8qoz!SdoNUxaOlSI>@0)M#`#vqsx!=9_oB75~)W!psd+xdSp7WgNdEe(f@TmRI zEfk%1KfR!$zq}%rI?!x6&6a4kMYH8BEyHrIe`Vp>Zzco4V0CckvpbQ%3|zt-+=L0t z6)zLHfeTj5F^})uAouj23HSJo6vwLV^!Jy${cIH-f)ILlDG;E5(sz;wT>|4c2&qDA z{BzxwtvRX$q$*ONXR$Q7>Pv-H;;s*&Cc(uE)BjlvtOBro(@oxbW#4Kt6zLYAuCBsK zeHSj0<|?06#(_Dwt2_4L$Dc5}t^`#j6m^xykr03oVpt?#10gVw#UH%5yu8cHId0sz zj+s9s28x|~isBevge>sW^#@#=Z!{QLiOEM^6F7n(l?*l;H z-Iq+D63p_7I50UD&E(?!+Wo-f7+2<6{Cd01%^ea+N(T)%9-VDI|Ct@;v{@V8XK921|$9D1h?#-OK+T_Yyi;NJ1 z&>XjZ3=q03c;UV-R%2f@CVFo06SeY~47-!L+-ByEoJBI2(pbGT%8lSCe3|Weg2uv}G|1 z`T=mN6)Z-sQt)^I#>GO@cvL6Fo^C`7=j|>#{DnZA@{QZ@f+YZ)KZVL&%JbR}$x4CdPTzvtkCj(SkYjQGq zsQJ8CfUYIM%R4vn;^Y`}^PS`c>!hK3%z$d@c@0#+suFn#?ABi$j=%jB$JcPyYd700 zE*X+AbKJC!1k?jis_s~&y}EEhmx;v(#{IurT|h-GFgdP((#a|}N9##o)x}d4^U6+p zk6K=>fED&kW#+i6TUpJ#c0?Oo%ZO@$=Vc*r?^)E9K!zTGs()K4Xy%4{KM7FjhLwyc ze4tk6Q*2mOqS_gtQdPYI&>Zyx;0`}u`7OFt%GW#vjVW4abh7xam@ry&oVa}FxXO84 zam-x(W8lpXrYb)Rx0th1T+G~45XR?XJoaO)pcqR5i^_g+#(2~owQBnZ@V}4a-65lg P00000NkvXXu0mjfBmYdi literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Console_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Console_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..331aa5082d654978b223a13a8ed81f740f65476f GIT binary patch literal 918 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 r03B&m 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 JPDHLkV1hgIi@X2; literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Library_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Library_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b1afe3dbb2f141b8444fe37a005b796c1af30562 GIT binary patch literal 822 zcmV-61Ihe}P)WFU8GbZ8()Nlj2>E@cM*00NpxL_t(I%e9fsZxnSH z$3HtWyKQ%uhSr);U|pf45)XQ5#b8YIfE5e}a<7;{Rw!PKey`84f~21U*G8P;gxl&qX7rr`-7=^ zg!hIQ!-?QrF--6u_SjIWaQ@Y&nYeJ17n)Vxe{-5{;u)!w7%zvkJBs&yC@>U&ASz)} zLIenmG&jy3pW@vw@AJjE!<_i|9y5~_UOX_yYYoG>M*>a9PJaK>pWIuz#v7;KX65%! zvG6!^uQWM#%rQUH#DE9woOZWh;rVf#%kbg}zWcU+`SrO|FKw;<#XAcXy0$4L z=o+6bUu3nl%>2O`V4Rts+jUQU#tmvWMEl2zgeZ21Rb1 zo*n0{nLTWEJ%tmzDp4FemX=#2Nlfd`8r}6R;%B;awmS?GM;!Oq-1=vDpBJ1cUX*0F zk9r~MbTTTH0ckp*EZdZWjI8Km)g8ieU_W2`@%raiZvCLDh$yOxnxZPy>-ArvEXzmZ zc$_TlbAQwG_iB&9h@-o{%f?E6`zRZ*4U*Bh;7!$=-uK)l507*qoM6N<$f>N|= A>Hq)$ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Library_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Library_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba4f2ddf9ae15b16030a63abad86a061c0b53e1 GIT binary patch literal 1735 zcmV;&1~~bNP)WFU8GbZ8()Nlj2>E@cM*00t{bL_t(o!|j({Y#dh= z$A7b4*K0eWsS`qpB`AqoVoM=agW@0+3OrdzeIR*4EhP6(o=pIfS!0&W)sKTm{|Z3v#*~2PE%wsD z0Q0bPotfb!UjWHG7-nR%>6gon+_G;h1(KnvyJnlE#;tKHkHzbkhpg@#aLpl~PPwp{aotHABo$HJlSf-vU65_C?gE_xUD|-u^ea|M7FQH0Nl_d9*Zp zJoK}R^gMi;_ChZ4yiNwyL^csYMV1F(skfHpaP7IOKfoh>w=y&vacHE(JKCB!G*V({ zHsX=KTQdiwPIog8QNuY!bQu7ad0%4!tAVL95roS2-qlG_8J=snZtq=9?2Pu-94p(J zXlu#Ql&c0PI8}663Cyyf(>ey~e`ZD$E8U%~+|$`g|KVxQj0f}|p5~s;Rsc>G%UqZW zxi}qic{XDGx&kX(bBP2_vlv)X2dbN9+FLy<$y{}fsIg;f2Z#5L^R4HL0POkPdcO10 z7|)NC8tmTNwSs-$+(@bH<3v$e4uDq6Y<UpgUy% zz<&Bc03Q1JMSgPPADkHv$ax;3dgCmx;AX!5@E&GLK2Pl#;?TYy@!kIKF<-8b({Wz> z@lMR(vG4bj3j;!%q}i^qV`~RMcCC&l_D}G{{s~T;TL7TDvlSIdJTrF#?oyLR)1oe$8lb|sJQ`8FLLxA58R zyLjNEYYAg*0Py9#;|&sA4}|8tmv+iJ00;K_wrVKP z`x)>f)_&{*`13xuec0!vBaadOKEl7_4g9}sU}7dpiwtyi7M4ix?7$SC`PC?U|1?A2 z=2fT)YIOiajJCFR-nq7oLg5Mkciw$RYDE}(V;^UL+cv*H4OHRu#RC*e5Jz!RCF@eR zUIKt;2BzzhEQx^z2Ex#BYIun9LWQxh2}G3FUmYYU2L$DSxyd=!d_oz1eULElsRRKt zvs2`IQUIEiSV@EPMiSh&>1ICJyPDCfAtH*3)c{l~jt_0S3xNFxMsV)$Z2QPYFb5Jd zK2m1bDI2$TqX=d(=ZnWFmL?Dv*G@hPW784O?Yy1mZct&*k5wp@1t*HtOArKcwn)^7 zV*wX{#h8QuxY!|9L2x(?v-NT08j4iOcbvN5Qbr7`JK9;A#v+;>(J}@SV~U6p#WCi} zm_{HK0HP=+QXjDxv8V<(c9<$=URv{O9kbR6({7rb4FpxIXTTv&se}#@BZ^{(BhUz{ z3`CCD$~cWtt1%$XA=&1O&j585RO_MO%_b4GpCyvlFn8Y-fe0orIkSpC%tfr(<{{RM(*n`8c8aA5RFz-6@FJ>76VtS1R*zqn=BH*& zuG(d2Ov8c0FH;F3Cazv1j)W5@ji4M8lq;0xedKn>)X9(_C{qc1g6ocaPh#YczuxWr zTmOo@rxO6q30)gLP8=&iM7uwzvW6n|FCe~R8N1vJE*(Z;9 zZ~IiN3TMw2nV+9zY-|wcgoDRAn4a<|j!yBn3+L$j;=7qWR$yk@XJT}cOXvU0YXhe} d{y*O4_$OTf2<<8km;(R+002ovPDHLkV1f|ZAaMWy literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Service_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Service_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..115b354a27784ae3a186d30e2e7b05363c2c80d2 GIT binary patch literal 864 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Test_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Test_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8ac28987b197b9d8b99b0e4afbc283ccd07652 GIT binary patch literal 885 zcmV-*1B(2KP)WFU8GbZ8()Nlj2>E@cM*00P-bL_t(I%Y~9(Xq9ys z$3O4;{?6KQXPY{MRBUOPBdD!EE-cUusdkklT?n=UC5Ub+C?oJ<7fBi2Sg0341^vf_ zMDV7dqB0=~t)}U5Hm7YhJ?}YZXXl*v_xI`Icu_(2y?Jh)KYYK>CjxkG&&dtOn4wxz zm`OdqmpqrNf)^o*A|fD)fWK7{=*YKyr2w=xL+kFpXH08w9-J493m7Y8RxnP`R2RO^9qJuuf0tP^|yFM{`i2!sFv#4#kQ9R;u~U*x6H zey$~LTa%f+y4ZWRKeLY*KuE6oYF#om(8xS*eLc$yA5G!B(D~GHa!EwF=BUhDW@f7x zm!Kx5<~E<7ni-x=Gcs*)uI1C&I!~@&%EG6A>og<{a?Ek?%p=^oav7uRdU*DO3%tL56%V{w4SwUMQ6v+IW2MC}SFg7_0~HgZyDKoZO;F#W4|1wHeVau_0HI<|JVB$VrrV#?9|{-00000 LNkvXXu0mjfBL|Pz literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Test_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Images/Test_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..da289cba4d10d21eca9c80324a7824398ffeac5c GIT binary patch literal 1848 zcmV-82gmq{P)WFU8GbZ8()Nlj2>E@cM*00x{%L_t(o!_Aj}j1^ZE z$3OFSfn8kM0)YbC(n7Z?RRkik{4f?xFqqgsWJ7AB*qV|Uv>jP%L275+oj8*TiAX3cHh1qGxwb1A9LTl_gJt}je3*G%-p&6 zp6@x|^K0OLJOVRIUcR-xHF+sUMlOVGUdiT-Y{AIpm0S^u&i*69&;GVKsJ(P@=B$~R zfe5G>qM%}kfvClo7*0S9B2h%+Zz|x_?-N5cUSk%|RgT^JP6Ch`W)c8{Ah=XZ0|P9; z{5mruh<5<-JQ!vqvwr6lN9u}S%mYbKRooL{{&1@n6>#bLD?=DYLF=*O|1}>N24MQw z^W3*$>2PCMY;FV0^Xhp*4aEBa20;o;jmQ~J%YGmVs)kxT_uyk&Ir~p3sAR%oUQNM> zfz+e|j&=_5_PYf})TU5{x{)bPb?52skEpM!NrbD$ph{|Xv* zqoyXHdGnimdHZQb)&|tnz{n8+tDfoLwjZ8g^r%!KTrJjI%uqF)6GYzwK-uiorY}7M zJhF5WN75lLAI~tRzJ`~NXE>4$d1UFN7_`P`lr3Q>AR?&9l>wO7){+=5zpDpU2$f~c zvx(YsW1+LA@HIdQrh z6~n0_exW#x-&J|-^<%8PcRA{e8IASa-dNA(y%)G=@kBQ7y}<2_^#C009I8@kUQ+|z z7eo37dyUtF9M2ukQ~|i7sexS&e3*fpc*RNpoKy%G%#^?!W&#>{;W2<9pT#+s_(HA_)3Ez^ zh8Nni+|ks)3~vDd`}te|R{f%bpB?VwRCk^LaH6P`0E8|Pej&Fc`RG(}BE#tT{HK-H zlV=cB4j((g{VQ8&nKzCX+OxFG8&{?Ek6-#50EbU!0hrNPPutr$L@O*1MP*Zmk>i$| zCRTZ)CQhjFv&7n~8hZ{LA)OWO`s4)eUObUvRGlHexwE^9f`Pm+vNjb*K?y)H5^s8; zl8!j}1gK9!qF%5WYS7hFf5JpN*pZW}EOq*OcjDlak@-FxM<{fq(>g98@$NEZH zc0x>DY=O}EIJZQYY56YR8eN%AwzWOPS7(1aj%~#!87@n~j#n;JNJ})N;C0obL^JcJ-}1dzl1xrn^8k=MYg;%v-<-NCX-ZM$VfwVBxyA2y^|od@nBF%jkx4 z%)PUXwTsr1w;btwnlK1iFl!;(cHhsM&un2r-BdDJAw8J$l@Cvkq84DjvvQ(XnF0X~ zF;9W`_G$0drZ|UdylMTOukiKxYsl#k>0%%0Vjq3QUIrx14Kt_kqg|_ceEA}bMEDre}0;o zb3RHsOfwK=IQ9A|K6Jwj&Ryv87OU(5DypgmWq_hs0>CLIMWTVf6GbsHQTXh4JK`wF z^&j-J6DT)lAPN#; zs3KBO3WI~lpkN&VTUT%Y_kYbcJ^j47$We3=Vd#jWh%k(ZqKGNikELn)ICdP|gqsqf z?cgSdSUYT6^AnmsvLLu>;XzOh;9nVsP8_fe&#Xg2K_caeweL@O2|(E~uHrh_w%-=4 moMQ*u_S^f}U%LJ;#y3|mOSYI0000 + + + + + + Silverlight Application + SilverlightApplication + + + Software Development + Common Language Runtime + Visual Basic + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Windows Forms Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Windows Forms Application.xml new file mode 100644 index 00000000..3e5687b4 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Common Language Runtime/VisualBasic/Windows Forms Application.xml @@ -0,0 +1,154 @@ + + + + + + + Windows Forms Application + WindowsFormsApplication + + + Software Development + Common Language Runtime + Visual Basic + + + + + + + + + + + + + + + + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new $(Project.MainFormName)()); + } + } +} +]]> + + + + + + + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "$(Project.MainFormName)"; + } + + #endregion + } +} + +]]> + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/MSOfficeAddin_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/MSOfficeAddin_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6a073cf9bff901a78bbe3f7f2d4a334fa08eb5d6 GIT binary patch literal 855 zcmV-d1E~CoP)WFU8GbZ8()Nlj2>E@cM*00O&7L_t(I%Z-v-NK*kE z#=mnmH|I7q^FoRnX#&oSn1NLj-0_{NBDlAHRq1{{cZXVVL`&tW@1@Q)~2peZ||B z(pI%bw>?J&19bL{*W4(`E72Pl(g2`$790mK907LhDOM+kz;14W=k#KYO@Q=P zEu1b2K8pHNqIJ{Z85o-#HB6gO|FMYx0Lst6OL17ys-tdf(&wW=Q-1hp2DH@%k|01L04a|LF&7HGc?-Rx zS}bn_Fu!2Z|5sv1pO)Jf9sws!BDOIfbGfe(8zF@tDi(&ZVMq_iArXaPaLS1ou^+sD zJ}|w2)D&5J$>SI1Rhy&zxM1si=y)42)D9{+6_SBQm=9frh_OI7>qlf*po0ju0n<<$ zWSP+qXzPSh5cr8H%XLVI7H&hFK)|7Z4WGGR<}f1Y66M)fz*zc4+QDupU)jr~k@0se zj$9&?%0N_P{7uVT!nX-yU+^gdfO~TtAtE`-o>VL2#CEyJ-pMU`R9yFSh1{002ovPDHLkV1f?YZgBtr literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/MSOfficeAddin_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Extensibility/Images/MSOfficeAddin_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2a08b16c34429491fa2f4ee3b91b4597ef524be9 GIT binary patch literal 1812 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 m9~@K^rU8O!g8%DZSAPLP!<`!5QjJgm0000 + + + + + + Empty Project + Empty + + + Software Development + Pascal + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Class Library.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Class Library.xml new file mode 100644 index 00000000..d02160fd --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Class Library.xml @@ -0,0 +1,19 @@ + + + + + + + Class Library + ClassLibrary + + + Software Development + Pascal + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Console Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Console Application.xml new file mode 100644 index 00000000..981e8fb8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Console Application.xml @@ -0,0 +1,19 @@ + + + + + + + Console Application + ConsoleApplication + + + Software Development + Pascal + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/GUI Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/GUI Application.xml new file mode 100644 index 00000000..44e9ab8d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/GUI Application.xml @@ -0,0 +1,19 @@ + + + + + + + GUI Application + GuiApplication + + + Software Development + Pascal + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Application_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Application_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..9bdcbfdd5f59e63e94b1507b8fe35a6f200220c9 GIT binary patch literal 2082 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 z zc#ObUEG{nbufQ5aK^4S=LWP3QwZ0L`N@MJKycXXN7#JMpZnl7^01#PgR#ikmLh3DAF&1HP=r10rEOKXTgzWO)4E*vV zR@5dvo8yPh_o>_W63Oa4O_BTKhYXC68k)ePN}|k7rWm-|&Vi;gjQ{p6qu0Bs-F=W3-u{d&5AWpO z{A74U(eR#11jVAJdOLQh#euil*xh)Hn)*YGUhf7VJ@ONmJKtne?KU>Vqcb+Z#Gh02 z52gqLp%?@hBbb?KtfybsXHK*+di4wILA#UBHEPz5S>ElwFYV3?Jsf|f(fY4X+bANi_`J|(Z=Z~D|l3fkQyv-E} rONH3nRJLO7*RQ_mK7aD#k3QfZA=9hv3A-rk00000NkvXXu0mjf@N9-k literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Blank_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Blank_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..507c7f9385fa71d8a4f6ce4d61ac11832d067423 GIT binary patch literal 1968 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Library_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Library_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bef0a2e7fc4c973a40eec863f432dea2201cf8 GIT binary patch literal 903 zcmV;219<$2P)GBad^$d~{C03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00QetL_t(I%cYZFXq9ys z$3JK1-8{#bFxfoXntHYr|CCE~2g#&BZ^9(1T?j>Y*-aF5Aw@T07lKzBLP$iQ&Tb^K z<*H?6mJ#Aowpq63bfu?rwsSoH-v96Wd!8;%7G8AK7akrS9=;#=^69aZ%Sr z9S`+9#BmYVC3ZaYP7$C9@TPAP)@&pUFky%Z!e$Rc@vH2or@Q1MlA)W0TkQ zzZ8qAAE`QlYRy$GHB^gL)g#BwD1Zgv2N9|OiV>P+gxG*464V~0#3n(h zRN)`MU5SD!h-rd+KV%Dn(pMFd2YSQI0|yC=RTy})AU zjvRp>Fgtsl+@^K3wOXA1;ztJe9PG22W{6GGDAK&{(Uafe28MO3dpY&-2;Dt>eE-d7 zbS}xTaq|=OX0rsQbvp6EiK+gYKY3+U*9vA!<21KnxL6IB+jT*T6>lFH;bJG7VMZ*S-M{Udz1 z|7j$S=*VPw>79#&P6I1{yTtFe%FGoi%-^n4x|774xk2RCX}kX^UN~|duR2dlM>`Tn z091-Mc<z@cRoAF_EXoWPF*D3*~7xja^}Z= dCUxof=wHn|;W7|;id+By002ovPDHLkV1ljeolpP( literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Library_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Pascal/Images/Library_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..9fffa7a230f2464b494e2042c7748d32a1a54837 GIT binary patch literal 2315 zcmV+m3H0`fP)GAaP?U|0YE03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00?hML_t(o!|j)8a2&-I z$A7bjRx7V1S(ZSO4;jlg1}pJ_iE+RX6Rt8~QdFQwVn|G&5(mdcfDl5exQdFYa1{g) zgb)nma4N(Qz(9Ne1`Bh@=LT$yZOPUxt#-B2?##|iPrrQFLlOdtZ~2n0+U@T5y8He6 zy??*%f&Z8PaWV3Z<<~Zfh#;cTT7!Tm8qrx-@N^PBUV@mh8M- z9o_tZ0T398Cb(u5TDgd$(5{Q&Dnz-6;VldDB3wBsTw zJ62qUc5?F_7hj^iVAEG z#xM>M0|AWed<-PFmN6Rdh_z(oLc-|Z2r!5-3j3%KxDPd=$;Wj#ep<-Na$L}&K?KPv zKm;Q<)<8fDhG@_lpMW76EgGNXIbe(haPE?6tiJMsF)S4!ODwXsbgr+-wY8uHv<966 zr6t?ex$&L`t)(El{hs@YZuuM!d{L1?_yrLoYkY*^yiv(+egvRlz2uzL*4B#W>CX?r z=NZ;ABAhvHWW8<_7S4Jj*Vdl}k=?nM^OjN`p8l!;MzB7=yFxyYJU}VvHoUZ%rVkI| z4+im+OTh2rniZE&U2}Xc_TYIQ`m1aALo8c5kHlbx{-j0!fJHo+VcpYz;Nan71z9X%5)2xwT6q~w&ByQ?{x1NKk9Usk zg=AB3eHO@;cXl#m>U8QR9Zzq6n!VBg(B9Eae9)#Zo~Afb%{417pslly{(%g!gh^k& z$zUqOd1sx1KQx73-tlDR7yzDt=Lw!CC{N?*e4S^t(B9d@b1&|uwx)`{M4J9VlW24w zYwx^~4gYwC-uMuY-hT^&$vCTjcrGnRkJ6ts=}(#@QVu=w6pI$lVcQ1>_lyCMy}?F= zA%DJ+e8S_Ab(>f?zkztdB%aKW7f}K5UHqlfk|YvCo> zO5@npRR60R(=xuKoa(ZZd0|5*%a?3J9Fs|r1TE2Re6a0hs+KmOv51)_9sO1Kd_FAO z!Se*$QB15kkyyva2*RTCS5tGssmz#n0h4E*juszg#-e#sW5Fxs)w2nPCt{|O!GPA9 zl9C9;#U+G79RSQbV^;QJ)rz(cUtvE`H+L4F9z8@+Q4oB7nqPky41++hm_^I3=i5KH zH+z0^7gZn_A{fk`q|O6xk2-7Y39t!Z)ZYvJ>t2v?A^@a-J2NbJwna& z1uVJz4(2ZX5d%Gkn7ec(!N_o%e5M&#gp6VR$a>`u&lM8y~$6|F{srvIxP_2)LFPurez98gew+^Ke`janp!)z_S5x92Zwi zJnb@JLK3g22m(GDmak;?xmTb)m(cifVzE|+`rE(ocI|12VjGHZq?A}o7a^VK@L8sZ zr!<+2!qeb53e*s&pMmCCARqa^sSA2t$y4S0o!)j{_eY&DVtbdH;$v&@m`#aX=0^Jk^?3(-=np;6Wg-z zEEA5rL0|m|lue&hxWSBIkdm4@278W;F&rwbplbH1oPFCLQDV@x`Axnt1M9x~9{6p* zG+h=fIEA4hhoSUA9CsgQ%(p>%Xcv0o~O7?ti}K`o@-Cb%h%!D<2|^;}3&q!jh&`rwB7N lFmp=j`nC7myXv$2_%D7#o`?*eBh~-_002ovPDHLkV1h;uVE+IB literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/ActiveX Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/ActiveX Application.xml new file mode 100644 index 00000000..3ad2ef70 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/ActiveX Application.xml @@ -0,0 +1,19 @@ + + + + + + + ActiveX Application + ActiveXApplication + + + Software Development + Visual Basic 6.0 + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Blank Project.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Blank Project.xml new file mode 100644 index 00000000..9f0a4cfe --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Blank Project.xml @@ -0,0 +1,19 @@ + + + + + + + Empty Project + Empty + + + Software Development + Visual Basic 6.0 + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Class Library.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Class Library.xml new file mode 100644 index 00000000..8906f886 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Class Library.xml @@ -0,0 +1,19 @@ + + + + + + + Class Library + ClassLibrary + + + Software Development + Visual Basic 6.0 + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Control Library.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Control Library.xml new file mode 100644 index 00000000..f268570b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Control Library.xml @@ -0,0 +1,19 @@ + + + + + + + Control Library + ControlLibrary + + + Software Development + Visual Basic 6.0 + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ActiveXApplication_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ActiveXApplication_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..264ec15d254050469e43cd2409f4c5ae199a9a38 GIT binary patch literal 625 zcmV-%0*?KOP)WFU8GbZ8()Nlj2>E@cM*00GrWL_t(I%f*vVXcJKo zhrew$n>3ezBE2eJ1TD3fLN{n)3le*f;-QALng~MLlZa6Nq?m|MTXK+GMKK`NgRP2+ z1zAE|5Ts(DT2fL$50Ms{fO@f7%#N32Nu*%Vg9ASphIzmF<~<(#V<-SP9Db_R0MHIx z_#2l5sgy81Z8141=(+&oK+mn(XCHZ74mw=*&_I4FC@#)MQ#2Ko+5s}Kokh>h<* zWYZGq?LF{E19hvS+ob`pw6p?n9&oozU|E(;5|1MyTWfh4IX8Y)>ICyXpFf$;zb1a^ zBIQbjbUIC;5N7t_XwxJS!8A>r>QADvp)LUGH$6OjDtGVxtUNaiIT4A-%}ho`UqB7?p#82hZ9Zw*pGtIUJ5G4jetwsq4C;px|zIlgpZ@PG@a2Jes?~%-tuA zKuPuY!yb=^tnq>!+qV%KI@W~$_~{HV2Yj<@Z6_nAUxh}FcLsw&#q0HQd18XqPaiOh zd1A4c-MG5Gj!Sa^T9efLn+18lQdEk?0{%n&(%rRJ*|}>sef>eY_wS>$wnq8OSBZu~ z3-8`80?{7(3p6J6=hS`vq-9m@y){k4G_y(IO08!K*r??>{(JlaW7Fjvzs|oL00000 LNkvXXu0mjfW^M-w literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ActiveXApplication_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ActiveXApplication_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7d4f65c52ea90a09d46a0d7dd9d4c0d5377486 GIT binary patch literal 521 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ControlLibrary_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/ControlLibrary_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6d431fb8513aa9bd629fff63872b654d87fd1bf8 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwYi%C#Ri1{~T3{XfmGbEzKIX^cyHLnE7WngeFN=+mEY-dS^E)t`+M$%vEj@Sc8nXg z_w6l>IdczzzlR$y$>FVdQ&MBb@0KW{dKL7v# literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Library_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Library_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..417f054f4afc181918daa9358be90941f4b90a6a GIT binary patch literal 558 zcmV+}0@3}6P)WFU8GbZ8()Nlj2>E@cM*00ELoL_t(I%e9d^NP+@gFjI?+0a88dM~Cq z6+}5@Xb3q(kJHrqK^7gj!{yxX-U|o#qZ9xj%N<6gQuNqt87{51#CmXWenR5x$6H*k zz8z9SS=P|&6$xM`r8m~rEOfh7)K^;=2!J|WK7R~*Je`oF;>pEDk>N1tcGnQV;FFh% zBmg5rLnfcoS;paED*;TVv_Y0Tq)@1YvaBH~QWW#3PzV*@G0NA?%}rXnP8VTMZ><0v zqPtrGzn_7YmXBa|Hek0GLU?aDouxFHj&OXOi>|IX_VyYPjo!YQ$;`^c#P}x1rhNO) zAI!|oqpGU9-0ql0@Tdv*cS*z&3y8&HP>V0HO09;)Xy%M#C1f_#*FD4Q8@pwO1|t*K zNuEX`pH|{J$x40AgMVxH5U(%)8U}#X_3iRs!vKVwoLu$~*bu*pe;HLU80PexBV;zz weTY<8T3(T&mlxLWvMwmfPj72&9>ss?5sj7lyAT$=PXGV_07*qoM6N<$f_paVKmY&$ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Library_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Templates/Project/Software Development/Visual Basic 6.0/Images/Library_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..56ef8c6c81cd78bd4e9e7d6ea37208312616b60d GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwYi%C#JO`vjmHc&`5GbEzKIX^cyHLnE7WngeFN=+TBl(n(Ov0SN3b)>vO8~ z_r2p!tCUYh7SE`>WLWa#{Dh?w`nfb5|1EC_dJ@Q}dXk;VYjQbDj^jJl99KV~*^_pw to!DwH{m%Z5S?}kE&bz&D@4xEak-ak_W1p|?|_NSl0fM#+Y086}}79`Na@d2kB( zDeZ9KRczedp%Qa6Pf3N1Z>OoJi;0DW=Y;0w=1UJAJ+Obl&hp*lN$C5pufE>h_r73W z@x9M;`DIGh+s-=Y-+3pZHgAs9b6NER>(li^{GTmjd-ME_Ms0cV?@ZS7U;ka?W4!fg z?ya1bX~M5g-U-Pyb9&vSHJNjfM$ei?$rD>OZ%$Yr=A6J7IGcB}sCozYhl5N>UvttA zyDwFma@xo{t}&->VL`-+lqU*u(=)beH5jqyH_Whp@s&le@OaWBIUcTMH?B>niPM-m z&H9GaB1Zl`)_;o2Y!xL^u4Ku+UO6S6z3rGC1M6(RDc84uOZqjD`r{v#*EDl@@N5t1ymdC^=>D{?zfGHC jHooVG_^p5KOyWBG-y3_c29(Cl1%WFU8GbZ8()Nlj2>E@cM*00DDJL_t(o!_Ai6je{@{ zglDWYlB%GT>j3gZ$}pW=S91@<1dRW%LAsSJMQG#sSnn)`B;37*aZ>0x02tgHuM6MZ|Y}g9nD!{cAUifD$i8VQ?AQ^5#l7fWo3N@WC zm}<;eJfd&K@7|rYfVChgUvzQDS2&cD3KOx$Zq0qaf?Qn*6WokE0Bs>+bD{>qL^n%7 zq=wa5h^Py8&A5M + + + + + + Standard Application + StandardApplication + + + Software Development + Visual Basic 6.0 + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/ProjectTypes/32x32/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/ProjectTypes/32x32/{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.png new file mode 100644 index 0000000000000000000000000000000000000000..7730ebe613ad19cd90aef53cf6cdeb48f846032b GIT binary patch literal 533 zcmV+w0_y#VP)WFU8GbZ8()Nlj2>E@cM*00DVPL_t(o!|j*9Yr;Sj z$G;v1rC}c~iR0kDo1&1zzTbHgPAyDYz;@rvUh|YzANa<7vbS(z|0l~2tltMw` zQ0SmIYo`-`BqcQmLb>mfNAi;Q;rrg@65z-R@O;>5?rOD~+n#dA<8gp1fTAcX7LzE! za<=pYL3kA>QG$Fu2hFHLZC9Wf)%A52Z=PGXV3XXB^7S0jg%s@J6qC^e;aC{`*1)l7 z`{s$S0|1aNq_Fr}pxf->{nv8N$56vu!mD5l5t#K zUm%f;dwLH9{Q`tSA=GL$P)hN3Z#w2|&X=mH&O_)&vMfW_b(p5P9!S=nY&QGry?X$+ z+8wu{{1|=0czFc?JhmSkbGWX8LnHtMfB+Bx0zd%l?S^i<*1vUt+ke4d#XiZ7?tst_ XL%@9RAp#+R00000NkvXXu0mjfx+mSo literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Class Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Class Library.png new file mode 100644 index 0000000000000000000000000000000000000000..0425ce8be11cc59b2b21daeaa767c558aef8aecd GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D-$E9wN701Z=jHDW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`&^Q>Eak-ae8a8b=F}A5gEzQOS+d*E?GKx1Vtpoa4hH3WPLYu?O&Ld14kqO9%hCgqVCiG7c*zxduMLnqa_j}Z7^xkI!OkL z=TULe7mnVT`JnH<@@XT}-5<_HP4Hczz2gJJ^VtOt7iw@Z1UPz5YA9Z}ep_yIQcqy) z)sS#g-9xNTEB#iNx&TpWsBm)6l6Msr7e5vR&B;ovvJLJ3{^e)K+q&kB#s}Z!e$Vc` vwg1C}qp!Hcl{uWWPER_uX^8>{=l@>)nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<*DRi(`nz>8q0s`3@Nfu&8&KKM{T??AI;*z_w7Zj%kZS zvFS=r*{tWH*W1o*N^xLPRt&rK$!+^;>k}ahR|WGW@FlGMn-SqM<%&9=3-wf7^- zu{MFEq{Ffq9vmlcRWtiB&0RA$YF1>uy?$kV+5zJ%8TaSR91NFCM0w49o4AyNn84VSp-HK8Q=e-PFm_xRE@myrM z7A3ZMDaR+fB`+;I6%KxnW1OU-cz>$QE8E!nOa(FXHM*Fx-~OL}(poWFU8GbZ8()Nlj2>E@cM*00H|+L_t(I%cYYsXj4%X zhQFJHEN^*T5)}f;QZ0l`rM@Y(uL&5a1a(LWDp<(W+SM)zrEZ0GYEW@&OK994JfSv; z5vSNO*df!)nk;RHcLzIM2gxI^nj-kah5!Edo}YW}IY-RTKVTf$Y*uA5i=QIM_erVE>RrJVBwb41i@>)M_;Gku8Y%m0I+Qvq?F3oo>dp;m+IpDQW@K`N=oVNM{E7ny2nk^RHkVvDWwYV zp9qb}!w-wTgC|cP|8e)n{ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Application.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0a5d7d7a8a53243e95ac5b78654024df200e6b GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D-(kyi_0D^CZLdPW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6kp-#;uvCa`tAfnz9t6&*ZBs|Hx)!nePub#yMjaApe0Fq z{X(-XY*~+ex83K8(Dvn7;JD?Zy8X-JxMz|YXH-qphL&|rPG^{i#G`4dz)UFR}yxTQazC*X>u(nE^}r=I3sHSF-& zxqX#(k72FDDx*)I-=$iFN-}t@{1^24Ms)Vx;=BvjqSlwb`PrH$xZLCD5hsq>AkTQZ L`njxgN@xNAUCDNh literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Browser Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Browser Application.png new file mode 100644 index 0000000000000000000000000000000000000000..87d89208bb95823a0d1fb8d4d8aaab9424904b2e GIT binary patch literal 625 zcmV-%0*?KOP)WFU8GbZ8()Nlj2>E@cM*00GrWL_t(I%cYaOPupM^ z#D7ksEMC&dQzV>$E>XtdETOWKEtSWhz*3|vCCvz`lvouVP>|@9uz2Gm!rd%oDRw$^ zA$as35Gs|$6Ce~1WpF2~M1`W3n_iusyZ0XHIbnJEHM6KxDp9$tk&ueRUJH-nZiSL)`s* z7=}@TXX4o_Bz@mUQ51^BBATW>ICy(|%klAm^|$L-Uo0%^1VvHseV^pn*_d{_O?R|| zhKAZJ&56G?zq9Z4c(>Z*;>QJ+brK(xi3`cAkv8@AbI6{27ZyQN(c^A^ER+ z&z>?sVsmqgrqX&+xTSqSmSr?ei+d24DVxnkySrUPQGC?ku{!?-`tRXtlh{#;00000 LNkvXXu0mjf0MZas literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Custom Control Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/WPF Custom Control Library.png new file mode 100644 index 0000000000000000000000000000000000000000..cc901051c27f73397c03d90e00ee031242f04b13 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D-$D|)bsV_SwJD#%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD1OD$#WBR<^wvom`I-y_+Uhq5pI^dLmKr#pA#J)}i({Bm zOf9de&^4*Y9ugllca^W5ta2dG2WXHphStVid&62HqR(P|f;cV%pcE{@q7h8xMo9=e7b}H0< zpchm0KFI60Sc`y#UC|MngTJ1X%e?!oo)z-oL9^+0)~t}pYo8f43oxx-`v0%}0+%v@ z&n!F7tl>|d$G~9m{P1amo}Qpn8Ea22o??_JA^FES|M~GuyTW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`&^G>Eak-aeC?`!@On#k+%8(H9m)H&lv8l>RQ>H?ss6? zO7GC)-bWtjXat3bEz;WA!iId%RaOR5|YUt9FB8}AI+I8(9~n7-0__0N~!blC003B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Cu5L_t(I%cYXPO9F8i z#y_4d4Q++4-I}*J6e5>U5DgBNih+7t-c zBwAqJHOTn`?~3$YzAx|deIK6pd0(5NoaoFDwoa#`SF6>jnk7l<6Zrl9sR&e6MPSC5 zGZNQ|>tBtvm)bZ%I(?4aE+7a)QJSXF>uIJ0yTP3yfhdZ6d^O3IGnDJ4!6&aMlk^_5 zIKPChn=eZM*o%dT7h*^b34n*gV&7$lM7$8A`T1@+iU4r`c1Oe=CEyB0yJ6;E=v~^caV}5 zj4@5O;PY((;PI^Kkw^$pTpob+`YX9yo=WA(W<~G=2L6Rd@QRvh00000NkvXXu0mjf DGd9tr literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Web Site.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Web Site.png new file mode 100644 index 0000000000000000000000000000000000000000..f29e94ebb428fb6035f9e23c172e749893b7625e GIT binary patch literal 744 zcmVP)WFU8GbZ8()Nlj2>E@cM*00K-&L_t(I%cYY)NE>k! z$3GWshTd|8LY4}-3}!G|y2M+m^}K8eSqc{%V|7U@R0nl1h+3in>(WeaDnZ*0J;+io z?QAj>D`s$zbI>7+|H>V-Df~Jm7{o&97alym@V@VTAMZ(ngU`5$SS%(CW0=0azBc~g z;DB=Z3$|@bH+iWk5C{ZBHamywx>%OQ-rioDfTn3AlSyP*W?^BGdc7{S1OkD8C=}kY zzP?VmT;^{`CXbacePzyKi4 z`wU|k%d*-!SE^N_(f-!h(P%%FYW3D6hB1ufd7g;J;{d2Z6P*;d|+iB}V?T-SA>>$>nfPx$yxv|0F9lu9K! z5{bmT>$;qto?@CQ78e$AJ&(!PQ>4?Qm}ZKhAsr-%<=hHL61CbPnx>&B3ewWj8xe~c z$g)f*6l$ppA!z*i4ZzO(9U?tF+?QphrX~T%<#O0|8Q<~oF}=OLd~kLc-%bNCzMUrj zb(wqqPCU=0TB&eYtF?-oCvDrdBsq>F_AkD%QqJA-IBm?*dFE$rZSBre?zq1GF+ckJ z1?NA{k${isPkcYy=kcQ_JbgGwKA)%2XrO5tnM{UoIL!3)O#3s1LLrgQuOQ3vog2UF ao&Nyi5*S(Xx-v2V00006LYY*dI{LtLZV@}$v+W32WX0|q(YIQv_WHDfz@jh+uk((opGgnsSPvAZGU^X~`)^gS;M9Gz&1TEp>jg!)*EE zop&39x)eABoEQ=$jy*5jTizG2-i&>2!^+H}iIZ&3GhT?QFAX?(;Csy_XRk>)j2m=T tm-hG_kZyYZJwADTuwMMN`}UU~R51y0`D|WXw$~cuT~Aj(mvv4FO#n#3gFK$#RWUFe%2mzno1a|- Oa-yfJpUXO@geCx(AXQ`l literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Windows Service.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/16x16/Windows Service.png new file mode 100644 index 0000000000000000000000000000000000000000..e8af919baf29ead06705c759f3c538734fed0b2b GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D-$ED4ztBZ1E7#>W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6fg92aSX9Iotz-?sX;LI!R_t&|2>TuX0t8VEOW`cH@&!{ zv9+$r*A z$~s!2U}sZ?et-WFU8GbZ8()Nlj2>E@cM*00R90lFWacoG2LWcwlDKshl1F~c)LZwiGw}Pi4L<2!3(6OcE8Zu?+A5ikK z>3^`vcy=$Dj^DG_#AA}I7s@m1gIR|45@|29Hub*IHXF_WLc&-Vv`Fm@L23SlpQ0pKhBJb2iW zg3QB7>~A08#k=Ro6|=|{vw<#(r(m`?8&EQv%}I%2J^D}0^#DHIA&JOzrUASor0kW&5a!yTYfsX$hekd-7LDUc-TehCbNz63na zgXej7P9V`MV2m+XmL=r84I*bwKLt9AbIxH|78qmqV?lW2x~>ZncWyzrxT>mRYEeqN zR0>bMkqL0lK?o7WeUwTiL4q*`+qSW{w-+Efk_D|6U-37is2_69K`902d~ErUIp+t1 zircmwuz(N((=-G57==XSUQjBPgblrxUP>t}%ewV+l?frMy+&f&HZ)BW!Q9x`h10p;<1WR45Z<(I@Tc|fR8R?DP$xVHhw?b2J6~&FI_r zFXCO(G}LM}XqpB>2+HL$3WdVJY>d1aMcs_X9YSewaVhq_z%SMr!rQ_>6AndSobU-G vQmK@9iNg8$?-kDZ!GASYr>7qrj!NV&Tj8T>c0VbZ00000NkvXXu0mjfCC`y0 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Console Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Console Application.png new file mode 100644 index 0000000000000000000000000000000000000000..5dfe72bed877a5a3e0eae47b640e01401df6ed1d GIT binary patch literal 667 zcmV;M0%ZM(P)WFU8GbZ8()Nlj2>E@cM*00I9=L_t(o!|j*PYtvvD z$3HEey5SCy9lB;9nEt?xQ3lgwy$*KsGKU_dmOwCG$8&e^5r(l3O($@?VFC(rwRU*15#3i z9}o*`^UTUKv}!iZMw7A0F%CD5dM4dk*#^L}EPsXoU{;=?{k2WCZ1QQR&f&(9C)vfb zqZ>}6QmG7-*f0$0^*R72-@em1>3I4tmS5e?dLY7n&VmWyX5Vu6tH8AZ(&;n+t(wjF zn)G*zcqDzLaHv%hZ+7XV;d6uV#THmPt+ zV6Xa-zz8640N?%#{#DMFEbt19^c$WDqMJ8VXutpf002ovPDHLkV1ldq BDpmjh literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Empty Project.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Empty Project.png new file mode 100644 index 0000000000000000000000000000000000000000..b7297967fdc90ac7b9505b231e7b015f123abdde GIT binary patch literal 732 zcmV<20wev2P)WFU8GbZ8()Nlj2>E@cM*00KZsL_t(o!|j((YZE~j z#-E)=3n_LFo2DcU!OKd7?jZ>j3i~nYQ9_)L&_k|zT(D%-kJBE8DPOC#JO0hRI*2-(M)sm`3)Q# zycI}X;<7Be;zYc9*?#|QJU1?JA`)!vRzX`e)Y*N|R?QuE>fSzg3uIZg-?_R$5m5vPtgGVmFa5#(vk;~=K>2z?U ze?a!m8aD3cQ79F#x^`DJsf~i z3dUGu2+ld$?Y4U$0iawiqf)6LlgUg4aHBv~)$t)=44iXlnucFLMi7MP+4|GT7qniy z0suT^PeSLUyp15lc*62r5LekmB2rZqlv20-+x`jLw*NhVHxDEULA)7l5fH?CiWdPv zf}xZ&gbUz^Bn?5rM3RIc!4MRL8;L?pCZhsU>b8|-k O0000WFU8GbZ8()Nlj2>E@cM*00eePL_t(o!@XDEOCwhl z{$}Dh@us?QNBdwBpK79u7B@;E64-(?^bgpVylfLw3dN_Q)Q3`8TDFwxQn1ja3uD}c zZC?7)-EJuedpYBZkQW4 z-bOpnG!3Ov39nwMjH;?e?KsP_;5ZJ)$H&lhy{$EehFnb7S(8eo5)Kabqnf6zx0+`d z22@o&b?6EUx&Q%lz%gf6s92YSC z{&h?Q#_5=N^8o-L_QQJ+Z$6+`6J5<%7mJ0mVHhBUARG=O7z{RLvbD7ZS(fqE!W1R~ z56G(`f*}L|`0;e;p#Zx@nQW znt4kFOy&R(4u=s6g)D}4q#bNa5@u!s$mjA{{pxD~0B=8C=B2z}7yDKUur)DnXk3+wYbwsF!u@KHr0DYzXgu{tl$P1drE)Uq1b{sd4Ins;W>`)gXi*7K>So zfBVgM^qDw%;P$wY$z-e)85GQA-|C8zV-UN^gfYDAel^}x3`aBMn*=; zm3Rmk92{&Y-_p_&I*D{TjkUEk@I22_2U>w+?Erwqk3WLf=fwxH4;#+AFW$4%hiVKA zUd0z*-l4^AetzD%4b3E}Ml>3&G#Xt406hBs5eOmlnYD3kvwrdSKbCMctc2Cf?u++M z8xy0SWdHWbwmaGX;4U4GGuv@1WjcYb+88!MGi5pf7XK3l2CrH=ZrdSfg+^+4ecm%w z%H?vEF3R(4*F_Co2H9*D0MOmdmoKG2b#C~^-oV1*0v6524=8XKXgx`6^+%?`LKL zbw_+r6p>1$sByd9-n6h$#*uQPsW1!~#mayewPS-RECYUgzJm#byB zoM+oPkX!^D$IbQj_Qe~qK36+F4|twuySw?a-EIfRwRcwd4WFU8GbZ8()Nlj2>E@cM*00JIKL_t(o!|j$mXcJ)= z$A1??#J9z!L^~vqS+O0GLbY&kSqj};TpUU`4g{Ahot-*`w1Yzsgd>QP5O9@-ZkY-l zB}YLJN^TG&*AHGIn#4gaUed&Tz3P%@x#QmFdH=tA?zxx0W*8Y%g_M%Z%ZpB{)fy{5 z9#0TbCGL3*Jg?Cek0c@^Yh1Uk2B6t&BBktvmO^aou49$6?7V!6RnB&E{QKZD0L?Hm zxNg0p0%T)%owdzX>NS_M(=!%U7C1gQxh4u=KY0V7?h^p4ZLV_l<%+}oBR;-$I6gS( z5$nGKgo7KDN~NiU^Z7iE;{b5}^@8?!yJx+>{Z={qcRB#D6uUjN-Ge%y1R#}40Z^~G zEUqlFy|=}KoqKHWZ4HG`3ZUycu~>}5{Uho%m&E-zj~+kdZt~8kb3hBL01!fu%jL-D z^L%(w8JH8CFVi#!58*74OeQH53REf;9LGUQi4cNRDn&Y-9$GgL;FHvIKGj9Cod?Ur_rVehIWB>pF07*qoM6N<$g4Q7+p#T5? literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF Browser Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF Browser Application.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed8dd8bd52093cb70d223b6fd6c3d00f3abfafd GIT binary patch literal 1415 zcmV;21$g?2P)WFU8GbZ8()Nlj2>E@cM*00iqvL_t(o!^M|hNLyzZ z#(yW~c;a!osI?dV>D89RVxguoPy!a#${1UBQ-$1g+Kj;{6h_M&D|Ka~W30-cgN+SR zZEpk}wduwf>AWl3l|}|#s~fv8>c!U6q*Xt2JSN%2c8)no{L@;x2f{fg-+SKYeV_09 z-tRq9N5^4y0>dy!rBbY|>7%-?cjb>e91dhzW_^8~bUM8wpLKQhIJYwrLa?&3{J=1b zs;%rYnGCwF^Eg;sT-ZE-bUIBknXs}|Rh2*>fY0Z{>-D0lsx8R={(chc30mK3;Xqrn zH5NX86@bvUZxTL!)w-G}8bB(QBAHBNGnovksuBza2?PS0W^()XZ8S~er89>((ALbt z-9_TFamx3WTjcpyGYDrf$&<-M7QpZK6AFcF*%m`A76afwTQkdlEfXD>AoDO|Q(;F6 zn3)3vgF!kwJ8eYs@pYTJV8Y?_6;i_|yO@yf?XiO( z)$%eL8XK6Np0=kbl_0TBbYOzcvoBNMR7ZVN-A?L&TjhaTVnlWNoN24jk*vB1W;8KUDvw|!$9);53#iLDBIcDNiY~> zx6m{V?Y>s$MC%c>f&t|9(*L;@S7!#pCtxcIcg=j=u?iWvdUl*i&20C!byg+mzT<3dgtDibiuFqU9skym%RM+*c z)2C0<($exwWRJyST)uo6MN!5arKL(Yz~toQGn@B&_wE5uTB>wAT`m_(OOJ@fVhACu zH840Z$jse8Y%jj{#;Y7V_IlAVZ_^8$IeUhiH^1Zi$PY!wayuvhm&=7ymSq%0852Tu zojP@D%gD#auQNV=ed8#V6eLO7@|;l1%joItv5^ZQkYza`%ksaAP?DrSpG3;_tWGwY z1z_L4MgZb-3pSgclP9dwEQDZWWCVcn^5?1noXKS3NGg@;1FT*k91dH@XFhs+du?{> zSsf<|9*>9l_`G$3s^w+$oIJt7g9kS{qi`4@1d5`JnN#f$LfkURx9WWJ5eNjVKuXI> zP*s&*e*VRp^Yb5`vyn$45vHc5a5x;e-BsPTj>sf8n}zLQ+L!^G&-INB^j|nfLt}%@ zJ`#y=WFU8GbZ8()Nlj2>E@cM*00KryL_t(o!|hkUYui8= zeRo#s_5w|cO9z{HbZtncKp-GUp>gRS&^-u2Ab2VX)l@umGEOIB3I$;@dC4D8P~RK@0EDF3?#g@4*ff3t1X$Z##r2PCXon{-FHBD` z`FO{3wIQTk-;1A@p5Q_9yGf+#0RULaJr0%Ie+?{wzrJork`!z{N?}+A#seLNN*=F2 zR53aoVWqT!FYkMy!9zXZuCI;H>ZkCuNd^SJp&g#!)xk>?DtQzt`CHY><(`tnCOmle z*7M)AOte}pCu2Vr=tCzFTghxTn|v3Po|mTPn$0F^wHg4RTrT5ma0W^#tQl5I)r5>O zXRIg+XlCK2JcQg2fkdb0za|jqftikvfhfDL2f|*t{xys-D2jq&v3Pd{ zCX@5+BrSNO(ZFyxyqf}($@wH^DUg<%gR+gRKu|`r;8)Du zh{QG_W30+K??sW`4R^UX=TqA^%64`>&D=ZTKH+>FFE2m&3ZNR71Y@lF_uj<#16$Sj U%}htLU;qFB07*qoM6N<$f}oQ*i2wiq literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF User Control Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/WPF User Control Library.png new file mode 100644 index 0000000000000000000000000000000000000000..41d3b2438a67c1108ac51bf845d0dbf6593b9464 GIT binary patch literal 918 zcmV;H18Mw;P)WFU8GbZ8()Nlj2>E@cM*00R0+L_t(o!_8K~OWRNw z|0S!fea%`~P-caq?6NUEv}|rdp?IixTMu5xDB0PYgWhB-~qExcM|lO0^THYVw7>oz|KFMRL4{C@BEzVFM&<#G$?#V9pUuN!uwQSb0a zB2k3H!=Ushn#~KQZzYpcT!fE_EB%K*>;O~du|bx;5H z_BK>i^_-I=3E6DcbFNq{_7{X+MMsjPp1=cZO}~||okYLj%>95L39t8mMqp6jo0kPA zCr6JdHFmm1ZF||3WjXNwz^s59oUJ{-EW4FTWiSQW!JWufRn@l+6pO`WFU8GbZ8()Nlj2>E@cM*00j0)L_t(o!^M|fXq#me z$A52+YwI?lX^X6jOXm zh8WOJ4$#`#N^`UEf=-2|m<)wzY;0g+e1fizJ_f*MUvV=Z{@Vb)9s?$0&hvwZ!(qC+ zy7}P!vrLDk02mw`)b-KDmCLu)^>_|L8rbR;z`S$kZUE-y?q*V{B(=4*w6(SA2BV{+ z^nCIef6m+m;N@4^u&5UL0^jO3iUMiUY_Hx%$xavBtG8h*w^H{~4Yz)|vz(^yel@Iy z6iB&1JRU^|f#2^pfPen!m-=^6I))+yTJkWGKg3eO)~_e!Iby_kPX`*4x{wznDNEfX(Juz5~f* zf@CtGzjICcdi#)z#=`Qn+YP|)6B9WA(P)%&=gv`ITaP(o)<3GEvUl%FUGVvQ2qB2a zqa>3FEU}o}r75zdrKN?I79)tO#09{SBS(-@8gxPkgb*BUJ4#b?Q$gx|J|DqgkXTIa zvLq6*+W=m#*I?xKxYu-0UQxcL&gF99a=8iy;PrY527@FLvD+4{)OtJ~-QbWo}M0T zHiu%eTJ5_5hK7b7S>DIS#sIKd?O5z~ap(U1Ienobl#-5)j)IX73|wGf;KFhnRct7VvTmOc zMGo3K+6~}RN>tU_q^ed-k;v@zjgHaTlFG!%WHS2q%E}4=LX*=5yY}P9^wKP)q`$u( zfTE(UR{<wm9aI!KXg_|8{rmT?Oh$nK zQc7$#ha$vdD+9@T;M!)blWDeE5C`fGAcWxZrOSHG+dJ9~O(_@*GCVwt$z&RGI!jib zVP|J&rqIY;NVH&u5S%`JnyIO2Dk~~-x@9mJ)Tu8n-mci~qVWHMhn2?0hMdY72m}}& z9tObaEH!`wShA@tl!DdM^6Jx9R#xV))8F5Zl=5HNOY2vI>kO=w-}NqGHn^0M@$qrS z#>Vug24J%}6sNNUvpGN6%D#Oy*R_|hnWC!JrY&2ZxSH?O1_qqY(t2Q1g0R^fiq&ez gZWpMkbwhjp0dh_}Kb0$2GXMYp07*qoM6N<$f*GK=Q~&?~ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Forms Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Forms Application.png new file mode 100644 index 0000000000000000000000000000000000000000..d8271685549f05d3925cc330ff66fd06d689b348 GIT binary patch literal 562 zcmV-20?qx2P)WFU8GbZ8()Nlj2>E@cM*00EXsL_t(o!|j(lXu?nw zhW~_4Ds>2Th~Oqvs)&lVf~(-xrK?B?6uP)LcXA5qTquZ?PK7|%Vi4*oI2MDUP>^I0 zN`2v`b|?ux5^42R)_DxPJ%Xf|J|BND~K z;qYQG_%g0(H;wslzBNbF)Sp-q0MqFdw3|kv5Cbpfz*V#0#hme6KVQCQjKJ^rFGxTn z3NeI|L8u)Ky>1Uqj}xs*+q7u)>Hz?tC<;ZB@<1pV#H2q#z1+atql{Liy;5xbsLSv` ztybHqupkJKWf=f4{2Xn}e!cy?m|KCMNiHcjb8Ojes}Af95Q#(p0BT2r%i}_(n8sQ5 z6q#b$5`ri|DwP7mFsPRsP&*pD0TvgR=kNyDt$B)~P%9qTRSt&(`FtLNAmHUzGL2dG z7sqktCfr9ppAV%{36dlkhSbLsjYhZTZU9{KH^fZ&-u;01^b7#Fuilx)5M2ek$Of)&>O*nh!arGJtgyaTqr0d(|)a`MmQ?EnA(07*qoM6N<$g3!O` A9{>OV literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Forms Control Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/CSharp/32x32/Windows Forms Control Library.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fee1f2aeb3e88a39bd3cb63ceef33713f007b1 GIT binary patch literal 703 zcmV;w0zmzVP)03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00JXPL_t(o!|j*9YZGA@ z$3J&HDW=5?2Sri{IHV@n4oRV=5b0Fu=Hgny5fEImbjZ}jPG?da1tA1+Dg?SpL;rz7 zN68rwB_)Sgf~gHhK`(L8T$&$u*7$}X^t;@{d(Znm-}^q_d*3^0ZS5hVU|CJh&%d^9 z`^S~?1A#lpqKY>fr_UOVQ>VD>|MSwO`B4mkiwg_OYHrJZnU$?&QpF@%ev?!&>Ev|c z%VPjiJpO=s{c~Fck(I4wmR1+3l}%16C(O*vaI||oP!u5l`1LQP5QwGKMVeol9OMpp z_r~C8_qeB6{}n*#1mSR)OeQl@VO`fT3Jxl>1 z1ftO>0JXBo?A$CHJL}xr470Jb?n*)^fkYyKs;V614ylz*<|6^(kM1)c33$#^)!ULH zf`HHGBb`p8>pE|@OG9%Cg@O}nng+o1^i32|y$=S1WV2aHrIKUFPJ3dpnCrX&0+sg_ za?f7~Gv$ZMCyIOf0KCe-93;@$gsRmlx~^kc7A^a`lVD2{H)MrzLFpbOR#!Tyn=sX$ zVw_OCHX%*Zuq7Mp!HJ@j=~>}P>Zuc7?w2hMG7zPV=OcJ2BisXSF7;AI1Y{(0>efobNU+T!DqV3qu!o8#fF?$d>&7D)9T~QuWFU8GbZ8()Nlj2>E@cM*00Fm2L_t(o!|hhjOTu6n zem1-bc?dcvdNZ6UG6g~K7DazR*ANkc&IX>m)JfEH5Qszv2?kwb!+${V7!5}dN*#g@ z#@NB7cG{TEADewOte(sEetW<7efPZYo_)Yy2SqwyD8!71!w*Zok|a^Y3W&wnGewb$ znoWCXjQXRc`)E=HD2iO9Jv5T}1ae#k+1e3uTt@`5t_XSDyj@wjXyzVPSli zU5aNRolb-2dGM7c_D^@=W4!P&UTZ>RwSYwo06@3fMX6MRq9~U3XS3PKA)J>$b6kc% zAb@hY3_%beilV;GvMl29`1}^wrTaK{V$1)r^91hZR<|!}7qbhn`lh7eGXG3M6Sk4g zZz({MB+B@?6$*uwW?)s&a2O^X_~}`2o&i!iu>K4dq1Id?_a2ckxeC=Cc h`9$<H*BMznV3%WE^% z<7s2wyeDPj!Mxq>>+c`^_&Z|r$A|GAV$#NkE_W=F%w8LreKyb}`Hy)WmdKI;Vst02)86TmS$7 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Console Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Console Application.png new file mode 100644 index 0000000000000000000000000000000000000000..8bbc1ea344fa92202dccb06a9d9447494e52e933 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D>H+M+MIJi=YT@8nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P`t;}#WBRy{GIdaFbA|&IFn)@$kTpx3{7OrZLgFRjST-G@yGywoi#b)~e literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Silverlight Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Silverlight Library.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1bd97e9410d19d20da751ee01422fc13dd8310 GIT binary patch literal 670 zcmV;P0%84$P)WFU8GbZ8()Nlj2>E@cM*00II@L_t(I%Y~CcXwp#} z$3OpJ^cN9_m)JT?OzM;!wzfl~za8X1hXXe|?GU^C_eUavGC~MqL5E^7gE~|o9VVk- zYAAC94|WsR4z4az2!nF-^2cF+wUb>^(CPY~e($~S`@HXaKb{~-E_#(tZ?)(nk7ris zofGQydSA2G>+Kq+QmKA645yi6n{faZ{PP2$hW4P>+*=Rw8M^Kx2q=mIz=JyvIcqsX zCX*qT%P~kDKze(Nks%xV?+(bWJORLH7MYy8%C)=G15+6Qo;`g|_VpKjQb1NEtfRx6 zzjzLg8kTc9OGlis?@b;9UVqAi)iI4`D6jR-A<`gItj=p3(Tkz zk$WF#{QiS=#KMIM8;R8&8nq?><>C>Fq7Vv&x&TA%V*AZ!jAjwX_!vgB$j0MOG-^$J zL7B<9EBx3yK-YC*oAFL3x&Q#$;W4r*bx!pKWp1PDRCO7r(+R-(dX#81D)1lu1sht+MMsZI2mk;807*qoM6N<$ Eg5qQt1ONa4 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Tutorial.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/16x16/Tutorial.png new file mode 100644 index 0000000000000000000000000000000000000000..23841055e2d838d7af6785b996d8d6d9e1184c9a GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D>H+sR!_425}=T5W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`)4v>Eak-aXR_Wx3{4&#JRPfqeg ztG!FK*zras=8)Z~IS1EYnELSi{QWJwJ9c~%JA5!zT~ew{+^FDFfkDmxPt6MtZk^u< z1P9gcv#$4^At530z^oW3Hzj(TF-XmUBQs}6cJ?1DI$hS*cDI%1{{BA=-G)X6LgF0; zAO2j^Zku`2`{AGeJpVbR6Xa9*zPC-9DC6ZIXIa#;aP?~L<%~TW&TLtjuI{G8GG&MG zbcsWUlK#EFyZitD?fLf~RJ_0U_y1v_i17s}1_p;$sj=t2HNOLem8Ywp%Q~loCIE;k Bt9$?e literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Class Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Class Library.png new file mode 100644 index 0000000000000000000000000000000000000000..8deda6508a822933969975fb0eedbbc75ca7b888 GIT binary patch literal 665 zcmV;K0%rY*P)WFU8GbZ8()Nlj2>E@cM*00I3;L_t(o!@XC{O5{Ko ztPCTreHxux2J$2U_v{;ZY#Ibl9>an#3WD^}lZ#7FU_pEXpCC^X(3?7^_OOR|*{{h@ z_oPjF=7XUpzg1mT{gdeU_$S8J>+4H3ymndO z0(WM>=I?{L53WocFQUOAtP>(-+P&MG{IEV(S8^vA*i=CXK3NJ*U@Hn#RfVdm zwobqr!pr3^NGSmTS(YJ5lF>o+R-i0PNGYMUhSnNVN|a@}I|~S02mv9))=6|MAn-Iz z%{ir%v4m6tFxZ+7f%W?1h)%S@>AzB{q0-oV7z@_xk0Y)1n+@DmA@ecm122lA(R;c# zR6cswf;3GxszUh~YR7~zHm4UAMbYRv=iDqDob$%@V549*JA4N)*IK{TrEbgavW77> zDvVPAn9UB~wbs4BHiDm@|8R4CYn}Og_7$BBFviSWU?ZcHG9gq-;oxA;sesQ^+#!%< z8LqBw@Hc<-+Nvp~uv{)NjrQ?p^?SSmNs?f-dT8u)sC5lh%0ZCD$hSg;FrtrB-|qq; zgx4t9+NLxFur&j5yoma4uCE)6vHAZwWK?|tT6`)M8u}A{00000NkvXXu0mjfcitbl literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Console Application.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Console Application.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd8c449a7de03e0b4342e219eefc97268fc0444 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwgm6<`0wXfx7I#5V9GbEzKIX^cyHLnE7WngeFN=+}9ba4!cIGmgyk#N9cCF819tNx$7sII#7M8Ss#dTz@a zKmFXC{#{Z62qIRbKKS$}S0ZVm@ZJYSAi~5bLD8JUvsA*U_YKD?cgH6#`W9|{tR+(O zI1&{N>i^Yj((&=}IU>#aW6`s3Z*On$Z)tIAXbls4RLo)|u_348_qSZPRc#Er-WM#@ zjF@#$k~Q<>%#cEXU6z}l`5j-ycbIX9$R#eG2q_5@z63>8y@`vLE3EHO)KQvp@YJbE zWqcmq=Z<&?8yGq(*S0-A-WT|WVbWrTXA0@*>20&Gzc<)Z`+M3xz6RIMo;5tpJ$p0*`uth#3N3@9i)UHx3vIVCg!0B`H7rT_o{ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Silverlight Library.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/FSharp/32x32/Silverlight Library.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3823ad18787ab1d7e10a80c4cf9c92d4e495cd GIT binary patch literal 900 zcmV-~1AF|5P)WFU8GbZ8()Nlj2>E@cM*00QVqL_t(o!_8McXxl&( z{_MD@8$UJQPZdN3BYrB`6&-NTYLP zyR9H-Iz%QVN#zj7N{3d5?b?ZB*=`?*` zbKm0tJS673&ws6H+e>^;+g{>hBqIT+)oNYym6esDfOU=$h>;n1qrV-v*J)uie~^K3 z`nS^+k9y`j z@@e05olH(82JVxw0I1b!{23;e#tz`0GZ05o4+U5p8Rnkh(GrjRs%KX0y`) zu)e`N#~nM5M`J0ACs=cBt~Ny;R`FvP`0qkMfGybr?=05CiI4D<7^63OIb aT8Cc`vuZ0*9$iZS0000WFU8GbZ8()Nlj2>E@cM*00M+bL_t(o!|j)`Yui8+ z#(yWtxKS4;!WkS0G($WF)HUEhGr4K1)nh0WI)suC;w^iYluU(!Na>=Ic2LujzaXTW z|AZC-@z9`bIb+OO9b5^!iA591b%#C>2dAg|K7IG;-IJ(PmPi}T=6QIR=Srm+G{zXs z<~c@|3wke)ug%r=tMR?sel;GWFw#hPTVnlVL}DacP}{G@SHB9sj{u@lS&9`nI5@Zy z;M&?+;ua)r&0jHLk^;sk0h35XG1kwpRGJaSDBpaTry|dcU4fwe6gtrp2?_xO`_ z-ng%?<&0f{{{;R$6G|x|R4AbkN&pb*A$q8T&__$)x#j-4FwHmf``~T0H{yCsh(H1J39nHkclU> zR!eRGIF1v)`CIoL@~Xww_6A$q8_25`hu%kmAiy+D9LMQB9jf#SwA<}H0Nb|X$(5(Q zLuI}^Kagx$7E!M2x+tO0(X;VD|GuxTJ^|q9=rdnF9S@M|&lO6L5*))Ti2jb1Qe0jJ-#VSngT(eLm-{|7WzA&)KF|;7x=yh;Jy$49ipZG#kUh0-zogFSu#3dO@pXh97cz)byz1kxS-t7zxYM1uO<~p-1NO~s8@T27T zR=u?wcd*R6wpC+3Qxwm2*^U#dxwn;^*}b0YiQm>Yvn-<5=^wM360xBs-S+|0zIYSn Ti#c!YL2mSP^>bP0l+XkKsfl0* literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/16x16/WPF Toolbox Control.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwareDeveloper/Themes/VisualStudio2012/Dark/Images/Templates/Project/Software Development/Common Language Runtime/Generic/16x16/WPF Toolbox Control.png new file mode 100644 index 0000000000000000000000000000000000000000..494ac24ff7976de1ba901a4755f50e6322f45444 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D-)xfRO*)Z#y}z2%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD1N}x#WBR<^w!{myoVKdYy{S)aqBznTlvZ7`U6ilhr~|3 z##y;Kr5$@Nhc9hAQo4H8w2Fdl?{kuSzUyYqetw(l;I4N$aqs=O-u$j>pBhv)!y`al zMv$rDH-vI><=EwVY%$!kiBe*={(dTWKg_N1P zqw~dDgBo4A&c67&=Y+#r_WtKNu{mos`5GRbVfow~>ZGJ3rn&A3hvg~(O`k7<>&kwgm5EVYQn#M<08mIaGbEzKIX^cyHLnE7WngeFN=+ADP2zR9adEHoj`h(^J^0vwVx5{B;;(pIN; pfOW}|C6etf90r$GmD{8^F)%bP)UbJOw(keX<({s7F6*2UngA58Xc_<>&kwgm5EVa_R(qYi$EdS%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq_xf)5S3);_%yWYrZB2fm(^xD>qzixipPCXHlz6O998Z z1BzxcF5Z5Lo{QFoT+Z6+Cd_Q?qo}fH+RVB4XK&9bv5-+b__wY)iDldE*el;_TkVtA zmacdml`{SL&J%fcvJ$HTZY?}nqQDhxFzsoWPe1c5$tcS&-}!Vn*O(YjUN!qz-NnYA zFC1np|7Ip*m2bCwVVL65Z`}gE{memIm6fKXcB**3k$ti2xaaE=XI8A@%DsJSih=KC zVdMFX3pBVG8otZz{`Kqf!)fpLzd0lGgXi5GVQZ`B_c~`-3N)GfDzDPI(bBT_d$az6 z%>0AvyM8Tr8<>&kwgm5EWFTTK3615ijdGbEzKIX^cyHLnE7WngeFN=+s{e@#<%$uRs1n)9c@+w%;fL``NGrH&t;ucLK6Uc CS#gp8 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Catalog.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Catalog.xml new file mode 100644 index 00000000..3dbd330e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Catalog.xml @@ -0,0 +1,20 @@ + + + + + + + + *.sel + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Setup.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Setup.xml new file mode 100644 index 00000000..3f9484d3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/ArkAngles/Setup.xml @@ -0,0 +1,20 @@ + + + + + + + + *.set + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/InstallShield/InstallShieldScript.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/InstallShield/InstallShieldScript.xml new file mode 100644 index 00000000..e69b5d64 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/InstallShield/InstallShieldScript.xml @@ -0,0 +1,67 @@ + + + + + + + + *.ins + + + + + 300D0A + Stirling Technologies, Inc. (c) 1990-1994 + + + + + + + + + + + + + + + + *.inx + + + + aLuZ + + + + + + + + + + + + + + + + *.pkg + + + + 4AA3 + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/Microsoft/ACME/BootstrapScript.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/Microsoft/ACME/BootstrapScript.xml new file mode 100644 index 00000000..7a10f25d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/Microsoft/ACME/BootstrapScript.xml @@ -0,0 +1,20 @@ + + + + + + + + *.lst + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationPackage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationPackage.xml new file mode 100644 index 00000000..bc286372 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationPackage.xml @@ -0,0 +1,20 @@ + + + + + + + + *.zap + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationScript.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationScript.xml new file mode 100644 index 00000000..2f81a2f8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/SoftwarePublisher/Associations/Setup/RebelSoftware/InstallationScript.xml @@ -0,0 +1,21 @@ + + + + + + + + + *.iap + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/UniversalEditorDeveloper/ProjectTypes/{13A1DBF5-B527-4218-9442-F1D165033AEB}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/UniversalEditorDeveloper/ProjectTypes/{13A1DBF5-B527-4218-9442-F1D165033AEB}.xml new file mode 100644 index 00000000..2a2a47f8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/UniversalEditorDeveloper/ProjectTypes/{13A1DBF5-B527-4218-9442-F1D165033AEB}.xml @@ -0,0 +1,11 @@ + + + + + + + Universal Editor plugin project + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/HDMV.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/HDMV.xml new file mode 100644 index 00000000..a46241f8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/HDMV.xml @@ -0,0 +1,26 @@ + + + + + + + + *.clpi + *.cpi + + + + HDMV + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/INDX.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/INDX.xml new file mode 100644 index 00000000..70213169 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/INDX.xml @@ -0,0 +1,26 @@ + + + + + + + + *.bdmv + *.bdm + + + + INDX + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MOBJ.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MOBJ.xml new file mode 100644 index 00000000..6185a4cd --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MOBJ.xml @@ -0,0 +1,26 @@ + + + + + + + + *.bdmv + *.bdm + + + + MOBJ + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MPLS.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MPLS.xml new file mode 100644 index 00000000..32c64b71 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/BluRay/MPLS.xml @@ -0,0 +1,26 @@ + + + + + + + + *.mpls + *.mpl + + + + MPLS + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/QuickSub.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/QuickSub.xml new file mode 100644 index 00000000..4fcd37aa --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/QuickSub.xml @@ -0,0 +1,25 @@ + + + + + + + + *.qst + + + + #TPL-1.0 QuickSub Text File Format + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubRip.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubRip.xml new file mode 100644 index 00000000..51aa61a1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubRip.xml @@ -0,0 +1,20 @@ + + + + + + + + *.srt + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubStationAlpha.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubStationAlpha.xml new file mode 100644 index 00000000..f77d55a7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Subtitle/SubStationAlpha.xml @@ -0,0 +1,21 @@ + + + + + + + + *.ssa + *.ass + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Video/AudioVideoInterleaved.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Video/AudioVideoInterleaved.xml new file mode 100644 index 00000000..8d407e09 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/VideoWorkstation/Associations/Video/AudioVideoInterleaved.xml @@ -0,0 +1,20 @@ + + + + + + + + *.avi + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/AddressBook.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/AddressBook.xml new file mode 100644 index 00000000..5d5b655a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/AddressBook.xml @@ -0,0 +1,20 @@ + + + + + + + + *.wab + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/CascadingStyleSheet.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/CascadingStyleSheet.xml new file mode 100644 index 00000000..6e8f5619 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/CascadingStyleSheet.xml @@ -0,0 +1,20 @@ + + + + + + + + *.css + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/HTML.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/HTML.xml new file mode 100644 index 00000000..b558a7bf --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/HTML.xml @@ -0,0 +1,22 @@ + + + + + + + + *.htm + *.html + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/MimeHTML.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/MimeHTML.xml new file mode 100644 index 00000000..ffb8fa48 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/MimeHTML.xml @@ -0,0 +1,22 @@ + + + + + + + + *.mht + *.mhtml + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/WebServiceDescription.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/WebServiceDescription.xml new file mode 100644 index 00000000..98369212 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Associations/WebServiceDescription.xml @@ -0,0 +1,20 @@ + + + + + + + + *.wsdl + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{A0786B88-2ADB-4C21-ABE8-AA2D79766269}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{A0786B88-2ADB-4C21-ABE8-AA2D79766269}.xml new file mode 100644 index 00000000..48998107 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{A0786B88-2ADB-4C21-ABE8-AA2D79766269}.xml @@ -0,0 +1,11 @@ + + + + + + + PHP Web Project + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{AB211699-2C6A-4FCC-97FB-F629B1023277}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{AB211699-2C6A-4FCC-97FB-F629B1023277}.xml new file mode 100644 index 00000000..8f75f59b --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/ProjectTypes/{AB211699-2C6A-4FCC-97FB-F629B1023277}.xml @@ -0,0 +1,24 @@ + + + + + + + XML Transformation Project + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.ico new file mode 100644 index 0000000000000000000000000000000000000000..3cced8c5dfa3e055611821232d36918170f4fec9 GIT binary patch literal 4150 zcmd5_blp+JApsYfWO+g~4jcf^F&pC7M4IoWVB~`Q4-1;wp%YVP` zKg)N{35W9*=O>)E-{#QgFE|%|%Hh1r;c#~CGX9 z5b_YR5hMs=1R=tQb+bR--vn?Ep$dVBN)QSVauKo+G7vse&O7}GzYPp3greG*_CF{dZPZX`%DB9e=pvSL2G(-PVM2JfK-XPY1Rv#m@z4e%22 z>B?;9_l-rGoZ~9b?wVxP(sT;~_o;rz{*KB#9l$KY6v8CpIKmUeLBu{p{-i!~Tz~$^ zpSQ>BQElN8zyjhN;xr-=Jx3fxq`14->~pr>Lu>o~{s#FvzzX6bq84!m;d{hM1Vy%> zPoZ;CbE6W=1 z??Co4?nmTs8b~ky>dokE7u_Gz&FJy};R?R+6?x@%haLW%Wx|j!x375`J+1I@edsei zcT6Anbir>#?>)S5Wk7fFvF?1I&f$^HzDH-*sUvY5eW0~&)qd8Z{X{iSq9-}h!A#)a za6cXWT>k)pa+5ULOfp5RN327rMN}YEv$cWBLpdTPhMZMA)rmp`8G>cA8T?3(GjS7( z?FbJLTQ?}M5wQWGo~5W^DX5mP6hIVIhp4C&vlO4)H-jI2)qy{`*o8ou)>tT})gTkq z<=?5zNvW15Rb<{O7bnPtH;YoEWJx!26GO8Tg0teelAA$BLk_iQP5bAjkF#KMu?MjW zu>;{DLMvhmBKb;*z#2lnLaLxfUsWR9W$PkYK@?W4X3ihy_pR{dB2}+Po9C~WrPbvN zYjRQ)QbDEUR(X0nbN-a50zpJxVpujmI4kbDBsPdjFHszMVCMY%0N0FHOOFxy7z!{N zLdBIL&Kg1yM>2%MK~_*vr*M!V6b>?kDE{`)4F2t)OF2`^RIVOxo`1vtxs3lSC5dI? zc)5r@e-fQPls!NBKhT(0Uv=nA`#*_$rSSFg2qG2i0mOb}Dt!;aRyZiHjH%0p!)OSl zt}z^Vs>=+1a)@X7%;p{RCl{DeXYvP$L=*>10xu@(SDDbuf5Ei>#gYCk+EwaH6KrcDLx`ep`c{hpz#QH}29(MEH zcgEE!_TuNV3x|@=9pGI$DO1)^>XIQ;N!XyH=b#zhlAdU+nad-)L0!NSG<0Pl80HxmvTaEJoF8!>~QpBOf} zyiTothHb*C%-D%E|7SvEa&q^f-9L<5c5knw}aa> z2!9_lgHMHPYL%uH(6JQCjMx-GfW6$&z2Tft>^>>-os4%G4!3hk-~Fk0_mSk?US3ut z5Tan~6;jJHou5=2=hlEm8$At-WOA`EJk#rB`_)rjfn2FywZy$U(Lob^R+_Z`c-|k+ zrdkHXoE=6mYLF;yjGMtPON(1Dz%n}u>8WO_N_g^+ZwI3jH5t6;nWAofX4;wQTj$1N zzCKm3$1CxusDe)d*`lDvZTkFo)A`E=piyfDfu^l#{d`8fFuEs2^}4!G*FLqRmT4s1 z1p9u$Az6Y=oXAr>_mY)4Q?G^)%;HyNCK>?O*lCU^$dIvDL#4{B+K0L7@x}<*)$jVE z?Xxc?@=hyKLVAZfS(&3nv(`eX{Ya_ZZ*G22WGB;vXTU8AB#ODk`L2PcMrA>XTp%on zf6k^^ zQA)3yz;7rN8}aEUYX$t!S8r06)gVJ5jlHg$o#uIb(^g+;eAfhiQ*p)?{yN~Y0d?yz zvj#6$4dW|@k)?IDeyww1twp;=ZGt*c>GVoYLP!$Vz3YD6){7?aRq{+_aYj>7dV@?% z-<p267w literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.xml new file mode 100644 index 00000000..30dff7b1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/HTMLPage.xml @@ -0,0 +1,34 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.ico new file mode 100644 index 0000000000000000000000000000000000000000..3f06aa7322a713b0ea03384de5ac3c5cba27b003 GIT binary patch literal 3618 zcmeH}2T&Ae7=~XJdyla<>|Inqu|;f1QBb6bVxdbB;Y8!v8zd@5MFBw&>0Lk&=^O|L z2r9-zorENaiXa-5qu<@;+XY8WPBO`ilbMX)%roEp`~JKC?#|r*EYJ?^(Wf`4cY$6< zU_1bM`Id257l2R4CepD!#0Y|&_pvh5P=V;TcE;o8)`4u;F-@()cQK2@)93)0lQFn`2dmv+)){P z6e+XTUI0 zNEilEf+0TF=Qr?A-vIAVHK5%GSKtlMn5{Hx=8Wmnrc53`ZVYI=a^+?dVc`D0jzK*um3bmz+RTnOpuQCU`VN?VA z_3qKFOD8!wx%RwalO|0VJ9^Z};e)^YqED|5Ts~|_|GqtYbnn`^qa2U>o3PLLFJSjn zc|w(Fb5B)QgqgY$%rq2XuAu}Ac8}FmhNaeQSglln)hZQO6I-?C!diPCY;@+scFjWA z>Mn#mv2E=l*y}BVgPtlJ^cQ2h!4fzcE=9pQc{m!;OIWuYJJzp&^Llj@noPh>6AkRz zsEOU1SAlP;gFQr{`AqCJTaEqZx;SX1heOr|IK0&mM{JBxWWNwc?Tm4ZD0bGst^NAA zk{>`{A>_Wp|wwC@vsj;JGQ{db^_ z!x?pfyHHQC9!L#1hx#Bs>Vx@63-myGuqW!t39J_yLiZyh#EbAoL-;{th54W{;t;aJ zFOnyYKoIWB`9cusi|oitXpC_|6Oj|;PrqG}6YY=Om;f}#9!FE$apcC5PvYH>7Z-%) zt8Ng+g^*)HTO324DM$#1_?kP!N$x02jKs~PC`gje6CNnK9t}x~7mAZ(AW5Z8K9Z(+ zLz3o0Uh?6*bcfs|&G3aZ(-(Kr6Ub41oTo~%uHmlWI(h1PtEbY)Q$$_{9u{VEZu;%5 zlga|gO+n-)>f|TpQ7{pLa?VpBEuJb5r_Q=6l87Q-MH8&IV#!&ts3^TpJ-)?XPZP*t ziLDMxrk;YzveFihRc27nB%e`domM3P^E{g%w>`f>PRk|oIJdoc`sh8s<&)zIIM4B` zCD=potI0brZxTh|zmVV<%S#DfRaH=z;>;^4&JupF8Th@CBCLjmK{$(uK`cw{|KC*w z|9LH)JYn3}F{4M07(Q(9pnE3p3)q~5geeC|W_2TmM3&P&(9NP%gQgvx1LW|kd9+ZD~;yC55 zlh|BAL1Fr|sZ%D78am)F#pQdy-r-=s)xy-oNLO2P`4U#{vz2Dfpc>GcJ3HE0TWmHl z)YH~dTe4`uToq-dS?}^ayLpsbnr<}KU9F);Ujy^!C@U$x%l~G5c8yP0^ez5DWdR*N IHSaI@2Td!iQ~&?~ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.xml new file mode 100644 index 00000000..127c0c3a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/MasterPage.xml @@ -0,0 +1,48 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/TravelRequest.xsn b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/TravelRequest.xsn new file mode 100644 index 0000000000000000000000000000000000000000..cc5d9ef771fe8120e0384f5b118d14f1b51fdfb7 GIT binary patch literal 15855 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 z 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e628dd005c1f4defa2cef4d6ff5ba480a330ca87 GIT binary patch literal 861 zcmV-j1ETziP)WFU8GbZ8()Nlj2>E@cM*00O~DL_t(I%WacSXk29! z#ed&>Z(e3HGfr$8Vl@`qMq*G}t<>m7q2f-&l}iOzE?g)`p}2JEqFV)n77;g!U>6oq zDT*~+sIfJTsiAG0QktY`X5PFv@B9C`h>T|NY%l!oIfr`%z?%#0S@Y-OhbHSR&CJYR zKQy)PMy=6Y`D(ena_YHG<)4{=&Wh@EUnB!p6yZK*Lz5qWo*z+utb62QLzVGTad2vI_mju7KXBB;iKG>&$v z@*ZQfz&fgNygNd$8dqdEB5IWi{UYb}r)C+c*LmmSZEW5}ZQR6eZ(_S!*w)pF01=?=$RaKG!ZaqAXAOF{@FX}a5iQxaEX80!!s5R7K6ThcBA z->%%`qbKj>nel{o&z`4h6;TuqIgtIG4)P3}cRBaVC0>}GWNs|st=Td5j#gOjWK^ud zYlTy4H^3={mjzz+aZ*x`;idUAw1j2;*K2%z`8pqe|1)Tb*9s$xp+hn|gWw$2D}qtz zvd`z2Zx9>F2j`YajKr&wU^Kcv1khOqMiZRFSsA?1A}C2Hi{Q&b2vuVHIamWi;FR1Q z;mq5wT^Nly>$M8~eqJbTw5ZkbAc87`SCZiD;C;L*2g?U_b}n7`WbC0wU$$9itG~VR z{^n=zosOHWm1v~4iL*pW+KB7TO57SpASf=L{}i}Aurhu8dG34Q!O=Z)&%O#w0!^SA n)tk}K|4fOy_B;;2_&)vy4ZnSXqmC0200000NkvXXu0mjfQB{WE literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f1216a84384494c45fcbadfe5b34a83682fa59c5 GIT binary patch literal 2137 zcmV-f2&VUmP)WFU8GbZ8()Nlj2>E@cM*00+HEL_t(o!>yNVj9pa~ z$A4>|bMHKRXYRB!eLt)SDj|R*C51{Pkr)G-03m*n@JSO5AMk@ll!Tbn5EF?p8u5cM zQ4>Q95o5xa78Hx6AT0zaE!qdPMW@r5&imeb&VH=rhjV9W=?jcIIXQQq?7P>0t@U63 zwYPB2c>LhMZ?DZwK5(KPC)YPe|1(#VZ_lec@{`-HI(qK9ozMK8NABFg|6|CxlL!BH z?9qmm-+$>3zn!RO61HsJ>ej5=;6~T3Z4CAIPc$2YZ)aI{jC${Tr>16)1UUN58#f<5 zcMmf|ME*Ab5A8Yr=*hN!^s{S+c;lI;=8hdd-d?k2O&VLZGK{TSrDLl`bgVh7D;g`L zF*ukdae1NAC_|Vt+@YxYj;qyAoSj>E{(Djqrc44vTsHCy1mfDsj6Q?3Fg*YI6BC1~HQnX*a`Q8xl(E%tBRdEQ1 zrWUZq#@a2PyFGt?@4mh>WnGR>dmD}u<@&a?$A&|D^FXa#>*-14bx|`BGpT2gJFyR& zg7W|*6M{li6DQDH%hWs4#fGF|KGZMCfTpfM8X5)Br0NMdKCC+jq8uCu<^ zwKLNa;NiW;dF#@ml7nIWTc}F)|Sp2&$+ru^2!TmXcVEAdcGbh@=!R z&jB=nFDo#B8Dx15;t;?IIH^GNI7bl3oZuW(D`XkGc0~yhFhxXg7ZIon03=^7t5Y&? zd5%#T7KEie>>L%7CEALB%RplF)wybwbJXi~O0&xYuoNJamG^)eWO=O$1zmzgW!u_e ze7(l2vtcP#6-S&S6)ocY45__dg(5_D zedBJL^&Dr3*&^_*1CyNU6wFVbrJR|>g2&1N3ndyn76J|+%gLO(AOh!oF^v_0V!)zD zgD1;#q#J>|w_V4|{vICs%VF-=b%On8JM6r!$*HsRq_V(?1652Dri!V8DP{^;Ms|@N zbshi>fmC$RvV#@{T6A#T6eKk^uU^T-T#H@rPO<0%KRh_Yf$4%xeZp6+9_7|`L*%B+ zwb~V-HDQ|2q~J2LD=DF+h=qVkm3EC0k-^FXHBe=?446SQmxk=C z@bfR;z+0!M`O*`AqApqiF#~ZIjllWMD0nOsAfO5*w=ZMhQt-AMQq0xgGlk*E4ICcv4B^u-VDFE;Vaq0IZ zBd}CLCKU;jqM@uxDZGu7Fx5#4T$yfi$6MkxVgx6cRwPQ^qndE3Dk+N*4J9>=I0TIW(a4`)`xmjj2+^aV#FAFgv{X?oczo%v za3V?xG-Bq!suI%Zt9)8o&MPTZhNbGDOQL15Qa%d-)6`8t#N~A)Mapo+Zm5tFIK|Wu zO%(^Kd@LKc=plGaq%sx*8UuvzK9H0kDM-~VNU>7J%K<27rx(o>OPD1UO^N7B1H{xS zjx3c|3?PDby(V}x1}v1-9FQe4cL|=lt^Sfau;<6$d%Tg$KQzWFgsP^#AT(B@wVvhP zj;U#vu+l9xja4K}Q}>8}zU)~_5PkN+E6D}z>B#SXdUK<%e#T-@G)hvH*?qg-XpNsd z+3FOFacGRZF(R&~*Kk?)Cge<?=sd3Y7pRSEw9C@$$ntd;0-&juCLv^IqO@o&h_?ec7u)8u79xR>b+HI zi(sLwrJ2bInxpRk@q)YIxnt;)H^{)s)%RPY`I|GZ?782fKcTZzXMq9;-3>nY*6x!5 z13(klSX;f}WAzOm-&7nqI8Jly_vysp)C-|YR-A(ot#j?I5F-&!wwf1B@ppXYtv zcW=HAmFgkYuT;Z_tHd};wfxsAm5EBF8a1l_{)kxj5^H0{nwW|w`q#zqz}LD@E$-2`7kCyD0w9XnHs(A83B@?ifeT zWfGc|2fcc#j<{2B(47>)|9Vms$x&f_`Ra|VTXSB-3Bl7X8+5lO4#tnl&EsT2k%$e| z5nfz6>_zIH9h9WUk(qp&wp2AoA}Y`nm-D+nM2M#vzSXuh4TLydRK)3PWr}~rp>5>u z-A;m!9VHi%$jL~eGkQCJpOc39k;;|==lYG*%?`V9Wt0Bhu%1YuJZ$Hq3wsSdF;Ek#JPndZ=iOHA!{*BcYhA^u9RQnAFzqR0n!*4M*%Yv02i^%s{PPxw# zG|vBIL-2E$2b(b6<4I<1e{}%g5TKzt-*uhe^uAeHU$d&*gO!)P@kq5Nbk_p#Sx%<& ze4dXO&Fh;V?W@pS8pz+^FUOed0N%N@k=UCj$!Jfbtf!Eq3tI@cn@X$SOg8N@AvWGm z>8Zhfa$Z+ksL~Y1y%>_Si|?-OC#@j{+x-?q22Ew=!G#2@H>KpL8(qzHFSa$^yxU#5 zzf}CaO5bv8VpQS5^XD$8iAZkeG{8Y^Njl5Yq7re%8*A8nWP9M z?WKJs?2#YsVKF`=Opd}@h20SMa@2`u^dnU&=_}8fQNpGPljqU@ub)>y>`$Rvza87{ zOt{ZB4tZ{6zsm;H+rGiib|pJE+2FR;3a76=#bL!q*jm5OrqAag&SAN|2mJ3fH^yYJ zPg0l~U41331?jZrCDWRlL`!x8%~|m@Ux=gmTnx<_(KMZnqA~p>8yC<0ui~df1fgrJ z6~}26U3C?7-PF)kT}o%=RkSyX(3Tg{QJPPC$wh_3mL>1~V*J6Hr+;^l?&f;B8*id( zs1_V5`#IE_IWTW5J7=5V_||iZX*ETn9AzEi4igGseLfzSP|DMmzT9 z9pwHH#T{*%;Lxh%pYdb1WDkY>>1Uieb;J@s0_K}%U)rih~#vG4rU{|kopzj!fI@Z~uv z^OyMYGU#p?C3a1v*t2a-%fzpZrLU5j2RCThD>zhKz9=4(?@EG$$VcYbE9#-wb&8%4 zeIa{O4UOu3|%-N8?#Fmzm5UQAPF^VrW4{7RDIMkF}R$?ph#XB2{7CrRJ zdPokUH)TB(UQ&P8O+)YvxRQsV{wo&0rs!adfYdy!xsyYUoz!Vc2Jn@MpddLQdqUvp zdt^@t9poMncF1EZU&g(!JZiu*XfH>phvZ{rJ)RHOOf)Kh)cj~mr@}$J`*EwHjJom? zYDK5v4&l>f3veZ^XI7mJc+w|CQ=B@fO zvz9$(6klpC@eLdfH)%Q0&`HoOErE4fd}}-K`f-2SUF}dbe>d*0EQlP3^WK+<_pqR5 ztK|R(nX@79Nzr3?ZpY)8ZydoSn?D-Gmzo>!E1Ite zpN?nfG_nKc((Ej9w_T3b{$quMPWiiegE?m>V7lu`OnpZ1iqi<5Up3q){)1@l@4kR+ zZ!2^@D`@euronkJTH8e&bDqUVdtYEe&?wCPMq}nPiYeYtG0k}-&wu@>QG8LjA@47R zXB;SS|Ah7HEqT>rHWN?H#Ps}3W~R@JzVR=mxRdTahxKmnG4?7rz&PGGV8UB_o@T1;2yD~~?i;@( z?-;>uld;E8JTdiO3 z4F?+|x!9D{^aJaY{)I!NHOYPxi1B}!wSE>X-0=>+uI6Ohn~}G93V9)pG?iUa zuw^`Bmt6lj6W^cg&-Z0t#x}mo^56%dw`=}39HLhfZTmPWBHvYMD|tD2HBs2B+)z*$x0s*lsmPNrTn{0+H z2nbOD1p$dGilBn5A_74`7OQMRLI`0AkcAhr+&MRk)o+~dn?L8~JG^_(@11kcIq&=) z_c=Mc9$@&`J2D)dU04VP!zg6_1_+G?e`bPA-oQbK2#i@EW+1PDyk(q|`)0%a)^MHf z1a6nwySuuw+`M3o2>9kk50;%5%Ykvo*=rxe`WxGA1hLTH>g;Og#9Hd);p{+ka5oJt z^7Qg`VKF@2U7Q^jPg&&XWbf|c?!j23zby4|V%jl2vHV0oUNKp2gcgG-^A)Bhoblf$ z#MH<0fStXwn-gQXX)jRvzDjA-E%kPD_F_1@+3#a{5_@+?M^Bd5^8ktUf2s_cmrY3> zjDwbk(8Rljg#{@+85Tw%m7VHr@9wr|`6{2~s|Z9Ve_%`kAx{Z|Og7HR?XMf>a6#|B zFrV_meCiAHX)nyDzc4q4Iq_>6q#MY7WW3lR1`VSBZk(7xhkNNEFYD+DWIYAx9z*ns zo04>frScB2-nUiHHcz$@HmA zuaUqFqYrA7;bF(FgrR}@Apt04N5cE1eS#-PkpO-Z5XH_)hzj*%q8UhM17(67MI^@- zY2$7orj;7KRv7x-fok)mK z=^y8-Bco$OQ&S_4AtdbS60|;vP7LvD;70uhISvRqpEO;`3K2|i53q+EyC6r+cuD66 zk#nxzf*haVw9~N;8BF`S8FevODf9YdLlMOax5=Z zWu~4i;3AxiNz$@t?(nFzUl@ZV@Piz=xf!WRvEC%d-G&_dNRE#*Irn)^(O2*g$x+;y ze!0x=+NQ+Tu~Cv^?zedr?L}F`zIm`J?)Tp8>JpiOt3LX?3k@Jtf9~T&F7+Lqhpg6b zMyR#AqO7ct!&f}MXt`zqLY245@8(@P&&d%_eYof=s7NWM;a;t-R`fx_tm15hZr{dT zwFRww%_Pa3t62D`w6$vVLgzHBKP4Ovl=TtI$NGTZ$)P-BQrMj?IuZTn9_7 zE*vPwd?SPeMBQ?O19+fBu~Ki~pRbl_CC3g)k2HL}D@!G|`i7@OhA zNEZed^5R7dqx|(6Sh>Py|t%`=0?6}pdtT(P+v+Q`U z5jyd`cXYQ-#3mXjB z#V`N)tJ{&lAiu+|dwzD_v+eVRA1;`aX22r0d~f^9ul6jKJ=4M7>4!Co7B6^z?hXSM z_{&b~O`EptbZ|T1WanhF`0pRiW4t>DFkx4FYs;g0e%1Z*;=+I(%>Asrdp3W}0Q9|? z0P9+nbmasEO)ixkUBAwjx$kFY*Ry5s%$;jNz$PV4sa7Zz3OQXq?EA^$6*fDWxS&9= zaQ56ci0_9={sxbvkp+5Qpz;vFvK(J&LF)vdp zn)L4xl~N&7seJbdcm)ChpC|aNg}{Xh#Y3$|t)i5Q(P69#A~2sX5M*SKLJs6B6jd7a zXUmo>S}=dUR&{hM2NUOlmO%mwbL8?e*jFwa85-ytRvk*=s4<^kz=O9lfiKDBg_QEM zWgio35%$6tj(+^v1K)Jy{faZ#t{HnZbB_b06MEsT-K0m+UZhBm3VZS~uAV5ofMRiC0bw6%d z@tMP(yfza7nj1<72Jv9gwfKbizJ*0M>O%X;SgfK)*yR z5_U&sWh93B1#rc^_fEuyxDxYLsdQ-2fc_btf9-VSQ7*Qzkz7CS<3!*l>Cj6XaJiUm zZqAlmbaez+T{kq)31yT)AFId5C@L}^V7j^5M#AzW=GBA!t%L&Vaf(u^)!|%;xs61^ zHka(}CU8Z6UlZ0CI3UOBSOT-z5=lV;Ddj*(UvHg8?QFMWtM!HrSRECXi-~hd_o%+d z@AL|*)xZIzd~{eUSBKrr)nGQ;##~~cK%TI>LN(^RcPFtPz(HXWh+ATU2XeZfl>qf* zBf~%-@tChaK;WD`V4%R|XB~GGGG{xzwW!VOyBr7`92h9T>uAdZ`aoTQ1>Ln?gaQ&M zn}GtEt^Ax3snNFcfjgmqL{EW}u~C=7NZi}g-PPG%;b>}X-hf05%y`z()_Tw0q|EGV zsH?51esI6yUin^=5%xZ%*()`dn2h&fE_?OrECyn|0hwbKa3P;O=YhCddsd~U4yf-Yg8Hmd-ZZ_tDEq=fgX>_53XIee2uMda&>*@P<^)R z#xFLkC5=e_uQVL|bd}{MW@0VXE0mW8Y+d`s#*LPwji7iU0Ti$G&z7c)gc?fPuekWr zGWb`v?jwM8;%r*BIP3h`WNti%owh%!W(X^)sj)4VmMaM^?8(l~1T-lwn(d$R-Hy;( zJ=H(~YV~}p)dcR!&U|SD&uTpdD9f#z0amwXritN*VWv^1{bp=_iuofke43ux1I>@M zT4-^tHU(4WHWbA+r}p;%Jl>pox(jRRTDoRfjkQ?>WwR-Y&)4^U!>NRJt+wU})kp{u3iDz!F6+@sa^K4s|rY7VAB3ouYpTCngFLrb36gjz@0gM z6HR+Aw&V!LFpBwhmJ7??%h}zHVQc3J9~FOn;hBz?aH9R6zAk4NZOKWMd;v}XfnoYk bBx>WZI0+MmQ9y6OGXh4P#T~NtH$(W}*-^Jj literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/MainIcon_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/MainIcon_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..59e274914c5242de4ee943952f105fc96a3750bb GIT binary patch literal 892 zcmV-?1B3jDP)WFU8GbZ8()Nlj2>E@cM*00Q7iL_t(I%cYZFOqF#Q z$3O4OfjAyG2ps;LM1j$&p&(i&7fo}+8)sK_p^KvFOgC@3$myn=b8dCa+G>@nt+}?G z&PGCi+;NkJFkMMmd4Mud@WAU41rCCobKc+k@9BaCTI-_qz5G6VKHK;C1OGw4C+_^i z^Zng8`&*1P;o4`S#@YAHR7qpfHZW$tBcwmU(debUo+}rw4o~&0daMWl?ZM{W#2Ch8 zrfyJOjOFDoqO_=lW8ZWzE32vSeMn#b3p78~#48&s>P76{aB&d*K|tN3<=iy;V~L#8 z6bAhSbF(tDol0AEIPyix?ccwGctP2?CEK(RB~ov9Y{alzoqysu1~$FVas3@9ik0{MlD& zZTgJy`}e>sTgZO>dY6pGyW}squ84A6F)dFzE?kke;e?#2sga&{K9bh5ki6U0>3w|e zbY%VxlrquWIoRRPN6^#+PCCi@wN>cZLSOG<)<5|;lkF#I__~_{UG8pNvti#nz%otn zc>v_)W`UlKEjcI~bjPK%z@f6G1$V_-erl{^!}R?RCTCI<2Lp36uv7+1rExuQJ;8Ma z*ApyTn4C$=@UO*NM4|%v1+CF+|JEqSZ)~0fwXe?rSBR5nQ;|s*xsy- zKK~+1OLONJF#ij0f71Te(j`mwC8sl(mW5I_rm``NA&wt?UE}{~)60AQwe}~6K4aE* SF5J)n0000WFU8GbZ8()Nlj2>E@cM*00y~9L_t(o!|j(_Y*kqq z$A5dD(|Zp+z0m@tFf9XgCUs_15QgZ)I3f-ziH?bhFOB1jmxqoz#zgyOtchVB2$}ex zVbTX5j6{$b0!C3OLaGgeX<%BgOzDMQ4n5Z%&pG?-wbr+M*oSg0An{FCva?tA-fR8; z-~a!8-`*Sk*N1a+Vy%7TMaM@k+1Yf4NckrI8DFHS;a%nuag-loeRM0kH-C<;YgRie zf;!IQ5x6uzZ~r=X9=Cc5FV{?^Q;)^xAB%Go!wZDmVXn`m$)`7x2z$44*ODgAe@rDyo~(;d_~-E3&+VA=?To+Z&0@=C~WLy8n z&#(Q2>qwu^n+6)xLUCJ)uc%hawn-iH&3j=g>plMuBFy%CX#QbhG%h|rzwO|_}YM1ju*+0X&fV0F-=8YAquQ< z2$h#HcxCAR1g2*bRvST#phVExu&=cay+<(mn;3Z&qYYXF;|gc9BaBAUNSRRSfT&8W z(s;%}dp8JqmkIfkNTC)ng0?;(H$*}7{R#L=vo1P#>y8zy7_b_w0nu1drL)iAP%DdV z?{h;uB1_Pm>ZHC zi|dO;Ci?rS-?fXK<1u!Q$LQ$mTUMi5RWk7Uft8X_VMPZD6g2`^BUnn{B~W{t8s%XZ zUkg=LRiy4J;n=`I09tx_Y3b?Z%*Z9a^VP4>wSKL$vIV6?Q%VQm7M}0Dg72l#xdf(| zK)e)I<$_N6r@mmVR?H_y`R#C&*VAbZN2AM8PxSY*b3Dd#Th`DLjecXrcY*Jh%FHN= zD)8A_%b5e4F%ry0zzB#~jJ0HQnyLyH-`DKh-pEqHppEe5bei|}?*|}t`ZPmNwy<+N zMnk0H7b_A_+JI3YKE6_jSVSCN_}&%#LK;&@puIa482rumsjCU2l;YTMg127jOBMt^TTZ?CWRP@XgKJ_jVi5zrhMZ@}74p=WAPeeu?P8+8 z|Bg!N=<6foIu9n`>!8CqqVau=F@fZt{=qoDmqO>0h!;n^G*VLF_rH3BtFsu@kBIAn`N(0{InCXP7t-V!F3a;V6-KkQ9-gD z`^qhVo?d%X`j(zv+L|kzhgzVuV2wg$Vkl)wQp4UKeGpVZK7qL_2Yz?xyZFkYl)7Wn zw&n_lfg^T#{wO(+NGCXOq8p{RvT376mn=B?NIlYtcskcL^lY2?lStU-JJS|H1e-5}bSPr6Cm4 P00000NkvXXu0mjfROEq< literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/PHP Web Project.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/PHP Web Project.xml new file mode 100644 index 00000000..b7783b64 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/PHP/PHP Web Project.xml @@ -0,0 +1,27 @@ + + + + + + + PHP Web Project + + + Website Development + PHP + + + + + + ]]> + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/English.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/English.xml new file mode 100644 index 00000000..be2b803f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/English.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/Japanese.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/Japanese.xml new file mode 100644 index 00000000..05406c4f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Languages/Japanese.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.FileSystem.FileSystemObjectModel.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.FileSystem.FileSystemObjectModel.xml new file mode 100644 index 00000000..6721a2c2 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.FileSystem.FileSystemObjectModel.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel.xml new file mode 100644 index 00000000..237989d3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Shortcut.ShortcutObjectModel.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Shortcut.ShortcutObjectModel.xml new file mode 100644 index 00000000..ca13ac7f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Shortcut.ShortcutObjectModel.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Text.Plain.PlainTextObjectModel.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Text.Plain.PlainTextObjectModel.xml new file mode 100644 index 00000000..1e4eadb5 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ObjectModels/UniversalEditor.ObjectModels.Text.Plain.PlainTextObjectModel.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/OptionPanels/Application.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/OptionPanels/Application.xml new file mode 100644 index 00000000..adc9f48e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/OptionPanels/Application.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ProjectTypes/{EA90755A-4A5D-4FA4-B676-F7BBD8CF0D84}.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ProjectTypes/{EA90755A-4A5D-4FA4-B676-F7BBD8CF0D84}.xml new file mode 100644 index 00000000..8c380e0a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/ProjectTypes/{EA90755A-4A5D-4FA4-B676-F7BBD8CF0D84}.xml @@ -0,0 +1,33 @@ + + + + + + + Arduino Application + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Properties/AssemblyInfo.cs b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..3f7464bf --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UniversalEditor.Content.PlatformIndependent")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("City of Orlando")] +[assembly: AssemblyProduct("UniversalEditor.Content.PlatformIndependent")] +[assembly: AssemblyCopyright("Copyright © City of Orlando 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f06910f7-0c0e-41ec-b0b2-cb7ef1d18d8e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/AssetsDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/AssetsDatabase.xml new file mode 100644 index 00000000..fd3da35d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/AssetsDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ContactsDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ContactsDatabase.xml new file mode 100644 index 00000000..5bfeaa1d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ContactsDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/EventsDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/EventsDatabase.xml new file mode 100644 index 00000000..bbe67ac3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/EventsDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/FacultyDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/FacultyDatabase.xml new file mode 100644 index 00000000..98c004c8 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/FacultyDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/IssuesDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/IssuesDatabase.xml new file mode 100644 index 00000000..3aa03ba6 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/IssuesDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/MarketingProjectsDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/MarketingProjectsDatabase.xml new file mode 100644 index 00000000..002bd24a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/MarketingProjectsDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/NorthwindDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/NorthwindDatabase.xml new file mode 100644 index 00000000..15cb6f6e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/NorthwindDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ProjectsDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ProjectsDatabase.xml new file mode 100644 index 00000000..9715dae7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/ProjectsDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/SalesPipelineDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/SalesPipelineDatabase.xml new file mode 100644 index 00000000..af37440c --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/SalesPipelineDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/StudentsDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/StudentsDatabase.xml new file mode 100644 index 00000000..79ad5417 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/StudentsDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/TasksDatabase.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/TasksDatabase.xml new file mode 100644 index 00000000..1287661a --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/TasksDatabase.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/database.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Database/database.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe431e1b34aab29745e9fe2e7746a0c63ca29f3e GIT binary patch literal 169086 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
sB=QBn_J8r|gS)Vt(hhv1-r<*fsJM zoSF6puKT}&=vhy}o|6@}e>RS*X2qq^nQ&}q2JGmYmg8KhFuRd2CN<24x!t}*t0Gx3 zpz#MA64HLQJ15(JCa(4i`^d;hXDmT&SKmkdK;_O zY2p7}3XE-(6>BEdvR95Mi@Pmu&?B_pZG)etG0?4`5^VX)xVM6 zi`X}Fjv9v${?h;b`ww8thAexE#{?U!z_ z59YL6JZP*!<1_L>8l#ZUk8Quk|Lpi>3rfD72D5q;!P<${Ft6)7xU^>wPL0Zq+cT;6 zEAql##kPlVTzlcOxZ;-^zYWZeRUI>7?zibMqE-s@u9glf#?~g)#G;|qF?(Q*tq*Fu z{!TxWoo$u=IDLJiKf>4LKkw82{j`AtXi)rROzU18y8{~H=FgpAAL|19L?76JFA;an z2drlMIahys?lU+(IwyYY`4kqn%*1(#G#F4N1zK}_d`kDC2%gZ;UOcKE#`mZa=Nv_B zo~RSqnaiBf{IJHXG;b8!|HQ5u_)nx?~;>Z#DLY%+8#nj8!I6}J7l6hf8HGos!%PdNj{Lm5yW z^rGH86{9~UekHj5CVt6IE?&9}zhND)a$I#>-q;n<2L=%PN#tPxc?jeAWJE^>VpE^z zFsE@UjIEv$eaj}ZI~MUp>q03ozFh$X3@K+1`0kSn9N*9Jpmv+TQ~$HkF6IB7F;Aoa zioa%TTkX@hj{J{&zwtjNerf#i#NVCq(^C%5>jFpMWN1g++}0nLHg?B> zrQhMw&jYY)UR~^*RuSvQl*WJ>dC{{{9=qum$!x#QrR*8KOM`P8&Un}TTYT?dP5TZ0 zvS0arjqk~hH4e)@i_>n!FOl*G@o+bWxyE26i_>Q>B5dIp917`&lOdgO{ii{=y0H)T zFX@1t^BOZg*G2cr`Rs4MrtfU=#jSwhwf1suB#&Aa?BDC&20q{&+i^Gk%I_;?i8O{U z+~xC4?kU|dIgl&=ckoyLMdQU9Ki8P;m8+2)M?H)UE2blKdV8#&)f!vow!!Kt%{YHs z7!3<#K=;PQuyn!1Bg>aBb`s$q!xQ8(@8O90kezKhqqeHu8fTTRsGZUuwMqHg{oO`G<}?WgQ=kOxP99yR_xZ2Og)sQrwa%Eu3m8#nHe+fSdE zk=Huq_CE>DAKdXPF8z;=stlK)q{Q=2bezU-_o)VZ$V)_?VRVzvKJ@7}!=+SmOb9*zHxD}Kq&Bxm(q z)DO_P?AZ8D>92`jnrBlxm9rW@s`ksD>TmL4!r!!C*Ao656FW3<;=~8`Q~synF&~)r z8~o*irAuyE$cGw|eDoV#&$OTSePsJp z`<1_`{mL5@yTpfNARZLgbRY4c`7-e!IY^HT4<;89zS5Hi@gQErtFRINf293vLw5O3 zwO_f8iNA62p!+F@6A$tqh6m+(v3ZbBHFA(XNsnX~YP+!y$wBe!kF=jUlAZb48O>R% z{e}nWzU)?VP+lQ97=2PcCtsu-Lp;bP3=hU8BnQKTu?b@jMwjHLh{eINW5+(S{t(j~ zY};AIUbWrKyGss+2kDh;LNXE$nr{^k(qZu+n}}`Kv3--_!St!ggDw9=AAF#D_wJ80 zUM?5Jb{|LQ9%R=szR9fTbk+w@ z2TxPRnlG|=?FThC&cCw_&gZ<=8^rLObY3w)JjBT2u1y%ZV-Yhx3N&$J2K z*fryXO`A}=ZSh0C*HLesc_M>joDEFChty@~Tf{UKWxRm;e2VRhmi~(m*@omIe)yR) zzAk;@ckCFuwha%&!4?lOeKeaf!j?XXcz%=idYJMYo`7aO)K_@FyWgi>Wg{Q;>HjwJ zo?46H!~(Th@)2K@g)`3~S;!{HyG>czvTNz0{FCAZC`uG-pqdO+O@an`zq2Owq?GvRq8g$XERPT#nfPPh)74|MS_C51t_K1c5(>z@2qN z&U!eW-Z^^QIo`H9>ir?h%FiPg8(Fz{yu@P~9>Zdeop|KR7XHLp$?-@>^LumD^>sbn zPsjW*$Br>ae&~GuXC6Co(TwgFMmBXkM7DJ#F8OuDAzy>v!yKO{dmocJk^XM$wAiF4 zuSY{bYi+cyNsCyh)z02w8Lgta)0i8*VEHkzs7ljl=&xi$`i6}PRWCZgGydHu&B`W6SFhlidbMpUzz6-b!w)^ zl>>gBCj+`C+4^k0)U9~U4@d<_S|}u3-XP^73CBOg$V?ha1xPozBgX z-q|@f?~{M|X42RC*6|s4*pK013Fp^W7RBWiMeHjpzrn?@s{HIN++663TMImJgX{95 z=2`aTSr$e$O}hD`SG;TUdS8ive&I!_m$3_JAdux=U0P$(9z^^zs6cL{;TmKGybSC zRE-yD{8VFI8sE~m_qE9D*sydof?HW!CuG@&MtI@WtmkkzpcMJ$9@)?`T;Ele>j4dw zL1b7-oD3?At24aqbCW!Ac$5cr^|$O@eJu2aRUsmHAW{i@3cw79dpDX^& z_=xb39;hFz{;+*f*?%7K?G^WTgD?5gNXCICD*EnfH`9FH(AjZ^q8Z#@A|N0(S*CrYE z%`Alr%j;0K+?O3*8y?7rVQA zV-weBt{|5FRV{l|DUZlbrBnR-QJLquS@E9q`|rPhk7G(#HD1Owvvv&sw#Mv?{3Xwa z;s5mMGg!aW4}A)8zdP4*E~w*yHEq)4=z{9FxS}3qPd-;Q;Ck8yxVg3=*L60;jrEOi zDzFSLOn(NLogUHD{i_p_mHc8=4MLera)a9PNL2Dje>Y0>5-h zity$>m|MpSW6OJ@cVWwJ`>6%4&s98l*q7&5Uw!oy$Epr!%#HC&{M*{=<l|5e&(0Sg04dTC877Bx+VbwfVmdf1kTT+~BBh zddaVoKgs~0H|_mPj@R9G@$c+)i;sV|{N*2oh1>rLANfD+Lmu#L0n~omLd(y&ub`M0 zMpyO4^1dHo^_Vi)!!?md=as{m#nlk8s3305=9)-@8Iutw zho#5f0cr75_tXe&lLGS^C&T#aJ{VQ+8T6`@6ZN>(b!f8>e;eBJ?T4K^^`Y!biVyOy z`3YP4uXP)7@vr#?xBM0V4gVVdbmstv4jw?u(l4V1`ET}#2Raq;;#$z0*y`T^t2$@K z_C9HGa#VWUn3Nuvo)PwJ)k(zt^>nh^CqVyv#51M4T0!`7))xK1|>w)G?b{-5F6 ztQTR=$_8*fBNpZ2y5!tkm(02evvT6f#OydSG%K;ngbm%frnG%p%>6DoCN;`{kkJ(o zHmW3+4=s+s0i`jkSILO!18Thdko;R5=PqpciLrl2{_=$yb5~qfyw`ZWNZ-*>I-|VL zO^W}TBax2m{Pky4|0D~_zHXs;kt|p;v(okVN1`<21Vp;=CZkFSQX(PgoG z*qt@bbNiKzn%=)gy!8y?!-ev^hkyA#k>-R9X|7RY`OF3H&R@Id;H498{a4J~v-?+6 z`6L_4zmpVm`;&$~}~Phy9EEb6xeKe7G?)4^EBEiJe^EyRJ(X1hqzfyRmmcHmrN*G@$KynAfo9461dqNBy@l1x;y}FverPCH^&EC7EkZSL?>y@n8NdcK(wP{!g7bhY?+? z;+t1|uy}YCY@b&j=T@}>cCpsm@vewI&KfC;-hdrI`G?ZxxuzT8q~ z4a|YHU9viB(`PnHi%~UGp;yJ^_@P7+OzKh)p_3Y7>FBz4;D|by+^6PduJ2Yq{h?m; z|Al4O^8eyJCjW~w{yj|or*$jm&z-`%nJg?ERvkO%H^v#}Joc}hVV~i8_ULh3M?DYN z`XP0nInNr|KlgMjdzJg}l7g0MkhEz_0Zl#l=Wl?Vo{r*D) zPi%~(W9r+>Cba_BhYx)y#$&!rzvjqae7o}BKg_@Sf0wRa$H=ag5j4CSb}sxD=U4pz zduMmx+z=po60_sEq*cJNYQ*7VNA|a-<=|e6?2PwWxu+sCr1z8SrNPLmTw`7)IXah0 zfytde$CREWSv#mIW(=r-VQmZZIviAggcrwa3d`;}USsm#d-UJk|9KesoBr=FKdr^k z)?Z=YvJN;EPX2fF0E=*O4fzd*hv5PF>Y+Aj^765!rG1*5%4{IUVZvJ z^4_mpa&#@06kW<@!jfTSFuQLF)GC+-W!_7Ps-LE)D%RI8AOFw@kne)>?OID?;=kMe zAC`ZU{~G?!o;`yBKUCyi687U)aUJ{5JzyUl3|yN?8<Lg;a1UHV1#`-SV z5WrYBjsDK?-i5rk`Pv(;zDb42U5g-Ka2b12_cC_#GI{rMeSXS@g*7zy@GttZf^p?P zapk|p|0~`r{@pMC|DAuX zsE9d@Qea}uC1}xtK3`Pl5?Q6u@xS*jhZSGM0?2Y)|W53KRR)eevPB{{0v3 z_-EuFJO9<%B8}mRf5}(=Upk|>Aq@0h`Hylz<-pPzjRDFB-dUq`8pn?w#G=s+XagN_ zYb*C->>J9OpR@22`-0bw4a4n-X}I!BFYd|6hB+FN@#OYjiIb28kG_QELHuh?tN2jvqkLFvaFidg-{kOZ)|$E2 z206S-{_ZuT=gytSG1kZnBnD?!cf<89+>fi^0Y^guGzc)n~~G8gaifjW1Oe;An?|7X@% z%718$sP>|$Uasg`ejHuXSx0-0 z>*8q_`}gm~Z@XASYWEHtJ#xtDckJ1_-_beh;&sZy*~b_M8;|^vxiNSyD{68-Le?R^eJ7xdMC8cMEf6D1R>(Jy)RN?btyhou& z$^YYve{TL|xAE~W-*5cCTmIr-*NB7v$VrnXJ@okIgYY8%_l$qa{$uC=CjQAs%P&h` zO#UzIlmjUTH2J@HF!{gw3~mfe>{mXZ>ni>wkpC#I_kQ<5{50xfYJpw2I5J2Zu&&h1tWjMzZqw~(?>ezU@KeG zy&t#yC1>#~8<)OI|FvJv^nvtuVWW8<^$R2yHwKDTrVlI(q{G5M`K;R~2m|923+GQIqGv^_&E8eo;l;+x`+Ds$^qOMxch;zF_3KJ7u~VYjECG01NlX_9vGis^uS`DN85*DfgG{o4%j%_44;_3}g?|1K}lG5Sj4+(;qZ`Q5YD%7+ViwV<20I zZ4ZWj#R}?O6x)&L`9Jw6ES}u_>s)#uk}VhvWDoKAgxDC!C%9w7gZ!d9M!Ip3E{JGP zk!(kz_y5Je^xDn8(F56o^uXwX@d@!^V0?m!lg2M9mfbHlxP3xgwh+VrHS+(^^ZO6V zhv?s4W<0w_{-i?Rjz1h-#|je-24V!Z4@@zLZ;ZVXJG zApa+#{%cR;G2)+&vFJf8CHU{ud*{1s`;Tn9!@u}8{KtiXY{BS3e6hiefnvBYNQhrF z@zLbW(gpeeXN@U!u0?_wdx$U6|2f~L{T@-AC+|iN9360Dq4U^2;eHqxpAc8R7+-v( zUv$=4(jPd_qtf?ipMGj2j}O6F!oF&Bfbvhm7(PR?qKu<89%OVum>63S264qlw@;8Q zC|8mmn0!$_A+DS`mS41$GgJOfoloT%Y+r@EdGkIN-rWdMKb^Nc7NQLHv#qzp6XhLk z_Tw8obTmFe_MrG^e1c+0T=}AMW;X_|oLSEflRwbfX=i`3{1LCYf%kVN_2_5ZO?_|Ha=qYZ-WaZ2ZP|Vdk9o{E6{+6rX#vCMqiG2y@xXrcWY1)$SPiJI|GqKhS4J z511=Cd%1;!^jV}hL2OiG@7&CpGxt-zEBXGOg)7A3o;Li|Z-{{>`|BCF2Rt9?OP-f! zoSHwWi1YI&A3j0g2?9?Lc!Iza1Re(hTuc`KD=g;u zFRV94sprqV%zq#;NC^<00q0Zz3Pfb#ujB*BtZ5 zyzdxu#GRu@%#o!Ooc8=(kHq_u@ZvE_N5X61Mkf`D;Omg{XP$I&-s+=2@OqwisYVJT zJ*g8x5T3mLX$WXkC!WL3;_+H#MaF@aA0O zGTJY#{o?w*ey87SFR`xqx!bdm>GvO>;xpCP$dvaf&d}&ko{3lB~pV#x`@OkU$ ztUm9gO6v2DkC(UR{k6aMB^SNG^M8@@k#du=lQNNXJ;_CN3}iD;UcVzC?0xx6EENk- z(S)bocqw0@?`yu?Zea5_CQR=3>eA%{vThCTpLBQVAnzj~1APuH>FK+DepjD0qni89 zZc#D$kbJpPHsRKeqH>^4O&3Gpfjho8)uNd-HwioFVy{^q;($`n@qtlP+FAz#HeLInNrjkIa3Y z^^Pjxa!4`Ofho><7{yr&hQ#;RR+Yz@l@)Pe(Tj*!m=V_kSPz1-h-5vatFtZp0_Asp zs)haIJ-AoK_eAMWlJ(_%r29q&vWHJd@<-`OeQzlHU~0 z`rC_qo?KDZRc^pFi9I>zGMr=R{v20cz%ljtTz9gVW6kq8zqo+&b_+S*IFWNHgZaH5 zScke+nKGq6<2AB>@n*Uj0qv7S>=^B<8;ppRK6p zE3!6AX`EbA+WF4e;3_yX??pt-^=3UH4?Zu?vQJI$z~RxBy?3aE^}RgoZ%d_K%loND zm*k-1t0e7J5x>IV&wlBi@+cOVxRDpUgm!1op=6IxpL*VJ9Ow!h|hcO$+@Rx z#P_6G&!jaRn$yr4KeM*Wy_UtSV=-%)v}Q%?8nwnZGU^7x14kjCg@tXbd9-tYg#*Jq zaDugb&dz=Yd;Gt~)$q!!|5V1Q{}d4xy9ShMLGf>4rEx8^6pjX#M&vx!1DWoL3zI!@ zin@PjqzCp4;xi_DS@zF8`OLa%sZOTw^?H-MnT~MNS{;otRHdR#CfBu!d7$7nlsXTxsH;7KGR%bj11g0sGao_T32V*QgOY2QwLn@ zMJ`{Bz>1k&Fs})9vz-UFbYtD6z8?0$;T*D=`U>}$vE~?`WqBo7wYOrP$H`}LM$+#@ zuF~;$(z7}v!uUCB6P;pRj;qtWabXhcca8PJq2Zp`Gl2M0zUw=(++}MEgK8$*`fSb= zX;LP0@&vN{r@e%`WG#J{e-Yl&^9-3YXMTxuZ{vv9G0x>(<(iUctu4`-3+XfU+~%B} zQ!ktNJ4YA(cWpp(eD3utvGC`f?{j=!Py|92j>Ht!r&|84g|%&oe;4B4htCHc|8E=( zs>Ygk)cfFy^!JsBEo*+!4kA}orr)p3nn1skK68kFzq+a#j?eio{ZC5b?~PNVy>V!$ z7xwh?#J27p*wD_hLuhM(jV*MolisD%;V%C!KO^6rIa{`D&#^Y%$DHR4 z5thPDx=Q_Y>g~tE|L&Y=9QvPN{4ZR%h=cofVps)>^`?k_QxB|d<%unwsHcPYEW$|z z_}tUF#J`$Tdn_XS_xfXcuB%gbY>jG<#gNX|RHIC)Qx4T}a#?lyu2*njLQ?KiPeS~? zv8S&$wsrBsh95i;!so>~+%B)GaNb58h zGaY}TwFWWxJ9`fv6@Rm?RqMCz)&H~H$94=uYdq!DJDXpd_%|m0Es1}ZRMWe z!h9u4dnvR=MC&Bv&$ZSkHvWpAvJ3flvu5Ct_5bWS1Wjm%;l(UWrT)*a;eq81J+Zch zH?|CX4JU$X)_~zP?6v=Sb`75qCWsxE^b<)y3_Ne17ES7T7<# zC=SmrfkShP@)^|madCP+To|7cr-moPp@B)Ur>76LbtL|+yb;pG6N_qlU`AyRj4NfK zcS+x0Seq|(?V?KY68+`)dg{Hf&(gPV--^OpYjn7W!Kq~>{l6dnl1F0UfB4{U=vN^N z2D2vJ__EB)t9!6cohMc|_r=dcKVnVKy12l)cb9|fQTKnZeHXRnPW`)^tbeB(csfR~ zCf-rj{yQ<_E!Ib3O{h6pSQ9D}qNb!}T`2nh(J63hSaKZdmkhskPl})0`(Qogyu6VY z=GF3qUj+{gFJakz3wxq%Tq;}`MgKE6 z1#9vp$L_Alu%(?Z!oE*}zy{u!Swpq?JTS1h2f7uo(4lD3OTs^qUtZLE<+e%bYuafI znbuyh?_>1e*~|MN{ZB0XuSDL$_pC#x=WX|7y~m-YJTbA77iQP?#?q$L&8~b-?(CZM zJx!SNG@sk~MMjGnbFhdbSw+js7PXf90Ql#Q&dWt)-O#W6@K)He`4?*%~5 z_@17L*psGabZRl`IpvY#(mC}Q&kakBBLh-lch8jgv11CXYMl&0O?@$o&pRJq)fHydb8f+u=3uRSc5wGZF+?C{14WQD1?(MTHxB+)`(o+7WlanuCWH@wGBUT zEUpA@%;C7FYCz7)%$kU-4L3D2?5VVY$(eC`5}y-4J|iMVXTbT9>2PdFTI}tYnt6XJ ztnZKlD_SPU{3b~;wKnTQR`N#wQr_tNjTc(dCL4d~!RPX(Ki{?StN%_U8OZl1?bxwn zUXH(<5&nOs{>R4u=+VRYu3%=={;!25thLzsOAmA{;*9}iy)mISYex3^2;1j0MEHmz z*giHt#~mu+@Qkl;Y<^i>o%adHG~Yq=?A&*-XB|qY7Nw4S-uLavS#fh>7F-{fg|#>{ z;q1ta#6AP|4NQk$d#A;wuBmBTDG~I23ivln#=1Se7+ot9CNzHw!yCPZHigrp!G}pO z?7L5HjcEBn?L@>sIrGbW>Q@neoA?|5e^>vtk5m3%YjNYtKb8N)<$siey8FLoFOT}a z_vZh{uyx}K)cP{Bt6cK%ZzKRzj%8ZYY-B9u;wZj zJk5H9tjD*Iv>+GkxjfE#nz1)KE{=Z+$A)HMJ<813)h{FEm>wItr9)_kG_1{-68=q9 z+c6#Hbj^=dW6C3ZWC;WhErumS%3w<8;;h^B6=w9SI(_bxE1%K_Q z)A*$JnMt2z8(PyY(i(ipQG1&dQ}mhoWzv5$_T%2qdE&%LES@SAf032$Mo@ldmWQhVn_`n~$l@;}ml`K`l;k6`w=E-3Me<T$VFeU-ZZh7&I|XY#C#d+ zFscUaQXT_Yk8w_J+?g8BFh6Wy742jWjlv7%xwb3qKHl?NgEe*S-tIh}e6Z z^_l#PbX-T-g7HB*7wK=3v-UMeHp*2c8^<2@AHa-J9Z=*Y3ngD=t>e$q!mo1?tesL1 z>n2vguK}$vufxBwYT(;A8P*z?HnhQUzZY@Uk9tqvVypgZAhBPPmvg?vU9>VEWk3pK zP3*aO5k>sZkAE6RM`XwD0a>xBduG;9PLIW{(_wB4)(LEq3S;XfXUt_y=*ji5dR%$d zg|2|*Bg(VxaCs~mR1ORJm&5da)i(JLua{W(dvI(%r?831f9{FDs-YphmLC!R(sTJ0 z;jQsFvlm7_M(@pM(tlkqF5DF(gtwcccH=t@q_*@Gv)klB_`tWYWAf+NKk;Q8ACnaksy*v3-KU>lLcL#3+*N-#I`VjW&PkTrRU z|Fx;Pab{djj&)|oj{Z;4_Xz(CSkOEjW;RR9deo^fvUVy=XvMm`GaF+SW3T+s@{wu> z>k|*Dhy?>HW7dEgYv+w@sIi(vdBumnaMzwB`52Lrf#jfbjR%ReCrR@w(q&;Q9T)D# z4)i`|{^fthpH2QR{8ugeNPFK9V&O*^Wg+s$f3xXMOBI z)(6)3e4@PK!e6*cm!;>zTJPo8wMR~$%U%=%G)JX*LX&^Wujp?H#b3T({V$E5{&1g z52o&i5pULCMmYOmD|uYX_X|~r`Wc*`m>Y*j=A`at$7bfR;TvewnGFDA)h*cA6Ab4y|EFV=Ji$_#vedcPIH?SHebT7}sr?3(!|FPWo%Z~_e z`48!~@YX(6?bQ_i@+pd)$~T3*a-c^Y|2MJM^nVZR+kx^QWORH`*E;WF^~9RkI zi__zBGiQAo+xn^&cvh@nP2_;)88CyoKc)`rBG*X4`ufSxt9lm9=vfS_r!++H_*z&t zrWS%m)FS>h?FGXd+Wnfo|6QUee#}MO_zQE+n>$zwbNQf{@qfn$Nw4L%V~_v4<{uwP z|26+|`DzrJlzawXy};)z)c7yf_|?JBv+Lo&;wHGTrVZ?0x&V7R!9Ll8b+-rNRv>FF z`{!Z#Vd}r?&WF?YsQ&h9>V7znF~0vcpGk4iFE@^kQXTdj*wiB%Ymu`Sd&^9i(=;6> zvo`Sv*5vM|y42;9p+lJz7}@$Ggimco{Ob|_x>!7_4i*isjTr;$Um4x0pw>ks+RNZC zzhbZ#<|4&kgTG`GAO4Rr|Kg6n!vE~~iVpbmJ{JC*##M69URW|0FSrF1LGZwYTfLZM4PNLr#RXr63R!o5&Ws;$NN#b8B zC3@EV4>7Mt{2O7}*oIgaJjxNN$ zYo#pk>rw!ddz8SKj>V|^jj(uJ6HMt>3*)<$18bu{o4Dv(7WF=-@=NKzDE9bIZ2$8( z^OXn8AKT;GAu9H8$x+@F4D1o59p?EQ&-5Ra=#JNemU z;JP2b(~dDAA8t;`#Zdh;_6_2AU9T)y-7yoEw$6xo%y*_T-x*gUHHKAAiT>rN`}8@T ziYLR+rf)LeFURMRltI65KPG*OZVf)NE9B3JR^@X$>mbH=FKOMnbtBQl!105e^6lDR zFFSZt{Noz`RJ^!f{%`V6_xgv^r%z#Mr>YpyrT}&=?tlZt|J<4mxcy6a;NSrIf8u|0 z5;31eQoZ+J(pt)51L+9t!_DZ63L<(>J6sI-nro_<>l6EBtuqk&bbRiS^xlPiDb|KB zniTDdaNM&)0jwBRp7~}aw5|3sDt?>_#ozKl>34lDvo^lgRVMn2dF9jULn*iXGx1ma zJ#gUn`4{A%MFc5PdW78U=4u*r?Fe|cM+SDmf3DI0MAQG+^NBrU z076N$gGhdMjL+t{wF36#xi~q$5Z1KMh@~yl6Z^E7F1=^2mFl&+^XBGan*0cjt3I`tex@LxJ_k{rTG>lvFDAo|2a z{M6@P2>d=R<}^-&sr5L%3gFcYkeOGL6=}K9(2r&!^)X|4}ZKknw-h|4qpJuNiZTPydC#`gB(#A~9u9 zLyYV2B@Tsl!iDu+aqH(kw1GjekB?#;Rt)B|M}F?W;~HYlbK-8>dLBzKPA#d4pca`i zqrRR)!RJj?OMxML?v9>C(T)DTV-e}SkAwY!p|vr#^{1HKuQHYqcVWMDOf7p{r$XR! z8S)DF))jI;F8t#ie|s4G+4ty@edyfTl*F{bLOa4dWJ+b3&eEM(ZU$jRh@f39&2>Azxtu6yy~C7d~Z0yBp+#M;SqaCLJ(T;JTAx#&P(|43Z@ zu@A!feTub%3gFU?L8O5ko9>1^vup4fbGb0{`{%G{F8k1d%`mp{^Nh2;=ujj%V{Ixl z|I!CdKl8@GhX2*PE;^LY%V*M*uvd=b^X-OKN8qHkWoSqaQWwr7_OgfH1@N%=OJ{|X z{D<^h_$q%=tuu{RXv|3C(#m_>rpB-I-^AhH?cluQkAkLj;h1DC z`k_9!x~Ug^5p$tkLvj7r5jYmw4u_X~hcoNCwie|Ez*0*LL@tp4VX9}TaYZxc${oP za*<4wml~Oz=lDeM!qHgCKGBJ=p18EWFa1$JL~ZGh=xux!(XaGL#Qyg7A^fZ#_AKs% zwH(7d7}x~+7dFDq1ufC9)(hxe{a>8R{RYjxPRnOHK4ts&t89n+HHBZ-QqeQ|S6#zr zl4LS^fBo9!$AI{~m%JbT8vjv0SmVzc_ZQ}d%s8pWE<_qLm23=|IT-mK6AL6C$-~Tj z$tDc;#uv#RgnMj~JWifEho663i(vmg93N_ggUh?{nP{zXar1B-5ABX!0WISGXIyaO3XGImWDg zFtJyD$J7kH zj|+dz?+ROCD(r=?e2$rG*HO4Dw~;S5>rdSI&%?}rx%``20v_wmmD zut;2vxQzbBv2uK4tef=%ew^P0n@P*YHN(OoH8H5^`)Kr42DB)X7i0P~ zKuGX1tX{WCJgr-{bV;gPH?BV}i0^w{H~#AX3R}fbGZv(HYUW||H|e-Amp%#)VI?0e z|NW@*UkSxuG7#zB!r#pQT)4>hSFStHAKLNDW^4!#z}n#1l*?pn2%d#4YZkFjy$(Bm z<#WHb@5Y9WKRSJV*|zZKytdYV|0OSjzx;-DUD!*v<$JX5&D3mFTjf_w{*&1AUncLl zpZ>>(zw%Y(OS*<~*~5$#2M-=%j&;yE9_ReBe4F}plJ(lPcb?VscfwyeyZnvXB+Qjh znt2%a`g6rg@%cFM7fx~cp9JI27_R(QcB=eJ@ka4ob}ISmT=xBUz+dw((tY`Rlh&o<(7|8+ zN3mDA=A+;*Ut;o4)8EqZVdr1upC70G3xDycTu(N^+%B9LB-VP`ht8oW|D4A6|C#eI z%A@{F|8M+{!QbQ>)V0tF6DIs+`cK=-#JGD}?GpZ4@_JbP7eC4~6~okj(O9W@&X2~Ar2j_OO`p^3JJN5B&I^CZ&djrD+{Qf*X=EX6 zg|XxzTXT<%N(Uq#eMd4>9M|W=jGq#{u;FdvLaxgMcEE36fguh~uPBOZ!!Mw&OZ(A zra!DcnLd*YBnu-0{oTmG*nwoAYl&ZX-Xj?pf24d+6qg;ujtTMkqu4g!#^1=m{h9ob znWvV%nEn^}`di^I9hXk)sCh5#JCeUwzre^qf0G=H9Y_ww4kU;B$-wvnlM5MtBwsCC zkS~%9j6YILPKXSIxxw8W-S{g`%O}Y$h5g?Re_PC zKXThaLj6&EGH~arCKktqy;}~74U&O$M?Cyp^j|m%do%tc{51y|TLx}hc#sSd8kbFe zDt~0`!1T*v+kvqKlN%Ws#P&z=$w8k>2FAw!4)_ZvwMROkHEfE#CciW?kQ|IJa?2pT znBdNhWD90pO6>kYTygn+GBCFAp#0S6y!$BZja($xzk~i0o1F56ikEKewFfM=4CIT9 zKa!moUu1G4cT7-RmJCd8q?l}Eptx*uBa@#hM^sEUwxD24*9Tu{T{R&8k{9(q4fU4pV9Q8##MvTGEbE#uvAD;}|F+q8e zv4i`?1o=A?mrYEN{Nu9&cT6z0V8$$B_m}01j6YIt>K;2X{z&@I{Kuw#TqEy^RnO3c z=)<2fUpdMABwDyp|Kp4W4}H_?fNzjJ~(+!y}crzo5=L7o;wD(*`2NKmCe>e_VdZ*oFCxatY%xx~aQOc#|D!)}Zcm?_jlP&E`F4$~ z*)eNx9e-r-Hu%S93nnJSCj;_*PfRer$USZ(TX6fM*kcwZH!}IDe36OEvIAoavHQyO zUAFGWcsEQ8{~fS5awqoADeb|V;v!bLIJ z#AP#nYGOic8JL*hwgnRt%$S92f%K>kOu zg0|(@r{qdq7q#Pcvl8#Sd+Pov*xv;{=7fIqo{yMQf6rWcH~TPWqN1X%X)TCsUHU3L zC+4>LWCnZVkMxQZ0&@xG_|#6257E5!9UZ6hNi$5R$RU%!6cR{uu!Az!RqMgCg0BJ3n1 z;VEq8BTOFZJ~AHIiV3m_$wd0B*e$t9mcpCoEBT$?>{~Y`y-S?+9K`=`Ua@7twNc)b zM_PU^ndD_3zYO#3-W-Ej$ozW`A$lu&&|SknuXYBA@+LC+mqL0LV!6+ zg0D;)Nbq-`eDMhaPY`&5z!Lgl$ftr zI_IVDygIUgt?T@dInU1riMY-?ne$w($IZoe&c>OqtD%X09^ZZA`#is^4es-fuFnzo zxiB>C7q;eHn45FS!kp)Fop*Gd^Yrd_o}Ax7>kr`IR&DpWqyAxcF7Gx4$3$ZEJeTf! z`_6ar>pVs<&gmVccfKBDB)RT=omB^E%bq^w~`4MS;*pLs;MdrPZ=6gDt-|9N%nmm2-`Wqo&4@~g=mbxn zy#8bajLanm$y>6KoFzBOGAk(uDHka(>6sXMjz^_wFUHVIJQ{j|=OV4c{}(AANx#cO z%1O#b%1n}eNH?Tg(g&jpJbm)|6A+N>g}G!d`;`6anNYbsJiVUt@J;`G&fNccF_|M!={;g1~S!cf-}&hp8! zaoIL)*8BOd-v4*iwsk+6Hm>Wt`{(v~2kWMNfn9T7;Uj@^0intHEJTjGEGOw0Y}vP# zS=cwr8|y~+Vp{tYk!t}RtlF^RYl~w%DA?=3?kN5=QCGI;`oBM5WO-dAJ4^+g&+?;F3@r)n#Ws< zEZh#HP6S!@*#(|h(mN?yR8779rJTvX4!QL)G9 z08jramDJIG`6^ljk&mzg}L1ezG-{~5WN~?1T2UC6R~8`^#g*XSDRNy+?4MTHo12>wyO|HdLa3mqlp*t1Nlh8Lq6=E^fEG+ZM)?yo0cs~rzLC2LUNIeBroM% z%7a9?N%Dcukc7jtF{JmgNq=*HX1@O%KR4(4dmfT<_?&q%`o7qyTIyea9PEjMqbwYq zK>7Q5;QVyT-~R=i3#)<4l>3#C5|lqF^mmHj`5h{b8yjok@VrlPeZ}iIG~-{m68Ic$ z2c<>S0x#OX2koEopW%VC)U6W}J#c8Og+rq(dv=GU(M3N3+}O|0uM_tmjpDwD>0FCHpX>ZrbG`q1 z?w?!Fwax3f#{4I)b6&^w&g;4Ec|F%aZ{YjIq=nq;GMc~X$Gv53d97-dD_8!K*Z+6^ zm(x}o`(5&DI|f+x?!gug4EMm%F_b^$bAGBXj?I1z=R+y~;8K)-DayVS<^4Nd3o8Xf z5j;P$yc|v~tAMDD4R9v7I*!kK7dIB9#4Dip1WINm7%UC7$nCZ1GKf9uKC(<1#C!wPpGBkX|FQM(`YgS6J(R?3 zfTsANnD_ah4*8@eh!-mS5q}@V-vjY?Wy7ugY$$MGK|UVG9wp(IJ%sqAaUjRM8y^}k z8b3z+(HMVgHwJf#bvjPUUlD~pKoi9ZA(|KI=4NVXoWCLOPEXXlu!37&O{(d*&e}D}S5A(ni?{4rk zbR^sgT>`JNwxZsXMeJn}PqeeLi1$Wlpl#MhXzXAOxL<#kp5KUmA`6Y@wV@<*3^be+ zfVvPqs5yrC`|-jvFJ35d=YgVwJaEg24VP`%kY~k$EK?T8Nma0JRR6BSczM40`u}~n zldqCqqa04TTMA9m%*<>ha_{2152p5IA;7(8z$cOmz!81?9-;MVz{`(OB zJ&3<03o>@GAlZP$aZna~wS01SQ87Uts*k?48{tmJ#qd1EJK;|HjreL1+5kmG#rc?X zgYo($wZy?p{1Fy(-JY+FKlxo+j5qkGupm|k@i$;YjtSy##RJ#u5dZz1;J)`zxOZ9+ zUZyL<%TxvAeFcnt1&n*F`_US*6rnL&5ix&jO*x9dZOn7DZKT(pQ-OP7%i(p*DCGZc zh<_)j@a_c9j`Bf?D<2dc;DuXzdEoMH9>_CeL#7c661L&-X|Xug^1>B5i^ce$f#m-; zb0gd-$CH*PO-DRW@y_7h-^Imc7jpYO%H5Qs=^6!u_rHlhU61H#X)zqx+8x5T(DLS7)`MCS^0mz7od15@N4}@vMZ{Dot4?wOdU+KuviA2yp!IbCx1?%g}^9QA5Cj~36nEygVif6<+-C%)K*| zxO9Rdr%rIoj_)o0ro518zypc8Y=}~0!*M12{Zs{B&|T9*6UX=8zA@O7zN47$iMW%F z?}xcv>%@r@&*@xstj{=f&O4oV{Wb7su2=Rk{a=OoCMLudd}UY=ERXmrBmNqQzaHXm z$OD%wyTZl&BcUi#6{=FyF!oh3_EnMh)iCzeu-~hO*sCM%>WH@*;*Q%~b!evTyZdkQ z-rdLjmV6y(xuAzzJ!n3!i`W}r4XFb~!E@kcpcqtm3cxcrekeKE1&a0|{-x_!W^RjYmv3kxfz z-%-TtQ*dZY*9hUppRU{SIsDI@zfb3e|I_-f^zlR3y@Ulv*RbH&MmC(<%!XJs9!S;U zh3p-?aMiXqT=riFl}Q>HiF{%yJPKb1CE-hU^Y4Ivm;k%)hyHZNou z@WJ)HgW-xF;janRDH^EzG%)XLV(e=o?`xsf)56$CJEw&)uMN$4+KBmEqx;QyT2Pa* z6&^*)!lM(jp(SoCa83_^wg^dRJ=GW99Pb77$osYaLQvz?4e{>=&s@7g$$kMSa^Q!X zHeKMd8RBoq2WfhI5U0Tlr<8dhP>u~p*RjE61q=4B>I`ZtdrN&~4xqRvtw+5a;{5i0 z9pW5I*U6w*C(i$t@h^UO56tGVzyagmWfcoN*R$c60uO|#@S+CbgY<2kAb0l=D2~yG z%0$9n3%Oq#V_zHb*T&e_LG01a=^*yHh_x=XAg7bHl3~o#_Ia`H0!@J;P#+)+b-swdC&s_KAUt#FhWK}dB0B-NY1IWTnskP&9i1RahYupv zc_DN&FZd!?xvgb`(=s;fS-|30$cRKC24C|=TAzA4RNs-t?~T3JT)I}u_ke#zMI{__ zQUr^+EZDOM$8iOYC&rVnJdUq2FGOnaL6SbkolQT;aa#-(sXH+D>tM~Ni@h6NjD0=i zeLcip4|!i7d0!vn9_{=##2hW3OdslVcS0$0JVf*d&dKh;Inf>Q?+&dYVu-&OG-2%5 z`-?!Gk1*md3>9ud@bsV{lsI*RJGNcns+9obnsk9QgU(o&c7juCd=RL}3r9Ebz`@l# z;INDZ)(co*v9vR&uj<|ND{%mK&ZmBTPrRm&a982j5W_O~JS+YxsIwC&JJ zcHRJ5FPcDOz6m@})WA7{#Q;&m0Z#Tr?0W#`cn@d`6^GVfacDl)9hw5fpxy`jKi(ox z;~@eShlSy(vk*LR?1s6&D->7=U>(X2Dcd_kv{olLv4s!(QTMyc@PhLyHrOsuPr9A@zh5H%C!KbO9Wz;A zi1=G9z;Q(U53Ip)mE{Hh&3tei@sHN&jQzGQaKUi|Tnko&s#JZf`?kaDECa+IG0)ur zZRd9YCx0h!F6;!jxDz#=HP&(qQPcefEm0FO?gu085&*{$f3lFC&=%YST7!B(bAUKB z`E^J9#h~t}C{!O2fwDuwP;x*B?l_>|*>rPgh)>Ia3muAB*j34X8Jm9#B7hE^+f!C%^5Tx1}BD4h{(WpC|cN__q{AF<- z-yCYQc0fapA?A8R#M}rmHwGx!1#rb2>ausj^ON%cqQ_ypOCs*Q0YVtV^&fbj6VwaZ zj`f7rfS%Co*8`fo#o@JQcZ_{8C_5|)j}D5!y?w%P-A)KDS_xv$zZ)d&=n7G~{BUAx zXYg0<1V`lf;J{j5uv^Xp<_p>FKCC~J4Ljy`f*rDwQ(rv2|D}C^bRX4w-BIV6P)$bH zRr{yo|L^Mm58+=?Sq+-Ad0;EzuZJ99G?xb~5P$oX$f@i3z(b)E1gHu?lwm(e+BY4} z9bE-y-4?;EFznS_u!a}N1Fv(<0Iu6Y!+CRf7Oeo)83s@rHXX4a25_nm8peD$ZPAY7 z{SXP@1fvD@M*Mq2OF%Dp?`+VO?gW%JGhpxLp|E3tAn45Q3WvAPhNH&67kx?K z-@P~CPr9F<`uG(8AH$z&Kr*Tc>AIDl;(wa|`zP}Mhw!I4zD*NYpfZ^a8q?XJk6d81 zfCns>^Mb=##D9|jgzg*;S56tgnSHb1+=20s@6Zpf?&}RjZj$iCvp-b$_QSee65a%1 zO&5wBe*)t?3~@e(K6N(S@ zfP2p3aAThsT(TF1b2cK7W+n`05dR4MZV;>~0RCHrA;@qnqq_aZj+69SXiStLfZS%Fkc&#>9VTnw$MM@F)F9_OUr&(wE#mK);pn5?(o8^2h{oZg61IP^w4+M6UL{}q7e6Jw5S1ZEfTlkXkqwRs3g|>eWB7*0-hg{ zfG2Lf5&NEqeGgpgAr6=Kc85G$G03zOfkYD_h~6OxC-u5PkhU;{8jXb0j!PlWR}Rj4 ztcG;A)sW)48cyup0Q=M@f!&sgaLjH4#2w#9>qEZejmiIfUlM=9i!daPL5&4hJ`zx+ftsQktQnzMLd+dN({ zUDg>6;yh58?L5f!SA@H#HbY*(CP=gC3)wcph>a-RIV28Gys%drJOt{4rJy+!WBw%Z zJmOCA9*sE14g`q9ToC)taGfwj;$x?9{pa!i&=e#Iul)NV_7d>WwKv>#?gclUdcqY) zamcsp4%xfKAk{(?;&%x_gn=N0=wkdENJ8YkC2--G5@dU>gG`Tgkmj})l3mw8(qUPM zb5n(Ir;Y8t5PDcc4msdU;?L-R_CJX~^Lx&8omj$=euseOis)L@WOO}Vy1q2!5UMlq zTCnYp)9VO-TK_}!B6BTp!kpH9(EHJP0YQfDgCAc204T<)@Lb62<#6%P>@9zOc?){)NcxwAx(5ooa`e9Po(?jgB zzXQ>TF<~Aj1#ku}e(>A-F}RH!)UFTOjt@lq`$LVdB$Rvh#WfxhaC3iexa!ywF4&1f z&hGAzZY2f@rlP1nh2Z2iK?u}D{Edb~nx_Js^H~R3Uh5&lV?Ct0uS4wDLBgSR5a+xW zqW7jpDMc#{!NkkOnnaX$F~#Xb}N)Jq_LD0^N3`YZduYQ%p7;=c(sfZ9wxFj~MeKx@v#~Bb~+6R&l{{q*a;fBw2co;Aq$|ILSw7qj*i+2M zBld}idm=uTGz9IZx0ZnSW6>heS56LshM)oP(q9sud-lUz(g$uh^@fY~y&!jwIGnZa zj{YVFu_huAu|pU_^n}1qQxHPU#zB(%1~})t0kXYiA>-%IsMRr$L&xDink$ z!_AXhAO&M9+GZ?78TWv5F5}_ONm+nL-cTC894do`LnE&J=7bMJL)z zly&&R_!IQ){zW+a8U07=KPbitbHbSUodTLO$j!}d?;}tzf!mmz&;1zPr^m^MNDI(0 zFup;4z^nu1)_|k~o|e4;-Q^On>}M9N9*6utT>y2{cu4oxhP>dd5V3DHoC{QiCpr5e z+IAwuSxLd;RP5*8JP5@R>)~n8IC$=Z8XoJow&R%hBM|!-^Z~*?5wTBwhkGjGPS%b; zZsX7gP7i^W6H-unY#_Yw=?|qxB%$a~U%2ihf!yC4u@^_|yF;{*7=-N*gtOn4La{e+!>hnSQ0_ed zxnC0Qy7Yx>`})9n+g^}i*#ly+-x#q&432LTg+N_l@X`HkyA7h~>c*8i5js02Ih8L)5!3s#~A&{*6bPVSRw=hWn* zO5kZY74~fs0yh;w@YfcCaE!%s2S>q^1XZ~2Hx?da-B#m|eVh=)|5SgB{dc@iai5MD zXCmfj(P*1K0?+-$?HR;B2A_)<0*#@Aah=~FDDxTs4-x;u1AXDLg9M!0-5b(SXT%zb zBkzl0?2CdQe!hpgAh>JvhLa9UAwOg*Wcw?@Szjec_f|suH$&nPML6T8i1;fa{+r;q zlMuQBk`U@3gS@&KE}hVa6Sj-Mc}pKSq$B{onq47sS9iGJJ{h3u zBs>nCiM3zfcKlmI-f=(WeTMfb?$4rSA?|0<($JFL;U6^=TEl*V*TI9~g&&?b>M;Og zUlL=#FI=#dfGn%tkYv&WqIZg;<`V;dEm82)5Q4+1f^bMp90JT|Kz^73WCy4q{wkOY zR3ODu84^8|A>LgHVh<}p^r6k*zk4mD#~hj34$fEj^S=0Jay;=j)om2hgf(e+`u!X7 z4Z2S`oHY5@UjH2%?9h(?Qq+K37W9Qs?4O*&aV-c{f%B-bLab(ikNyBSX)*}Tx=w?; zC)PpRV-Ki|UV`UlVD9(Fp5Jk*_c8a!W8P1}yq}5jO>v)%#^6u!pMv}G=o5&4^U0rZ zjh_@e_a2Dnk`2IfyZT{Ip)bb11f-kyf-|T!Besh}DB|ypy}l!ALg1p@4fbtD4%j{x zYkUR7UllU_R3Xhr6_P!-K;qFY5PxI~#JZ_KjN4W?YOxYSA80++SGje>pJJJeuqDoC zeglc}Kji}25*JYJ{FPY=6>JAAcg(ofvEfX!}b0B;DUW0jC~16Hth+qhCSeves?&gEdriu!f+UK(0-+EU@zYl z_Nw#&f2#$M9jphL{_2qCs|Ly5YLIYL4e?h){8b^&Ydg5?kS_jO+)ob1jX&W^n3G1M z_+~JtdX8EDN8G^F@&6Y7FHi%>Oku+!#DDW_2?(~|0Ox}>;7XVV+=h}_;CLUoY)HALXZ79nuPxOY_O z2D>*3fb~WZa5b0=>BqJ~hQ9{luYve)g+$M-5bvQ5vF_?{>aZTi(`u^|_XDTJ2jKZ3oby+}+&<%N&nFS{ec;{m5 zQw|{gPx#~copAamcyoeupAs2(Xibup@f% zEzM2;h0&MXA^eH!345x`2z%<=QO);v)_-#AzrUmZssG2V{|W!HvNA{tcYy_n|Ay(J zaKvOOTnyU**TQife%v;Anz|ESoil;9tCj%wYyqA);^mSt2ecf)&BfD>p@1KHl$*|BH33P z61=q#e=Ugf)CC`#wRmhm^Ri#EdHrC^P%6Qq=7gbN8S&_K9BbnVQ^PO?nmq$HgpB+bpl|%z8jd!ii54{&k(X#22umJ zL#m$+#=j2YuMP2@XnrOfFUv)-c!0Dn@2lOY|3)=D#Xg?z(XRKti}k;l1Kh1Pfa07! zkl>>a`Jvi4->VPz&+J6}O`tB%656isM*Q~zlpO@9bw~Vtad?B#PNCsYbC3rbtdJjY zy6w_<#2;gxxSx6fH2-sY5VVF4#I^kcu-Drkd%gXz*N^p{9o2iiAaNJgdx-r>T`@R@ zyzi@untwC$yu2VdA@;V2y%l1=cgqm)w_X4NwyVJ1bO{{ak8_d%`jFzk4Pv}^LJ0PJ zkL^=}Gr?B#TU(mHTJ9$&qr6Y}Q|wc{PxrqE{OS4+MR%^k#_3(a*jEU<1lr%~rSXitF%cP;GmZw6z<381}tB*$*+*nB*YuNL>r2VvfC zCGKbXx8D=~Rn;%S*?2i@lNp1#R0pmR{%4F3e=~S_-WuZ{@h@^h{zuLC>L})ae;nfD zXs6N6pk<()L%RWZaVOl~MtcQNxDI;*BT(~?g;&RZh9@2aagL`CTyf})>v{idz%pZjTrCiG4>IAt5scKuksL_*I$d+uZAQKS@5)626}6yVEej3 zuzmedSTj`+)=udHW}Ettzj-l7|HKub+5<86M|?xjDE=|#Ar&nP z4f6n8LVJ!pVTEgf6#?>Pf%AATaBdmlbt6XLdQQaNswbqGA@&&e;re0_s{J( zR(Kot?bxs32kVvmV79Ca*egn*#@E2P9$857+6;#b=YrNMNs#|t2-Z&S42#CFI9kg@ zzCQ5pJPdn#Zz%VFi}-)2{v-X*;9p%`1E;)A!BB1tqzCB2?RX=2oMr}9xi-*r1@XVV z4>=wAzXJKc-VdM+@#j$fk48&ELmdd&XgTN~k=QFjP52BoV>9|jeH^qFTEMMCLm>xy z`zgD`5qrGG0QUBeqt^Gw9#1>=Tyei=4c7WAFrM*zo?VMOgW1}iaM)l5ggbAa_>MUFMpUqbwEBK{8$|7VDQjW_-}NFZW;0*!J2$!+oh;sNr5b7;5T zZDUXmghFNHI^_I5kc{(su{f_2p(g?%nj)C*g~0>0o-4-vep&4AA?NQ|je2jz+qmDg zxC zKIH<^17vicY6Hv>)nRbkYZjc@DGI0cMd1Xl;XJlg2z;=&=YhSwL)hOT>>bt$fXym? zuzZKT>2hJPmFo}IvIB5k=Xi*5-vY@;aDE!?3|ib_If(Jp;W%%fp7j->e(y&y{lAal zPdxy#Z)N>AH~&-o6aFt>zJlZkS1?l?fwh$ulxFRQ%G^EBP=NK{jRU9yPy?2t2B<&| zs6!6mL_=GSK4P5(oOax!@ID%cwxkb|@p^x1kZv;+!gYl3no@$eeqRv0lm+34VmENX zzMd2IcI?;kzr}ue7cgCdoWDe%9sA?}BM7iu499V9G8$t&`6$lyAH})eBe*WjM~mZO zIFs;W#G*t%nfar z6I#O%ig2`OsJ-R@c?W0Vc^je-ggw0=Z3&#y?Fa6gyTiea*vnhb->&hkS9Sq&)OnQa z4HtC+<7FbSUwt&3aNG!|oRz^@YZCVMw<7+VAqlxZ$ybx(ZMlR~kP$MW`o&|ue-nH1 zuP=!|;YAqIXZ%y^znT6oVNd4()43)L{=@@yuN%+@_F&CD4>`aIDs%Qg{RIbTy^1}+ zLev5G(FdOSLurf_Br5)2jzgO)Te7_I69uG?op)S)eq z8e{>k+onNspcw@0Szdni?8zyFJ;nUL9rth1|Lgcu&G5PFzbVIa=XqwmC$05n)_c=> zUovK`_lNv~YDzNF1E2DV_Un-1^`TsieuwiR+o3AY8ESGJp)TJE{onxd!9i%fb`Ur> zkP~jYwr|^R9zy?c!Med2o}JwXXK-Eq-Pj#??KmBH7=!bR(faN0Wv4I*9F>Pb%%M%- zWjq^n=L>@VqVC|RJ^?aAD7 zD~Km5@OlBMk?wHPaSfE6JB)R~eyGlOhVpFmg$w)P^~L?zD{zK}E3VLR!xzf)+~DpR z8%V{Ro#MJ4o}^mAgE#}Y8@&x~NAHAKmyMX``@**Q-C)OJanPGD1iA~vz)och#2wX! z%m6&^)Ju=%dtS!)7%WEYJE5^D=E=UL+vni_vGw27GhmF?1u;fzfEi<+r!75C=LwOI zF#bT?Kv**v6Ru3{PqF?!-OunmX+FyPWOSdjAoT`G9}xD$5yTZGC6D0#y+Vla+<|Lx zm&5faORUK^;dugX@F?>jt{XFhEL@it=d={p5@}<WqF}%RcD-h01yi;s*8+T5iH6ow0{+}@IsQsAhKhxS{(x7B@b#;H( z>({T_?~{MLcu@f*5AQ>yzZKZ2jRP;t3PDRJ6}{*RzY=5Ej%iD0GH3FKw7jnL%R$WX5ByK1G-PRliq4SC;MN%{`aT&pYeeY;ZItE>PM<4iMQxGJwp9hO#Q}E z>^a~$C*|eTYpVRC*F>))E@ReB{4e0oz5bhGoN@qZd+Pf$=k;=*-}R-}|1!M*$|KzC zfB$U$|6KeT%}8|vqZ>(oGIa$#PCi2Vl5{5d4QUt}x9=T)(&iNRq{$h~X$?5D2AEm@ zPv?F8+w1@T4gAU1$;cmwALtkee=_0$8auM@k^h2L|F4ZdX(p;?s82zCCh`ILu7p3WpZuQmANA+xm?`#|n5SBfaz4ZTABuna{*)7m z0~!6z=zr2je-?ixw!RnqskcGCKt4dafZ@^a34eySDF0KulP~PC#}dm|MMaJ#~uH~MNI#P zna||LpYlJ||J45r4GrCdn9v%(Zyx`S^FQyypXm#H&GrA>Ye0zqKePtqefsZ1`Jbr` z7$2a#!SwOpr~m&9{tW+9{fGTi#~=9rXa1kj|HL!QS`cPSk8!U9VR}GROLO}GwdaV&wVZYQU4SE-$nlaC-|RYkMb$SCB-da zOmhiT7g0{6bs{vUMC%4fKhS&w=}n4z>i1J_Woo_8S@%t`PyR*mPexjR(F4r+Aap#0 zH(^ifzZfGwAb%krrPq?t|NevgPxGg?i2rw?|Nk!jgdgEex`8wh;Y;%dWP~}*7ZcVr zw?lb=wqzZ7p5c1N4~XxXyidJVW<4*>E0J;g0AbhB2N*wKay)IB{6Ky|en2{a9;5%K z_oMeEAEwWu&-{z|pZt6`;{RRL|9=I4X3Y!5Hg|k8YegB3XV&*JIiBL3_?__sZXY0R zO+G+5gWCs~ywCUmw;y!$0mctV&oi-2aZW}!Q`~cJnft^Q%)AvdZ%I7Fa1kBPr}RIU z{-ge%4dVY@-2M#y#NUKB@i(mzqPm@`I?F^|)h{D5%ho{#=m{l|?za-Q{f0X`n&r|_q_U#k0v z-wAiZpE#ZN={u7#d_ei0v>c=L$Op){d4TZ&`dr2b$PZ|oxzGI}9{4Lhz|;hc9{4jp z!0iikpZtK)v2?tQztVBj_aOf!U+3=sQT>nO^WCoh#@NF!_LdfQdII7yMZtV00mOF6ih3+_BDJ{=O|YACO;>e=^^JzQ_ME z{>1NuF*CP8F;7O1lTZ8=A7JtUjU5?x-Ou;{qX~#>$^I-4d~QDYTp!@}3;G|@hm_Bl z9QVH%|AafmHN`IBP4huCCqUZ%eLlc&0XGj2CvxWkh6flQU^KzUe1ORZj1LeOFq-Ur zwE;{)%@2aFF;oyOD$@AH9fJCpzoQSlj|)gEd`uIN50G`_0d8GLK0wCgf{*#Y=hg&* zx7^rs?=ybD{2tJUGy$UtKUO0$K0sQ7$ps7#aQBKRrpTCF!0^EPdPQHOXZ$f9py%lL zD3-n_{7JWx-x6PQW6#|Gln?yf+JNx^@`LyJ0Fw{M2gp9=1E0$U9dp6QdPN`W8F%yt z;uwl0G{f(u|4aT#<4!m-n0MSVK0qA67?TT_`hdv?j3)dmwE^P;bUfTV!1w@@56B0| z-p2!f#Rs@+1LE3BbdKes<{3v60j5vzJ@kwj{>PYF`@O_J z^1lxnhx9+g^B=>Wo?~9e?FZbt@I#t_TN6^=A@2EK>KQZo55Je-_kcehCkx|#IK@8k zD`EI4?3w2oAE15m111-IiU&TI3%;kGF>ya>2CQ*8IHt+p1NPj_? z{X%X{!1RjV*Dw6Hd&X23(%dxVPsBcodrZH_`&fVfLbV`j0S?tye})GbAD}Ix2Z#r_ zxqzt)KF0@WOuyxxG0h)PzI+$=v4l6?{~lrguVY4T?T2wyOZkj?s-)K#j_1bsL-)B~ z%lH9zZ9uw!@q>=JfV)1RaU~yMxPajSreFBJc>}5uzjV)-aHsh`j1|ti8pfFh@P7e& z`W`rjESyVY;W)-pzZKWpv~vN)F*mj!!k-@Je%0{g(gW}77ygqy zW12svxqiwy^>k=%`5o>|%=;qt-^KYof5$fw_x69sdDiWyahoU~V6U7*nuoZL z&hcSz{um!HKG0DQbj$@E^TEH>GbVngSSJlc8U*tagL@j{K7a-Vx9wx||I;6g0}ULP zY8o5NgB+UgAdV&6KIIGV^MOzGiaw?XsAtV+g7?)1%)9}k37EMfX5N5VOTer%rW%gc zmNIob`6hin;!M6Cf!o1^_5Y8!cl2@01;67QY9!5@ksiYH=r~jh(RvKRg*bugM{aIl z?sNMAw=VpUCgAn~;vB+*(S-C_WTXc^sT8Q{uKXYwf67mz$7nGA}ev0Cl_?+nhlMhk6Q%n<{lpmOUf!dKn zkC9)HKfH_Y>xi=p+EO$D=1byz=I)Q}KRg16|9`zBVm}mZE#kckbB70Nhy=_hcTrQ+ z(z)HtIrpT+7(bx;lh%1qzm5EXc$|EK{DE{H`2+gG8>|J(F#hup^ONWkj)=P!`oJ{A zUX=SFe&EeL8vo9H#QuXHjCH0EVm}D=!${Ocj^VZ zwLkw~`_cgIUz~Z*e|mplhxh-~{y+Ws9pBHY!|{A-A3D6g!#+6>_xN?(Cw#e|Cx7_Z zKKT##^8-8VOLy3}>adTy-2dP1-(2t4?v7mh13SFF3H|?L#wQmJ@JB$?UhYCqN0a|CW9K695C--|jyjVD)w% ztl$2_ySMw}4c`4bz`G-qe)n>C`w#CvjUH@&!GE4^r|>`i`;Y(n|MHIGsuc@`y7r~> z5rh^mnz!cd&r7md{GIU;1%ngnEY={_;(4>z?eeKiGj{ta-=eJ1@%-q`RiOn(ed|;1 zY!dC3-HCtcuZw264%Q_`8k`eTsV7p|Dm;ujl1ufQNF@_#_D6&X7bPQ za~`bm`&HJUvqNk;8AZ!hs*EWVG%{*kb|r4qW_R~tbFAhqkTKGY_pSCjUESPp(PQki zQKLp>6c>-PeC5O+7_V+CwqUB4OG0z!1ro}(@(zbs`^RUA28fL%90SsWktF)gtP7U+Eir7dGd}2&B8$Rrpp+x9p$TSKpuQC09`vSJ=N~euQCFTa6XmZL?Gy zq9ZbdJ(YDr=9Gv=M9mF3Y1RzU!>z(4IqEr*J9Q%GDaCHtbH=7Zu3~BCj_6fB*W~=$ zO1enzQok~=lHXh9Csxbe1woHkHMiufSi9zFTMT^J5Fx6`igwkN%CQIiM)x)O+e3OR z8EI{kce|(t1f}@q>@Aq5lvck(t|B&biglj#@MmRZL7PnO4ABu7!oD*%PA+0gW|#57 zR^wi>BjS1ciO3Sfvjhx^}L$9g1K^z z#_z`gj<#;u9lh`y59dhOj|h2b;XjD~rNzK2b>~$lI7%d*UOLuehz#o==CmcEH_Ho<+m{9LFfZLUY9Fn`A-dcbnVpDj^}iW z9`7wfl^Rx)_nS9w$_htK&3cBeKRG%kX2LkzCU!}UfK;{h*>NeQQ~9M_4TG))C`Jyi zFirDIywR&d%siziA&XbG<~N-XorI#0yE@l(CTsrMH%@L0Ye`7=kTs45Ny{dCtMyml znbpbM$kLK?t-kAl@fb#T_@?OH-)1X1u-BYc{+D~^>=myNdst{3U%2k)op*kk*>j8TnT_cKDJYf)(F3hMKf5@72o7|1vK@yzw7 z)@O|mRv0^cy*)coxOMVNM;wIJv$Cd12>jmFW8CJk{8Ai0(Z|PaMeEweohY4}c-pCS zD&OqP+S&=oE9-uCpORQ7f6g@c;q&`?Da~zp4HrixdP1XxKQ0ZP*CSl?N!^<%GZrpm zy-KiIS#afwar4RnYWw+EiMw7s)}6EW;JIE_S?Sh=*SE%QRJa}TKrc2m_0sk0Yu2oM zFmm!>GvF++eNfqIdAc#XpTxS!`v&(t&>06tE@AI*uB})-(UKAAIF7jSeN}~wiuOU^qkW=FC#wTNVZ(_ty>QY=H4As zTijJ_>WQqVhtmY-YQ^`Bmpd?G-?mK&oB3Imy_-B1#{c$ekwB*B#H}m%rDlz_ZSs8W z^f*~>jd3a-1tOz;@3C>Wmc^V0-EEYm+SJwVRZVtZVz=V>VLrW2qQ`VLAJv&m(IGguSFc{O3JUi}45r171TEj#i3%As&PUutnW`>;h z*iFfC6?&F^`yEQNvKn_jqj!b!khTEB9`kQ%O~TMx-9v1?_L|OP+0s*_r6Et!KvIsq z>yce=bvw}v{BlJN3ymcmRHFBmPE|-Vbq@&%nHk#@Wf*h3G2v(amN7hCA};BL+x)a5 z%2~8k>SZkA<`XK>ivm}b+>6(~pSXQXUR8tqIioRc zrbP+YdGAETba8xLF>`Kl<4KuQNN~Xu*X|!$G8~5q_RZZpcR1_Htd`0=o6S+<+$)lM zIL$vc;&JPnI&IVIRXrQ_w3-d&$zIUxZ8Bhw^IZukGmx7B=o)ErwCYn86Z|?ryHU}l`cRmj6WgTfzr7b>ZZzM~k zo3d9U(oTW;VeQ+et1iyexqV$?7x-_MZx2Qj~X2PslD?-*No0ynvu2xPsZ#8OONkG?Z#c*STa4Y$d?!i5$ zcrQ0=iX88kdDVIP__&F@nh{n)O;P=u40Lq%tH+v*$j^{}vUps|YNLb;InIEqa*Z=H|`mvq^UWwN>{N{ zx~@bid+vr#SLI-W`n1uKdCKPIKBG3AzQ3mS_~sX{lV*=IgE#dTswS0BX}Od(B6dUZ zj_GAaF%L5Q^Hq-?J*uRlk~JV%s7cLUbna8O`J0QIEoJ#%jV|F=Rsf@v0z7rb&$3$m zN%4yYqk~lmA;nAX$}2xgNPbv(N9MA=+Q3Wqh2!PMJTRQW^Y9mR%E$e>4pb8K?(*`N z>9NkGQ=b_8cH~II8UI{M7prk&N{tq!DBeZ>dXQNBU>F2wH|UE@o3gjHK_PHefWp|K zxxz1_ZR|wG+voD`dVOu-LG}h)(N2S+Ic9z8i^tXKCtT7KI3E%9Iz{tA!YCg32Ls}y z`3t)x8a&;%d};;jxWmY$+m6n#uIbWMChEe|3GPeOuFTRIvNWn^RJ>u@!rCC$DMYZlyo_+rO{{Dy$G0+)Q%=CYwjH%C^^ z&Pf)J>i_!;ohdPQbtW9YuctCfwYa*WU|;5n+wEkMV5*l^*Ux=mTt?43vg^8vL~dvp zq;iz6L@xzlH`>H9a%xSO!zUazzVe*u@Vw@PgqV!={L0s_Zn`~GaPFeCqF1>Tqwh@`m1j(arc2Mwa{C1NAajs#NL4nXb~Of%jLVs>dzX zftsB!sZMCTqg&i~+q=8zTAjS>`VA@%f37|55#g5RS)o%FYgE^w+n_L|*}rYD^wEbl zcsphX>_}N| zIX-v9q;+@vjF%MY3c9m`tuobPJ*yAIk8E&iHA?e-^4p2vVvQuv3jL>d)QkEFWa|y) z-#uyhbrdf{_@xSWv5{x+jG-}YiSib|ozc=Y@^(v^oq6EG{Y#*~GebV@O4Tf8AoQ{t zE&3iFcz27zE@>rYMyzBRXIsAPs+PsSj&M0d+?;hNqM6u4{4DR z@PGKwxo44X%zeS~gdJDR7B~COxLtoaa)WwW+k*ut{bWuJt?P6rdZdHU+@UO`R8~vr zy*>&n{AMJDUTTk0JyETcirE)sE>s(OrZxHPxvVR58g@a_?3R=RgZNL}uDGd{HVl-1 zk`@eP;Rrlo{p!8kZOx^Ef}v$C7i(0_CN5RGowB_7!HAR%!No6P+$*Y{$U;NF4zuN! zAw42ww4ZOXatah@jUU5PZmkp{gHm_Gq)G0QMdz33+`6aZ;O6bV*rR{v>osn7rqo?J zGnaF~vN&ybp%Gqrk6X0qi)HKhRz(LdI!HNQ`~!$?A-` z2LhqjoV}Aqo-JH2K4<)tDG3V(O&(kyu*FQXPr}^h`U};)%k`g4lmG3E=TyOI2?L)b zXr|-2WckyF+D`oyoyM6hxVvzg$uDvdz22DnB_;i)6@SkwpkPIKtIUPUBi8pT>l-R& z=|8*M9!rY9kDQ-Sw0szkQ1-ThwwgS*x)wWxe96g4U8_t6%oe2rpsY^&`ec3klD0e} z60H+jW;gim&3wme<3#Nr^{p)$et^lEt~SQw1(A`!1xu-?pP|xMaa~8I{3D3ThxhlNyPg! z&!Umnwr`UhoNx@QNI^W&ZU(Cuk1wUh&XylE@nqvmAg@8gvG7G*o0w0S33(t z)JIJe>rI8;oa@O^y?ZqeLJACTGdiE{{iMbyW$~zk5zj&#^-o!uIVy|U3>m}fHF*TT zeG~d={ao)ws@_gmax58%n(Ca&A(iN zd)SX9JmZb>BEH}Gr4&&jw>6KR;3;^zV%XT=p1j_3$4{PoL{Jcm%B)+bHelV>qpO{& zZlvL;MH#)va#jdr^dF}*@eY5QT}_Lv@*+__mcGWh=stlhi&~$^uzOln+w|HUC~7Uw z9yv5g!P(K#QMDFJUf`Ccq)utIMyR*)rfF`1=YjL6Dru@#+E^~ zXYvcWr%B%`yd3S}r!#T+v)5%I^GmE~!bn(W~=vb6r`-4hZc` zdGJ~=hF^L2fyrG0i<3htQjA`ljBC;6bzO5obxg=IucXdNH}~+zAM&`idH&*>BHfma z4bA1lCZ|-dJhj|^rMSf^i&@KSd6zX=F0!A;CmhGx>u1uZEBm=a>D0x?R!i7Bj*wN! zzIS<8xkvH7Jv03jM_;#%#WoIar$NitnT=llnp0(|{Cs$+X=BDML+QIMzsyq|X#49M zvBxFP_#`#hQ}-__>l5r)q+i~=>Cvyv`Ch}S207_PYEDm^w>mD=JbB_W%y4sD9@Zoj zdPf}Ox6jq?- zlTV$BG`76TQ9ojF^^IkX%EXmh=9w$)-CwwfB`jt%r?#qV4!=XUxf9c)*SyG=w-6ap z+21}uvqnf_XQZ;kEW7P*93DFf?qO;CzHs&H>w1bi$3@&7pO!PEa%|Rk^WWmlO6-&* z_*kss#*Eb4{=XP(KiI2b&WU~pa!Uo-ug2g&1>ajyf6l3Q#zWXsYbpr-Y#Sz#W$lmm``@^Ru51-kIRL2gOCb|Bg#_^g}6885EZ*MxN)XWYS zv)Qvx8Ba*}z4$c!hV$K7S^QnZlqDuip4>3Y-nMo83?6H@+A(LmtN7*fR>wa!vpFz> zclwCMlf5k_&J-!hEY0lpyMopAH5XEBMX^Xd8tDQQ6u7Av=)*1~_yNw-Ut_{x1XEiIW|hmQ>VFd!X0Y>)|7QhyG_S>v!22&r@Qe zSgR*|=v5c{MJ!uU?Nn=2A(t*Kn@}6>=4zCZ7Li#p{^th%gwA$zY)+m$saiN;A36l>)%UR;<1Th_r1|hH7!M))eTt|)0IkZ9*mlMr%wR#Rrgc+#gneo zMU|IlPkZ)gm4J2W)ci$BEEF(z?`||my6>eNZ8JqMduA4Y(fnbDl~q&*d-i=OXPLL% zb+O8g9n#q69*D9)T)Y2#G3@EAJ-&jiJv`WDP51e$C)~KS;uk>^c2L-*>N)&}F5Oez zWQmD*i1>Ul)Ssqlv*HZfb)6JnlET=#`jfp!giN(;otoLVcY$8x%4N}quPlpPIMqjV z4l1U@mFaP}R+@RB_}Y2prt(mdlE3SF={aFnYqIy#JJDOL-$=DsO>HR^syk>Xx=nWe z)$NklsYz0(7LqAWm!7j%Rpn0h^-+cz3p-uLA-r!Or;XXWT?y8k_8;UqDGw`uZ74gT z6uHPuA}7FVTKvuxRxo<;TO}8CO~Ukcv5H0~)_#7>@NtEhZcrI3j4e$b>%OFu?DUht zLWOs9mj73t~vSBkqoQuH*=&xU@Ude0{Zw78s$bFHql6d}H6jJMzKa&nxvG7KeMBE<4`h zvvXSiBOV@yjemYHq<*~8iJ8`x!4+>%BACy*f)^*q3|M|IZRrMa?CWVw!V!6D@Y~`x zN#&_7oH11s&Ogq+m%si7M7m|w&A{#$j>UMv+i`qCJDzQp7RJ)YUX7={dpro+idV|8 zgPR{$Sm+-6aBlO$`07pAw2?WrdaQ>hmi(rsrt6kZ{avDm?fzr@5tHK2AGt1iHXj?O`iTs?xkHL^T)?ON$}g#(g{=N;h+68Dy66l{CW$J#%sX6H2R+D_)h!})hVIr?DWI{&5J@SEP2yP=n$ znNUQnyfr6tnwqBK1wa-zK0#*GkBMz8e!lbnadj4KaRptrZlG~@cbDM7-Q5EOcXxMa z+}+&?5G=R^3+@`+-Q9vse{*M^=id7dy1MF|+Iy{c?c@FUz}V%q!^fg;urD<)j(}^( z+m?m2R|a_yC3{K4qCR3iYDN^ja;~E)y(fpPvjhH_h(bRQW28(OMoM^{)nlbb8Aq%hlczX5~qQ(?c zGZ$V8WYtntky1`M+a{QrZwdh;7`Jg5h9#RP7zGlxl52M-ZXI5EJYjlSeg0>RiUyr+ zBc$ef?7SJR>ulq%mpyT)T_;>ai0uRXGT%^l<%ar(ivq<%{=c%CSc57LHIZbmMmVsS z;tNdt9@P@KRg|SjMho^6Qs&B`&Y6q{8Y9B}NhE_)k-J&cn!07z#Z*`wouv{ zl&uSQH#S<;qZW zD2by~Fo0H^Npli4%p_8*-I}&{lS{bI8+G0NzFThDs6uYpt$F#16}gt6MDk41?UAk| z542f7p&lu?ztv0MGdPIZE^$NRFvQNmf37}Iq}^hxE~NIFeo{|-yOf1ckXdqw$hyS-0x<*4&m7|{|A<9-bEZ59z|&WzPS z1WmSB8>>l;j0$tu;su0?MUId}XCM%WZHQP-p;$qtnxfcCf0HW33`!fj1x zn5Kfa5zDE?C26Grded{7iPUGCs+V&HMu2P^fC$1%?;VO^>HblZrpTg-Rr7srcMh{r2n)#K+uKQ9T z`ZW6~IB&i5n5C1vW_of}88j_?_vPbwRLfcdzk9EbyWuqKc@jpca)SS=lbA(Crl^ur z=O-5*6W1yyzYru`f8>o?KB?D}E*!;Vj3o=3!Gw#;Bi`!h3`%bT76P&y`D`J!7~>eT zUb{NgN5e|4Dw6fkBfId*W3Ey(g@-- zbI4+SD1s{2`Nh;Hj(FT}fu8GJ!<{4@ga>AcIz=TxmWDn3YK@b`^QM6xl?9)$pUX+b z(Km1%nN@wDES`NC#2|louyB_#j%>H5CAae$kSwD?hed~lU>i=`cos0{NQ0L1O?W#l zxIVv?Ez+toiUFq9{@i5dvqG3s(JV)r?YI-QifiTWeUw`ajwJAaBJlR!Hdo)~=J%C% zXbP?4pLs}O3^HnO+$qEEA>s-pj8UesfcW=-AWCvdtnU!tD}QL5>FL+j>p7x(`2P}X zn6qnGkAJ@A--@NZa|?#sJrt?I;(G+r=uNJ;9(ljdeZ#3`uGg!Xe}JMQgN8#^WrA6W zHT#)p>EV#=SBa6x%KN`8z(mC62Mr``gj#kNun01rKQKye%}~Jq=Udj+=S$D0bD``s zAuG3Y4A_cKt#-sEhoSWY{zokXTexb`YLyZV+NIh|4lIpIe1@?<9jRzb8qBUlczM2jvw=a`rm6UX?nOKqB&q805Pk{n7z<;wGFQ zrOZOxn_&`GVX51Nqwpg<*-F(@S%^#8`ZY5bFkbyTP*+}vF?orsYCnF^0_7yzAT55O z8~U75g zM@ErQF|7|>LmIe!fA08p_W2g^fj|kVAB(oG=4eFsKaDeVGbyCe9Z+wHI-0_7i1C1(wc7|o|NO1@ zTSPaFeAKS@FYBIL{!J9H)aw3Rr4l0s211UJ5nZ$D^Ex0PG3;CD-!?I}9Vx#@#x1fl zZfom^*GmCO3%~4gTtuFA7HrxHm2z#fjJ&wQSe$JeCLYiSP1pJ zF6OvB(gbOTt0w2tPK1exIl6px;lb|=x-d!tU$|B^CvJTIZ!<4z0QhOBkJof5oKEA? zeAzjQ_Y^U43;xDD|0kfmUor9fC(EB?+?=ncZfG=(!&f`|E6!SkHxNZTpd z?wJe-t(=58O!nj(-{vseXuwU$EZ-DD8Z+vqceIvakBF3QtycEB|2a@@s0LD|X~8VC zbYCvFaBw^W=Z25C)NKUUHMjc=Wz**fUTKP`MD6>5tKr$)5ANe<2zz0p=Gi`MY?@H< z-#SICLb9|AR?un)B!LeYTLD}4e)|`w*Kv1R0ne15_n3{O-b=0TF`uWfn|DYSG~@{e zc1DKI+t4DJ+^2CLr$Q73(;Qq};b$FDXy7^yZ08$%fX{oShKYp*&8P&}V+R+S;8tRn zc)3iQ3B@gMNw-eA>*4QO!<#NTX!6o{=Ba*dI=^$QK=6TKI^WR3s(l5mETLIax%2TWy9Fs1zR4Jq6 z`nV@;a3^RI*&f_R%^QREUtd;RnQ#7fLdH)k%r7SQFXK6O-|>Kdr4%0hrpMC7`VWn* zPuK*(&p^Su)iUMJ$LaSCLnww!vLbu>Wp1Kph9K-9Tmvui)oBJ1t{lad`NiOS6;rTa z0(Q5Xb!@vrLY-f$$BT{}vfv6FztLrthvu z{6Q**FWpbSbF%hmPv}Ich!RoeM#)Mg5I}ntCgYB=0e?XzIQlqa0c4q0{$MI&(dIwmXtJ)Y-5pAyG`I=_b0>7s z;2P~`Z7qf*I#{F2it$*Bo|kHe_oau-Ar3K!U|55^S^M0P{n&26jbz7sdzKcG*iN^S zLg8z9oO5Fw{A?6^*K40Iudn-#qyK%ur_zU~(4*<+kKAd4;Q^ROMPRrnz`+~a zsJdQ)n2=B&GLnmHMpzkyMsdUW?@O1xI%;qbU9?r}yG6{@iJKN0_`h^HX};MJi@p_u z$d-;o2VYpqcHs2A+pVO2BlX{+qsFBcSM8`>vC)A>(xLq&dv=|%?GN?`#k9^H-BNT zcKA25OAd3qdIR5*I-lc&dB^pK$KK9_{qsh<{#@*N*XlW{UAS5QBi~>Z^VZKzC)rxpuhBpyq_ z>^l3H&lTVrG7Q*5iqi=x+@R7xH$dC1Ys$nUrJWL|SWr1*P@0%>^0$8B5B#SUc=h=) z!Sc4CJU@=tG#Tm}4)p~Pfqo(o!s-0#OHhvK_Rkde-ApmXBT=$-sR^q5-tu^5FJuZC zBltd`<3!bVvghsI@UETKz|7>4>dJpDCo4Ozgcv^bjI7L7<_a%HHv7$?78CXATu^cYSl4`)rL7WTJ2yU#Njej z5tI6tjNMCQRICvLgH*igQH3E{zn~46Er|syLSjIM0V~n1=CQ~*b>#e}_ZAuD zb91w{eM!9&X$^#?<0PY&9Am;zK5w``Z|EI< z(w>ql;^T;Lgo^#F{dZqg7mA3V_w!&d zB=ID@h*75zBe4#pCgvqG)5Yp>3^AW5BUQwLS^W`G!<8z=<;tdx3WWY>unoWcdAi*l zq_AYx6R(0>a&{_1PjRz}np3&3xfJwIuIq8Rd>4MZQ4ZMU=y{$O4nqf__-4{NxpfvJ z!_PfjH8J)W%4K`0@NvXy7RZN18wA%APC0J3KJJv*HJ_&ZN^3I@h<9 z>;MFLz=fF>|C^KK$$AbaN-5ZGgIjUclIWrmMI=`h+m{2JSqH%KrPM6=E+ZcWYKmP&wos2>ba#I5Xx%*Ax8D!PY(erF~p?J();xd ziY|c{s1(jUnf2Jf7Y>h)w8K$ppQS?~VzxuubAV&A> z%VY@B-|d3#yn@cwIlj(+Rd)6+yO||@Jy8BIE$k(6cE~BceXV~LN>DCl=fA_b0zE`oZvd+4^9)kQbb313Bg)At*QO)?g>Oa^z7ft=k&hO#eLbmv$SsI>k7Cbm<~9j zpdMcTiE$%eBkK+Mdl2!fe%2mw>oj<0KDdQH9fjUKd{CxqP5#FYX#m?HRUUSzpVPSc zy~vQ|N}EGb?YtyyPs|M6>>D2FG;?2wno2~od4kZKmvlM@LOtzBMD$uSGPezQZ8!e~ zk+fg%DgJ9Bi>|xMb!LSOkDK#G4 zOsvR%;`?IN3m-!oDOT2MR-d7CHm@z)lk>!q^nJcq8Xl?#-nr9^QLp#&BnY?(KLApl z6cKXv2wH_5J}~FLeg$PVuvH+TnhG0?xABQgk1@vbU(HZ@tv<9~_UM~X=DhU)I?z+) z%@JNG9J+&YCMh?F`X|XZh~`Eq)|q&|hvtY5*q&sTQkxMWCRPR+sR=rv_e&z+#)V*@ z=$mH~>E*u4Nkk5ghcdbM? z5F&Ek85b7(7@!){)@qKPchc@D+=76pQN8f>XRN2(>@sWw3SfL_rV-h znn#2OEg6zxah@ibn5(H=mNG5_`x89{76JZNBMxLuv9=#lrQ{FOep`w4A(rIQqLC)% zLMMHW4%Hy}8p7mJ`d~5<%27G(wuXVI8=@M`92P-O80>JjoUa7U3~?4QO4W*~HQj-S z(!!6384_p=g+5a5^=AYq|?4V+a>vK2K3U2~L``GV{z$PVt`By$O^D zD|^KT9=;~+Hy{`j`53=@;e$UFMMkD{&NaLUYVviAV%8=+p3ek5QPYe(8KzG}5**n& zl|a~|R(*M{!QHN_aw4FUvw|*63vp|7Mj|sk{mA-hjqJoO!=3gc8z5E8 z+LeS})mY|k$bCpD_g_Ts^yQEv9})=w54AA;(k(gP&NTG*Fk^<}HNW9AgTsumjZL&& zw@i_Ml-A%P60(sXC=-dz{G$9XO_d|;o6L!r*s~jUVb7*xH2}qls4W=&-vKBAaw}kt z>XQ?jiF4vI zGX&I}VuUQx*7lJk%FHJJV9HDY3}W)ua#on5kxf}$rK_ijuDb@A4enQ=te$q!XXDt> zVN9%2T!w`_T%+3Li9lew@oR`#eElm=plR4v;5}iRYQ|_KuOIDj6sD^N6mq@(yY63j)q=_--;SdtyH2HD6SeUW4#(M z(x3+FwN;E*N;lB%d9qXlvIWhW)d|sdL!uAS)e&wvSG#g-Kp~LX_F3dF)P&- zpYXrmpZi)pcZi>7(}JRo`5=2!DmPn$j4{z39C7)nAdVU|6nj)?MvD7FR-qo22rpgrn1=^ zF^bGbI4%~>hRcLJ_MM3}8i$IE8rX^2iU*Km>6nRFaVo9jDrYr&s3eKO;qC;Xh{kvU zsfSas8U~ltC{p9A`GQas1)yf+D9cQx82{dsmO_e^S-nD-iuN{wm5thnOLDbj*5EFv z!B{ho;tBU2M48Q}ZT&<>_H;(4qsqN5k458JPLvH48=9`{|IyqSBDmh*Ir zLEOe+LsaNH1HpO8X}5iv&YJ0q*DL&XK}~NOm!3h`5ljF0()Js>o=$KKqf-g=A{mL! zQrwposJXOq%4Ef-<~1dnsVDAHIEoY-=*05*#8e6;0ERP-Q7**sKuGwq5K3h!Ioc@i z8be`dDQ5Trfqj4Pku6K!LH;O`x)Sb2)%Dy;444Y+lDX?^-AquYn~wrspj~$Fp>%(4 zIPTQWx9%L#KF7meZVUSi`+F6A%&>fJ9&Hf|(?k#(SqT9671F7Fz)QBU2$w5MRv6c3 z!jV>Yx?=z6kuK<~)^G}?P$xL*PMMckit1cTV%24gngs#?q`eVik?nbS+cS-gv^aGP(R zSd=#dOx2Gbxd?cz>ML&@UohY#(IoVMhil38}IrmeOp({*ciLp9lBPt zXyvQBUyUM6!C&XAejag|fj`k%xxikxjaL0<=Tg>~y=@*0``1sz*_=d)NHa3DP)ti! zzEK_sntn&21r(%YaQ!l>ht?lUNVc29k)MdKJQG7fkjD&$8(OYP@{l|W_@>_YHx-QS zlF3e3>~M&m8e}Ln&=?|;8DGE}+~eN86v`@2xE!F@3nKle9DUUyLxobF4u?P*+AbLN zO{n*Ods#BkS%;(?vZV~ z+Ws0!`@A=dTKiIjJBT&58j&kQWXM7I=BDlPs;#^r0kZ<_v=p^L;orxenG+H2u)Fg* zQk%1s(cC=C#{1I!KXI8-H}!@f0~S&A>Nuy}e?61Ism=o&4m27%Xp%!!{BzVP&R~;d z60KvDqqzo;%c*KfKp0?X?NC7HVqSJ5o=Gs@BKQwXg_93tcLQoP5o^A>y1F{zO^r>V zxpAa>;oU+$7BlQYlNb1&Qul`whrpIn9*;4hZuw)dK!%OpXvvkNN=bLL)(6v z*_goW4H#er172VAMLyBi`6d5F@H0H`-qp?4a8J5ok`YJknJKhtahuW%1$hN4rVy2| zf#}7%X?BEnwkeSXG z))f%=T?qz|%FD|EFev8sgWGiQeM$lub$RVF3$?VD)$U1(M|kQ|^ya4*IwjvSy&wku z8rsH1Q)mz|)ekJK0wGmd(?aC6cB<>#w5|WNI%IOam%+ICsSC>d0xHVu=SJaPjpx%E z!&7KXe8G>A5O^%CH$`i^4}Zofya*zLJAX6df(e@68dC0JNjd=()c~9rsS;0wRx7Iev+qG1u+QCM6ojv z4aiA=40c(;kCd$27J|s<^J8y|4q`llfuZ){Z9f77Tyloiu&QI66oPtdtA)%kIZx5o z@0`3#3?a5>-*A}eL=(o}C?~u@#2kiQW zH$CqkxSNu7R}1N^3t*-U*b3&}?YPjzoZg;qs5FfR`w>KaOk&93Cbp5JM;Mpkrn>^5 zdp1tL2io(!@yx-2++uMPn>6V$=L;reH9DnQbg6MUwYxpC#&M?_x}5N{vCA7-4~HDu zgGPz`PTFDAY2-5bGm#WfRz6`OM!c_=>TH|E z$vbX5^H_xLWplmp92%Pd99U*7hhdt)$l#=>VtAp_FQ^M--rtA4%f3!}8G2kHXBKc2 zBZs%YpJmjLj~&0948om1pqnTBxh`rI?!B+XC<+>cj?|CrJ%v9G=vF71j!k^e*Zl+;u;fO5+Fhy_(~QhB!WKPRJ<2(reLqzU)Sc z+x0`y(26jIy6vsQa)7KtFBq+4m2-`)-aP2Z&qU}8BoRk_Njq|6EF#6Qw=9VO3JHWt zd?Hr3c}*}1IC?f0m%b;15H0(wBn%MsDSE3x1xMaMQ4yg6+JfnME6!vK(X+3mmdox$ z5&!LGg27{|e5Zwh?F0Fxs4f&+3Z46jinwD&WHBqMY^LZz%^W&7I6ji(rDu7 z0bRy0kC5Qt_)#63uJ910W5MAlhda@5(dPZlTcQfwyi0ki^L)v2wsdAvi0QcE*qFTJ z97Un2tMz;d9-9^S+HrX5z zDdVpNY7QzmI+g`#hDbcCLI_?$Pa*n2GNn*TYWVK}f7-E=>8gGxU|X8xkt_Dj#) zxOwPd5k^ZhN3TtFXV)c8MY7A!8ieFD9p!8j#|4UxOcm26)wU{K_?-|=<;c^p&yI~s z7SF%xdefkROk+*av;t~rR~hc(g>Yt1i04Nic=>4Qc7%m=UZ+ZS)Pc4OV)gijRxT_- z1Y6$_yh-8A!5n6X!<}O8P^>_E3N7vX;F~1zZywaU>2Z}=XJqp;61U3K(C2c3bL|+9 zlZm9arGMGudd96g=;{?Hnn=|6Itp7VMJU&b0Un+pkPsFI4Nim8WsEB*DzfqO`_jSE z{%+EszTeYZqlzlCbnfGPrB_(%sm3(DDxty8ymKauEn8(k!8Dy^n=C=u_T zpkwZpXWBlK(X-*?*0mQB$&{hu3H&VMA>=j-yE zbfLtGStnuoXQLLi<{-?^TQF|kvuKThkQ;;$Jn_hd*g6CE*cPlRX`G+3O`MI$N9-tN zV)3zix7Y8UzgFXD;V)jk450UYO()T%(Z?3qW}I}}`EIy<@K zWrIQr>SJq@-Q6ZnrjXP(uCdZVsI!8lzVs2-OTuYh*ViwV;N|LvlV9j>`cfCH5h^b9 zci$zhzBw6AmPRoe$b!C)*3S#D2;yave!9Q8tQwnmr{p+0@O|&7uw(`JSp4HoQh%tb zIvc6ldh$GEsdn?Re6EI?UVs1dw0^t0O=UZO007{U{0Z(dN#uqQP=D={5Te4fLCk;o zN3>#`pB3V~Wkp3{{}c zN-!bw#dts=`lN6iD<_uO|TUGN(Ipox2-{^Cz%r!`M^+!)3bMZy>Uu% zR`BclSW8ufrG=s^T|kp_%F%-%`tR-i89koC+*<+2*6DMTrQ^Yj+7Y?}*Vn$52A4Oe zet>lRy!{NQ&mi=DRR~guYaMSAK_~ey^$dRLMP+W-fu+r_lA-9U$betR#!YTZ$#_M% z5$p(dXjclH%QrJh4)QS~{cxr7RaL1bYLqT93}#v!zf8nlhk!EMM4-yxO1Y#m2N%o` zim@Yipu;^2Cz^O&?7w%R-v$XT?E*mHo><_X6l^?HNTNU_IHT0i)s;)C&X5L9Mlo-8 z&UUV)fBgNPUR~q;pk!^?8&@(?`AN_uK_H&ZkjzOfYyYjvgy>+9%bkcfXH8DJ40>F4 zjDv;6<=8HzJpRNSU#eXKqN_^YKy}#q6e`@(=!z1`!ujzx?uZm>rhnMsMDNcT0)9BU z`AoVYJl(WjD_xD=Wu6~7XT9Fao(NK;^$m~r9m(M=$# zZ~97v#>ct>9O(!zMyAJPTYNyTw>4#8l1bWwmIQc(0X+p!eKP=Lau-^YOu^$P z-xJbsLUDwr*Dcv(q;HG}uIPSiGEFn5MjBQMYpANWA#-DQdLPcZw5{av6k~&#@KhAc z=(vcPbmi5+s7N+d3AX4TSQOC>RFWw_GV|Fq7rFKaxmd^82@#4+8IAlsNRDO%dmMY zmFG+S%f~DX6THk|Qbq~&TI8QtI$0o>N|~PdoL$Id5Enb3mwEvp#y&K2;USwGDp$sy zs&0VL|j#h$X>&P({Ene8ULCtbWfq7V#nJ7@F*DY^Vi-NT`c zXzf+F{U6a7hY*=b{vl4FjY4DzaO;Q>8!tp^uK_?aU8SZK?g{!2EXtXxdYl)kW1CC` z&K5w_f7b%1`|1A7aJ<`Cg!KG9?sje@W-N0Fl*lY62>sGEyrCf zaZM>rXH3Rar${daMwC_xufp4BWJ*1d#!iDR8tbN-|rVO~Z-P{ZSuQ9{vYH#!_ zEMRyzT1eWMP!gS@y3cQtNefJHwn8Tk9CB{fA!erzCn3AW|7p$@JI51r{dAy+O)f#Q zc>Q#mfGBFRFmZEMk{v5t*GXXf#0a%PWp3>pWzswrg;}xO?u&{TWy~ApHDAMheJ@Yz zZS;x!;}*-34?kvneBw)sOf!x8jKbFhA^+GgkFj^pi@iL@t|SY_gF2M1UJWLhJ;?7C zBTb@k<7MqVjDM6^4mJEg*Sz3Q#+`Y$a;8frkBH!;kb|q`umF*Do3?ttf&>@-iNv}E zZi~$BTcxx+m3az@(7o5}^|R!$NUXHOrG_gIRvlo_7o6#ZK}_O5?-K3}0Zo&G2U>{ODt2yI1O((`(kiJ`FaFSAc$q7({la0q z(9nj1mOBm0h7u%|a6=O*91&Q1?a2SWQ1Ohev|}1XHOth}i8YlcJ_PNPWwC|4)R>B& zt_UK0+>pSHlEu;;kM0RLWtD&?JXMEGj!kD52=oEHI0_H0U9}_2K?j_I-rts>BCK%7 zOQpz6a@;6QtxK#hQm>~)NOG@tggQg|GBB)8S-U1KUJ7kv$EmsCa=@TsGh35$gWT`{ zyNgcnJeD8yoZh(86!ghC61KtmMro4OIeq7Qto=MPj+*eo(ngcIqf0~qz>P;{1c=J& zgg{WkDwWX=Sd9d*%GGtiu*P@6_RLxprWS8q&7Zirz|)tRxws^QKViFGF?05iSx_KN z502rN8PuuQEmbbsJc>ff3XY8waguDbrhA~*CcNg%nohUI-tJWW5dxUnZ3eXFu(vLY zN*syE9A^7pcJ4`~yJwXJgeS7aEnlxEVcO;WVBKmBue6Y8qE^TYH*Rs zpUMiJprc&3G~NugRke7EkhW15VLap<>sK`Kdvh-oEj8w*a3~#|DMAHel75UGy569917O0Qc_aRSDRxD>ZGd| zi#HsORza4V;LzT016U^02Oq(X4Q6nvtkH7%5Iqt+9qb4J+=!4{?%TAy>a6w+%6;fT zCC&|gzQdDw!Xe~*vxPYlfXHF{!fzA7JR z8L#^#1mZ3NMTD1!E2DO5kGTfIU%~z#zcEdjAWc77p1c^@SS=5V}tsBtoJJ&a8pQoB8}U zxGdxt+V_TKHR2L(1(AZhF4uWe)drk%Et&s4@Wg|M4luf4GC#OfX^IX6M4zJ*Jt_nt ze>SH88x|;B8c!zje6lJpI<*y$5Tka|{g)``LWd0n`rLSj;6}wvj%`Ea*x6GkI7Ia# z(VZn4u+*8cdA;_rlDfieB%N%!rNf(?ed?bFD9zQRb2r}|o!OpD^BUCYtW zaZ1ulR?I_$=Xq_C)0a(Tlr*FLkqP>IZO$}=6D`qfkYtz2-1O~0o{}#50_WyK?>ep@ zUB)gwHNnBATA`U$oMo-ltZq}r?$~~Z)BW)*N;8hG4`pqmGL%RFEteEMqC`QVp1zB~ z(zNruMIu@_8jZ;$jhy<|YG0)Lh1GylBy zA13y+6Ek|9YV40cUWGM}*^Oyx+}af^=W~{PsEF}orCftR;=vG9yrHKnBEix9c*f&Y zL^I?uV+fW>6ygjd7Xv^KhoJX`F1lD?mTvqP5te}IA1B#gD!-q$w_777)p>--71#-2 z0mgrKth`u(QCU${i-7foO$tBcmtjZZupyCb>($?(9OL#a!;;;v=ki^5`MN(eZJEk~ zJ%sm~64yQNNV-4Hop*l($q;8+L&zDGik`(P4Bn^2LaUZ*{1DL-$%&+zEu~8(bU1^3 zhwEFe413cCP~b+RCXoSP*CIkLxcHrV`K91SIBDeV17-G_&;n!03P4!(>e%=y4opF* z9=Zm>BTqTV?vH8P3nnqTwewhIg;%zP&`;dO2WwXl;!M!cmSI%2dOpJAkyMC!y;#PC z=zxKdf953+KO>~%)4G~d*}D#Eb0>!`bHANM-xHD(-N7NDXEjv$txg}e{S+og zip0aVo*_7~JS7-Pr*HKT;*EL4ELu>t~$Yg_`AKKr`bp{W+)f z(5qC_UbARk!}dVigrwzwue&$_JLiRldJUG>;|TntzAy5f{&7X0Sv3tDbcZ>UQ8AWy zkN8h)mb`4!>G+z381r;rdR^N67^LaOUo`e+qdqHH09^T^&__vGsbQqpyALQv5h|jH zdL3Qc&t~0LG~BMauh&qS*WV&V=v{B_0 zG$gEzg_X_mSGjDl2+KxNX(l;k%VpWcv#k-4Rt5L8uARkTO$E6^Zm{XIoSQt1cD|XO@h7qhAg~(o zU11Hhp~?U!c$wUM3AafYzYHK?qJRKDX>wZN|A_y zy1yS8lz$~IOO#SCl==EM(W7#RIy-6<^pgm_D#@&a=w?0UOUDMu(G+uX8GQq*f?XZ2 z%KY2F?^fZjhq78_aVP-Zhu8Nj+?YY`?#(CXvXsI-=`s=nWUrY(2-dug|qB7W|WAtb&6u`)RcV^1+@3T`K442xuVRO&r? zYS7VgF+*0V=Yci5iDnpgBg1NXGC(Cqx3#N3JB%%9_!uY&9Me z?fW+H9z%Ep8t^j<4KkRc#r@DUbPgiKd7FahkIy$z=xK*rPUD;;T38E+P3Ub-n7Sd~ z0d%1ixnfl+{HEC8bYrmAS3`^1=>AKr8BaZ$5+$Ek+74;*fF?%%i_Qf}mKql8h)L9n zRNRYFaIe?v=dZ62Vi`v>kL~U4j@$%sf!8($Z;QaN@u*F&J%`=f6sn^41Vlub#}}va zmU&?AJj1te4?}fk`FuVuX>w*(Ho-qRS6yK??E_}2w*}odRJs-xs^gZ+ov!J&7M|#m z=v&@9oMmD|bGwk9dYvJI9w{ZX361uzB>P~&DnM#3m$K5KgpxXMBCcWybb7^k>*qlp z=-XBXld{_@f)WnZ`OBy!G$U9BDF^cT=5v#%zJe2vUmGIHa2ROQgWeJpdBYv<1T9Xj zW0j1Q%_mNc-&{;3ugk?PW`6GrU*i$u(J5cIL@Ucd6|9Z0s}@z0f=Q%fg)ZA24;{oP z2E}Up`gSDznU)avwkLQlaQqmgB|B$eL)Ny=8O*)emSY0J7oeh2`@x^kO61iYmqTEy zBF+Ly!A^N>o?R9%H6)2b#QUcv%cO&Cw9+ESqgkRxtu(b|xzRSA@XC2tqN7ooh@d!lfQ8ux z;1JR9xxZgp=r&2XAUF3d>+9z;yJ<_D41Wb}dw^};@DblJ6>_dtd`hV0v#6CVola2o zbx9%kGSDh9i>gp!CRb)c!yV6LD$=2!rIYoz+8k9gEP=+7#|}8oUlWnx;}h$&u?eHw zRrFjB8Y?VdD5s&gc(q7j&fn|^ zWC>dZwjs1{qFZ%wB@(U(VbUsK{c3Qa1imBj`49Rr?%CDJs4EpmBNN1ZvHPz81s?k0 zZ`8Tt#=Ue?VXFdT(^*@op_LdCrBKSCH1sl9?n76Djw2SjFg;!8UH9BXI`<-t)*LfM zsK<6{96zqd4(#fvqkIsL$<3faZh)N*%#ASg+Zg;^ z?nn&))EH|TXd}p!Av2)0O}(}WOYS%XnSo3hni-_2`rMDbX@8$91OQ;=JJO%{#3!Df zpP&DKUfqX+bA5EcY{-Jw=)+ znyqE_U%#7X21#bn%Ahi3E9NNeY6F5cI-gxjYpde>)=nX=6#3CN-paIWQ(Hd4wm4;~ z1hvS{J{-9TLBi1g3ht1>cE=HZ?tsutus%HZyipW9w|!pYvHDQ^;q$eknTOCfC} zz?%~?8sCq(lQkLug|UuDV+6{8D8?wQ|9rK_TZ=X-0F2cD0R8DtfBN^8Qgg58&0P)j zmi^aLl08IRA`fBt=ACBYcHw*k(#^Ju-xp(uP+F4c2!$Ovm}Pe4U7|qy7{9PZLAAjG zf-*LnFVhwj%pkkZkErXU(9&?%E!T0!jvC#gPq0IF*0(P%f8!Dx+E z#x)BFiGszhp*}ImeK+l1Sy)kFYJBXL~VYOA%@^m^(XH?T1zUA=O_nVg?Mh z`5Xko{VtPns1L*-QOd@+>^3cYzXg4oU&ALBG1Sk4eka#5;)zLw(f?`g;fGom^PV>v z0E9G715kkazz06?U*_iKKKFXw+|@uo{lJ|R%Vr=pg&!vDe|xppNiE}5)!1$eq@0Kf z6rz}7A*L7$>eVvJ3_Rw>slLVt%iP*}%XQu?^BZj8jvN@Yt)i@qp{t-VGs^?}ujg&I z?ct8?HFnA-;^dP|HeX^|cBm8~9%#~m2j4mF-Q(r!!9Ks;ZzDh6rYzh3h#@LsBBv3! zJ}|N{Ed6D{Nqg5%xb?6fiE|So_b(va-`Hb{RSEFN7yFJkG629z5b#4fviHCL{r{xX z>3sWAU+`)V0fzLZeY?43TM1dJ29bbhp#JB;;A~mX1YTmvLG&OJl0vaSy;Ptip;{`E z1>@gyNgQ0?P8gyGad@NATBBwpvE~2(8T&~@K~$Bp0HNKa9qx~nF?2G6ipyk$D)lWh z?7RLte*DdM@y1C-?eOUak2k9zwTP z0{XdkzJXGsgiiq;gaUnx+;5jd+w4@?jzmNpNooa2MYrg-7TLXhD~WdYzWew+FMFq- z36{AUXjcC~{O`=zx$=4$G*iPu9~xU`n2J&=%g1RHp&Sk7&|WhdFaioIGy%VjVCnlu z1nlK!70UZ$biWwxKUa@oXq)>xzrEO~f-%1{_wYj(9U0q*01(n@K#&31*T4Sth0lEE zGyf<_l0&cKJzmlDvv0ebidjU)ZU*0xk$_?7&)TU@L-3MIMhFCP6j3WhkacWW-*NUW-{yrQyq&0cRYAF3z?{6UsR9FJ|!&mZtH!1+E zOA7$9&wcK5Cmww8!S}b@?Z;lr8@yW5hO4C_|M>5`nPQ_xo)bX8>?7f>feq_yR%6xR zD2gen9yedJm7b32XLk6lf4QLvpv`d0wE^rH`FvZ@boh5;&XH(nE6JO0zljOeqM_SV zB8bI+2}I!Z3mtr+6EL4zTn5`hXW*!lP>4KtKs(hT&mr)Ag=6mAhZ6K>*v~=#m$uZ9 zCjHdh!w;Q(CGU5m0)VG+Ko9~z3Z!5D@|Wj6_OXxsqvhr0zk1#7^a`dAzUKj|<_scs zKJV@>0bsPxN238*(9-9gd#?Gu_r33zPo6ya+4WxFYLVivlqM=AKJ;VvQ)-k4 z4yh5)xCPs0O21aV}S1!*G&k!$`@b5)-K(Buw7F~a;oB9ToN^x9KA zV1AzmAi_Qy)4$FXC{EUhRR0g=9)9S>SNd)@G629z4ZyI{3`m1z`oRx=@b|y=wXc0J zP16(Wy~t|iwqDVVkJS0Q-02tIb01Z88W9z+s%TIK%MTFBv*BdEM8;@o6MRw(y?&3` z#>B9rk3el6*$yMyMwUbSN6dwBt*-??{Kh-DVe16@w^g_{YBMqaJloPac2r<%8Kz4x zT@v|nsw$W)3F;+5ITpmRH647u&Z>?;4;XGeABF6;+v&#Rq5fLYmwwQd+b?8+ia8CJ zK>GVzyc{SL7OR>9zCHNhgWvqbCqD7s#l^)hzE1ah#nJ3!oe%%S{gfwFAeEe|noF=y zh4tYrOUfAf3R0!)AUd4N?j^Ob5#|_fEZ#1H@EGP$>usk;wgX5NH6QX#fM} zmji$Z!-vLa`Hl1+D@+1OsR5DdeQNIEhn~I^@AYy3fFYn~Okxm$Dd1Z2)KgC_e&7Qi z_}?CX{PAB&)AZQIUi@;%3wW(enUDVTJE`_wCa#pmJF1-X&pX3>0S<#L+|f-nh3X_P zpP8c)jl};$2OtbP07GZrm~H+%qmIATTBf0=pq;^TVo2gLZ@Bqd8oJF^I_wY~c8V@L zqb|E-huu+^Ygndm>RGn5jtFe;-}NzZg~1RD*qiid zwc0GSIxIBLp^H06;*u>!5;3Sq>`x(sLPL76&FEn1`^)XiyTU~f!epRY;S^;0m**aS zXlczCbpdoaXaJs8(*#yH1YJvfYqeV4-}sH+`20sd`q7^}bm-7OQ%cRh=68RE(EHwc z7r*epO_b{CK!OE!ZvG)Nuys8nbd}~@B9RkYdGyIch@?X)9%u<+^P0e@PhhoB-+Ju- z(aCjuQ^wX2Xr_kcRI{9DmJ`F0Ys+q`vo<9PlUumq+THBg+Mv{5CYA#~0FdVcAZ^Gp z?~~DW-%o+laJ2uz{w>ur3f*)6aqi)V{@|6r#Q|MT0084bAoK~W3IafK=FFM)ul?Gu z{o7yt)nEPbBS((>bEVYsYyAMP2VH8-M%u>P>=(!{t6r4fEM11A4CdUA@=8hG0Z>8^lS8+KSq`eweCxBi5!0+U2XsXYx@L3APA!a9t8S8a^%R7<&S;r zV}JDVkAM6}j~zSqhg$248cB7v(k;8U@lW3WW7O4=K{;-(3HbFjpr09*62%!+ zA)cJ!TTj10RVrIv-!Ncw7q+ubLNDFJupWWK&}#sL;|JP-Sw{=Ch}EuX_Z1{Ws?Re= z&(N>V*hxM^d!LbhV7MPv>z@_d{dxp-aU78)zc%;qLyunScX>Gi0IURoPz&$?pjfF1 z41vMHg9jHs@{y1HtKa_Z-~Q2)Cr|#HO(0l5ec;{q@u7FzPPKeySc_b9xNjr|zpgfFW{fdA)@pzq#TY5R`Sc-}-bu?uB!So8 zd-@UB`T?VopVig<&|C_&fJ%9hLTlk)%su?jr`GjiE|4x)0D$#t0%1!=S|3Ob95`_9 zgCG3h@BiX2{^Acm@x&9KY_(e7drhC@GNq6I_dmw_Z=I%8?hd3G3`;Rs;T_M6p_3RE z`MLY1)}B z$>nD^1FuDpOZ1_rz&Odzu=eE7fq-JAPj&wA{|EfmtMv{qX8?flU>yR0W~E;sY#s#q zK>zUJ!^!6Gtu*HnL!my!;^HE;A_y_;3mA+7bnD@M;qCWvwtQgIiCb^ap}cT z1hq)<=-)n1HaX2gbsI|=bhRM`>-Zy(;z3IAP+mZ|FO>YF{UsqPDe4Q)0Q}*_7W-Ha ziH(%4_6nUzNzyV&?%|PaF4lqxbRfHy-DI{|}F_Jo_e;E(&g96*iQcy#T25LdNpQ8*-&eqDTMd5uSH0S&vz~8i zH6Aebzj{$};^+}tvcg<-D<|8APNvC}#wc5}fXvk@GYX?LXa$+F`%*Wfu*yKW3Z<#C z^9!g9vJ7-)_h%WBgvrGNM4k3W=Ku4j|IoaOOnM~&Kz^Dr%OH#Uyg(2F!is&L`OIhD zeDA&YzT=u}uKDqDxxCe1^lAnGAq4;K%YVZsAO0#!v-hGYK_Ny+%lyQ)?wyFDd>uFY zaj_6HS&i8qXVlUr*KH{?y>$o6sTqI(?pgu!3px6l$9w`8qTlA3B`e>@Oj+{yGtZ&6 zUdNHF$b3(ernX9vEl_BeCbIxwtCuQ_Q5G1qWA-d_z>r~-%GXgDMrV*_NRu$J@O|Re z(kJHs^S}6K;Z407KybMv0$m6Ne$||O%7x$VQZe%8fBU&z$1*<HN#SBNPU(Z_B{S6hFD=W47d<>S?zeYEmfMn zmNuQ)fc9UDzZd^peyVb}K9m9I{>Ik~Kr!U;7gAGiK1H;=@ZkKP{Hy;H``r!vmU-6U zr2~R15ddJ&=izJhz_1z+gxZ12?aBcm1cAK$`mg``0pM}}`&WMDSFU^4yWVxr-o1P8 zo1C1yt57Ih_i8`rMxuZG-@Su=lJd_VJwR*bO=uJ2rws6)aX4$Q!A^wH)j(gPk!-DO z;o$rd+giujyL%@s9nr~*V|bSZC<8B=FvA8n04BhM^#Gqe!7y9d9}+tQc$z7CLRxL! zWuFW&cE*rnZz!ziH+f+2mHXuYJcQItG@l?oec}(!{ptVpDWJr_kLCYDbBTfAN;Cn+ zo_fr3w2gwmTE2r26viDV0Qr+Y`I9q0^D{ql_ujpG@7}Uy%RQA!j*4Gf=ScoJBLoNuU zaJ2wHeu**5^MS!AgRjc)tNhN_CnhGM-~7$reA6wr+;Z2{)YNU|a(PdsQn`7>OzeS-*gcpy2!hGJ@F7D=4CfLLs6WM>I+i+eD9IcY(dr zbxM=dGy_c_Wd4CuaQOFyd`)I_&1orHN|KW&j&Vv(aw6WsxkQmD1Ik#&cOc+>0mdl% zTU*B;nRd*tAa#uIoPcOWq+3iLeH3%zrGLHnrGNKX1_^9o^eSA2Kwx-mUB`hi}}sZ{Kx0cI?>GXf*aV8jbzsa(P!2MU$5+00<%Yk6(R^ z-~7KHp}GH^q;eLV6Hs_fAkYAWuCi$_T2LyMgm5hfNmY<@z0%sN)ej{ zCJ+8K>iD65x%Agx_yXf|SA4iST>5>l7zD0X0LU*nW_>lSU^Q?U$N1;lx7M*k?U#P( zmu{@r>*YJ{xMP2zP$*ANPv1~3mnX~R@-;#TYPH(UQrdy{uLc0D1~!21bUM!gbi3UX z{eFM>?Afy~rfJ%H?6Jq5X|-Ct2OoU!@Z{Ux_apK2&Y$hw^Va)2m0K<2hnj%X0Q|ZT z5)ns8DVZonTr&|dwQz!)w>3x#6ZCXwXuH=nstK(2hR5tG$C5INLLsJ|8v2>lu1gU# z$`NNyo#usZ#Hs2w7E(=5X-wuF8lxdV&-hLQ(1R$zu;kCEcAls5?Dt5H9sIrKxBv7@ z3{?A2%6n!H6W96-1A$@_0ABf}$E;rnAgl!p=hG(E(mKL6?q2fyyy1o$%0KsWKX-#M zMhGF;yLa!7$;rv-F^rr4ZZsO(mY0{$ti|w)i;D|~4<9}yr8Gha{`imo`0(@3Ki_kw zGGmru12CmMw{EH4`SxE@H|_t2t=(@!%c{)>C`4BBOSwWD5JFNdN9?FX%r2eawjB+U zQk`xV0Du_kg7I&24Fo7eFkLWw$F2>>hULcw6Q?Q1dgTH6`fzn<%kyVteW*GuL+>!XYxu8#r%TYlny`en9m z`(Ijj{|ISu*N_Gv@;L@&4g{4rVrL~{wt0d(wm0Y%9RLWg?2kP1*e6{5u_sHC{^A^S zDnd+5v3&L{{e`m_857qVr1dQ<#&w#Rp`$d3F)r3`Tnn6l-VvC&FhL&sA7}uD^fdLS zzJfk{@C!>{{rtaQr9Z=LR<99+0MK>K13}6w&;m9AU~O6t7=-H=qcxnbo$vgs-P`E> zpYQq3_aTg9`qAZTK#*Ur@vis(cr-En^U0m}yrXl?187;Z8bBOq18!L;P6*8-{0^^2voq`zN3A0PmTrLTPMi@=w*^#8~I zb?U`KAML*3t#liA4C3a}Y4(DA6d;1ZsKC))AH5TX_m5fwMJbplN{Xh>frBSeTV^?} zVwPUey@jCI>%REKc8k0-fOz>m;dI| z)!X0pSLOLLKVQ80>A&B(^IfEc-S!Uz5QB+8iQtcgz{ufS5-V25+^}Q(dQnm)<=D%o zc)8stYiwh_I>S#Y^itlCR<4Pf@6$EvuczNzD zFP&PTv}+H|+BOzbXesC^={_WDNi~tx-oV-ls(6=f4;0Mp8XOBM8 z{LY_$`FtHa{(`TK39tzOuO6*O8n4B`>)E&7>s$)D5N%-GHh(V>R`V89Iy``=79c`K8}h@C~KoqUe_@4A(jI~tV_+!=YiU_w%X%i=3VL}{15 zIrtLgZM$eqZet-8j`3YyzcInhy0vV)PtycGfROP^?H4FL`%U752VY3f9)G0y?LYmm zYxLz>eYWWYyh7=G%y}_Py&h?QseJ&eZC`EO{|-%@7^?vk2>`%ti);71`+?%l8~(1? zbLtjJcW*D|4kOC^PWTGgMS)XI4=Q!KfsK!># zm8WQ?&~c3KrT$v@l~)E(fd=3b_+_?C`P2bQfBP65KlWJi^5HMGfAHT%=cruGk2JdU zZ8Hpb716i{UN0kGjI_Uy4qnfPv6faa?zaa3$x0BYFfa`YKvdpy>(0h)54^WJv;C*) zx7{*R*}ey*tISSMGdo$QTCGwjRp~2(iw;sP2zu=nFTOlSO95N9v0R&BF|+dk^mWMi zgWFu80jTjBfJ~PtoqL+X3r`R~`@(`+I{W4BbKm=m|_ zbh9F}Tc(+;lrX@lg(j+8Lr-m`S)8Dm3EB#J+DiRAvasqc5A&(aniQ4}5ubXV!lCDp zr_Rpn_R@EfQ!jp_^W@hbU*(zC@`r>BKdSC;rUGx$1=B|8vGgB(;xbZqYwc}nY6ZeR?bi1CNZs>_gRJBI7Wh=||9kilp+OkHX zg|qY5x=Djj9isjj3QNZj%X37F^F*iTh)$kb(!KT*s(J1Q{bL6Y^p8G$a*bzSkCYFW z;po0mslPcGXp^p33Zoez2t*_6;kGD_8})M~ZD#Kc4~oxb+^q*S{$ z6~*lxBd$w`uT8bsof*?G22`Vto~*C93EAo(&$&rHeo)ScxM*}|#g zy+c1Z68yX*9GsT6AS>jmB_2j^n6YE=wUq6h)CV z#zaaf(lixHDY7gRfGAzNe_J#;JBtbD@ded9x70uS%;}N)S&J@&>DSBrAqa#FKe|6W zmvvok76jR(D}Y9|fe;YJ6<|4Ek(Sj4T8(Qk%=l}4fNO>AE{6Hn0)ue-=s7QGNw5tC z0Go7mk`OC~^^G#>TEnT&S99U@1b}fMFm8PmBnYrqE@J-sJkj8*PxIPXT!u9hVH+ru1(h3G; zygwjZUu)mkbH18PAJQfOY|>>xV!VUsd;l@JZMFU5&gp3_23ZXZ*0X=bd0#804`~ws zHtDjZ^MJy7w!adu^Ek#?jhQwCvyY=q0NA7}l2!qS3qB1OmgF=<8->Z&qD=tUq)obt sNuK|ZP1>YQx>9Kq05)lpu44NC0UnH+@I^oSx&QzG07*qoM6N<$f_xL#s{jB1 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.xml new file mode 100644 index 00000000..5e86b454 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.xml @@ -0,0 +1,63 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/windows_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/windows_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5b8e4df4cd6ce0cf24649cfb46b8576d6c6524 GIT binary patch literal 939 zcmV;c162HpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyk& z3??(g6?r)T0013nR9JLFZ*6U5Zgc_CX>@2HM@dakWG-a~00095 zNkle)AK9=;VHGe zbDpSW%V25Xw!sZ6l%^&#$4PG?adYQ;NHy$r|);I*+_I`+Ba+@`6KJsNQu0g6rK{gYSi)r2tbH6h(y}YTU{I z>E9yXOYa{Z$Dy!Zt!R|H*4AR*WC|S#H<Q=@BN^5smm z*U}$bob5*j(x$hq)v+=nFvfY#5Qt;vVH+L~13zB3;PQq<3gF!7G)19v<%$?M(s(cp z?C&1y1OP!%XzL5*0D(Z<0I;oqJBCkYve7T6bIQ9B1-z90eLzX%@O=+iLmDnRQIYv; zp{Y$jjL-JXB(*+0qkER_VfoU;kZpUfs0>6=L?|kQ02jVjKs?O`i%v{l`=R~Yp{@7l z+jG^cV~0Q7yDj!0#Zf{5mC9g@ffQzu$^tk4YB~%2{O>T$$Eo9+%S*$dGfQiXUG*jO|eMkM~^#i#*{~Obv?%w-{adPB<+SI;VUNYA^*|WPi_ZaLMS#~mObEW_Q N002ovPDHLkV1i<0r;Pvr literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/windows_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/windows_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..23c4eb72aec62d66e4855e852ea95e69b22d2da5 GIT binary patch literal 2622 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Asset Tracking.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Asset Tracking.xml new file mode 100644 index 00000000..d8222f7e --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Asset Tracking.xml @@ -0,0 +1,62 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Expense Report.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Expense Report.xml new file mode 100644 index 00000000..375a5181 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Expense Report.xml @@ -0,0 +1,62 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Meeting Agenda.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Meeting Agenda.xml new file mode 100644 index 00000000..3718e644 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Meeting Agenda.xml @@ -0,0 +1,62 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Status Report.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Status Report.xml new file mode 100644 index 00000000..f6ec5539 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Status Report.xml @@ -0,0 +1,62 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Travel Request.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Travel Request.xml new file mode 100644 index 00000000..4b1fd1e3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/Travel Request.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f2da7556e70026dff7b0473d38ed889c549370 GIT binary patch literal 846 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 M07*qoM6N<$f^B{L+W-In literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_48x48.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/Form/icon_48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..9881eb8db3bd6f271d6a2a0d890b3e862ec5508a GIT binary patch literal 3637 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 Hu0mjfqV^Lr literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/AutoCAD_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/AutoCAD_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b31b93ee0066bf4d76a9ef1c824c133620333d78 GIT binary patch literal 666 zcmV;L0%iS)P)WFU8GbZ8()Nlj2>E@cM*00I6*%$nM0%ghV2d2f&kIesFLwJGg8335<-4JPw6I(r7ePG#b4f2m~GubN&b6aJZRB zBm|i87g_W1aC*EG!+hBBDkH@Ws~g`bwitDHFGt}82RYa$@8K>q1MwOSR=^U(TiNqfB> zo7E~hm!l0hKpkWg)Q;aOA08eeA{fS*L7h$qH8#fJ69_O5Y97e@2`nuw<$?BatmHU@ zQWpdkUIK67H89E*u__>|Lo?7yCHHc>n+a07*qoM6N<$f-Dyw AtN;K2 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/AutoCAD_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/AutoCAD_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6f314e349d0a7f95f3b3e4232698633e13f69d78 GIT binary patch literal 514 zcmV+d0{#7oP)WFU8GbZ8()Nlj2>E@cM*00Cx6L_t(o!_`+&j>I4c zg{Jqyn~68Wld&JW+Sb8ZWs;dCA(IL1JdpR00r;??s!qR@bFMED5zfXhrm9oU%vwxD z^!F#8$6H?pF96J3K}K=Qx7FU|oL%u^y9ZcArsHl706;xf>v%_T7Y8hmmAE^BLbe{j zDE?I>91fzClD=!|F*B$tPOBis=mt+I`DEBTQVQXC=85bY+dNgB!B=hbf+t{C0=q@F z7$ZKdJV*ct&ID3QT8Nf&21L}Bt#!Nx0dn-*l1BFiV`eRJ5jkd8$3>+2ja>%OZZVyi z>qSyNDG&hQ+_r;g-aS?eApG@JM1Yy=cjiJe?8@y<4QDtj{Vm3brQ%X;nOHUt-ZmJI z6Hrw|L_HnT>z-GuejP|z1c<1Tb4i9h)_Z$yJfp6SXt>}^#Lzp6-^PK}o9vQriStvVWWd|AU0CHo%wL50qNC_5-+pa{vGU07*qoM6N<$ Eg7q)bqW}N^ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Inventor_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Inventor_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f427ec592ba6d027ab60251baa30c910be6839ef GIT binary patch literal 672 zcmV;R0$=@!P)WFU8GbZ8()Nlj2>E@cM*00IO_L_t(I%av2VYZ_q~ ze!jc!E_Kj=2?2*ggc~ZsCX+oJVuTKLEnNgD;vY~4gOo1b(r|3d$@?|FX%K2TK^?RGoaYPB>!?gjM|FikTl zNzzp)6k?JjJq7T>%SWTp{>qp06A(r5SvVYK-ENmeqtQK{=d)gpe?cS?(G^8u03P{q z-wae$UB8RP;s-@h0HEi`S0KMeZZsN9mSu1p2TCcM&1QrUvgVHCkV>TjUDt_k6J=S3 zZQBq80m0xWva>UQD1O6W@ESb-o$x%5-%2QzO4{k^X>w&01Ob#%+}u2eEWd|g)UmPQ zfKm!U5PlYDHk*2_R;x^>)2mo4_LAe4ZE;-@2M14ZefpD0&se{rtI6wC+QlU`TOQlj@#^Z5s zI2`Wh^Le(lrDJ=$56g<>&kwYi%D3Ui;JU16(}T|84^+AoS&PUnpXnkGB7w7r6!i7 zrYMwWmSiZnd-?{X=%unVFfjUgx;TbJ9KISJEp%9cqs8ytQgh*aHuc5wlCsI3y^~%x zOWIpSZ=MpX!1|+T!79Iap@~(REe)H0D29~25|}tGA?>bwq3rwfMwN;Ri@b~ut^FKv z)z2lSqVuftnKPGn+-7D7IGr`Myk)md!o)QX-m!GuJjdbo!+&OhMMu%Os_R#jl>$QN zyla{=X|~PtH`#|*tIq8`TWr~qp>ittd_{#&#z~ioS$_f=ujOc}{<&gxkE_yfRtJMp z*86MaLTmnfn&seqZyUFgmZ0wBc7Zs%=(}4Y{nQuj^3c%O-nz~5-~Lea`udE# z8u$F!E$Or3j|$A4{2_VwgPh5CA2vSx?Xdpl?sD(l@B3BvKb?QEMRTkF0`uS3Z9mAX eeL2anU)KLgMvm`W18pWykbAoNxvX literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/NavisWorks_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/NavisWorks_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..53d455908a658ca61c0a17a0e9f801a5e25a453f GIT binary patch literal 669 zcmV;O0%HA%P)WFU8GbZ8()Nlj2>E@cM*00IF?L_t(I%axL`Pg+qF z#((#DCDq{#Y$g&yLkDT7HBFFB+1jL2{{TZxbg3yOCZwIpqIIAVjguw}bZw%O109Hy zNF#$)m^w5pERO*(ln3wL4irn(wVGC&KUdPmhd@JQ?Qv3nnHeiqU9P z0}tG|tAkW3b@N_aTs(+IqX6e_d;sx#=l%VC9SjCB3y+wIbBw}s<4{4qizk=RV9(~&{(^7@j)uZLW;E+{w4 zjC;nBQX-{fbaeDrfm|+E%w#gjX0v%32n1dlhC!)OV&(n{8`TX;jS>-W1f>*HQ&WV) zVb<2xe&#?aHCw4vuq;c*VzF&0rM8tVmhUcOE1SLQ9so)ycHZr<{%IXP4>^d(KxTDA((CwAL6#|3J2FGbYF21<(erfe?ae;K0QJ@D}(sT*z!^SWT<~ z%=4aka==Gk0eARMyx{|yr|7@#;8qySp_u>C`8B|INh{Mc*mT1C00000NkvXXu0mjf DWuqLM literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/NavisWorks_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/NavisWorks_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..27646353927ca784e99a529f6b1a6f5c71875942 GIT binary patch literal 629 zcmV-*0*d{KP)WFU8GbZ8()Nlj2>E@cM*00G%aL_t(o!_8K~N&`U* zeUTnj6cnK-`T-uj?|h8dtM~((xr=yEq{WY!y?gWnS}ICKXld~r54Cl6I~`|sSKC17 zcCu}fmzQMd<5RFoX`qDv=cjD`tJAZDV(qqU2!I&9yVjB<36dlM0PJm&#Mq0v5tI4- zwU#tZb7#zq{Y{b(yAy%3wac=sl6}qrso>ZcGk=yq`+~erBuW7YGmHHhV=pQVCh=`> zutmbmU}g*^Lb3MB9AIV?$rfW@D-zOR>@UH?jjnA}GBXC_d`W`3AQVoYXsw;y(5MUY z(z_rQUuD#^$CdG(EfcAWgta5kvB-9Dm69*}*|VK-NcKxP(7E|pB3YK9xlQsqUOqsK zGPz(XAz(YV+oicZon|3?aLH^P+uzeP#oO4!ff>`88O9hWrJUJ^LQX^r>bwtVt>?~- zF<@pWrJMmoOWRUc3C=H5I^4;_&CGZiO*!y*J0+(N?oa{(fQX|D`XiyEou6AvepOO$QKLAj=ApJ$iBY_gT`=2ZJ_+T(LfLvle+b9B zBw_3pHwW5z$fFVH4uwJj=#7AGA(<0L@WuaY;J-;A>$;BrOj`ayv~u|Zo2pThw{YaG P00000NkvXXu0mjfgMSe4 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/RevitManifest_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/RevitManifest_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..48e80007f4cf57d536752ad0a58377d07729cb92 GIT binary patch literal 865 zcmV-n1D^beP)_%#3k03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00PBHL_t(I%XN}VYZGA< zhM({2WZFz3bz-#%Z7rgsR${cNt<(!ew34j~N?mm2MsU$hMSp>G<3@_LURFlI3s@J5 z6c-|b2#T84wDAUtv^ADws-2k2%(%$Vg6LTuIL|rnd0)}f)8i%*36K&ThyRrXoWB~6 z9*(0V5(#u&XKgTu*4&I`S)@`aIyyQ4ux%S;4X?kvWLsn_nx`X_U-&LHCYM@*$@R&~=^3Y!>&|FN6@J-=`^9 zE~c4ddip(uLV=$`kV~ieS|}jQ921!g4ajAHp3PDl3}P4tdcBTctHs!~3BA4^zu(V# z!(dL=Y4Q6p418Q^+|ZEQ6_2CV)ln=KQB@UyQmKTRSD_I~#nMuLrc@%Ls^CEK z;suoZV`G#90qpsC6e(E^WId;xl`isg1t|lpq=16};0KU*{Co+jD8WdCSa&xKp3gsk zEgqn@Uh-hWJAQKulS4pxDF%Yu?BO6vYc$H{c)a=yAnbwiz#3qI=bU%%{Ucf@I3q4s z=OUJcmCdp+H^)z)7H9-aFM$9f+ea7>0{{$&0j})4f{zRez=KbpD9p^T8u(tRfT(J1 z3@X$x3BZRpABgUZGJblTT}O5i>4@<0g|}d%ua8;4<`pO34g)Zl9R%Ri)F}X5-Xc2N+ue9q7e1eF*&-qM ry|{?0I<$3d03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00OZ|L_t(o!^M~3k>el? zg+JeJ6Xz`hwG@0^#3=)=47&_*Wq8ZreqcM`;5ft`4*}Wutn(wd?F8UstTdE_Ee*O5aX6nD6+VYgCYfl4X2n(}K6h{!8f2Onnub5)m}GZF_k2O##G+1w0fONDbp2j?Lx8+rYUzj&&)H4Y~vD z>0|#w9j9@9It%=~q8cttoo-`Fxw3I;+5m=FrI2TWY^ z$(f`dMA)E{cJ#yhEbx(^)nhh-%- zinm*EOMh`I{uc~9*9nO|eY~xK1M%J$&FFQ>4x{Z?(K9m2_}~dx$L6b_=lyyFzb1bH Xgpo2V>lowZ00000NkvXXu0mjf8JBa; literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Revit_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/AutoDesk/Images/Revit_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..90b43d0758306db9dadba0c91733f84e31ee199d GIT binary patch literal 692 zcmV;l0!#ggP)WFU8GbZ8()Nlj2>E@cM*00J0EL_t(I%axKbNLx`9 zhQIsXO_W$d$mS5zz#HOV)FnQrCQj`p#i4@~38YhL3PNb7W@*h3Bz7rOaLCklDRoc? zrjkYDPy`VNNf$F{g&FeydBcb zpxJE3L!r>R-|ttUQ0Ol3u$?y=jloN;=4RmadhZ8=LAAEFCc@$HfUfKJ+ByG%-rnAt zX_^X%xpCJ7xm@n*ol2!Xnx+Y`>BcW1Zg!rVn^T5iAiE{r9VqnKOM8sGAK}b8 zqpz=z{{DWZrlzj%z;T@6?d@%v&8A8wle1DvwKcsZqK~3iBKy0I<2cN`o}u!x!VWvv z2_`2e2h!;@i;Ih!^Yin<#uf*a0|J8q0)qiI-fj>ZjxjVegwO9|oN;1po9x)a%I6g& zdIai+x)AsTOP`jgys7{&#u#<#s!m<(vfH_Z{crmyrO>pC6KSEU?PzGoYLQ#ET+Dl^~)1ID@}IL%ZYPBz|>% a4)7D}G|ONRHOnag0000WFU8GbZ8()Nlj2>E@cM*00CS{L_t(o!_8N1u7n^A zq#N%AH)FUNoUHrf1%hnd0`L5xf@m*67fMaG_RzZx>44zW5$?znvAj>P{upHRy&V%JDuzw36 + + + + + Empty Concert + Creates a blank Concertroid concert project. + + + Concertroid + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert.ico new file mode 100644 index 0000000000000000000000000000000000000000..6990429033fd97b35a18192d576f99451413960b GIT binary patch literal 142595 zcmeFa2Yi*sl|C%GdhfmW-h1y|LcJppNJ1S12oMNF?-ITD4hC$4>BhMC26lR!ILVi? z``>JKlT9}9eZJ?sSCX-f6JuxdvlHJR5A)uuTi!Wm=FFKhr)X%5)0m`TXsE%~QKNaH zhDMo&hK8e~`uQooew(i)CaRx%CTnQSG}F)+7#Ml3IZk6!IX}RMd_M1W4UH@H<1{?^ zoFC;Y>etzPrAKIJSfi`9P?*`5m!9@YRCpMI0{r3Q<%#N=nj;VU zd~SM%Mnz6$`SiS$XBX5LVN*{trurB_*Vs(u;pvIc@Nn2WI>6G(8kLn*tq=PSZ)fL! zkMMTG*|iJt)|E@Dj${`E1qLEIHWoQ~xv+I|gnvK)>}>7O+νz9ZbnGNv@c|3ZCX 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 OPhDB(O_icm=>Gw;ZsmXg literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert.xcf b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert.xcf new file mode 100644 index 0000000000000000000000000000000000000000..7b6bb89995f3203f37c9a3b88d961f05a585deb6 GIT binary patch literal 91701 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�u~}gB!2;7 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 BVRrxk literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Concert_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6446a92a114ad47efd19dac33c82ffea4e0b7e84 GIT binary patch literal 2082 zcmV+-2;KLIP)&Nh7;OLm03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00)LiL_t(o!?l-dY#h}U z$A5QrcGp=yvm5W)4#aT+u|o?Y5~xiJHK{5kNTonp1Z`;~T0lZ-h5Dfg@u7eOQYF;% z@qtzXK9s7ZMW_#{JX*ptr~v}Fki?KUjw3s3du?z0+}W8sGxzkvtasN*9H7J#cfY%J=ZuRlE1UR?^~Z4fW7}bbXhDG zdtWK!OkjYBh#D!*CVzSJRr*s0@QW7)_9&(9)uGvXzQM_uHJ}vE|LIbRn7`eQ{?OzXwARF`3XB{YQ=@#DS|c?U z47F&Dp(;8fQYXe53(IOWK;U_3?GIH_;7*jw4v7jQ>k zoHB`&R}sz1Q^(@E#tY~bff`aO->b06U36lZ42A7P?m); zrbcho`Et9CdLaT(rMtcct^%N3Mu)*HfPL@}kGMPTxR3e8rP^`<>{yJLWua7sLRGCs zgd%vpVSQ_o)>w!N%ILu0h2V*WHj0wi1jNumfCX48s)$N~=eY!)A29&nX^*()tw8DH zuV@FxU@42unH1}r6Lh5%j^p6@KEw@SOqidWWpr$m@qC_+_I331Y^1ZJgK}t53WVv| z1-wvEFlAnT>en;X*YTC#{*g4Mvnz_P0Im+mwKj55dka08MzSfJ1;@d2Jwg*=LPM#v zNIpNxsZ(PFen8jyE^@g}d_Ta12CX%r2qp}1-7?y95eb+oH5)KN^exxbwxL z_R7ktypm%Il(LL%C#-lPMMGl?@fb8+bSu+iA7W>>(4h)U4*Zd&#d!`LdY>Q&AcRCi zlFkde>C9!wq|*$%^9Eno*2mX(T+aT1lVCz+Lc`!k(H7eVC?7p=-&el6v(uPR06M!m zXP+KOzosl3JD#AaB}0(vp{u3Hl0HOpX__S+vgwMO2#W8~+k6p)$vjh2Q#3a>(X&3w ziIc-D%uRDiN5H&mGjwbM%d%)`ZIkwFws_>o;Mv>qdb?nKx8sMbNj0|6*p{Yq<7M3X zo!i*9WdlFF=N<}^qa=E-!y5V%(}f9k^nZ!`c%GT5X&l$XiV3MT4U`tk#1jcX$?WVL zTl;#|U!VSS_Vs_iIeq<&HxOG5!1nD|CrVD(A8%;HPPQQNW_Itsg$?bkSjk2PK6sy^ zpJvVcA^NuVGIHWLlZ7dEUAvR?+O-T09wuhlDcN5^iz z^Uf&Us{t4uKKAOB+xs6#q|(yUw~cgrr#f96m!1th>V;>Y;a|`G9xHnpsfG6#IXTAX zFZ~>Al1UC8dt*vd`_Wj#-KJ@UzZ@={N%T+(I^VRH*j_!%s z(^K!pDeY@&YH2v|%5xj`e{hlmufHfwxn9+l+eAW+NOq$VC z)BEp#^1Mg0)$At^{E9~&xEp}0c3i(hZTQBGGI#jKlpeXj zDY+=|DNK$Nicc8$B$G*W5YXD(Cfak=u4{Kavv=>_n?Ckz_`lkMTW+}P2X}n8P?-K& zLn?Li>EdaXYHXo6Q($RnN#eG}HP>AI)}xR9W;>siJ^8yDtB*bL_{N*Qx%@O4wpX_w}Y1s|e-Eiq-Vd|D3F#f@J4?L)pT6K%?Uk&8UdBL0W2LJ#7 M07*qoM6N<$f=>YW!2kdN literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library.ico new file mode 100644 index 0000000000000000000000000000000000000000..99661e2625c2112b07ec4eea403d411e6d168eb9 GIT binary patch literal 155910 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%0AmDHQ<@z7?f7XBK0T6ls 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 b{H@3D^c<~09fdvf00000NkvXXu0mjfGe5kE literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent.ico new file mode 100644 index 0000000000000000000000000000000000000000..5fd38a50b8d2fdd151e2b0bf8ed8235fc27db8d9 GIT binary patch literal 124126 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%0A~RVMq$<6nHZtP(h@T=Mllz|j<_17 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/Images/Torrent_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5329682adf8c377589846008dd52cd2175bbabd4 GIT binary patch literal 715 zcmV;+0yO=JP)WFU8GbZ8()Nlj2>E@cM*00J*bL_t(I%f*vTNK{c6 zhM(`;d(}HC==4L2gi2BpTJ$3l)yhRgv}kYHvUWkxGDOA8D1<@vuXc<9^loBg+ z6K-1A59&Ch36A5Pd(Zc^m~oI6ZCZ5Tz&V?T=X>9C;D0aKKD>T6JKE8a_o`J|b8VDL zYn00y#S4S|55^uo<>vL_zXI}iU)(AEjGu6Bd7ZIGG3SRzt*5t7mJ2KM<&E-lRdeFN z6jGlCH?9rcZUFXm4O~2R_QWgiJ)uAtwGg-FNwd@h5zH_YQ;+(LB&jg{;nStXh3S_9 z5a;%q`pnF%W@J|Ps|)^d7ZGzoD3#5Ega9tgZAp-|)P$@q=I9!{ikauf+h<^Y$K)m= z;TAv*;GzXn*RwO!wxj2`d}{=Nd&?`7zq|nqsacq~@LMB;j{K2HQ$1a$<8fSh^q%?I z&!`zkjvZ%w=oqFMri!Y9xGD9EXB>dIXvqZ;E{yQr$T|;m;7|uM6OZ{gF-~`PCqCbc zPZd=G0-TGM8Y84tUrdrsvTBNmAnjYMloAg14O1m6vG!9faa!l6(S46SP+LG%-$bC_V*zI`uz*J zcozm>o-C`Fk!m%m0mNi;rm1<)To^{qxhNEo07O{*T5Bb4HZU_YubO6(c}WFU8GbZ8()Nlj2>E@cM*00qNIL_t(o!|j$^jGa{# z$A4?>?>n~{W~M`?Q`;cWrfn=KlTL}GG+ZRc3z4J*Z54cy#1b*;3o#_5K|>%~9yCFD zu@A-wYC?i9s0+|#{^k?+DNE;n96DaRp{v|2fgnCbEy0L?_YcCi=)-iM}Rjzj>9Jp9p>=Id7+Xd_RjVQatHUAU&|(+*>D_$&drwjEo=)=|_`xCErUA6jm9God zgsN7T5fBM3h=7Q!0!4x%uA_(h4n9YjcFsFA<(`Aj<0{=qP+D~l6-8AM4L?{!VCx;< zMMP_Yvv#$TK{<>>?}zfWjbJ)Xo-kuP-vY!@rxxX&~Pjh z8d(6%ZiFZrmXZF?aQoISu6bqTm7j8LCT1pr)2|$+ZjN2sdvKd}qOJ@mBAUC%_sOAJ z_;6VbI9L2gL{S`y!)bt-5Jxf1#thdc>s0!0qG)jX#4v$R*z?2-eD>gT6fEWRiD3#J z`Zn)CT?i;Ae?=P zlkZg#Rf1@ezFP;lW^ncF8L-TL&erCC4a`%#VMC3NmJsOQ^5x5y&L2aifM{0vZCNug zhpS!Y&qE{Jcjs+fJaCBN-@O1L>^SfYw{Kq0pN2+o6IDzKxL~op;W6*=60vdX1DC4j ze!X0Ci^bba#Gw)(1R#>PlWdt5N=VNJc0TqaK6lSHN;&;j0&gEX%jsV|gH2ZP(d^=8 zWrmU9Ex|0M)jA_9z6Uxwb{nRs7H}HO--3276~Yp(+<|S}!KQ&hL}2v&ec6;-Ml3Az&7a|&fPS)pl@EXl5CO>?lMv_wKDBQBo`(@D3KUdafVe;e1#xXl z=Sm$*&G1;7cuNz52$NRr^6^)JDsTmeWkD)JpqNL)( dT_2y^_%FA*Y_)RE$=m<{002ovPDHLkV1n-=1<(Kh literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileClose.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileClose.png new file mode 100644 index 0000000000000000000000000000000000000000..ec51b46f35ddc147537061d37790b7dc36e19918 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2E4Kkr%DTA+|@W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6yN3P;uvCa`t2l3p(Y0bSNUmz0; zUa(|oGrqGhxOc&g7z4wNi|_qg{cc@b{OrqCo}2dT3r>4_Q<7oTswkF@$2S-w`ngMM znGbw6+p&(jp(7!ex#9hLw!gv+*JizTeVl8aa#N6DDc71zj>Qjb6@2*_V)Uh!ay9tf zxfaKCOyI#vi3HQ>B7!}Ju{k}CE_TcvCla0;aBW!TxH3u1C~~3xyZ*cPRL=WFVdQ&MBb@0MBE0-v9sr literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileExit.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileExit.png new file mode 100644 index 0000000000000000000000000000000000000000..e41946afb21074894d5800fb4c43386848c97853 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2EK%L>h98I8sY!vsA+#`$ zL7|Vo`ycOtDDUf0i)uY0=P?*8J9g4xmg;&&*Fu&B*}BKBFifskW6Qcm@qn{oL%sgW zRUIcpx;a+;l5+?Zw_YCEG?_8^)$R#rxr#s5y!ogWTKeyu{Et6x*$m@?7(X)Zdjax~ Mr>mdKI;Vst0El#Q(*OVf literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewFile.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewFile.png new file mode 100644 index 0000000000000000000000000000000000000000..16b1594964448c5eecd017f02e4ebe28deeb0d66 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2GA;GOrycY#8(nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^Q2d0ai(`nz>Ewh30tSa9E?qMEKT&nvI_>lee6NnI{P^;+ zdJhi}_?&1;51(e_<2l78&_XqE(!)2Wg66O-lqjemdKI;Vst0N$r}J^%m! literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewProject.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewProject.png new file mode 100644 index 0000000000000000000000000000000000000000..32d065648a83a562d49e711269232b16e9e0c600 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2F#RFK+i5ulK4W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6#wJt;uvCadh5i!U56Y*TKT>2DedZ-n~_~Due3DDiEHb| z4Vy)SZnF9qUUU-idC7d^?#(Ru1K&5q)vpU}+N{XU`MU8T-{<0Y=IIUpFFdVQ-4;9f z{@3*r?`>sR@K~qN?wp{T;ko0MR_BBmCaAQ>7_T**()F38J25$pgT{a75KlHUAJ}?;hIu uU@zP5zuUGre&hc8Z-G!_=$63NWs~OB&uI7IuggCM3LsBcKbLh*2~7YH7M@)I literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewTeamProject.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewTeamProject.png new file mode 100644 index 0000000000000000000000000000000000000000..b8602f008bfd0c3a41ed2af53dbb5f0e3eb49a49 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2Eqlf+u-OfSY!5~^>xzDW23uiv&h$tH+g7*9@0Rc% zm{>dKX2t)4=?r#krnjn9lyVlCDm4Xh`Cjf=#37hyAfeL0@+oq5M(^u;3tn3#N?gjD zZzvOYw9aboqNPVg1WRJse{9N%tmi#!uiMUcwnX`@I?wW@YI?;y_pMP&L$nNM zpH0fYUAC$7cH3RoO>3%Fne#ZmRo$@0>i?>8u2W6tl^pV>gF@BQ)z4*}Q$iB}H#fDJ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewWebSite.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileNewWebSite.png new file mode 100644 index 0000000000000000000000000000000000000000..2750b7041fa434c45fb8d246fda0b10a3bbde71b GIT binary patch literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2F#HuI0!dO#uB%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq^l_)5S5w;`Gr;d;ORK1zPQUuIj#EJZaZ3_re?I2^(4y z6S<{zII`1|9Xae8jtB@lXYfc!OK~M=o>{tSY2n)nhNc8>jl9%Ftv8?QJ1lBlzRTQr zW=;At7Nv=c^{1J<5!t!kHlTjyM(@cds~H|J9LN=2@zhD1cWVsC_Rxg+d<<-V)vAoV zEjW(PjGh;t{^F!gb6xTKhK6)SnU}1_lNm-lzYxbM7#CoA6-z<+L4@ zDaMDVT1Hlw+SmSSnaCMi5bv&X__%wxM zs?~lZTwNn+)jYAa5eTMs_dk62aH__viH8qtP7!Z=_SQC!L;ugeZ=H_!%;r2iw);3w z__LISEOOf1()SD!k`fXUZrB@kJDxl-@8JI53SDkavmWaGsQIjLc$rS_rb~=AQsv)v z9?n%gmL?+p=Ea8OgtVkqb{?}2-|y$Q^?YOI@xS-~c*()7+1EL59XWI4RDir**In+< z-}ft@+G(W4#$zV+W(HeK-Jj_XPp^)4kqnYq)n_X({e8XH6h@gpLOiZ^OgtgX3@!QT Uh9>h`--E*1)78&qol`;+0N?(>3;+NC literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenProject.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenProject.png new file mode 100644 index 0000000000000000000000000000000000000000..07e7b7275bb5e15d23366f03d4e38c5f7929b4e8 GIT binary patch literal 510 zcmVWFU8GbZ8()Nlj2>E@cM*00Cl2L_t(I%dL{XO9F8i z#y_Wb4Gspb_G2`t{sX;8TAd@cG;okxnt~RW7X1T4%!DY)qrstE8bauD38Kj)8-y&0 z2#N|ED!e8yFA?PGnO@%K`#$gU<$2+c5CGin5xvuxTR&!aY?4~JNF}HA9c(u51px6k zQA#b~UsLgT0|2;gRO0ct!E2gECbMaFFda~IZ!C%AaQ19ES5rKkWUvW#c6PT7kwhXP z0N4P$u_X1&Qw~>WC`3o8m5TtpHm-0zUZCr`NmQ0)qZR=qhm+g01HPW>OvTc8ya8St zSCmo>5nFOrje+9bZ85G7T2ZJF?4#a+h6*rdf4YBEVX$};&lK=n!07*qoM6N<$f`O^b A1poj5 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenTeamProject.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileOpenTeamProject.png new file mode 100644 index 0000000000000000000000000000000000000000..b94d151868c807449d6c638995be092e5f2a4d79 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2Ft!l8nv3P2&*%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dDE`CK#WBR<^xjDay$(AFwC(4;czB;vt4+(^_m=GO3auRx z2ZL)__?v8RPmb^k%y`$`zNhuQKt^1m|Jy!wX9M4Bi!3(q{O7U$fBp~iejZi>skxj7 z-u^aaI4{0hzINT~wO#*Q4jw+fS0<}%%9XESM-|%^-T3mY$M8t*vgC4x3#%Wf*s(q^ z+HZBEzBal%_J^H=%Z=Z%N=-ps8eJdmDJ%6He;$#&+ghW`_wcUo*3(XlZ@Fgie8$;# z5jyjva@M9^a1(UQ=Djexx%|PL>`<uQ!|dEjMqrut>10U!voE$wbvtXw|B$f_cwl q#c#DwPMz$S)AMrIgjC^wrgn^37cyPLRZD$9f#d1w=d#Wzp$PzKWFU8GbZ8()Nlj2>E@cM*00D_fL_t(I%f*sENCI&j z#XlF>a6>`d)}J4_ROI9=v_x>B4gIDfG{NO+Zm_YTYi(($Ym1=4(i$!rg4C%&B9dxI z(2|BE65=8VYDw$T2wHmM_kDlw_kE8C{|yD8tE>C1HW*nvprdz)tL#4K*6fcD%jH`I zpyfMpv^+_*l&3!s!WUcp^@3J_PX9Q8n2ASicai;p5RW%`yw7JyDM_c(BoaHWofd#V z%%qSzCN)1yVy1`l!%YCHr95|;E&BSrD2jrV64P926!56+6f@hr-WTx2R`HEaQ!V8= zS&5>&JdsSM&@>Ip+CT__loRd{ja2omkUQr3aE<5EX`M99C4>+Sz8%Lw*Y(d3vsN6h zf0(hweE@>NAfDDXgb+l+Q6k|e0FiK%-Q6Urs=6&aS?jJJ znxVnMSJ<}wA+!O2Va#C|bFNu!r|AV>!>d#(TwGiNFgQ4XrfC$5MdI;=dJ~%p07yB3 nuIqI>j^kk4cD+b7f&a%l@4b%OG7Mr;00000NkvXXu0mjfC*DgNu2VghPpy1KYQ6-+C;V1;rA$#m~BP+RS2AIvOWY!N72Mx1q{=mppfn O`#fF!T-G@yGywo*?O$vF literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FilePrint.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FilePrint.png new file mode 100644 index 0000000000000000000000000000000000000000..42c66211f0b3a6eb2d18d59ec541bc821ea2d968 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2F_QXpr6Cs0T>GbEzKIX^cyHLnE7WngeFN=+IB?>?fddMHfMfdVo0ixv$b*kwjAUjPgg&ebxsLQ02*pl1^@s6 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileSave.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Commands/FileSave.png new file mode 100644 index 0000000000000000000000000000000000000000..76a477b0df3b42f3422368c6342a4c7c32562ffc GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqkC2GEh0%*8dx1i-nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P&~ua#WBRpZtP;SWfkEsbjP;u+U@dF^>(ziLWP2ee0%KHRnpDAog pVd4jv`Xn4Sa=Y;^XkujMXE2^8W^_O1%r}r@JYD@<);T3K0RY5%Rc`Ewh30tQ9~1_mD9rxT{~#C`Z-&&aH$@w1{dE-HjV5xRfn}Hx#u2b6v z0pVNW&r%H6+3soCz*txOZqgjJ85+K)4j*9XVr2L?L2s?m+u2t@{_u45b6Mw<&;$TH C4sKci literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/16x16/Blank Solution.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/16x16/Blank Solution.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e4f75f0d2490dbbd6c66de2ea7b308d746c160 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D>H+dfOf<77NC%9W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`)4w>Eak-aeD8h{a%L)1diLE)L+odf6=Bv@6nyL9-Lq0 zWox*McX)6O*XE|t91NPu48ry) z{%_`O(dc5*Jg>zVw)y6vQfbu#DW5VJcjPU8^WC3Og3n#$WFU8GbZ8()Nlj2>E@cM*00FN_L_t(I%cYSqY}!B+ zhCkD6=dK(h^4fT}n<15IhEzzim$>PoS%&{=wu$tK$ zgU#v=QQW2q2&w<}-raro{{LyGr|;M$Aq4GqyJ$2Vq?BbpNfNHFf3jRIIbx5_&%YG4 zT8-gwNRlLF-!x4wF1~Vk`JGqwdVMEA*I$3D)g(!h(Cv0ZjOsCUF3$|?+jfTV1H+dX+lf#VW5y~W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`)4t>Eak-ak_Vs;v^8kc&o&8WKzIoP4PcxM*-n&*!zW+Y_^iwWNU9tK7yY4x8ai+Ch zV~c&h>Y%vBignvFX0hF?77*+)ypdDqRv*TdkXG@Yk>OsohbHrW35BIBf{Y9u9A{*H zgx)#$_1AX~R?VdeYyXzd=Lzsi{AYOn-H*S^ETDv(m)~E%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD4yr(;uvCaI{DAHx3}xrxEQ#ZnVFmW`}rehZO^%R=)e&N z#RWGQ#3YjM-ukMN$-~9xV!B}6x@iwjUDf7UBE|9DDLB|THIboMDD+T+$l(YMR-v00 zJ&F`2y=D?Cie=c`@My}3A8&7O|34)~&CP4GF@s&Lx`X$dd5=I&@^tlcS?83{1OU^W BRpI~u literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Blank Solution.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Blank Solution.png new file mode 100644 index 0000000000000000000000000000000000000000..17d4d248f915fda61a58b249c36a62c9cc523a79 GIT binary patch literal 816 zcmV-01JC@4P)WFU8GbZ8()Nlj2>E@cM*00NXrL_t(o!|j({NK;`L z$A7Qeak`lwjNw-)rX!`86?E0eU5r4*iy%bkCK-r&k#aV;X2iX@h7b`h9B;$z@&Mp=d2qWtoWJ8uehK`3e~ipA5HbR2cq^MYccwWt zo6uX?#NfrpbbES`QljcALg)x|RH;&xS3`SaSL$5Q-q?jBw-C3>69W;}!&K$f(A&~) zOd1*=NUaUGLgbnX=xDf%)nYS>Pt1>{t{DxD58$isG&b6y;xft|hf`8~TY!oAF&HNX zB2~rr=Xtk|UlTDeBJzPBrS)QcprF&v$UFgTfr|68F~FEaRq8?PxNhUtY3@2k(Fh|X3G-* z!QeNks$p_X1zd0T8@7yBz-}-8=XNOS>dvBRD(ma328h*~b1OgJ(Hl+Db)A)!1sMu$ z8W4`$LZ;`YcoUdp^2WFU8GbZ8()Nlj2>E@cM*00Iw5L_t(o!|j*BZW2)x zhQC`-%k9n?H!U4EQs}DA?0{LB=t|>kG=?2%(nx&>dQV!YPA~Bqv!XywzfXxOjQ)VHJigWRh|4E&~+WtG?7wbSr!16Wg(@+G);6}AM5O_ z-Nw*$)LSn)+hX53dMF2#9CY)v>>Q6JHC77lcEbl~gu%G#> zBVJ@%ie50<>&kwgm6<_Eaj?arkbSVONWTfDXH9!NkM-GdLH`JowL@k5BJ| z;xRUM_V)Y_($X{5p3zScR1dh|T~c`PYNYJiIdZ>~8D6+t*4>fB6N5q}+_W#nbRycIu)N+P;?sSQv9|voQpC3AzeO zBwr{^-XxsD+puX*2t!^Mb3^WJj;04{>B0t=ywk)mAf{v5b;v+uZV4@u_Xn zsp3AhsD^LP+gc`gx__?yuQhvi!Ghgcp(3t}Ri1<%Uh1T>{N>6r8S$Qtfro5U6;E#3 zyySJ;t^UR0O0niwmTM+%-|3}X_Gf>7qk(x$)@6R?2Z0BtOEped`(vr~hvy%;lhwA* UJ(~7w3Mg_sUHx3vIVCg!0Folo;{X5v literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Shell Isolated.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/Templates/Project/32x32/Shell Isolated.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa1ee34802503823a4ea62b33017dfc9dcb225c GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwgm6<_9EGEI;9w;Q684^+AoS&PUnpXnkGB7w7r6!i7 zrYMwWmSiZnd-?{X=%um)#oIky977@wCx?WF{ylHd(9oIKz{uTWSpTnPSJa#tGb}8e z60R^V=1XuC_wYWqWM%8-XMXZe6dT?-MYRjKaopKe+5Pa^*=S~QCfnG*F0DsCoMrv; z>E{J)_6$*@W_=b9-IFimn6Buld+;%4O&4CAned{OVd>U~3$poptQwx&D!B2K>6qYs aYc_^AT{?kpzAe=Rxz*Fv&t;ucLK6Ubm14I5 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/CSharp.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/CSharp.png new file mode 100644 index 0000000000000000000000000000000000000000..28f4f01fd9cfe7723f2278828513a9b7bacd6e7b GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vKt)9X6hPe38r%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD1O<~#WBR)YGt8Eh?I+5Vds8K(UB^oslN)W_kHH+I~VxMy2&{K2G0J&D<^ zb-Xe1!aa#kl1_Yh{aU|mYpS*6dY~y4b;nYVwOh|KI>#G%%+_5Ll(M7$(wD*v`V{C4Yi&x^zc znT`VSH!p3@{rK|Bm`%=5j*Yv%nC;08304y}hQ%Tg&69r?+k^b=>FVdQ&MBb@06*1` AQvd(} literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/CSharp_Project.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/CSharp_Project.png new file mode 100644 index 0000000000000000000000000000000000000000..faf18e527c85695626cbcb1164876019ed198dfa GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vML_Sppqvw%XfnIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^Q2dOii(`nz>8q0rxehr9xZd}Y%6)9RCiT5ynWyju?ylC> zrLCPm!`30q&bllUPdA(>2(=I6&-6QvTn19>Vr?J=RvTm@^eIi_OZT9K~d3=W# zSF!i?IWuO|S|4g|yjE+dCY)?^ahE>Bv6S+!VU7I93teXQO)VDRl{n+~2E&;uCp~O^ z1&#}@zAE)xk73U0tN{CO*^fE)%~Q=V(cn5=VzuycCi4Z}!+%1XcFRUYYdLJY-OKQ% vtomH&RStWJD{9xK&98sFo9oZ%U-q$#VLKxH!t5t*0(sce)z4*}Q$iB}eOiLQ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Control.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Control.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbf32ad8266ce1942963e48e5657df1a3e1033e GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^{2%zHSUS<{CYVU8W@Acuaia@4B-HFKSu7QfjI&!;N7;4{6{4V^|bmD?*Q4+}|^Tb!R zMH?71WVBB=FqWHnInd=$wJ}4D&YL?P$2Z2e{k~OXVSXvOIMZ_0vnv`xUEkAg-}6@y o`ci){bMI;0@NFVme^>3E<3G#n&A-dD?}Oa!>FVdQ&MBb@0Aadm{r~^~ literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Form.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Form.png new file mode 100644 index 0000000000000000000000000000000000000000..ae459fbaa4348592ec3ba3c83b51498e9e7693f7 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vM5jJx)7aiEZFW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6c6)saSX9Iot&^hz`)4Bz(B^b=!w1MtlXR&iJ2Ouj7Qlv z9FSPKQnF`B#vI$~WA!4;A2glVPfXkR;1WY{%R8eI=g5MYJ|{#Ycn>@e*~BA}ndoq0 b*+FgwlRdhL2L6FxKvsLY`njxgN@xNA6XHk6 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/PropertiesFolder.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/PropertiesFolder.png new file mode 100644 index 0000000000000000000000000000000000000000..9f42820125d200df392f02b45507bea2d9aa8876 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVkB3D>o^SsC);T~S+02lL66gHf+|;}hAeVu`xhOTU zBsE2$JhLQ2!QIn0AVn{g9Voun)5S4F0h6CJ{|5w8jq&;zBK4d-mshfm<0Q`<@>Le@&Dky he`tAi0qZ~hy^PmtUH67nF@=D9=;`X`vd$@?2>=Jdek=e0 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Reference.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Reference.png new file mode 100644 index 0000000000000000000000000000000000000000..214af9d93273397533a41e1bcd540cc4e080757d GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vL`dh2ELGe9BP%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dC~oKJ;uvCaIypgtwdaV2Rne0Z^*N8s%*=XpZiw8tal=69 zHItgx-UBV?Z|<1W#}iTDDe#)NYwrQ4tOdPHQVa|gHw8qduDaj}vcl8V&t;ucLK6Vt C{XuyE literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Resources.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Resources.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4d38ae501de4a4a51c252f695c3c429128ee8c GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vKb|Aw^rWKn31$gEE1zEramw*NE?{;_ zfI&cz!DH3DePYv|x~6U{&OSB0xnBO9E6b{V^Bh<5%v`R%aU;9+omtyD68x)gi)3vp zIzE5G#g+C9H+Hk8&e+cQ*dkE0z-*az;QR7_3~%@?!Y-UV{{-X*Pgg&ebxsLQ0D@_6 AbN~PV literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Solution.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/Solution.png new file mode 100644 index 0000000000000000000000000000000000000000..a60b69841667388f1871c69a0dfc441bba1e9342 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~D>I9Taq>K?XrPd6W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6o2aJ;uvCadhcY%u0sYQZTnZazgT50-YS>iFoFHu9ycA` zLvxmNTQ(S&T)DTPd_&Xrg6qK|kDYF3dQUC1`mtWF@@L(oKl-OW+nnY&%W%o$udoaY zqp(}nmV;~bwmp3A{b2jezn?jOZJPcnY=x%R%IEnLR8I02w3n{v+@BgU)AW!a=fr(QAgLSpQ0{HHft!Q{N~wvaeu$z?eq>0W_kYQ=I0ylWppjdc;&v6 zU+T&N!?taS_3zkuW6Ia{7>XSzef}yh<#ov?o8@<3d#?@4W;pdJ=l1MVpYGIrb~iX6 X>dF-$$d`K81r!pVu6{1-oD!M*n$qs!QNv)O zrgEt<|3TtyiA`bUg3S#=+h^aMdom}jv3Dth0?+rwX_xP$@J42@-Lv0;qMXvp6^**TgrM7?F?$s7{9foWS6P6vnDbW<3(8DO$d97-T oiTWeo8^2x&oA3XW)_C?S%S36rPpVHuSwUX)boFyt=akR{00S6%D*ylh literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/generic-file.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Images/TreeView/generic-file.png new file mode 100644 index 0000000000000000000000000000000000000000..ba48b5e21153df9cde3abb39adbe7467bae0ce41 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vKl+b++zT%eF_W=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6c6`waSX9Iot&^hz~GR?(xprPf7HCQAyHY`=>NC3(JRI8YXW#w}T0kM$%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dC|>C4;uvCaIypswAtW^P|KrK&DsII^MMllNy}WHTNl8k~ z+=|kZCQp`}F=K}0rAfwtN7B#EJ$C>E4gs-2{lA(yY%I9jmg(USl0YHZ%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD8ALx#WBR<^wP<`T!#z2$8e`$N^mBJ4gczPxo_lxW z&34U%S<7-7R=z&OIV*Mt^Yb|j8!Fx}+?vMdrTOBl)!t+E%PSb`ZaSC0ICMVbmsr;q XhI~=e+-401}^6&pchBZ}Qd6*LKwlGF-WG;P{MNQ=di)78blPD9O0Z_C(yX z`|qFDCXK4D>wH=hie@n}2w2*=t}V`(`~LqSITs$KxT=Db|EqrO@a6AW85_7~$`a1c n%#UyUx3Q>d%$#&q?oNaLz9Y@wA1K(WgPiT@>gTe~DWM4f+FxvS literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Theme.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Theme.xml new file mode 100644 index 00000000..2507395d --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2012/Dark/Theme.xml @@ -0,0 +1,30 @@ + + + + + Visual Studio 2012 + + + + + Dark + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2013/Dark/Images/TreeView/generic-folder-closed.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2013/Dark/Images/TreeView/generic-folder-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d84cc99c21cd684fde345c35d4db1da376752e GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vMTq?g(9yFek?%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dB<|_r7-DfcIYA=hK!^7twW!ziB@MQ5XJ;+ET=**8!ruJF z|F)>j|93oDzy92x{zptR7&IM>ORSWImnIry9oS%y0Cd1JHvyUA!^vtOdpuqJT-G@y GGywpHenf%* literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2013/Dark/Images/TreeView/generic-folder-open.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Themes/VisualStudio2013/Dark/Images/TreeView/generic-folder-open.png new file mode 100644 index 0000000000000000000000000000000000000000..d992366d70415497ea2e0a1b3784fd11e131db64 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq4~vMT(A_6>p+F(o%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dD8Aj(#WBRL*QJX$Au%B#AtFBio4jR0L1WWBW}bdKBjcnU56-Q9?Q%0rQl;ZA zw>MwC$|;6I*IKq{(`El9*kWo99r^L~Z0sVQlb^zm%5_Nh*(jc3D2p>}W8&}o&vO{) Y@C&`#a}0kn_=5cA>FVdQ&MBb@0PkRUFaQ7m literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj new file mode 100644 index 00000000..2a0cead0 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj @@ -0,0 +1,679 @@ + + + + + Debug + AnyCPU + {A5A14A71-5DB3-4495-92F6-8D27C98FF0F4} + Library + Properties + UniversalEditor.Content.PlatformIndependent + UniversalEditor.Content.PlatformIndependent + v4.0 + 512 + 10.0.0 + 2.0 + + + + true + full + false + ..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + ..\..\Output\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/Default.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/Default.xml new file mode 100644 index 00000000..24aacae1 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/Default.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/VisualStudio2013.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/VisualStudio2013.xml new file mode 100644 index 00000000..286591b7 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/WindowLayouts/VisualStudio2013.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.Designer.cs new file mode 100644 index 00000000..3541da1e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.Designer.cs @@ -0,0 +1,106 @@ +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + partial class DocumentTypeSelector + { + ///

+ /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtSearch = new System.Windows.Forms.TextBox(); + this.lvDataFormats = new System.Windows.Forms.ListView(); + this.chDataFormatTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chDataFormatDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tvObjectModels = new System.Windows.Forms.TreeView(); + this.SuspendLayout(); + // + // txtSearch + // + this.txtSearch.Dock = System.Windows.Forms.DockStyle.Top; + this.txtSearch.Location = new System.Drawing.Point(0, 0); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(461, 20); + this.txtSearch.TabIndex = 0; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + // + // lvDataFormats + // + this.lvDataFormats.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chDataFormatTitle, + this.chDataFormatDescription}); + this.lvDataFormats.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvDataFormats.FullRowSelect = true; + this.lvDataFormats.GridLines = true; + this.lvDataFormats.HideSelection = false; + this.lvDataFormats.Location = new System.Drawing.Point(0, 20); + this.lvDataFormats.MultiSelect = false; + this.lvDataFormats.Name = "lvDataFormats"; + this.lvDataFormats.Size = new System.Drawing.Size(461, 232); + this.lvDataFormats.TabIndex = 1; + this.lvDataFormats.UseCompatibleStateImageBehavior = false; + this.lvDataFormats.View = System.Windows.Forms.View.Details; + this.lvDataFormats.SelectedIndexChanged += new System.EventHandler(this.lvDataFormats_SelectedIndexChanged); + // + // chDataFormatTitle + // + this.chDataFormatTitle.Text = "Title"; + this.chDataFormatTitle.Width = 278; + // + // chDataFormatDescription + // + this.chDataFormatDescription.Text = "Description"; + this.chDataFormatDescription.Width = 172; + // + // tvObjectModels + // + this.tvObjectModels.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvObjectModels.Location = new System.Drawing.Point(0, 20); + this.tvObjectModels.Name = "tvObjectModels"; + this.tvObjectModels.Size = new System.Drawing.Size(461, 232); + this.tvObjectModels.TabIndex = 2; + this.tvObjectModels.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterSelect); + // + // DocumentTypeSelector + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tvObjectModels); + this.Controls.Add(this.lvDataFormats); + this.Controls.Add(this.txtSearch); + this.Name = "DocumentTypeSelector"; + this.Size = new System.Drawing.Size(461, 252); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtSearch; + private System.Windows.Forms.ListView lvDataFormats; + private System.Windows.Forms.ColumnHeader chDataFormatTitle; + private System.Windows.Forms.ColumnHeader chDataFormatDescription; + private System.Windows.Forms.TreeView tvObjectModels; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.cs new file mode 100644 index 00000000..7019d0e0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.cs @@ -0,0 +1,236 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + [DefaultEvent("SelectionChanged")] + public partial class DocumentTypeSelector : UserControl + { + public event EventHandler SelectionChanged; + + public DocumentTypeSelector() + { + InitializeComponent(); + } + + protected override void OnCreateControl() + { + base.OnCreateControl(); + + RefreshList(); + } + + private bool mvarIncludeObjectModelsWithoutEditor = false; + /// + /// Determines whether to include object models in the list if the object models do not have an associated editor. + /// + [Description("Determines whether to include object models in the list if the object models do not have an associated editor."), DefaultValue(false)] + public bool IncludeObjectModelsWithoutEditor { get { return mvarIncludeObjectModelsWithoutEditor; } set { mvarIncludeObjectModelsWithoutEditor = value; } } + + private void RefreshList() + { + switch (mvarObjectType) + { + case DocumentTypeSelectorObjectTypes.DataFormat: + { + foreach (DataFormatReference dfr in UniversalEditor.Common.Reflection.GetAvailableDataFormats()) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = dfr.Title; + lvi.Tag = dfr; + lvDataFormats.Items.Add(lvi); + } + break; + } + case DocumentTypeSelectorObjectTypes.ObjectModel: + { + tvObjectModels.Nodes.Clear(); + + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + if (!mvarIncludeObjectModelsWithoutEditor && Common.Reflection.GetAvailableEditors(omr).Length == 0) continue; + + TreeNode tnParent = null; + foreach (string pathItem in omr.Path) + { + if (tnParent == null) + { + if (tvObjectModels.Nodes.ContainsKey(pathItem)) + { + tnParent = tvObjectModels.Nodes[pathItem]; + } + else + { + tnParent = tvObjectModels.Nodes.Add(pathItem, pathItem); + } + } + else + { + if (tnParent.Nodes.ContainsKey(pathItem)) + { + tnParent = tnParent.Nodes[pathItem]; + } + else + { + tnParent = tnParent.Nodes.Add(pathItem, pathItem); + } + } + } + + if (tnParent != null) + { + tnParent.Tag = omr; + } + } + break; + } + case DocumentTypeSelectorObjectTypes.Both: + { + tvObjectModels.Nodes.Clear(); + + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + if (!mvarIncludeObjectModelsWithoutEditor && Common.Reflection.GetAvailableEditors(omr).Length == 0) continue; + + TreeNode tnParent = null; + foreach (string pathItem in omr.Path) + { + if (tnParent == null) + { + if (tvObjectModels.Nodes.ContainsKey(pathItem)) + { + tnParent = tvObjectModels.Nodes[pathItem]; + } + else + { + tnParent = tvObjectModels.Nodes.Add(pathItem, pathItem); + } + } + else + { + if (tnParent.Nodes.ContainsKey(pathItem)) + { + tnParent = tnParent.Nodes[pathItem]; + } + else + { + tnParent = tnParent.Nodes.Add(pathItem, pathItem); + } + } + } + + tnParent.Tag = omr; + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(omr); + foreach (DataFormatReference dfr in dfrs) + { + TreeNode tnDataFormat = new TreeNode(); + tnDataFormat.Text = dfr.Title; + tnDataFormat.Tag = dfr; + tnParent.Nodes.Add(tnDataFormat); + } + } + break; + } + } + } + + private DocumentTypeSelectorObjectTypes mvarObjectType = DocumentTypeSelectorObjectTypes.ObjectModel; + public DocumentTypeSelectorObjectTypes ObjectType + { + get { return mvarObjectType; } + set + { + mvarObjectType = value; + switch (mvarObjectType) + { + case DocumentTypeSelectorObjectTypes.DataFormat: + { + tvObjectModels.Visible = false; + tvObjectModels.Enabled = false; + lvDataFormats.Visible = true; + lvDataFormats.Enabled = true; + break; + } + case DocumentTypeSelectorObjectTypes.ObjectModel: + { + tvObjectModels.Visible = true; + tvObjectModels.Enabled = true; + lvDataFormats.Visible = false; + lvDataFormats.Enabled = false; + break; + } + case DocumentTypeSelectorObjectTypes.Both: + { + tvObjectModels.Visible = true; + tvObjectModels.Enabled = true; + lvDataFormats.Visible = false; + lvDataFormats.Enabled = false; + break; + } + } + } + } + + protected void OnSelectionChanged(EventArgs e) + { + if (lvDataFormats.Visible && lvDataFormats.SelectedItems.Count == 1) + { + mvarSelectedObject = (lvDataFormats.SelectedItems[0].Tag as DataFormatReference); + } + else if (tvObjectModels.Visible && tvObjectModels.SelectedNode != null) + { + if (tvObjectModels.SelectedNode.Tag is DataFormatReference) + { + mvarSelectedObject = (tvObjectModels.SelectedNode.Tag as DataFormatReference); + } + else if (tvObjectModels.SelectedNode.Tag is ObjectModelReference) + { + mvarSelectedObject = (tvObjectModels.SelectedNode.Tag as ObjectModelReference); + } + else + { + mvarSelectedObject = null; + } + } + + if (SelectionChanged != null) SelectionChanged(this, e); + + } + + private void txtSearch_TextChanged(object sender, EventArgs e) + { + RefreshList(); + } + + private void tvObjectModels_AfterSelect(object sender, TreeViewEventArgs e) + { + OnSelectionChanged(EventArgs.Empty); + } + + private void lvDataFormats_SelectedIndexChanged(object sender, EventArgs e) + { + OnSelectionChanged(EventArgs.Empty); + } + + private object mvarSelectedObject = null; + /// + /// The or that is currently selected. + /// + public object SelectedObject { get { return mvarSelectedObject; } } + } + + [Flags()] + public enum DocumentTypeSelectorObjectTypes + { + None = 0, + ObjectModel = 1, + DataFormat = 2, + Both = 3 + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/DocumentTypeSelector.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.Designer.cs new file mode 100644 index 00000000..8c60673c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.Designer.cs @@ -0,0 +1,480 @@ +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + partial class ErrorList + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ErrorList)); + this.cbToolBar1 = new AwesomeControls.CommandBars.CBToolBar(); + this.tsbFilter = new System.Windows.Forms.ToolStripSplitButton(); + this.onlyShowOpenDocumentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showEfToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.currentDocumentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbErrors = new System.Windows.Forms.ToolStripButton(); + this.tsbSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbWarnings = new System.Windows.Forms.ToolStripButton(); + this.tsbSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbMessages = new System.Windows.Forms.ToolStripButton(); + this.tsbSearch = new System.Windows.Forms.ToolStripButton(); + this.cboSearch = new System.Windows.Forms.ToolStripComboBox(); + this.lv = new AwesomeControls.ListView.ListViewControl(); + this.chIndex = new AwesomeControls.ListView.ListViewColumn(); + this.chDescription = new AwesomeControls.ListView.ListViewColumn(); + this.chFileName = new AwesomeControls.ListView.ListViewColumn(); + this.chLineNumber = new AwesomeControls.ListView.ListViewColumn(); + this.chColumnNumber = new AwesomeControls.ListView.ListViewColumn(); + this.chProjectName = new AwesomeControls.ListView.ListViewColumn(); + this.mnuContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextSortBy = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextShowColumns = new System.Windows.Forms.ToolStripMenuItem(); + this.categoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.descriptionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.columnToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.projectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showErrorHelpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteSpecialToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteJSONAsClassesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripSeparator(); + this.nextErrorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.previousErrorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cbToolBar1.SuspendLayout(); + this.mnuContext.SuspendLayout(); + this.SuspendLayout(); + // + // cbToolBar1 + // + this.cbToolBar1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.cbToolBar1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbFilter, + this.tsbSep1, + this.tsbErrors, + this.tsbSep2, + this.tsbWarnings, + this.tsbSep3, + this.tsbMessages, + this.tsbSearch, + this.cboSearch}); + this.cbToolBar1.Location = new System.Drawing.Point(0, 0); + this.cbToolBar1.Name = "cbToolBar1"; + this.cbToolBar1.Size = new System.Drawing.Size(557, 25); + this.cbToolBar1.TabIndex = 0; + this.cbToolBar1.Text = "cbToolBar1"; + // + // tsbFilter + // + this.tsbFilter.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbFilter.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.onlyShowOpenDocumentsToolStripMenuItem, + this.showEfToolStripMenuItem, + this.currentDocumentToolStripMenuItem}); + this.tsbFilter.Image = ((System.Drawing.Image)(resources.GetObject("tsbFilter.Image"))); + this.tsbFilter.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbFilter.Name = "tsbFilter"; + this.tsbFilter.Size = new System.Drawing.Size(32, 22); + this.tsbFilter.Text = "toolStripSplitButton1"; + // + // onlyShowOpenDocumentsToolStripMenuItem + // + this.onlyShowOpenDocumentsToolStripMenuItem.Name = "onlyShowOpenDocumentsToolStripMenuItem"; + this.onlyShowOpenDocumentsToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.onlyShowOpenDocumentsToolStripMenuItem.Text = "&Open Documents"; + // + // showEfToolStripMenuItem + // + this.showEfToolStripMenuItem.Name = "showEfToolStripMenuItem"; + this.showEfToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.showEfToolStripMenuItem.Text = "Current &Project"; + // + // currentDocumentToolStripMenuItem + // + this.currentDocumentToolStripMenuItem.Name = "currentDocumentToolStripMenuItem"; + this.currentDocumentToolStripMenuItem.Size = new System.Drawing.Size(173, 22); + this.currentDocumentToolStripMenuItem.Text = "Current &Document"; + // + // tsbSep1 + // + this.tsbSep1.Name = "tsbSep1"; + this.tsbSep1.Size = new System.Drawing.Size(6, 25); + // + // tsbErrors + // + this.tsbErrors.Checked = true; + this.tsbErrors.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsbErrors.Image = ((System.Drawing.Image)(resources.GetObject("tsbErrors.Image"))); + this.tsbErrors.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbErrors.Name = "tsbErrors"; + this.tsbErrors.Size = new System.Drawing.Size(66, 22); + this.tsbErrors.Text = "0 Errors"; + // + // tsbSep2 + // + this.tsbSep2.Name = "tsbSep2"; + this.tsbSep2.Size = new System.Drawing.Size(6, 25); + // + // tsbWarnings + // + this.tsbWarnings.Checked = true; + this.tsbWarnings.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsbWarnings.Image = ((System.Drawing.Image)(resources.GetObject("tsbWarnings.Image"))); + this.tsbWarnings.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbWarnings.Name = "tsbWarnings"; + this.tsbWarnings.Size = new System.Drawing.Size(86, 22); + this.tsbWarnings.Text = "0 Warnings"; + // + // tsbSep3 + // + this.tsbSep3.Name = "tsbSep3"; + this.tsbSep3.Size = new System.Drawing.Size(6, 25); + // + // tsbMessages + // + this.tsbMessages.Checked = true; + this.tsbMessages.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsbMessages.Image = ((System.Drawing.Image)(resources.GetObject("tsbMessages.Image"))); + this.tsbMessages.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbMessages.Name = "tsbMessages"; + this.tsbMessages.Size = new System.Drawing.Size(87, 22); + this.tsbMessages.Text = "0 Messages"; + // + // tsbSearch + // + this.tsbSearch.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.tsbSearch.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbSearch.Image = ((System.Drawing.Image)(resources.GetObject("tsbSearch.Image"))); + this.tsbSearch.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbSearch.Name = "tsbSearch"; + this.tsbSearch.Size = new System.Drawing.Size(23, 22); + this.tsbSearch.Text = "toolStripButton4"; + // + // cboSearch + // + this.cboSearch.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.cboSearch.Name = "cboSearch"; + this.cboSearch.Size = new System.Drawing.Size(160, 25); + // + // lv + // + this.lv.Columns.AddRange(new AwesomeControls.ListView.ListViewColumn[] { + this.chIndex, + this.chDescription, + this.chFileName, + this.chLineNumber, + this.chColumnNumber, + this.chProjectName}); + this.lv.ContextMenuStrip = this.mnuContext; + this.lv.Dock = System.Windows.Forms.DockStyle.Fill; + this.lv.FullRowSelect = true; + this.lv.ShowGridLines = true; + this.lv.HideSelection = false; + this.lv.Location = new System.Drawing.Point(0, 25); + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(557, 230); + this.lv.TabIndex = 1; + this.lv.Mode = AwesomeControls.ListView.ListViewMode.Details; + // + // chIndex + // + this.chIndex.Text = ""; + this.chIndex.Width = 45; + // + // chDescription + // + this.chDescription.Text = "Description"; + this.chDescription.Width = 223; + // + // chFileName + // + this.chFileName.Text = "File"; + this.chFileName.Width = 95; + // + // chLineNumber + // + this.chLineNumber.Text = "Line"; + // + // chColumnNumber + // + this.chColumnNumber.Text = "Column"; + // + // chProjectName + // + this.chProjectName.Text = "Project"; + this.chProjectName.Width = 68; + // + // mnuContext + // + this.mnuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextSortBy, + this.mnuContextShowColumns, + this.showErrorHelpToolStripMenuItem, + this.toolStripMenuItem1, + this.copyToolStripMenuItem, + this.pasteSpecialToolStripMenuItem, + this.toolStripMenuItem9, + this.nextErrorToolStripMenuItem, + this.previousErrorToolStripMenuItem}); + this.mnuContext.Name = "mnuContext"; + this.mnuContext.Size = new System.Drawing.Size(160, 170); + // + // mnuContextSortBy + // + this.mnuContextSortBy.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem2, + this.toolStripMenuItem3, + this.toolStripMenuItem4, + this.toolStripMenuItem5, + this.toolStripMenuItem6, + this.toolStripMenuItem7, + this.toolStripMenuItem8}); + this.mnuContextSortBy.Name = "mnuContextSortBy"; + this.mnuContextSortBy.Size = new System.Drawing.Size(159, 22); + this.mnuContextSortBy.Text = "&Sort By"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem2.Text = "&Category"; + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem3.Text = "Default &Order"; + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem4.Text = "&Description"; + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem5.Text = "&File"; + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem6.Text = "&Line"; + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem7.Text = "Colu&mn"; + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + this.toolStripMenuItem8.Size = new System.Drawing.Size(145, 22); + this.toolStripMenuItem8.Text = "&Project"; + // + // mnuContextShowColumns + // + this.mnuContextShowColumns.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.categoryToolStripMenuItem, + this.dToolStripMenuItem, + this.descriptionToolStripMenuItem, + this.fileToolStripMenuItem, + this.lineToolStripMenuItem, + this.columnToolStripMenuItem, + this.projectToolStripMenuItem}); + this.mnuContextShowColumns.Name = "mnuContextShowColumns"; + this.mnuContextShowColumns.Size = new System.Drawing.Size(159, 22); + this.mnuContextShowColumns.Text = "Show &Columns"; + // + // categoryToolStripMenuItem + // + this.categoryToolStripMenuItem.Name = "categoryToolStripMenuItem"; + this.categoryToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.categoryToolStripMenuItem.Text = "&Category"; + // + // dToolStripMenuItem + // + this.dToolStripMenuItem.Name = "dToolStripMenuItem"; + this.dToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.dToolStripMenuItem.Text = "Default &Order"; + // + // descriptionToolStripMenuItem + // + this.descriptionToolStripMenuItem.Name = "descriptionToolStripMenuItem"; + this.descriptionToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.descriptionToolStripMenuItem.Text = "&Description"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.fileToolStripMenuItem.Text = "&File"; + // + // lineToolStripMenuItem + // + this.lineToolStripMenuItem.Name = "lineToolStripMenuItem"; + this.lineToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.lineToolStripMenuItem.Text = "&Line"; + // + // columnToolStripMenuItem + // + this.columnToolStripMenuItem.Name = "columnToolStripMenuItem"; + this.columnToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.columnToolStripMenuItem.Text = "Colu&mn"; + // + // projectToolStripMenuItem + // + this.projectToolStripMenuItem.Name = "projectToolStripMenuItem"; + this.projectToolStripMenuItem.Size = new System.Drawing.Size(145, 22); + this.projectToolStripMenuItem.Text = "&Project"; + // + // showErrorHelpToolStripMenuItem + // + this.showErrorHelpToolStripMenuItem.Name = "showErrorHelpToolStripMenuItem"; + this.showErrorHelpToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.showErrorHelpToolStripMenuItem.Text = "Show Error &Help"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(156, 6); + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.copyToolStripMenuItem.Text = "Cop&y"; + // + // pasteSpecialToolStripMenuItem + // + this.pasteSpecialToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.pasteJSONAsClassesToolStripMenuItem}); + this.pasteSpecialToolStripMenuItem.Name = "pasteSpecialToolStripMenuItem"; + this.pasteSpecialToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.pasteSpecialToolStripMenuItem.Text = "Paste &Special"; + // + // pasteJSONAsClassesToolStripMenuItem + // + this.pasteJSONAsClassesToolStripMenuItem.Name = "pasteJSONAsClassesToolStripMenuItem"; + this.pasteJSONAsClassesToolStripMenuItem.Size = new System.Drawing.Size(190, 22); + this.pasteJSONAsClassesToolStripMenuItem.Text = "Paste &JSON As Classes"; + // + // toolStripMenuItem9 + // + this.toolStripMenuItem9.Name = "toolStripMenuItem9"; + this.toolStripMenuItem9.Size = new System.Drawing.Size(156, 6); + // + // nextErrorToolStripMenuItem + // + this.nextErrorToolStripMenuItem.Name = "nextErrorToolStripMenuItem"; + this.nextErrorToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.nextErrorToolStripMenuItem.Text = "Ne&xt Error"; + // + // previousErrorToolStripMenuItem + // + this.previousErrorToolStripMenuItem.Name = "previousErrorToolStripMenuItem"; + this.previousErrorToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.previousErrorToolStripMenuItem.Text = "P&revious Error"; + // + // ErrorList + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.lv); + this.Controls.Add(this.cbToolBar1); + this.Name = "ErrorList"; + this.Size = new System.Drawing.Size(557, 255); + this.cbToolBar1.ResumeLayout(false); + this.cbToolBar1.PerformLayout(); + this.mnuContext.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private AwesomeControls.CommandBars.CBToolBar cbToolBar1; + private System.Windows.Forms.ToolStripSplitButton tsbFilter; + private System.Windows.Forms.ToolStripMenuItem onlyShowOpenDocumentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showEfToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem currentDocumentToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator tsbSep1; + private System.Windows.Forms.ToolStripButton tsbErrors; + private System.Windows.Forms.ToolStripSeparator tsbSep2; + private System.Windows.Forms.ToolStripButton tsbWarnings; + private System.Windows.Forms.ToolStripSeparator tsbSep3; + private System.Windows.Forms.ToolStripButton tsbMessages; + private System.Windows.Forms.ToolStripButton tsbSearch; + private System.Windows.Forms.ToolStripComboBox cboSearch; + private AwesomeControls.ListView.ListViewColumn chIndex; + private AwesomeControls.ListView.ListViewColumn chDescription; + private AwesomeControls.ListView.ListViewColumn chFileName; + private AwesomeControls.ListView.ListViewColumn chLineNumber; + private AwesomeControls.ListView.ListViewColumn chColumnNumber; + private AwesomeControls.ListView.ListViewColumn chProjectName; + internal AwesomeControls.ListView.ListViewControl lv; + private AwesomeControls.CommandBars.CBContextMenu mnuContext; + private System.Windows.Forms.ToolStripMenuItem mnuContextShowColumns; + private System.Windows.Forms.ToolStripMenuItem categoryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem descriptionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem lineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem columnToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextSortBy; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; + private System.Windows.Forms.ToolStripMenuItem showErrorHelpToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteSpecialToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteJSONAsClassesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem9; + private System.Windows.Forms.ToolStripMenuItem nextErrorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem previousErrorToolStripMenuItem; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.cs new file mode 100644 index 00000000..99ece315 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + public partial class ErrorList : UserControl + { + public ErrorList() + { + InitializeComponent(); + + tsbFilter.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ErrorList/Filter.png"); + tsbErrors.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ErrorList/Error.png"); + tsbWarnings.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ErrorList/Warning.png"); + tsbMessages.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ErrorList/Message.png"); + } + + private HostApplicationMessage.HostApplicationMessageCollection mvarMessages = new HostApplicationMessage.HostApplicationMessageCollection(); + public HostApplicationMessage.HostApplicationMessageCollection Messages { get { return mvarMessages; } } + + public void RefreshList() + { + lv.Items.Clear(); + for (int i = 0; i < mvarMessages.Count; i++) + { + HostApplicationMessage message = mvarMessages[i]; + + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = i.ToString(); + lvi.Details.Add(message.Description); + lvi.Details.Add(message.FileName); + if (message.LineNumber != null) + { + lvi.Details.Add(message.LineNumber.Value.ToString()); + } + else + { + lvi.Details.Add(String.Empty); + } + if (message.ColumnNumber != null) + { + lvi.Details.Add(message.ColumnNumber.Value.ToString()); + } + else + { + lvi.Details.Add(String.Empty); + } + lvi.Details.Add(message.ProjectName); + lv.Items.Add(lvi); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.resx new file mode 100644 index 00000000..9f00bece --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/ErrorList.resx @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + 130, 17 + + + 82 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.Designer.cs new file mode 100644 index 00000000..ff2c21d8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.Designer.cs @@ -0,0 +1,214 @@ +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + partial class OutputWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OutputWindow)); + this.cbToolBar1 = new AwesomeControls.CommandBars.CBToolBar(); + this.lblShowOutputFrom = new System.Windows.Forms.ToolStripLabel(); + this.cboShowOutputFrom = new System.Windows.Forms.ToolStripComboBox(); + this.tsbSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbClearAllPanes = new System.Windows.Forms.ToolStripButton(); + this.tsbSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbFindMessageInDocument = new System.Windows.Forms.ToolStripButton(); + this.tsbSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbGoToPreviousMessage = new System.Windows.Forms.ToolStripButton(); + this.tsbGoToNextMessage = new System.Windows.Forms.ToolStripButton(); + this.tsbSep4 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbClearAll = new System.Windows.Forms.ToolStripButton(); + this.tsbSep5 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbToggleWordWrap = new System.Windows.Forms.ToolStripButton(); + this.txtOutput = new System.Windows.Forms.TextBox(); + this.cbToolBar1.SuspendLayout(); + this.SuspendLayout(); + // + // cbToolBar1 + // + this.cbToolBar1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.lblShowOutputFrom, + this.cboShowOutputFrom, + this.tsbSep1, + this.tsbClearAllPanes, + this.tsbSep2, + this.tsbFindMessageInDocument, + this.tsbSep3, + this.tsbGoToPreviousMessage, + this.tsbGoToNextMessage, + this.tsbSep4, + this.tsbClearAll, + this.tsbSep5, + this.tsbToggleWordWrap}); + this.cbToolBar1.Location = new System.Drawing.Point(0, 0); + this.cbToolBar1.Name = "cbToolBar1"; + this.cbToolBar1.Size = new System.Drawing.Size(551, 25); + this.cbToolBar1.TabIndex = 0; + this.cbToolBar1.Text = "cbToolBar1"; + // + // lblShowOutputFrom + // + this.lblShowOutputFrom.Name = "lblShowOutputFrom"; + this.lblShowOutputFrom.Size = new System.Drawing.Size(107, 22); + this.lblShowOutputFrom.Text = "&Show output from:"; + // + // cboShowOutputFrom + // + this.cboShowOutputFrom.Items.AddRange(new object[] { + "Build", + "Build Order", + "Debug", + "Refactor", + "Project Management"}); + this.cboShowOutputFrom.Name = "cboShowOutputFrom"; + this.cboShowOutputFrom.Size = new System.Drawing.Size(121, 25); + // + // tsbSep1 + // + this.tsbSep1.Name = "tsbSep1"; + this.tsbSep1.Size = new System.Drawing.Size(6, 25); + // + // tsbClearAllPanes + // + this.tsbClearAllPanes.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbClearAllPanes.Image = ((System.Drawing.Image)(resources.GetObject("tsbClearAllPanes.Image"))); + this.tsbClearAllPanes.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbClearAllPanes.Name = "tsbClearAllPanes"; + this.tsbClearAllPanes.Size = new System.Drawing.Size(23, 22); + this.tsbClearAllPanes.Text = "Clear All Panes"; + this.tsbClearAllPanes.Visible = false; + // + // tsbSep2 + // + this.tsbSep2.Name = "tsbSep2"; + this.tsbSep2.Size = new System.Drawing.Size(6, 25); + // + // tsbFindMessageInDocument + // + this.tsbFindMessageInDocument.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbFindMessageInDocument.Image = ((System.Drawing.Image)(resources.GetObject("tsbFindMessageInDocument.Image"))); + this.tsbFindMessageInDocument.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbFindMessageInDocument.Name = "tsbFindMessageInDocument"; + this.tsbFindMessageInDocument.Size = new System.Drawing.Size(23, 22); + this.tsbFindMessageInDocument.Text = "Find Message in Document"; + // + // tsbSep3 + // + this.tsbSep3.Name = "tsbSep3"; + this.tsbSep3.Size = new System.Drawing.Size(6, 25); + // + // tsbGoToPreviousMessage + // + this.tsbGoToPreviousMessage.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbGoToPreviousMessage.Image = ((System.Drawing.Image)(resources.GetObject("tsbGoToPreviousMessage.Image"))); + this.tsbGoToPreviousMessage.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbGoToPreviousMessage.Name = "tsbGoToPreviousMessage"; + this.tsbGoToPreviousMessage.Size = new System.Drawing.Size(23, 22); + this.tsbGoToPreviousMessage.Text = "Go to Previous Message"; + // + // tsbGoToNextMessage + // + this.tsbGoToNextMessage.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbGoToNextMessage.Image = ((System.Drawing.Image)(resources.GetObject("tsbGoToNextMessage.Image"))); + this.tsbGoToNextMessage.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbGoToNextMessage.Name = "tsbGoToNextMessage"; + this.tsbGoToNextMessage.Size = new System.Drawing.Size(23, 22); + this.tsbGoToNextMessage.Text = "Go to Next Message"; + // + // tsbSep4 + // + this.tsbSep4.Name = "tsbSep4"; + this.tsbSep4.Size = new System.Drawing.Size(6, 25); + // + // tsbClearAll + // + this.tsbClearAll.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbClearAll.Image = ((System.Drawing.Image)(resources.GetObject("tsbClearAll.Image"))); + this.tsbClearAll.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbClearAll.Name = "tsbClearAll"; + this.tsbClearAll.Size = new System.Drawing.Size(23, 22); + this.tsbClearAll.Text = "Clear All"; + // + // tsbSep5 + // + this.tsbSep5.Name = "tsbSep5"; + this.tsbSep5.Size = new System.Drawing.Size(6, 25); + // + // tsbToggleWordWrap + // + this.tsbToggleWordWrap.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbToggleWordWrap.Image = ((System.Drawing.Image)(resources.GetObject("tsbToggleWordWrap.Image"))); + this.tsbToggleWordWrap.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbToggleWordWrap.Name = "tsbToggleWordWrap"; + this.tsbToggleWordWrap.Size = new System.Drawing.Size(23, 22); + this.tsbToggleWordWrap.Text = "Toggle Word Wrap"; + // + // txtOutput + // + this.txtOutput.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtOutput.HideSelection = false; + this.txtOutput.Location = new System.Drawing.Point(0, 25); + this.txtOutput.Multiline = true; + this.txtOutput.Name = "txtOutput"; + this.txtOutput.ReadOnly = true; + this.txtOutput.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtOutput.Size = new System.Drawing.Size(551, 228); + this.txtOutput.TabIndex = 1; + // + // OutputWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.txtOutput); + this.Controls.Add(this.cbToolBar1); + this.Name = "OutputWindow"; + this.Size = new System.Drawing.Size(551, 253); + this.cbToolBar1.ResumeLayout(false); + this.cbToolBar1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private AwesomeControls.CommandBars.CBToolBar cbToolBar1; + private System.Windows.Forms.ToolStripLabel lblShowOutputFrom; + private System.Windows.Forms.ToolStripComboBox cboShowOutputFrom; + private System.Windows.Forms.ToolStripSeparator tsbSep1; + private System.Windows.Forms.ToolStripButton tsbClearAllPanes; + private System.Windows.Forms.ToolStripSeparator tsbSep2; + private System.Windows.Forms.ToolStripButton tsbFindMessageInDocument; + private System.Windows.Forms.ToolStripSeparator tsbSep3; + private System.Windows.Forms.ToolStripButton tsbGoToPreviousMessage; + private System.Windows.Forms.ToolStripButton tsbGoToNextMessage; + private System.Windows.Forms.ToolStripSeparator tsbSep4; + private System.Windows.Forms.ToolStripButton tsbClearAll; + private System.Windows.Forms.ToolStripSeparator tsbSep5; + private System.Windows.Forms.ToolStripButton tsbToggleWordWrap; + private System.Windows.Forms.TextBox txtOutput; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.cs new file mode 100644 index 00000000..533606a7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using AwesomeControls; + +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + public partial class OutputWindow : UserControl + { + public OutputWindow() + { + InitializeComponent(); + + txtOutput.BackColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowBackground; + txtOutput.ForeColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowForeground; + txtOutput.Font = new System.Drawing.Font(System.Drawing.FontFamily.GenericMonospace, 10, FontStyle.Regular); + txtOutput.BorderStyle = System.Windows.Forms.BorderStyle.None; + + cbToolBar1.LoadThemeIcons("OutputWindow"); + } + + public void AppendText(string text) + { + txtOutput.AppendText(text); + } + public void ClearText() + { + txtOutput.Text = String.Empty; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.resx new file mode 100644 index 00000000..30734bc6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/OutputWindow.resx @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.Designer.cs new file mode 100644 index 00000000..76ee2542 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.Designer.cs @@ -0,0 +1,457 @@ +using System.Drawing; +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + partial class SolutionExplorer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SolutionExplorer)); + this.cbToolBar1 = new AwesomeControls.CommandBars.CBToolBar(); + this.tsbBack = new System.Windows.Forms.ToolStripButton(); + this.tsbForward = new System.Windows.Forms.ToolStripButton(); + this.tsbHome = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbFilter = new System.Windows.Forms.ToolStripSplitButton(); + this.pendingChangesFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openFilesFilterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbRefresh = new System.Windows.Forms.ToolStripButton(); + this.tsbCollapseAll = new System.Windows.Forms.ToolStripButton(); + this.tsbShowAllFiles = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbViewCode = new System.Windows.Forms.ToolStripButton(); + this.tsbProperties = new System.Windows.Forms.ToolStripButton(); + this.tsbPreviewSelectedItems = new System.Windows.Forms.ToolStripButton(); + this.txtFilter = new AwesomeControls.TextBox.TextBoxControl(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextAddNewProject = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextAddExistingProject = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextAddSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextAddNewItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextAddExistingItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextAddSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextAddSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextAddNewFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.cbToolBar1.SuspendLayout(); + this.mnuContext.SuspendLayout(); + this.SuspendLayout(); + // + // cbToolBar1 + // + this.cbToolBar1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.cbToolBar1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbBack, + this.tsbForward, + this.tsbHome, + this.toolStripSeparator1, + this.tsbFilter, + this.tsbRefresh, + this.tsbCollapseAll, + this.tsbShowAllFiles, + this.toolStripSeparator2, + this.tsbViewCode, + this.tsbProperties, + this.tsbPreviewSelectedItems}); + this.cbToolBar1.Location = new System.Drawing.Point(0, 0); + this.cbToolBar1.Name = "cbToolBar1"; + this.cbToolBar1.Size = new System.Drawing.Size(322, 25); + this.cbToolBar1.TabIndex = 0; + this.cbToolBar1.Text = "cbToolBar1"; + // + // tsbBack + // + this.tsbBack.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbBack.Image = ((System.Drawing.Image)(resources.GetObject("tsbBack.Image"))); + this.tsbBack.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbBack.Name = "tsbBack"; + this.tsbBack.Size = new System.Drawing.Size(23, 22); + this.tsbBack.Text = "Back"; + // + // tsbForward + // + this.tsbForward.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbForward.Image = ((System.Drawing.Image)(resources.GetObject("tsbForward.Image"))); + this.tsbForward.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbForward.Name = "tsbForward"; + this.tsbForward.Size = new System.Drawing.Size(23, 22); + this.tsbForward.Text = "Forward"; + // + // tsbHome + // + this.tsbHome.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbHome.Image = ((System.Drawing.Image)(resources.GetObject("tsbHome.Image"))); + this.tsbHome.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbHome.Name = "tsbHome"; + this.tsbHome.Size = new System.Drawing.Size(23, 22); + this.tsbHome.Text = "Home"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // tsbFilter + // + this.tsbFilter.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbFilter.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.pendingChangesFilterToolStripMenuItem, + this.openFilesFilterToolStripMenuItem}); + this.tsbFilter.Image = ((System.Drawing.Image)(resources.GetObject("tsbFilter.Image"))); + this.tsbFilter.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbFilter.Name = "tsbFilter"; + this.tsbFilter.Size = new System.Drawing.Size(32, 22); + this.tsbFilter.Text = "Pending Changes Filter"; + // + // pendingChangesFilterToolStripMenuItem + // + this.pendingChangesFilterToolStripMenuItem.Name = "pendingChangesFilterToolStripMenuItem"; + this.pendingChangesFilterToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.pendingChangesFilterToolStripMenuItem.Text = "Pending Changes Filter"; + // + // openFilesFilterToolStripMenuItem + // + this.openFilesFilterToolStripMenuItem.Name = "openFilesFilterToolStripMenuItem"; + this.openFilesFilterToolStripMenuItem.Size = new System.Drawing.Size(184, 22); + this.openFilesFilterToolStripMenuItem.Text = "Open Files Filter"; + // + // tsbRefresh + // + this.tsbRefresh.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbRefresh.Image = ((System.Drawing.Image)(resources.GetObject("tsbRefresh.Image"))); + this.tsbRefresh.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbRefresh.Name = "tsbRefresh"; + this.tsbRefresh.Size = new System.Drawing.Size(23, 22); + this.tsbRefresh.Text = "Refresh"; + // + // tsbCollapseAll + // + this.tsbCollapseAll.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbCollapseAll.Image = ((System.Drawing.Image)(resources.GetObject("tsbCollapseAll.Image"))); + this.tsbCollapseAll.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbCollapseAll.Name = "tsbCollapseAll"; + this.tsbCollapseAll.Size = new System.Drawing.Size(23, 22); + this.tsbCollapseAll.Text = "Collapse All"; + // + // tsbShowAllFiles + // + this.tsbShowAllFiles.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbShowAllFiles.Image = ((System.Drawing.Image)(resources.GetObject("tsbShowAllFiles.Image"))); + this.tsbShowAllFiles.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbShowAllFiles.Name = "tsbShowAllFiles"; + this.tsbShowAllFiles.Size = new System.Drawing.Size(23, 22); + this.tsbShowAllFiles.Text = "Show All Files"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // tsbViewCode + // + this.tsbViewCode.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewCode.Image = ((System.Drawing.Image)(resources.GetObject("tsbViewCode.Image"))); + this.tsbViewCode.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewCode.Name = "tsbViewCode"; + this.tsbViewCode.Size = new System.Drawing.Size(23, 22); + this.tsbViewCode.Text = "View Code"; + // + // tsbProperties + // + this.tsbProperties.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbProperties.Image = ((System.Drawing.Image)(resources.GetObject("tsbProperties.Image"))); + this.tsbProperties.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbProperties.Name = "tsbProperties"; + this.tsbProperties.Size = new System.Drawing.Size(23, 22); + this.tsbProperties.Text = "Properties"; + // + // tsbPreviewSelectedItems + // + this.tsbPreviewSelectedItems.CheckOnClick = true; + this.tsbPreviewSelectedItems.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbPreviewSelectedItems.Image = ((System.Drawing.Image)(resources.GetObject("tsbPreviewSelectedItems.Image"))); + this.tsbPreviewSelectedItems.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbPreviewSelectedItems.Name = "tsbPreviewSelectedItems"; + this.tsbPreviewSelectedItems.Size = new System.Drawing.Size(23, 22); + this.tsbPreviewSelectedItems.Text = "Preview Selected Items"; + // + // txtFilter + // + this.txtFilter.AcceptReturn = true; + this.txtFilter.AutoIndentEnabled = true; + this.txtFilter.AutoSuggestFilter = true; + this.txtFilter.AutoSuggestMode = AwesomeControls.TextBox.TextBoxAutoSuggestMode.None; + this.txtFilter.BackColor = System.Drawing.SystemColors.Window; + this.txtFilter.CaretBlinkInterval = 530; + this.txtFilter.CaretColor = System.Drawing.Color.Black; + this.txtFilter.CaretOrientation = System.Windows.Forms.Orientation.Vertical; + this.txtFilter.CaretSize = 1; + this.txtFilter.CaseSensitive = true; + this.txtFilter.CharacterSpacing = 0; + this.txtFilter.CurrentLineIndex = 0; + this.txtFilter.Dock = System.Windows.Forms.DockStyle.Top; + this.txtFilter.EnableCaret = true; + this.txtFilter.EnableCaretBlink = true; + this.txtFilter.EnableMultiSelection = true; + this.txtFilter.EnableOutlining = false; + this.txtFilter.EnableOverwrite = false; + this.txtFilter.EnableOverwriteShortcut = true; + this.txtFilter.EnableSelection = true; + this.txtFilter.EnableSyntaxHighlight = false; + this.txtFilter.ForeColor = System.Drawing.SystemColors.WindowText; + this.txtFilter.HideSelection = true; + this.txtFilter.LineSeparator = AwesomeControls.TextBox.TextBoxLineSeparator.Default; + this.txtFilter.LineSeparatorString = "\r\n"; + this.txtFilter.Location = new System.Drawing.Point(0, 25); + this.txtFilter.Multiline = false; + this.txtFilter.Name = "txtFilter"; + this.txtFilter.PlaceholderText = ""; + this.txtFilter.ReplaceTabsWithSpaces = true; + this.txtFilter.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; + this.txtFilter.SelectionStart = 0; + this.txtFilter.Size = new System.Drawing.Size(322, 23); + this.txtFilter.TabIndex = 1; + this.txtFilter.TabSize = 4; + this.txtFilter.WordSpacing = 0; + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContext; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.FullRowSelect = true; + this.tv.HideSelection = false; + this.tv.ImageIndex = 0; + this.tv.ImageList = this.imlSmallIcons; + this.tv.LabelEdit = true; + this.tv.Location = new System.Drawing.Point(0, 48); + this.tv.Name = "tv"; + this.tv.SelectedImageIndex = 0; + this.tv.Size = new System.Drawing.Size(322, 331); + this.tv.TabIndex = 2; + this.tv.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_BeforeLabelEdit); + this.tv.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_AfterLabelEdit); + this.tv.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.tv_BeforeSelect); + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + this.tv.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tv_NodeMouseDoubleClick); + this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown); + // + // mnuContext + // + this.mnuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextAdd, + this.mnuContextSep1, + this.mnuContextCut, + this.mnuContextCopy, + this.mnuContextPaste, + this.deleteToolStripMenuItem, + this.toolStripMenuItem3, + this.mnuContextProperties}); + this.mnuContext.Name = "cbContextMenu1"; + this.mnuContext.Size = new System.Drawing.Size(190, 148); + this.mnuContext.Opening += new System.ComponentModel.CancelEventHandler(this.mnuContext_Opening); + // + // mnuContextAdd + // + this.mnuContextAdd.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextAddNewProject, + this.mnuContextAddExistingProject, + this.mnuContextAddSep1, + this.mnuContextAddNewItem, + this.mnuContextAddExistingItem, + this.mnuContextAddSep2, + this.mnuContextAddSep3, + this.mnuContextAddNewFolder}); + this.mnuContextAdd.Name = "mnuContextAdd"; + this.mnuContextAdd.Size = new System.Drawing.Size(189, 22); + this.mnuContextAdd.Text = "A&dd"; + // + // mnuContextAddNewProject + // + this.mnuContextAddNewProject.Name = "mnuContextAddNewProject"; + this.mnuContextAddNewProject.Size = new System.Drawing.Size(156, 22); + this.mnuContextAddNewProject.Text = "&New Project..."; + this.mnuContextAddNewProject.Click += new System.EventHandler(this.mnuContextAddNewProject_Click); + // + // mnuContextAddExistingProject + // + this.mnuContextAddExistingProject.Name = "mnuContextAddExistingProject"; + this.mnuContextAddExistingProject.Size = new System.Drawing.Size(156, 22); + this.mnuContextAddExistingProject.Text = "&Existing Project.."; + this.mnuContextAddExistingProject.Click += new System.EventHandler(this.mnuContextAddExistingProject_Click); + // + // mnuContextAddSep1 + // + this.mnuContextAddSep1.Name = "mnuContextAddSep1"; + this.mnuContextAddSep1.Size = new System.Drawing.Size(153, 6); + // + // mnuContextAddNewItem + // + this.mnuContextAddNewItem.Name = "mnuContextAddNewItem"; + this.mnuContextAddNewItem.Size = new System.Drawing.Size(156, 22); + this.mnuContextAddNewItem.Text = "Ne&w Item..."; + this.mnuContextAddNewItem.Click += new System.EventHandler(this.mnuContextAddNewItem_Click); + // + // mnuContextAddExistingItem + // + this.mnuContextAddExistingItem.Name = "mnuContextAddExistingItem"; + this.mnuContextAddExistingItem.Size = new System.Drawing.Size(156, 22); + this.mnuContextAddExistingItem.Text = "Existin&g Item..."; + this.mnuContextAddExistingItem.Click += new System.EventHandler(this.mnuContextAddExistingItem_Click); + // + // mnuContextAddSep2 + // + this.mnuContextAddSep2.Name = "mnuContextAddSep2"; + this.mnuContextAddSep2.Size = new System.Drawing.Size(153, 6); + // + // mnuContextAddSep3 + // + this.mnuContextAddSep3.Name = "mnuContextAddSep3"; + this.mnuContextAddSep3.Size = new System.Drawing.Size(153, 6); + // + // mnuContextAddNewFolder + // + this.mnuContextAddNewFolder.Name = "mnuContextAddNewFolder"; + this.mnuContextAddNewFolder.Size = new System.Drawing.Size(156, 22); + this.mnuContextAddNewFolder.Text = "New Fol&der"; + this.mnuContextAddNewFolder.Click += new System.EventHandler(this.mnuContextAddNewFolder_Click); + // + // mnuContextSep1 + // + this.mnuContextSep1.Name = "mnuContextSep1"; + this.mnuContextSep1.Size = new System.Drawing.Size(186, 6); + // + // mnuContextCut + // + this.mnuContextCut.Name = "mnuContextCut"; + this.mnuContextCut.ShortcutKeyDisplayString = "Ctrl+X"; + this.mnuContextCut.Size = new System.Drawing.Size(189, 22); + this.mnuContextCut.Text = "Cu&t"; + // + // mnuContextCopy + // + this.mnuContextCopy.Name = "mnuContextCopy"; + this.mnuContextCopy.ShortcutKeyDisplayString = "Ctrl+C"; + this.mnuContextCopy.Size = new System.Drawing.Size(189, 22); + this.mnuContextCopy.Text = "&Copy"; + // + // mnuContextPaste + // + this.mnuContextPaste.Name = "mnuContextPaste"; + this.mnuContextPaste.ShortcutKeyDisplayString = "Ctrl+V"; + this.mnuContextPaste.Size = new System.Drawing.Size(189, 22); + this.mnuContextPaste.Text = "&Paste"; + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.ShortcutKeyDisplayString = "Del"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.deleteToolStripMenuItem.Text = "&Delete"; + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(186, 6); + // + // mnuContextProperties + // + this.mnuContextProperties.Name = "mnuContextProperties"; + this.mnuContextProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuContextProperties.Size = new System.Drawing.Size(189, 22); + this.mnuContextProperties.Text = "P&roperties..."; + // + // imlSmallIcons + // + this.imlSmallIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlSmallIcons.ImageSize = new System.Drawing.Size(16, 16); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // SolutionExplorer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tv); + this.Controls.Add(this.txtFilter); + this.Controls.Add(this.cbToolBar1); + this.Name = "SolutionExplorer"; + this.Size = new System.Drawing.Size(322, 379); + this.cbToolBar1.ResumeLayout(false); + this.cbToolBar1.PerformLayout(); + this.mnuContext.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private AwesomeControls.CommandBars.CBToolBar cbToolBar1; + private System.Windows.Forms.ToolStripButton tsbBack; + private System.Windows.Forms.ToolStripButton tsbForward; + private System.Windows.Forms.ToolStripButton tsbHome; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripSplitButton tsbFilter; + private System.Windows.Forms.ToolStripMenuItem pendingChangesFilterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openFilesFilterToolStripMenuItem; + private System.Windows.Forms.ToolStripButton tsbRefresh; + private System.Windows.Forms.ToolStripButton tsbCollapseAll; + private System.Windows.Forms.ToolStripButton tsbShowAllFiles; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton tsbViewCode; + private System.Windows.Forms.ToolStripButton tsbProperties; + private System.Windows.Forms.ToolStripButton tsbPreviewSelectedItems; + private AwesomeControls.TextBox.TextBoxControl txtFilter; + private System.Windows.Forms.TreeView tv; + private AwesomeControls.CommandBars.CBContextMenu mnuContext; + private System.Windows.Forms.ToolStripMenuItem mnuContextAdd; + private System.Windows.Forms.ToolStripMenuItem mnuContextAddNewItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextAddExistingItem; + private System.Windows.Forms.ToolStripSeparator mnuContextAddSep2; + private System.Windows.Forms.ToolStripMenuItem mnuContextAddNewFolder; + private System.Windows.Forms.ToolStripSeparator mnuContextSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextPaste; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem mnuContextProperties; + private System.Windows.Forms.ImageList imlSmallIcons; + private System.Windows.Forms.ToolStripSeparator mnuContextAddSep3; + private System.Windows.Forms.ToolStripMenuItem mnuContextAddNewProject; + private System.Windows.Forms.ToolStripMenuItem mnuContextAddExistingProject; + private System.Windows.Forms.ToolStripSeparator mnuContextAddSep1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.cs new file mode 100644 index 00000000..486d6786 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.cs @@ -0,0 +1,412 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.Project; +using UniversalEditor.ObjectModels.Solution; + +using AwesomeControls; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + [DefaultEvent("SelectionChanged")] + public partial class SolutionExplorer : UserControl + { + public SolutionExplorer() + { + InitializeComponent(); + + mnuContext.Name = "SolutionExplorer.Item"; + Glue.Common.Methods.InitializeCustomizableMenuItems(mnuContext); + + IconMethods.PopulateSystemIcons(ref imlSmallIcons); + imlSmallIcons.Images.Add("generic-solution", Properties.Resources.solution_icon); + imlSmallIcons.Images.Add("generic-project", Properties.Resources.project_icon); + + cbToolBar1.LoadThemeIcons("SolutionExplorer"); + + txtFilter.BackColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.DropDownBackgroundColorNormal; + txtFilter.ForeColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.DropDownForegroundColorNormal; + + tv.BackColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowBackground; + } + + private MainWindow mvarParentWindow = null; + public MainWindow ParentWindow { get { return mvarParentWindow; } set { mvarParentWindow = value; } } + + private SolutionObjectModel mvarSolution = null; + public SolutionObjectModel Solution + { + get { return mvarSolution; } + set + { + mvarSolution = value; + RefreshSolution(); + } + } + + private void RefreshSolution() + { + tv.Nodes.Clear(); + if (mvarSolution == null) return; + + TreeNode tnSolution = new TreeNode(); + tnSolution.ImageKey = "generic-solution"; + tnSolution.SelectedImageKey = "generic-solution"; + tnSolution.Text = "Solution '" + mvarSolution.Title + "' (" + mvarSolution.Projects.Count + " project" + (mvarSolution.Projects.Count != 1 ? "s" : String.Empty) + ")"; + tnSolution.Tag = mvarSolution; + + foreach (ProjectObjectModel p in mvarSolution.Projects) + { + TreeNode tnProject = new TreeNode(); + tnProject.Tag = p; + tnProject.Text = p.Title; + + if (p.ProjectType != null && p.ProjectType.SmallIconImageFileName != null) + { + if (!imlSmallIcons.Images.ContainsKey(p.ProjectType.ID.ToString("B"))) + { + imlSmallIcons.Images.Add(p.ProjectType.ID.ToString("B"), Image.FromFile(p.ProjectType.SmallIconImageFileName)); + } + tnProject.ImageKey = p.ProjectType.ID.ToString("B"); + tnProject.SelectedImageKey = p.ProjectType.ID.ToString("B"); + } + else + { + tnProject.ImageKey = "generic-project"; + } + + #region Properties + { + TreeNode tn = new TreeNode(); + tn.ImageKey = "generic-folder-properties-closed"; + tn.Name = "Properties"; + tn.Text = "Properties"; + tnProject.Nodes.Add(tn); + } + #endregion + #region References + { + TreeNode tn = new TreeNode(); + tn.ImageKey = "generic-folder-references-closed"; + tn.Name = "References"; + tn.Text = "References"; + tnProject.Nodes.Add(tn); + } + #endregion + + LoadFileSystem(p.FileSystem, tnProject); + tnSolution.Nodes.Add(tnProject); + } + tv.Nodes.Add(tnSolution); + + tnSolution.Expand(); + } + + private void LoadFileSystem(ProjectFileSystem pfs, TreeNode tnParent) + { + foreach (ProjectFolder folder in pfs.Folders) + { + LoadItem(folder, tnParent); + } + foreach (ProjectFile file in pfs.Files) + { + LoadItem(file, tnParent); + } + } + private void LoadItem(ProjectFolder item, TreeNode tnParent) + { + TreeNode tn = new TreeNode(); + tn.ImageKey = "generic-folder-closed"; + tn.SelectedImageKey = "generic-folder-closed"; + tn.Text = item.Name; + tn.Tag = item; + foreach (ProjectFolder folder in item.Folders) + { + LoadItem(folder, tn); + } + foreach (ProjectFile file in item.Files) + { + LoadItem(file, tn); + } + tnParent.Nodes.Add(tn); + } + private void LoadItem(ProjectFile item, TreeNode tnParent) + { + TreeNode tn = new TreeNode(); + tn.Text = item.DestinationFileName; + tn.Tag = item; + tnParent.Nodes.Add(tn); + } + + private void tv_BeforeSelect(object sender, TreeViewCancelEventArgs e) + { + SolutionExplorerSelectionChangingEventArgs ce = new SolutionExplorerSelectionChangingEventArgs(e.Node.Tag); + OnSelectionChanging(ce); + if (ce.Cancel) + { + e.Cancel = true; + return; + } + e.Node.Tag = ce.SelectedItem; + } + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + // TODO: update Properties window + OnSelectionChanged(new SolutionExplorerSelectionChangedEventArgs(e.Node.Tag)); + + if (tsbPreviewSelectedItems.Checked) + { + // TODO: do preview of selected item + } + } + + private void tv_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (mvarParentWindow == null) return; + if (e.Node.Tag is ProjectFile) + { + // TODO: open file + ProjectFile file = (e.Node.Tag as ProjectFile); + string BasePath = String.Empty; + FileAccessor fa = (mvarSolution.Accessor as FileAccessor); + if (fa != null) BasePath = System.IO.Path.GetDirectoryName(fa.FileName); + + mvarParentWindow.OpenFile(UniversalEditor.Common.Path.MakeAbsolutePath(file.SourceFileName, BasePath)); + } + } + + private void tv_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node.Tag == null) + { + e.CancelEdit = true; + return; + } + + if (e.Node.Tag is SolutionObjectModel) + { + SolutionObjectModel sol = (e.Node.Tag as SolutionObjectModel); + e.Node.Text = sol.Title; + } + } + + private static char[] InvalidFileNameChars = System.IO.Path.GetInvalidFileNameChars(); + private static string[] SystemReservedNames = new string[] { "CON", "AUX", "PRN", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", ".", ".." }; + + private bool IsFileNameInvalid(string FileName) + { + return FileName.ContainsAny(InvalidFileNameChars) || FileName.ContainsAny(SystemReservedNames); + } + + private void tv_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + string label = e.Label; + if (label == null) label = e.Node.Text; + + if (e.Node.Tag is SolutionObjectModel) + { + SolutionObjectModel sol = (e.Node.Tag as SolutionObjectModel); + sol.Title = label; + e.CancelEdit = true; + e.Node.Text = "Solution '" + label + "' (" + sol.Projects.Count.ToString() + " project" + (sol.Projects.Count == 1 ? "" : "s") + ")"; + } + else if (e.Node.Tag is ProjectObjectModel) + { + ProjectObjectModel proj = (e.Node.Tag as ProjectObjectModel); + proj.Title = label; + e.Node.Text = label; + } + else if (e.Node.Tag is ProjectFile) + { + if (IsFileNameInvalid(label)) + { + MessageBox.Show("Item and file names cannot:\r\n- contain any of the following characters: / ? : & \\ * \" < > | # %\r\n- contain Unicode control characters\r\n- contain surrogate characters\r\n- be system reserved names, including 'CON', 'AUX', 'PRN', 'COM1' or 'LPT2'\r\n- be '.' or '..'\r\n\r\nPlease enter a valid name.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.CancelEdit = true; + return; + } + + ProjectFile file = (e.Node.Tag as ProjectFile); + file.DestinationFileName = label; + } + } + + private void tv_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Left || e.Button == System.Windows.Forms.MouseButtons.Right) + { + TreeViewHitTestInfo tvhti = tv.HitTest(e.Location); + if (tvhti.Node != null) tv.SelectedNode = tvhti.Node; + } + } + + private void mnuContext_Opening(object sender, CancelEventArgs e) + { + if (tv.SelectedNode == null) + { + e.Cancel = true; + return; + } + + mnuContext.Items.Clear(); + + if (tv.SelectedNode.Tag is ProjectObjectModel) + { + ProjectObjectModel project = (tv.SelectedNode.Tag as ProjectObjectModel); + if (project.ProjectType != null) + { + if (project.ProjectType.Tasks.Count > 0) + { + foreach (ProjectTask task in project.ProjectType.Tasks) + { + ToolStripMenuItem tsmiProjectTask = new ToolStripMenuItem(); + task.TaskStarted += task_TaskStarted; + task.TaskFailed += task_TaskFailed; + task.TaskProgress += task_TaskProgress; + + tsmiProjectTask.Text = task.Title; + tsmiProjectTask.Tag = task; + tsmiProjectTask.Click += tsmiProjectTask_Click; + mnuContext.Items.Add(tsmiProjectTask); + } + mnuContext.Items.Add(new ToolStripSeparator()); + } + } + } + + mnuContext.Items.Add(mnuContextAdd); + mnuContext.Items.Add(mnuContextSep1); + mnuContext.Items.Add(mnuContextCut); + mnuContext.Items.Add(mnuContextCopy); + mnuContext.Items.Add(mnuContextPaste); + mnuContext.Items.Add(deleteToolStripMenuItem); + mnuContext.Items.Add(toolStripSeparator1); + mnuContext.Items.Add(mnuContextProperties); + + mnuContextAdd.DropDownItems.Clear(); + mnuContextAdd.DropDownItems.Add(mnuContextAddNewItem); + mnuContextAdd.DropDownItems.Add(mnuContextAddExistingItem); + mnuContextAdd.DropDownItems.Add(mnuContextAddSep2); + mnuContextAdd.DropDownItems.Add(mnuContextAddNewFolder); + + if (tv.SelectedNode.Tag is SolutionObjectModel) + { + mnuContextAddNewItem.Text = "Ne&w Project..."; + mnuContextAddExistingItem.Text = "Existin&g Project..."; + } + else + { + mnuContextAddNewItem.Text = "Ne&w Item..."; + mnuContextAddExistingItem.Text = "Existin&g Item..."; + } + + if (tv.SelectedNode.Tag is ProjectObjectModel) + { + ProjectObjectModel proj = (tv.SelectedNode.Tag as ProjectObjectModel); + if (proj.ProjectType != null) + { + if (proj.ProjectType.ItemShortcuts.Count > 0) + { + mnuContextAdd.DropDownItems.Add(mnuContextAddSep3); + foreach (ProjectTypeItemShortcut its in proj.ProjectType.ItemShortcuts) + { + ToolStripMenuItem tsmi = new ToolStripMenuItem(); + tsmi.Text = its.Title; + tsmi.Click += tsmiItemShortcut_Click; + tsmi.Tag = its; + mnuContextAdd.DropDownItems.Add(tsmi); + } + } + } + } + } + + private void task_TaskStarted(object sender, EventArgs e) + { + HostApplication.Messages.Clear(); + } + private void task_TaskFailed(object sender, ProjectTaskEventArgs e) + { + HostApplication.Messages.Add(HostApplicationMessageSeverity.Error, e.Message); + } + private void task_TaskProgress(object sender, ProgressEventArgs e) + { + } + + private void tsmiProjectTask_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + ProjectTask task = (tsmi.Tag as ProjectTask); + task.Execute(); + } + private void tsmiItemShortcut_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + ProjectTypeItemShortcut its = (tsmi.Tag as ProjectTypeItemShortcut); + + Engine.CurrentEngine.Commands["FileNewDocument"].Execute(); + } + + private void mnuContextAddNewProject_Click(object sender, EventArgs e) + { + ParentWindow.AddSolutionProjectNew(); + } + + private void mnuContextAddExistingProject_Click(object sender, EventArgs e) + { + ParentWindow.AddSolutionProjectExisting(); + } + + private void mnuContextAddNewItem_Click(object sender, EventArgs e) + { + if (tv.SelectedNode.Tag is SolutionObjectModel) + { + // we add a new project to the solution + ParentWindow.AddSolutionProjectNew(); + } + else + { + // we add a new item to the project + ParentWindow.AddProjectItemNew(); + } + } + + private void mnuContextAddExistingItem_Click(object sender, EventArgs e) + { + if (tv.SelectedNode.Tag is SolutionObjectModel) + { + ParentWindow.AddSolutionProjectExisting(); + } + else + { + ParentWindow.AddProjectItemExisting(); + } + } + + private void mnuContextAddNewFolder_Click(object sender, EventArgs e) + { + TreeNode tn = new TreeNode(); + tn.Text = "NewFolder1"; + tv.SelectedNode.Nodes.Add(tn); + tv.SelectedNode = tn; + + tn.BeginEdit(); + } + + public event SolutionExplorerSelectionChangingEventHandler SelectionChanging; + private void OnSelectionChanging(SolutionExplorerSelectionChangingEventArgs e) + { + if (SelectionChanging != null) SelectionChanging(this, e); + } + + public event SolutionExplorerSelectionChangedEventHandler SelectionChanged; + private void OnSelectionChanged(SolutionExplorerSelectionChangedEventArgs e) + { + if (SelectionChanged != null) SelectionChanged(this, e); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.resx new file mode 100644 index 00000000..ea231746 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorer.resx @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI + ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 + HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN + rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K + TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx + oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 + 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI + xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX + LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd + KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + + + + 130, 17 + + + 249, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangedEvent.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangedEvent.cs new file mode 100644 index 00000000..3db27930 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangedEvent.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + public delegate void SolutionExplorerSelectionChangedEventHandler(object sender, SolutionExplorerSelectionChangedEventArgs e); + public class SolutionExplorerSelectionChangedEventArgs : EventArgs + { + private object mvarSelectedItem = null; + public object SelectedItem { get { return mvarSelectedItem; } set { mvarSelectedItem = value; } } + + public SolutionExplorerSelectionChangedEventArgs(object selectedItem) + { + mvarSelectedItem = selectedItem; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangingEvent.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangingEvent.cs new file mode 100644 index 00000000..ad7f9596 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Controls/SolutionExplorerSelectionChangingEvent.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Engines.WindowsForms.Controls +{ + public delegate void SolutionExplorerSelectionChangingEventHandler(object sender, SolutionExplorerSelectionChangingEventArgs e); + public class SolutionExplorerSelectionChangingEventArgs : CancelEventArgs + { + private object mvarSelectedItem = null; + public object SelectedItem { get { return mvarSelectedItem; } set { mvarSelectedItem = value; } } + + public SolutionExplorerSelectionChangingEventArgs(object selectedItem) + { + mvarSelectedItem = selectedItem; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.Designer.cs new file mode 100644 index 00000000..059b01e1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.Designer.cs @@ -0,0 +1,666 @@ +using System.Drawing; +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class AboutDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutDialog)); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.lblApplicationTitle = new System.Windows.Forms.Label(); + this.lblVersion = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.cmdOK = new System.Windows.Forms.Button(); + this.tbsTabs = new System.Windows.Forms.TabControl(); + this.tabAuthors = new System.Windows.Forms.TabPage(); + this.txtContributors = new System.Windows.Forms.TextBox(); + this.tabInstalledComponents = new System.Windows.Forms.TabPage(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tvComponents = new System.Windows.Forms.TreeView(); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.pnlAssemblyInfo = new System.Windows.Forms.Panel(); + this.cmdOpenContainingFolder = new System.Windows.Forms.Button(); + this.txtAssemblyLocation = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtAssemblyFullName = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.fraDescription = new System.Windows.Forms.GroupBox(); + this.txtAssemblyDescription = new System.Windows.Forms.TextBox(); + this.pnlDataFormatInfo = new System.Windows.Forms.Panel(); + this.fraDataFormatContentTypes = new System.Windows.Forms.GroupBox(); + this.lvDataFormatContentTypes = new System.Windows.Forms.ListView(); + this.chDataFormatContentType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraDataFormatFilters = new System.Windows.Forms.GroupBox(); + this.lvDataFormatFilters = new System.Windows.Forms.ListView(); + this.chDataFormatFilterTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chDataFormatFilterFilters = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.txtDataFormatTypeName = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.txtDataFormatID = new System.Windows.Forms.TextBox(); + this.lblDataFormatID = new System.Windows.Forms.Label(); + this.pnlObjectModelInfo = new System.Windows.Forms.Panel(); + this.txtObjectModelTitle = new System.Windows.Forms.TextBox(); + this.lblObjectModelTitle = new System.Windows.Forms.Label(); + this.txtObjectModelTypeName = new System.Windows.Forms.TextBox(); + this.lblObjectModelTypeName = new System.Windows.Forms.Label(); + this.txtObjectModelID = new System.Windows.Forms.TextBox(); + this.lblObjectModelID = new System.Windows.Forms.Label(); + this.tabLicense = new System.Windows.Forms.TabPage(); + this.label2 = new System.Windows.Forms.Label(); + this.txtLicense = new System.Windows.Forms.TextBox(); + this.lblPlatform = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.tbsTabs.SuspendLayout(); + this.tabAuthors.SuspendLayout(); + this.tabInstalledComponents.SuspendLayout(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlAssemblyInfo.SuspendLayout(); + this.fraDescription.SuspendLayout(); + this.pnlDataFormatInfo.SuspendLayout(); + this.fraDataFormatContentTypes.SuspendLayout(); + this.fraDataFormatFilters.SuspendLayout(); + this.pnlObjectModelInfo.SuspendLayout(); + this.tabLicense.SuspendLayout(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(12, 12); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // lblApplicationTitle + // + this.lblApplicationTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblApplicationTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblApplicationTitle.Location = new System.Drawing.Point(50, 12); + this.lblApplicationTitle.Name = "lblApplicationTitle"; + this.lblApplicationTitle.Size = new System.Drawing.Size(470, 19); + this.lblApplicationTitle.TabIndex = 1; + this.lblApplicationTitle.Text = "Universal Editor"; + // + // lblVersion + // + this.lblVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblVersion.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblVersion.Location = new System.Drawing.Point(50, 31); + this.lblVersion.Name = "lblVersion"; + this.lblVersion.Size = new System.Drawing.Size(470, 13); + this.lblVersion.TabIndex = 1; + this.lblVersion.Text = "Version 1.0"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label1.Location = new System.Drawing.Point(13, 60); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(507, 2); + this.label1.TabIndex = 2; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(445, 378); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 3; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // tbsTabs + // + this.tbsTabs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tbsTabs.Controls.Add(this.tabAuthors); + this.tbsTabs.Controls.Add(this.tabInstalledComponents); + this.tbsTabs.Controls.Add(this.tabLicense); + this.tbsTabs.Location = new System.Drawing.Point(12, 65); + this.tbsTabs.Name = "tbsTabs"; + this.tbsTabs.SelectedIndex = 0; + this.tbsTabs.Size = new System.Drawing.Size(508, 307); + this.tbsTabs.TabIndex = 4; + // + // tabAuthors + // + this.tabAuthors.Controls.Add(this.txtContributors); + this.tabAuthors.Location = new System.Drawing.Point(4, 22); + this.tabAuthors.Name = "tabAuthors"; + this.tabAuthors.Padding = new System.Windows.Forms.Padding(3); + this.tabAuthors.Size = new System.Drawing.Size(500, 281); + this.tabAuthors.TabIndex = 0; + this.tabAuthors.Text = "Contributors"; + this.tabAuthors.UseVisualStyleBackColor = true; + // + // txtContributors + // + this.txtContributors.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtContributors.Location = new System.Drawing.Point(3, 3); + this.txtContributors.Multiline = true; + this.txtContributors.Name = "txtContributors"; + this.txtContributors.ReadOnly = true; + this.txtContributors.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtContributors.Size = new System.Drawing.Size(494, 275); + this.txtContributors.TabIndex = 0; + this.txtContributors.Text = "Michael Becker, Lead Developer"; + // + // tabInstalledComponents + // + this.tabInstalledComponents.Controls.Add(this.splitContainer1); + this.tabInstalledComponents.Location = new System.Drawing.Point(4, 22); + this.tabInstalledComponents.Name = "tabInstalledComponents"; + this.tabInstalledComponents.Padding = new System.Windows.Forms.Padding(3); + this.tabInstalledComponents.Size = new System.Drawing.Size(500, 281); + this.tabInstalledComponents.TabIndex = 1; + this.tabInstalledComponents.Text = "Installed Components"; + this.tabInstalledComponents.UseVisualStyleBackColor = true; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(3, 3); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tvComponents); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlAssemblyInfo); + this.splitContainer1.Panel2.Controls.Add(this.pnlDataFormatInfo); + this.splitContainer1.Panel2.Controls.Add(this.pnlObjectModelInfo); + this.splitContainer1.Size = new System.Drawing.Size(494, 275); + this.splitContainer1.SplitterDistance = 261; + this.splitContainer1.TabIndex = 1; + // + // tvComponents + // + this.tvComponents.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvComponents.ImageIndex = 0; + this.tvComponents.ImageList = this.imlSmallIcons; + this.tvComponents.Location = new System.Drawing.Point(0, 0); + this.tvComponents.Name = "tvComponents"; + this.tvComponents.SelectedImageIndex = 0; + this.tvComponents.Size = new System.Drawing.Size(261, 275); + this.tvComponents.TabIndex = 0; + this.tvComponents.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.tvComponents_AfterCollapse); + this.tvComponents.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.tvComponents_AfterExpand); + this.tvComponents.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvComponents_AfterSelect); + // + // imlSmallIcons + // + this.imlSmallIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imlSmallIcons.ImageStream"))); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + this.imlSmallIcons.Images.SetKeyName(0, "LibraryClosed"); + this.imlSmallIcons.Images.SetKeyName(1, "LibraryOpen"); + this.imlSmallIcons.Images.SetKeyName(2, "DataFormat"); + this.imlSmallIcons.Images.SetKeyName(3, "ObjectModel"); + // + // pnlAssemblyInfo + // + this.pnlAssemblyInfo.Controls.Add(this.cmdOpenContainingFolder); + this.pnlAssemblyInfo.Controls.Add(this.txtAssemblyLocation); + this.pnlAssemblyInfo.Controls.Add(this.label4); + this.pnlAssemblyInfo.Controls.Add(this.txtAssemblyFullName); + this.pnlAssemblyInfo.Controls.Add(this.label3); + this.pnlAssemblyInfo.Controls.Add(this.fraDescription); + this.pnlAssemblyInfo.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlAssemblyInfo.Enabled = false; + this.pnlAssemblyInfo.Location = new System.Drawing.Point(0, 0); + this.pnlAssemblyInfo.Name = "pnlAssemblyInfo"; + this.pnlAssemblyInfo.Size = new System.Drawing.Size(229, 275); + this.pnlAssemblyInfo.TabIndex = 2; + this.pnlAssemblyInfo.Visible = false; + // + // cmdOpenContainingFolder + // + this.cmdOpenContainingFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOpenContainingFolder.AutoSize = true; + this.cmdOpenContainingFolder.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOpenContainingFolder.Location = new System.Drawing.Point(95, 55); + this.cmdOpenContainingFolder.Name = "cmdOpenContainingFolder"; + this.cmdOpenContainingFolder.Size = new System.Drawing.Size(132, 23); + this.cmdOpenContainingFolder.TabIndex = 4; + this.cmdOpenContainingFolder.Text = "Open Containing Folder"; + this.cmdOpenContainingFolder.UseVisualStyleBackColor = true; + this.cmdOpenContainingFolder.Click += new System.EventHandler(this.cmdOpenContainingFolder_Click); + // + // txtAssemblyLocation + // + this.txtAssemblyLocation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtAssemblyLocation.Location = new System.Drawing.Point(64, 29); + this.txtAssemblyLocation.Name = "txtAssemblyLocation"; + this.txtAssemblyLocation.ReadOnly = true; + this.txtAssemblyLocation.Size = new System.Drawing.Size(162, 20); + this.txtAssemblyLocation.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(3, 32); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(51, 13); + this.label4.TabIndex = 2; + this.label4.Text = "Location:"; + // + // txtAssemblyFullName + // + this.txtAssemblyFullName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtAssemblyFullName.Location = new System.Drawing.Point(64, 3); + this.txtAssemblyFullName.Name = "txtAssemblyFullName"; + this.txtAssemblyFullName.ReadOnly = true; + this.txtAssemblyFullName.Size = new System.Drawing.Size(162, 20); + this.txtAssemblyFullName.TabIndex = 3; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(3, 6); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(55, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Full name:"; + // + // fraDescription + // + this.fraDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraDescription.Controls.Add(this.txtAssemblyDescription); + this.fraDescription.Location = new System.Drawing.Point(3, 84); + this.fraDescription.Name = "fraDescription"; + this.fraDescription.Size = new System.Drawing.Size(223, 188); + this.fraDescription.TabIndex = 1; + this.fraDescription.TabStop = false; + this.fraDescription.Text = "Description"; + // + // txtAssemblyDescription + // + this.txtAssemblyDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtAssemblyDescription.HideSelection = false; + this.txtAssemblyDescription.Location = new System.Drawing.Point(6, 19); + this.txtAssemblyDescription.Multiline = true; + this.txtAssemblyDescription.Name = "txtAssemblyDescription"; + this.txtAssemblyDescription.ReadOnly = true; + this.txtAssemblyDescription.Size = new System.Drawing.Size(211, 163); + this.txtAssemblyDescription.TabIndex = 0; + // + // pnlDataFormatInfo + // + this.pnlDataFormatInfo.Controls.Add(this.fraDataFormatContentTypes); + this.pnlDataFormatInfo.Controls.Add(this.fraDataFormatFilters); + this.pnlDataFormatInfo.Controls.Add(this.txtDataFormatTypeName); + this.pnlDataFormatInfo.Controls.Add(this.label6); + this.pnlDataFormatInfo.Controls.Add(this.txtDataFormatID); + this.pnlDataFormatInfo.Controls.Add(this.lblDataFormatID); + this.pnlDataFormatInfo.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlDataFormatInfo.Enabled = false; + this.pnlDataFormatInfo.Location = new System.Drawing.Point(0, 0); + this.pnlDataFormatInfo.Name = "pnlDataFormatInfo"; + this.pnlDataFormatInfo.Size = new System.Drawing.Size(229, 275); + this.pnlDataFormatInfo.TabIndex = 4; + this.pnlDataFormatInfo.Visible = false; + // + // fraDataFormatContentTypes + // + this.fraDataFormatContentTypes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraDataFormatContentTypes.Controls.Add(this.lvDataFormatContentTypes); + this.fraDataFormatContentTypes.Location = new System.Drawing.Point(3, 55); + this.fraDataFormatContentTypes.Name = "fraDataFormatContentTypes"; + this.fraDataFormatContentTypes.Size = new System.Drawing.Size(223, 100); + this.fraDataFormatContentTypes.TabIndex = 4; + this.fraDataFormatContentTypes.TabStop = false; + this.fraDataFormatContentTypes.Text = "Content types"; + // + // lvDataFormatContentTypes + // + this.lvDataFormatContentTypes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvDataFormatContentTypes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chDataFormatContentType}); + this.lvDataFormatContentTypes.FullRowSelect = true; + this.lvDataFormatContentTypes.GridLines = true; + this.lvDataFormatContentTypes.HideSelection = false; + this.lvDataFormatContentTypes.Location = new System.Drawing.Point(6, 19); + this.lvDataFormatContentTypes.Name = "lvDataFormatContentTypes"; + this.lvDataFormatContentTypes.Size = new System.Drawing.Size(211, 75); + this.lvDataFormatContentTypes.TabIndex = 0; + this.lvDataFormatContentTypes.UseCompatibleStateImageBehavior = false; + this.lvDataFormatContentTypes.View = System.Windows.Forms.View.Details; + // + // chDataFormatContentType + // + this.chDataFormatContentType.Text = "Content type"; + this.chDataFormatContentType.Width = 204; + // + // fraDataFormatFilters + // + this.fraDataFormatFilters.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraDataFormatFilters.Controls.Add(this.lvDataFormatFilters); + this.fraDataFormatFilters.Location = new System.Drawing.Point(3, 161); + this.fraDataFormatFilters.Name = "fraDataFormatFilters"; + this.fraDataFormatFilters.Size = new System.Drawing.Size(223, 111); + this.fraDataFormatFilters.TabIndex = 4; + this.fraDataFormatFilters.TabStop = false; + this.fraDataFormatFilters.Text = "Filters"; + // + // lvDataFormatFilters + // + this.lvDataFormatFilters.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvDataFormatFilters.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chDataFormatFilterTitle, + this.chDataFormatFilterFilters}); + this.lvDataFormatFilters.FullRowSelect = true; + this.lvDataFormatFilters.GridLines = true; + this.lvDataFormatFilters.HideSelection = false; + this.lvDataFormatFilters.Location = new System.Drawing.Point(6, 19); + this.lvDataFormatFilters.Name = "lvDataFormatFilters"; + this.lvDataFormatFilters.Size = new System.Drawing.Size(211, 86); + this.lvDataFormatFilters.TabIndex = 0; + this.lvDataFormatFilters.UseCompatibleStateImageBehavior = false; + this.lvDataFormatFilters.View = System.Windows.Forms.View.Details; + // + // chDataFormatFilterTitle + // + this.chDataFormatFilterTitle.Text = "Title"; + this.chDataFormatFilterTitle.Width = 105; + // + // chDataFormatFilterFilters + // + this.chDataFormatFilterFilters.Text = "Filters"; + this.chDataFormatFilterFilters.Width = 99; + // + // txtDataFormatTypeName + // + this.txtDataFormatTypeName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDataFormatTypeName.Location = new System.Drawing.Point(72, 29); + this.txtDataFormatTypeName.Name = "txtDataFormatTypeName"; + this.txtDataFormatTypeName.ReadOnly = true; + this.txtDataFormatTypeName.Size = new System.Drawing.Size(154, 20); + this.txtDataFormatTypeName.TabIndex = 3; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(3, 32); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(63, 13); + this.label6.TabIndex = 2; + this.label6.Text = "Type name:"; + // + // txtDataFormatID + // + this.txtDataFormatID.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDataFormatID.Location = new System.Drawing.Point(72, 3); + this.txtDataFormatID.Name = "txtDataFormatID"; + this.txtDataFormatID.ReadOnly = true; + this.txtDataFormatID.Size = new System.Drawing.Size(154, 20); + this.txtDataFormatID.TabIndex = 3; + // + // lblDataFormatID + // + this.lblDataFormatID.AutoSize = true; + this.lblDataFormatID.Location = new System.Drawing.Point(3, 6); + this.lblDataFormatID.Name = "lblDataFormatID"; + this.lblDataFormatID.Size = new System.Drawing.Size(21, 13); + this.lblDataFormatID.TabIndex = 2; + this.lblDataFormatID.Text = "ID:"; + // + // pnlObjectModelInfo + // + this.pnlObjectModelInfo.Controls.Add(this.txtObjectModelTitle); + this.pnlObjectModelInfo.Controls.Add(this.lblObjectModelTitle); + this.pnlObjectModelInfo.Controls.Add(this.txtObjectModelTypeName); + this.pnlObjectModelInfo.Controls.Add(this.lblObjectModelTypeName); + this.pnlObjectModelInfo.Controls.Add(this.txtObjectModelID); + this.pnlObjectModelInfo.Controls.Add(this.lblObjectModelID); + this.pnlObjectModelInfo.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlObjectModelInfo.Enabled = false; + this.pnlObjectModelInfo.Location = new System.Drawing.Point(0, 0); + this.pnlObjectModelInfo.Name = "pnlObjectModelInfo"; + this.pnlObjectModelInfo.Size = new System.Drawing.Size(229, 275); + this.pnlObjectModelInfo.TabIndex = 3; + this.pnlObjectModelInfo.Visible = false; + // + // txtObjectModelTitle + // + this.txtObjectModelTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtObjectModelTitle.Location = new System.Drawing.Point(72, 55); + this.txtObjectModelTitle.Name = "txtObjectModelTitle"; + this.txtObjectModelTitle.ReadOnly = true; + this.txtObjectModelTitle.Size = new System.Drawing.Size(154, 20); + this.txtObjectModelTitle.TabIndex = 3; + // + // lblObjectModelTitle + // + this.lblObjectModelTitle.AutoSize = true; + this.lblObjectModelTitle.Location = new System.Drawing.Point(3, 58); + this.lblObjectModelTitle.Name = "lblObjectModelTitle"; + this.lblObjectModelTitle.Size = new System.Drawing.Size(30, 13); + this.lblObjectModelTitle.TabIndex = 2; + this.lblObjectModelTitle.Text = "Title:"; + // + // txtObjectModelTypeName + // + this.txtObjectModelTypeName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtObjectModelTypeName.Location = new System.Drawing.Point(72, 29); + this.txtObjectModelTypeName.Name = "txtObjectModelTypeName"; + this.txtObjectModelTypeName.ReadOnly = true; + this.txtObjectModelTypeName.Size = new System.Drawing.Size(154, 20); + this.txtObjectModelTypeName.TabIndex = 3; + // + // lblObjectModelTypeName + // + this.lblObjectModelTypeName.AutoSize = true; + this.lblObjectModelTypeName.Location = new System.Drawing.Point(3, 32); + this.lblObjectModelTypeName.Name = "lblObjectModelTypeName"; + this.lblObjectModelTypeName.Size = new System.Drawing.Size(63, 13); + this.lblObjectModelTypeName.TabIndex = 2; + this.lblObjectModelTypeName.Text = "Type name:"; + // + // txtObjectModelID + // + this.txtObjectModelID.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtObjectModelID.Location = new System.Drawing.Point(72, 3); + this.txtObjectModelID.Name = "txtObjectModelID"; + this.txtObjectModelID.ReadOnly = true; + this.txtObjectModelID.Size = new System.Drawing.Size(154, 20); + this.txtObjectModelID.TabIndex = 3; + // + // lblObjectModelID + // + this.lblObjectModelID.AutoSize = true; + this.lblObjectModelID.Location = new System.Drawing.Point(3, 6); + this.lblObjectModelID.Name = "lblObjectModelID"; + this.lblObjectModelID.Size = new System.Drawing.Size(21, 13); + this.lblObjectModelID.TabIndex = 2; + this.lblObjectModelID.Text = "ID:"; + // + // tabLicense + // + this.tabLicense.Controls.Add(this.label2); + this.tabLicense.Controls.Add(this.txtLicense); + this.tabLicense.Location = new System.Drawing.Point(4, 22); + this.tabLicense.Name = "tabLicense"; + this.tabLicense.Padding = new System.Windows.Forms.Padding(3); + this.tabLicense.Size = new System.Drawing.Size(500, 281); + this.tabLicense.TabIndex = 2; + this.tabLicense.Text = "Application License"; + this.tabLicense.UseVisualStyleBackColor = true; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(6, 9); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(488, 49); + this.label2.TabIndex = 2; + this.label2.Text = resources.GetString("label2.Text"); + // + // txtLicense + // + this.txtLicense.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtLicense.Location = new System.Drawing.Point(3, 61); + this.txtLicense.Multiline = true; + this.txtLicense.Name = "txtLicense"; + this.txtLicense.ReadOnly = true; + this.txtLicense.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtLicense.Size = new System.Drawing.Size(491, 210); + this.txtLicense.TabIndex = 1; + this.txtLicense.Text = resources.GetString("txtLicense.Text"); + // + // lblPlatform + // + this.lblPlatform.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblPlatform.Enabled = false; + this.lblPlatform.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblPlatform.Location = new System.Drawing.Point(10, 383); + this.lblPlatform.Name = "lblPlatform"; + this.lblPlatform.Size = new System.Drawing.Size(429, 18); + this.lblPlatform.TabIndex = 5; + this.lblPlatform.Text = "Powered by the Universal Editor Platform"; + // + // AboutDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdOK; + this.ClientSize = new System.Drawing.Size(532, 413); + this.Controls.Add(this.lblPlatform); + this.Controls.Add(this.tbsTabs); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.label1); + this.Controls.Add(this.lblVersion); + this.Controls.Add(this.lblApplicationTitle); + this.Controls.Add(this.pictureBox1); + this.MinimumSize = new System.Drawing.Size(467, 438); + this.Name = "AboutDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About Universal Editor"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.tbsTabs.ResumeLayout(false); + this.tabAuthors.ResumeLayout(false); + this.tabAuthors.PerformLayout(); + this.tabInstalledComponents.ResumeLayout(false); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlAssemblyInfo.ResumeLayout(false); + this.pnlAssemblyInfo.PerformLayout(); + this.fraDescription.ResumeLayout(false); + this.fraDescription.PerformLayout(); + this.pnlDataFormatInfo.ResumeLayout(false); + this.pnlDataFormatInfo.PerformLayout(); + this.fraDataFormatContentTypes.ResumeLayout(false); + this.fraDataFormatFilters.ResumeLayout(false); + this.pnlObjectModelInfo.ResumeLayout(false); + this.pnlObjectModelInfo.PerformLayout(); + this.tabLicense.ResumeLayout(false); + this.tabLicense.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label lblApplicationTitle; + private System.Windows.Forms.Label lblVersion; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.TabControl tbsTabs; + private System.Windows.Forms.TabPage tabAuthors; + private System.Windows.Forms.TextBox txtContributors; + private System.Windows.Forms.TabPage tabInstalledComponents; + private System.Windows.Forms.TabPage tabLicense; + private System.Windows.Forms.TextBox txtLicense; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tvComponents; + private System.Windows.Forms.ImageList imlSmallIcons; + private System.Windows.Forms.Panel pnlAssemblyInfo; + private System.Windows.Forms.GroupBox fraDescription; + private System.Windows.Forms.TextBox txtAssemblyDescription; + private System.Windows.Forms.Button cmdOpenContainingFolder; + private System.Windows.Forms.TextBox txtAssemblyLocation; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtAssemblyFullName; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Panel pnlObjectModelInfo; + private System.Windows.Forms.TextBox txtObjectModelTypeName; + private System.Windows.Forms.Label lblObjectModelTypeName; + private System.Windows.Forms.TextBox txtObjectModelID; + private System.Windows.Forms.Label lblObjectModelID; + private System.Windows.Forms.TextBox txtObjectModelTitle; + private System.Windows.Forms.Label lblObjectModelTitle; + private System.Windows.Forms.Panel pnlDataFormatInfo; + private System.Windows.Forms.TextBox txtDataFormatTypeName; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtDataFormatID; + private System.Windows.Forms.Label lblDataFormatID; + private System.Windows.Forms.GroupBox fraDataFormatFilters; + private System.Windows.Forms.ListView lvDataFormatFilters; + private System.Windows.Forms.ColumnHeader chDataFormatFilterTitle; + private System.Windows.Forms.ColumnHeader chDataFormatFilterFilters; + private System.Windows.Forms.GroupBox fraDataFormatContentTypes; + private System.Windows.Forms.ListView lvDataFormatContentTypes; + private System.Windows.Forms.ColumnHeader chDataFormatContentType; + private System.Windows.Forms.Label lblPlatform; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.cs new file mode 100644 index 00000000..4d32b75a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.cs @@ -0,0 +1,308 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class AboutDialog : Glue.GlueWindow + { + public AboutDialog() + { + InitializeComponent(); + InitializeImageLists(); + InitializeInstalledComponentsTab(); + + Font = SystemFonts.MenuFont; + lblApplicationTitle.Font = new Font(Font, FontStyle.Bold); + lblApplicationTitle.Text = Engine.CurrentEngine.DefaultLanguage.GetStringTableEntry("ApplicationTitle", "Universal Editor"); + lblPlatform.Visible = (lblApplicationTitle.Text != "Universal Editor"); + + this.Text = "About " + lblApplicationTitle.Text; + + lblVersion.Text = "Version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); + } + + private void InitializeImageLists() + { + IconMethods.PopulateSystemIcons(ref imlSmallIcons); + } + private void InitializeInstalledComponentsTab() + { + tvComponents.Nodes.Clear(); + + #region Object Models + { + TreeNode tnParent = null; + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + string title = omr.Type.Assembly.GetName().Name; + object[] atts = omr.Type.Assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyTitleAttribute), false); + if (atts.Length > 0) + { + title = (atts[0] as System.Reflection.AssemblyTitleAttribute).Title; + } + + if (tnParent == null) + { + if (tvComponents.Nodes.ContainsKey(title)) + { + tnParent = tvComponents.Nodes[title]; + } + else + { + tnParent = tvComponents.Nodes.Add(title, title, "LibraryClosed"); + } + } + else + { + if (tvComponents.Nodes.ContainsKey(title)) + { + tnParent = tnParent.Nodes[title]; + } + else + { + tnParent = tnParent.Nodes.Add(title, title, "LibraryClosed", "LibraryClosed"); + } + } + tnParent.Tag = omr.Type.Assembly; + + foreach (string s in omr.Path) + { + if (tnParent == null) + { + if (tvComponents.Nodes.ContainsKey(s)) + { + tnParent = tvComponents.Nodes[s]; + } + else + { + tnParent = tvComponents.Nodes.Add(s, s, "generic-folder-closed", "generic-folder-closed"); + } + } + else + { + if (tnParent.Nodes.ContainsKey(s)) + { + tnParent = tnParent.Nodes[s]; + } + else + { + tnParent = tnParent.Nodes.Add(s, s, "generic-folder-closed", "generic-folder-closed"); + } + } + + if (Array.IndexOf(omr.Path, s) == omr.Path.Length - 1) + { + tnParent.ImageKey = "ObjectModel"; + tnParent.SelectedImageKey = "ObjectModel"; + tnParent.Tag = omr; + + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(omr); + if (dfrs.Length > 0) + { + TreeNode tnParentDataFormats = null; + if (!tnParent.Nodes.ContainsKey("DataFormats")) + { + tnParentDataFormats = new TreeNode(); + tnParentDataFormats.Name = "DataFormats"; + tnParentDataFormats.Text = "DataFormats"; + tnParentDataFormats.ImageKey = "generic-folder-closed"; + tnParentDataFormats.SelectedImageKey = "generic-folder-closed"; + tnParent.Nodes.Add(tnParentDataFormats); + } + else + { + tnParentDataFormats = tnParent.Nodes["DataFormats"]; + } + foreach (DataFormatReference dfr in dfrs) + { + if (!tnParentDataFormats.Nodes.ContainsKey(dfr.Title)) + { + tnParentDataFormats.Nodes.Add(dfr.Title, dfr.Title, "DataFormat", "DataFormat"); + tnParentDataFormats.Nodes[tnParentDataFormats.Nodes.Count - 1].Tag = dfr; + } + } + } + + EditorReference[] reditors = UniversalEditor.UserInterface.Common.Reflection.GetAvailableEditors(omr); + if (reditors.Length > 0) + { + TreeNode tnParentEditors = null; + if (!tnParent.Nodes.ContainsKey("Editors")) + { + tnParentEditors = new TreeNode(); + tnParentEditors.Name = "Editors"; + tnParentEditors.Text = "Editors"; + tnParentEditors.ImageKey = "generic-folder-closed"; + tnParentEditors.SelectedImageKey = "generic-folder-closed"; + tnParent.Nodes.Add(tnParentEditors); + } + else + { + tnParentEditors = tnParent.Nodes["Editors"]; + } + foreach (EditorReference reditor in reditors) + { + if (!tnParentEditors.Nodes.ContainsKey(reditor.Title)) + { + tnParentEditors.Nodes.Add(reditor.Title, reditor.Title, "Editor", "Editor"); + tnParentEditors.Nodes[tnParentEditors.Nodes.Count - 1].Tag = reditor; + } + } + } + } + } + tnParent = null; + } + } + #endregion + tvComponents.Sort(); + } + + private void tvComponents_AfterExpand(object sender, TreeViewEventArgs e) + { + UpdateNodeImage(e.Node); + } + private void tvComponents_AfterCollapse(object sender, TreeViewEventArgs e) + { + UpdateNodeImage(e.Node); + } + + private void UpdateNodeImage(TreeNode node) + { + if (node == null) return; + switch (node.ImageKey) + { + case "LibraryClosed": + { + node.ImageKey = "LibraryOpen"; + node.SelectedImageKey = "LibraryOpen"; + break; + } + case "LibraryOpen": + { + node.ImageKey = "LibraryClosed"; + node.SelectedImageKey = "LibraryClosed"; + break; + } + case "generic-folder-closed": + { + node.ImageKey = "generic-folder-open"; + node.SelectedImageKey = "generic-folder-open"; + break; + } + case "generic-folder-open": + { + node.ImageKey = "generic-folder-closed"; + node.SelectedImageKey = "generic-folder-closed"; + break; + } + } + } + + private void tvComponents_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + + pnlAssemblyInfo.Visible = false; + pnlAssemblyInfo.Enabled = false; + + pnlObjectModelInfo.Visible = false; + pnlObjectModelInfo.Enabled = false; + + pnlDataFormatInfo.Visible = false; + pnlDataFormatInfo.Enabled = false; + + if (e.Node.Tag is System.Reflection.Assembly) + { + System.Reflection.Assembly asm = (e.Node.Tag as System.Reflection.Assembly); + + txtAssemblyFullName.Text = asm.FullName; + txtAssemblyLocation.Text = asm.Location; + + object[] atts = asm.GetCustomAttributes(typeof(System.Reflection.AssemblyDescriptionAttribute), false); + if (atts.Length > 0) + { + txtAssemblyDescription.Text = ((atts[0] as System.Reflection.AssemblyDescriptionAttribute).Description); + } + + pnlAssemblyInfo.Enabled = true; + pnlAssemblyInfo.Visible = true; + } + else if (e.Node.Tag is ObjectModelReference) + { + ObjectModelReference omr = (e.Node.Tag as ObjectModelReference); + txtObjectModelID.Text = omr.ID.ToString("B"); + if (omr.TypeName == null) + { + txtObjectModelTypeName.Text = "(null)"; + } + else + { + txtObjectModelTypeName.Text = omr.TypeName; + } + txtObjectModelTitle.Text = omr.Title; + + pnlObjectModelInfo.Enabled = true; + pnlObjectModelInfo.Visible = true; + } + else if (e.Node.Tag is DataFormatReference) + { + DataFormatReference dfr = (e.Node.Tag as DataFormatReference); + txtDataFormatID.Text = dfr.ID.ToString("B"); + if (dfr.Type != null) + { + txtDataFormatTypeName.Text = dfr.Type.FullName; + } + else + { + txtDataFormatTypeName.Text = "(null)"; + } + + lvDataFormatFilters.Items.Clear(); + + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { DataFormat = dfr }); + foreach (Association assoc in assocs) + { + foreach (DataFormatFilter filter in assoc.Filters) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = filter.Title; + + StringBuilder sb = new StringBuilder(); + foreach (string s in filter.FileNameFilters) + { + sb.Append(s); + if (filter.FileNameFilters.IndexOf(s) < filter.FileNameFilters.Count - 1) + { + sb.Append(", "); + } + } + lvi.SubItems.Add(sb.ToString()); + lvDataFormatFilters.Items.Add(lvi); + } + } + foreach (string ct in dfr.ContentTypes) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = ct; + lvDataFormatContentTypes.Items.Add(lvi); + } + + pnlDataFormatInfo.Enabled = true; + pnlDataFormatInfo.Visible = true; + } + } + + private void cmdOpenContainingFolder_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(txtAssemblyLocation.Text)); + } + + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.resx new file mode 100644 index 00000000..f946238e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/AboutDialog.resx @@ -0,0 +1,916 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOuAAA + DrgBakH1WwAABIdJREFUWEftl+trXFUUxfs/SRGx1AbUUiuiSEvxQ6EIKkIVhNYP+kEQRSqJScRArThN + mkzb1MRHQSeZZJLJvPOoeWfyzuQ5SSbvTCbvpb8DJwyhTO74ScQDm5x755yz115r731uTp36f/wbGWhp + aVEsFlNjY6P8fr+xpqamnGbXBoNBBQIB+Xw+zc3N6R/Fh/Pt7W3t7Owon3FwcKC9vT2tr68rGo2qv79f + Y2Nj+YNobm42By0tLZkopqenlUwmc9r8/LympqbMevYRxODgoLq6usz+vJiAbsbi4qJxurKyIhzkMpyw + fmZmRsPDw4YBGOE987wAoB+bbdQc2NfXp56eHnV3d6uzs9MY0fHMe4yIFxYWNDExoY6ODiMjA1ba29s1 + NDTkDAgJZRlIpVLmwOXlZUMtUeIEY87vVioYWl1dVSKRMADIBcbu7q4BNzAw4AwADBweHhoH2Pj4uEko + WOjt7T1igqh5tu9GR0fN+snJSYXDYUUiEVNBHo/HMIa0jqSwDKD92traUWIRrQVlGbAsIBdz1sMIYKCc + KiA5eUd5OwJgk9DSC6XxeNwYND7NoNgyYXOCZ5wj39bWlukrjgAgAQM9NzY2TPYzP24wlG0A5pk96XTa + RI3jzc1NU9aOJbAAOIxEgl4ifJpZZkhUqgXaWcd8ZGTkSBICCoVC+TGAcyIgEqIikmzjHWsw5hgZn8lk + zDv2kczkBe/yygH6AJtwODs7a6LJZURsGeAvlcO+9GBCSV9UmdSK6LCOcgCtQM5dgJHdNJVcBljMag4b + PbEnWvgjrJ1qn3qLXGrzB/IDgEMOJQkpq5OMyG2exP7sVnprR4O/eBX/tETrn5drxvWrMwA2Cff3901L + JvvRNpcBFLZY4/ZVq2EkqNGpac2urqmu5I5SpdWK13icAUArJLAM0HTQ9CSj6ZRHXLp8+7Iqw7WqqKuV + 7++WnF7LqK78gfMcOM4AWUwd5zIir+yq0oVvL+rhwiO5khUqCf2gn0N1ctfUmoDySkLqFofIQD84Kfr7 + EbdeK3xTRYkyfRD7UJ9EP1ZB8QXdfnzHyJgXAMsAmxiUYi79H0bdOl36gm723tQ7gbf1XvC6Cr55UY+i + D4xzRl4AoAqHbIYBbjdr3Auwgd70hbvBSj1bfE7vtr6vN/xv6Yr/ms7dKpAr8KMpX8qR5IRNbkZHfYAP + S4ZFDwPUN/2due16d4NVeu6rM7oavqqLwUs6/9vrOn3rrO6FKs1aHGcz4PgyamhoOAIAA3xm0QNsnXMb + jo0M6PefvlRZ6w2d972qgpqX9XzRGVW13zPOAUxpZn/cIq0jBiwADkE7eyDR0xO4XqeTQa08KVOp+5ou + ea7opa/P6n7Ibfo+63COjLaXIAEfJo4A8F0PdRzEXw7icuFwKoJLZqnnsfq81+X/7hUVfvSMKrzFRnN+ + s9c4AVj9oRRpHQHg2rQRwAAAjo/vC2+oteYzRdxfKN7aYiLFsnsFz7aSYI3PNEcA0Aq0XErMuUa9Xq+Q + xhoJhdlnKgez/0GxL9va2tpUX1/vDIAjlP+VRX8BCh6C6mQ1Up0AAAAASUVORK5CYII= + + + + True + + + 6, 7 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK + EQAAAk1TRnQBSQFMAgEBBAEAASgBAAEoAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAPAAH4Ae4B4wH/ + KAADAQH/AwEB/wMBAf8sAAMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/ + MAADVAGqAdYBzgHJAf80AAH4Ae4B4wH/AZkBMQEBAf8B+AHuAeMB/yAAAwEB/wFVAQEBVQH/AwEB/wOD + Af8DAQH/AwEB/yAAAwEB/wFhAQEBYQH/AVoBAQFaAf8BUwEBAVMB/wFNAQEBTQH/AUgBAQFIAf8BRAEB + AUQB/wE/AQEBPwH/ATwBAQE8Af8BOQEBATkB/wE5AQEBOQH/AwEB/xQAA1QBqgHiAd0B2QH/AeIB3QHZ + Af8IAANUAaoBygHBAboB/wF1AV4BSwH/AWYBTAE3Af8wAAH4Ae4B4wH/AbUBYQEzAf8B2AGbAVkB/wGZ + ATEBAQH/AfgB7gHjAf8YAAMBAf8BYwEBAWMB/wFaAQEBWgH/AwEB/wH+Af0B/gH/AcUBxAHFAf8D/QH/ + AwEB/wMBAf8UAAMBAf8BbwEBAW8B/wH+Af0B/gH/AwEB/wOHAf8BhgGFAYYB/wHIAccByAH/Af4B/QH+ + Af8B/gH9Af4B/wH+Af0B/gH/Af4B/QH+Af8BOwEBATsB/wMBAf8QAAGoAZkBjQH/AYUBbgFdAf8BZgFM + ATcB/wGFAW4BXQH/AcoBwQG6Af8DVAGqAcABtQGtAf8BZgFMATcB/wHIAbQBpwH/AWYBTAE3Af8oAAGX + AYEBbQH/AZcBgQFtAf8B2AGbAVkC/wHNAZkB/wHpAbQBegH/AdgBmwFZAf8BmQExAQEB/wH4Ae4B4wH/ + EAADAQH/AW8BAQFvAf8BaAEBAWgB/wFhAQEBYQH/AwEB/wGEAYMBhAH/Af4B/QH+Af8BxQHEAcUB/wH+ + Af0B/gH/AcUBxAHFAf8DAQH/AwEB/wgAAwEB/wGCAQEBggH/AXgBAQF4Af8B/gH9Af4B/wMBAf8ByAHH + AcgB/wH+Af0B/gH/AYYBhQGGAf8BhgGFAYYB/wHIAccByAH/Af4B/QH+Af8B/gH9Af4B/wFBAQEBQQH/ + AwEB/wwAAWYBTAE3Af8BZgFMATcB/wG7AakBnAH/AdkBzQHFAf8BqwGXAYgB/wF1AV4BSwH/AWYBTAE3 + Af8BdQFeAUsB/wHUAcQBuwH/AcgBtAGnAf8BYQFHATMB/ygAAZcBgQFtAf8EAAH4Ae4B4wH/AdgBmwFZ + Av8BzQGZAf8B6QG0AXoB/wHYAZsBWQH/AZkBMQEBAf8MAAMBAf8BewEBAXsB/wF2AQEBdgH/AXABAQFw + Af8BaQEBAWkB/wHFAcQBxQH/AwEB/wMBAf8DgwH/AcUBxAHFAf8B/gH9Af4B/wHFAcQBxQH/AwEB/wMB + Af8DAQH/AZABHQGQAf8BigERAYoB/wH+Af0B/gH/Af4B/QH+Af8DAQH/AcgBxwHIAf8B/gH9Af4B/wH+ + Af0B/gH/Af4B/QH+Af8BhgGFAYYB/wHIAccByAH/Af4B/QH+Af8BSAEBAUgB/wMBAf8MAAG4AZ4BkAH/ + AeAB1QHPAf8B8wHvAewF/wH9AfwB+wH/AeYB3gHYAf8B2AHMAcQB/wHcAc8ByAH/AecB1QHLAf8BzAG5 + Aa4B/wFhAUcBMwH/KAABlwGBAW0B/wgAAfgB7gHjAf8B2AGbAVkC/wHNAZkB/wHJAXEBQQH/AfgB7gHj + Af8IAAMBAf8BiwETAYsB/wGGAQkBhgH/AYEBAQGBAf8BeAEBAXgB/wHFAcQBxQH/AWwBAQFsAf8BZAEB + AWQB/wFdAQEBXQH/AwEB/wMBAf8DgwH/Af4B/QH+Af8DgwH/BAADAQH/AZkBLwGZAf8B/gH9Af4B/wH+ + Af0B/gH/Af4B/QH+Af8DAQH/AckBxwHJAf8B/gH9Af4B/wEBA/8B/gH9Af4B/wH+Af0B/gH/AYYBhQGG + Af8B/gH9Af4B/wFQAQEBUAH/AwEB/wwAAboBpQGWBf8B6gGcAXIB/wHqAZIBYgH/AeoBhwFSAf8B6AF6 + AUMB/wHiAXEBOAH/AdkBaAExAf8B6wHbAdMB/wHRAb8BtQH/AWEBRwEzAf8YAAHYAe4B9gH/DAABlwGB + AW0B/wwAAfcB3gHiAf8B2AGbAVkB/wH4Ae4B4wH/CAADAQH/AZkBLwGZAf8BlQEnAZUB/wGQAR0BkAH/ + AYsBEwGLAf8BxgHEAcYB/wF8AQEBfAH/AXUBAQF1Af8BbwEBAW8B/wFpAQEBaQH/AWIBAQFiAf8BWwEB + AVsB/wMBAf8DAQH/AYQBgwGEAf8EAAMBAf8BoQE/AaEB/wH+Af0B/gH/Af4B/QH+Af8B/gH9Af4B/wMB + Af8ByQHHAckB/wH+Af0B/gH/Af4B/QH+Bf8BAQP/AYYBhQGGAf8B/gH9Af4B/wFYAQEBWAH/AwEB/wwA + Ab4BqQGaEf8B/gH9AfwB/wH5AfUB8gH/AfQB6wHmAf8B7gHhAdoB/wHWAcQBvAH/AWEBRwEzAf8UAAHY + Ae4B9gH/AQwBdgGeAf8B2AHuAfYB/wgAAZcBgQFtAf8IAANJAYgBjQErAYwB/wH3Ad4B4gH/DAADAQH/ + AaQBRQGkAf8BoQE/AaEB/wGbATMBmwH/AcYBxQHGAf8BjwEbAY8B/wGIAQ0BiAH/AYIBAQGCAf8BeQEB + AXkB/wFzAQEBcwH/AW0BAQFtAf8BZwEBAWcB/wFiAQEBYgH/AV0BAQFdAf8DAQH/AwEB/wMBAf8BqQFP + AakG/wH9Av8B/gH9Af4B/wMBAf8ByQHIAckB/wH+Af0B/gH/AQED/wH+Af0B/gH/Af4B/QH+Af8BhgGF + AYYF/wFiAQEBYgH/AwEB/wwAAcMBrgGeBf8B6gGbAXIB/wHqAZIBYgH/AeoBhwFSAf8B6AF6AUMB/wHi + AXEBOAH/AdkBaQExAf8B8QHnAeEB/wHaAcsBwwH/AWEBRwEzAf8QAAHYAe4B9gH/AQwBdgGeAf8BGgG2 + Ae4B/wEMAXYBngH/AdgB7gH2Af8EAAGXAYEBbQH/BAADSQGIAbMBOgGyAf8B3AFuAdsB/wGNASsBjAH/ + A0kBiAgAAwEB/wGvAVsBrwH/AawBVQGsAf8BxgHFAcYB/wGhAT8BoQH/AZoBMQGaAf8BkgEhAZIB/wGM + ARUBjAH/AYYBCQGGAf8BfAEBAXwB/wF2AQEBdgH/AXEBAQFxAf8BbQEBAW0B/wFpAQEBaQH/AwEB/wQA + AwEB/wGvAVsBrwb/Af4D/wH+Av8DAQH/AckByAHJAf8B/gH9Af4B/wH+Af0B/gH/Af4B/QH+Af8BAQP/ + AYYBhQGGAf8B/gH9Af4B/wFsAQEBbAH/AwEB/wwAAcgBsgGjFf8D/gH/AfoB9wH1Af8B9QHtAekB/wHf + AdIBywH/AWEBRwEzAf8MAAHYAe4B9gH/AQwBdgGeAf8BTQHLAfEB/wEyAcAB7wH/AS0BvgHvAf8BCgFg + AYEB/wGXAYEBbQH/AZcBgQFtAf8BlwGBAW0B/wHZAWoB2AH/AfoBrQH6Af8B+wGYAfoB/wHcAW4B2wH/ + AY0BKwGMAf8DSQGIBAADAQH/AbkBbwG5Af8BxgHFAcYB/wGzAWMBswH/Aa0BVwGtAf8BpQFHAaUB/wGd + ATcBnQH/AZYBKQGWAf8BjwEbAY8B/wGIAQ0BiAH/AYIBAQGCAf8BegEBAXoB/wF1AQEBdQH/AwEB/wgA + AwEB/wG1AWcBtQL/Af4D/wH+A/8B/gL/AwEB/wHJAcgByQL/Af4C/wEBA/8B/gH9Af4B/wH+Af0B/gH/ + AYYBhQGGAf8B/gH9Af4B/wF2AQEBdgH/AwEB/wwAAcwBtgGnBf8B6gGcAXIB/wHqAZIBYwH/AeoBhwFS + Af8B6AF6AUMF/wH9AfwB+wH/AeYB3AHWAf8B4wHYAdIB/wFiAUgBNAH/DAABEgGqAeEB/wGFAeEB9QH/ + AWkB1wH0Af8BTgHLAfEB/wEyAcAB8AH/ARsBtQHuAf8BCgFgAYEB/wHYAe4B9gH/BAADSQGIAdMBYwHS + Af8B+gGtAfoB/wH7AZgB+gH/AdwBbgHbAf8BjQErAYwB/wQAAwEB/wPGAf8BwQGBAcEB/wG+AXkBvgH/ + AbgBbQG4Af8BsQFfAbEB/wGoAU0BqAH/AaABPQGgAf8BmAEtAZgB/wGRAR8BkQH/AYoBEQGKAf8BhAEF + AYQB/wMBAf8MAAMBAf8BuQFvAbkC/wH+A/8B/gL/AckByAHJAf8DhgH/A4YC/wH+A/8B/gP/Af4C/wEB + A/8BhgGFAYYB/wMBAf8DAQH/EAAB0QG7AasZ/wG3AaIBkwH/AWIBSAE0Af8BYgFIATQB/wFiAUgBNAH/ + DAAB2AHuAfYB/wESAaoB4QH/AYYB4QH1Af8BagHWAfMB/wFOAcsB8gH/ATMBwAHwAf8BGgG1Ae0B/wEK + AWABgQH/AdgB7gH2Af8EAANJAYgB0wFjAdIB/wH6Aa0B+gH/AdMBYwHSAf8DSQGICAADAQH/AwEB/wHG + AYsBxgH/AcEBgQHBAf8BuwFzAbsB/wGyAWEBsgH/AaoBUQGqAf8BoAE9AaAB/wGYAS0BmAH/AZABHQGQ + Af8DAQH/EAADAQH/AbsBcwG7Av8B/gP/Af4C/wGHAYYBhwH/CAADhgH/A4YC/wH+A/8B/gL/AYYBhQGG + Af8YAAHVAb8Brxn/AbkBpAGVAf8B1AHFAboB/wFhAUcBMwH/AcEBsgGnAf8QAAHYAe4B9gH/ARIBqgHh + Af8BhQHgAfUB/wFqAdYB8wH/AU4BywHyAf8BMgHAAe8B/wEbAbUB7QH/AQoBYAGBAf8B2AHuAfYB/wQA + A0kBiAHTAWMB0gH/A0kBiBQAAwEB/wMBAf8BwQGBAcEB/wG5AW8BuQH/AbABXQGwAf8BpwFLAacB/wGe + ATkBngH/AwEB/xQAAwEB/wG7AXMBuwL/Af4C/wHJAcgByQH/AYcBhgGHAf8QAAOGAf8BhgGFAYYB/wOG + Af8YAAHYAcIBshn/AcABqwGcAf8BYQFHATMB/wHCAbMBpwH/GAAB2AHuAfYB/wESAaoB4QH/AYYB4QH0 + Af8BaQHWAfQB/wFOAcsB8QH/ARUBmAHIAf8B2AHuAfYB/wwAA0kBiCAAAwEB/wMBAf8BswFjAbMB/wGq + AVEBqgH/AwEB/xwAAYcBhgGHAf8ByQHIAckB/wGHAYYBhwH/OAAB2AHCAbIB/wHYAcIBsgH/AdgBwgGy + Af8B2AHCAbIB/wHYAcIBsgH/AdQBvgGuAf8BzwG5AakB/wHJAbMBpAH/AeIB1gHNAf8gAAHYAe4B9gH/ + ARIBqgHhAf8BhQHhAfUB/wEVAZgByAH/AdgB7gH2Af88AAMBAf8DAQH/JAADhgH/hAAB2AHuAfYB/wES + AaoB4QH/AdgB7gH2Af8kAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAH/wHv + AfwBfwHwAQEB/wHnAf8BxwH4AR8B4AEBAfEBhwH/AYMB8AEHAcABAQHgAQcB/gEBAeABAQGAAQEBwAEH + Af4BgQHAAgABAQHAAQcB/gHBAYABAQEAAQEBwAEHAe4B4wEAAQEBAAEBAcABBwHGAccDAAEBAcABBwGC + AYMBAAEBAQABAQHAAQcBAAEBAQABAwEAAQEBwAEHAQABgQEAAQcBAAEDAcABBwEAAUEBgAEPAQYBDwHA + AQcBgAEjAeABHwEHAY8BwAEPAcABdwH4AT8BjwH/AcABHwHgAf8B/gF/Ad8D/wHxAf8L + + + + The below license applies to the core executable and supporting libraries provided with the Universal Editor software package. Third-party plugins may use a different license; check their license terms under the "Installed Components" tab. + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. + + + 31 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.Designer.cs new file mode 100644 index 00000000..7b3296c8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.Designer.cs @@ -0,0 +1,213 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class CrashDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdIgnore = new System.Windows.Forms.Button(); + this.cmdExit = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.txtType = new System.Windows.Forms.TextBox(); + this.txtSource = new System.Windows.Forms.TextBox(); + this.txtMessage = new System.Windows.Forms.TextBox(); + this.txtStackTrace = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // cmdIgnore + // + this.cmdIgnore.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdIgnore.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdIgnore.Location = new System.Drawing.Point(240, 267); + this.cmdIgnore.Name = "cmdIgnore"; + this.cmdIgnore.Size = new System.Drawing.Size(75, 23); + this.cmdIgnore.TabIndex = 0; + this.cmdIgnore.Text = "&Ignore"; + this.cmdIgnore.UseVisualStyleBackColor = true; + // + // cmdExit + // + this.cmdExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdExit.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdExit.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExit.Location = new System.Drawing.Point(321, 267); + this.cmdExit.Name = "cmdExit"; + this.cmdExit.Size = new System.Drawing.Size(75, 23); + this.cmdExit.TabIndex = 0; + this.cmdExit.Text = "E&xit"; + this.cmdExit.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(384, 36); + this.label1.TabIndex = 1; + this.label1.Text = "The application has encountered a problem and may not be able to continue functio" + + "ning properly."; + // + // txtType + // + this.txtType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtType.Location = new System.Drawing.Point(93, 59); + this.txtType.Name = "txtType"; + this.txtType.ReadOnly = true; + this.txtType.Size = new System.Drawing.Size(303, 20); + this.txtType.TabIndex = 2; + // + // txtSource + // + this.txtSource.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSource.Location = new System.Drawing.Point(93, 85); + this.txtSource.Name = "txtSource"; + this.txtSource.ReadOnly = true; + this.txtSource.Size = new System.Drawing.Size(303, 20); + this.txtSource.TabIndex = 2; + // + // txtMessage + // + this.txtMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMessage.Location = new System.Drawing.Point(93, 111); + this.txtMessage.Multiline = true; + this.txtMessage.Name = "txtMessage"; + this.txtMessage.ReadOnly = true; + this.txtMessage.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtMessage.Size = new System.Drawing.Size(303, 57); + this.txtMessage.TabIndex = 2; + // + // txtStackTrace + // + this.txtStackTrace.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtStackTrace.Location = new System.Drawing.Point(93, 174); + this.txtStackTrace.Multiline = true; + this.txtStackTrace.Name = "txtStackTrace"; + this.txtStackTrace.ReadOnly = true; + this.txtStackTrace.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtStackTrace.Size = new System.Drawing.Size(303, 87); + this.txtStackTrace.TabIndex = 2; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(22, 62); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(34, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Type:"; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(22, 88); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(44, 13); + this.label3.TabIndex = 1; + this.label3.Text = "Source:"; + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(22, 114); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(53, 13); + this.label4.TabIndex = 1; + this.label4.Text = "&Message:"; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(22, 177); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(65, 13); + this.label5.TabIndex = 1; + this.label5.Text = "&Stack trace:"; + // + // CrashDialog + // + this.AcceptButton = this.cmdIgnore; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(408, 302); + this.Controls.Add(this.txtStackTrace); + this.Controls.Add(this.txtMessage); + this.Controls.Add(this.txtSource); + this.Controls.Add(this.txtType); + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.cmdExit); + this.Controls.Add(this.cmdIgnore); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CrashDialog"; + this.Text = "Error"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdIgnore; + private System.Windows.Forms.Button cmdExit; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtType; + private System.Windows.Forms.TextBox txtSource; + private System.Windows.Forms.TextBox txtMessage; + private System.Windows.Forms.TextBox txtStackTrace; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.cs new file mode 100644 index 00000000..c707fd69 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class CrashDialog : Form + { + public CrashDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private Exception mvarException = null; + public Exception Exception { get { return mvarException; } set { mvarException = value; } } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + txtType.Text = mvarException.GetType().FullName; + txtMessage.Text = mvarException.Message; + txtSource.Text = mvarException.Source; + txtStackTrace.Text = mvarException.StackTrace; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CrashDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.Designer.cs new file mode 100644 index 00000000..9de4ad28 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.Designer.cs @@ -0,0 +1,116 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class CustomOptionDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tbl = new System.Windows.Forms.TableLayoutPanel(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdAbout = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // tbl + // + this.tbl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tbl.ColumnCount = 3; + this.tbl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tbl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tbl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tbl.Location = new System.Drawing.Point(12, 12); + this.tbl.Name = "tbl"; + this.tbl.RowCount = 2; + this.tbl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tbl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tbl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tbl.Size = new System.Drawing.Size(404, 192); + this.tbl.TabIndex = 0; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(341, 221); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 1; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(260, 221); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 1; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdAbout + // + this.cmdAbout.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.cmdAbout.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAbout.Location = new System.Drawing.Point(12, 221); + this.cmdAbout.Name = "cmdAbout"; + this.cmdAbout.Size = new System.Drawing.Size(75, 23); + this.cmdAbout.TabIndex = 2; + this.cmdAbout.Text = "&About..."; + this.cmdAbout.UseVisualStyleBackColor = true; + this.cmdAbout.Click += new System.EventHandler(this.cmdAbout_Click); + // + // CustomOptionDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(428, 256); + this.Controls.Add(this.cmdAbout); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.tbl); + this.Name = "CustomOptionDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "DataFormat-specific options"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tbl; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdAbout; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.cs new file mode 100644 index 00000000..e81a34eb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class CustomOptionDialog : AwesomeControls.Dialog + { + public CustomOptionDialog() + { + InitializeComponent(); + } + + private Dictionary CustomOptionControls = new Dictionary(); + + public event EventHandler AboutButtonClicked; + + private void cmdAbout_Click(object sender, EventArgs e) + { + if (AboutButtonClicked != null) + { + AboutButtonClicked(sender, e); + } + } + + private CustomOption.CustomOptionCollection mvarCustomOptions = new CustomOption.CustomOptionCollection(); + public CustomOption.CustomOptionCollection CustomOptions { get { return mvarCustomOptions; } set { mvarCustomOptions = value; } } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + tbl.Controls.Clear(); + CustomOptionControls = new Dictionary(); + + foreach (CustomOption eo in mvarCustomOptions) + { + // do not render the CustomOption if it's supposed to be invisible + if (!eo.Visible) continue; + + if (!(eo is CustomOptionBoolean)) + { + Label lbl = new Label(); + lbl.FlatStyle = FlatStyle.System; + lbl.AutoSize = true; + lbl.Dock = DockStyle.None; + lbl.Anchor = AnchorStyles.Left; + lbl.Text = eo.Title.Replace("_", "&"); + tbl.Controls.Add(lbl); + } + + if (eo is CustomOptionChoice) + { + CustomOptionChoice option = (eo as CustomOptionChoice); + + ComboBox cbo = new ComboBox(); + if (option.RequireChoice) cbo.DropDownStyle = ComboBoxStyle.DropDownList; + foreach (CustomOptionFieldChoice choice in option.Choices) + { + cbo.Items.Add(choice); + } + cbo.Dock = DockStyle.Fill; + + tbl.Controls.Add(cbo); + + CustomOptionControls.Add(eo.PropertyName, cbo); + } + else if (eo is CustomOptionNumber) + { + CustomOptionNumber option = (eo as CustomOptionNumber); + + NumericUpDown txt = new NumericUpDown(); + if (option.MaximumValue.HasValue) + { + txt.Maximum = option.MaximumValue.Value; + } + else + { + txt.Maximum = Decimal.MaxValue; + } + if (option.MinimumValue.HasValue) + { + txt.Minimum = option.MinimumValue.Value; + } + else + { + txt.Minimum = Decimal.MinValue; + } + txt.Value = option.DefaultValue; + txt.Dock = DockStyle.Fill; + + tbl.Controls.Add(txt); + + CustomOptionControls.Add(eo.PropertyName, txt); + } + else if (eo is CustomOptionText) + { + CustomOptionText option = (eo as CustomOptionText); + + TextBox txt = new TextBox(); + txt.Text = option.DefaultValue; + txt.Dock = DockStyle.Fill; + if (option.MaximumLength.HasValue) txt.MaxLength = option.MaximumLength.Value; + + tbl.Controls.Add(txt); + + CustomOptionControls.Add(eo.PropertyName, txt); + } + else if (eo is CustomOptionBoolean) + { + CustomOptionBoolean option = (eo as CustomOptionBoolean); + + CheckBox chk = new CheckBox(); + chk.AutoSize = true; + chk.Anchor = AnchorStyles.Left | AnchorStyles.Right; + chk.Text = option.Title; + + tbl.Controls.Add(chk); + tbl.SetColumnSpan(chk, 2); + + CustomOptionControls.Add(eo.PropertyName, chk); + } + else if (eo is CustomOptionFile) + { + CustomOptionFile option = (eo as CustomOptionFile); + + AwesomeControls.FileTextBox.FileTextBoxControl cmd = new AwesomeControls.FileTextBox.FileTextBoxControl(); + cmd.Click += cmdFileBrowse_Click; + cmd.Dock = DockStyle.Fill; + cmd.Tag = eo; + switch (option.DialogMode) + { + case CustomOptionFileDialogMode.Open: + { + cmd.Mode = AwesomeControls.FileTextBox.FileTextBoxMode.Open; + break; + } + case CustomOptionFileDialogMode.Save: + { + cmd.Mode = AwesomeControls.FileTextBox.FileTextBoxMode.Save; + break; + } + } + + tbl.Controls.Add(cmd); + + CustomOptionControls.Add(eo.PropertyName, cmd); + } + + tbl.ColumnCount = 2; + tbl.RowCount = CustomOptionControls.Count; + } + + foreach (RowStyle rs in tbl.RowStyles) + { + rs.SizeType = SizeType.AutoSize; + } + + Label lblSpacer = new Label(); + lblSpacer.Dock = DockStyle.Fill; + tbl.Controls.Add(lblSpacer); + tbl.SetColumnSpan(lblSpacer, 2); + + Font = SystemFonts.MenuFont; + } + + private void cmdFileBrowse_Click(object sender, EventArgs e) + { + Control cmd = (sender as Control); + CustomOptionFile eo = (cmd.Tag as CustomOptionFile); + + if (eo.DialogMode == CustomOptionFileDialogMode.Open) + { + OpenFileDialog ofd = new OpenFileDialog(); + if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + (cmd as AwesomeControls.FileTextBox.FileTextBoxControl).SelectedFileName = ofd.FileName; + } + } + else if (eo.DialogMode == CustomOptionFileDialogMode.Save) + { + SaveFileDialog sfd = new SaveFileDialog(); + if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + (cmd as AwesomeControls.FileTextBox.FileTextBoxControl).SelectedFileName = sfd.FileName; + } + } + } + + private void cmdOK_Click(object sender, EventArgs e) + { + try + { + foreach (CustomOption eo in mvarCustomOptions) + { + // Do not process invisible CustomOptions; this results in a crash + if (!eo.Visible) continue; + + Control ctl = CustomOptionControls[eo.PropertyName]; + if (ctl is NumericUpDown) + { + NumericUpDown itm = (ctl as NumericUpDown); + (eo as CustomOptionNumber).Value = itm.Value; + } + if (ctl is CheckBox) + { + CheckBox itm = (ctl as CheckBox); + (eo as CustomOptionBoolean).Value = itm.Checked; + } + else if (ctl is ComboBox) + { + CustomOptionFieldChoice choice = ((ctl as ComboBox).SelectedItem as CustomOptionFieldChoice); + (eo as CustomOptionChoice).Value = choice; + } + else if (ctl is TextBox) + { + TextBox itm = (ctl as TextBox); + (eo as CustomOptionText).Value = itm.Text; + } + else if (ctl is AwesomeControls.FileTextBox.FileTextBoxControl) + { + AwesomeControls.FileTextBox.FileTextBoxControl itm = (ctl as AwesomeControls.FileTextBox.FileTextBoxControl); + (eo as CustomOptionFile).Value = itm.SelectedFileName; + } + } + } + catch (OverflowException ex) + { + MessageBox.Show("One or more of the parameters you specified is invalid. Please ensure you have provided the correct parameters, and then try again.\r\n\r\n" + ex.Message, "Invalid Parameters Specified", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + public static DialogResult ShowDialog(ref CustomOption.CustomOptionCollection coll, string title, EventHandler aboutButtonClicked) + { + CustomOptionDialog dlg = new CustomOptionDialog(); + if (aboutButtonClicked != null) dlg.AboutButtonClicked += aboutButtonClicked; + dlg.CustomOptions = coll; + dlg.Text = title; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) + { + return DialogResult.Cancel; + } + return DialogResult.OK; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/CustomOptionsDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.Designer.cs new file mode 100644 index 00000000..516ae61c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.Designer.cs @@ -0,0 +1,100 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class DataFormatAboutDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdOK = new System.Windows.Forms.Button(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.txtTitle = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // cmdOK + // + this.cmdOK.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(166, 175); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 0; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // txtDescription + // + this.txtDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDescription.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtDescription.Location = new System.Drawing.Point(12, 31); + this.txtDescription.Multiline = true; + this.txtDescription.Name = "txtDescription"; + this.txtDescription.ReadOnly = true; + this.txtDescription.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtDescription.Size = new System.Drawing.Size(382, 138); + this.txtDescription.TabIndex = 2; + // + // txtTitle + // + this.txtTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTitle.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtTitle.Location = new System.Drawing.Point(12, 12); + this.txtTitle.Name = "txtTitle"; + this.txtTitle.ReadOnly = true; + this.txtTitle.Size = new System.Drawing.Size(382, 13); + this.txtTitle.TabIndex = 2; + // + // DataFormatAboutDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdOK; + this.ClientSize = new System.Drawing.Size(406, 210); + this.Controls.Add(this.txtTitle); + this.Controls.Add(this.txtDescription); + this.Controls.Add(this.cmdOK); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "DataFormatAboutDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About this DataFormat"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.TextBox txtTitle; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.cs new file mode 100644 index 00000000..36ec7df6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class DataFormatAboutDialog : Form + { + public DataFormatAboutDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private DataFormatReference mvarDataFormatReference = null; + public DataFormatReference DataFormatReference + { + get { return mvarDataFormatReference; } + set + { + mvarDataFormatReference = value; + if (mvarDataFormatReference != null) + { + txtTitle.Text = mvarDataFormatReference.Title; + } + else + { + } + } + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.resx new file mode 100644 index 00000000..058096e6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DataFormatAboutDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.Designer.cs new file mode 100644 index 00000000..40174e50 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.Designer.cs @@ -0,0 +1,228 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class DocumentPropertiesDialogBase + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.txtObjectModel = new System.Windows.Forms.TextBox(); + this.cmdObjectModel = new System.Windows.Forms.Button(); + this.txtDataFormat = new System.Windows.Forms.TextBox(); + this.cmdDataFormat = new System.Windows.Forms.Button(); + this.txtAccessor = new System.Windows.Forms.TextBox(); + this.cmdAccessor = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.fraDataFormatOptions = new System.Windows.Forms.GroupBox(); + this.mnuAccessor = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuAccessorLocalFile = new System.Windows.Forms.ToolStripMenuItem(); + this.fTPServerToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.hTTPServerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fTPServerToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuAccessor.SuspendLayout(); + this.SuspendLayout(); + // + // txtObjectModel + // + this.txtObjectModel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtObjectModel.Location = new System.Drawing.Point(127, 14); + this.txtObjectModel.Name = "txtObjectModel"; + this.txtObjectModel.ReadOnly = true; + this.txtObjectModel.Size = new System.Drawing.Size(218, 20); + this.txtObjectModel.TabIndex = 1; + // + // cmdObjectModel + // + this.cmdObjectModel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdObjectModel.Location = new System.Drawing.Point(12, 12); + this.cmdObjectModel.Name = "cmdObjectModel"; + this.cmdObjectModel.Size = new System.Drawing.Size(109, 23); + this.cmdObjectModel.TabIndex = 0; + this.cmdObjectModel.Text = "Object &model:"; + this.cmdObjectModel.UseVisualStyleBackColor = true; + this.cmdObjectModel.Click += new System.EventHandler(this.cmdObjectModel_Click); + // + // txtDataFormat + // + this.txtDataFormat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDataFormat.Location = new System.Drawing.Point(127, 43); + this.txtDataFormat.Name = "txtDataFormat"; + this.txtDataFormat.ReadOnly = true; + this.txtDataFormat.Size = new System.Drawing.Size(218, 20); + this.txtDataFormat.TabIndex = 3; + // + // cmdDataFormat + // + this.cmdDataFormat.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdDataFormat.Location = new System.Drawing.Point(12, 41); + this.cmdDataFormat.Name = "cmdDataFormat"; + this.cmdDataFormat.Size = new System.Drawing.Size(109, 23); + this.cmdDataFormat.TabIndex = 2; + this.cmdDataFormat.Text = "Data &format:"; + this.cmdDataFormat.UseVisualStyleBackColor = true; + this.cmdDataFormat.Click += new System.EventHandler(this.cmdDataFormat_Click); + // + // txtAccessor + // + this.txtAccessor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtAccessor.Location = new System.Drawing.Point(127, 72); + this.txtAccessor.Name = "txtAccessor"; + this.txtAccessor.ReadOnly = true; + this.txtAccessor.Size = new System.Drawing.Size(218, 20); + this.txtAccessor.TabIndex = 5; + // + // cmdAccessor + // + this.cmdAccessor.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAccessor.Location = new System.Drawing.Point(12, 70); + this.cmdAccessor.Name = "cmdAccessor"; + this.cmdAccessor.Size = new System.Drawing.Size(109, 23); + this.cmdAccessor.TabIndex = 4; + this.cmdAccessor.Text = "&Accessor:"; + this.cmdAccessor.UseVisualStyleBackColor = true; + this.cmdAccessor.Click += new System.EventHandler(this.cmdAccessor_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(270, 191); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 8; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.Enabled = false; + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(189, 191); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 7; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // fraDataFormatOptions + // + this.fraDataFormatOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraDataFormatOptions.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraDataFormatOptions.Location = new System.Drawing.Point(12, 99); + this.fraDataFormatOptions.Name = "fraDataFormatOptions"; + this.fraDataFormatOptions.Size = new System.Drawing.Size(333, 86); + this.fraDataFormatOptions.TabIndex = 6; + this.fraDataFormatOptions.TabStop = false; + this.fraDataFormatOptions.Text = "Data format options"; + // + // mnuAccessor + // + this.mnuAccessor.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuAccessorLocalFile, + this.fTPServerToolStripMenuItem, + this.hTTPServerToolStripMenuItem, + this.fTPServerToolStripMenuItem1}); + this.mnuAccessor.Name = "mnuAccessor"; + this.mnuAccessor.Size = new System.Drawing.Size(135, 76); + // + // mnuAccessorLocalFile + // + this.mnuAccessorLocalFile.Name = "mnuAccessorLocalFile"; + this.mnuAccessorLocalFile.Size = new System.Drawing.Size(134, 22); + this.mnuAccessorLocalFile.Text = "&Local File"; + this.mnuAccessorLocalFile.Click += new System.EventHandler(this.mnuAccessorLocalFile_Click); + // + // fTPServerToolStripMenuItem + // + this.fTPServerToolStripMenuItem.Name = "fTPServerToolStripMenuItem"; + this.fTPServerToolStripMenuItem.Size = new System.Drawing.Size(131, 6); + // + // hTTPServerToolStripMenuItem + // + this.hTTPServerToolStripMenuItem.Name = "hTTPServerToolStripMenuItem"; + this.hTTPServerToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.hTTPServerToolStripMenuItem.Text = "&HTTP Server"; + // + // fTPServerToolStripMenuItem1 + // + this.fTPServerToolStripMenuItem1.Name = "fTPServerToolStripMenuItem1"; + this.fTPServerToolStripMenuItem1.Size = new System.Drawing.Size(134, 22); + this.fTPServerToolStripMenuItem1.Text = "&FTP Server"; + // + // DocumentPropertiesDialogBase + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(357, 226); + this.Controls.Add(this.fraDataFormatOptions); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdAccessor); + this.Controls.Add(this.txtAccessor); + this.Controls.Add(this.cmdDataFormat); + this.Controls.Add(this.txtDataFormat); + this.Controls.Add(this.cmdObjectModel); + this.Controls.Add(this.txtObjectModel); + this.Name = "DocumentPropertiesDialogBase"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Document Properties"; + this.mnuAccessor.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtObjectModel; + private System.Windows.Forms.Button cmdObjectModel; + private System.Windows.Forms.TextBox txtDataFormat; + private System.Windows.Forms.Button cmdDataFormat; + private System.Windows.Forms.TextBox txtAccessor; + private System.Windows.Forms.Button cmdAccessor; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.GroupBox fraDataFormatOptions; + private AwesomeControls.CommandBars.CBContextMenu mnuAccessor; + private System.Windows.Forms.ToolStripMenuItem mnuAccessorLocalFile; + private System.Windows.Forms.ToolStripSeparator fTPServerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem hTTPServerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fTPServerToolStripMenuItem1; + + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.cs new file mode 100644 index 00000000..65916b34 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.cs @@ -0,0 +1,486 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class DocumentPropertiesDialogBase : Form + { + public DocumentPropertiesDialogBase() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private DocumentPropertiesDialogMode mvarMode = DocumentPropertiesDialogMode.Open; + public DocumentPropertiesDialogMode Mode { get { return mvarMode; } set { mvarMode = value; } } + + private ObjectModel mvarInitialObjectModel = null; + + private ObjectModel mvarObjectModel = null; + public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; mvarInitialObjectModel = value; } } + + private DataFormat mvarInitialDataFormat = null; + + private DataFormat mvarDataFormat = null; + public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; mvarInitialDataFormat = value; } } + + private Accessor mvarInitialAccesor = null; + + private Accessor mvarAccessor = null; + public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; mvarInitialAccesor = value; } } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + RefreshButtons(); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (mvarObjectModel == null) + { + MessageBox.Show("Please choose an object model for the document.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (mvarDataFormat == null) + { + MessageBox.Show("Please choose an object model for the document.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (mvarAccessor == null) + { + MessageBox.Show("Please choose an object model for the document.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + private void cmdObjectModel_Click(object sender, EventArgs e) + { + GenericBrowserPopup dlg = new GenericBrowserPopup(); + dlg.SelectedObject = mvarObjectModel; + + Point loc = PointToScreen(cmdObjectModel.Location); + dlg.Location = new Point(loc.X, loc.Y + cmdObjectModel.Height); + dlg.Size = new Size(Width, 200); + + ObjectModelReference[] omrs = new ObjectModelReference[0]; + + if (mvarMode == DocumentPropertiesDialogMode.Save) + { + // show all dataformats for the current object model + if (mvarDataFormat == null) + { + omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + } + else + { + omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarDataFormat.MakeReference()); + } + } + else if (mvarMode == DocumentPropertiesDialogMode.Open) + { + if (mvarAccessor != null) + { + // show all dataformats for the current accessor + omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarAccessor); + } + else + { + omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + } + } + foreach (ObjectModelReference dfr in omrs) + { + dlg.AvailableObjects.Add(dfr); + } + dlg.SelectionChanged += dlgObjectModel_SelectionChanged; + dlg.Show(); + } + + private void cmdDataFormat_Click(object sender, EventArgs e) + { + GenericBrowserPopup dlg = new GenericBrowserPopup(); + dlg.SelectedObject = mvarDataFormat; + + Point loc = PointToScreen(cmdDataFormat.Location); + dlg.Location = new Point(loc.X, loc.Y + cmdDataFormat.Height); + dlg.Size = new Size(Width, 200); + + DataFormatReference[] dfrs = new DataFormatReference[0]; + if (mvarMode == DocumentPropertiesDialogMode.Save) + { + // show all dataformats for the current object model + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { ObjectModel = mvarObjectModel.MakeReference() }); + List dfrlist = new List(); + foreach (Association assoc in assocs) + { + foreach(DataFormatReference dfr in assoc.DataFormats) + { + dlg.AvailableObjects.Add(dfr); + } + } + dlg.SelectionChanged += dlgDataFormat_SelectionChanged; + dlg.Show(); + } + else if (mvarMode == DocumentPropertiesDialogMode.Open) + { + if (mvarAccessor != null) + { + // TODO: This desperately needs to be fixed; GetAvailableDataFormats should take + // an accessor, not a file name, as parameter to be cross-accessor compatible!!! + if (mvarAccessor is FileAccessor) + { + // show all dataformats for the current accessor + dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(mvarAccessor); + } + else + { + dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(); + } + } + else if (mvarObjectModel != null) + { + dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(mvarObjectModel.MakeReference()); + } + else + { + dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(); + } + } + foreach (DataFormatReference dfr in dfrs) + { + dlg.AvailableObjects.Add(dfr); + } + dlg.SelectionChanged += dlgDataFormat_SelectionChanged; + dlg.Show(); + } + + private void dlgObjectModel_SelectionChanged(object sender, EventArgs e) + { + GenericBrowserPopup dlg = (sender as GenericBrowserPopup); + mvarObjectModel = dlg.SelectedObject; + RefreshButtons(); + } + private void dlgDataFormat_SelectionChanged(object sender, EventArgs e) + { + GenericBrowserPopup dlg = (sender as GenericBrowserPopup); + mvarDataFormat = dlg.SelectedObject; + RefreshButtons(); + } + private void dlgAccessor_SelectionChanged(object sender, EventArgs e) + { + GenericBrowserPopup dlg = (sender as GenericBrowserPopup); + Accessor acc = dlg.SelectedObject; + dlg.AutoClose = false; + + switch (mvarMode) + { + case DocumentPropertiesDialogMode.Open: + { + if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref acc, CustomOptionDialogType.Import)) + { + return; + } + break; + } + case DocumentPropertiesDialogMode.Save: + { + if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref acc, CustomOptionDialogType.Export)) + { + return; + } + break; + } + } + + mvarAccessor = acc; + RefreshButtons(); + + dlg.AutoClose = true; + } + + private void cmdAccessor_Click(object sender, EventArgs e) + { + GenericBrowserPopup dlg = new GenericBrowserPopup(); + dlg.SelectedObject = mvarAccessor; + + Point loc = PointToScreen(cmdAccessor.Location); + dlg.Location = new Point(loc.X, loc.Y + cmdAccessor.Height); + dlg.Size = new Size(Width, 200); + + AccessorReference[] ars = UniversalEditor.Common.Reflection.GetAvailableAccessors(); + foreach (AccessorReference ar in ars) + { + if (!ar.Visible) continue; + dlg.AvailableObjects.Add(ar); + } + dlg.SelectionChanged += dlgAccessor_SelectionChanged; + dlg.Show(); + } + + private void ShowContextMenuBelow(ContextMenuStrip menu, Control parent) + { + Point pt = PointToScreen(parent.Location); + menu.Show(pt.X, pt.Y + parent.Height); + } + + private void mnuObjectModelSelect_Click(object sender, EventArgs e) + { + + } + + private void mnuObjectModelClear_Click(object sender, EventArgs e) + { + mvarObjectModel = null; + txtObjectModel.Text = String.Empty; + RefreshButtons(); + } + + private void RefreshButtons() + { + if (mvarMode == DocumentPropertiesDialogMode.Save) + { + if (mvarAccessor != null) + { + string filename = (mvarAccessor as FileAccessor).FileName; + if (!System.IO.File.Exists(filename)) + { + if (mvarInitialAccesor != null) + { + filename = (mvarInitialAccesor as FileAccessor).FileName; + } + } + } + } + else if (mvarMode == DocumentPropertiesDialogMode.Open) + { + if (mvarAccessor is FileAccessor) + { + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { Accessor = mvarAccessor }); + List dfrs = new List(); + foreach (Association assoc in assocs) + { + foreach (DataFormatReference dfr in assoc.DataFormats) + { + dfrs.Add(dfr); + } + } + if (mvarDataFormat == null) + { + if (dfrs.Count > 0) + { + mvarDataFormat = dfrs[0].Create(); + } + } + else + { + } + } + if (mvarObjectModel == null) + { + if (mvarDataFormat != null) + { + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarDataFormat.MakeReference()); + if (omrs.Length > 0) + { + mvarObjectModel = omrs[0].Create(); + } + } + else if (mvarAccessor is FileAccessor) + { + string filename = (mvarAccessor as FileAccessor).FileName; + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarAccessor); + if (omrs.Length == 1) + { + mvarObjectModel = omrs[0].Create(); + } + } + } + } + + if (mvarAccessor != null) + { + txtAccessor.Text = mvarAccessor.ToString(); + } + else + { + txtAccessor.Text = String.Empty; + } + if (mvarDataFormat != null) + { + DataFormatReference dfr = mvarDataFormat.MakeReference(); + txtDataFormat.Text = DataFormatReferenceToString(dfr); + } + else + { + txtDataFormat.Text = String.Empty; + } + if (mvarObjectModel != null) + { + ObjectModelReference omr = mvarObjectModel.MakeReference(); + txtObjectModel.Text = omr.Title; + } + else + { + txtObjectModel.Text = String.Empty; + } + + cmdOK.Enabled = (mvarObjectModel != null && mvarDataFormat != null && mvarAccessor != null); + } + + void tsmiObjectModel_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + mvarObjectModel = (tsmi.Tag as ObjectModelReference).Create(); + RefreshButtons(); + } + + private void tsmi_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + mvarDataFormat = (tsmi.Tag as DataFormatReference).Create(); + RefreshButtons(); + } + + private string DataFormatReferenceToString(DataFormatReference dfr) + { + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { DataFormat = dfr }); + return dfr.Title + " (" + DataFormatFilterCollectionToString(assocs) + ")"; + } + + private string DataFormatFilterCollectionToString(Association[] associations) + { + StringBuilder sb = new StringBuilder(); + foreach (Association assoc in associations) + { + foreach (DataFormatFilter filter in assoc.Filters) + { + sb.Append(StringArrayToString(filter.FileNameFilters)); + if (assoc.Filters.IndexOf(filter) < assoc.Filters.Count - 1) + { + sb.Append("; "); + } + } + } + return sb.ToString(); + } + + private string StringArrayToString(System.Collections.Specialized.StringCollection collection) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in collection) + { + sb.Append(s); + if (collection.IndexOf(s) < collection.Count - 1) + { + sb.Append(", "); + } + } + return sb.ToString(); + } + + private void mnuDataFormatSelect_Click(object sender, EventArgs e) + { + + } + + private void mnuDataFormatClear_Click(object sender, EventArgs e) + { + mvarDataFormat = null; + RefreshButtons(); + } + + private void mnuAccessorLocalFile_Click(object sender, EventArgs e) + { + switch (mvarMode) + { + case DocumentPropertiesDialogMode.Open: + { + OpenFileDialog ofd = new OpenFileDialog(); + if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + mvarAccessor = new FileAccessor(ofd.FileName); + txtAccessor.Text = "File: " + ofd.FileName; + } + break; + } + case DocumentPropertiesDialogMode.Save: + { + SaveFileDialog sfd = new SaveFileDialog(); + if (mvarDataFormat != null) + { + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { DataFormat = mvarDataFormat.MakeReference() }); + sfd.Filter = UniversalEditor.UserInterface.WindowsForms.CommonDialog.GetCommonDialogFilter(assocs); + } + if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + mvarAccessor = new FileAccessor(sfd.FileName, true, true); + txtAccessor.Text = "File: " + sfd.FileName; + } + break; + } + } + RefreshButtons(); + } + } + + public enum DocumentPropertiesDialogMode + { + Open, + Save + } + public class DocumentPropertiesDialog + { + private DocumentPropertiesDialogBase dlg = null; + + private DocumentPropertiesDialogMode mvarMode = DocumentPropertiesDialogMode.Open; + public DocumentPropertiesDialogMode Mode { get { return mvarMode; } set { mvarMode = value; } } + + private ObjectModel mvarObjectModel = null; + public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; } } + + private DataFormat mvarDataFormat = null; + public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; } } + + private Accessor mvarAccessor = null; + public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; } } + + public DialogResult ShowDialog() + { + if (dlg == null) dlg = new DocumentPropertiesDialogBase(); + if (dlg.IsDisposed) dlg = new DocumentPropertiesDialogBase(); + + dlg.Mode = mvarMode; + dlg.ObjectModel = mvarObjectModel; + dlg.DataFormat = mvarDataFormat; + dlg.Accessor = mvarAccessor; + dlg.ShowInTaskbar = false; + + DialogResult result = dlg.ShowDialog(); + + if (result == DialogResult.OK) + { + mvarObjectModel = dlg.ObjectModel; + mvarDataFormat = dlg.DataFormat; + mvarAccessor = dlg.Accessor; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.resx new file mode 100644 index 00000000..273d71bd --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/DocumentPropertiesDialog.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.Designer.cs new file mode 100644 index 00000000..5b7cfa1b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.Designer.cs @@ -0,0 +1,144 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class ExportOptionsDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tblGeneral = new System.Windows.Forms.TableLayoutPanel(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdAbout = new System.Windows.Forms.Button(); + this.tbs = new System.Windows.Forms.TabControl(); + this.tabGeneral = new System.Windows.Forms.TabPage(); + this.tbs.SuspendLayout(); + this.tabGeneral.SuspendLayout(); + this.SuspendLayout(); + // + // tblGeneral + // + this.tblGeneral.ColumnCount = 2; + this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tblGeneral.Dock = System.Windows.Forms.DockStyle.Fill; + this.tblGeneral.Location = new System.Drawing.Point(3, 3); + this.tblGeneral.Name = "tblGeneral"; + this.tblGeneral.RowCount = 2; + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tblGeneral.Size = new System.Drawing.Size(413, 222); + this.tblGeneral.TabIndex = 0; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(364, 272); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(283, 272); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 1; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdAbout + // + this.cmdAbout.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.cmdAbout.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAbout.Location = new System.Drawing.Point(12, 272); + this.cmdAbout.Name = "cmdAbout"; + this.cmdAbout.Size = new System.Drawing.Size(75, 23); + this.cmdAbout.TabIndex = 3; + this.cmdAbout.Text = "&About..."; + this.cmdAbout.UseVisualStyleBackColor = true; + this.cmdAbout.Click += new System.EventHandler(this.cmdAbout_Click); + // + // tbs + // + this.tbs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tbs.Controls.Add(this.tabGeneral); + this.tbs.Location = new System.Drawing.Point(12, 12); + this.tbs.Name = "tbs"; + this.tbs.SelectedIndex = 0; + this.tbs.Size = new System.Drawing.Size(427, 254); + this.tbs.TabIndex = 4; + // + // tabGeneral + // + this.tabGeneral.Controls.Add(this.tblGeneral); + this.tabGeneral.Location = new System.Drawing.Point(4, 22); + this.tabGeneral.Name = "tabGeneral"; + this.tabGeneral.Padding = new System.Windows.Forms.Padding(3); + this.tabGeneral.Size = new System.Drawing.Size(419, 228); + this.tabGeneral.TabIndex = 0; + this.tabGeneral.Text = "General"; + this.tabGeneral.UseVisualStyleBackColor = true; + // + // ExportOptionsDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(451, 307); + this.Controls.Add(this.cmdAbout); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.tbs); + this.Name = "ExportOptionsDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Export Options"; + this.tbs.ResumeLayout(false); + this.tabGeneral.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tblGeneral; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdAbout; + private System.Windows.Forms.TabControl tbs; + private System.Windows.Forms.TabPage tabGeneral; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.cs new file mode 100644 index 00000000..5dadc216 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class ExportOptionsDialog : Form + { + public ExportOptionsDialog() + { + InitializeComponent(); + } + + private Dictionary exportOptionControls = new Dictionary(); + + private DataFormat mvarDataFormat = null; + public DataFormat DataFormat + { + get { return mvarDataFormat; } + set + { + mvarDataFormat = value; + cmdAbout.Enabled = (mvarDataFormat != null); + if (mvarDataFormat == null) return; + + DataFormatReference dfr = mvarDataFormat.MakeReference(); + Type type = mvarDataFormat.GetType(); + + foreach (ExportOption eo in dfr.ExportOptions) + { + System.Reflection.PropertyInfo pi = type.GetProperty(eo.PropertyName); + + Label lbl = new Label(); + lbl.FlatStyle = FlatStyle.System; + lbl.Anchor = AnchorStyles.Left; + lbl.Text = eo.Title; + lbl.AutoSize = true; + tblGeneral.Controls.Add(lbl); + + if (eo is ExportOptionChoice) + { + ExportOptionChoice option = (eo as ExportOptionChoice); + + ComboBox cbo = new ComboBox(); + cbo.Dock = DockStyle.Fill; + if (option.RequireChoice) cbo.DropDownStyle = ComboBoxStyle.DropDownList; + foreach (ExportOptionFieldChoice choice in option.Choices) + { + cbo.Items.Add(choice); + if (pi != null) + { + object v = pi.GetValue(mvarDataFormat, null); + if (choice.Value == v) cbo.SelectedIndex = cbo.Items.Count - 1; + } + else if (choice.IsDefault) + { + cbo.SelectedIndex = cbo.Items.Count - 1; + } + } + tblGeneral.Controls.Add(cbo); + + exportOptionControls.Add(option, cbo); + } + else if (eo is ExportOptionNumber) + { + ExportOptionNumber option = (eo as ExportOptionNumber); + + NumericUpDown txt = new NumericUpDown(); + txt.Dock = DockStyle.Fill; + if (option.MaximumValue.HasValue) + { + txt.Maximum = option.MaximumValue.Value; + } + else + { + txt.Maximum = Decimal.MaxValue; + } + if (option.MinimumValue.HasValue) + { + txt.Minimum = option.MinimumValue.Value; + } + else + { + txt.Minimum = Decimal.MinValue; + } + if (pi != null) + { + txt.Value = (decimal)Convert.ChangeType(pi.GetValue(mvarDataFormat, null), typeof(Decimal)); + } + else + { + txt.Value = option.DefaultValue; + } + + tblGeneral.Controls.Add(txt); + + exportOptionControls.Add(option, txt); + } + else if (eo is ExportOptionText) + { + ExportOptionText option = (eo as ExportOptionText); + + TextBox txt = new TextBox(); + if (pi != null) + { + txt.Text = pi.GetValue(mvarDataFormat, null).ToString(); + } + else + { + txt.Text = option.DefaultValue; + } + + txt.Dock = DockStyle.Fill; + tblGeneral.Controls.Add(txt); + + exportOptionControls.Add(option, txt); + } + + } + + for (int i = 0; i < tblGeneral.RowStyles.Count; i++) + { + tblGeneral.RowStyles[i].Height = 24; + tblGeneral.RowStyles[i].SizeType = SizeType.Absolute; + } + + Label lblSpacer = new Label(); + lblSpacer.Dock = DockStyle.Fill; + tblGeneral.Controls.Add(lblSpacer); + tblGeneral.SetColumnSpan(lblSpacer, 2); + + Font = SystemFonts.MenuFont; + } + } + + private void cmdAbout_Click(object sender, EventArgs e) + { + DataFormatAboutDialog dlg = new DataFormatAboutDialog(); + dlg.DataFormatReference = mvarDataFormat.MakeReference(); + dlg.ShowDialog(); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + DataFormatReference dfr = mvarDataFormat.MakeReference(); + Type type = mvarDataFormat.GetType(); + + foreach (ExportOption eo in dfr.ExportOptions) + { + System.Reflection.PropertyInfo pi = type.GetProperty(eo.PropertyName); + if (pi == null) continue; + + Control ctl = exportOptionControls[eo]; + if (ctl is NumericUpDown) + { + NumericUpDown txt = (ctl as NumericUpDown); + pi.SetValue(mvarDataFormat, Convert.ChangeType(txt.Value, pi.PropertyType), null); + } + else if (ctl is ComboBox) + { + ExportOptionFieldChoice choice = ((ctl as ComboBox).SelectedItem as ExportOptionFieldChoice); + if (choice != null) + { + pi.SetValue(mvarDataFormat, Convert.ChangeType(choice.Value, pi.PropertyType), null); + } + } + else if (ctl is TextBox) + { + TextBox txt = (ctl as TextBox); + pi.SetValue(mvarDataFormat, Convert.ChangeType(txt.Text, pi.PropertyType), null); + } + } + + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/ExportOptionsDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.Designer.cs new file mode 100644 index 00000000..a365132d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.Designer.cs @@ -0,0 +1,117 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class GenericBrowserPopup + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtSearch = new System.Windows.Forms.TextBox(); + this.lv = new System.Windows.Forms.ListView(); + this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chFilters = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdClear = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtSearch.Location = new System.Drawing.Point(6, 7); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(277, 13); + this.txtSearch.TabIndex = 0; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + this.txtSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown); + // + // lv + // + this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lv.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTitle, + this.chFilters}); + this.lv.FullRowSelect = true; + this.lv.GridLines = true; + this.lv.HideSelection = false; + this.lv.Location = new System.Drawing.Point(0, 26); + this.lv.MultiSelect = false; + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(364, 183); + this.lv.TabIndex = 1; + this.lv.UseCompatibleStateImageBehavior = false; + this.lv.View = System.Windows.Forms.View.Details; + this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate); + this.lv.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown); + // + // chTitle + // + this.chTitle.Text = "Title"; + // + // chFilters + // + this.chFilters.Text = "Filters"; + // + // cmdClear + // + this.cmdClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClear.Location = new System.Drawing.Point(289, 2); + this.cmdClear.Name = "cmdClear"; + this.cmdClear.Size = new System.Drawing.Size(75, 23); + this.cmdClear.TabIndex = 5; + this.cmdClear.Text = "&Clear"; + this.cmdClear.UseVisualStyleBackColor = false; + this.cmdClear.Click += new System.EventHandler(this.cmdClear_Click); + // + // DataFormatBrowserPopup + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.ClientSize = new System.Drawing.Size(364, 213); + this.ControlBox = false; + this.Controls.Add(this.cmdClear); + this.Controls.Add(this.lv); + this.Controls.Add(this.txtSearch); + this.Name = "DataFormatBrowserPopup"; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtSearch; + private System.Windows.Forms.ListView lv; + private System.Windows.Forms.ColumnHeader chTitle; + private System.Windows.Forms.ColumnHeader chFilters; + private System.Windows.Forms.Button cmdClear; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.cs new file mode 100644 index 00000000..5ea66e57 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class GenericBrowserPopup : Form + where TObj : class, References + where TRef : class, ReferencedBy + { + public event EventHandler SelectionChanged; + + public GenericBrowserPopup() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private bool mvarAutoClose = true; + public bool AutoClose { get { return mvarAutoClose; } set { mvarAutoClose = value; } } + + protected override void OnDeactivate(EventArgs e) + { + base.OnDeactivate(e); + if (mvarAutoClose) this.Close(); + } + + private System.Collections.ObjectModel.Collection mvarAvailableObjects = new System.Collections.ObjectModel.Collection(); + public System.Collections.ObjectModel.Collection AvailableObjects { get { return mvarAvailableObjects; } } + + private TObj mvarSelectedObject = default(TObj); + public TObj SelectedObject { get { return mvarSelectedObject; } set { mvarSelectedObject = value; } } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + UpdateSearch(); + } + + private void UpdateSearch() + { + lv.Items.Clear(); + foreach (TRef item in mvarAvailableObjects) + { + bool itemShouldFilter = false; + string[] details = item.GetDetails(); + foreach (string detail in details) + { + if (detail == null) continue; + if (detail.ToLower().Trim().Contains(txtSearch.Text.ToLower().Trim())) + { + itemShouldFilter = true; + break; + } + } + if (String.IsNullOrEmpty(txtSearch.Text.Trim()) || itemShouldFilter) + { + AddObjectToList(item); + } + } + + if (lv.Items.Count == 1) + { + lv.Items[0].Selected = true; + } + lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + + private void AddObjectToList(TRef itmr) + { + ListViewItem lvi = new ListViewItem(); + string[] details = itmr.GetDetails(); + lvi.Text = details[0]; + for (int i = 1; i < details.Length; i++) + { + lvi.SubItems.Add(details[i]); + } + lvi.Tag = itmr; + lv.Items.Add(lvi); + } + + private void txtSearch_TextChanged(object sender, EventArgs e) + { + UpdateSearch(); + } + + private void lv_ItemActivate(object sender, EventArgs e) + { + if (lv.SelectedItems.Count != 1) return; + + mvarSelectedObject = (lv.SelectedItems[0].Tag as TRef).Create(); + if (SelectionChanged != null) SelectionChanged(this, e); + + Close(); + } + + private void txtSearch_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + if (lv.SelectedItems.Count != 1) return; + + mvarSelectedObject = (lv.SelectedItems[0].Tag as TRef).Create(); + if (SelectionChanged != null) SelectionChanged(this, e); + + Close(); + } + else if (e.KeyCode == Keys.Escape) + { + Close(); + } + } + + private void cmdClear_Click(object sender, EventArgs e) + { + mvarSelectedObject = null; + if (SelectionChanged != null) SelectionChanged(this, e); + Close(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/GenericBrowserPopup.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.Designer.cs new file mode 100644 index 00000000..f7a0976a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.Designer.cs @@ -0,0 +1,354 @@ +using System.Drawing; +using UniversalEditor.UserInterface.WindowsForms.Controls; +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class NewDialogBase + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.sc = new System.Windows.Forms.SplitContainer(); + this.fraDocumentType = new System.Windows.Forms.GroupBox(); + this.dts = new DocumentTypeSelector(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.lvFileTemplates = new AwesomeControls.ListView.ListViewControl(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.pnlNewFile = new System.Windows.Forms.Panel(); + this.pnlNewProject = new System.Windows.Forms.Panel(); + this.scNewProject = new System.Windows.Forms.SplitContainer(); + this.tvProject = new System.Windows.Forms.TreeView(); + this.lvProjectTemplates = new AwesomeControls.ListView.ListViewControl(); + this.optSeparate = new System.Windows.Forms.RadioButton(); + this.optCombine = new System.Windows.Forms.RadioButton(); + this.label1 = new System.Windows.Forms.Label(); + this.txtProjectTitle = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtSolutionTitle = new System.Windows.Forms.TextBox(); + this.sc.Panel1.SuspendLayout(); + this.sc.Panel2.SuspendLayout(); + this.sc.SuspendLayout(); + this.fraDocumentType.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.pnlNewFile.SuspendLayout(); + this.pnlNewProject.SuspendLayout(); + this.scNewProject.Panel1.SuspendLayout(); + this.scNewProject.Panel2.SuspendLayout(); + this.scNewProject.SuspendLayout(); + this.SuspendLayout(); + // + // sc + // + this.sc.Dock = System.Windows.Forms.DockStyle.Fill; + this.sc.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.sc.Location = new System.Drawing.Point(0, 0); + this.sc.Name = "sc"; + // + // sc.Panel1 + // + this.sc.Panel1.Controls.Add(this.fraDocumentType); + // + // sc.Panel2 + // + this.sc.Panel2.Controls.Add(this.groupBox1); + this.sc.Size = new System.Drawing.Size(482, 160); + this.sc.SplitterDistance = 188; + this.sc.TabIndex = 0; + // + // fraDocumentType + // + this.fraDocumentType.Controls.Add(this.dts); + this.fraDocumentType.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraDocumentType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraDocumentType.Location = new System.Drawing.Point(0, 0); + this.fraDocumentType.Name = "fraDocumentType"; + this.fraDocumentType.Size = new System.Drawing.Size(188, 160); + this.fraDocumentType.TabIndex = 0; + this.fraDocumentType.TabStop = false; + this.fraDocumentType.Text = "Document type"; + // + // dts + // + this.dts.Dock = System.Windows.Forms.DockStyle.Fill; + this.dts.Location = new System.Drawing.Point(3, 16); + this.dts.Name = "dts"; + this.dts.ObjectType = DocumentTypeSelectorObjectTypes.ObjectModel; + this.dts.Padding = new System.Windows.Forms.Padding(6); + this.dts.Size = new System.Drawing.Size(182, 141); + this.dts.TabIndex = 0; + this.dts.SelectionChanged += new System.EventHandler(this.dts_SelectionChanged); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.lvFileTemplates); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(0, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(290, 160); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Available templates"; + // + // lvFileTemplates + // + this.lvFileTemplates.AllowSorting = true; + this.lvFileTemplates.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvFileTemplates.BackColor = System.Drawing.SystemColors.Window; + this.lvFileTemplates.DefaultItemHeight = 24; + this.lvFileTemplates.ForeColor = System.Drawing.SystemColors.WindowText; + this.lvFileTemplates.FullRowSelect = true; + this.lvFileTemplates.HideSelection = false; + this.lvFileTemplates.LargeImageList = null; + this.lvFileTemplates.Location = new System.Drawing.Point(6, 19); + this.lvFileTemplates.Mode = AwesomeControls.ListView.ListViewMode.LargeIcons; + this.lvFileTemplates.Name = "lvFileTemplates"; + this.lvFileTemplates.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lvFileTemplates.Size = new System.Drawing.Size(278, 135); + this.lvFileTemplates.SmallImageList = null; + this.lvFileTemplates.SortColumn = null; + this.lvFileTemplates.TabIndex = 0; + this.lvFileTemplates.ItemActivate += new System.EventHandler(this.lvTemplates_ItemActivate); + this.lvFileTemplates.SelectionChanged += new System.EventHandler(this.lvFileTemplates_SelectionChanged); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(419, 278); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 3; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(338, 278); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // pnlNewFile + // + this.pnlNewFile.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlNewFile.Controls.Add(this.sc); + this.pnlNewFile.Location = new System.Drawing.Point(12, 12); + this.pnlNewFile.Name = "pnlNewFile"; + this.pnlNewFile.Size = new System.Drawing.Size(482, 160); + this.pnlNewFile.TabIndex = 3; + // + // pnlNewProject + // + this.pnlNewProject.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlNewProject.Controls.Add(this.scNewProject); + this.pnlNewProject.Location = new System.Drawing.Point(12, 12); + this.pnlNewProject.Name = "pnlNewProject"; + this.pnlNewProject.Size = new System.Drawing.Size(482, 160); + this.pnlNewProject.TabIndex = 4; + // + // scNewProject + // + this.scNewProject.Dock = System.Windows.Forms.DockStyle.Fill; + this.scNewProject.Location = new System.Drawing.Point(0, 0); + this.scNewProject.Name = "scNewProject"; + // + // scNewProject.Panel1 + // + this.scNewProject.Panel1.Controls.Add(this.tvProject); + // + // scNewProject.Panel2 + // + this.scNewProject.Panel2.Controls.Add(this.lvProjectTemplates); + this.scNewProject.Size = new System.Drawing.Size(482, 160); + this.scNewProject.SplitterDistance = 160; + this.scNewProject.TabIndex = 0; + // + // tvProject + // + this.tvProject.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvProject.HideSelection = false; + this.tvProject.Location = new System.Drawing.Point(0, 0); + this.tvProject.Name = "tvProject"; + this.tvProject.Size = new System.Drawing.Size(160, 160); + this.tvProject.TabIndex = 0; + this.tvProject.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvProject_AfterSelect); + // + // lvProjectTemplates + // + this.lvProjectTemplates.AllowSorting = true; + this.lvProjectTemplates.BackColor = System.Drawing.SystemColors.Window; + this.lvProjectTemplates.DefaultItemHeight = 24; + this.lvProjectTemplates.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvProjectTemplates.ForeColor = System.Drawing.SystemColors.WindowText; + this.lvProjectTemplates.LargeImageList = null; + this.lvProjectTemplates.Location = new System.Drawing.Point(0, 0); + this.lvProjectTemplates.Mode = AwesomeControls.ListView.ListViewMode.Tiles; + this.lvProjectTemplates.Name = "lvProjectTemplates"; + this.lvProjectTemplates.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lvProjectTemplates.Size = new System.Drawing.Size(318, 160); + this.lvProjectTemplates.SmallImageList = null; + this.lvProjectTemplates.SortColumn = null; + this.lvProjectTemplates.TabIndex = 0; + this.lvProjectTemplates.ItemActivate += new System.EventHandler(this.lvTemplates_ItemActivate); + this.lvProjectTemplates.SelectionChanged += new System.EventHandler(this.lvProjectTemplates_SelectionChanged); + // + // optSeparate + // + this.optSeparate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optSeparate.Checked = true; + this.optSeparate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optSeparate.Location = new System.Drawing.Point(12, 178); + this.optSeparate.Name = "optSeparate"; + this.optSeparate.Size = new System.Drawing.Size(482, 18); + this.optSeparate.TabIndex = 0; + this.optSeparate.TabStop = true; + this.optSeparate.Text = "&Create a new solution for this project"; + // + // optCombine + // + this.optCombine.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optCombine.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optCombine.Location = new System.Drawing.Point(12, 202); + this.optCombine.Name = "optCombine"; + this.optCombine.Size = new System.Drawing.Size(482, 18); + this.optCombine.TabIndex = 1; + this.optCombine.Text = "&Add this project to an existing solution"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(42, 229); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 13); + this.label1.TabIndex = 5; + this.label1.Text = "&Project title:"; + // + // txtProjectTitle + // + this.txtProjectTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtProjectTitle.Location = new System.Drawing.Point(115, 226); + this.txtProjectTitle.Name = "txtProjectTitle"; + this.txtProjectTitle.Size = new System.Drawing.Size(379, 20); + this.txtProjectTitle.TabIndex = 6; + this.txtProjectTitle.TextChanged += new System.EventHandler(this.txtProjectTitle_TextChanged); + this.txtProjectTitle.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtProjectTitle_KeyPress); + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(42, 255); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(67, 13); + this.label2.TabIndex = 5; + this.label2.Text = "&Solution title:"; + // + // txtSolutionTitle + // + this.txtSolutionTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSolutionTitle.Location = new System.Drawing.Point(115, 252); + this.txtSolutionTitle.Name = "txtSolutionTitle"; + this.txtSolutionTitle.Size = new System.Drawing.Size(379, 20); + this.txtSolutionTitle.TabIndex = 6; + this.txtSolutionTitle.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtSolutionTitle_KeyPress); + // + // NewDialogBase + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(506, 313); + this.Controls.Add(this.txtSolutionTitle); + this.Controls.Add(this.label2); + this.Controls.Add(this.txtProjectTitle); + this.Controls.Add(this.label1); + this.Controls.Add(this.optCombine); + this.Controls.Add(this.optSeparate); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.pnlNewFile); + this.Controls.Add(this.pnlNewProject); + this.MinimumSize = new System.Drawing.Size(522, 352); + this.Name = "NewDialogBase"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Create New"; + this.UseThemeBackground = false; + this.sc.Panel1.ResumeLayout(false); + this.sc.Panel2.ResumeLayout(false); + this.sc.ResumeLayout(false); + this.fraDocumentType.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.pnlNewFile.ResumeLayout(false); + this.pnlNewProject.ResumeLayout(false); + this.scNewProject.Panel1.ResumeLayout(false); + this.scNewProject.Panel2.ResumeLayout(false); + this.scNewProject.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.SplitContainer sc; + private DocumentTypeSelector dts; + private System.Windows.Forms.GroupBox fraDocumentType; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private AwesomeControls.ListView.ListViewControl lvFileTemplates; + private System.Windows.Forms.Panel pnlNewFile; + private System.Windows.Forms.Panel pnlNewProject; + private System.Windows.Forms.SplitContainer scNewProject; + private System.Windows.Forms.TreeView tvProject; + private AwesomeControls.ListView.ListViewControl lvProjectTemplates; + internal System.Windows.Forms.RadioButton optSeparate; + internal System.Windows.Forms.RadioButton optCombine; + private System.Windows.Forms.Label label1; + internal System.Windows.Forms.TextBox txtProjectTitle; + private System.Windows.Forms.Label label2; + internal System.Windows.Forms.TextBox txtSolutionTitle; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.cs new file mode 100644 index 00000000..eee3f6c9 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.cs @@ -0,0 +1,406 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + internal partial class NewDialogBase : AwesomeControls.Dialog + { + public NewDialogBase() + { + InitializeComponent(); + Mode = NewDialogMode.File; + + lvFileTemplates.Columns.Add("Title", 300); + lvFileTemplates.Columns.Add("Description"); + + Font = SystemFonts.MenuFont; + + RefreshProjectTemplates(); + tvProject.Sort(); + + // UseThemeBackground = true; + } + + private NewDialogMode mvarMode = NewDialogMode.File; + public NewDialogMode Mode + { + get { return mvarMode; } + set + { + mvarMode = value; + + switch (mvarMode) + { + case NewDialogMode.File: + { + pnlNewFile.Enabled = true; + pnlNewFile.Visible = true; + + pnlNewProject.Visible = false; + pnlNewProject.Enabled = false; + break; + } + case NewDialogMode.Project: + { + pnlNewProject.Enabled = true; + pnlNewProject.Visible = true; + + pnlNewFile.Visible = false; + pnlNewFile.Enabled = false; + + RefreshProjectTemplates(); + break; + } + } + } + } + + private void cmdOK_Click(object sender, EventArgs e) + { + switch (mvarMode) + { + case NewDialogMode.File: + { + if (lvFileTemplates.Items.Count == 1 && lvFileTemplates.SelectedItems.Count == 0) + { + lvFileTemplates.Items[0].Selected = true; + } + + if (lvFileTemplates.SelectedItems.Count == 0) + { + MessageBox.Show("Please select a template to use as a base for the new document. If you do not wish to use a template, select \"Blank Document\".", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + mvarSelectedItem = (lvFileTemplates.SelectedItems[0].Data as Template); + break; + } + case NewDialogMode.Project: + { + if (lvProjectTemplates.Items.Count == 1 && lvProjectTemplates.SelectedItems.Count == 0) + { + lvProjectTemplates.Items[0].Selected = true; + } + + if (lvProjectTemplates.SelectedItems.Count == 0) + { + MessageBox.Show("Please select a template to use as a base for the new project. If you do not wish to use a template, select \"Blank Project\".", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + ProjectTemplate template = (lvProjectTemplates.SelectedItems[0].Data as ProjectTemplate); + if (template.ProjectType != null) + { + if (template.ProjectType.Variables.Count > 0) + { + CustomOption.CustomOptionCollection coll = new CustomOption.CustomOptionCollection(); + foreach (ProjectTypeVariable ptv in template.ProjectType.Variables) + { + switch (ptv.Type) + { + case ProjectTypeVariableType.Choice: + { + List choices = new List(); + foreach (KeyValuePair kvp in ptv.ValidValues) + { + choices.Add(new CustomOptionFieldChoice(kvp.Key, kvp.Value, kvp.Value == ptv.DefaultValue)); + } + + CustomOptionChoice co = new CustomOptionChoice(ptv.Name, ptv.Title, true, choices.ToArray()); + coll.Add(co); + break; + } + case ProjectTypeVariableType.FileOpen: + { + CustomOptionFile co = new CustomOptionFile(ptv.Name, ptv.Title); + co.DialogMode = CustomOptionFileDialogMode.Open; + coll.Add(co); + break; + } + case ProjectTypeVariableType.FileSave: + { + CustomOptionFile co = new CustomOptionFile(ptv.Name, ptv.Title); + co.DialogMode = CustomOptionFileDialogMode.Save; + coll.Add(co); + break; + } + } + } + + if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref coll, template.ProjectType.Title + " properties")) + { + return; + } + + foreach (CustomOption co in coll) + { + // template.ProjectType.Variables[co.PropertyName].Value = co.GetValue().ToString(); + // TODO: Figure out how to assign variable values to the newly + // created project from the template + } + } + } + else + { +#if DEBUG + if (MessageBox.Show("The specified template does not have a ProjectType set! This may cause problems with certain features that expect a ProjectType.\r\n\r\nIt is recommended that you specify a ProjectType for all project templates.\r\n\r\nYou are using the Debug build of Universal Editor. This message will not be shown in the Release build. Please fix this issue before release to ensure there are no unexpected problems in the future.", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Cancel) + { + return; + } +#endif + } + mvarSelectedItem = template; + break; + } + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private Template mvarSelectedItem = null; + public Template SelectedItem { get { return mvarSelectedItem; } } + + private void dts_SelectionChanged(object sender, EventArgs e) + { + lvFileTemplates.Items.Clear(); + + if (dts.SelectedObject == null) + { + cmdOK.Enabled = false; + return; + } + + ObjectModelReference omr = (dts.SelectedObject as ObjectModelReference); + + AwesomeControls.ListView.ListViewItem lviBlank = new AwesomeControls.ListView.ListViewItem(); + lviBlank.Text = "Blank Document"; + lviBlank.Details.Add("Creates a blank " + omr.Title + " document."); + + DocumentTemplate dtBlank = new DocumentTemplate(); + dtBlank.Title = "Blank Document"; + dtBlank.ObjectModelReference = omr; + dtBlank.Description = "Creates a blank " + omr.Title + " document."; + lviBlank.Data = dtBlank; + + lvFileTemplates.Items.Add(lviBlank); + + #region Load document templates + { + DocumentTemplate[] templates = UniversalEditor.Common.Reflection.GetAvailableDocumentTemplates(omr); + foreach (DocumentTemplate dt in templates) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + if (System.IO.File.Exists(dt.LargeIconImageFileName)) + { + lvi.Image = Image.FromFile(dt.LargeIconImageFileName); + } + lvi.Text = dt.Title; + lvi.Details.Add(dt.Description); + lvi.Data = dt; + lvFileTemplates.Items.Add(lvi); + } + } + #endregion + + if (lvFileTemplates.Items.Count > 0) + { + lvFileTemplates.Items[0].Selected = true; + } + + cmdOK.Enabled = lvFileTemplates.SelectedItems.Count == 1; + } + + private void lvFileTemplates_SelectionChanged(object sender, EventArgs e) + { + if (lvFileTemplates.SelectedItems.Count == 0) + { + cmdOK.Enabled = false; + return; + } + mvarSelectedItem = (lvFileTemplates.SelectedItems[0].Data as Template); + cmdOK.Enabled = true; + } + + private void tvProject_AfterSelect(object sender, TreeViewEventArgs e) + { + RefreshProjectTemplates(); + } + + private void RefreshProjectTemplates() + { + lvProjectTemplates.Items.Clear(); + + ProjectTemplate[] templates = UniversalEditor.Common.Reflection.GetAvailableProjectTemplates(); + foreach (ProjectTemplate dt in templates) + { + if (dt.Path != null) + { + TreeNode tn = null; + for (int i = 0; i < dt.Path.Length; i++) + { + if (tn == null) + { + if (tvProject.Nodes.ContainsKey(dt.Path[i])) + { + tn = tvProject.Nodes[dt.Path[i]]; + } + else + { + tn = tvProject.Nodes.Add(dt.Path[i], dt.Path[i]); + } + } + else + { + if (tn.Nodes.ContainsKey(dt.Path[i])) + { + tn = tn.Nodes[dt.Path[i]]; + } + else + { + tn = tn.Nodes.Add(dt.Path[i], dt.Path[i]); + } + } + } + + if (tn == tvProject.SelectedNode) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + if (!String.IsNullOrEmpty(dt.LargeIconImageFileName)) + { + lvi.Image = Image.FromFile(dt.LargeIconImageFileName); + } + else + { + Console.Error.WriteLine("Large icon image not specified for template \"" + dt.Title + "\""); + } + lvi.Text = dt.Title; + lvi.Details.Add(dt.Description); + lvi.Data = dt; + lvProjectTemplates.Items.Add(lvi); + } + } + else + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + if (!String.IsNullOrEmpty(dt.LargeIconImageFileName)) + { + lvi.Image = Image.FromFile(dt.LargeIconImageFileName); + } + else + { + Console.Error.WriteLine("Large icon image not specified for template \"" + dt.Title + "\""); + } + lvi.Text = dt.Title; + lvi.Details.Add(dt.Description); + lvi.Data = dt; + lvProjectTemplates.Items.Add(lvi); + } + } + + if (lvProjectTemplates.Items.Count > 0) + { + lvProjectTemplates.SelectedItems.Clear(); + lvProjectTemplates.Items[0].Selected = true; + + lvProjectTemplates_SelectionChanged(null, EventArgs.Empty); + cmdOK.Enabled = true; + } + else + { + cmdOK.Enabled = false; + } + } + + + private void lvProjectTemplates_SelectionChanged(object sender, EventArgs e) + { + if (lvProjectTemplates.SelectedItems.Count != 1) return; + ProjectTemplate pt = (lvProjectTemplates.SelectedItems[0].Data as ProjectTemplate); + if (pt == null) return; + + if (!txtProjectTitle_IsChanged) + { + string projectNamePrefix = pt.ProjectNamePrefix; + if (String.IsNullOrEmpty(projectNamePrefix)) + { + projectNamePrefix = pt.Title.Replace(" ", String.Empty); + // projectNamePrefix = "Project"; + } + txtProjectTitle.Text = projectNamePrefix + "1"; + } + } + + private bool txtProjectTitle_IsChanged = false; + private void txtProjectTitle_KeyPress(object sender, KeyPressEventArgs e) + { + txtProjectTitle_IsChanged = true; + } + + private bool txtSolutionTitle_IsChanged = false; + private void txtSolutionTitle_KeyPress(object sender, KeyPressEventArgs e) + { + txtSolutionTitle_IsChanged = true; + } + + private void txtProjectTitle_TextChanged(object sender, EventArgs e) + { + if (!txtSolutionTitle_IsChanged) txtSolutionTitle.Text = txtProjectTitle.Text; + } + + private void lvTemplates_ItemActivate(object sender, EventArgs e) + { + cmdOK_Click(sender, e); + } + } + public enum NewDialogMode + { + File, + Project + } + public class NewDialog + { + private Template mvarSelectedItem = null; + public Template SelectedItem { get { return mvarSelectedItem; } } + + private bool mvarCombineObjects = false; + public bool CombineObjects { get { return mvarCombineObjects; } set { mvarCombineObjects = value; } } + + private NewDialogMode mvarMode = NewDialogMode.File; + public NewDialogMode Mode { get { return mvarMode; } set { mvarMode = value; } } + + public DialogResult ShowDialog() + { + NewDialogBase dlg = new NewDialogBase(); + if (mvarCombineObjects) + { + dlg.optCombine.Checked = true; + } + else + { + dlg.optSeparate.Checked = true; + } + dlg.Mode = mvarMode; + dlg.txtProjectTitle.Text = mvarProjectTitle; + dlg.txtSolutionTitle.Text = mvarSolutionTitle; + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarSelectedItem = dlg.SelectedItem; + mvarCombineObjects = dlg.optCombine.Checked; + mvarProjectTitle = dlg.txtProjectTitle.Text; + mvarSolutionTitle = dlg.txtSolutionTitle.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + + private string mvarProjectTitle = String.Empty; + public string ProjectTitle { get { return mvarProjectTitle; } set { mvarProjectTitle = value; } } + private string mvarSolutionTitle = String.Empty; + public string SolutionTitle { get { return mvarSolutionTitle; } set { mvarSolutionTitle = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/NewDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.Designer.cs new file mode 100644 index 00000000..6974f7f8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.Designer.cs @@ -0,0 +1,147 @@ +using System.Drawing; +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class OptionsDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tv = new System.Windows.Forms.TreeView(); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.pnlContainer = new System.Windows.Forms.Panel(); + this.sc = new System.Windows.Forms.SplitContainer(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.sc.Panel1.SuspendLayout(); + this.sc.Panel2.SuspendLayout(); + this.sc.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.ImageIndex = 0; + this.tv.ImageList = this.imlSmallIcons; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.SelectedImageIndex = 0; + this.tv.Size = new System.Drawing.Size(150, 223); + this.tv.TabIndex = 0; + this.tv.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterCollapse); + this.tv.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterExpand); + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // imlSmallIcons + // + this.imlSmallIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlSmallIcons.ImageSize = new System.Drawing.Size(16, 16); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // pnlContainer + // + this.pnlContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlContainer.Location = new System.Drawing.Point(0, 0); + this.pnlContainer.Name = "pnlContainer"; + this.pnlContainer.Size = new System.Drawing.Size(296, 223); + this.pnlContainer.TabIndex = 1; + // + // sc + // + this.sc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.sc.Location = new System.Drawing.Point(12, 12); + this.sc.Name = "sc"; + // + // sc.Panel1 + // + this.sc.Panel1.Controls.Add(this.tv); + // + // sc.Panel2 + // + this.sc.Panel2.Controls.Add(this.pnlContainer); + this.sc.Size = new System.Drawing.Size(450, 223); + this.sc.SplitterDistance = 150; + this.sc.TabIndex = 2; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(387, 253); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 3; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(306, 253); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 3; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // OptionsDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(474, 288); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.sc); + this.Name = "OptionsDialog"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Options"; + this.sc.Panel1.ResumeLayout(false); + this.sc.Panel2.ResumeLayout(false); + this.sc.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlContainer; + private System.Windows.Forms.SplitContainer sc; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.ImageList imlSmallIcons; + + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.cs new file mode 100644 index 00000000..5ef09459 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class OptionsDialog : AwesomeControls.Dialog + { + public OptionsDialog() + { + InitializeComponent(); + + IconMethods.PopulateSystemIcons(ref imlSmallIcons); + + IOptionPanelImplementation[] panels = UniversalEditor.UserInterface.Common.Reflection.GetAvailableOptionPanels(); + foreach (IOptionPanelImplementation panel in panels) + { + if (panel is OptionPanel && panel.GetType().IsSubclassOf(typeof(OptionPanel))) + { + OptionPanel oppanel = (panel as OptionPanel); + TreeNode tnParent = null; + + #region get the parent + for (int i = 0; i < oppanel.OptionGroups.Length - 1; i++) + { + TreeNodeCollection tnc = null; + if (tnParent == null) + { + tnc = tv.Nodes; + } + else + { + tnc = tnParent.Nodes; + } + if (tnc.ContainsKey(oppanel.OptionGroups[i])) + { + tnParent = tnc[oppanel.OptionGroups[i]]; + } + else + { + tnParent = tnc.Add(oppanel.OptionGroups[i], oppanel.OptionGroups[i], "generic-folder-closed"); + } + } + #endregion + + if (tnParent == null) + { + tnParent = tv.Nodes.Add(oppanel.OptionGroups[oppanel.OptionGroups.Length - 1], oppanel.OptionGroups[oppanel.OptionGroups.Length - 1], oppanel.OptionGroups[oppanel.OptionGroups.Length - 1]); + } + else + { + tnParent = tnParent.Nodes.Add(oppanel.OptionGroups[oppanel.OptionGroups.Length - 1], oppanel.OptionGroups[oppanel.OptionGroups.Length - 1], oppanel.OptionGroups[oppanel.OptionGroups.Length - 1]); + } + + + tnParent.Tag = oppanel; + tnParent.SelectedImageKey = tnParent.ImageKey; + if (!imlSmallIcons.Images.ContainsKey(tnParent.Text) && oppanel.IconImage != null) + { + imlSmallIcons.Images.Add(tnParent.Text, oppanel.IconImage); + } + + oppanel.Dock = DockStyle.Fill; + pnlContainer.Controls.Add(oppanel); + + oppanel.LoadSettings(); + } + } + + Font = SystemFonts.MenuFont; + AutoSize = true; + } + + private void SwitchPanel(OptionPanel panel) + { + foreach (Control ctl in pnlContainer.Controls) + { + if (ctl == panel) + { + ctl.Enabled = true; + ctl.Visible = true; + ctl.BringToFront(); + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + OptionPanel panel = (e.Node.Tag as OptionPanel); + SwitchPanel(panel); + } + + private void tv_AfterCollapse(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + if (e.Node.ImageKey == "generic-folder-open") + { + e.Node.ImageKey = "generic-folder-closed"; + e.Node.SelectedImageKey = "generic-folder-closed"; + } + } + + private void tv_AfterExpand(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + if (e.Node.ImageKey == "generic-folder-closed") + { + e.Node.ImageKey = "generic-folder-open"; + e.Node.SelectedImageKey = "generic-folder-open"; + } + } + + private void cmdOK_Click(object sender, EventArgs e) + { + IOptionPanelImplementation[] panels = UniversalEditor.UserInterface.Common.Reflection.GetAvailableOptionPanels(); + foreach (IOptionPanelImplementation panel in panels) + { + panel.SaveSettings(); + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.resx new file mode 100644 index 00000000..58ac1de7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/OptionsDialog.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 7, 8 + + + 29 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.Designer.cs new file mode 100644 index 00000000..da008eec --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.Designer.cs @@ -0,0 +1,193 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class SelectPerspectiveDialogBase + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraEnvironments = new System.Windows.Forms.GroupBox(); + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdModify = new System.Windows.Forms.Button(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.lvEnvironments = new System.Windows.Forms.ListView(); + this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.fraEnvironments.SuspendLayout(); + this.SuspendLayout(); + // + // fraEnvironments + // + this.fraEnvironments.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraEnvironments.Controls.Add(this.cmdRemove); + this.fraEnvironments.Controls.Add(this.cmdModify); + this.fraEnvironments.Controls.Add(this.cmdAdd); + this.fraEnvironments.Controls.Add(this.txtSearch); + this.fraEnvironments.Controls.Add(this.lvEnvironments); + this.fraEnvironments.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEnvironments.Location = new System.Drawing.Point(12, 12); + this.fraEnvironments.Name = "fraEnvironments"; + this.fraEnvironments.Size = new System.Drawing.Size(404, 180); + this.fraEnvironments.TabIndex = 0; + this.fraEnvironments.TabStop = false; + this.fraEnvironments.Text = "Available environments"; + // + // cmdRemove + // + this.cmdRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(323, 77); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(75, 23); + this.cmdRemove.TabIndex = 4; + this.cmdRemove.Text = "&Remove"; + this.cmdRemove.UseVisualStyleBackColor = true; + // + // cmdModify + // + this.cmdModify.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdModify.Location = new System.Drawing.Point(323, 48); + this.cmdModify.Name = "cmdModify"; + this.cmdModify.Size = new System.Drawing.Size(75, 23); + this.cmdModify.TabIndex = 3; + this.cmdModify.Text = "&Modify..."; + this.cmdModify.UseVisualStyleBackColor = true; + // + // cmdAdd + // + this.cmdAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(323, 19); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(75, 23); + this.cmdAdd.TabIndex = 2; + this.cmdAdd.Text = "&Add..."; + this.cmdAdd.UseVisualStyleBackColor = true; + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.Location = new System.Drawing.Point(6, 19); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(311, 20); + this.txtSearch.TabIndex = 0; + // + // lvEnvironments + // + this.lvEnvironments.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvEnvironments.CheckBoxes = true; + this.lvEnvironments.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chName, + this.chDescription}); + this.lvEnvironments.FullRowSelect = true; + this.lvEnvironments.GridLines = true; + this.lvEnvironments.HideSelection = false; + this.lvEnvironments.Location = new System.Drawing.Point(6, 41); + this.lvEnvironments.Name = "lvEnvironments"; + this.lvEnvironments.Size = new System.Drawing.Size(311, 133); + this.lvEnvironments.TabIndex = 1; + this.lvEnvironments.UseCompatibleStateImageBehavior = false; + this.lvEnvironments.View = System.Windows.Forms.View.Details; + this.lvEnvironments.SelectedIndexChanged += new System.EventHandler(this.lvEnvironments_SelectedIndexChanged); + // + // chName + // + this.chName.Text = "Name"; + this.chName.Width = 109; + // + // chDescription + // + this.chDescription.Text = "Description"; + this.chDescription.Width = 184; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(341, 198); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.Enabled = false; + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(260, 198); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 1; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // SelectEnvironmentDialogBase + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(428, 233); + this.Controls.Add(this.fraEnvironments); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.MinimumSize = new System.Drawing.Size(444, 271); + this.Name = "SelectEnvironmentDialogBase"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Environments"; + this.fraEnvironments.ResumeLayout(false); + this.fraEnvironments.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraEnvironments; + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdModify; + private System.Windows.Forms.Button cmdAdd; + private System.Windows.Forms.TextBox txtSearch; + private System.Windows.Forms.ListView lvEnvironments; + private System.Windows.Forms.ColumnHeader chName; + private System.Windows.Forms.ColumnHeader chDescription; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.cs new file mode 100644 index 00000000..2376cee7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + internal partial class SelectPerspectiveDialogBase : Form + { + public SelectPerspectiveDialogBase() + { + InitializeComponent(); + + foreach (Perspective perspective in Engine.CurrentEngine.Perspectives) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = perspective.Title; + lvi.SubItems.Add(perspective.Description); + lvi.Tag = perspective; + lvEnvironments.Items.Add(lvi); + } + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void lvEnvironments_SelectedIndexChanged(object sender, EventArgs e) + { + cmdOK.Enabled = (lvEnvironments.CheckedItems.Count == 1); + } + } + public class SelectPerspectiveDialog + { + public DialogResult ShowDialog() + { + SelectPerspectiveDialogBase dlg = new SelectPerspectiveDialogBase(); + if (dlg.ShowDialog() == DialogResult.OK) + { + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SelectPerspectiveDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.Designer.cs new file mode 100644 index 00000000..159e0089 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.Designer.cs @@ -0,0 +1,164 @@ +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class SessionDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.cmdSave = new System.Windows.Forms.Button(); + this.cmdLoad = new System.Windows.Forms.Button(); + this.lv = new AwesomeControls.ListView.ListViewControl(); + this.cmdClose = new System.Windows.Forms.Button(); + this.txtSessionName = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(382, 23); + this.label1.TabIndex = 0; + this.label1.Text = "Select a session to open, or create a new session."; + // + // cmdSave + // + this.cmdSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdSave.Enabled = false; + this.cmdSave.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdSave.Location = new System.Drawing.Point(238, 192); + this.cmdSave.Name = "cmdSave"; + this.cmdSave.Size = new System.Drawing.Size(75, 23); + this.cmdSave.TabIndex = 5; + this.cmdSave.Text = "&Save"; + this.cmdSave.UseVisualStyleBackColor = true; + this.cmdSave.Click += new System.EventHandler(this.cmdSave_Click); + // + // cmdLoad + // + this.cmdLoad.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdLoad.Enabled = false; + this.cmdLoad.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdLoad.Location = new System.Drawing.Point(157, 192); + this.cmdLoad.Name = "cmdLoad"; + this.cmdLoad.Size = new System.Drawing.Size(75, 23); + this.cmdLoad.TabIndex = 4; + this.cmdLoad.Text = "&Load"; + this.cmdLoad.UseVisualStyleBackColor = true; + this.cmdLoad.Click += new System.EventHandler(this.cmdLoad_Click); + // + // lv + // + this.lv.AllowSorting = true; + this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lv.BackColor = System.Drawing.SystemColors.Window; + this.lv.DefaultItemHeight = 24; + this.lv.ForeColor = System.Drawing.SystemColors.WindowText; + this.lv.FullRowSelect = true; + this.lv.HideSelection = false; + this.lv.LargeImageList = null; + this.lv.Location = new System.Drawing.Point(12, 44); + this.lv.Mode = AwesomeControls.ListView.ListViewMode.List; + this.lv.Name = "lv"; + this.lv.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lv.Size = new System.Drawing.Size(382, 106); + this.lv.SmallImageList = null; + this.lv.SortColumn = null; + this.lv.TabIndex = 1; + this.lv.SelectionChanged += new System.EventHandler(this.lv_SelectionChanged); + // + // cmdClose + // + this.cmdClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdClose.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClose.Location = new System.Drawing.Point(319, 192); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(75, 23); + this.cmdClose.TabIndex = 6; + this.cmdClose.Text = "Close"; + this.cmdClose.UseVisualStyleBackColor = true; + this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); + // + // txtSessionName + // + this.txtSessionName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSessionName.Location = new System.Drawing.Point(95, 156); + this.txtSessionName.Name = "txtSessionName"; + this.txtSessionName.Size = new System.Drawing.Size(299, 20); + this.txtSessionName.TabIndex = 3; + this.txtSessionName.TextChanged += new System.EventHandler(this.txtSessionName_TextChanged); + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Location = new System.Drawing.Point(12, 159); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(77, 17); + this.label2.TabIndex = 2; + this.label2.Text = "Session name:"; + // + // SessionDialog + // + this.AcceptButton = this.cmdLoad; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdClose; + this.ClientSize = new System.Drawing.Size(406, 227); + this.Controls.Add(this.txtSessionName); + this.Controls.Add(this.lv); + this.Controls.Add(this.cmdLoad); + this.Controls.Add(this.cmdClose); + this.Controls.Add(this.cmdSave); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Name = "SessionDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Session Manager"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button cmdSave; + private System.Windows.Forms.Button cmdLoad; + private AwesomeControls.ListView.ListViewControl lv; + private System.Windows.Forms.Button cmdClose; + private System.Windows.Forms.TextBox txtSessionName; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.cs new file mode 100644 index 00000000..d81c5d5f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class SessionDialog : AwesomeControls.Dialog + { + public SessionDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + + foreach (SessionManager.Session session in Engine.CurrentEngine.SessionManager.Sessions) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = session.Title; + lvi.Data = session; + lv.Items.Add(lvi); + } + } + + private void cmdClose_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + private void lv_SelectionChanged(object sender, EventArgs e) + { + cmdLoad.Enabled = (lv.SelectedItems.Count == 1); + if (lv.SelectedItems.Count < 1) return; + txtSessionName.Text = lv.SelectedItems[0].Text; + cmdSave.Enabled = !String.IsNullOrEmpty(txtSessionName.Text); + } + + private void cmdLoad_Click(object sender, EventArgs e) + { + if (lv.SelectedItems.Count < 1) return; + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + + WindowsFormsEngine.SessionLoading = true; + Engine.CurrentEngine.CloseAllWindows(); + + SessionManager.Session session = (lv.SelectedItems[0].Data as SessionManager.Session); + + Dictionary filenames = new Dictionary(); + foreach (SessionManager.Window window in session.Windows) + { + MainWindow wnd = new MainWindow(); + wnd.StartPosition = FormStartPosition.Manual; + wnd.Left = window.Left; + wnd.Top = window.Top; + wnd.Width = window.Width; + wnd.Height = window.Height; + filenames.Add(wnd, window.Documents.ToArray()); + + wnd.Show(); + Engine.CurrentEngine.Windows.Add(wnd); + } + + foreach (KeyValuePair fkvp in filenames) + { + fkvp.Key.OpenFile(fkvp.Value); + } + + WindowsFormsEngine.SessionLoading = false; + } + + private void cmdSave_Click(object sender, EventArgs e) + { + SessionManager.Session session = new SessionManager.Session(); + session.Title = txtSessionName.Text; + + foreach (MainWindow wnd in Engine.CurrentEngine.Windows) + { + SessionManager.Window window = new SessionManager.Window(); + window.Left = wnd.Left; + window.Top = wnd.Top; + window.Width = wnd.Width; + window.Height = wnd.Height; + switch (wnd.WindowState) + { + case FormWindowState.Maximized: + { + window.WindowState = UserInterface.WindowState.Maximized; + break; + } + case FormWindowState.Minimized: + { + window.WindowState = UserInterface.WindowState.Minimized; + break; + } + case FormWindowState.Normal: + { + window.WindowState = UserInterface.WindowState.Normal; + break; + } + } + + System.Collections.ObjectModel.ReadOnlyCollection documents = wnd.Documents; + foreach (Document doc in documents) + { + window.Documents.Add(doc); + } + session.Windows.Add(window); + } + + Engine.CurrentEngine.SessionManager.Sessions.Add(session); + + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + + if (MessageBox.Show("Would you like to close all active windows and start a new session at this time?", "Close Session", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) + { + WindowsFormsEngine.SessionLoading = true; + Engine.CurrentEngine.CloseAllWindows(); + Engine.CurrentEngine.OpenWindow(); + WindowsFormsEngine.SessionLoading = false; + } + } + + private void txtSessionName_TextChanged(object sender, EventArgs e) + { + cmdSave.Enabled = !String.IsNullOrEmpty(txtSessionName.Text); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/SessionDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.Designer.cs new file mode 100644 index 00000000..89033a7a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.Designer.cs @@ -0,0 +1,121 @@ +using System.Drawing; +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + partial class UnsavedDocumentsDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lv = new AwesomeControls.ListView.ListViewControl(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdDiscardAll = new System.Windows.Forms.Button(); + this.cmdContinue = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lv + // + this.lv.AllowSorting = true; + this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lv.BackColor = System.Drawing.SystemColors.Window; + this.lv.DefaultItemHeight = 24; + this.lv.ForeColor = System.Drawing.SystemColors.WindowText; + this.lv.FullRowSelect = true; + this.lv.LargeImageList = null; + this.lv.Location = new System.Drawing.Point(12, 45); + this.lv.Mode = AwesomeControls.ListView.ListViewMode.Details; + this.lv.Name = "lv"; + this.lv.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lv.Size = new System.Drawing.Size(387, 130); + this.lv.SmallImageList = null; + this.lv.SortColumn = null; + this.lv.TabIndex = 1; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(324, 194); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 4; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdDiscardAll + // + this.cmdDiscardAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdDiscardAll.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdDiscardAll.Location = new System.Drawing.Point(243, 194); + this.cmdDiscardAll.Name = "cmdDiscardAll"; + this.cmdDiscardAll.Size = new System.Drawing.Size(75, 23); + this.cmdDiscardAll.TabIndex = 3; + this.cmdDiscardAll.Text = "Discard All"; + this.cmdDiscardAll.UseVisualStyleBackColor = true; + this.cmdDiscardAll.Click += new System.EventHandler(this.cmdDiscard_Click); + // + // cmdContinue + // + this.cmdContinue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdContinue.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdContinue.Location = new System.Drawing.Point(162, 194); + this.cmdContinue.Name = "cmdContinue"; + this.cmdContinue.Size = new System.Drawing.Size(75, 23); + this.cmdContinue.TabIndex = 2; + this.cmdContinue.Text = "Continue"; + this.cmdContinue.UseVisualStyleBackColor = true; + this.cmdContinue.Click += new System.EventHandler(this.cmdContinue_Click); + // + // UnsavedDocumentsDialog + // + this.AcceptButton = this.cmdContinue; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(411, 229); + this.Controls.Add(this.cmdContinue); + this.Controls.Add(this.cmdDiscardAll); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.lv); + this.Name = "UnsavedDocumentsDialog"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Unsaved Documents"; + this.ResumeLayout(false); + + } + + #endregion + + internal AwesomeControls.ListView.ListViewControl lv; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdDiscardAll; + private System.Windows.Forms.Button cmdContinue; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.cs new file mode 100644 index 00000000..5292ba59 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Dialogs +{ + public partial class UnsavedDocumentsDialog : AwesomeControls.Dialog + { + public UnsavedDocumentsDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + + lv.Columns.Add("File name"); + lv.Columns.Add("Action", 100); + } + + private void cmdDiscard_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you wish to discard all changes made to unsaved documents?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes) + { + this.DialogResult = System.Windows.Forms.DialogResult.No; + this.Close(); + } + } + + private void cmdContinue_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Yes; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + + private string mvarPrompt = "The following documents have been changed and not saved. Select the document(s) you wish to save changes for before exiting."; + public string Prompt { get { return mvarPrompt; } set { mvarPrompt = value; } } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + TextRenderer.DrawText(e.Graphics, mvarPrompt, Font, new Rectangle(13, 13, ClientSize.Width - 24, 32), AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowForeground, TextFormatFlags.Default | TextFormatFlags.WordBreak | TextFormatFlags.EndEllipsis); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Dialogs/UnsavedDocumentsDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/IconMethods.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/IconMethods.cs new file mode 100644 index 00000000..1704a5e9 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/IconMethods.cs @@ -0,0 +1,268 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.IO; + +internal static class IconMethods +{ + public enum IconSize + { + Large, + Small + } + private static class Internal + { + #region Old ExtractAssociatedIcon + public static HandleRef NullHandleRef = default(HandleRef); + [DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon", CharSet = CharSet.Auto)] + public static extern IntPtr IntExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index); + public static IntPtr ExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index) + { + return IntExtractAssociatedIcon(hInst, iconPath, ref index); + } + #endregion + #region New ExtractIconEx + [DllImport("shell32.dll", EntryPoint = "ExtractIconEx")] + public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons); + + #endregion + } + + #region Old ExtractAssociatedIcon + private static Icon __ExtractAssociatedIcon(string filePath, int index) + { + Uri uri = null; + if ((filePath == null)) + { + throw new ArgumentException("Argument cannot be null.", "filePath"); + } + try + { + uri = new Uri(filePath); + } + catch (UriFormatException) + { + filePath = Path.GetFullPath(filePath); + uri = new Uri(filePath); + } + //If uri.IsUnc Then + // Throw New ArgumentException("File path cannot be a UNC path.", "filePath") + //End If + if (uri.IsFile | uri.IsUnc) + { + if (!File.Exists(filePath)) + { + throw new FileNotFoundException(filePath); + } + System.Text.StringBuilder iconPath = new System.Text.StringBuilder(260); + iconPath.Append(filePath); + IntPtr handle = Internal.ExtractAssociatedIcon(Internal.NullHandleRef, iconPath, ref index); + if ((handle != IntPtr.Zero)) + { + return Icon.FromHandle(handle); + } + } + return null; + } + #endregion + #region New ExtractIconEx + private static Icon __EIEExtractAssociatedIcon(string filePath, int index, IconSize size) + { + IntPtr[] phiconLarge = new IntPtr[] { IntPtr.Zero }; + IntPtr[] phiconSmall = new IntPtr[] { IntPtr.Zero }; + + Internal.ExtractIconEx(filePath, index, phiconLarge, phiconSmall, 1); + + switch (size) + { + case IconSize.Large: + try + { + return Icon.FromHandle(phiconLarge[0]); + } + catch (ArgumentException) + { + return null; + } + case IconSize.Small: + try + { + return Icon.FromHandle(phiconSmall[0]); + } + catch (ArgumentException) + { + return null; + } + } + return null; + } + #endregion + + public static Icon ExtractFileTypeIcon(string filePath) + { + string ext = System.IO.Path.GetExtension(filePath); + + string iconPath = String.Empty; + int iconIndex = 0; + + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + { + break; + } + case PlatformID.Unix: + { + break; + } + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + // TODO: Implement something that uses along the lines of MIME info + // specification + + /* + http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html + + + + + MS Word Files + + + + */ + + Microsoft.Win32.RegistryKey rkExt = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); + + string className = rkExt.GetValue(String.Empty, String.Empty).ToString(); + Microsoft.Win32.RegistryKey rkClass = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(className); + if (rkClass != null) + { + Microsoft.Win32.RegistryKey rkDefaultIcon = rkClass.OpenSubKey("DefaultIcon"); + if (rkDefaultIcon != null) + { + string defaultIconPath = rkDefaultIcon.GetValue(String.Empty, String.Empty).ToString(); + int splitIndex = defaultIconPath.LastIndexOf(','); + + string defaultIconFileName = defaultIconPath.Substring(0, splitIndex); + string defaultIconIndex = defaultIconPath.Substring(splitIndex + 1); + + Int32.TryParse(defaultIconIndex, out iconIndex); + if (defaultIconFileName.StartsWith("\"")) + { + defaultIconFileName = defaultIconFileName.Substring(1); + } + if (defaultIconFileName.EndsWith("\"")) + { + defaultIconFileName = defaultIconFileName.Substring(0, defaultIconFileName.Length - 1); + } + + iconPath = defaultIconFileName; + } + } + break; + } + } + + + Icon icon = ExtractAssociatedIcon(iconPath, iconIndex); + return icon; + } + + public static Icon ExtractAssociatedIcon(string filePath, int index = 0) + { + return ExtractAssociatedIcon(filePath, index, IconSize.Large); + } + public static Icon ExtractAssociatedIcon(string filePath, int index, IconSize size) + { + Icon icon = null; + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + // TODO: Mac OS X support? + break; + case PlatformID.Unix: + break; + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + icon = __EIEExtractAssociatedIcon(filePath, index, size); + break; + case PlatformID.Xbox: + break; + } + return icon; + } + + private static Dictionary _systemIcons = new Dictionary(); + private static void InitializeSystemIcons() + { + if (_systemIcons.Count > 0) return; + _systemIcons.Clear(); + + switch (Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + break; + case PlatformID.Unix: + break; + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + _systemIcons.Add("generic-file-16x16", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, IconSize.Small).ToBitmap()); + _systemIcons.Add("generic-document-16x16", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, IconSize.Small).ToBitmap()); + _systemIcons.Add("generic-application-16x16", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, IconSize.Small).ToBitmap()); + _systemIcons.Add("generic-folder-closed-16x16", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, IconSize.Small).ToBitmap()); + _systemIcons.Add("generic-folder-open-16x16", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, IconSize.Small).ToBitmap()); + + _systemIcons.Add("generic-file-32x32", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, IconSize.Large).ToBitmap()); + _systemIcons.Add("generic-document-32x32", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, IconSize.Large).ToBitmap()); + _systemIcons.Add("generic-application-32x32", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, IconSize.Large).ToBitmap()); + _systemIcons.Add("generic-folder-closed-32x32", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, IconSize.Large).ToBitmap()); + _systemIcons.Add("generic-folder-open-32x32", ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, IconSize.Large).ToBitmap()); + break; + } + } + } + + public static void PopulateSystemIcons(ref System.Windows.Forms.ImageList iml) + { + InitializeSystemIcons(); + string[] paths = new string[] + { + "generic-file", + "generic-document", + "generic-application", + "generic-folder-closed", + "generic-folder-open" + }; + foreach (string s in paths) + { + if (iml.Images.ContainsKey(s)) iml.Images.RemoveByKey(s); + + string path = "ImageList/" + iml.ImageSize.Width.ToString() + "x" + iml.ImageSize.Height.ToString() + "/" + s + ".png"; + Image image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage(path); + if (image == null && _systemIcons.ContainsKey(s + "-16x16")) image = _systemIcons[s + "-16x16"]; + if (image != null) + { + // the image exists, so use it + iml.Images.Add(s, image); + } + else + { + // the image doesn't exist, so just fail silently + Console.WriteLine("Couldn't find system icon or theme icon for '" + s + "'"); + } + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/LocalConfiguration.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/LocalConfiguration.cs new file mode 100644 index 00000000..07ca1652 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/LocalConfiguration.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Accessors; + +namespace UniversalEditor.Engines.WindowsForms +{ + public class LocalConfiguration + { + private static string mvarApplicationName = "Universal Editor"; + public static string ApplicationName { get { return mvarApplicationName; } set { mvarApplicationName = value; } } + + private static string mvarApplicationShortName = "universal-editor"; // polymolive + public static string ApplicationShortName { get { return mvarApplicationShortName; } set { mvarApplicationShortName = value; } } + + private static string mvarCompanyName = "Mike Becker's Software"; + public static string CompanyName { get { return mvarCompanyName; } set { mvarCompanyName = value; } } + + private static SplashScreenSettings mvarSplashScreen = new SplashScreenSettings(); + public static SplashScreenSettings SplashScreen { get { return mvarSplashScreen; } } + + private static StartPageSettings mvarStartPage = new StartPageSettings(); + public static StartPageSettings StartPage { get { return mvarStartPage; } } + + private static ColorSchemeSettings mvarColorScheme = new ColorSchemeSettings(); + public static ColorSchemeSettings ColorScheme { get { return mvarColorScheme; } } + + private static bool mvarConfirmExit = false; + public static bool ConfirmExit { get { return mvarConfirmExit; } set { mvarConfirmExit = value; } } + + private static void LoadPreliminaryConfiguration(ref MarkupObjectModel mom) + { + string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + LoadConfigurationFiles(path, ref mom); + + MarkupTagElement tagTitle = (mom.FindElement("UniversalEditor", "Application", "Title") as MarkupTagElement); + if (tagTitle != null) + { + mvarApplicationName = tagTitle.Value; + } + MarkupTagElement tagShortTitle = (mom.FindElement("UniversalEditor", "Application", "ShortTitle") as MarkupTagElement); + if (tagShortTitle != null) + { + mvarApplicationShortName = tagShortTitle.Value; + } + MarkupTagElement tagCompanyName = (mom.FindElement("UniversalEditor", "Application", "CompanyName") as MarkupTagElement); + if (tagCompanyName != null) + { + mvarCompanyName = tagCompanyName.Value; + } + } + + static LocalConfiguration() + { + MarkupObjectModel mom = new MarkupObjectModel(); + + LoadPreliminaryConfiguration(ref mom); + + List paths = new List(); + switch (Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + { + break; + } + case PlatformID.Unix: + { + paths.Add(String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), mvarApplicationShortName })); + paths.Add(String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), mvarApplicationShortName })); + paths.Add(String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), mvarApplicationShortName })); + break; + } + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + paths.Add(String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), mvarCompanyName, mvarApplicationName })); + paths.Add(String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), mvarCompanyName, mvarApplicationName })); + paths.Add(String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Mike Becker's Software", "PolyMo Live!" })); + break; + } + } + + foreach (string path in paths) + { + if (!System.IO.Directory.Exists(path)) continue; + LoadConfigurationFiles(path, ref mom); + } + } + + private static void LoadConfigurationFiles(string path, ref MarkupObjectModel mom) + { + string[] xmlfiles = null; + try + { + xmlfiles = System.IO.Directory.GetFiles(path, "*.xml", System.IO.SearchOption.AllDirectories); + } + catch + { + } + if (xmlfiles == null) return; + + foreach (string xmlfile in xmlfiles) + { + MarkupObjectModel local_mom = new MarkupObjectModel(); + + Document doc = new Document(local_mom, new XMLDataFormat(), new FileAccessor(xmlfile)); + if (local_mom.FindElement("UniversalEditor") == null) continue; + + local_mom.CopyTo(mom); + } + } + + private static System.Drawing.Icon mvarMainIcon = null; + public static System.Drawing.Icon MainIcon { get { return mvarMainIcon; } set { mvarMainIcon = value; } } + } + + public class StartPageSettings + { + private bool mvarShowOnStartup = true; + public bool ShowOnStartup { get { return mvarShowOnStartup; } set { mvarShowOnStartup = value; } } + + private string mvarHeaderImageFileName = @"Images/SplashScreen/header2.png"; // null; + public string HeaderImageFileName { get { return mvarHeaderImageFileName; } set { mvarHeaderImageFileName = value; } } + } + + public class ColorSchemeSettings + { + private Color mvarDarkColor = Color.FromArgb(30, 30, 30); + public Color DarkColor { get { return mvarDarkColor; } set { mvarDarkColor = value; } } + private Color mvarLightColor = Color.FromArgb(51, 51, 51); + public Color LightColor { get { return mvarLightColor; } set { mvarLightColor = value; } } + private Color mvarBackgroundColor = Color.FromArgb(77, 77, 77); + public Color BackgroundColor { get { return mvarBackgroundColor; } set { mvarBackgroundColor = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.Designer.cs new file mode 100644 index 00000000..0c185b63 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.Designer.cs @@ -0,0 +1,971 @@ +using System.Drawing; +namespace UniversalEditor.Engines.WindowsForms +{ + partial class MainWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow)); + this.cbc = new AwesomeControls.CommandBars.CBContainer(); + this.sbStatusBar = new AwesomeControls.CommandBars.CBStatusBar(); + this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.pbProgress = new System.Windows.Forms.ToolStripProgressBar(); + this.lblObjectModel = new System.Windows.Forms.ToolStripStatusLabel(); + this.dcc = new AwesomeControls.DockingWindows.DockingContainerControl(); + this.cboAddress = new System.Windows.Forms.ComboBox(); + this.mbMenuBar = new AwesomeControls.CommandBars.CBMenuBar(); + this.mnuFile = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileNew = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileNewFile = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileNewProject = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSave = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSaveFile = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSaveFileAs = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSaveSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFileSaveProject = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSaveProjectAs = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSaveSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFileSaveAll = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileClose = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFilePrint = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFileImport = new AwesomeControls.CommandBars.CBMenuItem(); + this.mnuFileExport = new AwesomeControls.CommandBars.CBMenuItem(); + this.mnuFileSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFileRecentFiles = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileRecentProjects = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileSep4 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFileExit = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEdit = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditUndo = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditRedo = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuEditCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuEditSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditInvertSelection = new AwesomeControls.CommandBars.CBMenuItem(); + this.mnuEditSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuEditFindReplace = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEditGoTo = new AwesomeControls.CommandBars.CBMenuItem(); + this.mnuEditSep4 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuEditPreferences = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuView = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewToolbars = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewToolbarsSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuViewToolbarsCustomize = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewStatusBar = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuViewPanels = new System.Windows.Forms.ToolStripMenuItem(); + this.toolboxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewPanelsProjectExplorer = new System.Windows.Forms.ToolStripMenuItem(); + this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuViewStartPage = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuViewFullScreen = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuProject = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuProjectAddNewItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuProjectAddExistingItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuProjectSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuProjectExclude = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuProjectShowAllFiles = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuProjectSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuProjectProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuBookmarks = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuBookmarksAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuBookmarksAddAll = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuBookmarksSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuBookmarksSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuBookmarksManage = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTools = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuToolsSessionManager = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuToolsSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuToolsCustomize = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuToolsOptions = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileCloseFile = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuFileCloseProject = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuFileCloseWindow = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbStandardOpenFile = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbStandardOpenProject = new System.Windows.Forms.ToolStripMenuItem(); + this.tmrToolStripContainerPopup = new System.Windows.Forms.Timer(this.components); + this.mnuContextDocumentType = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextDocumentTypeDataFormat = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextDocumentTypeSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.cbc.BottomToolStripPanel.SuspendLayout(); + this.cbc.ContentPanel.SuspendLayout(); + this.cbc.TopToolStripPanel.SuspendLayout(); + this.cbc.SuspendLayout(); + this.sbStatusBar.SuspendLayout(); + this.mbMenuBar.SuspendLayout(); + this.mnuContextDocumentType.SuspendLayout(); + this.SuspendLayout(); + // + // cbc + // + // + // cbc.BottomToolStripPanel + // + this.cbc.BottomToolStripPanel.Controls.Add(this.sbStatusBar); + // + // cbc.ContentPanel + // + this.cbc.ContentPanel.Controls.Add(this.dcc); + this.cbc.ContentPanel.Controls.Add(this.cboAddress); + this.cbc.ContentPanel.Size = new System.Drawing.Size(800, 553); + this.cbc.Dock = System.Windows.Forms.DockStyle.Fill; + this.cbc.Location = new System.Drawing.Point(0, 0); + this.cbc.Name = "cbc"; + this.cbc.Size = new System.Drawing.Size(800, 600); + this.cbc.TabIndex = 0; + this.cbc.Text = "cbContainer1"; + // + // cbc.TopToolStripPanel + // + this.cbc.TopToolStripPanel.Controls.Add(this.mbMenuBar); + this.cbc.UseCommandManager = false; + // + // sbStatusBar + // + this.sbStatusBar.Dock = System.Windows.Forms.DockStyle.None; + this.sbStatusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.lblStatus, + this.pbProgress, + this.lblObjectModel}); + this.sbStatusBar.Location = new System.Drawing.Point(0, 0); + this.sbStatusBar.Name = "sbStatusBar"; + this.sbStatusBar.ShowItemToolTips = true; + this.sbStatusBar.Size = new System.Drawing.Size(800, 22); + this.sbStatusBar.TabIndex = 0; + this.sbStatusBar.Text = "Status Bar"; + // + // lblStatus + // + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(706, 17); + this.lblStatus.Spring = true; + this.lblStatus.Text = "Ready"; + this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // pbProgress + // + this.pbProgress.Name = "pbProgress"; + this.pbProgress.Size = new System.Drawing.Size(200, 16); + this.pbProgress.Visible = false; + // + // lblObjectModel + // + this.lblObjectModel.Name = "lblObjectModel"; + this.lblObjectModel.Size = new System.Drawing.Size(79, 17); + this.lblObjectModel.Text = "Object Model"; + this.lblObjectModel.ToolTipText = "Click to switch object models"; + this.lblObjectModel.Click += new System.EventHandler(this.lblDataFormat_Click); + // + // dcc + // + this.dcc.Dock = System.Windows.Forms.DockStyle.Fill; + this.dcc.Location = new System.Drawing.Point(0, 21); + this.dcc.Name = "dcc"; + this.dcc.SelectedWindow = null; + this.dcc.Size = new System.Drawing.Size(800, 532); + this.dcc.TabIndex = 3; + this.dcc.SelectedWindowChanged += new System.EventHandler(this.dcc_SelectedWindowChanged); + this.dcc.WindowClosing += new AwesomeControls.DockingWindows.WindowClosingEventHandler(this.dcc_WindowClosing); + this.dcc.WindowClosed += new AwesomeControls.DockingWindows.WindowClosedEventHandler(this.dcc_WindowClosed); + // + // cboAddress + // + this.cboAddress.Dock = System.Windows.Forms.DockStyle.Top; + this.cboAddress.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboAddress.FormattingEnabled = true; + this.cboAddress.Location = new System.Drawing.Point(0, 0); + this.cboAddress.Name = "cboAddress"; + this.cboAddress.Size = new System.Drawing.Size(800, 21); + this.cboAddress.TabIndex = 2; + this.cboAddress.KeyDown += new System.Windows.Forms.KeyEventHandler(this.cboAddress_KeyDown); + // + // mbMenuBar + // + this.mbMenuBar.Dock = System.Windows.Forms.DockStyle.None; + this.mbMenuBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuFile, + this.mnuEdit, + this.mnuView, + this.mnuProject, + this.mnuBookmarks, + this.mnuTools}); + this.mbMenuBar.Location = new System.Drawing.Point(0, 0); + this.mbMenuBar.Name = "mbMenuBar"; + this.mbMenuBar.Size = new System.Drawing.Size(800, 25); + this.mbMenuBar.TabIndex = 0; + this.mbMenuBar.Text = "Menu Bar"; + // + // mnuFile + // + this.mnuFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuFileNew, + this.mnuFileSave, + this.mnuFileClose, + this.mnuFileSep1, + this.mnuFilePrint, + this.mnuFileSep2, + this.mnuFileImport, + this.mnuFileExport, + this.mnuFileSep3, + this.mnuFileRecentFiles, + this.mnuFileRecentProjects, + this.mnuFileSep4, + this.mnuFileExit}); + this.mnuFile.Name = "mnuFile"; + this.mnuFile.Size = new System.Drawing.Size(37, 21); + this.mnuFile.Text = "&File"; + // + // mnuFileNew + // + this.mnuFileNew.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuFileNewFile, + this.mnuFileNewProject}); + this.mnuFileNew.Name = "mnuFileNew"; + this.mnuFileNew.Size = new System.Drawing.Size(156, 22); + this.mnuFileNew.Text = "&New"; + // + // mnuFileNewFile + // + this.mnuFileNewFile.Image = ((System.Drawing.Image)(resources.GetObject("mnuFileNewFile.Image"))); + this.mnuFileNewFile.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuFileNewFile.Name = "mnuFileNewFile"; + this.mnuFileNewFile.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.mnuFileNewFile.Size = new System.Drawing.Size(244, 22); + this.mnuFileNewFile.Text = "&File..."; + this.mnuFileNewFile.Click += new System.EventHandler(this.FileNewFile_Click); + // + // mnuFileNewProject + // + this.mnuFileNewProject.Name = "mnuFileNewProject"; + this.mnuFileNewProject.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.N))); + this.mnuFileNewProject.Size = new System.Drawing.Size(244, 22); + this.mnuFileNewProject.Text = "&Project/Solution..."; + this.mnuFileNewProject.Click += new System.EventHandler(this.FileNewProject_Click); + // + // mnuFileSave + // + this.mnuFileSave.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuFileSaveFile, + this.mnuFileSaveFileAs, + this.mnuFileSaveSep1, + this.mnuFileSaveProject, + this.mnuFileSaveProjectAs, + this.mnuFileSaveSep2, + this.mnuFileSaveAll}); + this.mnuFileSave.Name = "mnuFileSave"; + this.mnuFileSave.Size = new System.Drawing.Size(156, 22); + this.mnuFileSave.Text = "&Save"; + // + // mnuFileSaveFile + // + this.mnuFileSaveFile.Image = ((System.Drawing.Image)(resources.GetObject("mnuFileSaveFile.Image"))); + this.mnuFileSaveFile.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuFileSaveFile.Name = "mnuFileSaveFile"; + this.mnuFileSaveFile.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.mnuFileSaveFile.Size = new System.Drawing.Size(263, 22); + this.mnuFileSaveFile.Text = "&File"; + this.mnuFileSaveFile.Click += new System.EventHandler(this.FileSaveFile_Click); + // + // mnuFileSaveFileAs + // + this.mnuFileSaveFileAs.Name = "mnuFileSaveFileAs"; + this.mnuFileSaveFileAs.Size = new System.Drawing.Size(263, 22); + this.mnuFileSaveFileAs.Text = "File with Other N&ame..."; + this.mnuFileSaveFileAs.Click += new System.EventHandler(this.FileSaveFileAs_Click); + // + // mnuFileSaveSep1 + // + this.mnuFileSaveSep1.Name = "mnuFileSaveSep1"; + this.mnuFileSaveSep1.Size = new System.Drawing.Size(260, 6); + // + // mnuFileSaveProject + // + this.mnuFileSaveProject.Name = "mnuFileSaveProject"; + this.mnuFileSaveProject.Size = new System.Drawing.Size(263, 22); + this.mnuFileSaveProject.Text = "&Project/Solution"; + this.mnuFileSaveProject.Click += new System.EventHandler(this.FileSaveProject_Click); + // + // mnuFileSaveProjectAs + // + this.mnuFileSaveProjectAs.Name = "mnuFileSaveProjectAs"; + this.mnuFileSaveProjectAs.Size = new System.Drawing.Size(263, 22); + this.mnuFileSaveProjectAs.Text = "Pro&ject/Solution with Other Name..."; + this.mnuFileSaveProjectAs.Click += new System.EventHandler(this.FileSaveProjectAs_Click); + // + // mnuFileSaveSep2 + // + this.mnuFileSaveSep2.Name = "mnuFileSaveSep2"; + this.mnuFileSaveSep2.Size = new System.Drawing.Size(260, 6); + // + // mnuFileSaveAll + // + this.mnuFileSaveAll.Name = "mnuFileSaveAll"; + this.mnuFileSaveAll.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.S))); + this.mnuFileSaveAll.Size = new System.Drawing.Size(263, 22); + this.mnuFileSaveAll.Text = "A&ll Files and Projects"; + this.mnuFileSaveAll.Click += new System.EventHandler(this.FileSaveAll_Click); + // + // mnuFileClose + // + this.mnuFileClose.Name = "mnuFileClose"; + this.mnuFileClose.Size = new System.Drawing.Size(156, 22); + // + // mnuFileSep1 + // + this.mnuFileSep1.Name = "mnuFileSep1"; + this.mnuFileSep1.Size = new System.Drawing.Size(153, 6); + // + // mnuFilePrint + // + this.mnuFilePrint.Image = ((System.Drawing.Image)(resources.GetObject("mnuFilePrint.Image"))); + this.mnuFilePrint.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuFilePrint.Name = "mnuFilePrint"; + this.mnuFilePrint.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); + this.mnuFilePrint.Size = new System.Drawing.Size(156, 22); + this.mnuFilePrint.Text = "&Print"; + this.mnuFilePrint.Click += new System.EventHandler(this.FilePrint_Click); + // + // mnuFileSep2 + // + this.mnuFileSep2.Name = "mnuFileSep2"; + this.mnuFileSep2.Size = new System.Drawing.Size(153, 6); + // + // mnuFileImport + // + this.mnuFileImport.Hidden = true; + this.mnuFileImport.Name = "mnuFileImport"; + this.mnuFileImport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); + this.mnuFileImport.Size = new System.Drawing.Size(156, 22); + this.mnuFileImport.Text = "&Import..."; + // + // mnuFileExport + // + this.mnuFileExport.Hidden = true; + this.mnuFileExport.Name = "mnuFileExport"; + this.mnuFileExport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); + this.mnuFileExport.Size = new System.Drawing.Size(156, 22); + this.mnuFileExport.Text = "&Export..."; + // + // mnuFileSep3 + // + this.mnuFileSep3.Name = "mnuFileSep3"; + this.mnuFileSep3.Size = new System.Drawing.Size(153, 6); + // + // mnuFileRecentFiles + // + this.mnuFileRecentFiles.Name = "mnuFileRecentFiles"; + this.mnuFileRecentFiles.Size = new System.Drawing.Size(156, 22); + this.mnuFileRecentFiles.Text = "Recent &Files"; + // + // mnuFileRecentProjects + // + this.mnuFileRecentProjects.Name = "mnuFileRecentProjects"; + this.mnuFileRecentProjects.Size = new System.Drawing.Size(156, 22); + this.mnuFileRecentProjects.Text = "Recent Pro&jects"; + // + // mnuFileSep4 + // + this.mnuFileSep4.Name = "mnuFileSep4"; + this.mnuFileSep4.Size = new System.Drawing.Size(153, 6); + // + // mnuFileExit + // + this.mnuFileExit.Name = "mnuFileExit"; + this.mnuFileExit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); + this.mnuFileExit.Size = new System.Drawing.Size(156, 22); + this.mnuFileExit.Text = "E&xit"; + this.mnuFileExit.Click += new System.EventHandler(this.mnuFileExit_Click); + // + // mnuEdit + // + this.mnuEdit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuEditUndo, + this.mnuEditRedo, + this.mnuEditSep1, + this.mnuEditCut, + this.mnuEditCopy, + this.mnuEditPaste, + this.mnuEditDelete, + this.mnuEditSep2, + this.mnuEditSelectAll, + this.mnuEditInvertSelection, + this.mnuEditSep3, + this.mnuEditFindReplace, + this.mnuEditGoTo, + this.mnuEditSep4, + this.mnuEditPreferences}); + this.mnuEdit.Name = "mnuEdit"; + this.mnuEdit.Size = new System.Drawing.Size(39, 21); + this.mnuEdit.Text = "&Edit"; + // + // mnuEditUndo + // + this.mnuEditUndo.Name = "mnuEditUndo"; + this.mnuEditUndo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); + this.mnuEditUndo.Size = new System.Drawing.Size(229, 22); + this.mnuEditUndo.Text = "&Undo"; + this.mnuEditUndo.Click += new System.EventHandler(this.EditUndo_Click); + // + // mnuEditRedo + // + this.mnuEditRedo.Name = "mnuEditRedo"; + this.mnuEditRedo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.mnuEditRedo.Size = new System.Drawing.Size(229, 22); + this.mnuEditRedo.Text = "&Redo"; + this.mnuEditRedo.Click += new System.EventHandler(this.EditRedo_Click); + // + // mnuEditSep1 + // + this.mnuEditSep1.Name = "mnuEditSep1"; + this.mnuEditSep1.Size = new System.Drawing.Size(226, 6); + // + // mnuEditCut + // + this.mnuEditCut.Image = ((System.Drawing.Image)(resources.GetObject("mnuEditCut.Image"))); + this.mnuEditCut.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuEditCut.Name = "mnuEditCut"; + this.mnuEditCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.mnuEditCut.Size = new System.Drawing.Size(229, 22); + this.mnuEditCut.Text = "Cu&t"; + this.mnuEditCut.Click += new System.EventHandler(this.EditCut_Click); + // + // mnuEditCopy + // + this.mnuEditCopy.Image = ((System.Drawing.Image)(resources.GetObject("mnuEditCopy.Image"))); + this.mnuEditCopy.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuEditCopy.Name = "mnuEditCopy"; + this.mnuEditCopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.mnuEditCopy.Size = new System.Drawing.Size(229, 22); + this.mnuEditCopy.Text = "&Copy"; + this.mnuEditCopy.Click += new System.EventHandler(this.EditCopy_Click); + // + // mnuEditPaste + // + this.mnuEditPaste.Image = ((System.Drawing.Image)(resources.GetObject("mnuEditPaste.Image"))); + this.mnuEditPaste.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuEditPaste.Name = "mnuEditPaste"; + this.mnuEditPaste.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.mnuEditPaste.Size = new System.Drawing.Size(229, 22); + this.mnuEditPaste.Text = "&Paste"; + this.mnuEditPaste.Click += new System.EventHandler(this.EditPaste_Click); + // + // mnuEditDelete + // + this.mnuEditDelete.Name = "mnuEditDelete"; + this.mnuEditDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; + this.mnuEditDelete.Size = new System.Drawing.Size(229, 22); + this.mnuEditDelete.Text = "&Delete"; + this.mnuEditDelete.Click += new System.EventHandler(this.EditDelete_Click); + // + // mnuEditSep2 + // + this.mnuEditSep2.Name = "mnuEditSep2"; + this.mnuEditSep2.Size = new System.Drawing.Size(226, 6); + // + // mnuEditSelectAll + // + this.mnuEditSelectAll.Name = "mnuEditSelectAll"; + this.mnuEditSelectAll.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); + this.mnuEditSelectAll.Size = new System.Drawing.Size(229, 22); + this.mnuEditSelectAll.Text = "Select &All"; + // + // mnuEditInvertSelection + // + this.mnuEditInvertSelection.Hidden = true; + this.mnuEditInvertSelection.Name = "mnuEditInvertSelection"; + this.mnuEditInvertSelection.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.A))); + this.mnuEditInvertSelection.Size = new System.Drawing.Size(229, 22); + this.mnuEditInvertSelection.Text = "&Invert Selection"; + // + // mnuEditSep3 + // + this.mnuEditSep3.Name = "mnuEditSep3"; + this.mnuEditSep3.Size = new System.Drawing.Size(226, 6); + // + // mnuEditFindReplace + // + this.mnuEditFindReplace.Name = "mnuEditFindReplace"; + this.mnuEditFindReplace.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); + this.mnuEditFindReplace.Size = new System.Drawing.Size(229, 22); + this.mnuEditFindReplace.Text = "&Find/Replace..."; + // + // mnuEditGoTo + // + this.mnuEditGoTo.Hidden = true; + this.mnuEditGoTo.Name = "mnuEditGoTo"; + this.mnuEditGoTo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); + this.mnuEditGoTo.Size = new System.Drawing.Size(229, 22); + this.mnuEditGoTo.Text = "&Go To..."; + // + // mnuEditSep4 + // + this.mnuEditSep4.Name = "mnuEditSep4"; + this.mnuEditSep4.Size = new System.Drawing.Size(226, 6); + // + // mnuEditPreferences + // + this.mnuEditPreferences.Name = "mnuEditPreferences"; + this.mnuEditPreferences.Size = new System.Drawing.Size(229, 22); + this.mnuEditPreferences.Text = "Prefere&nces..."; + this.mnuEditPreferences.Click += new System.EventHandler(this.ToolsOptions_Click); + // + // mnuView + // + this.mnuView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuViewToolbars, + this.mnuViewStatusBar, + this.mnuViewSep1, + this.mnuViewPanels, + this.mnuViewSep2, + this.mnuViewStartPage, + this.mnuViewFullScreen}); + this.mnuView.Name = "mnuView"; + this.mnuView.Size = new System.Drawing.Size(44, 21); + this.mnuView.Text = "&View"; + // + // mnuViewToolbars + // + this.mnuViewToolbars.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuViewToolbarsSep1, + this.mnuViewToolbarsCustomize}); + this.mnuViewToolbars.Name = "mnuViewToolbars"; + this.mnuViewToolbars.Size = new System.Drawing.Size(156, 22); + this.mnuViewToolbars.Text = "&Toolbars"; + // + // mnuViewToolbarsSep1 + // + this.mnuViewToolbarsSep1.Name = "mnuViewToolbarsSep1"; + this.mnuViewToolbarsSep1.Size = new System.Drawing.Size(136, 6); + // + // mnuViewToolbarsCustomize + // + this.mnuViewToolbarsCustomize.Name = "mnuViewToolbarsCustomize"; + this.mnuViewToolbarsCustomize.Size = new System.Drawing.Size(139, 22); + this.mnuViewToolbarsCustomize.Text = "&Customize..."; + this.mnuViewToolbarsCustomize.Click += new System.EventHandler(this.mnuViewToolbarsCustomize_Click); + // + // mnuViewStatusBar + // + this.mnuViewStatusBar.Checked = true; + this.mnuViewStatusBar.CheckOnClick = true; + this.mnuViewStatusBar.CheckState = System.Windows.Forms.CheckState.Checked; + this.mnuViewStatusBar.Name = "mnuViewStatusBar"; + this.mnuViewStatusBar.Size = new System.Drawing.Size(156, 22); + this.mnuViewStatusBar.Text = "Status &Bar"; + this.mnuViewStatusBar.Click += new System.EventHandler(this.mnuViewStatusBar_Click); + // + // mnuViewSep1 + // + this.mnuViewSep1.Name = "mnuViewSep1"; + this.mnuViewSep1.Size = new System.Drawing.Size(153, 6); + // + // mnuViewPanels + // + this.mnuViewPanels.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolboxToolStripMenuItem, + this.mnuViewPanelsProjectExplorer, + this.propertiesToolStripMenuItem}); + this.mnuViewPanels.Name = "mnuViewPanels"; + this.mnuViewPanels.Size = new System.Drawing.Size(156, 22); + this.mnuViewPanels.Text = "&Panels"; + // + // toolboxToolStripMenuItem + // + this.toolboxToolStripMenuItem.Name = "toolboxToolStripMenuItem"; + this.toolboxToolStripMenuItem.Size = new System.Drawing.Size(156, 22); + this.toolboxToolStripMenuItem.Text = "&Toolbox"; + // + // mnuViewPanelsProjectExplorer + // + this.mnuViewPanelsProjectExplorer.Name = "mnuViewPanelsProjectExplorer"; + this.mnuViewPanelsProjectExplorer.Size = new System.Drawing.Size(156, 22); + this.mnuViewPanelsProjectExplorer.Text = "Project E&xplorer"; + this.mnuViewPanelsProjectExplorer.Click += new System.EventHandler(this.mnuViewPanelsProjectExplorer_Click); + // + // propertiesToolStripMenuItem + // + this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem"; + this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(156, 22); + this.propertiesToolStripMenuItem.Text = "&Properties"; + // + // mnuViewSep2 + // + this.mnuViewSep2.Name = "mnuViewSep2"; + this.mnuViewSep2.Size = new System.Drawing.Size(153, 6); + // + // mnuViewStartPage + // + this.mnuViewStartPage.Name = "mnuViewStartPage"; + this.mnuViewStartPage.Size = new System.Drawing.Size(156, 22); + this.mnuViewStartPage.Text = "Start Pa&ge"; + // + // mnuViewFullScreen + // + this.mnuViewFullScreen.Name = "mnuViewFullScreen"; + this.mnuViewFullScreen.ShortcutKeys = System.Windows.Forms.Keys.F11; + this.mnuViewFullScreen.Size = new System.Drawing.Size(156, 22); + this.mnuViewFullScreen.Text = "F&ull Screen"; + this.mnuViewFullScreen.Click += new System.EventHandler(this.mnuViewFullScreen_Click); + // + // mnuProject + // + this.mnuProject.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuProjectAddNewItem, + this.mnuProjectAddExistingItem, + this.mnuProjectSep1, + this.mnuProjectExclude, + this.mnuProjectShowAllFiles, + this.mnuProjectSep2, + this.mnuProjectProperties}); + this.mnuProject.Name = "mnuProject"; + this.mnuProject.Size = new System.Drawing.Size(56, 21); + this.mnuProject.Text = "&Project"; + // + // mnuProjectAddNewItem + // + this.mnuProjectAddNewItem.Name = "mnuProjectAddNewItem"; + this.mnuProjectAddNewItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.A))); + this.mnuProjectAddNewItem.Size = new System.Drawing.Size(245, 22); + this.mnuProjectAddNewItem.Text = "Add Ne&w Item..."; + this.mnuProjectAddNewItem.Click += new System.EventHandler(this.mnuProjectAddNewItem_Click); + // + // mnuProjectAddExistingItem + // + this.mnuProjectAddExistingItem.Name = "mnuProjectAddExistingItem"; + this.mnuProjectAddExistingItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.A))); + this.mnuProjectAddExistingItem.Size = new System.Drawing.Size(245, 22); + this.mnuProjectAddExistingItem.Text = "Add Existin&g Item..."; + this.mnuProjectAddExistingItem.Click += new System.EventHandler(this.mnuProjectAddExistingItem_Click); + // + // mnuProjectSep1 + // + this.mnuProjectSep1.Name = "mnuProjectSep1"; + this.mnuProjectSep1.Size = new System.Drawing.Size(242, 6); + // + // mnuProjectExclude + // + this.mnuProjectExclude.Name = "mnuProjectExclude"; + this.mnuProjectExclude.Size = new System.Drawing.Size(245, 22); + this.mnuProjectExclude.Text = "Exclude from Pro&ject"; + this.mnuProjectExclude.Click += new System.EventHandler(this.mnuProjectExclude_Click); + // + // mnuProjectShowAllFiles + // + this.mnuProjectShowAllFiles.Name = "mnuProjectShowAllFiles"; + this.mnuProjectShowAllFiles.Size = new System.Drawing.Size(245, 22); + this.mnuProjectShowAllFiles.Text = "Sh&ow All Files"; + this.mnuProjectShowAllFiles.Click += new System.EventHandler(this.mnuProjectShowAllFiles_Click); + // + // mnuProjectSep2 + // + this.mnuProjectSep2.Name = "mnuProjectSep2"; + this.mnuProjectSep2.Size = new System.Drawing.Size(242, 6); + // + // mnuProjectProperties + // + this.mnuProjectProperties.Name = "mnuProjectProperties"; + this.mnuProjectProperties.Size = new System.Drawing.Size(245, 22); + this.mnuProjectProperties.Text = "Project &Properties..."; + this.mnuProjectProperties.Click += new System.EventHandler(this.mnuProjectProperties_Click); + // + // mnuBookmarks + // + this.mnuBookmarks.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuBookmarksAdd, + this.mnuBookmarksAddAll, + this.mnuBookmarksSep1, + this.mnuBookmarksSep2, + this.mnuBookmarksManage}); + this.mnuBookmarks.Name = "mnuBookmarks"; + this.mnuBookmarks.Size = new System.Drawing.Size(78, 21); + this.mnuBookmarks.Text = "Book&marks"; + // + // mnuBookmarksAdd + // + this.mnuBookmarksAdd.Name = "mnuBookmarksAdd"; + this.mnuBookmarksAdd.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); + this.mnuBookmarksAdd.Size = new System.Drawing.Size(263, 22); + this.mnuBookmarksAdd.Text = "Add to Boo&kmarks"; + this.mnuBookmarksAdd.Click += new System.EventHandler(this.mnuBookmarksAdd_Click); + // + // mnuBookmarksAddAll + // + this.mnuBookmarksAddAll.Name = "mnuBookmarksAddAll"; + this.mnuBookmarksAddAll.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.D))); + this.mnuBookmarksAddAll.Size = new System.Drawing.Size(263, 22); + this.mnuBookmarksAddAll.Text = "Add &All to Bookmarks"; + this.mnuBookmarksAddAll.Click += new System.EventHandler(this.mnuBookmarksAddAll_Click); + // + // mnuBookmarksSep1 + // + this.mnuBookmarksSep1.Name = "mnuBookmarksSep1"; + this.mnuBookmarksSep1.Size = new System.Drawing.Size(260, 6); + // + // mnuBookmarksSep2 + // + this.mnuBookmarksSep2.Name = "mnuBookmarksSep2"; + this.mnuBookmarksSep2.Size = new System.Drawing.Size(260, 6); + // + // mnuBookmarksManage + // + this.mnuBookmarksManage.Name = "mnuBookmarksManage"; + this.mnuBookmarksManage.Size = new System.Drawing.Size(263, 22); + this.mnuBookmarksManage.Text = "&Manage Bookmarks..."; + // + // mnuTools + // + this.mnuTools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuToolsSessionManager, + this.mnuToolsSep1, + this.mnuToolsCustomize, + this.mnuToolsOptions}); + this.mnuTools.Name = "mnuTools"; + this.mnuTools.Size = new System.Drawing.Size(48, 21); + this.mnuTools.Text = "&Tools"; + // + // mnuToolsSessionManager + // + this.mnuToolsSessionManager.Name = "mnuToolsSessionManager"; + this.mnuToolsSessionManager.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt) + | System.Windows.Forms.Keys.S))); + this.mnuToolsSessionManager.Size = new System.Drawing.Size(235, 22); + this.mnuToolsSessionManager.Text = "&Session Manager..."; + this.mnuToolsSessionManager.Click += new System.EventHandler(this.mnuToolsSessionManager_Click); + // + // mnuToolsSep1 + // + this.mnuToolsSep1.Name = "mnuToolsSep1"; + this.mnuToolsSep1.Size = new System.Drawing.Size(232, 6); + // + // mnuToolsCustomize + // + this.mnuToolsCustomize.Name = "mnuToolsCustomize"; + this.mnuToolsCustomize.Size = new System.Drawing.Size(235, 22); + this.mnuToolsCustomize.Text = "&Customize..."; + this.mnuToolsCustomize.Click += new System.EventHandler(this.ToolsCustomize_Click); + // + // mnuToolsOptions + // + this.mnuToolsOptions.Name = "mnuToolsOptions"; + this.mnuToolsOptions.Size = new System.Drawing.Size(235, 22); + this.mnuToolsOptions.Text = "&Options..."; + this.mnuToolsOptions.Click += new System.EventHandler(this.ToolsOptions_Click); + // + // mnuFileCloseFile + // + this.mnuFileCloseFile.Name = "mnuFileCloseFile"; + this.mnuFileCloseFile.Size = new System.Drawing.Size(32, 19); + // + // mnuFileCloseProject + // + this.mnuFileCloseProject.Name = "mnuFileCloseProject"; + this.mnuFileCloseProject.Size = new System.Drawing.Size(32, 19); + // + // toolStripMenuItem11 + // + this.toolStripMenuItem11.Name = "toolStripMenuItem11"; + this.toolStripMenuItem11.Size = new System.Drawing.Size(6, 6); + // + // mnuFileCloseWindow + // + this.mnuFileCloseWindow.Name = "mnuFileCloseWindow"; + this.mnuFileCloseWindow.Size = new System.Drawing.Size(32, 19); + // + // tsbStandardOpenFile + // + this.tsbStandardOpenFile.Name = "tsbStandardOpenFile"; + this.tsbStandardOpenFile.Size = new System.Drawing.Size(32, 19); + // + // tsbStandardOpenProject + // + this.tsbStandardOpenProject.Name = "tsbStandardOpenProject"; + this.tsbStandardOpenProject.Size = new System.Drawing.Size(32, 19); + // + // tmrToolStripContainerPopup + // + this.tmrToolStripContainerPopup.Interval = 50; + this.tmrToolStripContainerPopup.Tick += new System.EventHandler(this.tmrToolStripContainerPopup_Tick); + // + // mnuContextDocumentType + // + this.mnuContextDocumentType.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextDocumentTypeDataFormat, + this.mnuContextDocumentTypeSep1}); + this.mnuContextDocumentType.Name = "mnuContextDataFormat"; + this.mnuContextDocumentType.Size = new System.Drawing.Size(138, 32); + // + // mnuContextDocumentTypeDataFormat + // + this.mnuContextDocumentTypeDataFormat.Enabled = false; + this.mnuContextDocumentTypeDataFormat.Name = "mnuContextDocumentTypeDataFormat"; + this.mnuContextDocumentTypeDataFormat.Size = new System.Drawing.Size(137, 22); + this.mnuContextDocumentTypeDataFormat.Text = "&Data format"; + // + // mnuContextDocumentTypeSep1 + // + this.mnuContextDocumentTypeSep1.Name = "mnuContextDocumentTypeSep1"; + this.mnuContextDocumentTypeSep1.Size = new System.Drawing.Size(134, 6); + // + // MainWindow + // + this.AllowDrop = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 600); + this.Controls.Add(this.cbc); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.MainMenuStrip = this.mbMenuBar; + this.Name = "MainWindow"; + this.Text = "Universal Editor"; + this.DragDrop += new System.Windows.Forms.DragEventHandler(this.MainWindow_DragDrop); + this.DragEnter += new System.Windows.Forms.DragEventHandler(this.MainWindow_DragEnter); + this.cbc.BottomToolStripPanel.ResumeLayout(false); + this.cbc.BottomToolStripPanel.PerformLayout(); + this.cbc.ContentPanel.ResumeLayout(false); + this.cbc.TopToolStripPanel.ResumeLayout(false); + this.cbc.TopToolStripPanel.PerformLayout(); + this.cbc.ResumeLayout(false); + this.cbc.PerformLayout(); + this.sbStatusBar.ResumeLayout(false); + this.sbStatusBar.PerformLayout(); + this.mbMenuBar.ResumeLayout(false); + this.mbMenuBar.PerformLayout(); + this.mnuContextDocumentType.ResumeLayout(false); + this.ResumeLayout(false); + + } + private System.Windows.Forms.ToolStripSeparator mnuContextDocumentTypeSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextDocumentTypeDataFormat; + private AwesomeControls.CommandBars.CBContextMenu mnuContextDocumentType; + private System.Windows.Forms.ToolStripStatusLabel lblObjectModel; + + #endregion + + private AwesomeControls.CommandBars.CBContainer cbc; + private AwesomeControls.CommandBars.CBStatusBar sbStatusBar; + private System.Windows.Forms.ToolStripStatusLabel lblStatus; + private AwesomeControls.CommandBars.CBMenuBar mbMenuBar; + private System.Windows.Forms.ToolStripMenuItem mnuFile; + private System.Windows.Forms.ToolStripSeparator mnuFileSep1; + private System.Windows.Forms.ToolStripMenuItem mnuFilePrint; + private System.Windows.Forms.ToolStripSeparator mnuFileSep2; + private System.Windows.Forms.ToolStripMenuItem mnuFileExit; + private System.Windows.Forms.ToolStripMenuItem mnuEdit; + private System.Windows.Forms.ToolStripMenuItem mnuEditUndo; + private System.Windows.Forms.ToolStripMenuItem mnuEditRedo; + private System.Windows.Forms.ToolStripSeparator mnuEditSep1; + private System.Windows.Forms.ToolStripMenuItem mnuEditCut; + private System.Windows.Forms.ToolStripMenuItem mnuEditCopy; + private System.Windows.Forms.ToolStripMenuItem mnuEditPaste; + private System.Windows.Forms.ToolStripSeparator mnuEditSep2; + private System.Windows.Forms.ToolStripMenuItem mnuEditSelectAll; + private System.Windows.Forms.ToolStripMenuItem mnuTools; + private System.Windows.Forms.ToolStripMenuItem mnuToolsCustomize; + private System.Windows.Forms.ToolStripMenuItem mnuToolsOptions; + private System.Windows.Forms.ToolStripMenuItem mnuView; + private System.Windows.Forms.ToolStripMenuItem mnuViewToolbars; + private System.Windows.Forms.ToolStripMenuItem mnuViewStatusBar; + private System.Windows.Forms.ToolStripSeparator mnuViewToolbarsSep1; + private System.Windows.Forms.ToolStripMenuItem mnuViewToolbarsCustomize; + private System.Windows.Forms.ToolStripMenuItem mnuEditDelete; + private System.Windows.Forms.ToolStripSeparator mnuEditSep3; + private System.Windows.Forms.ToolStripMenuItem mnuEditFindReplace; + private System.Windows.Forms.ToolStripSeparator mnuViewSep1; + private System.Windows.Forms.ToolStripMenuItem mnuViewFullScreen; + private System.Windows.Forms.ToolStripMenuItem mnuFileSave; + private System.Windows.Forms.ToolStripMenuItem mnuFileSaveFile; + private System.Windows.Forms.ToolStripMenuItem mnuFileSaveFileAs; + private System.Windows.Forms.ToolStripMenuItem mnuFileSaveAll; + private System.Windows.Forms.ToolStripSeparator mnuFileSaveSep1; + private System.Windows.Forms.ToolStripMenuItem mnuFileSaveProject; + private System.Windows.Forms.ToolStripMenuItem mnuFileSaveProjectAs; + private System.Windows.Forms.ToolStripMenuItem mnuFileNew; + private System.Windows.Forms.ToolStripMenuItem mnuFileNewFile; + private System.Windows.Forms.ToolStripMenuItem mnuFileNewProject; + private System.Windows.Forms.ToolStripMenuItem mnuFileClose; + private System.Windows.Forms.ToolStripMenuItem mnuFileCloseFile; + private System.Windows.Forms.ToolStripMenuItem mnuFileCloseProject; + private System.Windows.Forms.ToolStripMenuItem mnuViewStartPage; + private System.Windows.Forms.ToolStripMenuItem mnuFileRecentFiles; + private System.Windows.Forms.ToolStripMenuItem mnuFileRecentProjects; + private System.Windows.Forms.ToolStripSeparator mnuFileSep3; + private System.Windows.Forms.ToolStripSeparator mnuEditSep4; + private System.Windows.Forms.ToolStripMenuItem mnuEditPreferences; + private System.Windows.Forms.ToolStripMenuItem tsbStandardOpenFile; + private System.Windows.Forms.ToolStripMenuItem tsbStandardOpenProject; + private System.Windows.Forms.ToolStripMenuItem mnuProject; + private System.Windows.Forms.ToolStripMenuItem mnuProjectAddNewItem; + private System.Windows.Forms.ToolStripMenuItem mnuProjectAddExistingItem; + private System.Windows.Forms.ToolStripSeparator mnuProjectSep1; + private System.Windows.Forms.ToolStripMenuItem mnuProjectExclude; + private System.Windows.Forms.ToolStripMenuItem mnuProjectShowAllFiles; + private System.Windows.Forms.ToolStripSeparator mnuProjectSep2; + private System.Windows.Forms.ToolStripMenuItem mnuProjectProperties; + private System.Windows.Forms.ToolStripSeparator mnuFileSep4; + private System.Windows.Forms.Timer tmrToolStripContainerPopup; + private System.Windows.Forms.ToolStripMenuItem mnuViewPanels; + private System.Windows.Forms.ToolStripMenuItem toolboxToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mnuViewPanelsProjectExplorer; + private System.Windows.Forms.ToolStripMenuItem propertiesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator mnuViewSep2; + private System.Windows.Forms.ComboBox cboAddress; + private System.Windows.Forms.ToolStripMenuItem mnuBookmarks; + private System.Windows.Forms.ToolStripMenuItem mnuBookmarksAdd; + private System.Windows.Forms.ToolStripMenuItem mnuBookmarksAddAll; + private System.Windows.Forms.ToolStripSeparator mnuBookmarksSep1; + private System.Windows.Forms.ToolStripSeparator mnuBookmarksSep2; + private System.Windows.Forms.ToolStripMenuItem mnuBookmarksManage; + private System.Windows.Forms.ToolStripMenuItem mnuToolsSessionManager; + private System.Windows.Forms.ToolStripSeparator mnuToolsSep1; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11; + private System.Windows.Forms.ToolStripMenuItem mnuFileCloseWindow; + private System.Windows.Forms.ToolStripProgressBar pbProgress; + private AwesomeControls.DockingWindows.DockingContainerControl dcc; + private System.Windows.Forms.ToolStripSeparator mnuFileSaveSep2; + private AwesomeControls.CommandBars.CBMenuItem mnuFileImport; + private AwesomeControls.CommandBars.CBMenuItem mnuFileExport; + private AwesomeControls.CommandBars.CBMenuItem mnuEditInvertSelection; + private AwesomeControls.CommandBars.CBMenuItem mnuEditGoTo; + } +} + diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.cs new file mode 100644 index 00000000..4d95ec57 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.cs @@ -0,0 +1,2290 @@ +using AwesomeControls.DockingWindows; +using AwesomeControls.PropertyGrid; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Solution; +using UniversalEditor.Engines.WindowsForms.Dialogs; +using CancelEventArgs = System.ComponentModel.CancelEventArgs; +using UniversalEditor.ObjectModels.Project; +using UniversalEditor.Engines.WindowsForms.Controls; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Engines.WindowsForms +{ + public partial class MainWindow : AwesomeControls.Window, IHostApplicationWindow + { + public event EventHandler WindowClosed; + + #region Docking Windows + private Controls.ErrorList pnlErrorList = new Controls.ErrorList(); + private DockingWindow dwErrorList = null; + + private DockingWindow dwProperties = null; + + private Controls.SolutionExplorer pnlSolutionExplorer = new Controls.SolutionExplorer(); + private DockingWindow dwSolutionExplorer = null; + + private DockingWindow dwToolbox = null; + + private Controls.OutputWindow wndOutputWindow = null; + private DockingWindow dwOutput = null; + #endregion + + public void ActivateWindow() + { + // Invoke required when being called from SingleInstance_Callback + Invoke(new Action(delegate() + { + Activate(); + BringToFront(); + })); + } + + public MainWindow() + { + InitializeComponent(); + InitializeDockingWindows(); + InitializeCommandBars(); + + pnlSolutionExplorer.ParentWindow = this; + + this.Icon = LocalConfiguration.MainIcon; + this.Text = Engine.CurrentEngine.DefaultLanguage.GetStringTableEntry("ApplicationTitle", "Universal Editor"); + + mnuContextDocumentTypeDataFormat.Font = new Font(SystemFonts.MenuFont, FontStyle.Bold); + + UpdatePreferencesMenu(); + + RefreshRecentFilesList(); + + HostApplication.OutputWindow.TextWritten += OutputWindow_TextWritten; + HostApplication.OutputWindow.TextCleared += OutputWindow_TextCleared; + HostApplication.Messages.MessageAdded += Messages_MessageAdded; + HostApplication.Messages.MessageRemoved += Messages_MessageRemoved; + HostApplication.Messages.MessagesCleared += Messages_MessagesCleared; + + mnuBookmarksSep1.Visible = (Engine.CurrentEngine.BookmarksManager.FileNames.Count > 0); + foreach (string FileName in Engine.CurrentEngine.BookmarksManager.FileNames) + { + ToolStripMenuItem tsmi = new ToolStripMenuItem(); + tsmi.Text = System.IO.Path.GetFileName(FileName); + tsmi.ToolTipText = FileName; + tsmi.Click += tsmiBookmark_Click; + mnuBookmarks.DropDownItems.Insert(mnuBookmarks.DropDownItems.Count - 2, tsmi); + } + } + + private void InitializeCommandBars() + { + mbMenuBar.Items.Clear(); + foreach (CommandItem item in Engine.CurrentEngine.MainMenu.Items) + { + LoadCommandBarMenuItem(item, null); + } + + foreach (CommandBar bar in Engine.CurrentEngine.CommandBars) + { + LoadCommandBar(bar); + } + } + + private void LoadCommandBar(CommandBar bar) + { + AwesomeControls.CommandBars.CBToolBar tb = new AwesomeControls.CommandBars.CBToolBar(); + tb.Text = bar.Title; + foreach (CommandItem item in bar.Items) + { + LoadCommandBarItem(item, tb); + } + cbc.TopToolStripPanel.Controls.Add(tb); + } + + private ToolStripItem InitializeCommandBarItem(CommandItem item, bool isOnDropDown = false) + { + if (item is SeparatorCommandItem) + { + return new ToolStripSeparator(); + } + else if (item is CommandReferenceCommandItem) + { + CommandReferenceCommandItem crci = (item as CommandReferenceCommandItem); + Command cmd = Engine.CurrentEngine.Commands[crci.CommandID]; + if (cmd == null) + { + Console.WriteLine("could not find command '" + crci.CommandID + "'"); + return null; + } + + if (cmd.Items.Count > 0) + { + ToolStripDropDownItem tsi = null; + if (!isOnDropDown) + { + if (!String.IsNullOrEmpty(cmd.DefaultCommandID)) + { + ToolStripSplitButton tsb = new ToolStripSplitButton(); + tsb.ButtonClick += tsbCommandBarButton_Click; + tsi = tsb; + } + else + { + ToolStripDropDownButton tsb = new ToolStripDropDownButton(); + tsi = tsb; + } + } + else + { + ToolStripMenuItem tsmi = new ToolStripMenuItem(); + tsi = tsmi; + } + + if (tsi == null) + { + Console.WriteLine("ToolStripDropDownItem was not loaded!"); + return null; + } + + tsi.Tag = cmd; + tsi.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("Commands/" + cmd.ID + ".png"); + tsi.Text = cmd.Title.Replace("_", "&"); + foreach (CommandItem item1 in cmd.Items) + { + LoadCommandBarItem(item1, tsi); + } + if (tsi.DropDownItems.Count > 0) tsi.Image = tsi.DropDownItems[0].Image; + if (tsi.Image != null && !isOnDropDown ) + { + tsi.DisplayStyle = ToolStripItemDisplayStyle.Image; + } + return tsi; + } + else + { + ToolStripItem tsi = null; + if (!isOnDropDown) + { + tsi = new ToolStripButton(); + } + else + { + tsi = new ToolStripMenuItem(); + } + tsi.Tag = cmd; + tsi.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("Commands/" + cmd.ID + ".png"); + if (tsi.Image != null && !isOnDropDown) + { + tsi.DisplayStyle = ToolStripItemDisplayStyle.Image; + } + tsi.Text = cmd.Title.Replace("_", "&"); + tsi.Click += tsbCommandBarButton_Click; + return tsi; + } + } + return null; + } + + private Keys ShortcutKeyToWinFormsKeys(CommandShortcutKey sk) + { + Keys keys = Keys.None; + if ((sk.Modifiers & CommandShortcutKeyModifiers.Alt) == CommandShortcutKeyModifiers.Alt) keys |= Keys.Alt; + if ((sk.Modifiers & CommandShortcutKeyModifiers.Control) == CommandShortcutKeyModifiers.Control) keys |= Keys.Control; + if ((sk.Modifiers & CommandShortcutKeyModifiers.Meta) == CommandShortcutKeyModifiers.Meta) keys |= Keys.Alt; + if ((sk.Modifiers & CommandShortcutKeyModifiers.Shift) == CommandShortcutKeyModifiers.Shift) keys |= Keys.Shift; + if ((sk.Modifiers & CommandShortcutKeyModifiers.Super) == CommandShortcutKeyModifiers.Super) keys |= Keys.LWin; + keys |= (Keys)sk.Value; + return keys; + } + + private void LoadCommandBarItem(CommandItem item, ToolStripDropDownItem parent) + { + ToolStripItem tsi = InitializeCommandBarItem(item, true); + if (tsi == null) return; + + parent.DropDownItems.Add(tsi); + } + private void LoadCommandBarItem(CommandItem item, AwesomeControls.CommandBars.CBToolBar parent) + { + ToolStripItem tsi = InitializeCommandBarItem(item); + if (tsi == null) return; + + parent.Items.Add(tsi); + } + + private void tsbCommandBarButton_Click(object sender, EventArgs e) + { + if (sender is ToolStripDropDownItem) + { + ToolStripDropDownItem tsi = (sender as ToolStripDropDownItem); + Command cmd = (tsi.Tag as Command); + if (tsi.DropDownItems.Count > 0) + { + Command cmd1 = Engine.CurrentEngine.Commands[cmd.DefaultCommandID]; + if (cmd1 == null) + { + Console.WriteLine("could not find command '" + cmd.DefaultCommandID + "'"); + return; + } + cmd1.Execute(); + } + else + { + cmd.Execute(); + } + } + else if (sender is ToolStripItem) + { + ToolStripItem tsi = (sender as ToolStripItem); + Command cmd = (tsi.Tag as Command); + cmd.Execute(); + } + } + + private void LoadCommandBarMenuItem(CommandItem item, ToolStripMenuItem parent) + { + ToolStripItem tsi = null; + + if (item is CommandReferenceCommandItem) + { + CommandReferenceCommandItem crci = (item as CommandReferenceCommandItem); + Command cmd = Engine.CurrentEngine.Commands[crci.CommandID]; + if (cmd == null) + { + Console.WriteLine("Skipping invalid command reference '" + crci.CommandID + "'"); + return; + } + + ToolStripMenuItem tsmi = new ToolStripMenuItem(); + tsmi.Name = cmd.ID; + tsmi.Click += tsmiCommand_Click; + tsmi.Image = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("Commands/" + cmd.ID + ".png"); + tsmi.Tag = cmd; + tsmi.Text = cmd.Title.Replace("_", "&"); + tsmi.ShortcutKeys = ShortcutKeyToWinFormsKeys(cmd.ShortcutKey); + foreach (CommandItem item1 in cmd.Items) + { + LoadCommandBarMenuItem(item1, tsmi); + } + tsi = tsmi; + } + else if (item is SeparatorCommandItem) + { + tsi = new ToolStripSeparator(); + } + + if (parent == null) + { + mbMenuBar.Items.Add(tsi); + } + else + { + parent.DropDownItems.Add(tsi); + } + } + + void tsmiCommand_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + Command cmd = (tsmi.Tag as Command); + if (cmd != null) cmd.Execute(); + } + + + private void Messages_MessageAdded(object sender, HostApplicationMessageModifiedEventArgs e) + { + pnlErrorList.Invoke(new Action(delegate() + { + pnlErrorList.Messages.Add(e.Message); + pnlErrorList.RefreshList(); + })); + } + private void Messages_MessageRemoved(object sender, HostApplicationMessageModifiedEventArgs e) + { + pnlErrorList.Invoke(new Action(delegate() + { + pnlErrorList.Messages.Remove(e.Message); + pnlErrorList.RefreshList(); + })); + } + private void Messages_MessagesCleared(object sender, EventArgs e) + { + pnlErrorList.Invoke(new Action(delegate() + { + pnlErrorList.Messages.Clear(); + pnlErrorList.RefreshList(); + })); + } + + private void tsmiBookmark_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + OpenFile(tsmi.Tag as Document); + } + + PropertyGridControl pgc = new PropertyGridControl(); + + private void InitializeDockingWindows() + { + pnlSolutionExplorer.SelectionChanged += pnlSolutionExplorer_SelectionChanged; + dwSolutionExplorer = dcc.Windows.Add("Solution Explorer", pnlSolutionExplorer); + + dwProperties = dcc.Windows.Add("Properties", pgc); + dcc.Areas[DockPosition.Center].Areas[DockPosition.Bottom].Size = 200; + + dcc.Areas[DockPosition.Center].Areas[DockPosition.Bottom].Windows.Add(dwProperties); + + dwToolbox = dcc.Windows.Add("Toolbox", new AwesomeControls.Toolbox.ToolboxControl()); + + dcc.Areas[DockPosition.Right].Areas[DockPosition.Top].Windows.Add(dwSolutionExplorer); + + dcc.Areas[DockPosition.Left].Windows.Add(dwToolbox); + dwToolbox.Behavior = DockBehavior.AutoHide; + + #region Message Log + wndOutputWindow = new Controls.OutputWindow(); + dwOutput = dcc.Windows.Add("Output", wndOutputWindow); + dcc.Areas[DockPosition.Center].Areas[DockPosition.Bottom].Windows.Add(dwOutput); + #endregion + #region Error List + pnlErrorList = new Controls.ErrorList(); + dwErrorList = dcc.Windows.Add("Error List", pnlErrorList); + dcc.Areas[DockPosition.Center].Areas[DockPosition.Bottom].Windows.Add(dwErrorList); + #endregion + + #region Property Grid + pgc.PropertyChanging += new PropertyChangingEventHandler(pgc_PropertyChanging); + pgc.PropertyChanged += new PropertyChangedEventHandler(pgc_PropertyChanged); + #endregion + } + + private void pnlSolutionExplorer_SelectionChanged(object sender, SolutionExplorerSelectionChangedEventArgs e) + { + pgc.Groups.Clear(); + if (e.SelectedItem is ProjectFile) + { + ProjectFile file = (e.SelectedItem as ProjectFile); + + PropertyCategory catAdvanced = new PropertyCategory("Advanced"); + + PropertyGroup group = pgc.Groups.Add(file.DestinationFileName); + + PropertyDataType pdtFileProperties = new PropertyDataType("File Properties"); + + Property propBuildAction = new Property("Build Action"); + + PropertyDataType dtBuildAction = new PropertyDataType("BuildAction"); + dtBuildAction.Choices.Add(new PropertyDataTypeChoice("Compile")); + dtBuildAction.Choices.Add(new PropertyDataTypeChoice("Content")); + dtBuildAction.Choices.Add(new PropertyDataTypeChoice("Embedded Resource")); + propBuildAction.DataType = dtBuildAction; + propBuildAction.Category = catAdvanced; + pdtFileProperties.Properties.Add(propBuildAction); + group.DataType = pdtFileProperties; + + pgc.SelectedGroupIndex = 0; + } + } + + private void pgc_PropertyChanging(object sender, PropertyChangingEventArgs e) + { + + } + private void pgc_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + + } + + private void _AppendText(string text) + { + wndOutputWindow.AppendText(text); + } + private void _ClearText(string text) + { + wndOutputWindow.ClearText(); + } + + private void OutputWindow_TextWritten(object sender, TextWrittenEventArgs e) + { + if (wndOutputWindow != null) + { + wndOutputWindow.Invoke(new Action(_AppendText), e.Text); + } + } + private void OutputWindow_TextCleared(object sender, EventArgs e) + { + if (wndOutputWindow != null) + { + wndOutputWindow.Invoke(new Action(_ClearText)); + } + } + + private SolutionObjectModel mvarCurrentSolution = null; + public SolutionObjectModel CurrentSolution { get { return mvarCurrentSolution; } set { mvarCurrentSolution = value; RefreshSolution(); } } + + private ProjectObjectModel mvarCurrentProject = null; + public ProjectObjectModel CurrentProject { get { return mvarCurrentProject; } set { mvarCurrentProject = value; RefreshProject(); } } + + private void RefreshSolution() + { + pnlSolutionExplorer.Solution = mvarCurrentSolution; + + if (mvarCurrentSolution == null) + { + AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme theme = (AwesomeControls.Theming.Theme.CurrentTheme as AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme); + if (theme != null) + { + theme.SetStatusBarState(AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme.StatusBarState.Initial); + sbStatusBar.Refresh(); + } + return; + } + else + { + AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme theme = (AwesomeControls.Theming.Theme.CurrentTheme as AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme); + if (theme != null) + { + theme.SetStatusBarState(AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme.StatusBarState.SolutionLoaded); + sbStatusBar.Refresh(); + } + } + + } + + #region Editor-Specific Menus + // TODO: Implement Editor-Specific Menus!! + private List mvarEditorSpecificToolbars = new List(); + private void RecursiveLoadCustomToolbar(Toolbar toolbar) + { + AwesomeControls.CommandBars.CBToolBar cbt = new AwesomeControls.CommandBars.CBToolBar(); + cbt.Text = toolbar.Title; + cbt.Tag = toolbar; + foreach (UniversalEditor.UserInterface.MenuItem mi in toolbar.Items) + { + RecursiveLoadCustomToolbarMenuItem(mi, cbt); + } + cbt.Top = cbc.TopToolStripPanel.Height; + cbc.TopToolStripPanel.Controls.Add(cbt); + + // TODO: Add the "View->Toolbars" option for this toolbar to let the user show/hide it... + + mvarEditorSpecificToolbars.Add(cbt); + } + private void RecursiveLoadCustomToolbarMenuItem(UniversalEditor.UserInterface.MenuItem mi, AwesomeControls.CommandBars.CBToolBar cbt) + { + if (mi is ActionMenuItem) + { + ActionMenuItem ami = (mi as ActionMenuItem); + ToolStripItem tsi = GetToolStripButtonFromUniversalMenuItem(ami); + // tsi.Image = ami.Image; + switch (ami.DisplayStyle) + { + case CommandDisplayStyle.None: + { + tsi.DisplayStyle = ToolStripItemDisplayStyle.None; + break; + } + case CommandDisplayStyle.ImageOnly: + { + tsi.DisplayStyle = ToolStripItemDisplayStyle.Image; + break; + } + case CommandDisplayStyle.ImageAndText: + { + tsi.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; + break; + } + case CommandDisplayStyle.TextOnly: + { + tsi.DisplayStyle = ToolStripItemDisplayStyle.Text; + break; + } + } + cbt.Items.Add(tsi); + } + } + + public void RefreshCommand(object nativeCommandObject) + { + if (nativeCommandObject is ToolStripItem) + { + ToolStripItem tsi = (nativeCommandObject as ToolStripItem); + UniversalEditor.UserInterface.MenuItem mi = (tsi.Tag as UniversalEditor.UserInterface.MenuItem); + tsi.Enabled = mi.Enabled; + tsi.Visible = mi.Visible; + } + } + + private List mvarEditorSpecificMenuItems = new List(); + private void RecursiveLoadCustomMenuItems(UniversalEditor.UserInterface.MenuItem item, ToolStripDropDownItem tsiParent = null) + { + if (item is ActionMenuItem) + { + ActionMenuItem ami = (item as ActionMenuItem); + ToolStripMenuItem tsmi = null; + + if (tsiParent != null && tsiParent.DropDownItems.ContainsKey(item.Name) && tsiParent.DropDownItems[item.Name] is ToolStripMenuItem) + { + tsmi = (tsiParent.DropDownItems[item.Name] as ToolStripMenuItem); + foreach (UniversalEditor.UserInterface.MenuItem mi in ami.Items) + { + RecursiveLoadCustomMenuItems(mi, tsmi); + } + } + else if (mbMenuBar.Items.ContainsKey(item.Name) && mbMenuBar.Items[item.Name] is ToolStripMenuItem) + { + tsmi = (mbMenuBar.Items[item.Name] as ToolStripMenuItem); + foreach (UniversalEditor.UserInterface.MenuItem mi in ami.Items) + { + RecursiveLoadCustomMenuItems(mi, tsmi); + } + } + else + { + tsmi = GetToolStripMenuItemFromUniversalMenuItem(ami); + if (tsiParent == null) + { + if (ami.Position < 0) + { + mbMenuBar.Items.Insert(mbMenuBar.Items.Count + (ami.Position + 1), tsmi); + } + else + { + mbMenuBar.Items.Insert(ami.Position, tsmi); + } + } + else + { + if (ami.Position < 0) + { + tsiParent.DropDownItems.Insert(tsiParent.DropDownItems.Count + (ami.Position + 1), tsmi); + } + else + { + int pos = ami.Position; + if (pos > tsiParent.DropDownItems.Count) + { + pos = tsiParent.DropDownItems.Count; + } + tsiParent.DropDownItems.Insert(pos, tsmi); + } + } + mvarEditorSpecificMenuItems.Add(tsmi); + } + + + ami.NativeControls.Add(tsmi); + } + else if (item is SeparatorMenuItem) + { + SeparatorMenuItem smi = (item as SeparatorMenuItem); + ToolStripSeparator tsmi = new ToolStripSeparator(); + if (tsiParent == null) + { + mbMenuBar.Items.Insert(smi.Position, tsmi); + } + else + { + int pos = smi.Position; + if (pos > tsiParent.DropDownItems.Count) pos = tsiParent.DropDownItems.Count; + tsiParent.DropDownItems.Insert(pos, tsmi); + } + mvarEditorSpecificMenuItems.Add(tsmi); + + smi.NativeControls.Add(tsmi); + } + } + + private ToolStripMenuItem GetToolStripMenuItemFromUniversalMenuItem(ActionMenuItem ami) + { + ToolStripMenuItem tsmi = new ToolStripMenuItem(); + tsmi.Name = ami.Name; + + Editor currentEditor = GetCurrentWindowsFormsEditor(); + string imagePath = currentEditor.DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "Images" + System.IO.Path.DirectorySeparatorChar.ToString() + "Commands" + System.IO.Path.DirectorySeparatorChar.ToString() + ami.Name + ".png"; + if (System.IO.File.Exists(imagePath)) tsmi.Image = Image.FromFile(imagePath); + + tsmi.Enabled = ami.Enabled; + tsmi.Visible = ami.Visible; + tsmi.Text = ami.Title; + tsmi.Tag = ami; + tsmi.Click += tsmiEditorSpecificMenuItem_Click; + foreach (UniversalEditor.UserInterface.MenuItem mi in ami.Items) + { + RecursiveLoadCustomMenuItems(mi, tsmi); + } + return tsmi; + } + private ToolStripItem GetToolStripButtonFromUniversalMenuItem(ActionMenuItem ami) + { + ToolStripItem tsi = null; + if (ami.Items.Count == 0) + { + tsi = new ToolStripButton(); + tsi.Click += tsmiEditorSpecificToolBarButton_Click; + } + else + { + ToolStripSplitButton tsb = new ToolStripSplitButton(); + foreach (UniversalEditor.UserInterface.MenuItem mi in ami.Items) + { + RecursiveLoadCustomMenuItems(mi, tsb); + } + tsb.ButtonClick += tsmiEditorSpecificToolBarButton_Click; + + tsi = tsb; + } + + Editor currentEditor = GetCurrentWindowsFormsEditor(); + string imagePath = currentEditor.DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "Images" + System.IO.Path.DirectorySeparatorChar.ToString() + "Commands" + System.IO.Path.DirectorySeparatorChar.ToString() + ami.Name + ".png"; + if (System.IO.File.Exists(imagePath)) tsi.Image = Image.FromFile(imagePath); + + tsi.Enabled = ami.Enabled; + tsi.Visible = ami.Visible; + tsi.Text = ami.Title; + tsi.Tag = ami; + return tsi; + } + + private void tsmiEditorSpecificMenuItem_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + ActionMenuItem ami = (tsmi.Tag as ActionMenuItem); + ami.OnClick(e); + } + private void tsmiEditorSpecificToolBarButton_Click(object sender, EventArgs e) + { + ToolStripButton tsb = (sender as ToolStripButton); + ActionMenuItem ami = (tsb.Tag as ActionMenuItem); + ami.OnClick(e); + } + #endregion + + private void RefreshProject() + { + } + + /// + /// Causes the application to refresh the current document view, including any + /// document-specific menus and toolbars. + /// + public void RefreshDocument() + { + mnuFileSaveFile.Enabled = (CurrentDocument != null); + mnuFileSaveFileAs.Enabled = (CurrentDocument != null); + + mnuFileCloseFile.Enabled = (dcc.SelectedWindow != null); + + mnuEditCut.Enabled = (CurrentDocument != null); + mnuEditCopy.Enabled = (CurrentDocument != null); + mnuEditPaste.Enabled = (CurrentDocument != null); + mnuEditDelete.Enabled = (CurrentDocument != null); + + mnuBookmarksAdd.Enabled = (CurrentDocument != null); + + #region Remove Editor-Specific Menus and Toolbars + mnuViewToolbars.DropDownItems.Clear(); + + foreach (ToolStrip tb in mvarEditorSpecificToolbars) + { + tb.Parent.Controls.Remove(tb); + } + mvarEditorSpecificToolbars.Clear(); + + foreach (ToolStripItem tsi in mvarEditorSpecificMenuItems) + { + ToolStrip parent = tsi.Owner; + if (parent != null) + { + parent.Items.Remove(tsi); + } + } + mvarEditorSpecificMenuItems.Clear(); + #endregion + #region Remove Editor-Specific Property Pages + pgc.Groups.Clear(); + #endregion + + if (CurrentDocument != null) + { + Editor editor = GetCurrentWindowsFormsEditor(); + if (editor != null) + { + foreach (UniversalEditor.UserInterface.MenuItem mi in editor.MenuBar.Items) + { + RecursiveLoadCustomMenuItems(mi); + } + foreach (Toolbar tb in editor.Toolbars) + { + RecursiveLoadCustomToolbar(tb); + + ToolStripMenuItem mnuViewToolbarsToolbar = new ToolStripMenuItem(); + mnuViewToolbarsToolbar.Text = tb.Title; + mnuViewToolbarsToolbar.Checked = tb.Visible; + mnuViewToolbars.DropDownItems.Add(mnuViewToolbarsToolbar); + } + } + + lblObjectModel.Text = CurrentDocument.ObjectModel.MakeReference().Title; + lblObjectModel.Visible = true; + + if (CurrentDocument.DataFormat != null) + { + mnuContextDocumentTypeDataFormat.Text = CurrentDocument.DataFormat.MakeReference().Title; + } + else + { + mnuContextDocumentTypeDataFormat.Text = "(unsaved)"; + } + + mnuContextDocumentType.Items.Clear(); + mnuContextDocumentType.Items.Add(mnuContextDocumentTypeDataFormat); + + if (CurrentDocument.InputDataFormat != null) + { + mnuContextDocumentType.Items.Add(mnuContextDocumentTypeSep1); + + foreach (ObjectModelReference omr in UniversalEditor.Common.Reflection.GetAvailableObjectModels(CurrentDocument.InputDataFormat.MakeReference())) + { + ToolStripMenuItem mnu = new ToolStripMenuItem(); + mnu.Text = omr.Title; + mnu.Tag = omr; + mnu.Click += new EventHandler(mnuSwitchObjectModel_Click); + if (omr.Type == CurrentDocument.ObjectModel.GetType()) + { + mnu.Checked = true; + } + mnuContextDocumentType.Items.Add(mnu); + } + } + } + else + { + lblObjectModel.Visible = false; + } + + if (mnuViewToolbars.DropDownItems.Count > 0) mnuViewToolbars.DropDownItems.Add(mnuViewToolbarsSep1); + mnuViewToolbars.DropDownItems.Add(mnuViewToolbarsCustomize); + } + + private void mnuSwitchObjectModel_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + ObjectModelReference omr = (tsmi.Tag as ObjectModelReference); + + MessageBox.Show("Implement switching the current ObjectModel to \"" + omr.Title + "\"!", "Not Implemented", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + private Document mvarCurrentDocument = null; + public Document CurrentDocument + { + get { return mvarCurrentDocument; } + } + + private void UpdatePreferencesMenu() + { + switch (Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + case PlatformID.Unix: + { + mnuEditPreferences.Visible = true; + mnuEditSep4.Visible = true; + + mnuToolsOptions.Visible = false; + break; + } + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + case PlatformID.Xbox: + { + mnuEditPreferences.Visible = false; + mnuEditSep4.Visible = false; + + mnuToolsOptions.Visible = true; + break; + } + } + } + + #region Implementation + public void ToggleMenuItemEnabled(string MenuItemName, bool Enabled) + { + MessageBox.Show("ToggleMenuItemEnabled(\"" + MenuItemName + "\"): not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + public void NewFile() + { + NewDialog dlg = new NewDialog(); + dlg.Mode = NewDialogMode.File; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + DocumentTemplate template = (dlg.SelectedItem as DocumentTemplate); + if (template == null) return; + + Pages.EditorPage page = new Pages.EditorPage(); + page.DocumentEdited += page_DocumentEdited; + page.Title = ""; + + ObjectModel objm = template.ObjectModelReference.Create(); + if (objm == null) + { + MessageBox.Show("Failed to create an ObjectModel for the type \"" + template.ObjectModelReference.TypeName + "\"", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + page.Document = new Document(objm, null, null); + DockingWindow dwNewDocument = dcc.Windows.Add("", "", page); + dwNewDocument.Behavior = DockBehavior.Dock; + + dcc.Areas[DockPosition.Center].Areas[DockPosition.Center].Windows.Add(dwNewDocument); + + /* + Glue.ApplicationEventEventArgs ae = new Glue.ApplicationEventEventArgs(Glue.Common.Constants.EventNames.AfterCreateFile, + new KeyValuePair("ObjectModel", objm) + ); + + Glue.Common.Methods.SendApplicationEvent(ae); + */ + } + } + public void NewProject(bool combineObjects = false) + { + NewDialog dlg = new NewDialog(); + dlg.Mode = NewDialogMode.Project; + dlg.CombineObjects = combineObjects; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + SolutionObjectModel solution = null; + + ProjectTemplate pjt = (dlg.SelectedItem as ProjectTemplate); + if (dlg.CombineObjects) + { + solution = CurrentSolution; + } + else + { + // Create the project + solution = new SolutionObjectModel(); + solution.Title = dlg.SolutionTitle; + } + + ProjectObjectModel project = pjt.Create(); + project.ID = Guid.NewGuid(); + project.Title = dlg.ProjectTitle; + solution.Projects.Add(project); + + CurrentSolution = solution; + } + } + + public void OpenFile() + { + DocumentPropertiesDialog dlg = new DocumentPropertiesDialog(); + dlg.Mode = DocumentPropertiesDialogMode.Open; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + OpenFile(new Document(dlg.ObjectModel, dlg.DataFormat, dlg.Accessor)); + } + } + public void OpenFile(params string[] fileNames) + { + Document[] documents = new Document[fileNames.Length]; + for (int i = 0; i < documents.Length; i++) + { + documents[i] = new Document(null, null, new FileAccessor(fileNames[i])); + } + OpenFile(documents); + } + public void OpenFile(params Document[] documents) + { + foreach (Document doc in documents) + { + OpenFile(doc, false); + } + } + public void OpenFile(Document document, bool reuseTab) + { + Pages.EditorPage page = new Pages.EditorPage(); + if (reuseTab && dcc.SelectedWindow != null) + { + } + else + { + DockingWindow wnd = dcc.Windows.Add(document.Accessor.GetFileTitle(), page); + dcc.Areas[DockPosition.Center].Areas[DockPosition.Center].Windows.Add(wnd); + } + + page.OpenFile(document); + page.FileOpened += page_FileOpened; + } + + private void page_FileOpened(object sender, EventArgs e) + { + RefreshDocument(); + } + + /* + private void OpenFileInternal(string Path, bool reuseTab = false) + { +#if !DEBUG + try + { +#endif + Glue.ApplicationEventEventArgs e = new Glue.ApplicationEventEventArgs(Glue.Common.Constants.EventNames.BeforeOpenFile, + new KeyValuePair("FileName", Path) + ); + Glue.Common.Methods.SendApplicationEvent(e); + + if (e.CancelApplication) return; + + string[] FileNameParts = Path.Split(new string[] { "::/" }, 2, StringSplitOptions.None); + string FileName = FileNameParts[0]; + string SecondaryFileName = String.Empty; + if (FileNameParts.Length > 1) SecondaryFileName = FileNameParts[1]; + + if (System.IO.Directory.Exists(FileName)) + { + Pages.ExplorerPage page = new Pages.ExplorerPage(); + page.Navigate += page_Navigate; + page.Path = FileName; + mdcc.Documents.Add(System.IO.Path.GetFileName(FileName), Path, page); + } + else if (!System.IO.File.Exists(FileName)) + { + return; + } + else + { + +#if HANDLER + HandlerReference[] handlers = UniversalEditor.Common.Reflection.GetAvailableHandlers(FileName); + if (handlers.Length == 1) + { + } + else + { + foreach (HandlerReference hr in handlers) + { + FileHandler fh = (hr.Create() as FileHandler); + if (fh == null) continue; + + // got an object model/data format pair for this handler + } + } +#endif + + + Pages.EditorPage page = new Pages.EditorPage(); + page.OpenFile(FileName); + mdcc.Documents.Add(System.IO.Path.GetFileName(FileName), page); + + } + + // Add the file name to the list of recently-opened files + if (!RecentFileManager.FileNames.Contains(FileName)) + { + if (RecentFileManager.FileNames.Count >= RecentFileManager.MaximumDocumentFileNames) + { + RecentFileManager.FileNames.RemoveAt(0); + } + RecentFileManager.FileNames.Insert(RecentFileManager.FileNames.Count, FileName); + RefreshRecentFilesList(); + } +#if !DEBUG + } + catch (System.IO.IOException ex) + { + MessageBox.Show("Could not open the file. " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } +#endif + } + */ + + /// + /// Opens the specified file from a + /// and marks the parent file as changed when the file is + /// changed. + /// + /// The child file to open. + /// The file name of the parent file. + private void OpenFileInternal(ObjectModels.FileSystem.File file, string FileName) + { + Pages.EmbeddedEditorPage page = new Pages.EmbeddedEditorPage(); + // page.DocumentEdited += new EventHandler(page_DocumentEdited); + page.Title = file.Name; + page.Description = FileName + "::/" + file.Name; + + byte[] data = file.GetData(); + MemoryAccessor ma = new MemoryAccessor(data); + + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(ma); + foreach (DataFormatReference dfr in dfrs) + { + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(dfr); + + DataFormat df = dfr.Create(); + ObjectModel om = omrs[0].Create(); + + page.Document = new Document(om, df, ma); + // page.DocumentEdited += page_DocumentEdited; + page.Document.InputAccessor.Open(); + page.Document.Load(); + page.Document.IsSaved = true; + + dcc.Windows.Add(System.IO.Path.GetFileName(file.Name), FileName + "::/" + file.Name, page); + break; + } + + /* + DataFormatReference dfr = fmt.MakeReference(); + if (dfr.ImportOptions.Count > 0) + { + DataFormatOptionsDialog dlg = new DataFormatOptionsDialog(); + dlg.DialogType = DataFormatOptionsDialogType.Import; + dlg.DataFormat = fmt; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) return; + } + + FileAccessor fa = new FileAccessor(objm, fmt); + file.Open(file.GetDataAsByteArray()); + file.Load(); + // file.Close(); + + page.Document = new Document(file, objm, fmt); + page.DocumentEdited += page_DocumentEdited; + page.Document.IsSaved = true; + page.Document.FileName = FileName; + + mdcc.Documents.Add(System.IO.Path.GetFileName(FileName), FileName, page); + + Glue.ApplicationEventEventArgs e = new Glue.ApplicationEventEventArgs(Glue.Common.Constants.EventNames.AfterOpenFile, + new KeyValuePair("FileName", FileName), + new KeyValuePair("DataFormat", fmt), + new KeyValuePair("ObjectModel", objm) + ); + + Glue.Common.Methods.SendApplicationEvent(e); + */ + } + /* + private void OpenFileInternal(string FileName, ObjectModel objm, DataFormat fmt) + { + retryOpen: + Pages.EditorPage page = new Pages.EditorPage(); + // page.DocumentEdited += new EventHandler(page_DocumentEdited); + page.FileName = FileName; + + if (!this.Visible) this.Show(); + + DataFormatReference dfr = fmt.MakeReference(); + if (dfr.ImportOptions.Count > 0) + { + DataFormatOptionsDialog dlg = new DataFormatOptionsDialog(); + dlg.DialogType = DataFormatOptionsDialogType.Import; + dlg.DataFormat = fmt; + if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.Cancel) return; + } + + FileAccessor file = new FileAccessor(objm, fmt); + objm.Clear(); + + try + { + file.Open(FileName); + file.Load(); + } + catch (DataFormatOptionArgumentException ex) + { + file.Close(); + + if (MessageBox.Show("One or more of the parameters you specified is invalid. Please ensure you have provided the correct parameters, and then try again.\r\n\r\n" + ex.Message, "Invalid Parameters Specified", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == System.Windows.Forms.DialogResult.Retry) goto retryOpen; + return; + } + catch (DataCorruptedException ex) + { + file.Close(); + + MessageBox.Show("The file is corrupted.", "Corrupt File", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + // file.Close(); + + page.Document = new Document(file, objm, fmt); + page.DocumentEdited += page_DocumentEdited; + page.Document.IsSaved = true; + page.Document.FileName = FileName; + + mdcc.Documents.Add(System.IO.Path.GetFileName(FileName), FileName, page); + + Glue.ApplicationEventEventArgs e = new Glue.ApplicationEventEventArgs(Glue.Common.Constants.EventNames.AfterOpenFile, + new KeyValuePair("FileName", FileName), + new KeyValuePair("DataFormat", fmt), + new KeyValuePair("ObjectModel", objm) + ); + + Glue.Common.Methods.SendApplicationEvent(e); + } + */ + + public void OpenProject(bool combineObjects = false) + { + SolutionObjectModel solution = new SolutionObjectModel(); + OpenFileDialog ofd = new OpenFileDialog(); + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { ObjectModel = solution.MakeReference() }); + ofd.Filter = UniversalEditor.UserInterface.WindowsForms.CommonDialog.GetCommonDialogFilter(assocs); + ofd.Multiselect = false; + if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + OpenProject(ofd.FileName, combineObjects); + } + } + public void OpenProject(string FileName, bool combineObjects = false) + { + FileAccessor fa = new FileAccessor(FileName); + + SolutionObjectModel solution = UniversalEditor.Common.Reflection.GetAvailableObjectModel(fa); + if (combineObjects) + { + SolutionObjectModel oldsolution = CurrentSolution; + solution.CopyTo(oldsolution); + CurrentSolution = oldsolution; + } + else + { + CurrentSolution = solution; + } + } + + public void SaveFile() + { + if (CurrentDocument != null) + { + SaveDocument(CurrentDocument); + } + } + + public Editor[] GetEditorsForDocument(Document doc) + { + List editors = new List(); + foreach (AwesomeControls.DockingWindows.DockingWindow mdc in dcc.Windows) + { + if (mdc.Control is Pages.EditorPage) + { + if ((mdc.Control as Pages.EditorPage).Document == doc) + { + Pages.EditorPage page = (mdc.Control as Pages.EditorPage); + if (page.Controls.Count > 0) + { + if (page.Controls[0] is Editor) + { + editors.Add(page.Controls[0] as Editor); + } + else if (page.Controls[0] is TabControl) + { + foreach (TabPage tab in (page.Controls[0] as TabControl).TabPages) + { + if (tab.Controls[0] is Editor) + { + editors.Add(tab.Controls[0] as Editor); + } + } + } + } + } + } + } + return editors.ToArray(); + } + + private void NotifySaving(Document doc) + { + Editor[] editors = GetEditorsForDocument(doc); + foreach (Editor editor in editors) + { + editor.NotifySaving(); + } + } + + public void SaveFileAs() + { + if (CurrentDocument != null) + { + SaveDocumentAs(CurrentDocument); + } + } + public void SaveFileAs(string FileName, DataFormat format) + { + if (CurrentDocument != null) + { + CurrentDocument.DataFormat = format; + SaveDocumentAs(CurrentDocument, FileName); + } + } + + public void SaveProject() + { + SaveProjectAs(); + } + public void SaveProjectAs() + { + if (mvarCurrentSolution == null) + { + return; + } + + List refs = new List(); + SaveFileDialog sfd = new SaveFileDialog(); + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { ObjectModel = mvarCurrentSolution.MakeReference() }); + sfd.Filter = UniversalEditor.UserInterface.WindowsForms.CommonDialog.GetCommonDialogFilter(assocs); + sfd.FileName = mvarCurrentSolution.Title + ".sln"; + if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(sfd.FileName); + SaveProjectAs(sfd.FileName, dfrs[0].Create()); + } + } + public void SaveProjectAs(string FileName, DataFormat df) + { + if (CurrentSolution != null) + { + Document.Save(CurrentSolution, df, new FileAccessor(FileName, true, true), true); + } + } + public void SaveAll() + { + MessageBox.Show("Not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + private bool SaveDocument(Document doc) + { + if (doc.Accessor == null) + { + // The accessor is null, so display the save as dialog + return SaveDocumentAs(doc); + } + + doc.Close(); + doc.OutputAccessor.Open(); + doc.Save(); + return true; + } + private bool SaveDocumentAs(Document doc, string FileName = null) + { + DataFormatReference dfr = null; + + retrySaveFileAs: + if (FileName == null) + { + DocumentPropertiesDialog dlg = new DocumentPropertiesDialog(); + dlg.ObjectModel = doc.ObjectModel; + dlg.DataFormat = doc.DataFormat; + dlg.Accessor = doc.Accessor; + dlg.Mode = DocumentPropertiesDialogMode.Save; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + dfr = dlg.DataFormat.MakeReference(); + + // TODO: Rewrite Save code to make everything use Accessor instead + // of FileName to support multiple types of accessors + FileName = (dlg.Accessor as FileAccessor).FileName; + } + else + { + return false; + } + + /* + SaveFileDialog sfd = new SaveFileDialog(); + + List list = new List(); + sfd.Filter = UniversalEditor.Common.Dialog.GetCommonDialogFilter(doc.ObjectModel.MakeReference(), out list); + + if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) + { + return false; + } + + if (sfd.FilterIndex > 1 && sfd.FilterIndex <= list.Count + 1) + { + dfr = list[sfd.FilterIndex - 2]; + } + FileName = sfd.FileName; + */ + } + /* + if (dfr == null) + { + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(FileName, doc.ObjectModel.MakeReference()); + if (dfrs.Length == 0) + { + if (MessageBox.Show("Could not determine the data format to use to save the file. Please check to see that you typed the file extension correctly.", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == System.Windows.Forms.DialogResult.Retry) + { + FileName = null; + goto retrySaveFileAs; + } + else + { + return false; + } + } + dfr = dfrs[0]; + } + */ + + DataFormat df = dfr.Create(); + if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref df, CustomOptionDialogType.Export)) + { + return false; + } + + #region Save Code + NotifySaving(doc); + + if (FileName == doc.Title && doc.Accessor != null) + { + doc.Accessor.Close(); + } + + doc.DataFormat = df; + doc.OutputAccessor = new FileAccessor(FileName, true, true, true); + doc.Save(); + + dcc.SelectedWindow.Title = System.IO.Path.GetFileName(FileName); + doc.IsSaved = true; + #endregion + return true; + } + + public void SwitchPerspective(int index) + { + MessageBox.Show("Switching to perspective " + index.ToString() + " has not been implemented yet!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + /* + private bool SaveDocument(Document doc) + { + if (!doc.IsSaved) + { + return SaveDocumentAs(doc); + } + else + { + #region Save Code + NotifySaving(doc); + + if (doc.Accessor != null) doc.Accessor.Close(); + + doc.OutputAccessor = new FileAccessor(doc) + FileAccessor file = new FileAccessor(doc.ObjectModel, doc.DataFormat); + file.AllowWrite = true; + file.ForceOverwrite = true; + + file.Open(doc.FileName); + file.Save(); + doc.Accessor = file; + + dcc.SelectedWindow.Title = System.IO.Path.GetFileName(doc.FileName); + doc.IsSaved = true; + #endregion + } + return true; + } + public bool SaveDocumentAs(Document doc, string FileName = null) + { + DataFormatReference dfr = null; + + retrySaveFileAs: + if (FileName == null) + { + SaveFileDialog sfd = new SaveFileDialog(); + + List list = new List(); + sfd.Filter = UniversalEditor.Common.Dialog.GetCommonDialogFilter(doc.ObjectModel.MakeReference(), out list); + + if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) + { + return false; + } + + if (sfd.FilterIndex > 1 && sfd.FilterIndex <= list.Count + 1) + { + dfr = list[sfd.FilterIndex - 2]; + } + FileName = sfd.FileName; + } + + if (dfr == null) + { + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(FileName, doc.ObjectModel.MakeReference()); + if (dfrs.Length == 0) + { + if (MessageBox.Show("Could not determine the data format to use to save the file. Please check to see that you typed the file extension correctly.", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == System.Windows.Forms.DialogResult.Retry) + { + FileName = null; + goto retrySaveFileAs; + } + else + { + return false; + } + } + dfr = dfrs[0]; + } + + DataFormat df = dfr.Create(); + DataFormatOptionsDialog.ShowDialog(ref df, DataFormatOptionsDialogType.Export); + + #region Save Code + NotifySaving(doc); + + if (FileName == doc.FileName && doc.Accessor != null) + { + doc.Accessor.Close(); + } + + + doc.DataFormat = df; + + FileAccessor file = new FileAccessor(doc.ObjectModel, doc.DataFormat); + file.AllowWrite = true; + file.ForceOverwrite = true; + file.Open(FileName); + file.Save(); + doc.Accessor = file; + + dcc.SelectedWindow.Title = System.IO.Path.GetFileName(FileName); + doc.FileName = FileName; + doc.IsSaved = true; + #endregion + return true; + } + */ + + public void Undo() + { + Editor current = GetCurrentWindowsFormsEditor(); + if (current == null) return; + current.Undo(); + } + public void Redo() + { + Editor current = GetCurrentWindowsFormsEditor(); + if (current == null) return; + current.Redo(); + } + + /// + /// Copies the currently selected item in the current editor + /// onto the clipboard, and then deletes it. This will + /// overwrite the data currently on the Windows clipboard, and + /// append the data currently on the Universal Editor + /// clipboard. + /// + public void Cut() + { + MessageBox.Show("Not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + /// + /// Copies the currently selected item in the current editor + /// onto the clipboard. This will overwrite the data currently + /// on the Windows clipboard, and append the data currently on + /// the Universal Editor clipboard. + /// + public void Copy() + { + MessageBox.Show("Not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + /// + /// Pastes the data currently on the Windows clipboard into the + /// current editor. + /// + public void Paste() + { + MessageBox.Show("Not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + /// + /// Deletes the currently selected item in the current editor. + /// + public void Delete() + { + MessageBox.Show("Not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + public IEditorImplementation GetCurrentEditor() + { + return GetCurrentWindowsFormsEditor(); + } + public Editor GetCurrentWindowsFormsEditor() + { + if (dcc.SelectedWindow == null) return null; + Pages.EditorPage editorPage = (dcc.SelectedWindow.Control as Pages.EditorPage); + if (editorPage == null) return null; + + if (editorPage.Controls.Count < 1) return null; + + Editor current = null; + if (editorPage.Controls[editorPage.Controls.Count - 1] is TabControl) + { + TabControl tbs = (editorPage.Controls[editorPage.Controls.Count - 1] as TabControl); + current = (tbs.SelectedTab.Controls[0] as Editor); + } + else + { + current = (editorPage.Controls[editorPage.Controls.Count - 1] as Editor); + } + return current; + } + + + #region Project + public void AddSolutionProjectNew() + { + NewProject(true); + } + public void AddSolutionProjectExisting() + { + OpenProject(true); + } + public void AddProjectItemNew() + { + + } + public void AddProjectItemExisting() + { + + } + #endregion + #endregion + + #region Event Handlers + #region Window + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + + if (!WindowsFormsEngine.SessionLoading && Engine.CurrentEngine.Windows.Count == 1) + { + if (Engine.CurrentEngine.ConfigurationManager.GetValue(new string[] { "Application", "ConfirmExit" }, false)) + { + if (MessageBox.Show("Are you sure you wish to quit " + Engine.CurrentEngine.DefaultLanguage.GetStringTableEntry("ApplicationTitle") + "?", "Quit Application", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) + { + e.Cancel = true; + return; + } + } + } + + List unsavedDocuments = new List(); + foreach (AwesomeControls.DockingWindows.DockingWindow doc in dcc.Windows) + { + if (doc.Control is Pages.EditorPage) + { + Pages.EditorPage page = (doc.Control as Pages.EditorPage); + if (page.Document != null && !page.Document.IsSaved) + { + unsavedDocuments.Add(page.Document); + } + } + } + + if (unsavedDocuments.Count > 0) + { + UnsavedDocumentsDialog dlg = new UnsavedDocumentsDialog(); + foreach (Document d in unsavedDocuments) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = System.IO.Path.GetFileName(d.Title); + lvi.Data = d; + + AwesomeControls.ListView.ListViewDetailChoice choice = new AwesomeControls.ListView.ListViewDetailChoice(); + choice.Options.Add("Save", UnsavedDocumentOption.Save); + choice.Options.Add("Discard", UnsavedDocumentOption.Discard); + choice.SelectedOption = choice.Options[0]; + lvi.Details.Add(choice); + + dlg.lv.Items.Add(lvi); + } + switch (dlg.ShowDialog()) + { + case System.Windows.Forms.DialogResult.Yes: + { + foreach (AwesomeControls.ListView.ListViewItem lvi in dlg.lv.Items) + { + Document d = (lvi.Data as Document); + AwesomeControls.ListView.ListViewDetailChoice choice = (lvi.Details[0] as AwesomeControls.ListView.ListViewDetailChoice); + if (choice.SelectedOption != null) + { + switch ((UnsavedDocumentOption)choice.SelectedOption.Value) + { + case UnsavedDocumentOption.Save: + { + SaveDocument(d); + break; + } + case UnsavedDocumentOption.Discard: + { + break; + } + } + } + } + break; + } + case System.Windows.Forms.DialogResult.No: + { + break; + } + case System.Windows.Forms.DialogResult.Cancel: + { + e.Cancel = true; + break; + } + } + } + } + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + if (WindowClosed != null) WindowClosed(this, e); + + if (Engine.CurrentEngine.Windows.Count == 0) + { + // there are no more windows, so exit the application + Application.Exit(); + } + } + #endregion + #region Menu Bar + #region File + private void FileNewFile_Click(object sender, EventArgs e) + { + NewFile(); + } + private void FileNewProject_Click(object sender, EventArgs e) + { + NewProject(); + } + + #region Save + private void FileSaveFile_Click(object sender, EventArgs e) + { + SaveFile(); + } + private void FileSaveFileAs_Click(object sender, EventArgs e) + { + SaveFileAs(); + } + private void FileSaveProject_Click(object sender, EventArgs e) + { + SaveProject(); + } + private void FileSaveProjectAs_Click(object sender, EventArgs e) + { + SaveProjectAs(); + } + private void FileSaveAll_Click(object sender, EventArgs e) + { + SaveAll(); + } + #endregion + #region Close + public void CloseFile() + { + if (dcc.SelectedWindow != null) + { + dcc.SelectedWindow.Close(); + } + else + { + CloseWindow(); + } + } + public void CloseProject() + { + CurrentSolution = null; + } + #endregion + private void FilePrint_Click(object sender, EventArgs e) + { + + } + private void mnuFileExit_Click(object sender, EventArgs e) + { + Application.Exit(); + } + #endregion + #region Edit + private void EditUndo_Click(object sender, EventArgs e) + { + Undo(); + } + + private void EditRedo_Click(object sender, EventArgs e) + { + Redo(); + } + + private void EditCut_Click(object sender, EventArgs e) + { + Cut(); + } + private void EditCopy_Click(object sender, EventArgs e) + { + Copy(); + } + private void EditPaste_Click(object sender, EventArgs e) + { + Paste(); + } + private void EditDelete_Click(object sender, EventArgs e) + { + Delete(); + } + #endregion + #region View + private void mnuViewFullScreen_Click(object sender, EventArgs e) + { + FullScreen = !FullScreen; + } + + private void mnuViewStatusBar_Click(object sender, EventArgs e) + { + sbStatusBar.Visible = mnuViewStatusBar.Checked; + } + + private void mnuViewToolbarsToolbar_Click(object sender, EventArgs e) + { + ToolStripMenuItem mnuViewToolbarsToolbar = (sender as ToolStripMenuItem); + Toolbar toolbar = (mnuViewToolbarsToolbar.Tag as Toolbar); + toolbar.Visible = !toolbar.Visible; + } + private void mnuViewToolbarsCustomize_Click(object sender, EventArgs e) + { + cbc.ShowCustomizeDialog(); + } + + #endregion + #region Project + private void mnuProjectAddNewItem_Click(object sender, EventArgs e) + { + AddProjectItemNew(); + } + + private void mnuProjectAddExistingItem_Click(object sender, EventArgs e) + { + AddProjectItemExisting(); + } + + private void mnuProjectExclude_Click(object sender, EventArgs e) + { + + } + + private void mnuProjectShowAllFiles_Click(object sender, EventArgs e) + { + + } + + private void mnuProjectProperties_Click(object sender, EventArgs e) + { + + } + #endregion + #endregion + #endregion + + #region Editor Page Events + private void page_DocumentEdited(object sender, EventArgs e) + { + Pages.EditorPage page = (sender as Pages.EditorPage); + AwesomeControls.DockingWindows.DockingWindow doc = dcc.Windows[page]; + if (doc == null) return; + + if (String.IsNullOrEmpty(page.Document.Title)) + { + doc.Title = " (*)"; + } + else + { + doc.Title = System.IO.Path.GetFileName(page.Document.Title) + " (*)"; + } + page.Document.IsChanged = true; + } + private void page_Navigate(object sender, NavigateEventArgs e) + { + // OpenFile(e.FileName, ((Control.ModifierKeys & Keys.Alt) != Keys.Alt)); + } + #endregion + + private bool mvarFullScreen = false; + public bool FullScreen + { + get { return mvarFullScreen; } + set + { + mvarFullScreen = value; + mnuViewFullScreen.Checked = mvarFullScreen; + + if (mvarFullScreen) + { + this.cbc.TopToolStripPanel.Visible = false; + this.cbc.BottomToolStripPanel.Visible = false; + this.cbc.LeftToolStripPanel.Visible = false; + this.cbc.RightToolStripPanel.Visible = false; + + tmrToolStripContainerPopup.Enabled = true; + + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.WindowState = FormWindowState.Maximized; + } + else + { + this.cbc.TopToolStripPanel.Visible = true; + this.cbc.BottomToolStripPanel.Visible = true; + this.cbc.LeftToolStripPanel.Visible = true; + this.cbc.RightToolStripPanel.Visible = true; + + tmrToolStripContainerPopup.Enabled = false; + + this.WindowState = FormWindowState.Normal; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable; + } + } + } + + #region Recent Files + private void AddRecentMenuItem(string FileName) + { + ToolStripMenuItem tsmi = new ToolStripMenuItem(); + tsmi.Click += new EventHandler(tsmiRecentFile_Click); + + tsmi.ToolTipText = FileName; + tsmi.Text = System.IO.Path.GetFileName(FileName); + + mnuFileRecentFiles.DropDownItems.Add(tsmi); + } + private void RefreshRecentFilesList() + { + mnuFileRecentFiles.DropDownItems.Clear(); + foreach (string fileName in Engine.CurrentEngine.RecentFileManager.FileNames) + { + AddRecentMenuItem(fileName); + } + + mnuFileRecentFiles.Visible = (mnuFileRecentFiles.DropDownItems.Count > 0); + mnuFileRecentProjects.Visible = (mnuFileRecentProjects.DropDownItems.Count > 0); + mnuFileSep3.Visible = ((mnuFileRecentFiles.DropDownItems.Count > 0) || (mnuFileRecentProjects.DropDownItems.Count > 0)); + } + private void tsmiRecentFile_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = (sender as ToolStripMenuItem); + if (!System.IO.File.Exists(tsmi.ToolTipText)) + { + if (MessageBox.Show("The file or folder '" + tsmi.ToolTipText + "' cannot be opened. Do you want to remove the reference(s) to it from the Recent list(s)?", "File Does Not Exist", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) + { + Engine.CurrentEngine.RecentFileManager.FileNames.Remove(tsmi.ToolTipText); + } + return; + } + OpenFile(new Document(null, null, new FileAccessor(tsmi.ToolTipText))); + } + #endregion + + public void ShowStartPage() + { + if (!Engine.CurrentEngine.ConfigurationManager.GetValue(new string[] { "Application", "StartPage", "Enabled" }, true)) + { + // Only show the start page if it's enabled + return; + } + + DockingWindow dwStartPage = dcc.Windows["pnlStartPage"]; + if (dwStartPage == null) + { + Pages.StartPage sp = new Pages.StartPage(); + sp.NewProjectClicked += delegate(object sender, EventArgs e) + { + Engine.CurrentEngine.Commands["FileNewProject"].Execute(); + }; + sp.OpenProjectClicked += delegate(object sender, EventArgs e) + { + Engine.CurrentEngine.Commands["FileOpenProject"].Execute(); + }; + + dwStartPage = dcc.Windows.Add("pnlStartPage", "Start Page", sp); + dcc.Areas[DockPosition.Center].Areas[DockPosition.Center].Windows.Add(dwStartPage); + } + dcc.SwitchTab(dwStartPage); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + if (e.KeyCode == Keys.D && e.Control && e.Alt) + { + cboAddress.Focus(); + e.Handled = true; + e.SuppressKeyPress = true; + } + else if (e.KeyCode == Keys.Alt) + { + + } + } + + public void SetWindowListVisible(bool visible, bool modal) + { + if (modal) + { + dcc.DisplayWindowListDialog(); + } + else + { + if (visible) + { + dcc.ShowWindowListPopupDialog(); + } + else + { + dcc.HideWindowListPopupDialog(); + } + } + } + + private void ToolsCustomize_Click(object sender, EventArgs e) + { + cbc.ShowCustomizeDialog(); + } + + private void ToolsOptions_Click(object sender, EventArgs e) + { + } + + private OptionsDialog dlgOptions = null; + public bool ShowOptionsDialog() + { + if (dlgOptions == null) dlgOptions = new OptionsDialog(); + if (dlgOptions.IsDisposed) dlgOptions = new OptionsDialog(); + if (dlgOptions.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + return true; + } + return false; + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + Glue.Common.Methods.InitializeCustomizableMenuItems(mbMenuBar); + + if (Engine.CurrentEngine.ConfigurationManager.GetValue(new string[] { "Application", "StartPage", "Enabled" }, true)) + { + if (Engine.CurrentEngine.ConfigurationManager.GetValue(new string[] { "Application", "StartPage", "ShowOnStartup" }, true)) + { + // Only show the start page if it's enabled + ShowStartPage(); + } + } + } + + protected override void OnActivated(EventArgs e) + { + base.OnActivated(e); + Engine.CurrentEngine.LastWindow = this; + HostApplication.CurrentWindow = this; + } + + private void tmrToolStripContainerPopup_Tick(object sender, EventArgs e) + { + Screen scr = Screen.FromControl(this); + + cbc.LeftToolStripPanel.Visible = (Cursor.Position.X >= scr.Bounds.X && Cursor.Position.X <= scr.Bounds.X + 4); + cbc.RightToolStripPanel.Visible = (Cursor.Position.X <= scr.Bounds.Right && Cursor.Position.X >= scr.Bounds.Right - 4); + cbc.TopToolStripPanel.Visible = ((cbc.TopToolStripPanel.Visible && Cursor.Position.Y <= cbc.TopToolStripPanel.Height) || (Cursor.Position.Y >= scr.Bounds.Y && Cursor.Position.Y <= scr.Bounds.Y + 4)); + cbc.BottomToolStripPanel.Visible = (Cursor.Position.Y <= scr.Bounds.Bottom && Cursor.Position.Y >= scr.Bounds.Bottom - 4); + } + + private void MainWindow_DragEnter(object sender, DragEventArgs e) + { + e.Effect = DragDropEffects.All; + if (e.Data.GetDataPresent("FileNameW")) + { + e.Effect = DragDropEffects.Link; + } + } + + private void MainWindow_DragDrop(object sender, DragEventArgs e) + { + string[] formats = e.Data.GetFormats(); + + if (e.Data.GetDataPresent("Rich Text Format")) + { + string rtf = (e.Data.GetData("Rich Text Format") as string); + + } + else if (e.Data.GetDataPresent("System.String")) + { + string rtf = (e.Data.GetData("System.String") as string); + } + else if (e.Data.GetDataPresent("UnicodeText")) + { + string rtf = (e.Data.GetData("UnicodeText") as string); + } + else if (e.Data.GetDataPresent("Text")) + { + string rtf = (e.Data.GetData("Text") as string); + } + else if (e.Data.GetDataPresent("FileNameW")) + { + string[] filenames = (e.Data.GetData("FileNameW") as string[]); + Document[] documents = new Document[filenames.Length]; + for (int i = 0; i < documents.Length; i++) + { + documents[i] = new Document(null, null, new FileAccessor(filenames[i])); + } + OpenFile(documents); + } + else if (e.Data.GetDataPresent("Shell IDList Array")) + { + System.IO.MemoryStream ms = (e.Data.GetData("Shell IDList Array") as System.IO.MemoryStream); + Reader br = new Reader(new StreamAccessor(ms)); + br.Accessor.Position = 0; + int unknown1 = br.ReadInt32(); + int unknown2 = br.ReadInt32(); + int unknown3 = br.ReadInt32(); + short unknown4 = br.ReadInt16(); + + int unknown5 = br.ReadInt32(); + + Guid guid = br.ReadGuid(); + short terminator = br.ReadInt16(); + + // OpenFile(new Document(null, null, new ShellObjectAccessor(guid))); + } + } + + private void cboAddress_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + OpenFile(new Document(null, null, new FileAccessor(cboAddress.Text)), !e.Alt); + e.Handled = true; + e.SuppressKeyPress = true; + } + } + + #region Document Container + private void dcc_SelectedWindowChanged(object sender, EventArgs e) + { + if (dcc.SelectedWindow == null) return; + if (dcc.SelectedWindow.ParentArea == null) return; + if (dcc.SelectedWindow.ParentArea.Position != DockPosition.Center) return; + + if (!(dcc.SelectedWindow.Control is Pages.EditorPage)) + { + mvarCurrentDocument = null; + RefreshDocument(); + return; + } + + Pages.EditorPage editorPage = (dcc.SelectedWindow.Control as Pages.EditorPage); + if (editorPage.Document != null && editorPage.Document.Accessor != null) + { + cboAddress.Text = editorPage.Document.Accessor.GetFileName(); + } + else + { + cboAddress.Text = String.Empty; + } + + if (mvarCurrentDocument != editorPage.Document) + { + mvarCurrentDocument = editorPage.Document; + } + RefreshDocument(); + } + private void dcc_WindowClosing(object sender, AwesomeControls.DockingWindows.WindowClosingEventArgs e) + { + if (e.Window == null) return; + if (e.Window.Control is Pages.EditorPage) + { + Editor editor = GetCurrentWindowsFormsEditor(); + if (editor != null) + { + CancelEventArgs ce = new CancelEventArgs(); + editor.NotifyClosing(ce); + if (ce.Cancel) + { + e.Cancel = true; + return; + } + editor.NotifyClosed(EventArgs.Empty); + } + + Pages.EditorPage editorP = (e.Window.Control as Pages.EditorPage); + if (editorP.Document != null) + { + if (editorP.Document.IsChanged) + { + switch (MessageBox.Show("The file has been changed and not saved. Do you wish to save the changes?", "Save Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) + { + case System.Windows.Forms.DialogResult.Yes: + { + if (!SaveDocument(editorP.Document)) + { + e.Cancel = true; + } + break; + } + case System.Windows.Forms.DialogResult.No: + { + break; + } + case System.Windows.Forms.DialogResult.Cancel: + { + e.Cancel = true; + break; + } + } + } + + editorP.Document.Close(); + } + } + } + private void dcc_WindowClosed(object sender, WindowClosedEventArgs e) + { + if (dcc.SelectedWindow == null) + { + mvarCurrentDocument = null; + RefreshDocument(); + return; + } + if (dcc.SelectedWindow.ParentArea == null) return; + if (dcc.SelectedWindow.ParentArea.Position != DockPosition.Center) return; + + RefreshDocument(); + } + #endregion + + private void mnuViewPanelsProjectExplorer_Click(object sender, EventArgs e) + { + } + + private void mnuHelpAbout_Click(object sender, EventArgs e) + { + } + + private void lblDataFormat_Click(object sender, EventArgs e) + { + mnuContextDocumentType.Show(sbStatusBar.PointToScreen(new Point(lblObjectModel.Bounds.Right, lblObjectModel.Bounds.Top)), ToolStripDropDownDirection.AboveLeft); + } + + /// + /// Creates a Bookmark for the specified document. + /// + /// + public void AddBookmark(Document doc) + { + if (doc.Accessor is FileAccessor) + { + if (!Engine.CurrentEngine.BookmarksManager.FileNames.Contains((doc.Accessor as FileAccessor).FileName)) + { + ToolStripMenuItem mnu = new ToolStripMenuItem(); + mnu.Text = System.IO.Path.GetFileName((doc.Accessor as FileAccessor).FileName); + mnu.ToolTipText = (doc.Accessor as FileAccessor).FileName; + mnu.Click += tsmiBookmark_Click; + mnuBookmarks.DropDownItems.Insert(mnuBookmarks.DropDownItems.Count - 2, mnu); + mnuBookmarksSep1.Visible = true; + + Engine.CurrentEngine.BookmarksManager.FileNames.Add((doc.Accessor as FileAccessor).FileName); + } + } + } + + private void mnuBookmarksAdd_Click(object sender, EventArgs e) + { + if (CurrentDocument == null) return; + + AddBookmark(CurrentDocument); + } + + private void mnuBookmarksAddAll_Click(object sender, EventArgs e) + { + foreach (DockingWindow dw in dcc.Areas[DockPosition.Center].Areas[DockPosition.Center].Windows) + { + if (dw.Control is Pages.EditorPage) + { + Document doc = (dw.Control as Pages.EditorPage).Document; + AddBookmark(doc); + } + } + } + + private void mnuToolsSessionManager_Click(object sender, EventArgs e) + { + SessionDialog dlg = new SessionDialog(); + dlg.ShowDialog(); + } + + public void CloseWindow() + { + this.Close(); + } + + public System.Collections.ObjectModel.ReadOnlyCollection Documents + { + get + { + List documents = new List(); + foreach (AwesomeControls.DockingWindows.DockingWindow doc in dcc.Windows) + { + if (doc.Control is Pages.EditorPage) + { + documents.Add((doc.Control as Pages.EditorPage).Document); + } + } + return new System.Collections.ObjectModel.ReadOnlyCollection(documents); + } + } + + + public void UpdateStatus(string statusText) + { + lblStatus.Text = statusText; + } + + public void UpdateProgress(bool visible) + { + pbProgress.Visible = visible; + } + + public void UpdateProgress(int minimum, int maximium, int value) + { + pbProgress.Minimum = minimum; + pbProgress.Maximum = maximium; + pbProgress.Value = value; + } + + private void mnuHelpLicensingAndActivation_Click(object sender, EventArgs e) + { + MessageBox.Show("This application has already been activated.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void HelpContents_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.resx new file mode 100644 index 00000000..df17f437 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/MainWindow.resx @@ -0,0 +1,963 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 345, 17 + + + 226, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEPSURBVDhPrdPZasJAFAZgX8q+Q32N9o2kXkjphQsigoJC + ixa1VAWXiohG7IakbmjcNcYl5i8TCQSdGXPhgcPczHwz5xzGZrtWRN+bOM1wqo5gvAJfrIBy4w/cu8hh + VjyG3nDjuOcjkbTABB58cSRy9SMiiPSXhF6rTMDpedEPG0ktJfD8wQT26gEEMSAq4I3mqYCmaZCVHQZj + WQfst3f0Ep7CGSqw3amYzBWI/TkfcAdTZ4B60LCQt+hJK3yJEz7g8ifOAGWzhzRdo9WdofYt8QFSnzlI + 42bLDdqDBZqtMUpC3zpgbtxPe4rq5xDZSsc6YG6c8DtCodZDsihaA4x5s1bmGI0Zkw2X8lofWHf+AdjM + 9sNc+xBlAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIsSURBVDhPrZPdS5NxFMf3L3TfTdBFtzU1hmuxGjzlHMqq + YVgRvT2RL+XSZZqoWJlGLV8gW+HSScvpJJxU+AamSI2hTCVLM1e0xKGm2EQw+PY7v+j5tTIvoh+cy8/n + POec76NS/Y/37GkUVL72ZbR5l/DYvYDGhgjuO2ZQW/MJ9tsh3CifQmnJBAoLXiMvdxQXzgeh9Cawtweo + qV7FRm9ldQ3GtF4cTnvCSxF4Wxe5oLLiy195giMLK9htfg61WoblkEcI3I/muaC05PO6gp/w+/Ai4kw+ + FFyexgFzkxA462e54JLt3R+CX+GRyQi2SV5Yc8aRmuIUgrq7YS7IzhqNEfwODwbD2Kx3Q5YDMJkcQlBd + 9ZEL5DMBRbAe3OP/gE2JDThy9AWSkmqF4GblNLq7wE4JHD/5CpZjA3zbtDCamT6bOv+A+3DQ0glJsgvB + 1bJJdPjAMgA0ub6xu39F+fU5vlRaGM2cmRFU4OTUdhgMFUJwpXAcnmbgoXONBScKY3pOTJlP2JB+roh3 + Tk5h8H4P9PoyIbDljTEYqLoT5Z1JwEKCOK2EobezGJuag5x7DXuNbRzW7nFBpysSAoql4x6UzyYBwWfz + b+FNaB6hmSVcLLYjXu9icCPidz2ANjFfCDIzhtncy3zmrQYPtuyQ0NLRD1/XILr7/Bh4OYR9JgvUunok + MHi7pg4ajVUIKNOnT/XzeFLCKCR0ZzoVbZsWRjNTVyqCdyZkxwr+9a/+Dk60OMVjMFpXAAAAAElFTkSu + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAItSURBVDhPtZP/T1JRGMb9p1itrVZbbRpqZbawnBENV1I0 + jGlByTSyKTXJwq2oKZQb1KAv6JCYWSxvdsklKVPETSAnSIQIqBBfnu69VGTA1tY62/vLe8/zfN77nHPK + yv7HcnmCML6aKVmG0WmU5NLiMdKNP1fyWxre5VU8MU+giispbaC3fMRmIoUv4Shs9lmmnllJ6EwE7DM+ + 1As7cfRMe3GDd45FEFOLW+A0eS2WgHMhAIOFROWJSzBZiUKDUCQOtYFAOpOFzx/aQjfbPoGc9qKuSY5a + vgw31M9xW2vOmzhmPYx4lHQxdJr6k+wPxeHyhHBPZ2X+XdYziAeGcVSdlOYMnPM+9GpHoDF9wF29DQ9f + vEevxoL2W3qIOtTgNitwgNpcUd+CY2evQdk/BLFcjf0NF3MGNwdeIhpPFKRON1LpDDaoQOkMguENLK3E + IO3WoLG1h5rgx0nI+4wwvZ7CU6sdGuMY7miH0al6DEl3P4RtKvAuKMBp6sBBnhTlx8U4R/XqBFexu1aY + m6BNqStKp5vR9SS8/jVMzgXx1hHAELEErqgLlQ2tYFWcyhlIFI8KDKgM8TWWwtzndYw7w2D3bYfuzQqT + /GH+FeyqEeQNWq4PIJkCKBjC8SyWI1ksBDKYcG9ieDKGQdsqlCwWVCMRxmAfR5QX0xOI5ffhpgT0x7+p + X6P//hhqGmWo5l0Gm7pl5dRx7eU0Y8+R89h5SIAd1aexjc1nqEXF//qavwMB2C9JXlZfHwAAAABJRU5E + rkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGHSURBVDhPrdNNS0JREAbgfk3QpkVRCUUSFrUQFJSrEIRZ + pKWULSIlsgJTMD+SpF0tLIS6hhZIKBalkJmkUdqiL1OxTMFoXfCWV5BcdLlRsznDYeY5A8Opq/vvuEje + wen247v7kHnGJumtufvx3ZdiCabVjZpici+A8FmcGVCW7Wsk/EcRqiFfKEGmmkX68ZE5sOM9hvlrimwu + j2A4DpFEiaenHHPgIHSOJbsD2x4f1AsW9EtGmTeXx05nnzE1b8HwxByIgTHoDKbfAWVEoTaBkEyCkBsQ + PE0yBzKFDxhdbxDr01h03IKniUGoTcC6lUIkUaSHUvl3DNpeIdbdgyN1gD+6BqEmBN5MEj0KH5Y3Kpv5 + MYyuEgh9Dl0jHrSLbFAtusGbjlabWISNHhDrs9WCNoGZygXaa+okfVdo5CjpAUKXogq8oRRa+HoqH7de + olO6jYaOIdQ3NNEDqpUbsKUkmvlGsLmV3QciGbD6FGjplsK1H6MHDqM5cGXraO2Vw7l7wnx1f/nRn6qq + 3+OKoLtvAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHiSURBVDhPpZPRT5JRGMb9U0rHnHXtH9BaWa0222pe1EVb + 2briQq+6atlsyzVstIkhzcLSAfahtJbS0mESaQaJlIGTzBkslPEpiSDor+87LAnawM13e+7O+3uf55z3 + VFUdtBwT31AljQeELCNe+hwfCC//Yl9stbm0zMMerrc9J7i4XBliHwsU9ed2dunqf4PTHeBSS2dliGXU + JwDOEEifwR+WeWh+jTQpY5tIYHUleDKaQD8UFwquZIpd9Tk8ew4y2znkjTSRWFIASqt9YJX6Zje+hfUC + xGRziXO97m10IzK3pZ+0Pg3T/3btP0CLMYZjSuZo0zCf5uN5iEHJq+beTGVZTaRYiqzzNbyG6VVUADqk + nJBfmXpFF+VI00vqLgxS2/gsD1DzbqWze5O1phA3DF94YF0qciD/zrKwsoV7bgOjNIPm3OMCQE6mmf8e + wxeM4PH/YPzjIm29+ee9NZBEa4hy+X6I83dmhYzSNJoz3QVA/emrlKpVPysAWSVeLJFlLrzJmFfG/i7O + o0EPNQ368jtyrX1KAP6d/NdBt+091Sd05QEXb7pIZXYwDXnpsc9gfDEtJqvNBsskh4/fKw9o0DqV27YK + 1Taa0ZztoeZUF9UnO5XmDg4du1t5zff1mQ566A8dAOcMIXbZrQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPtZNZSJRhFIZ/6MJuihbqqquC6CaKCKqLjMIs + TDOMxIysiRiVEpXJ0iE1NUUnt0nTxshlUHOrRFEpEiFxaNdwjBaJ1Mhpsuafcc/i6f8/GWxo86YDL+fm + vM9Z+D5J+h/R2ZxB+81UGssSmBe/oTIPt8pyjuCwVTFmu8ZgXzZntb7kpeu4YtBjTI/7FagaJ+V6pp11 + TDqqMRfrGB+pICclihdd8Zw/7U+8ZjO2zmOMtK4mOmy/J0QFqOZpZw1FGUfptmQjvy9guE/PW8sJmkoC + CQ/1pipxFU/zJCIP7/ME1FXkzALkGxgSw0jWhaCPCuZcZBA6bSAxGn8iQn3Ij14jACF+3p6A6lIDU3It + U3YT40OZ2J9HYa1YLtRbvozu4kU8MnoJsyqfbRs9AWZTBhP2MiYG0hh/eYqxZweRmxeTW95KpqmRC5dr + iTeYiUktITzBSFhsliegtDCV0UEjY31aRh/747q/iY+3VwizO6ZnvuFwTjIw7CA4IoWA4/o5SEluEvKr + NFwPfXF1rMfZtpLBckl0VqP0VqeQqaad3n6bMN/tsrInSDMLKcxK4HPPGZzt65BblmKv96L/uiTG/jrz + nS8upfMHB71vbFh63uEXGoOvYt619wDe23cg5V+Mw/4gQjEv4VPDQoYqF2AtkohWdlbHdk9wVZmgwNxG + U4dVZFVbN6xFupQcKx6I+8rurFUO9nPne5bXwlx/p5ua1idzAHWN3KSTygsLRBO0m4CdWwRZvba6s7vb + 77KY4E9xSLm2WvAvzeuz/a3oB0747y0N60d/AAAAAElFTkSuQmCC + + + + 17, 17 + + + 17, 54 + + + + AAABAAYAEBAQAAEABAAoAQAAZgAAACAgEAABAAQA6AIAAI4BAAAwMBAAAQAEAGgGAAB2BAAAQEAQAAEA + BABoCgAA3goAAICAEAABAAQAaCgAAEYVAAAAABAAAQAEAKFvAACuPQAAKAAAABAAAAAgAAAAAQAEAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAQBbABwAaAApAHMdOgCFNlQAjkhiAKZugQCwfpAAu5KgAMOh + rADNsrsA2MHMAObX3ADv5+oA/f79AAAAAAASIiJGESIiIiIiGOnqYxEiEiPKx6uex0IhbuydXYnOcRvu + 7ueZ3LMiIUaOwN7lEiIiIhFpiBEiIiIhIcYSMiISISIk4SIiIiIiIiiCIiIiIiIhHlIiIiIiIiJtESEh + ISIiEcciIiIiIiIk0yIiIiIiIiVxIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATgIEAF4AHQBoACkAaQkvAHQZPAB6K0MAhz5XAJdabQCzh5UAwp+rAM6y + vADZw80A49PXAO/l6AD8/fwAAAAAACMiIiIhIiNDEyIiIhIhIiIiIiIiIiI92mESIhIjIiMiIyIjIxM3 + 7u7uhkMSIiMiIiIiIiIkzu1a7u7bkxIiMiIiEiITbuy96Gq97u63UxIiIiIzOu6J23beyXju7tymMiIj + NN7u52rcd7zbWb7u7BIiIJ7u7u7tumnchb296lEiMlzu7u7u7udpWs2M7pESIiGe7u7u7u6jju287qQT + IiIyEFm97u7tAa7u7tcRIiIjIiMRNFae5gHO7uhBMjISIiEiEiIjEDvg7u1xIiITIiIiMiIxIiI95kVj + EjEjIiIjIiIyIiISftMTITIiIiIiIiIjIiIiIN6xIxIyIjIjIiIyEiEiEibuUiIiIhMiEyIjIiMiMiM7 + 7AIyIjIiIiISIiEiIiIjTeYyEjISMiITIiIiMjEiMm7UMiIxIjEjIiIjMiIiIjG+siISIiIiIiMiIiIi + IiIW7nIyIjIjIyMSIyIiIjIiO+4CITIiIiIhIiIiIjEjI03nMhIiIxISIiMSIyIiIiNu1SEyIyEiMiMi + IiIiEjEgzsMiMSMSMjEjEjIiIjIiJeuRIiIiIiIiIiIiIyIiIyrLESIiIiIiIiIiIiIiIiI86BIiIiIi + IiIiIiIiMjIiFXMyMjIyMjIyMjIyMiIiIjIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAIhAGgAKQBaCh4AcRc7AHYm + QQCMRl8AnmV5AK5/jgC6kJ8Ayaq0ANnDywDk1tsA7+bpAPfy9QD8//0AAAAAAAETERAREREREREQARER + EREREBARMRARERERAQERARERERB3QAAREREREREREBEBEREBEQEBEREQEQvu3IMAEREREREQEBARERER + EBEREQERBe7u7u64QwABEREBEREBERETEREREREDnu7d7u7u24YwABEREREREREBARERERBs7u6wWe7u + 7u3bYSAREBEREREREREBABju68zutSa87u7u7rUzAREBEREBERERBa3t6WZo7ul2aL7u7u7adTABARER + EREBfe7mWu23RJ7tyFOO7t7u7clTEREBAQEK7u7upDi96lJ7zt1yW83e7u7DAQEREAXe7u7u7thmaN6m + Vnzup1fe7rUBEREQEK3u7u7u7u7suQSe7IU43tzu5jAQERERPO7u7u7u7u3u5Txia97WXe7sUQERERA3 + 7u7u7u7u7u7ugU3uplaO7u2BABEQEQEHru7u7u7u7u7qAH7u7tzO7qMBERMRERAQAFe83t7u3u7SAY7u + 7u7u5SERAQEBERExEQAjZ5zu7u0BAJ7e7u7oMBEBAREREQEQEQEQAQM2ruhSAK7u7uxDARExERAQERMR + ARMRExAQAjPNYu7u7ZEBEQEREBEREREBEREBEQEREQbe43itpAAQExAQERExETERAQERAREQEDjeowAz + AQEREREQExAREREQERAQERARET3ucQERExEBAQEBEQEBERARExERExEREF7tUBETEBEBEQEBEBERERER + AQEBEQEBEN7rAREBAQERExEREQEQEREQERERMRERBe3mAQERERExEBERExERERARARAREBARCu7gERAT + EQEQERExARExEQExERETERERPd6QEBEQEREREBARAQEREREQETERARERfu4xExAREBARAREBERAQERMR + EQEBARERruoxEBEREBExETEREREREREBEBEQEREU7ugBARExAREQEBEBMQEQEREBERAREREI7tQRAQER + ETEBEBEBARMRERERATERAREO3rARERAQEBEQEREREREBERMRAQEBERB+7mABEBEQERAREBExAQEREREB + ERERETDO7gERExERETERMREQEBEQERERExEREQXe5wEQEBETEQEBARERERMREREBAQEREBju5BERAREB + AREQERARAREBEREREREQETvuoQEBEREBERAREQExETERERETEQERAV7ucBExEQEREQEREREQEBAQERMQ + EREREL7eQTEBEBMREBMREBMREREREREBEBAQFOy7ARARExEQExEQExEBAQEQEQEREBEQCueGABEQEBEQ + EBEQEBERARMREREQERERPOXCEREBEREBEREBEREBEREBERARExAQfuthAQERMQERMQERMQERMQEREREB + AQEBWe5AEBAQEBAQEBAQEBAQEBAQERERERERAEQBERERERERERERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAABAAAAAgAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYAhYAYQEjAGgAKgBxFzoAfStJAIU7VgCQTGUAoWd7ALOGlQDEoq4AzrG7ANe/yQDk0toA7+brAPz/ + /QAAAAAAIiMhIyIhIyISIiIiIiIiEiIhESIiIiIyIiEiEhIiIiIiIhISIiMiEiIiEiIhIwIiIiIiEiIi + IiISMiIiIiEiIiISIiISEiISIiISIiFu6nISEiIiIhIiIhISEhIhIiEhISIhISIhIiIiIiIiK+7u7qch + IiIhIREiIiIiIjISMiIiIyEiISIiIiIhIiXu7u7u7uuDEiEiIiIiIiIiIiIiIiISIiIyIiISIhIgnu7u + 7u7u7u7IQBIiIhIiEiIiEhIhEiMhISIiIiIiIk3u7u2+7u7u7u7uhhISIiIiISISIiIiIhISEiIRIiII + 7u7u7DF57u7u7u7u6mMCIiIiEiIhIiEhIiIiIhIhI77u7O7u7YQGru7u7u7u7scRIiEiIiIhIhISIiIh + IiFu7u7mBp7u7tlQat7u7u7u7uyDAiEhIiIiIiIiIiIiC+7u7u7ZUEje7u6UBo7u7u7u7u7YUREiIiIi + IiISIhXe7u6Be+7ulQSN7u7pYEje7u7u7u7uljEiIiIiIhIgju7u7uxxB87u6VBI3u7upwSN7u7u7u7t + QiEiIRIiIjzu7u7u7u7IIGvu7rcDe+7u6nA33u7u7mEiIiEiIiEW7u7u7u7u7u7tgxWe7upwGN7u7rd+ + 7u6jIhIiIiIiIr7u7u7u7u7u7u7u2RBp7u64E3ru7u7u1RISEiEiERE97u7u7u7u7u7u7u7lLYUFnu7s + c47u7uoSIiIiIiIiKu7u7u7u7u7u7u7u7oE+7upRON7u7u7uUSEiEiIiIRbe7u7u7u7u7u7u7u7qET7u + 7u6XB+7u7oESIhIiISESIWjO7u7u7u7u7u7u7sEifu7u7u7u7u7BISIhIiIyIiMiEgNozu7u7u7u7u3u + ERF+7u7u7u7u5hEiISEhISIiIiEhIiEQaM7u7u7u7uMSEo7u7u7u7uoRIiEjIiIiEiEiISIhISIhE1jO + 7u7ugiISvu7u7u7tYSIyISEiIhIiIiEiIhIiIhIiEhFovu43ASGu7u7u7oESIiEiIiIhIiEiEiISIjIS + IhIiISEQRi7ZEe7u7u7FISISEiISEiEjIiIiIyIiISEjIiEjIiIiju7A7u7u5xISEjIhIjIhIyISISEh + IiEiIiEiISIiEhHe7sETWLoSIhIiEiIiEiIhIiIiEiIiEiISEiISIhIhJe7ucxESERIhIiEiISIiISIh + ISIjIhISMhIiEiISIiIq7u4RIiISIyIhIiEiIhEiMiEiIiIhISIhIiMiIyIiEh7u6xIiIyEiEhIiMiIh + IiIhIiIhIiEiIyIhIiEiIiISju7lIhISIjIiIyISIiEjISIiIiIiEiISEiIiEhISIiHe7tEjIiEiISIS + EiEhEiISIhEiIhIiMiIiEjISIiISJe7ukSEhIiEiISIiIiIiMiISIiEhIiEiISIhIiIiIiEa7u4yEiIi + EiISEiESIhIhISIiMiIhISEiIyIhIiIiIx7u7RIiEiEiMhIiEiISIyIiIyEiIiIiIhISEhISIiEifu7o + EiMiIyIhIiMiIyIiIhISEhIhISISIiIiIiIhESHe7uEhISIhISIhISIhIhISIiIiIiIiIjIhISISIiIi + JO7ukSISIhIiIhIiIhIiMiEhISIhIhISEiIiMiISIhIq7u5jIiISIiIiIjISIhISEiIyISIiIiEiIhIi + IjISIj7u7gISEiIRIhIhISEjIiIhIiEjIiEiIiISIyEhIiISfu7oEiIiMiIhIyIiIiEhISIiIiIiIiIS + ISIiEhISISHe7uMiISEhIjISEhIiIiISIhEiISEiEiMiIyEiIiIiFu7u0SEiIiIhIiIiIiISIiIyIiEh + IiEiIhISEhIiIiIp7u5iIhISISISISISISESIiEiMhIiIiIiIiIiIiIiEh7u7hEiIiMiMiIiMiISMiIS + IiISIhIiIhIhISISISIhfu7pEiEiEiIhIhIhIjIhIyEiISEjIiEiIyEiMiIiISLO7uUjIjISEhIhIyIi + EhIhIiEiIiIiIiISEiIhIiEiJe7u0SISIiIiISISISEiISIiMhISISEiEiIiISEiISIo7u6BIhIhIiEi + IiIhIiEiIiISIhIhIiIiISISIiIiIh7u7jEiIhISEiIRIiIiEiIRIiEjIjIiISEiISIyIiESfu7sEiEi + EiISMiIhISISMiIhIiIiEiIiIiIyIiEiIiHO7uciIyEiISIhIjISISIhIjISISEiISISEhIhIiIRJO7e + 4RISIiMiIyEhIiMiIyEhIiMhIiEiISIhIhIiEiIp7kihIiEiEhIiEiISIhIiEiISIhIiMiIiIiIiEjIi + ES7uDUEiIiISIhIiEiISIhIiEiISIhISEiIiEiEiIiEifuoeAhISISIhIiEiISIhIiEiISIhIiIiISIj + IiMhIiDe7acjIiMiIyIjIiMiIyIjIiMiIyIjISIiIhISEhISE97u4xISEhISEhISEhISEhISEhISEhIS + EiIiIiIiIiIiB96xIiIiIiIiIiIiIiIiIiIiIiIiIiIiISIiIiIiIiIhESIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIRIRIRIRIRIRIREhEhEhEhEhEhEhEh + EhEhEhEhEhEhEiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAACAAAAAAAEAAAEA + BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdAB0AaAAqAGoNLwB1Hj4Afi5LAI1IYQChZnwAsH2TALuQ + ogDHobEA0bK/ANvEzwDm1t0A8ejtAPz//QAAAAAAEBISEBIQEBERIRIRESEQERARERARERERESERERER + AhAREREBAREREREBERAQEhIRERAQEBISEREREBEREhAREREhARERERERIREhEhIQEREhESEhEQEhASER + ERERERERESESEREhISEhEREhIQEBAQEBEREREREhISERISERIREREREhIQEhIQEBARARERIRASEREQER + ESEREREhARERERERERIRAQERESEhERERERERESEhIQEBEQEBIREBEhERESEQEBEREBEREhEREBEhEhEQ + EBIQEhASERERBgAAEREREREREREREBAQESEBEhISEhIREREREBIRERAQEREBESEBERESEhESEhERIRIR + ERASERERERIRERERAt7rZgAREREREREhIREREREBASERERAQEBASEhEREBIRERIQEREREQEhIQERIQER + ARAREhAREREhIBIRESEREI3u7u7KQgERERAREREhISEhEREQEQEBERERAQERISERESEhESEREREhERER + IRERIREBEhAQEhAQERERERERETru7u7u7uyiIhARERERAQEBESEhEREBESEhIRERIREBIQERARAREREh + ERIQEhAQEBESEhEBERERIQEREREREQXu7u7u7u7u7uZQABABERERERAQERIREhIRERESEhASEREREBER + IRERASEQERERERESEBERISESERERERERERCu7u7u7u7u7u7u7oZAERERERERERIQEhEQEBASERERERAS + EhESEBEREREQESEhASEhIRERAREREQEhERERERBc7u7u7u7u7u7u7u7u3GQAERERERERERESEREhAREB + ASEhAREBIREhERISEBERAQERAQEBIREhEBIRERERERAJ7u7u7u7u7u7u7u7u7u7umAIRAhEREREREBIR + EREhEREREREhEREBERERARERIREREBERERESEBEBIRAREQARzu7u7u7u7u7u7u7u7u7u7u7tdgAhERER + ERERESESEBISEBASEBIQERARAREBIQEBIRESEhIQEBEREREREBEgfu7u7u7u7u7u7u7u7u7u7u7u7u7a + UgAREREREQEBAREQEBEREREREhIRERESEREREREhIRERERERISERERERG+7u7u7u7udN3u7u7u7u7u7u + 7u7u7uy3MBARARERERARIRERISEBIQERIRESERIQEhIRAQEBASEhIQERERERB97u7u7u7u7UEAau7u7u + 7u7u7u7u7u7u7uuQEBEREREREREBIREBEREREhEREREBERERAREREhAQEBEREREREJ7u7u7u7u7u7mUA + EAm+7u7u7u7u7u7u7u7u7uZwAhERERERERESERIQEhEBERARESEhAREhIREREREREREREE3u7u7u7u7u + 7u7u2VARIoru7u7u7u7u7u7u7u7u7cQwEREREREQERAQERAQEREREBIQERESEBESESEhERERAQne7u7u + 7ube7u7u7u7rpBEAVu7u7u7u7u7u7u7u7u7u2lIRESEREREhEREhESERERIQERISERESEBAREREBERC+ + 7u7u7u5QBG3u7u7u7e7IcAEEbe7u7u7u7u7u7u7u7u7uiEARARERASEhARAREREBEREBEQEhARERARER + ERBe7u7u7u7uxkAhCZ7u7u7u7u62IBEZju7u7u7u7u7u7u7u7u7uZQAREREQERERIREhASEhASEREQEh + IRERESEM7u7u7u7u7u7YRAADK87u7u7u7t1EAAN7zu7u7u7u7u7u7u7u7u7IUAERERISEhEREREREREQ + EhIREREREQER3u7u7u7t7u7u7u6WERAGje7u7u7u7pYhACWu7u7u7u7t7u7u7u7u7uumEhEREREBEREB + IQEhEREREREREREQbu7u7u7u4Dee7u7u7uqAAQBn7u7u7u7u6YAAAGfu7u7u7u7u7u7u7u7u7ulwAQEQ + EREREhERESEhAQEREREQPu7u7u7u7uMAEEne7u7u7tVAEROd7u7u7u3t52ABJJ3u7u7u7u7u7u7u7u7u + 7tZhESEREBEQEhEBEQEREQIRCd7u7u7u7u7txUAQM7zu7u7u3FQQAzvO7u7u7u7soyADPM7u7u7u7u7u + 7u7u7u7ugBIRERESEREBERERERIREI7u7u7u7u7u7u7pcBEAaO7u7u7upwEQBo7u7u7u7u7JMRAGnu7u + 7u7u7u7u7u7u1QIRAREREhEhERERERERET7u7u7u7u7u7u7u7u6nIBAFfu7u7u7uZgAgOJ7u7u7u7u5l + ABAIzu7u7u7u7u7u5wEREBEREhEREBIREQERIQfu7u7u7u7u7u7u7u7u7t1VIBI6zu7u7u7ZUgEiau7u + 7u7u7uhgAhB87u7u7u7u6wESEhEhERARASEREQERERK+7u7u7u7u7u7u7u7u7u7u7ssyEDRd7u7u7uyy + MQBF3e7u7u7u67IwB+7u7u7u7VIQEBAQERERERAQERERERBe7u7u7u7u7u7u7u7u7u7u7u7u7YQRADbO + 7u7u7thAEQNs7u7u7u7u6Zvu7u7u7qARERERESERIRIREREREREt7u7u7u7u7u7u7u7u7u7u7u7u7u3u + 52ARAInu7u7u7nYAAQie7u7u7u7u7u7u7uIAESEhIRIRERERARERAQEF3u7u7u7u7u7u7u7u7u7u7u7u + 7u7u7u7sERAQJr7u7u7u3lUAEiru7u7u7u7u7uYhERAQEBERAREQEBERERERfu7u7u7u7u7u7u7u7u7u + 7u7u7u7u7u7u0hB7QhAETt7u7u7upyIQXu7u7u7u7uxQEQESERESEBERESEhEBEROe7u7u7u7u7u7u7u + 7u7u7u7u7u7u7u7u7kET3u55ACAnvu7u7u7qkC7u7u7u7u6iARIREREhAREhERERERERCu7u7u7u7u7u + 7u7u7u7u7u7u7u7u7u7u7ucBBO7u7u1mAQA5zu7u7u7u7u7u7u61AREQEhIQERESERERIRASFd7u7u7u + 7u7u7u7u7u7u7u7u7u7u7u7u7u5wERXu7u7u7tZAASKr7u7u7u7u7u7aABEhIREBEQESEQERIREREU7u + 7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7pAREV7u7u7u7u6oAhAF7u7u7u7u7pQBERAREBESEREhAREREQ + EC3u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u4wERFO7u7u7u7u7u5yEJ7u7u7u7tYCEREhESERASEQER + IREQEhEQmc7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7TEREAru7u7u7u7u7u7u7u7u7u7uYAEREhEQEBIQ + EREREhEREREhEgA0bL7u7u7u7u7u7u7u7u7u7u7u7u7u7uIRIREN7u7u7u7u7u7u7u7u7u7uwwERAQER + IRERIRESEhEBEQESERAQEAAGXO7u7u7t7u7u7u7u7u7u7u7u7u5AESEQDe7u7u7u7u7u7u7u7u7u5iIR + IRERIREhEhESEBAQEREREQEBERERESAEh+7u7u7e7u7u7u7u7u7u7u7qARIBEQ3u7u7u7u7u7u7u7u7u + 6wARARASEhAQEBEBARERESERISERESEhIQERAgAQis7u7u7u7u7u7u7u7u7ukBESERIN7u7u7u7u7u7u + 7u7u7jAREBEhERAREREREREhIRARERERIRIREBEREBEREgAlXc7u7u7u7u7u7u7u6gERIQERXu7u7u7u + 7u7u7u7u7nMBISEhEBEhESEhISESEBERIREBAQEQEBESEhIRAhAQEQAGa+7u7u7u7u7u7uURAQEBEG7u + 7u7u7u7u7u7u7tYBERERERARIQERAQEBEBESEhEREREREREBIREBERERERERAhADiO7u7u7u7u6xERER + IRFu7u7u7u7u7u7u7uUBEhISEBEhEhEREBEREQERAREBERISESEhEREBESEhASEhIRERAQAier7u7u7u + cQARERERbu7u7u7u7u7u7usgEBAQEBASERIRARESEhEhIREQEREREREQERISEBIREREQERASEhEQEQAl + Wd3u7iCbIQEREX7u7u7u7u7u7u5TAREREREREQEBAREhIRERERESESEREQEBIRIREREREBISERIRERAR + IREhIRAAdpkAzuhwERDu7u7u7u7u7u60AREhISEhIREREREhEQEBASEhEhIRERERERARAQEBISEBAREB + ESEBERARERASERARFu7u7kAQ7u7u7u7u7u7TARASEBEREREhARIQERIRERAQEQERARESEhIRERERERER + EREhASERESEBEhAREREBEQ3u7u7lEO7u7u7u7u7nIBERERESEBARASEhERIREBIREREBEBEREQERARIS + EhIQEBIQEREQEBIREhERISEBIREu7u7u6gCO3u7u7u7sUCEhISEBARERAREREBEhASERIRISEREhESER + IQESEREQERERERISEREREBEQESERAREQju7u7uoBAAd47u7uYAERAQEREREhIREhIRERAREBIRERERIQ + EREREBIREREBIREhIQEhAREhISEBIQEREhEQEu7u7u7nASESAQJKkAEREhEREBISEBESEBESERISERAR + IQEBESEREBIRESEBEREBEQEREREhEQEBERERIQEREhXu7u7u4hEhABEREAEREhASEhEREBESEREQEBIR + ERASEQERERIRERERERARERISERIREhIQERARERIQEhAQEREK7u7u7qASEhERAQEBISERERERISERIQEB + IREREhEhAREQEhIRARERIRIREhIREBIQEhAREBIREhIREREREREQXu7u7u5hEBERISEREQERASEBAREB + IREREREhIRAQERESEREQEBERERARASEBASERARERESERESEREQEhEhIREX7u7u7uAQEBEhAREhIREhAR + ERASEREQEhIQEBEREQEhIQEhIREhERAREBEBERERAREhASEBIQEBAQEREQEREQDe7u7u5xEhERAREhAR + EhAREhIRERAQEREQEREQEBEREREREQESERERISEhERISEhASEREREREREREREhIQEQEX7u7u7uYQEhEh + EQEREQERESERESEhEREhAREhIREhIRAQEhIREQERERERERIRERARERASEBIQEhISEhEQERERG+7u7u7Q + ABEREQERISERISERASERASEhAREhAREhEQEREREREhARERERIQEhEQEBESEhAREBEREBEQEBIRERET7u + 7u7uQhEREhIQEhEREhEREhAQEhEQERESEREQEBIRISEhAQERIRESEhEBEQERESEREREhESEhEQERERER + ERGO7u7u7kEBEhEQEREQEBAQEBEREREQERISEBASEREREQEBAREREBEREQEBERAQEhIREBASEBIREBIR + ESEBERES3u7u7ukBEREBIREhIRERERERISEhIREhAREREREhIRIRERESEhEhESERESESEREQEBERERER + EQEREhIRERARBu7u7u7mARISEREBEQEhISEhIREREREhEREBISEBAREBEhISEBASEREREhIRIREhIRER + ISEBIQESEQEBARAhEgvu7u7u0REhAQESEBIREBAREBAQEBAQEBASERERERESEBERAREREQEREBEREQEB + EQEhIREBEREBIREREREREQJO7u7u7nEBAREREBEREBEREBERERERERERERIQEhISERESEQEhERARERER + AQERERIRERASERISERASEhISEhERju7u7u5AEhERISERISERISERISEhISEhISEBEREBEREBIQERERIR + IRERIRERIRIREBARERAQERIREBAREREREN7u7u7uARERIRERIRERIRERIRERAQEBAREBESEhESEBERER + IRASEhEREhESEBEhASERASEhEREBEhERERAQERbu7u7u5gESEBAQEBAQEBAQEBAQEBEREREQERIQEBAR + ERISEBERAREBERAQEBIRARERIRERASEhERARIRIREREM7u7u7tMRIRERERERERERERERERESEhISERIQ + EREREhIREBAREhEQERERERERIRESEBASEhEQERIREhEBESERDu7u7u7AEhARISEhISEhISEhISEhIRER + EREhEREhISEBASEREhEhESERERASEREhEREREREQERIQEhARASEREY7u7u7uQREREQEREQEREQEREQER + AQEBAQEBEQEhEREBERERARIQERAREREhIRIQESEBISEBIREBEREBEREQEBPe7u7u7CIQEBIREBIREBIR + EBIREhERERERERARERAQERISEhEREQEhIREhEREQEBEBAREREREhASEhERISERET7u7u7ukBEREREBER + EBEREBEREBEQEhISEhISEhARERIRERASEhEREREREREhAREREREQEBIQERERERIRARERDO7u7u7gEBEh + ISERISERISERISERIRERAREBEREBASEhEQEBEQEBIRAQERASEREhISEhEhEREBISEBAREhEREV7u7u7u + 0BIRAREBIREBIREBIREBIREhAREhESEBERERAQERESEREQESEREREQESEREQESERISERAREREQEBERFu + 7u7u7mEBERASERASERASERASERAQERESEBARERISEhEREhIREhIRESERISEBEBAQEREBAREBIREhISEB + EREA7u7u7u4CERIRERARERARERARERARERISEREREhIRERASEhAQEBEREhIRERERERERERESERESEREQ + ERARERIRF+7u7u7pAQEBASEhASEhASEhASEhASEhAQEBISEBEQEhERERERERAQERAREREBEhISEhIRIQ + ERASEBIREBIRESnu7u7u5RARERERARERARERARERARERAREREREBESEREQEBISEhIQEREBERESEREBAQ + EBARESEhAREREREhEREe7u7u7rAhIRISEhESEhESEhESEhESEhESEhIQERIQEhIREBAREREREhEhEQEB + IQEREREREBEhEREhIQEhEREQru7u7u6AERESERESERESERESERESERESEREQERIREREREhEREBASEhAQ + ERERERESESEhISEhERAQEREREhEREr7u7u7uMREBAREBAREBAREBAREBAREBAREBAREhEQEhIQERISER + EQERESEREhEhIRERERERERASERIQEhERECXu7u7u6gEhEREhEREhEREhEREhEREhEREhEREhEQEBEQEB + IRERISERIRIREREBEBARIQEBIQEhAREhEREBEREM7u7u7ucBERISERISERISERISERISERISERISERIR + ERARERAQEBAREBERAREhEREREhEBEREBEREhAQEhEREQTe7u7u7gEhAQEBAQEBAQEBAQEBAQEBAQEBAQ + EBAQEhIREhIREREREhESEBERERISEBEBERIQERIQEREREBISAX7u7u7ucBERERERERERERERERERERER + EREREREREREBESERESEhISEBIREhERAREBIRERIQERIREBISEhERERDu7u7u7mERASEhISEhISEhISEh + ISEhISEhISEhISEhESEBAQERAQEREQESEREREQERESEhEREhESEREREBIQEV7u7u7t0BEhEQEREQEREQ + EREQEREQEREQEREQEREQERIREREREhEREBIREQEREhEhIRIRAQEhAQERIQEBERERC+7u7u7mEBASERAQ + ERAQERAQERAQERAQERAQERAQERAREBISEhESEhEREhARERESERERAREREREREBERERIRER7u7u7u5BEh + EREhEREhEREhEREhEREhEREhEREhEREhESEREREBARERIQERIREREBEBIREhEhASEhASEhIRERCO7u7u + 7qASEQEhESEhESEhESEhESEhESEhESEhESEhESERIQEhEREhAQEREhERESEBEBAQEQERERERERERAREA + vu7u7u5QIQEQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEQEBISEREREhEBEREREREREREhISEBISEB + IRERFO7u7u7sIREREREREREREREREREREREREREREREREREREREQEREREBASEhAQERERISEhISEhERAR + EBAREBASEQzu7u7u6BEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQEREQERESERIRERERER + ASEBEhEREREREREN7u7u7uMBERERERERERERERERERERERERERERERERERERERERERERISERIRAREREQ + EBIQEBEREhEhEhASERERbu7u7u7gIRAQEhAQEhAQEhAQEhAQEhAQEhAQEhAQEhAQEhAQEhAQEhEQEBER + IRERERERERESEBERARESEREREO7u7u7uYREREREREREREREREREREREREREREREREREREREREREREREQ + ERESEhERESEhISEhIREhAREhASERIRPu7u7u7SIRISEhISEhISEhISEhISEhISEhISEhISEhISEhISEh + ISEhAREhIREBEREBAQEBAQEBESERAREREREI7u7u7uwBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB + AQEBAQEBASEhEQEQERERERERERERERAREhESEREhPu7e7u7kERERERERERERERERERERERERERERERER + ERERERERERERERERERARESEREhISEhISEhISEQESEBEREV7u7u7u0xISEhISEhISEhISEhISEhISEhIS + EhISEhISEhISEhISEhISEBIREhIREREBERERERERARESEREREQC+7u7u7oARERERERERERERERERERER + ERERERERERERERERERERERERERERASERAREBEQEBAQEBARESERARERAV7u7u7u4BAQEBAQEBAQEBAQEB + AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBIREBEBERERIRERERERERIQEhASERCe7u567rEhERERERERER + ERERERERERERERERERERERERERERERERERERERASEREhERIREhISEhISEBERERERAT3u7rAM6BASEhIS + EhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIRERIQEREREQEBAQEBAQEhEhEhARF+7u5RXuIB + AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBASEBESERIQEREREREREREQEQERERvu7t + MV6AERERERERERERERERERERERERERERERERERERERERERERERERERERARIREREREhISEhISEhIQEQER + Fe7u6wDuYRISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhERAREQEhARERERERER + EREhERju7ukA7AIRERERERERERERERERERERERERERERERERERERERERERERERERERESEBEREQEREQEB + AQEBAQEhEREt7u7iFucAEQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAREhERER + ISERERERERERIQEQfu7u5wzkERERERERERERERERERERERERERERERERERERERERERERERERERERERES + EREREhAREhISEhISEhEREL7u7u7ukBISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIS + EhISEQEREQEREhAREBAREBARIQXu7u7u7nAREBAREBAREBAREBAREBAREBAREBAREBAREBAREBAREBAR + EBAREBAREBARERESEQERESERESEREQETbu7u7u4BESERESERESERESERESERESERESERESERESERESER + ESERESERESERESERIRESEREBISEBISEBISEBIQCO7u7nASEBISEBISEBISEBISEBISEBISEBISEBISEB + ISEBISEBISEBISEBISEBEhEREQESEREREREREREREREQFJ3u5RERERERERERERERERERERERERERERER + EREREREREREREREREREREREREREBEREhEBIQEBIQEBIQEBIQESACQ0AQEBIQEBIQEBIQEBIQEBIQEBIQ + EBIQEBIQEBIQEBIQEBIQEBIQEBIQEBIQEREQERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERESEREBEhIQEhIQEhIQEhIQEhIQEhIQEhIQEhIQEhIQEh + IQEhIQEhIQEhIQEhIQEhIQEhIQEhIQEhIQEhIQEhIRAREREREBEREBEREBEREBEREBEREBEREBEREBER + EBEREBEREBEREBEREBEREBEREBEREBEREBEREBEREBEREBERIREREhEQEhEQEhEQEhEQEhEQEhEQEhEQ + EhEQEhEQEhEQEhEQEhEQEhEQEhEQEhEQEhEQEhEQEhEQEhEQEhEQEhERESEBISEBISEBISEBISEBISEB + ISEBISEBISEBISEBISEBISEBISEBISEBISEBISEBISEBISEBISEBISEBISEBERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER + EREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAIABJREFUeJztvXu0X1V5 + Lvywky+BbHayk3BLIGoIqQoEUYOCGCxYKLU24XxD0OjRWo6gZ2BVGGoFhQLaYGsHWi8dIkodddgIer4B + +PVyoIKSWhQQUwKUHAjxM5AQMMlOthuSEMr3x8679rue9bxzzvXbO1d+7xh77PVba17e+c453+u8HHAs + PvQiutCFLrwkoWdPI9CFLnRhz0GXAXShCy9h6DKALnThJQwVA+jrn1D9H8RQ9133XffdfvzO4ADvBBzE + EPrQW0vQfdd91323f73zcEA3CtCFLrx0wBhCX/8EDA5sR4+pBvbR/+++677rvtt/3vX1T6i0gcGB7QCA + cUfhTVcCO22DreMAAIf0H4ztW1+oPU/EiD3RTddN102376XbvvUFDGKoygMUmgCmLnTTddN10+176VJQ + RQFYffBqxNqBTeim66brptt30nnPP+fzzxUDmNk/dTjjThvBfkfP3XTddN10e2+6wYHtNe+/T+vfN0yA + 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 + vcceQeUAicrj9+zVVrjk8GxwTeHFVYPLaNCYTDu/882/bcHvDRg/cXhh0MxZh4zUHXB2dnhFUrbxXmhT + kcdYMRCFh/8G5M+oj25ISnn+fXm+bh6HKWdypCH5dod4sgal8FQSOyF1IwbrJ6xiqtF4V4IxYswcERu5 + GoxsG8UhfWXKPql9D/wIUVilYZ9nbDy2jyM8lW9CclenLRiogW+w9Kt3Yvmyx0e9KMj7AzZvbA4khYdc + w0/0UHY600eekS/azJJEaQv+u5XfkEhefRamJLfN45GLFCiaME7RmA7bKYSPwlNJaZ8nt7IyhVdNEKC3 + gVvkH4j8NEzfWhQA0IcTKg9tRbDEDavsXTXIlcegPNlq3XTk9VQnpHjcfL2502ts3f7KXz+BSeMPHNVp + QQw7tr2AtY9sxLrBjdoUEefV816NlMeX6Z2KKPh06tQZ9lQznX1Z7PHm71Fa7pfcFlsrp+Q06Cjq4MtP + jWe15j6ibxR9YFpEbVT7MrgvuF+YfoyTQWMvgJKO9jt3Kksjnins+Kg85cBinEpAqX85SefrZfsuVffG + 9VuwYd1gMW4MdsiI/Z1/6Vk47vUvG8FR2NmKHpHDsuE3KPB2c91ALO18mTXpFODrn3MHuSp1XeEj2+tw + ijQg+67WKUQ+rdwtTNFegNRNR8q3VWtDIm3O96X8NUyDkfMA2FYWaq91CNshykZKqfmN9xiKO22guZqJ + /4d2I6tyCbU18jVEJxj3oRc33/ozfOKd35TfS2D8xPqfB2+3pyIUni7q2XCNbOSaehukiWz7yCaNohSR + N9y3RU1iTpe6bTmFC9PB3lke5UTlcazqi8rK+Z1qZh6PY+UPCNKq+efTKfobyOvBfWXKxmdCKQkRSawS + CSZDMAURA2u0/+8hio163BifSNp4GM1xYQx/+J43hptI1MRXKwNT9rd/5vZGdjT3b1RnrT6iLTuzuCzD + i8eKSqfqj6RkQ2AkQpcl71V9kUal2p+S4GrcR2VEnn1VZjTOAdIAIm6uPKGhRBESmTmj4uBqgKhBxB5Y + lkasQTRwIcno64rCoSmuP3nqpEqCj8Xx4WeedyLOPvekEXyFBFTSSoFpERGNI03NnpW6zukibSOldUST + wP/2bczmEZoDSz8ec5GmW3O6iaiHqk/hrOjiy0yNe4+vwpnnR7THwdcdaUU1DSDi5pwp4sjqGyPiy/J1 + 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 + peZHpDX+/xYzxywG31hKAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.Designer.cs new file mode 100644 index 00000000..19c94dae --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.Designer.cs @@ -0,0 +1,443 @@ +namespace UniversalEditor.Engines.WindowsForms.OptionPanels.Application +{ + partial class DocumentsOptionPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdDefaultUserDocumentsLocation = new System.Windows.Forms.Button(); + this.txtDefaultUserDocumentsLocation = new System.Windows.Forms.TextBox(); + this.cmdDefaultUserProjectsLocation = new System.Windows.Forms.Button(); + this.txtDefaultUserProjectsLocation = new System.Windows.Forms.TextBox(); + this.chkDetectFileChanges = new System.Windows.Forms.CheckBox(); + this.chkAutomaticallyReloadChangedFile = new System.Windows.Forms.CheckBox(); + this.chkAllowEditingReadonlyFiles = new System.Windows.Forms.CheckBox(); + this.chkStoreRecentFiles = new System.Windows.Forms.CheckBox(); + this.label1 = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.chkStoreRecentProjects = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.chkStoreUndoHistory = new System.Windows.Forms.CheckBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); + this.chkStoreAutoRecoveryInfo = new System.Windows.Forms.CheckBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.numericUpDown4 = new System.Windows.Forms.NumericUpDown(); + this.label9 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); + this.button1 = new System.Windows.Forms.Button(); + this.textBox2 = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit(); + this.SuspendLayout(); + // + // cmdDefaultUserDocumentsLocation + // + this.cmdDefaultUserDocumentsLocation.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdDefaultUserDocumentsLocation.Location = new System.Drawing.Point(3, 3); + this.cmdDefaultUserDocumentsLocation.Name = "cmdDefaultUserDocumentsLocation"; + this.cmdDefaultUserDocumentsLocation.Size = new System.Drawing.Size(182, 23); + this.cmdDefaultUserDocumentsLocation.TabIndex = 0; + this.cmdDefaultUserDocumentsLocation.Text = "Default user docu&ments location"; + this.cmdDefaultUserDocumentsLocation.UseVisualStyleBackColor = true; + // + // txtDefaultUserDocumentsLocation + // + this.txtDefaultUserDocumentsLocation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDefaultUserDocumentsLocation.Location = new System.Drawing.Point(191, 5); + this.txtDefaultUserDocumentsLocation.Name = "txtDefaultUserDocumentsLocation"; + this.txtDefaultUserDocumentsLocation.Size = new System.Drawing.Size(268, 20); + this.txtDefaultUserDocumentsLocation.TabIndex = 1; + // + // cmdDefaultUserProjectsLocation + // + this.cmdDefaultUserProjectsLocation.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdDefaultUserProjectsLocation.Location = new System.Drawing.Point(3, 32); + this.cmdDefaultUserProjectsLocation.Name = "cmdDefaultUserProjectsLocation"; + this.cmdDefaultUserProjectsLocation.Size = new System.Drawing.Size(182, 23); + this.cmdDefaultUserProjectsLocation.TabIndex = 2; + this.cmdDefaultUserProjectsLocation.Text = "Default user &projects location"; + this.cmdDefaultUserProjectsLocation.UseVisualStyleBackColor = true; + // + // txtDefaultUserProjectsLocation + // + this.txtDefaultUserProjectsLocation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDefaultUserProjectsLocation.Location = new System.Drawing.Point(191, 34); + this.txtDefaultUserProjectsLocation.Name = "txtDefaultUserProjectsLocation"; + this.txtDefaultUserProjectsLocation.Size = new System.Drawing.Size(268, 20); + this.txtDefaultUserProjectsLocation.TabIndex = 3; + // + // chkDetectFileChanges + // + this.chkDetectFileChanges.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkDetectFileChanges.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkDetectFileChanges.Location = new System.Drawing.Point(3, 61); + this.chkDetectFileChanges.Name = "chkDetectFileChanges"; + this.chkDetectFileChanges.Size = new System.Drawing.Size(456, 20); + this.chkDetectFileChanges.TabIndex = 4; + this.chkDetectFileChanges.Text = "&Detect when file is changed in another program"; + this.chkDetectFileChanges.UseVisualStyleBackColor = true; + // + // chkAutomaticallyReloadChangedFile + // + this.chkAutomaticallyReloadChangedFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkAutomaticallyReloadChangedFile.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkAutomaticallyReloadChangedFile.Location = new System.Drawing.Point(23, 87); + this.chkAutomaticallyReloadChangedFile.Name = "chkAutomaticallyReloadChangedFile"; + this.chkAutomaticallyReloadChangedFile.Size = new System.Drawing.Size(436, 20); + this.chkAutomaticallyReloadChangedFile.TabIndex = 5; + this.chkAutomaticallyReloadChangedFile.Text = "Automatically re&load the changed file without prompting if the file has been sav" + + "ed"; + this.chkAutomaticallyReloadChangedFile.UseVisualStyleBackColor = true; + // + // chkAllowEditingReadonlyFiles + // + this.chkAllowEditingReadonlyFiles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkAllowEditingReadonlyFiles.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkAllowEditingReadonlyFiles.Location = new System.Drawing.Point(3, 113); + this.chkAllowEditingReadonlyFiles.Name = "chkAllowEditingReadonlyFiles"; + this.chkAllowEditingReadonlyFiles.Size = new System.Drawing.Size(456, 20); + this.chkAllowEditingReadonlyFiles.TabIndex = 6; + this.chkAllowEditingReadonlyFiles.Text = "Allo&w editing of read-only files, warn when attempting to save"; + this.chkAllowEditingReadonlyFiles.UseVisualStyleBackColor = true; + // + // chkStoreRecentFiles + // + this.chkStoreRecentFiles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkStoreRecentFiles.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkStoreRecentFiles.Location = new System.Drawing.Point(3, 139); + this.chkStoreRecentFiles.Name = "chkStoreRecentFiles"; + this.chkStoreRecentFiles.Size = new System.Drawing.Size(456, 20); + this.chkStoreRecentFiles.TabIndex = 7; + this.chkStoreRecentFiles.Text = "K&eep a record of recently-opened documents"; + this.chkStoreRecentFiles.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(40, 167); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(99, 13); + this.label1.TabIndex = 8; + this.label1.Text = "Store a ma&ximum of"; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(145, 165); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(55, 20); + this.numericUpDown1.TabIndex = 9; + this.numericUpDown1.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(206, 167); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(137, 13); + this.label2.TabIndex = 10; + this.label2.Text = "items in the Recent Files list"; + // + // chkStoreRecentProjects + // + this.chkStoreRecentProjects.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkStoreRecentProjects.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkStoreRecentProjects.Location = new System.Drawing.Point(3, 191); + this.chkStoreRecentProjects.Name = "chkStoreRecentProjects"; + this.chkStoreRecentProjects.Size = new System.Drawing.Size(456, 20); + this.chkStoreRecentProjects.TabIndex = 11; + this.chkStoreRecentProjects.Text = "K&eep a record of recently-opened projects"; + this.chkStoreRecentProjects.UseVisualStyleBackColor = true; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(40, 219); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(99, 13); + this.label3.TabIndex = 12; + this.label3.Text = "Store a ma&ximum of"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(206, 219); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(154, 13); + this.label4.TabIndex = 14; + this.label4.Text = "items in the Recent Projects list"; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(145, 217); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(55, 20); + this.numericUpDown2.TabIndex = 13; + this.numericUpDown2.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // chkStoreUndoHistory + // + this.chkStoreUndoHistory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkStoreUndoHistory.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkStoreUndoHistory.Location = new System.Drawing.Point(3, 243); + this.chkStoreUndoHistory.Name = "chkStoreUndoHistory"; + this.chkStoreUndoHistory.Size = new System.Drawing.Size(456, 20); + this.chkStoreUndoHistory.TabIndex = 15; + this.chkStoreUndoHistory.Text = "K&eep a record of &changes made to each document (undo history)"; + this.chkStoreUndoHistory.UseVisualStyleBackColor = true; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(40, 271); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(99, 13); + this.label5.TabIndex = 16; + this.label5.Text = "Store a ma&ximum of"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(206, 271); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(154, 13); + this.label6.TabIndex = 18; + this.label6.Text = "items in the Recent Projects list"; + // + // numericUpDown3 + // + this.numericUpDown3.Location = new System.Drawing.Point(145, 269); + this.numericUpDown3.Name = "numericUpDown3"; + this.numericUpDown3.Size = new System.Drawing.Size(55, 20); + this.numericUpDown3.TabIndex = 17; + this.numericUpDown3.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // chkStoreAutoRecoveryInfo + // + this.chkStoreAutoRecoveryInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkStoreAutoRecoveryInfo.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkStoreAutoRecoveryInfo.Location = new System.Drawing.Point(3, 295); + this.chkStoreAutoRecoveryInfo.Name = "chkStoreAutoRecoveryInfo"; + this.chkStoreAutoRecoveryInfo.Size = new System.Drawing.Size(456, 20); + this.chkStoreAutoRecoveryInfo.TabIndex = 19; + this.chkStoreAutoRecoveryInfo.Text = "&Save automatic recovery information"; + this.chkStoreAutoRecoveryInfo.UseVisualStyleBackColor = true; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(40, 323); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(61, 13); + this.label7.TabIndex = 20; + this.label7.Text = "Sa&ve every"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label8.Location = new System.Drawing.Point(206, 323); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(43, 13); + this.label8.TabIndex = 22; + this.label8.Text = "minutes"; + // + // numericUpDown4 + // + this.numericUpDown4.Location = new System.Drawing.Point(145, 321); + this.numericUpDown4.Name = "numericUpDown4"; + this.numericUpDown4.Size = new System.Drawing.Size(55, 20); + this.numericUpDown4.TabIndex = 21; + this.numericUpDown4.Value = new decimal(new int[] { + 5, + 0, + 0, + 0}); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label9.Location = new System.Drawing.Point(40, 349); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(47, 13); + this.label9.TabIndex = 23; + this.label9.Text = "&Keep for"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label10.Location = new System.Drawing.Point(206, 349); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(29, 13); + this.label10.TabIndex = 25; + this.label10.Text = "days"; + // + // numericUpDown5 + // + this.numericUpDown5.Location = new System.Drawing.Point(145, 347); + this.numericUpDown5.Name = "numericUpDown5"; + this.numericUpDown5.Size = new System.Drawing.Size(55, 20); + this.numericUpDown5.TabIndex = 24; + this.numericUpDown5.Value = new decimal(new int[] { + 7, + 0, + 0, + 0}); + // + // button1 + // + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(3, 373); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(182, 23); + this.button1.TabIndex = 26; + this.button1.Text = "Automatic &recovery location"; + this.button1.UseVisualStyleBackColor = true; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(191, 375); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(268, 20); + this.textBox2.TabIndex = 27; + // + // DocumentsOptionPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.numericUpDown5); + this.Controls.Add(this.numericUpDown4); + this.Controls.Add(this.numericUpDown3); + this.Controls.Add(this.numericUpDown2); + this.Controls.Add(this.label10); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.label8); + this.Controls.Add(this.label6); + this.Controls.Add(this.label4); + this.Controls.Add(this.label9); + this.Controls.Add(this.label2); + this.Controls.Add(this.label7); + this.Controls.Add(this.label5); + this.Controls.Add(this.label3); + this.Controls.Add(this.label1); + this.Controls.Add(this.chkStoreAutoRecoveryInfo); + this.Controls.Add(this.chkStoreUndoHistory); + this.Controls.Add(this.chkStoreRecentProjects); + this.Controls.Add(this.chkStoreRecentFiles); + this.Controls.Add(this.chkAllowEditingReadonlyFiles); + this.Controls.Add(this.chkAutomaticallyReloadChangedFile); + this.Controls.Add(this.chkDetectFileChanges); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.txtDefaultUserProjectsLocation); + this.Controls.Add(this.button1); + this.Controls.Add(this.cmdDefaultUserProjectsLocation); + this.Controls.Add(this.txtDefaultUserDocumentsLocation); + this.Controls.Add(this.cmdDefaultUserDocumentsLocation); + this.Name = "DocumentsOptionPanel"; + this.Size = new System.Drawing.Size(462, 411); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdDefaultUserDocumentsLocation; + private System.Windows.Forms.TextBox txtDefaultUserDocumentsLocation; + private System.Windows.Forms.Button cmdDefaultUserProjectsLocation; + private System.Windows.Forms.TextBox txtDefaultUserProjectsLocation; + private System.Windows.Forms.CheckBox chkDetectFileChanges; + private System.Windows.Forms.CheckBox chkAutomaticallyReloadChangedFile; + private System.Windows.Forms.CheckBox chkAllowEditingReadonlyFiles; + private System.Windows.Forms.CheckBox chkStoreRecentFiles; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox chkStoreRecentProjects; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.CheckBox chkStoreUndoHistory; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.NumericUpDown numericUpDown3; + private System.Windows.Forms.CheckBox chkStoreAutoRecoveryInfo; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.NumericUpDown numericUpDown4; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.NumericUpDown numericUpDown5; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox2; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.cs new file mode 100644 index 00000000..069c76c7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.Settings; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Engines.WindowsForms.OptionPanels.Application +{ + public partial class DocumentsOptionPanel : OptionPanel + { + public DocumentsOptionPanel() + { + InitializeComponent(); + } + + private string[] mvarOptionGroups = new string[] { "Application", "Documents" }; + public override string[] OptionGroups { get { return mvarOptionGroups; } } + + public override void LoadSettings() + { + base.LoadSettings(); + + string defaultUserLocation = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + System.IO.Path.DirectorySeparatorChar.ToString() + "Universal Editor"; + string defaultUserDocumentsLocation = defaultUserLocation + System.IO.Path.DirectorySeparatorChar.ToString() + "Documents"; + string defaultUserProjectsLocation = defaultUserLocation + System.IO.Path.DirectorySeparatorChar.ToString() + "Projects"; + txtDefaultUserDocumentsLocation.Text = SettingsManager.GetPropertyValue(new string[] { "Application", "Documents", "DefaultUserDocumentsLocation" }, defaultUserDocumentsLocation); + txtDefaultUserProjectsLocation.Text = SettingsManager.GetPropertyValue(new string[] { "Application", "Documents", "DefaultUserProjectsLocation" }, defaultUserProjectsLocation); + + chkAllowEditingReadonlyFiles.Checked = SettingsManager.GetPropertyValue(new string[] { "Application", "Documents", "AllowEditingReadonlyFiles" }, false); + } + public override void SaveSettings() + { + base.SaveSettings(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/DocumentsOptionPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.Designer.cs new file mode 100644 index 00000000..a5c01714 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.Designer.cs @@ -0,0 +1,249 @@ +namespace UniversalEditor.Engines.WindowsForms.OptionPanels.Application +{ + partial class GeneralOptionPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraWindowLayout = new System.Windows.Forms.GroupBox(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.fraExtensions = new System.Windows.Forms.GroupBox(); + this.txtOnlineGalleryURL = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.chkEnableGalleryAutoUpdate = new System.Windows.Forms.CheckBox(); + this.chkEnableExtensionGallery = new System.Windows.Forms.CheckBox(); + this.fraTitleBarBehavior = new System.Windows.Forms.GroupBox(); + this.optTitleBarBehaviorNone = new System.Windows.Forms.RadioButton(); + this.optTitleBarBehaviorCurrentFileName = new System.Windows.Forms.RadioButton(); + this.optTitleBarBehaviorCurrentFilePath = new System.Windows.Forms.RadioButton(); + this.fraWindowLayout.SuspendLayout(); + this.fraExtensions.SuspendLayout(); + this.fraTitleBarBehavior.SuspendLayout(); + this.SuspendLayout(); + // + // fraWindowLayout + // + this.fraWindowLayout.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraWindowLayout.Controls.Add(this.radioButton3); + this.fraWindowLayout.Controls.Add(this.radioButton2); + this.fraWindowLayout.Controls.Add(this.radioButton1); + this.fraWindowLayout.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraWindowLayout.Location = new System.Drawing.Point(3, 3); + this.fraWindowLayout.Name = "fraWindowLayout"; + this.fraWindowLayout.Size = new System.Drawing.Size(505, 52); + this.fraWindowLayout.TabIndex = 0; + this.fraWindowLayout.TabStop = false; + this.fraWindowLayout.Text = "Window layout"; + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton3.Location = new System.Drawing.Point(273, 19); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(118, 18); + this.radioButton3.TabIndex = 0; + this.radioButton3.Text = "&Separate windows"; + this.radioButton3.UseVisualStyleBackColor = true; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Checked = true; + this.radioButton2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton2.Location = new System.Drawing.Point(151, 19); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(122, 18); + this.radioButton2.TabIndex = 0; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "&Multiple documents"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.Enabled = false; + this.radioButton1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton1.Location = new System.Drawing.Point(28, 19); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(123, 18); + this.radioButton1.TabIndex = 0; + this.radioButton1.Text = "&Tabbed documents"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // fraExtensions + // + this.fraExtensions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraExtensions.Controls.Add(this.txtOnlineGalleryURL); + this.fraExtensions.Controls.Add(this.label1); + this.fraExtensions.Controls.Add(this.checkBox1); + this.fraExtensions.Controls.Add(this.chkEnableGalleryAutoUpdate); + this.fraExtensions.Controls.Add(this.chkEnableExtensionGallery); + this.fraExtensions.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraExtensions.Location = new System.Drawing.Point(3, 162); + this.fraExtensions.Name = "fraExtensions"; + this.fraExtensions.Size = new System.Drawing.Size(505, 117); + this.fraExtensions.TabIndex = 1; + this.fraExtensions.TabStop = false; + this.fraExtensions.Text = "Extensions"; + // + // txtOnlineGalleryURL + // + this.txtOnlineGalleryURL.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtOnlineGalleryURL.Location = new System.Drawing.Point(151, 42); + this.txtOnlineGalleryURL.Name = "txtOnlineGalleryURL"; + this.txtOnlineGalleryURL.Size = new System.Drawing.Size(348, 20); + this.txtOnlineGalleryURL.TabIndex = 2; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(47, 45); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(98, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Online gallery &URL:"; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(28, 91); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(288, 17); + this.checkBox1.TabIndex = 0; + this.checkBox1.Text = "Load &per-user extensions when running as Administrator"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // chkEnableGalleryAutoUpdate + // + this.chkEnableGalleryAutoUpdate.AutoSize = true; + this.chkEnableGalleryAutoUpdate.Location = new System.Drawing.Point(28, 68); + this.chkEnableGalleryAutoUpdate.Name = "chkEnableGalleryAutoUpdate"; + this.chkEnableGalleryAutoUpdate.Size = new System.Drawing.Size(283, 17); + this.chkEnableGalleryAutoUpdate.TabIndex = 0; + this.chkEnableGalleryAutoUpdate.Text = "Automatically check for up&dates to installed extensions"; + this.chkEnableGalleryAutoUpdate.UseVisualStyleBackColor = true; + // + // chkEnableExtensionGallery + // + this.chkEnableExtensionGallery.AutoSize = true; + this.chkEnableExtensionGallery.Location = new System.Drawing.Point(28, 19); + this.chkEnableExtensionGallery.Name = "chkEnableExtensionGallery"; + this.chkEnableExtensionGallery.Size = new System.Drawing.Size(258, 17); + this.chkEnableExtensionGallery.TabIndex = 0; + this.chkEnableExtensionGallery.Text = "Enable access to extensions in the Online &Gallery"; + this.chkEnableExtensionGallery.UseVisualStyleBackColor = true; + // + // fraTitleBarBehavior + // + this.fraTitleBarBehavior.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraTitleBarBehavior.Controls.Add(this.optTitleBarBehaviorCurrentFilePath); + this.fraTitleBarBehavior.Controls.Add(this.optTitleBarBehaviorCurrentFileName); + this.fraTitleBarBehavior.Controls.Add(this.optTitleBarBehaviorNone); + this.fraTitleBarBehavior.Location = new System.Drawing.Point(3, 61); + this.fraTitleBarBehavior.Name = "fraTitleBarBehavior"; + this.fraTitleBarBehavior.Size = new System.Drawing.Size(505, 95); + this.fraTitleBarBehavior.TabIndex = 2; + this.fraTitleBarBehavior.TabStop = false; + this.fraTitleBarBehavior.Text = "Title bar behavior"; + // + // optTitleBarBehaviorNone + // + this.optTitleBarBehaviorNone.AutoSize = true; + this.optTitleBarBehaviorNone.Checked = true; + this.optTitleBarBehaviorNone.Location = new System.Drawing.Point(28, 19); + this.optTitleBarBehaviorNone.Name = "optTitleBarBehaviorNone"; + this.optTitleBarBehaviorNone.Size = new System.Drawing.Size(301, 17); + this.optTitleBarBehaviorNone.TabIndex = 0; + this.optTitleBarBehaviorNone.TabStop = true; + this.optTitleBarBehaviorNone.Text = "Do not display document-specific information in the title bar"; + this.optTitleBarBehaviorNone.UseVisualStyleBackColor = true; + // + // optTitleBarBehaviorCurrentFileName + // + this.optTitleBarBehaviorCurrentFileName.AutoSize = true; + this.optTitleBarBehaviorCurrentFileName.Location = new System.Drawing.Point(28, 42); + this.optTitleBarBehaviorCurrentFileName.Name = "optTitleBarBehaviorCurrentFileName"; + this.optTitleBarBehaviorCurrentFileName.Size = new System.Drawing.Size(304, 17); + this.optTitleBarBehaviorCurrentFileName.TabIndex = 0; + this.optTitleBarBehaviorCurrentFileName.Text = "Display the file &name of the current document in the title bar"; + this.optTitleBarBehaviorCurrentFileName.UseVisualStyleBackColor = true; + // + // optTitleBarBehaviorCurrentFilePath + // + this.optTitleBarBehaviorCurrentFilePath.AutoSize = true; + this.optTitleBarBehaviorCurrentFilePath.Location = new System.Drawing.Point(28, 65); + this.optTitleBarBehaviorCurrentFilePath.Name = "optTitleBarBehaviorCurrentFilePath"; + this.optTitleBarBehaviorCurrentFilePath.Size = new System.Drawing.Size(299, 17); + this.optTitleBarBehaviorCurrentFilePath.TabIndex = 0; + this.optTitleBarBehaviorCurrentFilePath.Text = "Display the full &path to the current document in the title bar"; + this.optTitleBarBehaviorCurrentFilePath.UseVisualStyleBackColor = true; + // + // ApplicationOptionPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraTitleBarBehavior); + this.Controls.Add(this.fraExtensions); + this.Controls.Add(this.fraWindowLayout); + this.Name = "ApplicationOptionPanel"; + this.Size = new System.Drawing.Size(511, 405); + this.fraWindowLayout.ResumeLayout(false); + this.fraWindowLayout.PerformLayout(); + this.fraExtensions.ResumeLayout(false); + this.fraExtensions.PerformLayout(); + this.fraTitleBarBehavior.ResumeLayout(false); + this.fraTitleBarBehavior.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraWindowLayout; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.GroupBox fraExtensions; + private System.Windows.Forms.TextBox txtOnlineGalleryURL; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox chkEnableExtensionGallery; + private System.Windows.Forms.CheckBox chkEnableGalleryAutoUpdate; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.GroupBox fraTitleBarBehavior; + private System.Windows.Forms.RadioButton optTitleBarBehaviorCurrentFilePath; + private System.Windows.Forms.RadioButton optTitleBarBehaviorCurrentFileName; + private System.Windows.Forms.RadioButton optTitleBarBehaviorNone; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.cs new file mode 100644 index 00000000..5ec2c7c3 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Engines.WindowsForms.OptionPanels.Application +{ + public partial class GeneralOptionPanel : OptionPanel + { + public GeneralOptionPanel() + { + InitializeComponent(); + } + + private string[] mvarOptionGroups = new string[] { "Application", "General" }; + public override string[] OptionGroups { get { return mvarOptionGroups; } } + + public override void LoadSettings() + { + base.LoadSettings(); + + string value = Engine.CurrentEngine.ConfigurationManager.GetValue(new string[] + { + "Application", + "TitleBarBehavior" + }); + switch (value) + { + case "CurrentFileName": + { + optTitleBarBehaviorCurrentFileName.Checked = true; + break; + } + case "CurrentFilePath": + { + optTitleBarBehaviorCurrentFilePath.Checked = true; + break; + } + default: + { + optTitleBarBehaviorNone.Checked = true; + break; + } + } + } + public override void SaveSettings() + { + base.SaveSettings(); + + #region Title Bar Behavior + { + string value = "None"; + if (optTitleBarBehaviorCurrentFileName.Checked) + { + value = "CurrentFileName"; + } + if (optTitleBarBehaviorCurrentFilePath.Checked) + { + value = "CurrentFilePath"; + } + + Engine.CurrentEngine.ConfigurationManager.SetValue(new string[] + { + "Application", + "TitleBarBehavior" + }, value); + } + #endregion + } + public override void ResetSettings() + { + base.ResetSettings(); + + optTitleBarBehaviorNone.Checked = true; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/OptionPanels/Application/GeneralOptionPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.Designer.cs new file mode 100644 index 00000000..94df7495 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Engines.WindowsForms +{ + partial class Page + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.cs new file mode 100644 index 00000000..5f0aeddf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Page.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms +{ + public partial class Page : UserControl + { + public Page() + { + InitializeComponent(); + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDescription = String.Empty; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.Designer.cs new file mode 100644 index 00000000..1e84ab3c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.Designer.cs @@ -0,0 +1,106 @@ +using UniversalEditor.UserInterface.WindowsForms.Controls; +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class EditorPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.errorMessage1 = new UniversalEditor.UserInterface.WindowsForms.Controls.ErrorMessage(); + this.pnlLoading = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.pnlLoading.SuspendLayout(); + this.SuspendLayout(); + // + // errorMessage1 + // + this.errorMessage1.Details = ""; + this.errorMessage1.Dock = System.Windows.Forms.DockStyle.Fill; + this.errorMessage1.Enabled = false; + this.errorMessage1.Location = new System.Drawing.Point(0, 0); + this.errorMessage1.Name = "errorMessage1"; + this.errorMessage1.Size = new System.Drawing.Size(555, 329); + this.errorMessage1.TabIndex = 0; + this.errorMessage1.Title = "There are no editors available for this object model"; + this.errorMessage1.Visible = false; + // + // pnlLoading + // + this.pnlLoading.Controls.Add(this.label1); + this.pnlLoading.Controls.Add(this.progressBar1); + this.pnlLoading.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlLoading.Enabled = false; + this.pnlLoading.Location = new System.Drawing.Point(0, 0); + this.pnlLoading.Name = "pnlLoading"; + this.pnlLoading.Size = new System.Drawing.Size(555, 329); + this.pnlLoading.TabIndex = 1; + this.pnlLoading.Visible = false; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(80, 152); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(396, 19); + this.label1.TabIndex = 1; + this.label1.Text = "Loading, please wait..."; + this.label1.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.Location = new System.Drawing.Point(80, 115); + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(396, 23); + this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + this.progressBar1.TabIndex = 0; + // + // EditorPage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.errorMessage1); + this.Controls.Add(this.pnlLoading); + this.Name = "EditorPage"; + this.Size = new System.Drawing.Size(555, 329); + this.pnlLoading.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private ErrorMessage errorMessage1; + private System.Windows.Forms.Panel pnlLoading; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ProgressBar progressBar1; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.cs new file mode 100644 index 00000000..d45da6b1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.cs @@ -0,0 +1,397 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class EditorPage : FilePage, AwesomeControls.MultipleDocumentContainer.IMultipleDocumentContainerProgressBroadcaster + { + public event EventHandler DocumentEdited; + protected virtual void OnDocumentEdited(EventArgs e) + { + if (DocumentEdited != null) DocumentEdited(this, e); + } + + public EditorPage() + { + InitializeComponent(); + } + + public event AwesomeControls.MultipleDocumentContainer.MultipleDocumentContainerProgressEventHandler Progress; + protected virtual void OnProgress(AwesomeControls.MultipleDocumentContainer.MultipleDocumentContainerProgressEventArgs e) + { + if (Progress != null) Progress(this, e); + } + + /* + private ObjectModel mvarObjectModel = null; + public ObjectModel ObjectModel + { + get { return mvarObjectModel; } + set + { + if (mvarObjectModel != value) + { + ObjectModelChangingEventArgs ce = new ObjectModelChangingEventArgs(mvarObjectModel, value); + OnObjectModelChanging(ce); + if (ce.Cancel) return; + } + mvarObjectModel = value; + + RefreshEditor(); + OnObjectModelChanged(EventArgs.Empty); + } + } + */ + + private Document mvarDocument = null; + public Document Document + { + get { return mvarDocument; } + set + { + if (mvarDocument == value) return; + mvarDocument = value; + + RefreshEditor(); + } + } + + private void RefreshEditor() + { + if (InvokeRequired) + { + while (!IsHandleCreated) + { + System.Threading.Thread.Sleep(500); + } + + Action _RefreshEditor = new Action(RefreshEditorInternal); + Invoke(_RefreshEditor); + } + else + { + RefreshEditorInternal(); + } + } + + private void RefreshEditorInternal() + { + if (mvarDocument == null) return; + if (mvarDocument.ObjectModel == null) return; + + pnlLoading.Enabled = true; + pnlLoading.Visible = true; + + ObjectModel om = mvarDocument.ObjectModel; + EditorReference[] reditors = UniversalEditor.UserInterface.Common.Reflection.GetAvailableEditors(om.MakeReference()); + if (reditors.Length == 0) + { + errorMessage1.Enabled = true; + errorMessage1.Visible = true; + + errorMessage1.Details = "Detected object model: " + om.GetType().FullName; + } + else + { + errorMessage1.Enabled = false; + errorMessage1.Visible = false; + + Controls.Clear(); + Controls.Add(pnlLoading); + + List realEditors = new List(); + foreach (EditorReference reditor in reditors) + { + IEditorImplementation ieditor = reditor.Create(); + if (ieditor is Editor) realEditors.Add((ieditor as Editor)); + } + + if (realEditors.Count == 1) + { + IEditorImplementation ieditor = reditors[0].Create(); + if (ieditor is Editor) + { + Editor editor = (ieditor.GetType().Assembly.CreateInstance(ieditor.GetType().FullName) as Editor); + editor.Dock = DockStyle.Fill; + editor.ObjectModel = om; + editor.DocumentEdited += editor_DocumentEdited; + + pnlLoading.Visible = false; + pnlLoading.Enabled = false; + Controls.Add(editor); + } + } + else + { + TabControl tbs = new TabControl(); + tbs.Dock = DockStyle.Fill; + + foreach (IEditorImplementation ieditor in realEditors) + { + if (ieditor is Editor) + { + System.Reflection.Assembly asm = ieditor.GetType().Assembly; + Editor editor = (asm.CreateInstance(ieditor.GetType().FullName) as Editor); + editor.Dock = DockStyle.Fill; + editor.ObjectModel = om; + editor.DocumentEdited += editor_DocumentEdited; + + TabPage tab = new TabPage(); + tab.Text = editor.Title; + + tab.Controls.Add(editor); + tbs.TabPages.Add(tab); + } + } + + pnlLoading.Visible = false; + pnlLoading.Enabled = false; + Controls.Add(tbs); + } + } + } + + private void editor_DocumentEdited(object sender, EventArgs e) + { + OnDocumentEdited(e); + } + + /* + public event ObjectModelChangingEventHandler ObjectModelChanging; + protected virtual void OnObjectModelChanging(ObjectModelChangingEventArgs e) + { + if (ObjectModelChanging != null) ObjectModelChanging(this, e); + } + public event EventHandler ObjectModelChanged; + protected virtual void OnObjectModelChanged(EventArgs e) + { + if (ObjectModelChanged != null) ObjectModelChanged(this, e); + } + */ + + /// + /// The event that is raised when a file has loaded successfully in the editor. + /// + public event EventHandler FileOpened; + protected virtual void OnFileOpened(object sender, EventArgs e) + { + if (FileOpened != null) FileOpened(this, e); + } + + private void NotifyOnFileOpened(object sender, EventArgs e) + { + Action _NotifyOnFileOpened = new Action(OnFileOpened); + if (IsHandleCreated) Invoke(_NotifyOnFileOpened, sender, e); + } + + public void OpenFile(Document document) + { + this.Document = document; + + if (System.IO.Directory.Exists(document.Accessor.GetFileName())) + { + // we're looking at a directory, so create a FileSystemObjectModel for it + FileSystemObjectModel fsom = FileSystemObjectModel.FromDirectory(document.Accessor.GetFileName()); + + Document = new Document(fsom, null, null); + NotifyOnFileOpened(this, EventArgs.Empty); + RefreshEditor(); + return; + } + + System.Threading.Thread tOpenFile = new System.Threading.Thread(tOpenFile_ThreadStart); + tOpenFile.Start(); + } + + private void _ErrorMessageConfig(bool visible, string title) + { + errorMessage1.Visible = visible; + errorMessage1.Enabled = visible; + if (title != null) errorMessage1.Title = title; + } + private void _ErrorMessageConfig(bool visible, string title, string message) + { + errorMessage1.Visible = visible; + errorMessage1.Enabled = visible; + if (title != null) errorMessage1.Title = title; + if (message != null) errorMessage1.Details = message; + } + + private void tOpenFile_ThreadStart() + { + if (mvarDocument.DataFormat == null) + { + // TODO: DataFormat-guessing should be implemented in the platform- + // independent UserInterface library, or possibly in core + + DataFormatReference[] fmts = UniversalEditor.Common.Reflection.GetAvailableDataFormats(mvarDocument.Accessor); + #region When there is no available DataFormat + if (fmts.Length == 0) + { + Invoke(new Action(_ErrorMessageConfig), true, "There are no data formats available for this file"); + } + #endregion + #region When there is more than one DataFormat + else if (fmts.Length > 1) + { + // attempt to guess the data format for the object model + ObjectModelReference[] objms = UniversalEditor.Common.Reflection.GetAvailableObjectModels(mvarDocument.Accessor); + ObjectModel om1 = null; + DataFormat df1 = null; + bool found1 = false; + bool notimplemented = false; + foreach (ObjectModelReference omr in objms) + { + EditorReference[] reditors = UniversalEditor.UserInterface.Common.Reflection.GetAvailableEditors(omr); + if (reditors.Length < 1) continue; + + ObjectModel om = omr.Create(); + + bool found = false; + DataFormat df = null; + foreach (DataFormatReference dfr in fmts) + { + df = dfr.Create(); + + Document d = new UniversalEditor.Document(om, df, mvarDocument.Accessor); + d.InputAccessor.Open(); + try + { + d.Load(); + found = true; + break; + } + catch (InvalidDataFormatException ex) + { + continue; + } + catch (NotImplementedException ex) + { + notimplemented = true; + continue; + } + catch (NotSupportedException ex) + { + continue; + } + catch (DataCorruptedException ex) + { + // MessageBox.Show("The data is corrupted.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + found = true; + break; + } + catch (ArgumentException ex) + { + found = true; + break; + } + finally + { + // do not close input accessor since we may need to read from it later (i.e. if + // it's a FileSystemObjectModel with deferred file data loading) + + // d.InputAccessor.Close(); + } + } + + if (found) + { + notimplemented = false; + om1 = om; + df1 = df; + found1 = true; + break; + } + } + + if (!found1) + { + Invoke(new Action(_ErrorMessageConfig), true, "There are no data formats available for this file"); + } + else if (notimplemented) + { + Invoke(new Action(_ErrorMessageConfig), true, "The data format for this file has not been implemented"); + } + else + { + Document = new Document(om1, df1, mvarDocument.Accessor); + + if (IsHandleCreated) Invoke(new Action(_ErrorMessageConfig), false, null); + + NotifyOnFileOpened(this, EventArgs.Empty); + } + } + #endregion + #region When there is exactly one DataFormat + else + { + ObjectModelReference[] objms = UniversalEditor.Common.Reflection.GetAvailableObjectModels(fmts[0]); + if (objms.Length >= 1) + { + /* + if (objms.Length > 1) + { + // TODO: Attempt to sort available object models by + // relevance. + Pages.MultipleObjectModelPage page = new Pages.MultipleObjectModelPage(); + // page.DataFormat = fmts[0].Create(); + // page.FileName = FileName; + // page.SelectionChanged += MultipleObjectModelPage_SelectionChanged; + mdcc.Documents.Add(System.IO.Path.GetFileName(FileName), page); + } + else if (objms.Length == 1) + { + */ + try + { + ObjectModel objm = objms[0].Create(); + DataFormat fmt = fmts[0].Create(); + + if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref fmt, CustomOptionDialogType.Import)) return; + + Document document = new UniversalEditor.Document(objm, fmt, mvarDocument.Accessor); + document.InputAccessor.Open(); + document.Load(); + + Document = document; + NotifyOnFileOpened(this, EventArgs.Empty); + } + catch (InvalidDataFormatException ex) + { + Invoke(new Action(_ErrorMessageConfig), true, ex.GetType().FullName, ex.Message); + } + } + else + { + + } + } + #endregion + } + else + { + ObjectModel objm = mvarDocument.ObjectModel; + DataFormat fmt = mvarDocument.DataFormat; + + if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref fmt, CustomOptionDialogType.Import)) return; + + Document document = new UniversalEditor.Document(objm, fmt, mvarDocument.Accessor); + document.InputAccessor.Open(); + document.Load(); + + Document = document; + NotifyOnFileOpened(this, EventArgs.Empty); + } + + RefreshEditor(); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EditorPage.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.Designer.cs new file mode 100644 index 00000000..5ac6a5aa --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.Designer.cs @@ -0,0 +1,61 @@ +using UniversalEditor.UserInterface.WindowsForms.Controls; +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class EmbeddedEditorPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.errorMessage1 = new ErrorMessage(); + this.SuspendLayout(); + // + // errorMessage1 + // + this.errorMessage1.Dock = System.Windows.Forms.DockStyle.Fill; + this.errorMessage1.Enabled = false; + this.errorMessage1.Location = new System.Drawing.Point(0, 0); + this.errorMessage1.Name = "errorMessage1"; + this.errorMessage1.Size = new System.Drawing.Size(480, 332); + this.errorMessage1.TabIndex = 0; + this.errorMessage1.Visible = false; + // + // EditorPage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.errorMessage1); + this.Name = "EditorPage"; + this.Size = new System.Drawing.Size(480, 332); + this.ResumeLayout(false); + + } + + #endregion + + private ErrorMessage errorMessage1; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.cs new file mode 100644 index 00000000..76dc749d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class EmbeddedEditorPage : Page + { + public event EventHandler DocumentEdited; + protected virtual void OnDocumentEdited(EventArgs e) + { + if (DocumentEdited != null) DocumentEdited(this, e); + } + + public EmbeddedEditorPage() + { + InitializeComponent(); + } + + /* + private ObjectModel mvarObjectModel = null; + public ObjectModel ObjectModel + { + get { return mvarObjectModel; } + set + { + if (mvarObjectModel != value) + { + ObjectModelChangingEventArgs ce = new ObjectModelChangingEventArgs(mvarObjectModel, value); + OnObjectModelChanging(ce); + if (ce.Cancel) return; + } + mvarObjectModel = value; + + RefreshEditor(); + OnObjectModelChanged(EventArgs.Empty); + } + } + */ + + private Document mvarDocument = null; + public Document Document + { + get { return mvarDocument; } + set + { + if (mvarDocument == value) return; + + mvarDocument = value; + RefreshEditor(); + } + } + + private void RefreshEditor() + { + Controls.Clear(); + if (mvarDocument == null) return; + if (mvarDocument.ObjectModel == null) return; + + ObjectModel om = mvarDocument.ObjectModel; + EditorReference[] reditors = UniversalEditor.UserInterface.Common.Reflection.GetAvailableEditors(om.MakeReference()); + if (reditors.Length == 0) + { + errorMessage1.Enabled = true; + errorMessage1.Visible = true; + + errorMessage1.Details = "Detected object model: " + om.GetType().FullName; + } + else + { + errorMessage1.Enabled = false; + errorMessage1.Visible = false; + + if (reditors.Length == 1) + { + IEditorImplementation ieditor = reditors[0].Create(); + if (ieditor is Editor) + { + Editor editor = (ieditor as Editor); + editor.Dock = DockStyle.Fill; + editor.ObjectModel = om; + editor.DocumentEdited += editor_DocumentEdited; + + Controls.Add(editor); + } + } + else + { + TabControl tbs = new TabControl(); + tbs.Dock = DockStyle.Fill; + + foreach (EditorReference reditor in reditors) + { + IEditorImplementation ieditor = reditor.Create(); + if (ieditor is Editor) + { + Editor editor = (ieditor as Editor); + editor.Dock = DockStyle.Fill; + editor.ObjectModel = om; + editor.DocumentEdited += editor_DocumentEdited; + + TabPage tab = new TabPage(); + tab.Text = editor.Title; + + tab.Controls.Add(editor); + tbs.TabPages.Add(tab); + } + } + + Controls.Add(tbs); + } + } + } + + private void editor_DocumentEdited(object sender, EventArgs e) + { + OnDocumentEdited(e); + } + + /* + public event ObjectModelChangingEventHandler ObjectModelChanging; + protected virtual void OnObjectModelChanging(ObjectModelChangingEventArgs e) + { + if (ObjectModelChanging != null) ObjectModelChanging(this, e); + } + public event EventHandler ObjectModelChanged; + protected virtual void OnObjectModelChanged(EventArgs e) + { + if (ObjectModelChanged != null) ObjectModelChanged(this, e); + } + */ + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.resx new file mode 100644 index 00000000..058096e6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/EmbeddedEditorPage.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.Designer.cs new file mode 100644 index 00000000..efd870a9 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.Designer.cs @@ -0,0 +1,64 @@ +using UniversalEditor.UserInterface.WindowsForms.Controls; +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class ExplorerPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.explorer = new LocalFileSystemExplorer(); + this.SuspendLayout(); + // + // explorer + // + this.explorer.Dock = System.Windows.Forms.DockStyle.Fill; + this.explorer.Location = new System.Drawing.Point(0, 0); + this.explorer.Name = "explorer"; + this.explorer.Path = ""; + this.explorer.ShowDetails = false; + this.explorer.ShowFavorites = false; + this.explorer.ShowPreview = false; + this.explorer.Size = new System.Drawing.Size(700, 372); + this.explorer.TabIndex = 0; + this.explorer.Navigate += new NavigateEventHandler(this.explorer_Navigate); + // + // ExplorerPage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.explorer); + this.Name = "ExplorerPage"; + this.Size = new System.Drawing.Size(700, 372); + this.ResumeLayout(false); + + } + + #endregion + + private LocalFileSystemExplorer explorer; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.cs new file mode 100644 index 00000000..327df386 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using UniversalEditor.Engines.WindowsForms.Controls; +using UniversalEditor.UserInterface.WindowsForms.Controls; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class ExplorerPage : System.Windows.Forms.UserControl + { + public ExplorerPage() + { + InitializeComponent(); + } + + public string Path + { + get { return explorer.Path; } + set { explorer.Path = value; } + } + + public event NavigateEventHandler Navigate; + + private void explorer_Navigate(object sender, NavigateEventArgs e) + { + if (Navigate != null) Navigate(this, e); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.resx new file mode 100644 index 00000000..058096e6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/ExplorerPage.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.Designer.cs new file mode 100644 index 00000000..c0525650 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class FilePage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.cs new file mode 100644 index 00000000..215cb1e9 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/FilePage.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class FilePage : Page + { + public FilePage() + { + InitializeComponent(); + } + + private Document mvarDocument = null; + public Document Document + { + get { return mvarDocument; } + set + { + OnDocumentChanging(EventArgs.Empty); + + mvarDocument = value; + if (mvarDocument.Accessor != null) + { + try + { + Title = System.IO.Path.GetFileName(mvarDocument.Accessor.GetFileName()); + } + catch + { + Title = mvarDocument.Accessor.GetFileName(); + } + Description = mvarDocument.Accessor.GetFileName(); + } + + OnDocumentChanged(EventArgs.Empty); + } + } + + protected virtual void OnDocumentChanging(EventArgs e) + { + } + protected virtual void OnDocumentChanged(EventArgs e) + { + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.Designer.cs new file mode 100644 index 00000000..1fd7fafc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.Designer.cs @@ -0,0 +1,60 @@ +using UniversalEditor.UserInterface.WindowsForms.Controls; +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class GenericErrorPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.err = new ErrorMessage(); + this.SuspendLayout(); + // + // err + // + this.err.Details = ""; + this.err.Dock = System.Windows.Forms.DockStyle.Fill; + this.err.Location = new System.Drawing.Point(0, 0); + this.err.Name = "err"; + this.err.Size = new System.Drawing.Size(502, 346); + this.err.TabIndex = 1; + // + // GenericErrorPage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.err); + this.Name = "GenericErrorPage"; + this.Size = new System.Drawing.Size(502, 346); + this.ResumeLayout(false); + + } + + #endregion + + private ErrorMessage err; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.cs new file mode 100644 index 00000000..959b67a7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class GenericErrorPage : UserControl + { + public GenericErrorPage() + { + InitializeComponent(); + } + + public string Title + { + get { return err.Title; } + set { err.Title = value; } + } + + private Exception mvarException = null; + public Exception Exception + { + get { return mvarException; } + set { mvarException = value; Title = mvarException.GetType().FullName; err.Details = mvarException.Message; } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.resx new file mode 100644 index 00000000..058096e6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/GenericErrorPage.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.Designer.cs new file mode 100644 index 00000000..efefcac8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.Designer.cs @@ -0,0 +1,62 @@ +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class InvalidFormatPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblMessage = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblMessage + // + this.lblMessage.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblMessage.AutoSize = true; + this.lblMessage.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblMessage.ForeColor = System.Drawing.Color.Black; + this.lblMessage.Location = new System.Drawing.Point(187, 167); + this.lblMessage.Name = "lblMessage"; + this.lblMessage.Size = new System.Drawing.Size(128, 13); + this.lblMessage.TabIndex = 0; + this.lblMessage.Text = "The data format is invalid."; + // + // InvalidFormatPage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.lblMessage); + this.Name = "InvalidFormatPage"; + this.Size = new System.Drawing.Size(502, 346); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblMessage; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.cs new file mode 100644 index 00000000..55ea4e15 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class InvalidFormatPage : UserControl + { + public InvalidFormatPage() + { + InitializeComponent(); + } + + private Exception mvarException = null; + public Exception Exception + { + get { return mvarException; } + set { mvarException = value; } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/InvalidFormatPage.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.Designer.cs new file mode 100644 index 00000000..ec5da513 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class MultipleObjectModelPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.cs new file mode 100644 index 00000000..979b45d3 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/MultipleObjectModelPage.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class MultipleObjectModelPage : FilePage + { + public MultipleObjectModelPage() + { + InitializeComponent(); + } + + private string mvarFileType = String.Empty; + public string FileType { get { return mvarFileType; } set { mvarFileType = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.Designer.cs new file mode 100644 index 00000000..dbb7df93 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.Designer.cs @@ -0,0 +1,209 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class StartPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StartPage)); + this.pnlTop = new System.Windows.Forms.Panel(); + this.picIcon = new System.Windows.Forms.PictureBox(); + this.lblApplicationTitle = new System.Windows.Forms.Label(); + this.pnlSide = new System.Windows.Forms.Panel(); + this.lvRecent = new AwesomeControls.ListView.ListViewControl(); + this.chkShowStartPageAtStartup = new System.Windows.Forms.CheckBox(); + this.lblOpenProject = new AwesomeControls.Label.LabelControl(); + this.lblNewProject = new AwesomeControls.Label.LabelControl(); + this.label5 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.pnlTop.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picIcon)).BeginInit(); + this.pnlSide.SuspendLayout(); + this.SuspendLayout(); + // + // pnlTop + // + this.pnlTop.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + this.pnlTop.Controls.Add(this.picIcon); + this.pnlTop.Controls.Add(this.lblApplicationTitle); + this.pnlTop.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlTop.Location = new System.Drawing.Point(0, 0); + this.pnlTop.Name = "pnlTop"; + this.pnlTop.Size = new System.Drawing.Size(813, 74); + this.pnlTop.TabIndex = 0; + // + // picIcon + // + this.picIcon.Image = ((System.Drawing.Image)(resources.GetObject("picIcon.Image"))); + this.picIcon.Location = new System.Drawing.Point(3, 5); + this.picIcon.Name = "picIcon"; + this.picIcon.Size = new System.Drawing.Size(64, 64); + this.picIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picIcon.TabIndex = 1; + this.picIcon.TabStop = false; + // + // lblApplicationTitle + // + this.lblApplicationTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblApplicationTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblApplicationTitle.Font = new System.Drawing.Font("Segoe UI Light", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblApplicationTitle.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.lblApplicationTitle.Location = new System.Drawing.Point(73, 15); + this.lblApplicationTitle.Name = "lblApplicationTitle"; + this.lblApplicationTitle.Size = new System.Drawing.Size(725, 37); + this.lblApplicationTitle.TabIndex = 0; + this.lblApplicationTitle.Text = "Universal Editor"; + // + // pnlSide + // + this.pnlSide.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.pnlSide.Controls.Add(this.lvRecent); + this.pnlSide.Controls.Add(this.chkShowStartPageAtStartup); + this.pnlSide.Controls.Add(this.lblOpenProject); + this.pnlSide.Controls.Add(this.lblNewProject); + this.pnlSide.Controls.Add(this.label5); + this.pnlSide.Controls.Add(this.label2); + this.pnlSide.Dock = System.Windows.Forms.DockStyle.Left; + this.pnlSide.Location = new System.Drawing.Point(0, 74); + this.pnlSide.Name = "pnlSide"; + this.pnlSide.Size = new System.Drawing.Size(264, 371); + this.pnlSide.TabIndex = 1; + // + // lvRecent + // + this.lvRecent.AllowSorting = true; + this.lvRecent.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvRecent.BackColor = System.Drawing.SystemColors.Window; + this.lvRecent.DefaultItemHeight = 24; + this.lvRecent.ForeColor = System.Drawing.SystemColors.WindowText; + this.lvRecent.FullRowSelect = true; + this.lvRecent.HideSelection = false; + this.lvRecent.LargeImageList = null; + this.lvRecent.Location = new System.Drawing.Point(24, 130); + this.lvRecent.Mode = AwesomeControls.ListView.ListViewMode.List; + this.lvRecent.Name = "lvRecent"; + this.lvRecent.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lvRecent.Size = new System.Drawing.Size(218, 199); + this.lvRecent.SmallImageList = null; + this.lvRecent.SortColumn = null; + this.lvRecent.TabIndex = 3; + this.lvRecent.ItemActivate += new System.EventHandler(this.lvRecent_ItemActivate); + // + // chkShowStartPageAtStartup + // + this.chkShowStartPageAtStartup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkShowStartPageAtStartup.Checked = true; + this.chkShowStartPageAtStartup.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkShowStartPageAtStartup.Location = new System.Drawing.Point(24, 337); + this.chkShowStartPageAtStartup.Name = "chkShowStartPageAtStartup"; + this.chkShowStartPageAtStartup.Size = new System.Drawing.Size(219, 21); + this.chkShowStartPageAtStartup.TabIndex = 1; + this.chkShowStartPageAtStartup.Text = "Show this page at &startup"; + this.chkShowStartPageAtStartup.UseVisualStyleBackColor = true; + // + // lblOpenProject + // + this.lblOpenProject.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblOpenProject.Font = new System.Drawing.Font("Segoe UI", 9F); + this.lblOpenProject.HotTrack = true; + this.lblOpenProject.HoverColor = System.Drawing.Color.Red; + this.lblOpenProject.Location = new System.Drawing.Point(21, 70); + this.lblOpenProject.Name = "lblOpenProject"; + this.lblOpenProject.Size = new System.Drawing.Size(222, 20); + this.lblOpenProject.TabIndex = 0; + this.lblOpenProject.Text = "Open Existing Project..."; + this.lblOpenProject.Click += new System.EventHandler(this.lblOpenProject_Click); + // + // lblNewProject + // + this.lblNewProject.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblNewProject.Font = new System.Drawing.Font("Segoe UI", 9F); + this.lblNewProject.HotTrack = true; + this.lblNewProject.HoverColor = System.Drawing.Color.Red; + this.lblNewProject.Location = new System.Drawing.Point(21, 50); + this.lblNewProject.Name = "lblNewProject"; + this.lblNewProject.Size = new System.Drawing.Size(221, 20); + this.lblNewProject.TabIndex = 0; + this.lblNewProject.Text = "Create New Project..."; + this.lblNewProject.Click += new System.EventHandler(this.lblNewProject_Click); + // + // label5 + // + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Font = new System.Drawing.Font("Segoe UI Light", 12F); + this.label5.Location = new System.Drawing.Point(20, 101); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(222, 26); + this.label5.TabIndex = 0; + this.label5.Text = "Recent items"; + // + // label2 + // + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Font = new System.Drawing.Font("Segoe UI Light", 12F); + this.label2.Location = new System.Drawing.Point(20, 15); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(222, 26); + this.label2.TabIndex = 0; + this.label2.Text = "Get started"; + // + // StartPage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(77)))), ((int)(((byte)(77)))), ((int)(((byte)(77))))); + this.Controls.Add(this.pnlSide); + this.Controls.Add(this.pnlTop); + this.Name = "StartPage"; + this.Size = new System.Drawing.Size(813, 445); + this.pnlTop.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picIcon)).EndInit(); + this.pnlSide.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel pnlTop; + private System.Windows.Forms.Label lblApplicationTitle; + private System.Windows.Forms.Panel pnlSide; + private AwesomeControls.Label.LabelControl lblNewProject; + private System.Windows.Forms.Label label2; + private AwesomeControls.Label.LabelControl lblOpenProject; + private System.Windows.Forms.CheckBox chkShowStartPageAtStartup; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.PictureBox picIcon; + private AwesomeControls.ListView.ListViewControl lvRecent; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.cs new file mode 100644 index 00000000..a6a91317 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class StartPage : Page + { + public StartPage() + { + InitializeComponent(); + + Title = "Start Page"; + Description = "Start Page"; + + lblApplicationTitle.Text = LocalConfiguration.ApplicationName; + + pnlTop.BackColor = LocalConfiguration.ColorScheme.DarkColor; + pnlSide.BackColor = LocalConfiguration.ColorScheme.LightColor; + BackColor = LocalConfiguration.ColorScheme.BackgroundColor; + + if (LocalConfiguration.MainIcon != null) + { + picIcon.Image = LocalConfiguration.MainIcon.ToBitmap(); + } + + foreach (string FileName in Engine.CurrentEngine.RecentFileManager.FileNames) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = System.IO.Path.GetFileName(FileName); + lvi.TooltipText = FileName; + lvRecent.Items.Add(lvi); + } + } + + public event EventHandler NewProjectClicked; + public event EventHandler OpenProjectClicked; + + private void lblNewProject_Click(object sender, EventArgs e) + { + if (NewProjectClicked != null) NewProjectClicked(sender, e); + } + + private void lblOpenProject_Click(object sender, EventArgs e) + { + if (OpenProjectClicked != null) OpenProjectClicked(sender, e); + } + + private void lvRecent_ItemActivate(object sender, EventArgs e) + { + if (lvRecent.SelectedItems.Count < 1) return; + + if (!System.IO.File.Exists(lvRecent.SelectedItems[0].TooltipText)) + { + if (MessageBox.Show("The file \"" + lvRecent.SelectedItems[0].TooltipText + "\" does not exist. Would you like to remove it from the Recent Documents list?", "File Not Found", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.Yes) + { + Engine.CurrentEngine.RecentFileManager.FileNames.Remove(lvRecent.SelectedItems[0].TooltipText); + lvRecent.Items.Remove(lvRecent.SelectedItems[0]); + } + return; + } + Engine.CurrentEngine.OpenFile(lvRecent.SelectedItems[0].TooltipText); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.resx new file mode 100644 index 00000000..93f452e6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/StartPage.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.Designer.cs new file mode 100644 index 00000000..ef32bace --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + partial class UnknownFormatPage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.cs new file mode 100644 index 00000000..5498e7ba --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Pages/UnknownFormatPage.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms.Pages +{ + public partial class UnknownFormatPage : FilePage + { + public UnknownFormatPage() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.Designer.cs new file mode 100644 index 00000000..59a91710 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Engines.WindowsForms +{ + partial class Panel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.cs new file mode 100644 index 00000000..f81549b6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Panel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Engines.WindowsForms +{ + public partial class Panel : UserControl + { + public Panel() + { + InitializeComponent(); + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDescription = String.Empty; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..771826b1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor engine for Windows Forms")] +[assembly: AssemblyDescription("Provides a Windows Forms-based user interface for Universal Editor.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2013 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7800ea28-c436-4dae-b0ae-c11f667f11d4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("3.0.*")] +[assembly: AssemblyFileVersion("3.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.Designer.cs new file mode 100644 index 00000000..0f81ac0c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Engines.WindowsForms.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Engines.WindowsForms.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon mainicon { + get { + object obj = ResourceManager.GetObject("mainicon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon project_icon { + get { + object obj = ResourceManager.GetObject("project_icon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon solution_icon { + get { + object obj = ResourceManager.GetObject("solution_icon", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.resx new file mode 100644 index 00000000..3d133cfb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\mainicon.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ueproj-icon.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\uesln-icon.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.Designer.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.Designer.cs new file mode 100644 index 00000000..82fab35a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Engines.WindowsForms.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.settings b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/mainicon.ico b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/mainicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c919c66045a0226460bcb0ddaf9a222595fb3bf9 GIT binary patch literal 100348 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

-R`*7QMJ#^6J6!cO;CwMfKc7 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

e1# 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/ueproj-icon.ico b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/Resources/ueproj-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df191f62e4fa1cb4df54b73144e60ba42c14a0eb GIT binary patch literal 4406 zcmeHKX;4&W7VXT;&-sy`^V6y^hzlyR1W*+anO7)!TSE}cqSK)nuD)~1mm5WNHTCjlq{X5l_->Osv_@68OhmYVB*3aSXXL)^d zsp!APRfl;fXUjjnK$p+HLuCay^x?^Dx|nx}F66#R#hNtwbM_wk(;t$kAR~d^eKU?u zq{Y%7_eN93u28ZQx81EE*)U6H?IcOlqa;l{Az`$SgrP1n^|ulK_z@Yq9+I)Wj=0up zGU3VF8#8ylwvr^A7qwF)PLGjkVu(zm{lpJ-lX0MpxZY+mbTyE^{T}IBYKUv8rjrMD z&z-NkMP{Skfg#`y0`6cM=_4b)KB6v(V#;2!!Jk`#;)UWSK0INU~reGp8d_H$&nKyT=F#V>XPzPU8Anp=UF_mz(j_ zd9ql5VYXuMMg>FCOIXRi)CQ!fT}kU%hwg%aW5{oIkD(^PI0I!#B*r6QtQmab{ec z8ig;ICI;aQFiL)?2R3IM?114KA2)NokGSpzL+1lS$9>qYzU8j2xmw#)rE9#cZK#}m zP;s^7-PgmtobX{fX8nw$of5SZ;>?&hH6lz537{D5hmZ2Z3dKM>*9VFgP#6>nJ)@|_ zaL_e>uWPzvrTDt^G_-QY=k#WT01DldXp3S*m>hypgTfv~CqK{*%by>GzT=+0wN8g9 znm|#dZM+Swk|KPZ@MWU`vj|aGDKH0YQP?Tq!lvPFez4OBioRB3Z!_2P2;+?j)qY>s zR;zEV(KS`;9^EPbs3>`}pEEwsnRx?7gf$9LJBhJrr4T2c2;+m8yryB~q8nC^=?MzV zPeV^5*Zt7Y0SZJ>t7k%0-zYnex^l)Bco`Ikg3~Fvo<=&v*>Mb2aT2+BA|ThG80iHC zqTu`6xV{$daTC|mhyiQpsK=N_EXMD0SY51AXK-F!q8r)YrR|f*Ngk20-fA=olCw!947D>W7AtMn2qhJ*UiIj>}%4r2^Tl6aCeHX4!mhwp1v3l80wNR7La z0HG4IackdMTU&{u%Q(>4e5V{k>L>A83@i(Fm6VEw0V?if%eB&X(`-`M`fdaUg}&=< ztEo7avh&}-w%(z~A2=Yv5`>KVM(p7kysz#vbV9>FMFIYL$okN_T96%a<>A zb8}m|Z0V9EOBOG7U9`y6#f5$ObG(3$MYN=(1gmJ#*`hOrg{M!SI(afbFE1}Q_gGF& z&e5Ysvkqq+$~=^jp0R)b{(bxQrKF}NB_^uX>iD?0*x1axBS()MKAe@AnTeg-djHhal%%A@ zgamb5ymEg#{xj~sDcq|6dPV=>kl=Mp|G=QYz(A(|Y9_x`e;=#<9!&pL?(QpBthDOC hY$io4h#qNEW)RE!I#xEqN| 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 vKf!Ek&z^qYYwWmo?h{PMwR7J + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + ///

+ /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashScreenWindow)); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.lblStatus = new System.Windows.Forms.Label(); + this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.lblTitle = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(128, 128); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 1; + this.pictureBox1.TabStop = false; + // + // lblStatus + // + this.lblStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblStatus.Location = new System.Drawing.Point(12, 13); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(493, 16); + this.lblStatus.TabIndex = 2; + this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.Location = new System.Drawing.Point(12, 38); + this.progressBar1.MarqueeAnimationSpeed = 5; + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Size = new System.Drawing.Size(493, 23); + this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; + this.progressBar1.TabIndex = 3; + // + // lblTitle + // + this.lblTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI Light", 32F); + this.lblTitle.Location = new System.Drawing.Point(135, 9); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(374, 66); + this.lblTitle.TabIndex = 4; + this.lblTitle.Text = "Universal Editor"; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Font = new System.Drawing.Font("Segoe UI Light", 20F); + this.label1.Location = new System.Drawing.Point(135, 75); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(374, 41); + this.label1.TabIndex = 4; + this.label1.Text = "version 4.0"; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(37)))), ((int)(((byte)(37)))), ((int)(((byte)(38))))); + this.panel1.Controls.Add(this.lblStatus); + this.panel1.Controls.Add(this.progressBar1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(0, 134); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(517, 72); + this.panel1.TabIndex = 5; + // + // SplashScreenWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(48))))); + this.ClientSize = new System.Drawing.Size(517, 206); + this.ControlBox = false; + this.Controls.Add(this.panel1); + this.Controls.Add(this.label1); + this.Controls.Add(this.lblTitle); + this.Controls.Add(this.pictureBox1); + this.ForeColor = System.Drawing.Color.White; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SplashScreenWindow"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label lblStatus; + private System.Windows.Forms.ProgressBar progressBar1; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.cs new file mode 100644 index 00000000..313ab47a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms +{ + public partial class SplashScreenWindow : Form + { + public SplashScreenWindow() + { + InitializeComponent(); + + // base.Font = SystemFonts.MenuFont; + // label1.Font = new Font(base.Font.FontFamily, 18, FontStyle.Bold); + // label1.Text = Configuration.ApplicationName; + + // label2.Font = base.Font; + + /* + string path = System.Reflection.Assembly.GetExecutingAssembly().Location; + Icon icn = IconMethods.ExtractAssociatedIcon(path, 0); + if (icn != null) + { + pictureBox1.Image = icn.ToBitmap(); + } + */ + + lblTitle.Text = Engine.CurrentEngine.DefaultLanguage.GetStringTableEntry("ApplicationTitle", "Universal Editor"); + this.Text = lblTitle.Text; + + if (LocalConfiguration.SplashScreen.Image != null) + { + pictureBox1.Image = LocalConfiguration.SplashScreen.Image; + } + else + { + if (!String.IsNullOrEmpty(LocalConfiguration.SplashScreen.ImageFileName)) + { + if (System.IO.File.Exists(LocalConfiguration.SplashScreen.ImageFileName)) + { + pictureBox1.Image = Image.FromFile(LocalConfiguration.SplashScreen.ImageFileName); + } + } + } + // Size = pictureBox1.Image.Size; + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (LocalConfiguration.SplashScreen.Sound != null) + { + System.Media.SoundPlayer sp = new System.Media.SoundPlayer(LocalConfiguration.SplashScreen.Sound); + sp.Play(); + } + else + { + if (System.IO.File.Exists(LocalConfiguration.SplashScreen.SoundFileName)) + { + System.Media.SoundPlayer sp = new System.Media.SoundPlayer(LocalConfiguration.SplashScreen.SoundFileName); + sp.Play(); + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + e.Graphics.DrawRectangle(Pens.Black, new Rectangle(0, 0, base.Width - 1, base.Height - 1)); + } + + internal void InvokeClose() + { + while (!this.IsHandleCreated) + { + System.Threading.Thread.Sleep(500); + } + Invoke(new Action(_InvokeClose)); + } + private void _InvokeClose() + { + Close(); + } + + internal void InvokeUpdateStatus(string p) + { + Invoke(new Action(_InvokeUpdateStatus), p); + } + private void _InvokeUpdateStatus(string p) + { + lblStatus.Text = p; + } + } + public class SplashScreenSettings + { + private bool mvarEnabled = true; + public bool Enabled { get { return mvarEnabled; } set { mvarEnabled = value; } } + + private string mvarImageFileName = String.Empty; + public string ImageFileName { get { return mvarImageFileName; } set { mvarImageFileName = value; } } + + private string mvarSoundFileName = String.Empty; + public string SoundFileName { get { return mvarSoundFileName; } set { mvarSoundFileName = value; } } + + private Image mvarImage = null; + public Image Image { get { return mvarImage; } set { mvarImage = value; } } + + private System.IO.MemoryStream mvarSound = null; + public System.IO.MemoryStream Sound { get { return mvarSound; } set { mvarSound = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.resx b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.resx new file mode 100644 index 00000000..8650c5d5 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/SplashScreenWindow.resx @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/TemporaryFileManager.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/TemporaryFileManager.cs new file mode 100644 index 00000000..20952275 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/TemporaryFileManager.cs @@ -0,0 +1,63 @@ +using System; + +internal static class TemporaryFileManager +{ + private static Random rand = new Random(); + + private static System.Collections.Specialized.StringCollection mvarTemporaryFileNames = new System.Collections.Specialized.StringCollection(); + private static string mvarTemporaryFilePath = null; + + public static string CreateTemporaryFile(string FileName, byte[] FileData) + { + if (mvarTemporaryFilePath == null) throw new InvalidOperationException(); + if (!System.IO.Directory.Exists(mvarTemporaryFilePath)) + { + System.IO.Directory.CreateDirectory(mvarTemporaryFilePath); + } + + FileName = System.IO.Path.GetFileName(FileName); + if (FileData == null) FileData = new byte[0]; + + string filePath = mvarTemporaryFilePath + System.IO.Path.DirectorySeparatorChar.ToString() + FileName; + System.IO.File.WriteAllBytes(filePath, FileData); + mvarTemporaryFileNames.Add(filePath); + return filePath; + } + + public static bool RegisterTemporaryDirectory(string prefix, int maxNameLength) + { + if (mvarTemporaryFilePath != null) + { + return false; + } + string name = String.Empty; + do + { + name = prefix + rand.Next(0, (maxNameLength * 10) - 1).ToString().PadLeft(maxNameLength - prefix.Length, '0'); + } + while (System.IO.Directory.Exists(name)); + + string pathName = System.IO.Path.GetTempPath() + System.IO.Path.DirectorySeparatorChar.ToString() + name; + System.IO.Directory.CreateDirectory(pathName); + + mvarTemporaryFilePath = pathName; + return true; + } + public static bool UnregisterTemporaryDirectory() + { + if (mvarTemporaryFilePath == null) return false; + + foreach (string fileName in mvarTemporaryFileNames) + { + if (System.IO.File.Exists(fileName)) + { + System.IO.File.Delete(fileName); + } + } + if (System.IO.Directory.Exists(mvarTemporaryFilePath)) + { + System.IO.Directory.Delete(mvarTemporaryFilePath, true); + } + return true; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/UniversalEditor.Engines.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/UniversalEditor.Engines.WindowsForms.csproj new file mode 100644 index 00000000..d7511b16 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/UniversalEditor.Engines.WindowsForms.csproj @@ -0,0 +1,335 @@ + + + + + Debug + AnyCPU + {118E40C4-323E-4B4B-8EF4-38EED6CC5E83} + Library + Properties + UniversalEditor.Engines.WindowsForms + UniversalEditor.Engines.WindowsForms + v4.0 + 512 + 12.0.0 + 2.0 + + + + AnyCPU + true + full + false + ..\..\..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + AnyCPU + none + true + ..\..\Output\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + UserControl + + + OutputWindow.cs + + + + Form + + + GenericBrowserPopup.cs + + + Form + + + CrashDialog.cs + + + Form + + + DocumentPropertiesDialog.cs + + + + UserControl + + + ErrorList.cs + + + UserControl + + + SolutionExplorer.cs + + + Form + + + AboutDialog.cs + + + Form + + + DataFormatAboutDialog.cs + + + Form + + + CustomOptionsDialog.cs + + + Form + + + NewDialog.cs + + + Form + + + OptionsDialog.cs + + + Form + + + SelectPerspectiveDialog.cs + + + Form + + + SessionDialog.cs + + + Form + + + UnsavedDocumentsDialog.cs + + + + Form + + + MainWindow.cs + + + UserControl + + + GeneralOptionPanel.cs + + + UserControl + + + DocumentsOptionPanel.cs + + + UserControl + + + Page.cs + + + UserControl + + + EditorPage.cs + + + UserControl + + + + UserControl + + + ExplorerPage.cs + + + UserControl + + + FilePage.cs + + + UserControl + + + GenericErrorPage.cs + + + UserControl + + + MultipleObjectModelPage.cs + + + UserControl + + + StartPage.cs + + + + + Form + + + SplashScreenWindow.cs + + + + ErrorList.cs + + + OutputWindow.cs + + + SolutionExplorer.cs + + + AboutDialog.cs + + + GenericBrowserPopup.cs + + + CrashDialog.cs + + + DataFormatAboutDialog.cs + + + CustomOptionsDialog.cs + + + NewDialog.cs + + + OptionsDialog.cs + + + DocumentPropertiesDialog.cs + + + SelectPerspectiveDialog.cs + + + SessionDialog.cs + + + UnsavedDocumentsDialog.cs + + + MainWindow.cs + + + GeneralOptionPanel.cs + + + DocumentsOptionPanel.cs + + + EditorPage.cs + + + + ExplorerPage.cs + + + GenericErrorPage.cs + + + StartPage.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SplashScreenWindow.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {617d9eb5-ca93-45d6-aa6b-5a012b7698ac} + AwesomeControls + + + {fe016ea3-dc31-4a92-8b0a-8c746ec117e1} + Glue + + + {2d4737e6-6d95-408a-90db-8dff38147e85} + UniversalEditor.Core + + + {30467e5c-05bc-4856-aadc-13906ef4cadd} + UniversalEditor.Essential + + + {8622ebc4-8e20-476e-b284-33d472081f5c} + UniversalEditor.UserInterface + + + {bcbb72bd-0ecb-4ff2-8d91-e466361fb6f9} + UniversalEditor.UserInterface.WindowsForms + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/WindowsFormsEngine.cs b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/WindowsFormsEngine.cs new file mode 100644 index 00000000..f9d7a46a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Engines/UniversalEditor.Engines.WindowsForms/WindowsFormsEngine.cs @@ -0,0 +1,441 @@ +using AwesomeControls.PieMenu; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.DataFormats.FileSystem.UXT; +using UniversalEditor.DataFormats.PropertyList.UniversalPropertyList; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.Engines.WindowsForms.Dialogs; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Engines.WindowsForms +{ + // TODO: Finish implementing ObjectModel Converters... will need to have something + // like GetAvailableConvertersFrom(Type objectModel) to get a list of available + // converters that can convert from the specified object model. + + internal class WindowsFormsEngine : Engine + { + private static SplashScreenWindow splasher = null; + + public static bool SessionLoading = false; + + protected override void AfterInitialization() + { + base.AfterInitialization(); + + AttachCommandEventHandler("HelpLicensingAndActivation", delegate(object sender, EventArgs e) + { + MessageBox.Show("This product has already been activated.", "Licensing and Activation", MessageBoxButtons.OK, MessageBoxIcon.Information); + }); + } + + protected override void InitializeBranding() + { + base.InitializeBranding(); + + // First, attempt to load the branding from Branding.uxt + string BrandingFileName = BasePath + System.IO.Path.DirectorySeparatorChar.ToString() + "Branding.uxt"; + if (System.IO.File.Exists(BrandingFileName)) + { + FileSystemObjectModel fsom = new FileSystemObjectModel(); + FileAccessor fa = new FileAccessor(BrandingFileName); + Document.Load(fsom, new UXTDataFormat(), fa, false); + + UniversalEditor.ObjectModels.FileSystem.File fileSplashScreenImage = fsom.Files["SplashScreen.png"]; + if (fileSplashScreenImage != null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(fileSplashScreenImage.GetData()); + LocalConfiguration.SplashScreen.Image = System.Drawing.Image.FromStream(ms); + } + + UniversalEditor.ObjectModels.FileSystem.File fileSplashScreenSound = fsom.Files["SplashScreen.wav"]; + if (fileSplashScreenSound != null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(fileSplashScreenSound.GetData()); + LocalConfiguration.SplashScreen.Sound = ms; + } + + UniversalEditor.ObjectModels.FileSystem.File fileMainIcon = fsom.Files["MainIcon.ico"]; + if (fileMainIcon != null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(fileMainIcon.GetData()); + LocalConfiguration.MainIcon = new System.Drawing.Icon(ms); + } + + UniversalEditor.ObjectModels.FileSystem.File fileConfiguration = fsom.Files["Configuration.upl"]; + if (fileConfiguration != null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(fileConfiguration.GetData()); + + UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel plomBranding = new ObjectModels.PropertyList.PropertyListObjectModel(); + Document.Load(plomBranding, new UniversalPropertyListDataFormat(), new StreamAccessor(ms), true); + + LocalConfiguration.ApplicationName = plomBranding.GetValue(new string[] { "Application", "Title" }, String.Empty); + + LocalConfiguration.ColorScheme.DarkColor = ParseColor(plomBranding.GetValue(new string[] { "ColorScheme", "DarkColor" }, "#2A0068")); + LocalConfiguration.ColorScheme.LightColor = ParseColor(plomBranding.GetValue(new string[] { "ColorScheme", "LightColor" }, "#C0C0FF")); + } + + fa.Close(); + } + + // Now, determine if we should override any branding details with local copies + if (System.IO.Directory.Exists(BasePath + System.IO.Path.DirectorySeparatorChar.ToString() + "Branding")) + { + string SplashScreenImageFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + BasePath, + "Branding", + "SplashScreen.png" + }); + if (System.IO.File.Exists(SplashScreenImageFileName)) LocalConfiguration.SplashScreen.ImageFileName = SplashScreenImageFileName; + + string SplashScreenSoundFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + BasePath, + "Branding", + "SplashScreen.wav" + }); + if (System.IO.File.Exists(SplashScreenSoundFileName)) LocalConfiguration.SplashScreen.SoundFileName = SplashScreenSoundFileName; + + string MainIconFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + BasePath, + "Branding", + "MainIcon.ico" + }); + if (System.IO.File.Exists(MainIconFileName)) LocalConfiguration.MainIcon = System.Drawing.Icon.ExtractAssociatedIcon(MainIconFileName); + + string ConfigurationFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + BasePath, + "Branding", + "Configuration.upl" + }); + if (System.IO.File.Exists(ConfigurationFileName)) + { + UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel plomBranding = new ObjectModels.PropertyList.PropertyListObjectModel(); + Document.Load(plomBranding, new UniversalPropertyListDataFormat(), new FileAccessor(ConfigurationFileName), true); + + LocalConfiguration.ApplicationName = plomBranding.GetValue(new string[] { "Application", "Title" }, String.Empty); + + LocalConfiguration.ColorScheme.DarkColor = ParseColor(plomBranding.GetValue(new string[] { "ColorScheme", "DarkColor" }, "#2A0068")); + LocalConfiguration.ColorScheme.LightColor = ParseColor(plomBranding.GetValue(new string[] { "ColorScheme", "LightColor" }, "#C0C0FF")); + } + } + } + + protected override void ShowSplashScreen() + { + if (LocalConfiguration.SplashScreen.Enabled) + { + splasher = new SplashScreenWindow(); + splasher.ShowDialog(); + } + } + protected override void HideSplashScreen() + { + if (LocalConfiguration.SplashScreen.Enabled) + { + while (splasher == null) + { + System.Threading.Thread.Sleep(500); + } + splasher.InvokeClose(); + } + } + protected override void UpdateSplashScreenStatus(string message, int progressValue = -1, int progressMinimum = 0, int progressMaximum = 100) + { + if (LocalConfiguration.SplashScreen.Enabled) + { + int spins = 0, maxspins = 30; + if (splasher == null) return; + + while (splasher == null) + { + System.Threading.Thread.Sleep(500); + if (spins == maxspins) return; + spins++; + } + splasher.InvokeUpdateStatus(message); + } + } + + protected override void BeforeInitialization() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + // TODO: figure out why this is being done on BeforeInitialization and whether we could move it to after + // the configuration is initialized, so we can specify the user's favorite theme in a configuration file + + AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme theme = new AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme(AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme.ColorMode.Dark); + theme.UseAllCapsMenus = false; + theme.SetStatusBarState(AwesomeControls.Theming.BuiltinThemes.VisualStudio2012Theme.StatusBarState.Initial); + // AwesomeControls.Theming.BuiltinThemes.Office2003Theme theme = new AwesomeControls.Theming.BuiltinThemes.Office2003Theme(); + // AwesomeControls.Theming.BuiltinThemes.OfficeXPTheme theme = new AwesomeControls.Theming.BuiltinThemes.OfficeXPTheme(); + // AwesomeControls.Theming.BuiltinThemes.SlickTheme theme = new AwesomeControls.Theming.BuiltinThemes.SlickTheme(); + AwesomeControls.Theming.Theme.CurrentTheme = theme; + + Glue.ApplicationInformation.ApplicationID = new Guid("{b359fe9a-080a-43fc-ae38-00ba7ac1703e}"); + + base.BeforeInitialization(); + } + + [STAThreadAttribute()] + protected override void MainLoop() + { + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + case PlatformID.Unix: + { + Glue.ApplicationInformation.ApplicationDataPath = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { "universal-editor", "plugins" }); + break; + } + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + case PlatformID.Xbox: + { + Glue.ApplicationInformation.ApplicationDataPath = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { "Universal Editor", "Plugins" }); + break; + } + } + + Glue.ApplicationEventEventArgs e = new Glue.ApplicationEventEventArgs(Glue.Common.Constants.EventNames.ApplicationStart); + Glue.Common.Methods.SendApplicationEvent(e); + if (e.CancelApplication) return; + + PieMenuManager.Title = "Universal Editor pre-alpha build"; + + PieMenuItemGroup row1 = new PieMenuItemGroup(); + row1.Title = "Tools"; + row1.Items.Add("atlMFCTraceTool", "ATL/MFC Trace Tool"); + row1.Items.Add("textEditor", "Text Editor"); + PieMenuManager.Groups.Add(row1); + +#if !DEBUG + Application.ThreadException += Application_ThreadException; +#endif + + Application.Run(); + + Glue.Common.Methods.SendApplicationEvent(new Glue.ApplicationEventEventArgs(Glue.Common.Constants.EventNames.ApplicationStop)); + } + + private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + { + ShowCrashDialog(e.Exception); + } + + private static System.Drawing.Color ParseColor(string htmlCode) + { + int iR = 0, iG = 0, iB = 0; + if (htmlCode.StartsWith("#") && htmlCode.Length == 7) + { + string sR = htmlCode.Substring(1, 2); + string sG = htmlCode.Substring(3, 2); + string sB = htmlCode.Substring(5, 2); + + iR = Int32.Parse(sR, System.Globalization.NumberStyles.HexNumber); + iG = Int32.Parse(sG, System.Globalization.NumberStyles.HexNumber); + iB = Int32.Parse(sB, System.Globalization.NumberStyles.HexNumber); + } + else if (htmlCode.StartsWith("rgb(") && htmlCode.EndsWith(")") && htmlCode.Contains(",")) + { + htmlCode = htmlCode.Substring(4, htmlCode.Length - 5); + string[] s = htmlCode.Split(new char[] { ',' }); + if (s.Length != 3) return System.Drawing.Color.Empty; + + iR = Int32.Parse(s[0]); + iG = Int32.Parse(s[1]); + iB = Int32.Parse(s[2]); + } + return System.Drawing.Color.FromArgb(iR, iG, iB); + } + +#if INCLUDE_TESTS + + private static void Test_TextDocument() + { + UniversalEditor.ObjectModels.Text.TextObjectModel text = new UniversalEditor.ObjectModels.Text.TextObjectModel(); + UniversalEditor.DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(text.MakeReference()); + UniversalEditor.DataFormatReference dfr = dfrs[0]; + + DataFormat df = dfr.Create(); + + df.Open(@"W:\Libraries\UniversalEditor\bin\Debug\Tests\Text\Document.xps"); + df.Load(ref text); + df.Close(); + + df.EnableWrite = true; + df.ForceOverwrite = true; + df.Open(@"W:\Libraries\UniversalEditor\bin\Debug\Tests\Text\Document2.xps"); + df.Save(text); + df.Close(); + } + private static void Test_InstallShieldScript() + { + string InputFileName = @"W:\Libraries\UniversalEditor\bin\Debug\Tests\Installers\InstallShield Legacy\SETUP.INS"; + UniversalEditor.ObjectModels.InstallShield.InstallShieldScriptObjectModel ins = UniversalEditor.Common.Reflection.GetAvailableObjectModel(InputFileName); + + + } + private static void Test_Executable() + { + string InputFileName = @"version\syscor32.dll"; + string OutputFileName = @"version\syscoree.dll"; + // InputFileName = @"Tests\IMGSTART\imgstart.exe"; + // OutputFileName = @"Tests\IMGSTART\udnova.exe"; + + UniversalEditor.ObjectModels.Executable.ExecutableObjectModel exe = new ObjectModels.Executable.ExecutableObjectModel(); + UniversalEditor.DataFormats.Executable.Microsoft.MicrosoftExecutableDataFormat exedf = new DataFormats.Executable.Microsoft.MicrosoftExecutableDataFormat(); + + /* + exedf.Open(InputFileName); + exedf.Load(ref exe); + exedf.Close(); + exe.Sections[".rsrc"].Save(@"version\syscor32.ver"); + + exe = new UniversalEditor.ObjectModels.Executable.ExecutableObjectModel(); + exedf.Open(OutputFileName); + exedf.Load(ref exe); + exedf.Close(); + exe.Sections[".rsrc"].Save(@"version\syscoree.ver"); + exe = new UniversalEditor.ObjectModels.Executable.ExecutableObjectModel(); + */ + + exedf.Open(InputFileName); + exedf.Load(ref exe); + exedf.Close(); + + exedf.EnableWrite = true; + exedf.ForceOverwrite = true; + + UniversalEditor.ObjectModels.Executable.ResourceBlocks.VersionResourceBlock version = (exe.Resources[0] as UniversalEditor.ObjectModels.Executable.ResourceBlocks.VersionResourceBlock); + UniversalEditor.ObjectModels.Executable.ResourceBlocks.VersionResourceStringFileInfoBlock sfi = (version.ChildBlocks[0] as UniversalEditor.ObjectModels.Executable.ResourceBlocks.VersionResourceStringFileInfoBlock); + sfi.Entries[0].StringTableEntries[1].Value = "Hello"; + + exedf.Open(OutputFileName); + // (exe.Resources[0] as UniversalEditor.ObjectModels.Executable.ResourceBlocks.VersionResourceBlock).ChildBlocks[0].Add("Website", "http://www.google.com/"); + exedf.Save(exe); + exedf.Close(); + } + private static void Test_RenPyArchive() + { + /* + object nidl = (new UniversalEditor.Serializers.PickleSerializer()).Deserialize("cos\nsystem\n(S'ls ~'\ntR."); + + UniversalEditor.ObjectModels.FileSystem.FileSystemObjectModel fsom = new ObjectModels.FileSystem.FileSystemObjectModel(); + UniversalEditor.DataFormats.RenPy.Archive.RenPyArchiveDataFormat rpa = new DataFormats.RenPy.Archive.RenPyArchiveDataFormat(); + + ObjectModel om = fsom; + rpa.Open(@"C:\Program Files (x86)\Katawa Shoujo\game\data.rpa"); + rpa.Load(ref om); + rpa.Close(); + */ + return; + } + private static void Test_ARJ() + { + string FileName = @"C:\ARJ\test1.arj"; + string FileName2 = @"C:\ARJ\test1_aaaa.arj"; + + UniversalEditor.ObjectModels.FileSystem.FileSystemObjectModel fsom = new ObjectModels.FileSystem.FileSystemObjectModel(); + UniversalEditor.DataFormats.FileSystem.ARJ.ARJDataFormat arj = new DataFormats.FileSystem.ARJ.ARJDataFormat(); + arj.Open(FileName); + arj.Load(ref fsom); + arj.Close(); + + arj.EnableWrite = true; + + arj.Open(FileName2); + arj.Save(fsom); + arj.Close(); + } + private static void Test_Outsim() + { + ObjectModelReference omrHOM = UniversalEditor.Common.Reflection.GetObjectModelByTypeName("UniversalEditor.ObjectModels.Outsim.SynthMaker.Module.ModuleObjectModel"); + ObjectModel omHOM = omrHOM.Create(); + + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(omrHOM); + DataFormat dfHOM = dfrs[0].Create(); + + dfHOM.Open(@"C:\Program Files (x86)\Outsim\SynthMaker\modules\System\ADSR.hom"); + dfHOM.Load(ref omHOM); + dfHOM.Close(); + } + private static void Test_WinHelpBookCollection() + { + string FileName = @"W:\Libraries\UniversalEditor\bin\Debug\Tests\Book Collection\WinHelp\ACCESS.HLP"; + string FileName2 = @"W:\Libraries\UniversalEditor\bin\Debug\Tests\Book Collection\WinHelp\ACCESS_aaaa.HLP"; + + BookCollectionObjectModel books = new BookCollectionObjectModel(); + UniversalEditor.DataFormats.BookCollection.WinHelp.WinHelpDataFormat winhlp = new DataFormats.BookCollection.WinHelp.WinHelpDataFormat(); + winhlp.Open(FileName); + winhlp.Load(ref books); + winhlp.Close(); + + winhlp.EnableWrite = true; + winhlp.Open(FileName2); + winhlp.Save(books); + winhlp.Close(); + } +#endif + + public override void ShowAboutDialog() + { + AboutDialog dlg = new AboutDialog(); + dlg.ShowDialog(); + } + public override void ShowAboutDialog(DataFormatReference dfr) + { + DataFormatAboutDialog dlg = new DataFormatAboutDialog(); + dlg.DataFormatReference = dfr; + dlg.ShowDialog(); + } + + protected override IHostApplicationWindow OpenWindowInternal(params Document[] documents) + { + MainWindow mw = new MainWindow(); + + if (documents.Length > 0) + { + mw.OpenFile(documents); + } + mw.Show(); + return mw; + } + + protected override void RestartApplicationInternal() + { + Application.Restart(); + } + protected override void StopApplicationInternal() + { + Application.Exit(); + } + + public override bool ShowCustomOptionDialog(ref CustomOption.CustomOptionCollection customOptions, string title = null, EventHandler aboutButtonClicked = null) + { + if (CustomOptionDialog.ShowDialog(ref customOptions, title, aboutButtonClicked) == DialogResult.Cancel) + { + return false; + } + return true; + } + + protected override void ShowCrashDialog(Exception ex) + { + Dialogs.CrashDialog dlg = new Dialogs.CrashDialog(); + dlg.Exception = ex; + dlg.ShowDialog(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/CommonDialog.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/CommonDialog.cs new file mode 100644 index 00000000..d23d4864 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/CommonDialog.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + /// + /// Contains methods useful for common file dialogs in Windows Forms. + /// + public static class CommonDialog + { + // UniversalDataStorage.Common.Methods + public static string GetCommonDialogFilter(Association[] associations, bool includeAllFiles = true) + { + StringBuilder sb = new StringBuilder(); + foreach (Association assoc in associations) + { + foreach (DataFormatFilter filter in assoc.Filters) + { + sb.Append(filter.Title + "|"); + foreach (string s in filter.FileNameFilters) + { + sb.Append(s); + if (filter.FileNameFilters.IndexOf(s) > filter.FileNameFilters.Count - 1) + { + sb.Append("; "); + } + } + if (assoc.Filters.IndexOf(filter) > assoc.Filters.Count - 1) sb.Append("|"); + } + } + if (includeAllFiles) + { + if (sb.Length > 0) sb.Append("|"); + sb.Append("All files (*.*)|*.*"); + } + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.Designer.cs new file mode 100644 index 00000000..18be31da --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.Designer.cs @@ -0,0 +1,132 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Controls +{ + partial class DocumentTypeSelector + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.lvDataFormats = new System.Windows.Forms.ListView(); + this.chDataFormatTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chDataFormatDescription = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.imlLargeIcons = new System.Windows.Forms.ImageList(this.components); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.tvObjectModels = new System.Windows.Forms.TreeView(); + this.SuspendLayout(); + // + // txtSearch + // + this.txtSearch.Dock = System.Windows.Forms.DockStyle.Top; + this.txtSearch.Location = new System.Drawing.Point(0, 0); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(461, 20); + this.txtSearch.TabIndex = 0; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + // + // lvDataFormats + // + this.lvDataFormats.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chDataFormatTitle, + this.chDataFormatDescription}); + this.lvDataFormats.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvDataFormats.FullRowSelect = true; + this.lvDataFormats.GridLines = true; + this.lvDataFormats.HideSelection = false; + this.lvDataFormats.LargeImageList = this.imlLargeIcons; + this.lvDataFormats.Location = new System.Drawing.Point(0, 20); + this.lvDataFormats.MultiSelect = false; + this.lvDataFormats.Name = "lvDataFormats"; + this.lvDataFormats.Size = new System.Drawing.Size(461, 232); + this.lvDataFormats.SmallImageList = this.imlSmallIcons; + this.lvDataFormats.TabIndex = 1; + this.lvDataFormats.UseCompatibleStateImageBehavior = false; + this.lvDataFormats.View = System.Windows.Forms.View.Details; + this.lvDataFormats.SelectedIndexChanged += new System.EventHandler(this.lvDataFormats_SelectedIndexChanged); + // + // chDataFormatTitle + // + this.chDataFormatTitle.Text = "Title"; + this.chDataFormatTitle.Width = 278; + // + // chDataFormatDescription + // + this.chDataFormatDescription.Text = "Description"; + this.chDataFormatDescription.Width = 172; + // + // imlLargeIcons + // + this.imlLargeIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlLargeIcons.ImageSize = new System.Drawing.Size(32, 32); + this.imlLargeIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // imlSmallIcons + // + this.imlSmallIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlSmallIcons.ImageSize = new System.Drawing.Size(16, 16); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // tvObjectModels + // + this.tvObjectModels.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvObjectModels.HideSelection = false; + this.tvObjectModels.ImageIndex = 0; + this.tvObjectModels.ImageList = this.imlSmallIcons; + this.tvObjectModels.Location = new System.Drawing.Point(0, 20); + this.tvObjectModels.Name = "tvObjectModels"; + this.tvObjectModels.SelectedImageIndex = 0; + this.tvObjectModels.Size = new System.Drawing.Size(461, 232); + this.tvObjectModels.TabIndex = 2; + this.tvObjectModels.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterCollapse); + this.tvObjectModels.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterExpand); + this.tvObjectModels.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvObjectModels_AfterSelect); + this.tvObjectModels.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tvObjectModels_MouseDoubleClick); + // + // DocumentTypeSelector + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tvObjectModels); + this.Controls.Add(this.lvDataFormats); + this.Controls.Add(this.txtSearch); + this.Name = "DocumentTypeSelector"; + this.Size = new System.Drawing.Size(461, 252); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtSearch; + private System.Windows.Forms.ListView lvDataFormats; + private System.Windows.Forms.ColumnHeader chDataFormatTitle; + private System.Windows.Forms.ColumnHeader chDataFormatDescription; + private System.Windows.Forms.TreeView tvObjectModels; + private System.Windows.Forms.ImageList imlLargeIcons; + private System.Windows.Forms.ImageList imlSmallIcons; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.cs new file mode 100644 index 00000000..4aa55641 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.cs @@ -0,0 +1,305 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.UserInterface.WindowsForms.Controls +{ + [DefaultEvent("SelectionChanged")] + public partial class DocumentTypeSelector : UserControl + { + public event EventHandler SelectionFinalized; + public event EventHandler SelectionChanged; + + public DocumentTypeSelector() + { + InitializeComponent(); + + txtSearch.BackColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowBackground; + txtSearch.ForeColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowForeground; + + tvObjectModels.BackColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowBackground; + tvObjectModels.ForeColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowForeground; + + imlLargeIcons.PopulateSystemIcons(); + imlSmallIcons.PopulateSystemIcons(); + } + + protected override void OnCreateControl() + { + base.OnCreateControl(); + + RefreshList(); + } + + private bool mvarIncludeInvisibleObjectModels = false; + /// + /// Determines whether to include object models that are marked as invisible. + /// + [Description("Determines whether to include object models that are marked as invisible."), DefaultValue(false)] + public bool IncludeInvisibleObjectModels { get { return mvarIncludeInvisibleObjectModels; } set { mvarIncludeInvisibleObjectModels = value; } } + + private bool mvarIncludeObjectModelsWithoutEditor = false; + /// + /// Determines whether to include object models in the list if the object models do not have an associated editor. + /// + [Description("Determines whether to include object models in the list if the object models do not have an associated editor."), DefaultValue(false)] + public bool IncludeObjectModelsWithoutEditor { get { return mvarIncludeObjectModelsWithoutEditor; } set { mvarIncludeObjectModelsWithoutEditor = value; } } + + private void RefreshList() + { + switch (mvarObjectType) + { + case DocumentTypeSelectorObjectTypes.DataFormat: + { + foreach (DataFormatReference dfr in UniversalEditor.Common.Reflection.GetAvailableDataFormats()) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = dfr.Title; + lvi.Tag = dfr; + lvDataFormats.Items.Add(lvi); + } + break; + } + case DocumentTypeSelectorObjectTypes.ObjectModel: + { + tvObjectModels.Nodes.Clear(); + + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + if (!mvarIncludeObjectModelsWithoutEditor && Common.Reflection.GetAvailableEditors(omr).Length == 0) continue; + if (!mvarIncludeInvisibleObjectModels && !omr.Visible) continue; + + if (omr.Path.Length > 0) + { + if (txtSearch.Text.Length != 0 && !omr.Path[omr.Path.Length - 1].ToLower().Contains(txtSearch.Text.ToLower())) continue; + } + + TreeNode tnParent = null; + foreach (string pathItem in omr.Path) + { + if (tnParent == null) + { + if (tvObjectModels.Nodes.ContainsKey(pathItem)) + { + tnParent = tvObjectModels.Nodes[pathItem]; + } + else + { + tnParent = tvObjectModels.Nodes.Add(pathItem, pathItem); + } + } + else + { + if (tnParent.Nodes.ContainsKey(pathItem)) + { + tnParent = tnParent.Nodes[pathItem]; + } + else + { + tnParent = tnParent.Nodes.Add(pathItem, pathItem); + } + } + + if (Array.IndexOf(omr.Path, pathItem) < omr.Path.Length - 1) + { + tnParent.ImageKey = "generic-folder-closed"; + tnParent.SelectedImageKey = "generic-folder-closed"; + } + } + + if (tnParent != null) + { + if (txtSearch.Text.Length != 0 && omr.Path[omr.Path.Length - 1].ToLower().Contains(txtSearch.Text.ToLower())) + { + tnParent.EnsureVisible(); + tvObjectModels.SelectedNode = tnParent; + tvObjectModels_AfterSelect(null, new TreeViewEventArgs(tvObjectModels.SelectedNode)); + } + tnParent.Tag = omr; + } + } + break; + } + case DocumentTypeSelectorObjectTypes.Both: + { + tvObjectModels.Nodes.Clear(); + + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + if (!mvarIncludeObjectModelsWithoutEditor && Common.Reflection.GetAvailableEditors(omr).Length == 0) continue; + + TreeNode tnParent = null; + foreach (string pathItem in omr.Path) + { + if (tnParent == null) + { + if (tvObjectModels.Nodes.ContainsKey(pathItem)) + { + tnParent = tvObjectModels.Nodes[pathItem]; + } + else + { + tnParent = tvObjectModels.Nodes.Add(pathItem, pathItem); + } + } + else + { + if (tnParent.Nodes.ContainsKey(pathItem)) + { + tnParent = tnParent.Nodes[pathItem]; + } + else + { + tnParent = tnParent.Nodes.Add(pathItem, pathItem); + } + } + } + + tnParent.Tag = omr; + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(omr); + foreach (DataFormatReference dfr in dfrs) + { + TreeNode tnDataFormat = new TreeNode(); + tnDataFormat.Text = dfr.Title; + tnDataFormat.Tag = dfr; + tnParent.Nodes.Add(tnDataFormat); + } + } + break; + } + } + } + + private DocumentTypeSelectorObjectTypes mvarObjectType = DocumentTypeSelectorObjectTypes.ObjectModel; + public DocumentTypeSelectorObjectTypes ObjectType + { + get { return mvarObjectType; } + set + { + mvarObjectType = value; + switch (mvarObjectType) + { + case DocumentTypeSelectorObjectTypes.DataFormat: + { + tvObjectModels.Visible = false; + tvObjectModels.Enabled = false; + lvDataFormats.Visible = true; + lvDataFormats.Enabled = true; + break; + } + case DocumentTypeSelectorObjectTypes.ObjectModel: + { + tvObjectModels.Visible = true; + tvObjectModels.Enabled = true; + lvDataFormats.Visible = false; + lvDataFormats.Enabled = false; + break; + } + case DocumentTypeSelectorObjectTypes.Both: + { + tvObjectModels.Visible = true; + tvObjectModels.Enabled = true; + lvDataFormats.Visible = false; + lvDataFormats.Enabled = false; + break; + } + } + } + } + + protected void OnSelectionChanged(EventArgs e) + { + if (lvDataFormats.Visible && lvDataFormats.SelectedItems.Count == 1) + { + mvarSelectedObject = (lvDataFormats.SelectedItems[0].Tag as DataFormatReference); + } + else if (tvObjectModels.Visible && tvObjectModels.SelectedNode != null) + { + if (tvObjectModels.SelectedNode.Tag is DataFormatReference) + { + mvarSelectedObject = (tvObjectModels.SelectedNode.Tag as DataFormatReference); + } + else if (tvObjectModels.SelectedNode.Tag is ObjectModelReference) + { + mvarSelectedObject = (tvObjectModels.SelectedNode.Tag as ObjectModelReference); + } + else + { + mvarSelectedObject = null; + } + } + + if (SelectionChanged != null) SelectionChanged(this, e); + + } + + protected void OnSelectionFinalized(EventArgs e) + { + OnSelectionChanged(e); + if (SelectionFinalized != null) SelectionFinalized(this, e); + } + + private void txtSearch_TextChanged(object sender, EventArgs e) + { + RefreshList(); + } + + private void tvObjectModels_AfterSelect(object sender, TreeViewEventArgs e) + { + OnSelectionChanged(EventArgs.Empty); + } + + private void lvDataFormats_SelectedIndexChanged(object sender, EventArgs e) + { + OnSelectionChanged(EventArgs.Empty); + } + + private object mvarSelectedObject = null; + /// + /// The or that is currently selected. + /// + public object SelectedObject { get { return mvarSelectedObject; } } + + + private void tvObjectModels_AfterCollapse(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + if (e.Node.ImageKey == "generic-folder-open") + { + e.Node.ImageKey = "generic-folder-closed"; + e.Node.SelectedImageKey = "generic-folder-closed"; + } + } + private void tvObjectModels_AfterExpand(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + if (e.Node.ImageKey == "generic-folder-closed") + { + e.Node.ImageKey = "generic-folder-open"; + e.Node.SelectedImageKey = "generic-folder-open"; + } + } + + private void tvObjectModels_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (tvObjectModels.SelectedNode != null) + { + OnSelectionFinalized(e); + } + } + } + + [Flags()] + public enum DocumentTypeSelectorObjectTypes + { + None = 0, + ObjectModel = 1, + DataFormat = 2, + Both = 3 + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.resources b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/DocumentTypeSelector.resources new file mode 100644 index 0000000000000000000000000000000000000000..06c24d06c1cab750788146ce052b37770f3fa530 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 143, 17 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.Designer.cs new file mode 100644 index 00000000..bfe8662a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.Designer.cs @@ -0,0 +1,182 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Controls +{ + partial class ErrorMessage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ErrorMessage)); + this.cmdRefresh = new System.Windows.Forms.Button(); + this.fraSuggestions = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.txtErrorSuggestions = new System.Windows.Forms.TextBox(); + this.txtDetails = new System.Windows.Forms.TextBox(); + this.lblTitle = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label1 = new System.Windows.Forms.Label(); + this.fraSuggestions.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // cmdRefresh + // + this.cmdRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdRefresh.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRefresh.Location = new System.Drawing.Point(426, 302); + this.cmdRefresh.Name = "cmdRefresh"; + this.cmdRefresh.Size = new System.Drawing.Size(75, 23); + this.cmdRefresh.TabIndex = 13; + this.cmdRefresh.Text = "Refresh"; + this.cmdRefresh.UseVisualStyleBackColor = true; + // + // fraSuggestions + // + this.fraSuggestions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraSuggestions.Controls.Add(this.label4); + this.fraSuggestions.Controls.Add(this.label3); + this.fraSuggestions.Controls.Add(this.txtErrorSuggestions); + this.fraSuggestions.Location = new System.Drawing.Point(15, 168); + this.fraSuggestions.Name = "fraSuggestions"; + this.fraSuggestions.Size = new System.Drawing.Size(486, 128); + this.fraSuggestions.TabIndex = 12; + this.fraSuggestions.TabStop = false; + this.fraSuggestions.Text = "Suggestions"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(23, 69); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(10, 13); + this.label4.TabIndex = 1; + this.label4.Text = "·"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(23, 30); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(10, 13); + this.label3.TabIndex = 1; + this.label3.Text = "·"; + // + // txtErrorSuggestions + // + this.txtErrorSuggestions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtErrorSuggestions.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtErrorSuggestions.Location = new System.Drawing.Point(39, 30); + this.txtErrorSuggestions.Multiline = true; + this.txtErrorSuggestions.Name = "txtErrorSuggestions"; + this.txtErrorSuggestions.ReadOnly = true; + this.txtErrorSuggestions.Size = new System.Drawing.Size(425, 75); + this.txtErrorSuggestions.TabIndex = 0; + this.txtErrorSuggestions.Text = resources.GetString("txtErrorSuggestions.Text"); + // + // txtDetails + // + this.txtDetails.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDetails.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtDetails.Location = new System.Drawing.Point(15, 108); + this.txtDetails.Multiline = true; + this.txtDetails.Name = "txtDetails"; + this.txtDetails.ReadOnly = true; + this.txtDetails.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtDetails.Size = new System.Drawing.Size(486, 44); + this.txtDetails.TabIndex = 11; + // + // lblTitle + // + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblTitle.Location = new System.Drawing.Point(85, 15); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(416, 64); + this.lblTitle.TabIndex = 9; + this.lblTitle.Text = "There are no editors available for this object model"; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(15, 15); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(64, 64); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 8; + this.pictureBox1.TabStop = false; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(0, 94); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(514, 2); + this.label1.TabIndex = 7; + // + // ErrorMessage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmdRefresh); + this.Controls.Add(this.fraSuggestions); + this.Controls.Add(this.txtDetails); + this.Controls.Add(this.lblTitle); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.label1); + this.Name = "ErrorMessage"; + this.Size = new System.Drawing.Size(514, 340); + this.fraSuggestions.ResumeLayout(false); + this.fraSuggestions.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdRefresh; + private System.Windows.Forms.GroupBox fraSuggestions; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtErrorSuggestions; + private System.Windows.Forms.TextBox txtDetails; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label1; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.cs new file mode 100644 index 00000000..e55d8488 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.UserInterface.WindowsForms.Controls +{ + public partial class ErrorMessage : UserControl + { + public ErrorMessage() + { + InitializeComponent(); + } + + public string Details + { + get { return txtDetails.Text; } + set { txtDetails.Text = value; } + } + + public string Title { get { return lblTitle.Text; } set { lblTitle.Text = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.resx new file mode 100644 index 00000000..074c7abd --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ErrorMessage.resx @@ -0,0 +1,1049 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Make sure the plugin for this object model exists in either the user's application data directory or the machine's application data directory. + +Re-download the plugin for this object model if necessary. Refresh the page when it is installed. + + + + + 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 + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.Designer.cs new file mode 100644 index 00000000..5de7c568 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.Designer.cs @@ -0,0 +1,251 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Controls +{ + partial class LocalFileSystemExplorer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.scExplorerFiles = new System.Windows.Forms.SplitContainer(); + this.scFavoritesFiles = new System.Windows.Forms.SplitContainer(); + this.tvFavorites = new AwesomeControls.ListView.ListViewControl(); + this.tv = new AwesomeControls.ListView.ListViewControl(); + this.imlLargeIcons = new System.Windows.Forms.ImageList(this.components); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.scFilesPreview = new System.Windows.Forms.SplitContainer(); + this.lv = new AwesomeControls.ListView.ListViewControl(); + this.pnlPreview = new System.Windows.Forms.Panel(); + this.scFilesDetails = new System.Windows.Forms.SplitContainer(); + this.pnlDetails = new System.Windows.Forms.Panel(); + this.scExplorerFiles.Panel1.SuspendLayout(); + this.scExplorerFiles.Panel2.SuspendLayout(); + this.scExplorerFiles.SuspendLayout(); + this.scFavoritesFiles.Panel1.SuspendLayout(); + this.scFavoritesFiles.Panel2.SuspendLayout(); + this.scFavoritesFiles.SuspendLayout(); + this.scFilesPreview.Panel1.SuspendLayout(); + this.scFilesPreview.Panel2.SuspendLayout(); + this.scFilesPreview.SuspendLayout(); + this.scFilesDetails.Panel1.SuspendLayout(); + this.scFilesDetails.Panel2.SuspendLayout(); + this.scFilesDetails.SuspendLayout(); + this.SuspendLayout(); + // + // scExplorerFiles + // + this.scExplorerFiles.Dock = System.Windows.Forms.DockStyle.Fill; + this.scExplorerFiles.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.scExplorerFiles.Location = new System.Drawing.Point(0, 0); + this.scExplorerFiles.Name = "scExplorerFiles"; + // + // scExplorerFiles.Panel1 + // + this.scExplorerFiles.Panel1.Controls.Add(this.scFavoritesFiles); + // + // scExplorerFiles.Panel2 + // + this.scExplorerFiles.Panel2.Controls.Add(this.scFilesPreview); + this.scExplorerFiles.Size = new System.Drawing.Size(634, 398); + this.scExplorerFiles.SplitterDistance = 185; + this.scExplorerFiles.TabIndex = 0; + // + // scFavoritesFiles + // + this.scFavoritesFiles.Dock = System.Windows.Forms.DockStyle.Fill; + this.scFavoritesFiles.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.scFavoritesFiles.Location = new System.Drawing.Point(0, 0); + this.scFavoritesFiles.Name = "scFavoritesFiles"; + this.scFavoritesFiles.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // scFavoritesFiles.Panel1 + // + this.scFavoritesFiles.Panel1.Controls.Add(this.tvFavorites); + this.scFavoritesFiles.Panel1Collapsed = true; + // + // scFavoritesFiles.Panel2 + // + this.scFavoritesFiles.Panel2.Controls.Add(this.tv); + this.scFavoritesFiles.Size = new System.Drawing.Size(185, 398); + this.scFavoritesFiles.SplitterDistance = 118; + this.scFavoritesFiles.TabIndex = 1; + // + // tvFavorites + // + this.tvFavorites.AllowSorting = true; + this.tvFavorites.BackColor = System.Drawing.SystemColors.Window; + this.tvFavorites.DefaultItemHeight = 24; + this.tvFavorites.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvFavorites.ForeColor = System.Drawing.SystemColors.WindowText; + this.tvFavorites.LargeImageList = null; + this.tvFavorites.Location = new System.Drawing.Point(0, 0); + this.tvFavorites.Mode = AwesomeControls.ListView.ListViewMode.List; + this.tvFavorites.Name = "tvFavorites"; + this.tvFavorites.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.tvFavorites.Size = new System.Drawing.Size(150, 118); + this.tvFavorites.SmallImageList = null; + this.tvFavorites.SortColumn = null; + this.tvFavorites.TabIndex = 1; + // + // tv + // + this.tv.AllowSorting = true; + this.tv.BackColor = System.Drawing.SystemColors.Window; + this.tv.DefaultItemHeight = 24; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.ForeColor = System.Drawing.SystemColors.WindowText; + this.tv.LargeImageList = this.imlLargeIcons; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Mode = AwesomeControls.ListView.ListViewMode.List; + this.tv.Name = "tv"; + this.tv.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.tv.Size = new System.Drawing.Size(185, 398); + this.tv.SmallImageList = this.imlSmallIcons; + this.tv.SortColumn = null; + this.tv.TabIndex = 1; + // + // imlLargeIcons + // + this.imlLargeIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlLargeIcons.ImageSize = new System.Drawing.Size(32, 32); + this.imlLargeIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // imlSmallIcons + // + this.imlSmallIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlSmallIcons.ImageSize = new System.Drawing.Size(16, 16); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // scFilesPreview + // + this.scFilesPreview.Dock = System.Windows.Forms.DockStyle.Fill; + this.scFilesPreview.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.scFilesPreview.Location = new System.Drawing.Point(0, 0); + this.scFilesPreview.Name = "scFilesPreview"; + // + // scFilesPreview.Panel1 + // + this.scFilesPreview.Panel1.Controls.Add(this.lv); + // + // scFilesPreview.Panel2 + // + this.scFilesPreview.Panel2.Controls.Add(this.pnlPreview); + this.scFilesPreview.Panel2Collapsed = true; + this.scFilesPreview.Size = new System.Drawing.Size(445, 398); + this.scFilesPreview.SplitterDistance = 326; + this.scFilesPreview.TabIndex = 1; + // + // lv + // + this.lv.AllowSorting = true; + this.lv.BackColor = System.Drawing.SystemColors.Window; + this.lv.DefaultItemHeight = 24; + this.lv.Dock = System.Windows.Forms.DockStyle.Fill; + this.lv.ForeColor = System.Drawing.SystemColors.WindowText; + this.lv.LargeImageList = this.imlLargeIcons; + this.lv.Location = new System.Drawing.Point(0, 0); + this.lv.Mode = AwesomeControls.ListView.ListViewMode.Tiles; + this.lv.Name = "lv"; + this.lv.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lv.Size = new System.Drawing.Size(445, 398); + this.lv.SmallImageList = this.imlSmallIcons; + this.lv.SortColumn = null; + this.lv.TabIndex = 1; + this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate); + // + // pnlPreview + // + this.pnlPreview.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlPreview.Location = new System.Drawing.Point(0, 0); + this.pnlPreview.Name = "pnlPreview"; + this.pnlPreview.Size = new System.Drawing.Size(96, 100); + this.pnlPreview.TabIndex = 0; + // + // scFilesDetails + // + this.scFilesDetails.Dock = System.Windows.Forms.DockStyle.Fill; + this.scFilesDetails.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.scFilesDetails.Location = new System.Drawing.Point(0, 0); + this.scFilesDetails.Name = "scFilesDetails"; + this.scFilesDetails.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // scFilesDetails.Panel1 + // + this.scFilesDetails.Panel1.Controls.Add(this.scExplorerFiles); + // + // scFilesDetails.Panel2 + // + this.scFilesDetails.Panel2.Controls.Add(this.pnlDetails); + this.scFilesDetails.Panel2Collapsed = true; + this.scFilesDetails.Size = new System.Drawing.Size(634, 398); + this.scFilesDetails.SplitterDistance = 294; + this.scFilesDetails.TabIndex = 2; + // + // pnlDetails + // + this.pnlDetails.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlDetails.Location = new System.Drawing.Point(0, 0); + this.pnlDetails.Name = "pnlDetails"; + this.pnlDetails.Size = new System.Drawing.Size(150, 46); + this.pnlDetails.TabIndex = 0; + // + // LocalFileSystemExplorer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.scFilesDetails); + this.Name = "LocalFileSystemExplorer"; + this.Size = new System.Drawing.Size(634, 398); + this.scExplorerFiles.Panel1.ResumeLayout(false); + this.scExplorerFiles.Panel2.ResumeLayout(false); + this.scExplorerFiles.ResumeLayout(false); + this.scFavoritesFiles.Panel1.ResumeLayout(false); + this.scFavoritesFiles.Panel2.ResumeLayout(false); + this.scFavoritesFiles.ResumeLayout(false); + this.scFilesPreview.Panel1.ResumeLayout(false); + this.scFilesPreview.Panel2.ResumeLayout(false); + this.scFilesPreview.ResumeLayout(false); + this.scFilesDetails.Panel1.ResumeLayout(false); + this.scFilesDetails.Panel2.ResumeLayout(false); + this.scFilesDetails.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer scExplorerFiles; + private System.Windows.Forms.SplitContainer scFavoritesFiles; + private AwesomeControls.ListView.ListViewControl tvFavorites; + private AwesomeControls.ListView.ListViewControl tv; + private System.Windows.Forms.SplitContainer scFilesDetails; + private System.Windows.Forms.Panel pnlDetails; + private System.Windows.Forms.SplitContainer scFilesPreview; + private AwesomeControls.ListView.ListViewControl lv; + private System.Windows.Forms.Panel pnlPreview; + private System.Windows.Forms.ImageList imlSmallIcons; + private System.Windows.Forms.ImageList imlLargeIcons; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.cs new file mode 100644 index 00000000..660ebc0c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; + +using AwesomeControls.ListView; + +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.UserInterface.WindowsForms.Controls +{ + [DefaultEvent("Navigate")] + public partial class LocalFileSystemExplorer : System.Windows.Forms.UserControl + { + public LocalFileSystemExplorer() + { + InitializeComponent(); + + imlSmallIcons.PopulateSystemIcons(); + imlLargeIcons.PopulateSystemIcons(); + } + + public bool ShowFavorites + { + get { return !scFavoritesFiles.Panel1Collapsed; } + set { scFavoritesFiles.Panel1Collapsed = !value; } + } + public bool ShowDetails + { + get { return !scFilesDetails.Panel2Collapsed; } + set { scFilesDetails.Panel2Collapsed = !value; } + } + public bool ShowPreview + { + get { return !scFilesPreview.Panel2Collapsed; } + set { scFilesPreview.Panel2Collapsed = !value; } + } + + private string mvarPath = String.Empty; + public string Path + { + get { return mvarPath; } + set + { + lv.Items.Clear(); + tv.Items.Clear(); + if (!System.IO.Directory.Exists(value)) return; + + string[] directories = null; + try + { + directories = System.IO.Directory.GetDirectories(value); + } + catch (System.IO.IOException ex) + { + } + catch (System.UnauthorizedAccessException ex) + { + System.Windows.Forms.MessageBox.Show(ex.Message, "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); + return; + } + + mvarPath = value; + + foreach (string filename in directories) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = System.IO.Path.GetFileName(filename); + lvi.Data = filename; + lvi.ImageKey = "generic-folder-closed"; + lv.Items.Add(lvi); + } + string[] filenames = System.IO.Directory.GetFiles(mvarPath); + foreach (string filename in filenames) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = System.IO.Path.GetFileName(filename); + lvi.Data = filename; + lvi.ImageKey = "generic-file"; + lv.Items.Add(lvi); + } + } + } + + public event NavigateEventHandler Navigate; + protected virtual void OnNavigate(NavigateEventArgs e) + { + if (Navigate != null) Navigate(this, e); + } + + private void lv_ItemActivate(object sender, EventArgs e) + { + ListViewItem lvi = lv.SelectedItems[0]; + string filename = (string)lvi.Data; + + if (System.IO.File.Exists(filename)) + { + OnNavigate(new NavigateEventArgs(filename)); + } + else if (System.IO.Directory.Exists(filename)) + { + Path = filename; + } + } + } + + public delegate void NavigateEventHandler(object sender, NavigateEventArgs e); + public class NavigateEventArgs + { + public NavigateEventArgs(string FileName) + { + mvarFileName = FileName; + } + + private string mvarFileName = String.Empty; + public string FileName { get { return mvarFileName; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.resx new file mode 100644 index 00000000..eb0a1486 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/LocalFileSystemExplorer.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 17 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.Designer.cs new file mode 100644 index 00000000..e0478e17 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.Designer.cs @@ -0,0 +1,89 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/4/2013 + * Time: 3:12 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +namespace UniversalEditor.Controls +{ + partial class ProgressPanel + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the control. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.lblTask = new System.Windows.Forms.Label(); + this.pb = new System.Windows.Forms.ProgressBar(); + this.lblProgress = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblTask + // + this.lblTask.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.lblTask.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTask.Location = new System.Drawing.Point(3, 17); + this.lblTask.Name = "lblTask"; + this.lblTask.Size = new System.Drawing.Size(382, 19); + this.lblTask.TabIndex = 0; + this.lblTask.Text = "Task name"; + this.lblTask.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // pb + // + this.pb.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.pb.Location = new System.Drawing.Point(3, 39); + this.pb.Name = "pb"; + this.pb.Size = new System.Drawing.Size(382, 23); + this.pb.TabIndex = 1; + // + // lblProgress + // + this.lblProgress.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.lblProgress.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblProgress.Location = new System.Drawing.Point(3, 68); + this.lblProgress.Name = "lblProgress"; + this.lblProgress.Size = new System.Drawing.Size(382, 19); + this.lblProgress.TabIndex = 0; + this.lblProgress.Text = "100%"; + this.lblProgress.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // ProgressPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.pb); + this.Controls.Add(this.lblProgress); + this.Controls.Add(this.lblTask); + this.Name = "ProgressPanel"; + this.Size = new System.Drawing.Size(388, 104); + this.ResumeLayout(false); + } + private System.Windows.Forms.Label lblProgress; + private System.Windows.Forms.ProgressBar pb; + private System.Windows.Forms.Label lblTask; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.cs new file mode 100644 index 00000000..07a76c02 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.cs @@ -0,0 +1,46 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/4/2013 + * Time: 3:12 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Controls +{ + /// + /// Description of ProgressPanel. + /// + public partial class ProgressPanel : UserControl + { + public ProgressPanel() + { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + + // + // TODO: Add constructor code after the InitializeComponent() call. + // + } + + public int Minimum { get { return pb.Minimum; } set { pb.Minimum = value; UpdateProgress(); } } + public int Maximum { get { return pb.Maximum; } set { pb.Maximum = value; UpdateProgress(); } } + public int Value { get { return pb.Value; } set { pb.Value = value; UpdateProgress(); } } + + private void UpdateProgress() + { + double pct = ((double)pb.Value / ((double)pb.Maximum - (double)pb.Minimum)); + pct *= 100; + pct = Math.Round(pct); + + lblProgress.Text = pct.ToString() + "%"; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Controls/ProgressPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialog.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialog.cs new file mode 100644 index 00000000..0a1bc9d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialog.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor +{ + public abstract class Dialog + { + public abstract DialogResult ShowDialog(); + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.Designer.cs new file mode 100644 index 00000000..0a767fa0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.Designer.cs @@ -0,0 +1,95 @@ +namespace UniversalEditor.Dialogs.FileSystem +{ + partial class CommentDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtComment = new System.Windows.Forms.TextBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // txtComment + // + this.txtComment.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtComment.HideSelection = false; + this.txtComment.Location = new System.Drawing.Point(12, 12); + this.txtComment.Multiline = true; + this.txtComment.Name = "txtComment"; + this.txtComment.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtComment.Size = new System.Drawing.Size(378, 142); + this.txtComment.TabIndex = 0; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(315, 160); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 1; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(234, 160); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 1; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // CommentDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(402, 195); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.txtComment); + this.Name = "CommentDialog"; + this.Text = "Comment"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtComment; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.cs new file mode 100644 index 00000000..60653185 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.FileSystem +{ + public partial class CommentDialog : Form + { + public CommentDialog() + { + InitializeComponent(); + base.Font = SystemFonts.MenuFont; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/CommentDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/FilePropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/FilePropertiesDialog.cs new file mode 100644 index 00000000..670ca426 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/FilePropertiesDialog.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.UserInterface.WindowsForms.Dialogs.FileSystem +{ + public class FilePropertiesDialog : Dialog + { + private Internal.FilePropertiesDialogImpl dlg = null; + + private IFileSystemObjectCollection mvarSelectedObjects = new IFileSystemObjectCollection(); + public IFileSystemObjectCollection SelectedObjects { get { return mvarSelectedObjects; } } + + public override System.Windows.Forms.DialogResult ShowDialog() + { + if (dlg == null) dlg = new Internal.FilePropertiesDialogImpl(); + if (dlg.IsDisposed) dlg = new Internal.FilePropertiesDialogImpl(); + + dlg.txtGeneralInformationLocation.Text = mvarParentFileName; + dlg.SelectedObjects = mvarSelectedObjects; + return dlg.ShowDialog(); + } + + private string mvarParentFileName = String.Empty; + /// + /// The directory or file name of the parent location that contains the file whose properties are to be displayed. + /// + public string ParentFileName { get { return mvarParentFileName; } set { mvarParentFileName = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.Designer.cs new file mode 100644 index 00000000..082a4b4f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.Designer.cs @@ -0,0 +1,525 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Dialogs.FileSystem.Internal +{ + partial class FilePropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("General"); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlGeneral = new System.Windows.Forms.Panel(); + this.fraGeneralInformation = new System.Windows.Forms.GroupBox(); + this.txtGeneralInformationDateAccessed = new System.Windows.Forms.TextBox(); + this.lblGeneralInformationDateAccessed = new System.Windows.Forms.Label(); + this.lblGeneralInformationDateModified = new System.Windows.Forms.Label(); + this.txtGeneralInformationDateModified = new System.Windows.Forms.TextBox(); + this.lblGeneralInformationDateCreated = new System.Windows.Forms.Label(); + this.txtGeneralInformationSize = new System.Windows.Forms.TextBox(); + this.txtGeneralInformationDateCreated = new System.Windows.Forms.TextBox(); + this.lblGeneralInformationObjectModel = new System.Windows.Forms.Label(); + this.lblGeneralInformationDataFormat = new System.Windows.Forms.Label(); + this.lblGeneralInformationSize = new System.Windows.Forms.Label(); + this.txtGeneralInformationObjectModel = new System.Windows.Forms.TextBox(); + this.txtGeneralInformationDataFormat = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.cmdGeneralInformationLocationBrowse = new System.Windows.Forms.Button(); + this.cmdGeneralInformationLocationChange = new System.Windows.Forms.Button(); + this.cmdGeneralInformationDataFormatChange = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.txtGeneralInformationLocation = new System.Windows.Forms.TextBox(); + this.fraAttributes = new System.Windows.Forms.GroupBox(); + this.chkGeneralAttributesArchive = new System.Windows.Forms.CheckBox(); + this.chkGeneralAttributesHidden = new System.Windows.Forms.CheckBox(); + this.chkGeneralAttributesReadOnly = new System.Windows.Forms.CheckBox(); + this.txtFileName = new System.Windows.Forms.TextBox(); + this.picIcon = new System.Windows.Forms.PictureBox(); + this.sc = new System.Windows.Forms.SplitContainer(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.pnlNoObjectsSelected = new System.Windows.Forms.Panel(); + this.lblNoObjectsSelected = new System.Windows.Forms.Label(); + this.chkGeneralAttributesDeleted = new System.Windows.Forms.CheckBox(); + this.pnlGeneral.SuspendLayout(); + this.fraGeneralInformation.SuspendLayout(); + this.fraAttributes.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picIcon)).BeginInit(); + this.sc.Panel1.SuspendLayout(); + this.sc.Panel2.SuspendLayout(); + this.sc.SuspendLayout(); + this.pnlNoObjectsSelected.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode1.Name = "nodeGeneral"; + treeNode1.Text = "General"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1}); + this.tv.Size = new System.Drawing.Size(127, 373); + this.tv.TabIndex = 0; + // + // pnlGeneral + // + this.pnlGeneral.Controls.Add(this.fraGeneralInformation); + this.pnlGeneral.Controls.Add(this.fraAttributes); + this.pnlGeneral.Controls.Add(this.txtFileName); + this.pnlGeneral.Controls.Add(this.picIcon); + this.pnlGeneral.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlGeneral.Location = new System.Drawing.Point(0, 0); + this.pnlGeneral.Name = "pnlGeneral"; + this.pnlGeneral.Size = new System.Drawing.Size(323, 373); + this.pnlGeneral.TabIndex = 0; + // + // fraGeneralInformation + // + this.fraGeneralInformation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationDateAccessed); + this.fraGeneralInformation.Controls.Add(this.lblGeneralInformationDateAccessed); + this.fraGeneralInformation.Controls.Add(this.lblGeneralInformationDateModified); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationDateModified); + this.fraGeneralInformation.Controls.Add(this.lblGeneralInformationDateCreated); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationSize); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationDateCreated); + this.fraGeneralInformation.Controls.Add(this.lblGeneralInformationObjectModel); + this.fraGeneralInformation.Controls.Add(this.lblGeneralInformationDataFormat); + this.fraGeneralInformation.Controls.Add(this.lblGeneralInformationSize); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationObjectModel); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationDataFormat); + this.fraGeneralInformation.Controls.Add(this.label2); + this.fraGeneralInformation.Controls.Add(this.cmdGeneralInformationLocationBrowse); + this.fraGeneralInformation.Controls.Add(this.cmdGeneralInformationLocationChange); + this.fraGeneralInformation.Controls.Add(this.cmdGeneralInformationDataFormatChange); + this.fraGeneralInformation.Controls.Add(this.label3); + this.fraGeneralInformation.Controls.Add(this.txtGeneralInformationLocation); + this.fraGeneralInformation.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraGeneralInformation.Location = new System.Drawing.Point(7, 45); + this.fraGeneralInformation.Name = "fraGeneralInformation"; + this.fraGeneralInformation.Size = new System.Drawing.Size(313, 270); + this.fraGeneralInformation.TabIndex = 1; + this.fraGeneralInformation.TabStop = false; + this.fraGeneralInformation.Text = "Information"; + // + // txtGeneralInformationDateAccessed + // + this.txtGeneralInformationDateAccessed.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationDateAccessed.Location = new System.Drawing.Point(101, 241); + this.txtGeneralInformationDateAccessed.Name = "txtGeneralInformationDateAccessed"; + this.txtGeneralInformationDateAccessed.ReadOnly = true; + this.txtGeneralInformationDateAccessed.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationDateAccessed.TabIndex = 13; + // + // lblGeneralInformationDateAccessed + // + this.lblGeneralInformationDateAccessed.AutoSize = true; + this.lblGeneralInformationDateAccessed.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGeneralInformationDateAccessed.Location = new System.Drawing.Point(13, 244); + this.lblGeneralInformationDateAccessed.Name = "lblGeneralInformationDateAccessed"; + this.lblGeneralInformationDateAccessed.Size = new System.Drawing.Size(82, 13); + this.lblGeneralInformationDateAccessed.TabIndex = 12; + this.lblGeneralInformationDateAccessed.Text = "Date accessed:"; + // + // lblGeneralInformationDateModified + // + this.lblGeneralInformationDateModified.AutoSize = true; + this.lblGeneralInformationDateModified.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGeneralInformationDateModified.Location = new System.Drawing.Point(13, 218); + this.lblGeneralInformationDateModified.Name = "lblGeneralInformationDateModified"; + this.lblGeneralInformationDateModified.Size = new System.Drawing.Size(75, 13); + this.lblGeneralInformationDateModified.TabIndex = 10; + this.lblGeneralInformationDateModified.Text = "Date modified:"; + // + // txtGeneralInformationDateModified + // + this.txtGeneralInformationDateModified.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationDateModified.Location = new System.Drawing.Point(101, 215); + this.txtGeneralInformationDateModified.Name = "txtGeneralInformationDateModified"; + this.txtGeneralInformationDateModified.ReadOnly = true; + this.txtGeneralInformationDateModified.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationDateModified.TabIndex = 11; + // + // lblGeneralInformationDateCreated + // + this.lblGeneralInformationDateCreated.AutoSize = true; + this.lblGeneralInformationDateCreated.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGeneralInformationDateCreated.Location = new System.Drawing.Point(13, 192); + this.lblGeneralInformationDateCreated.Name = "lblGeneralInformationDateCreated"; + this.lblGeneralInformationDateCreated.Size = new System.Drawing.Size(72, 13); + this.lblGeneralInformationDateCreated.TabIndex = 8; + this.lblGeneralInformationDateCreated.Text = "Date created:"; + // + // txtGeneralInformationSize + // + this.txtGeneralInformationSize.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationSize.Location = new System.Drawing.Point(101, 155); + this.txtGeneralInformationSize.Name = "txtGeneralInformationSize"; + this.txtGeneralInformationSize.ReadOnly = true; + this.txtGeneralInformationSize.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationSize.TabIndex = 6; + // + // txtGeneralInformationDateCreated + // + this.txtGeneralInformationDateCreated.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationDateCreated.Location = new System.Drawing.Point(101, 189); + this.txtGeneralInformationDateCreated.Name = "txtGeneralInformationDateCreated"; + this.txtGeneralInformationDateCreated.ReadOnly = true; + this.txtGeneralInformationDateCreated.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationDateCreated.TabIndex = 9; + // + // lblGeneralInformationObjectModel + // + this.lblGeneralInformationObjectModel.AutoSize = true; + this.lblGeneralInformationObjectModel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGeneralInformationObjectModel.Location = new System.Drawing.Point(13, 22); + this.lblGeneralInformationObjectModel.Name = "lblGeneralInformationObjectModel"; + this.lblGeneralInformationObjectModel.Size = new System.Drawing.Size(72, 13); + this.lblGeneralInformationObjectModel.TabIndex = 0; + this.lblGeneralInformationObjectModel.Text = "Object model:"; + // + // lblGeneralInformationDataFormat + // + this.lblGeneralInformationDataFormat.AutoSize = true; + this.lblGeneralInformationDataFormat.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGeneralInformationDataFormat.Location = new System.Drawing.Point(13, 48); + this.lblGeneralInformationDataFormat.Name = "lblGeneralInformationDataFormat"; + this.lblGeneralInformationDataFormat.Size = new System.Drawing.Size(65, 13); + this.lblGeneralInformationDataFormat.TabIndex = 0; + this.lblGeneralInformationDataFormat.Text = "Data format:"; + // + // lblGeneralInformationSize + // + this.lblGeneralInformationSize.AutoSize = true; + this.lblGeneralInformationSize.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGeneralInformationSize.Location = new System.Drawing.Point(13, 158); + this.lblGeneralInformationSize.Name = "lblGeneralInformationSize"; + this.lblGeneralInformationSize.Size = new System.Drawing.Size(30, 13); + this.lblGeneralInformationSize.TabIndex = 5; + this.lblGeneralInformationSize.Text = "Size:"; + // + // txtGeneralInformationObjectModel + // + this.txtGeneralInformationObjectModel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationObjectModel.Location = new System.Drawing.Point(101, 19); + this.txtGeneralInformationObjectModel.Name = "txtGeneralInformationObjectModel"; + this.txtGeneralInformationObjectModel.ReadOnly = true; + this.txtGeneralInformationObjectModel.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationObjectModel.TabIndex = 1; + // + // txtGeneralInformationDataFormat + // + this.txtGeneralInformationDataFormat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationDataFormat.Location = new System.Drawing.Point(101, 45); + this.txtGeneralInformationDataFormat.Name = "txtGeneralInformationDataFormat"; + this.txtGeneralInformationDataFormat.ReadOnly = true; + this.txtGeneralInformationDataFormat.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationDataFormat.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(13, 103); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(51, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Location:"; + // + // cmdGeneralInformationLocationBrowse + // + this.cmdGeneralInformationLocationBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdGeneralInformationLocationBrowse.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdGeneralInformationLocationBrowse.Location = new System.Drawing.Point(151, 126); + this.cmdGeneralInformationLocationBrowse.Name = "cmdGeneralInformationLocationBrowse"; + this.cmdGeneralInformationLocationBrowse.Size = new System.Drawing.Size(75, 23); + this.cmdGeneralInformationLocationBrowse.TabIndex = 2; + this.cmdGeneralInformationLocationBrowse.Text = "&Browse"; + this.cmdGeneralInformationLocationBrowse.UseVisualStyleBackColor = true; + this.cmdGeneralInformationLocationBrowse.Click += new System.EventHandler(this.cmdGeneralInformationLocationBrowse_Click); + // + // cmdGeneralInformationLocationChange + // + this.cmdGeneralInformationLocationChange.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdGeneralInformationLocationChange.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdGeneralInformationLocationChange.Location = new System.Drawing.Point(232, 126); + this.cmdGeneralInformationLocationChange.Name = "cmdGeneralInformationLocationChange"; + this.cmdGeneralInformationLocationChange.Size = new System.Drawing.Size(75, 23); + this.cmdGeneralInformationLocationChange.TabIndex = 2; + this.cmdGeneralInformationLocationChange.Text = "&Change..."; + this.cmdGeneralInformationLocationChange.UseVisualStyleBackColor = true; + this.cmdGeneralInformationLocationChange.Click += new System.EventHandler(this.cmdGeneralInformationLocationChange_Click); + // + // cmdGeneralInformationDataFormatChange + // + this.cmdGeneralInformationDataFormatChange.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdGeneralInformationDataFormatChange.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdGeneralInformationDataFormatChange.Location = new System.Drawing.Point(232, 71); + this.cmdGeneralInformationDataFormatChange.Name = "cmdGeneralInformationDataFormatChange"; + this.cmdGeneralInformationDataFormatChange.Size = new System.Drawing.Size(75, 23); + this.cmdGeneralInformationDataFormatChange.TabIndex = 2; + this.cmdGeneralInformationDataFormatChange.Text = "&Change..."; + this.cmdGeneralInformationDataFormatChange.UseVisualStyleBackColor = true; + this.cmdGeneralInformationDataFormatChange.Click += new System.EventHandler(this.cmdGeneralInformationDataFormatChange_Click); + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(6, 181); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(301, 2); + this.label3.TabIndex = 7; + // + // txtGeneralInformationLocation + // + this.txtGeneralInformationLocation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGeneralInformationLocation.Location = new System.Drawing.Point(101, 100); + this.txtGeneralInformationLocation.Name = "txtGeneralInformationLocation"; + this.txtGeneralInformationLocation.ReadOnly = true; + this.txtGeneralInformationLocation.Size = new System.Drawing.Size(206, 20); + this.txtGeneralInformationLocation.TabIndex = 4; + // + // fraAttributes + // + this.fraAttributes.Controls.Add(this.chkGeneralAttributesDeleted); + this.fraAttributes.Controls.Add(this.chkGeneralAttributesArchive); + this.fraAttributes.Controls.Add(this.chkGeneralAttributesHidden); + this.fraAttributes.Controls.Add(this.chkGeneralAttributesReadOnly); + this.fraAttributes.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraAttributes.Location = new System.Drawing.Point(7, 321); + this.fraAttributes.Name = "fraAttributes"; + this.fraAttributes.Size = new System.Drawing.Size(313, 47); + this.fraAttributes.TabIndex = 2; + this.fraAttributes.TabStop = false; + this.fraAttributes.Text = "Attributes"; + // + // chkGeneralAttributesArchive + // + this.chkGeneralAttributesArchive.AutoSize = true; + this.chkGeneralAttributesArchive.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkGeneralAttributesArchive.Location = new System.Drawing.Point(162, 19); + this.chkGeneralAttributesArchive.Name = "chkGeneralAttributesArchive"; + this.chkGeneralAttributesArchive.Size = new System.Drawing.Size(68, 18); + this.chkGeneralAttributesArchive.TabIndex = 2; + this.chkGeneralAttributesArchive.Text = "&Archive"; + this.chkGeneralAttributesArchive.UseVisualStyleBackColor = true; + // + // chkGeneralAttributesHidden + // + this.chkGeneralAttributesHidden.AutoSize = true; + this.chkGeneralAttributesHidden.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkGeneralAttributesHidden.Location = new System.Drawing.Point(96, 19); + this.chkGeneralAttributesHidden.Name = "chkGeneralAttributesHidden"; + this.chkGeneralAttributesHidden.Size = new System.Drawing.Size(66, 18); + this.chkGeneralAttributesHidden.TabIndex = 1; + this.chkGeneralAttributesHidden.Text = "&Hidden"; + this.chkGeneralAttributesHidden.UseVisualStyleBackColor = true; + // + // chkGeneralAttributesReadOnly + // + this.chkGeneralAttributesReadOnly.AutoSize = true; + this.chkGeneralAttributesReadOnly.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkGeneralAttributesReadOnly.Location = new System.Drawing.Point(16, 19); + this.chkGeneralAttributesReadOnly.Name = "chkGeneralAttributesReadOnly"; + this.chkGeneralAttributesReadOnly.Size = new System.Drawing.Size(80, 18); + this.chkGeneralAttributesReadOnly.TabIndex = 0; + this.chkGeneralAttributesReadOnly.Text = "&Read-only"; + this.chkGeneralAttributesReadOnly.UseVisualStyleBackColor = true; + // + // txtFileName + // + this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFileName.Location = new System.Drawing.Point(45, 7); + this.txtFileName.Name = "txtFileName"; + this.txtFileName.Size = new System.Drawing.Size(275, 20); + this.txtFileName.TabIndex = 0; + // + // picIcon + // + this.picIcon.Location = new System.Drawing.Point(7, 7); + this.picIcon.Name = "picIcon"; + this.picIcon.Size = new System.Drawing.Size(32, 32); + this.picIcon.TabIndex = 0; + this.picIcon.TabStop = false; + // + // sc + // + this.sc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.sc.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.sc.Location = new System.Drawing.Point(12, 12); + this.sc.Name = "sc"; + // + // sc.Panel1 + // + this.sc.Panel1.Controls.Add(this.tv); + // + // sc.Panel2 + // + this.sc.Panel2.Controls.Add(this.pnlGeneral); + this.sc.Size = new System.Drawing.Size(454, 373); + this.sc.SplitterDistance = 127; + this.sc.TabIndex = 0; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(391, 391); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(310, 391); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 1; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // pnlNoObjectsSelected + // + this.pnlNoObjectsSelected.Controls.Add(this.lblNoObjectsSelected); + this.pnlNoObjectsSelected.Location = new System.Drawing.Point(12, 12); + this.pnlNoObjectsSelected.Name = "pnlNoObjectsSelected"; + this.pnlNoObjectsSelected.Size = new System.Drawing.Size(454, 318); + this.pnlNoObjectsSelected.TabIndex = 3; + this.pnlNoObjectsSelected.Visible = false; + // + // lblNoObjectsSelected + // + this.lblNoObjectsSelected.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblNoObjectsSelected.AutoSize = true; + this.lblNoObjectsSelected.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblNoObjectsSelected.Location = new System.Drawing.Point(184, 153); + this.lblNoObjectsSelected.Name = "lblNoObjectsSelected"; + this.lblNoObjectsSelected.Size = new System.Drawing.Size(87, 13); + this.lblNoObjectsSelected.TabIndex = 0; + this.lblNoObjectsSelected.Text = "Nothing selected"; + // + // chkGeneralAttributesDeleted + // + this.chkGeneralAttributesDeleted.AutoSize = true; + this.chkGeneralAttributesDeleted.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkGeneralAttributesDeleted.Location = new System.Drawing.Point(230, 19); + this.chkGeneralAttributesDeleted.Name = "chkGeneralAttributesDeleted"; + this.chkGeneralAttributesDeleted.Size = new System.Drawing.Size(69, 18); + this.chkGeneralAttributesDeleted.TabIndex = 2; + this.chkGeneralAttributesDeleted.Text = "&Deleted"; + this.chkGeneralAttributesDeleted.UseVisualStyleBackColor = true; + // + // FilePropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(486, 437); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.sc); + this.Controls.Add(this.pnlNoObjectsSelected); + this.MinimumSize = new System.Drawing.Size(494, 464); + this.Name = "FilePropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Properties"; + this.pnlGeneral.ResumeLayout(false); + this.pnlGeneral.PerformLayout(); + this.fraGeneralInformation.ResumeLayout(false); + this.fraGeneralInformation.PerformLayout(); + this.fraAttributes.ResumeLayout(false); + this.fraAttributes.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picIcon)).EndInit(); + this.sc.Panel1.ResumeLayout(false); + this.sc.Panel2.ResumeLayout(false); + this.sc.ResumeLayout(false); + this.pnlNoObjectsSelected.ResumeLayout(false); + this.pnlNoObjectsSelected.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlGeneral; + private System.Windows.Forms.SplitContainer sc; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.GroupBox fraAttributes; + private System.Windows.Forms.GroupBox fraGeneralInformation; + private System.Windows.Forms.Label lblGeneralInformationDataFormat; + private System.Windows.Forms.Button cmdGeneralInformationDataFormatChange; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lblGeneralInformationSize; + private System.Windows.Forms.Label lblGeneralInformationDateCreated; + private System.Windows.Forms.Label lblGeneralInformationDateModified; + private System.Windows.Forms.Label lblGeneralInformationDateAccessed; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtFileName; + private System.Windows.Forms.PictureBox picIcon; + private System.Windows.Forms.CheckBox chkGeneralAttributesArchive; + private System.Windows.Forms.CheckBox chkGeneralAttributesHidden; + private System.Windows.Forms.CheckBox chkGeneralAttributesReadOnly; + private System.Windows.Forms.TextBox txtGeneralInformationDataFormat; + internal System.Windows.Forms.TextBox txtGeneralInformationLocation; + private System.Windows.Forms.TextBox txtGeneralInformationSize; + private System.Windows.Forms.TextBox txtGeneralInformationDateCreated; + private System.Windows.Forms.TextBox txtGeneralInformationDateModified; + private System.Windows.Forms.TextBox txtGeneralInformationDateAccessed; + private System.Windows.Forms.Panel pnlNoObjectsSelected; + private System.Windows.Forms.Label lblNoObjectsSelected; + private System.Windows.Forms.TextBox txtGeneralInformationObjectModel; + private System.Windows.Forms.Label lblGeneralInformationObjectModel; + private System.Windows.Forms.Button cmdGeneralInformationLocationBrowse; + private System.Windows.Forms.Button cmdGeneralInformationLocationChange; + private System.Windows.Forms.CheckBox chkGeneralAttributesDeleted; + + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.cs new file mode 100644 index 00000000..f9a60105 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.UserInterface.WindowsForms.Dialogs.FileSystem.Internal +{ + internal partial class FilePropertiesDialogImpl : Form + { + public FilePropertiesDialogImpl() + { + InitializeComponent(); + tv.SelectedNode = tv.Nodes[0]; + + Font = SystemFonts.MenuFont; + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (mvarSelectedObjects.Count == 0) + { + sc.Visible = false; + sc.Enabled = false; + pnlNoObjectsSelected.Enabled = true; + pnlNoObjectsSelected.Visible = true; + } + else if (mvarSelectedObjects.Count == 1) + { + pnlNoObjectsSelected.Visible = false; + pnlNoObjectsSelected.Enabled = false; + sc.Enabled = true; + sc.Visible = true; + + cmdGeneralInformationDataFormatChange.Enabled = false; + IFileSystemObject fso = mvarSelectedObjects[0]; + if (fso is File) + { + File file = (fso as File); + + string fileTitle = System.IO.Path.GetFileName(file.Name); + string fileLocation = System.IO.Path.GetDirectoryName(file.Name); + + txtFileName.Text = fileTitle; + if (String.IsNullOrEmpty(txtGeneralInformationLocation.Text)) + { + // only set the General - Location value if it has not already been set + txtGeneralInformationLocation.Text = fileLocation; + } + + chkGeneralAttributesArchive.Checked = ((file.Attributes & FileAttributes.Archive) == FileAttributes.Archive); + chkGeneralAttributesDeleted.Checked = ((file.Attributes & FileAttributes.Deleted) == FileAttributes.Deleted); + chkGeneralAttributesHidden.Checked = ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden); + chkGeneralAttributesReadOnly.Checked = ((file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly); + + Accessors.MemoryAccessor ma = new Accessors.MemoryAccessor(file.GetData(), file.Name); + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { Accessor = ma }); + if (assocs.Length > 0) + { + DataFormatReference dfr = assocs[0].DataFormats[0]; + if (assocs[0].Filters.Count > 0) + { + txtGeneralInformationDataFormat.Text = assocs[0].Filters[0].Title; + } + else + { + txtGeneralInformationDataFormat.Text = dfr.Title; + } + + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(dfr); + if (omrs.Length > 0) + { + txtGeneralInformationObjectModel.Text = omrs[0].Title; + cmdGeneralInformationDataFormatChange.Enabled = true; + } + } + txtGeneralInformationSize.Text = PrettyPrintFileSize(file.Size); + } + else if (fso is Folder) + { + + } + } + else if (mvarSelectedObjects.Count > 1) + { + pnlNoObjectsSelected.Visible = false; + pnlNoObjectsSelected.Enabled = false; + sc.Enabled = true; + sc.Visible = true; + } + } + + private string PrettyPrintFileSize(long size) + { + long KB = 1024; + long MB = KB * 1024; + long GB = MB * 1024; + long TB = GB * 1024; + + StringBuilder sb = new StringBuilder(); + if (size >= TB) + { + sb.Append(Math.Round(((decimal)size / TB), 2).ToString() + " TB"); + } + else if (size >= GB) + { + sb.Append(Math.Round(((decimal)size / TB), 2).ToString() + " GB"); + } + else if (size >= MB) + { + sb.Append(Math.Round(((decimal)size / MB), 2).ToString() + " MB"); + } + else if (size >= KB) + { + sb.Append(Math.Round(((decimal)size / KB), 2).ToString() + " KB"); + } + else + { + sb.Append(Math.Round((decimal)size, 2).ToString() + " bytes"); + } + return sb.ToString(); + } + + private void cmdGeneralInformationDataFormatChange_Click(object sender, EventArgs e) + { + + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (mvarSelectedObjects.Count == 1) + { + IFileSystemObject fso = mvarSelectedObjects[0]; + if (fso is File) + { + File file = (fso as File); + file.Name = txtFileName.Text; + + + if (chkGeneralAttributesArchive.Checked) + { + file.Attributes |= FileAttributes.Archive; + } + else + { + file.Attributes &= ~FileAttributes.Archive; + } + + if (chkGeneralAttributesDeleted.Checked) + { + file.Attributes |= FileAttributes.Deleted; + } + else + { + file.Attributes &= ~FileAttributes.Deleted; + } + + if (chkGeneralAttributesHidden.Checked) + { + file.Attributes |= FileAttributes.Hidden; + } + else + { + file.Attributes &= ~FileAttributes.Hidden; + } + + if (chkGeneralAttributesReadOnly.Checked) + { + file.Attributes |= FileAttributes.ReadOnly; + } + else + { + file.Attributes &= ~FileAttributes.ReadOnly; + } + } + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + private IFileSystemObjectCollection mvarSelectedObjects = new IFileSystemObjectCollection(); + public IFileSystemObjectCollection SelectedObjects + { + get { return mvarSelectedObjects; } + set + { + if (value != null) mvarSelectedObjects = value; + } + } + + private void cmdGeneralInformationLocationBrowse_Click(object sender, EventArgs e) + { + // Check if location is a directory so we don't inadvertently launch a program + if (System.IO.Directory.Exists(txtGeneralInformationLocation.Text)) + { + System.Diagnostics.Process.Start(txtGeneralInformationLocation.Text); + } + } + + private void cmdGeneralInformationLocationChange_Click(object sender, EventArgs e) + { + // Check if location is a directory so we don't inadvertently move a program + if (System.IO.Directory.Exists(txtGeneralInformationLocation.Text)) + { + string oldFilePath = txtGeneralInformationLocation.Text + System.IO.Path.DirectorySeparatorChar.ToString() + txtFileName.Text; + + // use AC NativeDialog for FolderBrowserDialog because it looks much sexier than the built-in WinForms one + AwesomeControls.NativeDialogs.FolderBrowserDialog dlg = new AwesomeControls.NativeDialogs.FolderBrowserDialog(); + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + string newFilePath = dlg.SelectedPath + System.IO.Path.DirectorySeparatorChar.ToString() + txtFileName.Text; + + // move the specified file from the old location to the new location + System.IO.File.Move(oldFilePath, newFilePath); + } + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/FileSystem/Internal/FilePropertiesDialogImpl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.Designer.cs new file mode 100644 index 00000000..bad420df --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.Designer.cs @@ -0,0 +1,171 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Dialogs.PropertyList +{ + partial class PropertyDetailsDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.lblPropertyName = new System.Windows.Forms.Label(); + this.lblPropertyValue = new System.Windows.Forms.Label(); + this.txtPropertyName = new System.Windows.Forms.TextBox(); + this.txtPropertyValue = new System.Windows.Forms.TextBox(); + this.lblPropertyType = new System.Windows.Forms.Label(); + this.cboPropertyType = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(274, 140); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 7; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(193, 140); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 6; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // lblPropertyName + // + this.lblPropertyName.AutoSize = true; + this.lblPropertyName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblPropertyName.Location = new System.Drawing.Point(12, 15); + this.lblPropertyName.Name = "lblPropertyName"; + this.lblPropertyName.Size = new System.Drawing.Size(78, 13); + this.lblPropertyName.TabIndex = 0; + this.lblPropertyName.Text = "Property &name:"; + // + // lblPropertyValue + // + this.lblPropertyValue.AutoSize = true; + this.lblPropertyValue.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblPropertyValue.Location = new System.Drawing.Point(12, 68); + this.lblPropertyValue.Name = "lblPropertyValue"; + this.lblPropertyValue.Size = new System.Drawing.Size(78, 13); + this.lblPropertyValue.TabIndex = 4; + this.lblPropertyValue.Text = "Property &value:"; + // + // txtPropertyName + // + this.txtPropertyName.Location = new System.Drawing.Point(96, 12); + this.txtPropertyName.Name = "txtPropertyName"; + this.txtPropertyName.Size = new System.Drawing.Size(253, 20); + this.txtPropertyName.TabIndex = 1; + // + // txtPropertyValue + // + this.txtPropertyValue.Location = new System.Drawing.Point(96, 65); + this.txtPropertyValue.Name = "txtPropertyValue"; + this.txtPropertyValue.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtPropertyValue.Size = new System.Drawing.Size(253, 20); + this.txtPropertyValue.TabIndex = 5; + // + // lblPropertyType + // + this.lblPropertyType.AutoSize = true; + this.lblPropertyType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblPropertyType.Location = new System.Drawing.Point(12, 41); + this.lblPropertyType.Name = "lblPropertyType"; + this.lblPropertyType.Size = new System.Drawing.Size(72, 13); + this.lblPropertyType.TabIndex = 2; + this.lblPropertyType.Text = "Property &type:"; + // + // cboPropertyType + // + this.cboPropertyType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboPropertyType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboPropertyType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboPropertyType.FormattingEnabled = true; + this.cboPropertyType.Items.AddRange(new object[] { + "(auto-detect)", + "String", + "Binary", + "DWORD", + "Expanded String", + "Link", + "String List", + "None", + "QWORD", + "Unknown"}); + this.cboPropertyType.Location = new System.Drawing.Point(96, 38); + this.cboPropertyType.Name = "cboPropertyType"; + this.cboPropertyType.Size = new System.Drawing.Size(253, 21); + this.cboPropertyType.TabIndex = 3; + this.cboPropertyType.SelectedIndexChanged += new System.EventHandler(this.cboPropertyType_SelectedIndexChanged); + // + // PropertyDetailsDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(361, 175); + this.Controls.Add(this.cboPropertyType); + this.Controls.Add(this.txtPropertyValue); + this.Controls.Add(this.txtPropertyName); + this.Controls.Add(this.lblPropertyType); + this.Controls.Add(this.lblPropertyValue); + this.Controls.Add(this.lblPropertyName); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PropertyDetailsDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Property Details"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Label lblPropertyName; + private System.Windows.Forms.Label lblPropertyValue; + internal System.Windows.Forms.TextBox txtPropertyName; + internal System.Windows.Forms.TextBox txtPropertyValue; + private System.Windows.Forms.Label lblPropertyType; + internal System.Windows.Forms.ComboBox cboPropertyType; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.cs new file mode 100644 index 00000000..993a5ccc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.UserInterface.WindowsForms.Dialogs.PropertyList +{ + public partial class PropertyDetailsDialog : Form + { + public PropertyDetailsDialog() + { + InitializeComponent(); + cboPropertyType.SelectedIndex = 0; + + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtPropertyName.Text)) + { + MessageBox.Show("Please enter a name for this property.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + int dummy32 = 0; + long dummy64 = 0; + + switch (cboPropertyType.SelectedIndex) + { + case 2: + { + break; + } + case 3: + { + if (!Int32.TryParse(txtPropertyValue.Text, out dummy32)) + { + MessageBox.Show("The value you entered is not a valid 32-bit integer.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + break; + } + case 8: + { + if (!Int64.TryParse(txtPropertyValue.Text, out dummy64)) + { + MessageBox.Show("The value you entered is not a valid 32-bit integer.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + break; + } + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cboPropertyType_SelectedIndexChanged(object sender, EventArgs e) + { + switch (cboPropertyType.SelectedIndex) + { + case 0: // (auto-detect) + case 1: // String + case 2: // Binary + case 3: // DWORD + case 4: // Expanded String + case 5: // Link + case 8: // QWORD + { + lblPropertyValue.Visible = true; + txtPropertyValue.Visible = true; + txtPropertyValue.Multiline = false; + break; + } + case 6: // String List + { + lblPropertyValue.Visible = true; + txtPropertyValue.Visible = true; + txtPropertyValue.Multiline = true; + break; + } + case 9: // Unknown + case 7: // None + { + lblPropertyValue.Visible = false; + txtPropertyValue.Visible = false; + break; + } + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Dialogs/PropertyList/PropertyDetailsDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.Designer.cs new file mode 100644 index 00000000..4e11befe --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.Designer.cs @@ -0,0 +1,45 @@ +namespace UniversalEditor.UserInterface.WindowsForms +{ + partial class Editor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Editor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "Editor"; + this.Size = new System.Drawing.Size(368, 137); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.cs new file mode 100644 index 00000000..78ddf90f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.cs @@ -0,0 +1,494 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.DataFormats.PropertyList.XML; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public partial class Editor : UserControl, IEditorImplementation + { + private static EditorReference _er = null; + public virtual EditorReference MakeReference() + { + return new EditorReference(GetType()); + + if (_er == null) + { + _er = new EditorReference(GetType()); + } + return _er; + } + + private bool mvarInhibitUndo = false; + protected bool InhibitUndo { get { return mvarInhibitUndo; } set { mvarInhibitUndo = value; } } + + private Toolbox mvarToolbox = new Toolbox(); + protected Toolbox Toolbox { get { return mvarToolbox; } } + + private AwesomeControls.PropertyGrid.PropertyGroup.PropertyGroupCollection mvarPropertyGroups = new AwesomeControls.PropertyGrid.PropertyGroup.PropertyGroupCollection(null); + public AwesomeControls.PropertyGrid.PropertyGroup.PropertyGroupCollection PropertyGroups { get { return mvarPropertyGroups; } } + + /// + /// The event raised when a toolbox item is selected. Use this to change the current Editor's internal mode without + /// actually affecting the content of the ObjectModel. + /// + public event ToolboxItemEventHandler ToolboxItemSelected; + protected virtual void OnToolboxItemSelected(ToolboxItemEventArgs e) + { + if (ToolboxItemSelected != null) ToolboxItemSelected(this, e); + } + /// + /// The event raised when a toolbox item is added to the Editor. Use this to adjust the content of the ObjectModel + /// based on which toolbox item was added. + /// + public event ToolboxItemEventHandler ToolboxItemAdded; + protected virtual void OnToolboxItemAdded(ToolboxItemEventArgs e) + { + if (ToolboxItemAdded != null) ToolboxItemAdded(this, e); + } + + /// + /// Causes the editor to select the specified toolbox item. + /// + /// + /// True if the editor accepted the new selection; false otherwise. Update the toolbox user interface accordingly. + public bool SelectToolboxItem(ToolboxItem item) + { + ToolboxItemEventArgs e = new ToolboxItemEventArgs(item); + OnToolboxItemSelected(e); + if (e.Cancel) return false; + return true; + } + + protected override void OnDragEnter(DragEventArgs e) + { + base.OnDragEnter(e); + if (e.Data.GetDataPresent(typeof(ToolboxItem))) + { + e.Effect = DragDropEffects.Copy; + } + } + protected override void OnDragDrop(DragEventArgs e) + { + base.OnDragDrop(e); + if (e.Data.GetDataPresent(typeof(ToolboxItem))) + { + ToolboxItem item = (e.Data.GetData(typeof(ToolboxItem)) as ToolboxItem); + ToolboxItemEventArgs e1 = new ToolboxItemEventArgs(item); + OnToolboxItemAdded(e1); + } + } + + public event CancelEventHandler DocumentClosing; + protected virtual void OnDocumentClosing(CancelEventArgs e) + { + if (DocumentClosing != null) DocumentClosing(this, e); + } + public event EventHandler DocumentClosed; + protected virtual void OnDocumentClosed(EventArgs e) + { + if (DocumentClosed != null) DocumentClosed(this, e); + } + + private UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel mvarConfiguration = new UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel(); + public UniversalEditor.ObjectModels.PropertyList.PropertyListObjectModel Configuration { get { return mvarConfiguration; } } + + public Editor() + { + InitializeComponent(); + + mvarLargeImageList.ColorDepth = ColorDepth.Depth32Bit; + mvarLargeImageList.ImageSize = new System.Drawing.Size(32, 32); + mvarLargeImageList.PopulateSystemIcons(); + + string largeImageListPath = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + DataPath, + "Images", + "ImageList", + "32x32" + }); + if (System.IO.Directory.Exists(largeImageListPath)) + { + string[] fileNames = System.IO.Directory.GetFiles(largeImageListPath); + foreach (string fileName in fileNames) + { + try + { + Image image = Image.FromFile(fileName); + mvarLargeImageList.Images.Add(System.IO.Path.GetFileNameWithoutExtension(fileName), image); + } + catch (System.OutOfMemoryException) + { + } + } + } + + mvarSmallImageList.ColorDepth = ColorDepth.Depth32Bit; + mvarSmallImageList.ImageSize = new System.Drawing.Size(16, 16); + mvarSmallImageList.PopulateSystemIcons(); + + string smallImageListPath = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + DataPath, + "Images", + "ImageList", + "16x16" + }); + if (System.IO.Directory.Exists(smallImageListPath)) + { + string[] fileNames = System.IO.Directory.GetFiles(smallImageListPath); + foreach (string fileName in fileNames) + { + try + { + Image image = Image.FromFile(fileName); + mvarSmallImageList.Images.Add(System.IO.Path.GetFileNameWithoutExtension(fileName), image); + } + catch (System.OutOfMemoryException) + { + } + } + } + + string configurationPath = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + DataPath, + "Configuration" + }); + + if (System.IO.Directory.Exists(configurationPath)) + { + string[] fileNames = System.IO.Directory.GetFiles(configurationPath, "*.xml"); + XMLPropertyListDataFormat xmpl = new XMLPropertyListDataFormat(); + + foreach (string fileName in fileNames) + { + try + { + PropertyListObjectModel plom = new PropertyListObjectModel(); + Document.Load(plom, xmpl, new FileAccessor(fileName), true); + plom.CopyTo(mvarConfiguration); + } + catch (InvalidDataFormatException ex) + { + } + } + } + } + + private ImageList mvarLargeImageList = new ImageList(); + protected ImageList LargeImageList { get { return mvarLargeImageList; } } + + private ImageList mvarSmallImageList = new ImageList(); + protected ImageList SmallImageList { get { return mvarSmallImageList; } } + + #region IEditorImplementation Members + public virtual string Title { get { return String.Empty; } } + + public virtual void Copy() + { + } + public virtual void Paste() + { + } + /// + /// Causes the editor to delete the currently-selected item. + /// + public virtual void Delete() + { + } + + private ObjectModel mvarObjectModel = null; + public ObjectModel ObjectModel + { + get { return mvarObjectModel; } + set + { + ObjectModelChangingEventArgs omce = new ObjectModelChangingEventArgs(mvarObjectModel, value); + + BeginUpdate(); + OnObjectModelChanging(omce); + EndUpdate(); + + if (omce.Cancel) return; + + mvarObjectModel = omce.NewObjectModel; + + BeginUpdate(); + OnObjectModelChanged(EventArgs.Empty); + EndUpdate(); + } + } + #endregion + #region Implementation + + public event ObjectModelChangingEventHandler ObjectModelChanging; + protected virtual void OnObjectModelChanging(ObjectModelChangingEventArgs e) + { + if (ObjectModelChanging != null) ObjectModelChanging(this, e); + } + public event EventHandler ObjectModelChanged; + protected virtual void OnObjectModelChanged(EventArgs e) + { + if (ObjectModelChanged != null) ObjectModelChanged(this, e); + } + + public event CancelEventHandler ObjectModelSaving; + protected virtual void OnObjectModelSaving(CancelEventArgs e) + { + if (ObjectModelSaving != null) ObjectModelSaving(this, e); + } + + private struct EDITINFO + { + public object item; + public string propertyName; + public object oldValue; + public bool closed; + + public EDITINFO(object item, string propertyName, object oldValue) + { + this.item = item; + this.propertyName = propertyName; + this.oldValue = oldValue; + this.closed = false; + } + } + + private Stack undo = new Stack(); + public int UndoItemCount { get { return undo.Count; } } + private Stack redo = new Stack(); + public int RedoItemCount { get { return redo.Count; } } + + public event EventHandler DocumentEdited; + protected virtual void OnDocumentEdited(EventArgs e) + { + if (DocumentEdited != null) DocumentEdited(this, e); + } + + private int mvarEditing = 0; + private int mvarUpdating = 0; + + protected void BeginUpdate() + { + mvarUpdating++; + } + protected void EndUpdate() + { + if (mvarUpdating == 0) return; + mvarUpdating--; + } + + protected void BeginEdit() + { + if (mvarUpdating > 0) return; + + if (mvarEditing > 0) + { + mvarEditing++; + return; + } + mvarEditing++; + + // check to see if this property has been edited before + if (undo.Count > 0) + { + EDITINFO oldedit = undo.Pop(); + if (oldedit.closed) undo.Push(oldedit); + } + + // push the new edit + EDITINFO edit = new EDITINFO(null, null, mvarObjectModel); + undo.Push(edit); + + // clear out all the redos + redo.Clear(); + } + protected void BeginEdit(string PropertyName, object Value = null, object ParentObject = null) + { + if (mvarEditing > 0) + { + mvarEditing++; + return; + } + mvarEditing++; + + if (ParentObject == null) ParentObject = ObjectModel; + + // check to see if this property has been edited before + if (undo.Count > 0) + { + EDITINFO oldedit = undo.Pop(); + if (oldedit.propertyName != PropertyName || oldedit.closed) undo.Push(oldedit); + } + + // push the new edit + if (Value == null) + { + System.Reflection.PropertyInfo pi = ParentObject.GetType().GetProperty(PropertyName); + if (pi != null) + { + Value = ParentObject.GetType().GetProperty(PropertyName).GetValue(ParentObject, null); + } + } + + EDITINFO edit = new EDITINFO(ParentObject, PropertyName, Value); + undo.Push(edit); + + // clear out all the redos + redo.Clear(); + } + protected void EndEdit() + { + if (mvarUpdating > 0) return; + + if (mvarEditing == 0) return; // throw new InvalidOperationException(); + if (mvarEditing > 1) + { + mvarEditing--; + return; + } + + if (undo.Count == 0) return; + EDITINFO oldedit = undo.Pop(); + oldedit.closed = true; + undo.Push(oldedit); + + // notify the object model that it's being edited + OnDocumentEdited(EventArgs.Empty); + + mvarEditing--; + } + + public virtual void Undo() + { + if (undo.Count == 0) return; + + EDITINFO edi = undo.Pop(); + EDITINFO newedi = edi; + + if (edi.propertyName != null) + { + // get the property that owns this edit + System.Reflection.PropertyInfo pi = edi.item.GetType().GetProperty(edi.propertyName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + + // get the current value of the property, for a "redo" + object newValue = pi.GetValue(edi.item, null); + newedi = new EDITINFO(edi.item, edi.propertyName, newValue); + + // set the current value to the "un-done" value + pi.SetValue(edi.item, edi.oldValue, null); + } + else + { + newedi = new EDITINFO(null, null, mvarObjectModel); + mvarObjectModel = (edi.oldValue as ObjectModel); + } + + // cause a refresh of the editor + OnObjectModelChanged(EventArgs.Empty); + + // push the previous value into the redo log + redo.Push(newedi); + } + public virtual void Redo() + { + // this is EXACTLY like undo, only in reverse ;) + if (redo.Count == 0) return; + + EDITINFO edi = redo.Pop(); + EDITINFO newedi = edi; + + if (edi.propertyName != null) + { + // get the property that owns this edit + System.Reflection.PropertyInfo pi = edi.item.GetType().GetProperty(edi.propertyName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + + // get the current value of the property, for a "redo" + object newValue = pi.GetValue(edi.item, null); + newedi = new EDITINFO(edi.item, edi.propertyName, newValue); + + // set the current value to the "un-done" value + pi.SetValue(edi.item, edi.oldValue, null); + } + else + { + newedi = new EDITINFO(null, null, mvarObjectModel); + mvarObjectModel = (edi.oldValue as ObjectModel); + } + + // cause a refresh of the editor + OnObjectModelChanged(EventArgs.Empty); + + // push the previous value into the undo log + undo.Push(newedi); + } + #endregion + + private MenuBar mvarMenuBar = new MenuBar(); + public MenuBar MenuBar { get { return mvarMenuBar; } } + + private Toolbar.ToolbarCollection mvarToolbars = new Toolbar.ToolbarCollection(); + public Toolbar.ToolbarCollection Toolbars { get { return mvarToolbars; } } + + public bool NotifySaving() + { + CancelEventArgs ce = new CancelEventArgs(); + OnObjectModelSaving(ce); + if (ce.Cancel) return false; + return true; + } + + public void NotifyClosing(CancelEventArgs ce) + { + OnDocumentClosing(ce); + } + public void NotifyClosed(EventArgs e) + { + OnDocumentClosed(e); + } + + public string DataPath { get { return String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] { "Editors", this.GetType().FullName }); } } + + private Command.CommandCollection mvarCommands = new Command.CommandCollection(); + public Command.CommandCollection Commands { get { return mvarCommands; } } + + protected override bool ProcessKeyPreview(ref Message m) + { + Keys keys = (Keys)m.WParam; + OnKeyDown(new KeyEventArgs(keys)); + + return base.ProcessKeyPreview(ref m); + } + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + + // look at this editor's configuration to see if we have any registered keybindings + foreach (Command cmd in mvarCommands) + { + if (cmd.ShortcutKey.CompareTo(e.KeyData)) + { + cmd.Execute(); + } + } + } + + public Image GetThemeImage(string path) + { + string fileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + "Editors", + this.GetType().FullName, + path + }); + return AwesomeControls.Theming.Theme.CurrentTheme.GetImage(fileName); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.Designer.cs new file mode 100644 index 00000000..4491b9ec --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.Designer.cs @@ -0,0 +1,886 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Editors +{ + partial class FileSystemEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileSystemEditor)); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuTreeViewContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuTreeViewContextExpand = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuTreeViewContextOpenInNewWindow = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripSeparator(); + this.shareWithToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem19 = new System.Windows.Forms.ToolStripSeparator(); + this.restorePreviousversionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuTreeViewContextCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTreeViewContextRename = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem21 = new System.Windows.Forms.ToolStripSeparator(); + this.newToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTreeViewContextAddNewItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTreeViewContextAddExistingItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTreeViewContextAddSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuTreeViewContextAddNewFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem23 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuTreeViewContextProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.lv = new AwesomeControls.ListView.ListViewControl(); + this.mnuListViewContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuListViewContextView = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewExtraLargeIcons = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewLargeIcons = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewMediumIcons = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewSmallIcons = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewList = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewDetails = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewTiles = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextViewContent = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); + this.sortByToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.nameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dateModifiedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.typeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.noneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.ascendingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.descendingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.moreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripSeparator(); + this.customizeThisfolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripSeparator(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteshortcutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.undoMoveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripSeparator(); + this.shareWithToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuListViewContextAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextAddNewItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextAddExistingItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuListViewContextAddSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuListViewContextAddNewFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuListViewContextProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.txtFilter = new System.Windows.Forms.TextBox(); + this.cbToolBar1 = new AwesomeControls.CommandBars.CBToolBar(); + this.tsbAddFiles = new System.Windows.Forms.ToolStripButton(); + this.tsbAddFolder = new System.Windows.Forms.ToolStripSplitButton(); + this.tsbAddFolderNew = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbAddFolderExisting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbAddFolderSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbAddFolderFiles = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbExtract = new System.Windows.Forms.ToolStripButton(); + this.tsbUndelete = new System.Windows.Forms.ToolStripButton(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.mnuTreeViewContext.SuspendLayout(); + this.mnuListViewContext.SuspendLayout(); + this.cbToolBar1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 84); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.lv); + this.splitContainer1.Panel2.Controls.Add(this.txtFilter); + this.splitContainer1.Size = new System.Drawing.Size(499, 215); + this.splitContainer1.SplitterDistance = 192; + this.splitContainer1.TabIndex = 0; + // + // tv + // + this.tv.ContextMenuStrip = this.mnuTreeViewContext; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.LabelEdit = true; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(192, 215); + this.tv.TabIndex = 0; + this.tv.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_BeforeLabelEdit); + this.tv.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_AfterLabelEdit); + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown); + // + // mnuTreeViewContext + // + this.mnuTreeViewContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuTreeViewContextExpand, + this.toolStripMenuItem17, + this.mnuTreeViewContextOpenInNewWindow, + this.toolStripMenuItem18, + this.shareWithToolStripMenuItem1, + this.toolStripMenuItem19, + this.restorePreviousversionsToolStripMenuItem, + this.toolStripMenuItem20, + this.mnuTreeViewContextCopy, + this.mnuTreeViewContextRename, + this.toolStripMenuItem21, + this.newToolStripMenuItem1, + this.toolStripMenuItem23, + this.mnuTreeViewContextProperties}); + this.mnuTreeViewContext.Name = "mnuTreeViewContext"; + this.mnuTreeViewContext.Size = new System.Drawing.Size(200, 216); + // + // mnuTreeViewContextExpand + // + this.mnuTreeViewContextExpand.Name = "mnuTreeViewContextExpand"; + this.mnuTreeViewContextExpand.Size = new System.Drawing.Size(199, 22); + this.mnuTreeViewContextExpand.Text = "Exp&and"; + // + // toolStripMenuItem17 + // + this.toolStripMenuItem17.Name = "toolStripMenuItem17"; + this.toolStripMenuItem17.Size = new System.Drawing.Size(196, 6); + // + // mnuTreeViewContextOpenInNewWindow + // + this.mnuTreeViewContextOpenInNewWindow.Name = "mnuTreeViewContextOpenInNewWindow"; + this.mnuTreeViewContextOpenInNewWindow.Size = new System.Drawing.Size(199, 22); + this.mnuTreeViewContextOpenInNewWindow.Text = "Op&en in new window"; + // + // toolStripMenuItem18 + // + this.toolStripMenuItem18.Name = "toolStripMenuItem18"; + this.toolStripMenuItem18.Size = new System.Drawing.Size(196, 6); + // + // shareWithToolStripMenuItem1 + // + this.shareWithToolStripMenuItem1.Name = "shareWithToolStripMenuItem1"; + this.shareWithToolStripMenuItem1.Size = new System.Drawing.Size(199, 22); + this.shareWithToolStripMenuItem1.Text = "S&hare with"; + // + // toolStripMenuItem19 + // + this.toolStripMenuItem19.Name = "toolStripMenuItem19"; + this.toolStripMenuItem19.Size = new System.Drawing.Size(196, 6); + // + // restorePreviousversionsToolStripMenuItem + // + this.restorePreviousversionsToolStripMenuItem.Name = "restorePreviousversionsToolStripMenuItem"; + this.restorePreviousversionsToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.restorePreviousversionsToolStripMenuItem.Text = "Restore previous &versions"; + // + // toolStripMenuItem20 + // + this.toolStripMenuItem20.Name = "toolStripMenuItem20"; + this.toolStripMenuItem20.Size = new System.Drawing.Size(196, 6); + // + // mnuTreeViewContextCopy + // + this.mnuTreeViewContextCopy.Name = "mnuTreeViewContextCopy"; + this.mnuTreeViewContextCopy.ShortcutKeyDisplayString = "Ctrl+C"; + this.mnuTreeViewContextCopy.Size = new System.Drawing.Size(199, 22); + this.mnuTreeViewContextCopy.Text = "&Copy"; + // + // mnuTreeViewContextRename + // + this.mnuTreeViewContextRename.Name = "mnuTreeViewContextRename"; + this.mnuTreeViewContextRename.ShortcutKeyDisplayString = "F3"; + this.mnuTreeViewContextRename.Size = new System.Drawing.Size(199, 22); + this.mnuTreeViewContextRename.Text = "Rena&me"; + // + // toolStripMenuItem21 + // + this.toolStripMenuItem21.Name = "toolStripMenuItem21"; + this.toolStripMenuItem21.Size = new System.Drawing.Size(196, 6); + // + // newToolStripMenuItem1 + // + this.newToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuTreeViewContextAddNewItem, + this.mnuTreeViewContextAddExistingItem, + this.mnuTreeViewContextAddSep1, + this.mnuTreeViewContextAddNewFolder}); + this.newToolStripMenuItem1.Name = "newToolStripMenuItem1"; + this.newToolStripMenuItem1.Size = new System.Drawing.Size(199, 22); + this.newToolStripMenuItem1.Text = "A&dd"; + // + // mnuTreeViewContextAddNewItem + // + this.mnuTreeViewContextAddNewItem.Image = global::UniversalEditor.Properties.Resources.AddNew; + this.mnuTreeViewContextAddNewItem.Name = "mnuTreeViewContextAddNewItem"; + this.mnuTreeViewContextAddNewItem.Size = new System.Drawing.Size(148, 22); + this.mnuTreeViewContextAddNewItem.Text = "Ne&w Item"; + this.mnuTreeViewContextAddNewItem.Click += new System.EventHandler(this.mnuListViewContextAddNewItem_Click); + // + // mnuTreeViewContextAddExistingItem + // + this.mnuTreeViewContextAddExistingItem.Image = global::UniversalEditor.Properties.Resources.AddExisting; + this.mnuTreeViewContextAddExistingItem.Name = "mnuTreeViewContextAddExistingItem"; + this.mnuTreeViewContextAddExistingItem.Size = new System.Drawing.Size(148, 22); + this.mnuTreeViewContextAddExistingItem.Text = "Existin&g Item..."; + this.mnuTreeViewContextAddExistingItem.Click += new System.EventHandler(this.AddFile_Click); + // + // mnuTreeViewContextAddSep1 + // + this.mnuTreeViewContextAddSep1.Name = "mnuTreeViewContextAddSep1"; + this.mnuTreeViewContextAddSep1.Size = new System.Drawing.Size(145, 6); + // + // mnuTreeViewContextAddNewFolder + // + this.mnuTreeViewContextAddNewFolder.Image = global::UniversalEditor.Properties.Resources.AddNewFolder; + this.mnuTreeViewContextAddNewFolder.Name = "mnuTreeViewContextAddNewFolder"; + this.mnuTreeViewContextAddNewFolder.Size = new System.Drawing.Size(148, 22); + this.mnuTreeViewContextAddNewFolder.Text = "New Fol&der"; + this.mnuTreeViewContextAddNewFolder.Click += new System.EventHandler(this.mnuListViewContextAddNewFolder_Click); + // + // toolStripMenuItem23 + // + this.toolStripMenuItem23.Name = "toolStripMenuItem23"; + this.toolStripMenuItem23.Size = new System.Drawing.Size(196, 6); + // + // mnuTreeViewContextProperties + // + this.mnuTreeViewContextProperties.Name = "mnuTreeViewContextProperties"; + this.mnuTreeViewContextProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuTreeViewContextProperties.Size = new System.Drawing.Size(199, 22); + this.mnuTreeViewContextProperties.Text = "P&roperties..."; + this.mnuTreeViewContextProperties.Click += new System.EventHandler(this.mnuListViewContextProperties_Click); + // + // lv + // + this.lv.AllowDrag = true; + this.lv.AllowDrop = true; + this.lv.AllowSorting = true; + this.lv.BackColor = System.Drawing.SystemColors.Window; + this.lv.ContextMenuStrip = this.mnuListViewContext; + this.lv.DefaultItemHeight = 24; + this.lv.Dock = System.Windows.Forms.DockStyle.Fill; + this.lv.EnableAutomaticInlineRenaming = true; + this.lv.ForeColor = System.Drawing.SystemColors.WindowText; + this.lv.FullRowSelect = true; + this.lv.HideSelection = false; + this.lv.LargeImageList = null; + this.lv.Location = new System.Drawing.Point(0, 20); + this.lv.Mode = AwesomeControls.ListView.ListViewMode.Tiles; + this.lv.MultiSelect = true; + this.lv.Name = "lv"; + this.lv.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lv.Size = new System.Drawing.Size(303, 195); + this.lv.SmallImageList = null; + this.lv.SortColumn = null; + this.lv.TabIndex = 0; + this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate); + this.lv.ItemDrag += new AwesomeControls.ListView.ListViewItemDragEventHandler(this.lv_ItemDrag); + this.lv.ItemDragComplete += new AwesomeControls.ListView.ListViewItemDragEventHandler(this.lv_ItemDragComplete); + this.lv.ItemLabelEdited += new AwesomeControls.ListView.ListViewItemLabelEditedEventHandler(this.lv_ItemLabelEdited); + this.lv.DragDrop += new System.Windows.Forms.DragEventHandler(this.lv_DragDrop); + this.lv.DragOver += new System.Windows.Forms.DragEventHandler(this.lv_DragOver); + this.lv.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lv_KeyDown); + this.lv.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lv_MouseMove); + // + // mnuListViewContext + // + this.mnuListViewContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuListViewContextView, + this.toolStripMenuItem3, + this.sortByToolStripMenuItem, + this.refreshToolStripMenuItem, + this.toolStripMenuItem11, + this.customizeThisfolderToolStripMenuItem, + this.toolStripMenuItem12, + this.pasteToolStripMenuItem, + this.pasteshortcutToolStripMenuItem, + this.undoMoveToolStripMenuItem, + this.toolStripMenuItem13, + this.shareWithToolStripMenuItem, + this.toolStripMenuItem14, + this.mnuListViewContextAdd, + this.toolStripMenuItem15, + this.mnuListViewContextProperties}); + this.mnuListViewContext.Name = "mnuListViewContext"; + this.mnuListViewContext.Size = new System.Drawing.Size(187, 276); + // + // mnuListViewContextView + // + this.mnuListViewContextView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuListViewContextViewExtraLargeIcons, + this.mnuListViewContextViewLargeIcons, + this.mnuListViewContextViewMediumIcons, + this.mnuListViewContextViewSmallIcons, + this.mnuListViewContextViewList, + this.mnuListViewContextViewDetails, + this.mnuListViewContextViewTiles, + this.mnuListViewContextViewContent}); + this.mnuListViewContextView.Name = "mnuListViewContextView"; + this.mnuListViewContextView.Size = new System.Drawing.Size(186, 22); + this.mnuListViewContextView.Text = "&View"; + // + // mnuListViewContextViewExtraLargeIcons + // + this.mnuListViewContextViewExtraLargeIcons.CheckOnClick = true; + this.mnuListViewContextViewExtraLargeIcons.Name = "mnuListViewContextViewExtraLargeIcons"; + this.mnuListViewContextViewExtraLargeIcons.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewExtraLargeIcons.Text = "E&xtra large icons"; + this.mnuListViewContextViewExtraLargeIcons.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewLargeIcons + // + this.mnuListViewContextViewLargeIcons.CheckOnClick = true; + this.mnuListViewContextViewLargeIcons.Name = "mnuListViewContextViewLargeIcons"; + this.mnuListViewContextViewLargeIcons.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewLargeIcons.Text = "La&rge icons"; + this.mnuListViewContextViewLargeIcons.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewMediumIcons + // + this.mnuListViewContextViewMediumIcons.CheckOnClick = true; + this.mnuListViewContextViewMediumIcons.Name = "mnuListViewContextViewMediumIcons"; + this.mnuListViewContextViewMediumIcons.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewMediumIcons.Text = "&Medium icons"; + this.mnuListViewContextViewMediumIcons.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewSmallIcons + // + this.mnuListViewContextViewSmallIcons.CheckOnClick = true; + this.mnuListViewContextViewSmallIcons.Name = "mnuListViewContextViewSmallIcons"; + this.mnuListViewContextViewSmallIcons.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewSmallIcons.Text = "Small ico&ns"; + this.mnuListViewContextViewSmallIcons.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewList + // + this.mnuListViewContextViewList.CheckOnClick = true; + this.mnuListViewContextViewList.Name = "mnuListViewContextViewList"; + this.mnuListViewContextViewList.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewList.Text = "&List"; + this.mnuListViewContextViewList.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewDetails + // + this.mnuListViewContextViewDetails.CheckOnClick = true; + this.mnuListViewContextViewDetails.Name = "mnuListViewContextViewDetails"; + this.mnuListViewContextViewDetails.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewDetails.Text = "&Details"; + this.mnuListViewContextViewDetails.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewTiles + // + this.mnuListViewContextViewTiles.Checked = true; + this.mnuListViewContextViewTiles.CheckOnClick = true; + this.mnuListViewContextViewTiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.mnuListViewContextViewTiles.Name = "mnuListViewContextViewTiles"; + this.mnuListViewContextViewTiles.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewTiles.Text = "Tile&s"; + this.mnuListViewContextViewTiles.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // mnuListViewContextViewContent + // + this.mnuListViewContextViewContent.CheckOnClick = true; + this.mnuListViewContextViewContent.Name = "mnuListViewContextViewContent"; + this.mnuListViewContextViewContent.Size = new System.Drawing.Size(154, 22); + this.mnuListViewContextViewContent.Text = "Conten&t"; + this.mnuListViewContextViewContent.Click += new System.EventHandler(this.mnuListViewContextView_Click); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem4, + this.toolStripMenuItem5, + this.toolStripMenuItem6, + this.toolStripMenuItem7, + this.toolStripSeparator1, + this.toolStripMenuItem8, + this.toolStripMenuItem9, + this.toolStripSeparator2, + this.toolStripMenuItem10}); + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(186, 22); + this.toolStripMenuItem3.Text = "S&ort by"; + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem4.Text = "Name"; + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem5.Text = "Date modified"; + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem6.Text = "Type"; + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem7.Text = "Size"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(137, 6); + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + this.toolStripMenuItem8.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem8.Text = "&Ascending"; + // + // toolStripMenuItem9 + // + this.toolStripMenuItem9.Name = "toolStripMenuItem9"; + this.toolStripMenuItem9.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem9.Text = "&Descending"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(137, 6); + // + // toolStripMenuItem10 + // + this.toolStripMenuItem10.Name = "toolStripMenuItem10"; + this.toolStripMenuItem10.Size = new System.Drawing.Size(140, 22); + this.toolStripMenuItem10.Text = "&More..."; + // + // sortByToolStripMenuItem + // + this.sortByToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.nameToolStripMenuItem, + this.dateModifiedToolStripMenuItem, + this.typeToolStripMenuItem, + this.sizeToolStripMenuItem, + this.noneToolStripMenuItem, + this.toolStripMenuItem1, + this.ascendingToolStripMenuItem, + this.descendingToolStripMenuItem, + this.toolStripMenuItem2, + this.moreToolStripMenuItem}); + this.sortByToolStripMenuItem.Name = "sortByToolStripMenuItem"; + this.sortByToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.sortByToolStripMenuItem.Text = "Grou&p by"; + // + // nameToolStripMenuItem + // + this.nameToolStripMenuItem.Name = "nameToolStripMenuItem"; + this.nameToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.nameToolStripMenuItem.Text = "Name"; + // + // dateModifiedToolStripMenuItem + // + this.dateModifiedToolStripMenuItem.Name = "dateModifiedToolStripMenuItem"; + this.dateModifiedToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.dateModifiedToolStripMenuItem.Text = "Date modified"; + // + // typeToolStripMenuItem + // + this.typeToolStripMenuItem.Name = "typeToolStripMenuItem"; + this.typeToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.typeToolStripMenuItem.Text = "Type"; + // + // sizeToolStripMenuItem + // + this.sizeToolStripMenuItem.Name = "sizeToolStripMenuItem"; + this.sizeToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.sizeToolStripMenuItem.Text = "Size"; + // + // noneToolStripMenuItem + // + this.noneToolStripMenuItem.Name = "noneToolStripMenuItem"; + this.noneToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.noneToolStripMenuItem.Text = "(None)"; + this.noneToolStripMenuItem.Visible = false; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(137, 6); + // + // ascendingToolStripMenuItem + // + this.ascendingToolStripMenuItem.Enabled = false; + this.ascendingToolStripMenuItem.Name = "ascendingToolStripMenuItem"; + this.ascendingToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.ascendingToolStripMenuItem.Text = "&Ascending"; + // + // descendingToolStripMenuItem + // + this.descendingToolStripMenuItem.Enabled = false; + this.descendingToolStripMenuItem.Name = "descendingToolStripMenuItem"; + this.descendingToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.descendingToolStripMenuItem.Text = "&Descending"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(137, 6); + // + // moreToolStripMenuItem + // + this.moreToolStripMenuItem.Name = "moreToolStripMenuItem"; + this.moreToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.moreToolStripMenuItem.Text = "&More..."; + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.refreshToolStripMenuItem.Text = "R&efresh"; + // + // toolStripMenuItem11 + // + this.toolStripMenuItem11.Name = "toolStripMenuItem11"; + this.toolStripMenuItem11.Size = new System.Drawing.Size(183, 6); + // + // customizeThisfolderToolStripMenuItem + // + this.customizeThisfolderToolStripMenuItem.Name = "customizeThisfolderToolStripMenuItem"; + this.customizeThisfolderToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.customizeThisfolderToolStripMenuItem.Text = "Customize this &folder..."; + // + // toolStripMenuItem12 + // + this.toolStripMenuItem12.Name = "toolStripMenuItem12"; + this.toolStripMenuItem12.Size = new System.Drawing.Size(183, 6); + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Enabled = false; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // pasteshortcutToolStripMenuItem + // + this.pasteshortcutToolStripMenuItem.Enabled = false; + this.pasteshortcutToolStripMenuItem.Name = "pasteshortcutToolStripMenuItem"; + this.pasteshortcutToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.pasteshortcutToolStripMenuItem.Text = "Paste &shortcut"; + // + // undoMoveToolStripMenuItem + // + this.undoMoveToolStripMenuItem.Name = "undoMoveToolStripMenuItem"; + this.undoMoveToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.undoMoveToolStripMenuItem.Text = "&Undo"; + // + // toolStripMenuItem13 + // + this.toolStripMenuItem13.Name = "toolStripMenuItem13"; + this.toolStripMenuItem13.Size = new System.Drawing.Size(183, 6); + // + // shareWithToolStripMenuItem + // + this.shareWithToolStripMenuItem.Name = "shareWithToolStripMenuItem"; + this.shareWithToolStripMenuItem.Size = new System.Drawing.Size(186, 22); + this.shareWithToolStripMenuItem.Text = "S&hare with"; + // + // toolStripMenuItem14 + // + this.toolStripMenuItem14.Name = "toolStripMenuItem14"; + this.toolStripMenuItem14.Size = new System.Drawing.Size(183, 6); + // + // mnuListViewContextAdd + // + this.mnuListViewContextAdd.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuListViewContextAddNewItem, + this.mnuListViewContextAddExistingItem, + this.mnuListViewContextAddSep1, + this.mnuListViewContextAddNewFolder}); + this.mnuListViewContextAdd.Name = "mnuListViewContextAdd"; + this.mnuListViewContextAdd.Size = new System.Drawing.Size(186, 22); + this.mnuListViewContextAdd.Text = "A&dd"; + // + // mnuListViewContextAddNewItem + // + this.mnuListViewContextAddNewItem.Image = ((System.Drawing.Image)(resources.GetObject("mnuListViewContextAddNewItem.Image"))); + this.mnuListViewContextAddNewItem.Name = "mnuListViewContextAddNewItem"; + this.mnuListViewContextAddNewItem.Size = new System.Drawing.Size(148, 22); + this.mnuListViewContextAddNewItem.Text = "Ne&w Item"; + this.mnuListViewContextAddNewItem.Click += new System.EventHandler(this.mnuListViewContextAddNewItem_Click); + // + // mnuListViewContextAddExistingItem + // + this.mnuListViewContextAddExistingItem.Image = ((System.Drawing.Image)(resources.GetObject("mnuListViewContextAddExistingItem.Image"))); + this.mnuListViewContextAddExistingItem.Name = "mnuListViewContextAddExistingItem"; + this.mnuListViewContextAddExistingItem.Size = new System.Drawing.Size(148, 22); + this.mnuListViewContextAddExistingItem.Text = "Existin&g Item..."; + this.mnuListViewContextAddExistingItem.Click += new System.EventHandler(this.AddFile_Click); + // + // mnuListViewContextAddSep1 + // + this.mnuListViewContextAddSep1.Name = "mnuListViewContextAddSep1"; + this.mnuListViewContextAddSep1.Size = new System.Drawing.Size(145, 6); + // + // mnuListViewContextAddNewFolder + // + this.mnuListViewContextAddNewFolder.Image = global::UniversalEditor.Properties.Resources.AddNewFolder; + this.mnuListViewContextAddNewFolder.Name = "mnuListViewContextAddNewFolder"; + this.mnuListViewContextAddNewFolder.Size = new System.Drawing.Size(148, 22); + this.mnuListViewContextAddNewFolder.Text = "New Fol&der"; + // + // toolStripMenuItem15 + // + this.toolStripMenuItem15.Name = "toolStripMenuItem15"; + this.toolStripMenuItem15.Size = new System.Drawing.Size(183, 6); + // + // mnuListViewContextProperties + // + this.mnuListViewContextProperties.Name = "mnuListViewContextProperties"; + this.mnuListViewContextProperties.Size = new System.Drawing.Size(186, 22); + this.mnuListViewContextProperties.Text = "P&roperties..."; + this.mnuListViewContextProperties.Click += new System.EventHandler(this.mnuListViewContextProperties_Click); + // + // txtFilter + // + this.txtFilter.Dock = System.Windows.Forms.DockStyle.Top; + this.txtFilter.Location = new System.Drawing.Point(0, 0); + this.txtFilter.Name = "txtFilter"; + this.txtFilter.Size = new System.Drawing.Size(303, 20); + this.txtFilter.TabIndex = 1; + this.txtFilter.TextChanged += new System.EventHandler(this.txtFilter_TextChanged); + // + // cbToolBar1 + // + this.cbToolBar1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.cbToolBar1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbAddFiles, + this.tsbAddFolder, + this.tsbExtract, + this.tsbUndelete}); + this.cbToolBar1.Location = new System.Drawing.Point(0, 0); + this.cbToolBar1.Name = "cbToolBar1"; + this.cbToolBar1.Size = new System.Drawing.Size(499, 84); + this.cbToolBar1.TabIndex = 2; + this.cbToolBar1.Text = "cbToolBar1"; + // + // tsbAddFiles + // + this.tsbAddFiles.Image = ((System.Drawing.Image)(resources.GetObject("tsbAddFiles.Image"))); + this.tsbAddFiles.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.tsbAddFiles.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbAddFiles.Name = "tsbAddFiles"; + this.tsbAddFiles.Padding = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.tsbAddFiles.Size = new System.Drawing.Size(82, 81); + this.tsbAddFiles.Text = "&Add File(s)..."; + this.tsbAddFiles.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.tsbAddFiles.Click += new System.EventHandler(this.AddFile_Click); + // + // tsbAddFolder + // + this.tsbAddFolder.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbAddFolderNew, + this.tsbAddFolderExisting, + this.tsbAddFolderSep1, + this.tsbAddFolderFiles}); + this.tsbAddFolder.Image = ((System.Drawing.Image)(resources.GetObject("tsbAddFolder.Image"))); + this.tsbAddFolder.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.tsbAddFolder.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbAddFolder.Name = "tsbAddFolder"; + this.tsbAddFolder.Padding = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.tsbAddFolder.Size = new System.Drawing.Size(95, 81); + this.tsbAddFolder.Text = "Add Fol&der..."; + this.tsbAddFolder.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.tsbAddFolder.ButtonClick += new System.EventHandler(this.AddExistingFolder_Click); + // + // tsbAddFolderNew + // + this.tsbAddFolderNew.Name = "tsbAddFolderNew"; + this.tsbAddFolderNew.Size = new System.Drawing.Size(313, 22); + this.tsbAddFolderNew.Text = "Add Ne&w Folder"; + this.tsbAddFolderNew.Click += new System.EventHandler(this.AddNewFolder_Click); + // + // tsbAddFolderExisting + // + this.tsbAddFolderExisting.Name = "tsbAddFolderExisting"; + this.tsbAddFolderExisting.Size = new System.Drawing.Size(313, 22); + this.tsbAddFolderExisting.Text = "Add Existin&g Folder..."; + this.tsbAddFolderExisting.Click += new System.EventHandler(this.AddExistingFolder_Click); + // + // tsbAddFolderSep1 + // + this.tsbAddFolderSep1.Name = "tsbAddFolderSep1"; + this.tsbAddFolderSep1.Size = new System.Drawing.Size(310, 6); + // + // tsbAddFolderFiles + // + this.tsbAddFolderFiles.Name = "tsbAddFolderFiles"; + this.tsbAddFolderFiles.Size = new System.Drawing.Size(313, 22); + this.tsbAddFolderFiles.Text = "Add &Files from Existing Folder to Current Folder..."; + this.tsbAddFolderFiles.Click += new System.EventHandler(this.AddExistingFolderToCurrent_Click); + // + // tsbExtract + // + this.tsbExtract.Image = ((System.Drawing.Image)(resources.GetObject("tsbExtract.Image"))); + this.tsbExtract.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.tsbExtract.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbExtract.Name = "tsbExtract"; + this.tsbExtract.Padding = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.tsbExtract.Size = new System.Drawing.Size(76, 81); + this.tsbExtract.Text = "E&xtract..."; + this.tsbExtract.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.tsbExtract.Click += new System.EventHandler(this.tsbExtract_Click); + // + // tsbUndelete + // + this.tsbUndelete.Image = ((System.Drawing.Image)(resources.GetObject("tsbUndelete.Image"))); + this.tsbUndelete.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.tsbUndelete.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbUndelete.Name = "tsbUndelete"; + this.tsbUndelete.Padding = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.tsbUndelete.Size = new System.Drawing.Size(76, 81); + this.tsbUndelete.Text = "&Undelete"; + this.tsbUndelete.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // FileSystemEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.cbToolBar1); + this.Name = "FileSystemEditor"; + this.Size = new System.Drawing.Size(499, 299); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.Panel2.PerformLayout(); + this.splitContainer1.ResumeLayout(false); + this.mnuTreeViewContext.ResumeLayout(false); + this.mnuListViewContext.ResumeLayout(false); + this.cbToolBar1.ResumeLayout(false); + this.cbToolBar1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private AwesomeControls.ListView.ListViewControl lv; + private AwesomeControls.CommandBars.CBContextMenu mnuListViewContext; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextView; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewExtraLargeIcons; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewLargeIcons; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewMediumIcons; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewSmallIcons; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewList; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewDetails; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewTiles; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextViewContent; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem9; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem10; + private System.Windows.Forms.ToolStripMenuItem sortByToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem nameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dateModifiedToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem typeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem noneToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem ascendingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem descendingToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem moreToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11; + private System.Windows.Forms.ToolStripMenuItem customizeThisfolderToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem12; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteshortcutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem undoMoveToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem13; + private System.Windows.Forms.ToolStripMenuItem shareWithToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextProperties; + private AwesomeControls.CommandBars.CBContextMenu mnuTreeViewContext; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextExpand; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem17; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextOpenInNewWindow; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem18; + private System.Windows.Forms.ToolStripMenuItem shareWithToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem19; + private System.Windows.Forms.ToolStripMenuItem restorePreviousversionsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem20; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextCopy; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextRename; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem21; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextAddNewItem; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextAddExistingItem; + private System.Windows.Forms.ToolStripSeparator mnuTreeViewContextAddSep1; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextAddNewFolder; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem23; + private System.Windows.Forms.ToolStripMenuItem mnuTreeViewContextProperties; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextAdd; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextAddNewItem; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextAddExistingItem; + private System.Windows.Forms.ToolStripSeparator mnuListViewContextAddSep1; + private System.Windows.Forms.ToolStripMenuItem mnuListViewContextAddNewFolder; + private AwesomeControls.CommandBars.CBToolBar cbToolBar1; + private System.Windows.Forms.ToolStripButton tsbAddFiles; + private System.Windows.Forms.ToolStripButton tsbExtract; + private System.Windows.Forms.ToolStripButton tsbUndelete; + private System.Windows.Forms.TextBox txtFilter; + private System.Windows.Forms.ToolStripSplitButton tsbAddFolder; + private System.Windows.Forms.ToolStripMenuItem tsbAddFolderNew; + private System.Windows.Forms.ToolStripMenuItem tsbAddFolderExisting; + private System.Windows.Forms.ToolStripSeparator tsbAddFolderSep1; + private System.Windows.Forms.ToolStripMenuItem tsbAddFolderFiles; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.cs new file mode 100644 index 00000000..79b3bd07 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.cs @@ -0,0 +1,1051 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.Dialogs.FileSystem; +using UniversalEditor.ObjectModels.FileSystem; + +namespace UniversalEditor.UserInterface.WindowsForms.Editors +{ + public partial class FileSystemEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.ID = new Guid("{1B5B1E8D-442A-4AC0-8EFD-03AADFF3CAD2}"); + _er.Title = "File system/archive"; + _er.SupportedObjectModels.Add(typeof(FileSystemObjectModel)); + } + return _er; + } + + public FileSystemEditor() + { + InitializeComponent(); + + ImageList large = base.LargeImageList; + ImageList small = base.SmallImageList; + large.PopulateSystemIcons(); + small.PopulateSystemIcons(); + + lv.LargeImageList = base.LargeImageList; + lv.SmallImageList = base.SmallImageList; + tv.ImageList = base.SmallImageList; + + txtFilter.BackColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowBackground; + txtFilter.ForeColor = AwesomeControls.Theming.Theme.CurrentTheme.ColorTable.WindowForeground; + + mnuTreeViewContextExpand.Font = new Font(mnuTreeViewContextExpand.Font, FontStyle.Bold); + + lv.Columns.Add("Name", 300); + lv.Columns.Add("Size", 100); + lv.Columns.Add("Type", 100); + lv.Columns.Add("Date Modified", 200); + lv.Columns.Add("Comment", 200); + + ActionMenuItem mnuFileSystem = MenuBar.Items.Add("mnuFileSystem", "File&system", null, 4); + mnuFileSystem.Items.Add("mnuFileSystemAddFile", "Add &File...", AddFile_Click); + mnuFileSystem.Items.Add("mnuFileSystemAddFolder", "Add Fol&der...", AddExistingFolder_Click); + mnuFileSystem.Items.AddSeparator(); + mnuFileSystem.Items.Add("mnuFileSystemUndelete", "&Undelete"); + mnuFileSystem.Items.AddSeparator(); + mnuFileSystem.Items.Add("mnuFileSystemExtractAll", "E&xtract All...", tsbExtract_Click); + mnuFileSystem.Items.AddSeparator(); + mnuFileSystem.Items.Add("mnuFileSystemComment", "Com&ment...", Comment_Click); + + Toolbar tbFileSystem = Toolbars.Add("tbFileSystem", "Filesystem"); + tbFileSystem.Items.Add(mnuFileSystem.Items["mnuFileSystemAddFile"]); + tbFileSystem.Items.Add(mnuFileSystem.Items["mnuFileSystemAddFolder"]); + tbFileSystem.Items.AddSeparator(); + tbFileSystem.Items.Add(mnuFileSystem.Items["mnuFileSystemUndelete"]); + tbFileSystem.Items.AddSeparator(); + tbFileSystem.Items.Add(mnuFileSystem.Items["mnuFileSystemExtractAll"]); + tbFileSystem.Items.AddSeparator(); + tbFileSystem.Items.Add(mnuFileSystem.Items["mnuFileSystemComment"]); + + mnuTreeViewContextAddNewItem.Image = GetThemeImage("ContextMenu/AddNewItem.png"); + mnuTreeViewContextAddExistingItem.Image = GetThemeImage("ContextMenu/AddExistingItem.png"); + mnuTreeViewContextAddNewFolder.Image = GetThemeImage("ContextMenu/AddNewFolder.png"); + + mnuListViewContextAddNewItem.Image = GetThemeImage("ContextMenu/AddNewItem.png"); + mnuListViewContextAddExistingItem.Image = GetThemeImage("ContextMenu/AddExistingItem.png"); + mnuListViewContextAddNewFolder.Image = GetThemeImage("ContextMenu/AddNewFolder.png"); + } + + private void Comment_Click(object sender, EventArgs e) + { + if (lv.SelectedItems.Count > 0) + { + CommentDialog dlg = new CommentDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + string comment = dlg.txtComment.Text; + foreach (AwesomeControls.ListView.ListViewItem lvi in lv.SelectedItems) + { + File file = (lvi.Data as File); + if (file != null) + { + file.Description = comment; + lvi.Details[3] = new AwesomeControls.ListView.ListViewDetailLabel(file.Description); + } + } + } + } + } + + private string mvarTitle = "File system"; + public override string Title { get { return mvarTitle; } } + + protected override void OnHandleCreated(EventArgs e) + { + base.OnHandleCreated(e); + TemporaryFileManager.RegisterTemporaryDirectory("~u", 8); + } + protected override void OnHandleDestroyed(EventArgs e) + { + base.OnHandleDestroyed(e); + + if (tIconLoader != null && tIconLoader.IsAlive) + { + tIconLoader.Abort(); + } + TemporaryFileManager.UnregisterTemporaryDirectory(); + } + + private const int ICON_LOADER_SKIP_THRESHOLD_SIZE = 8388608; + + private System.Threading.Thread tIconLoader = null; + private void tIconLoader_ThreadStart() + { + try + { + foreach (AwesomeControls.ListView.ListViewItem lvi in lv.Items) + { + File file = (lvi.Data as File); + if (file == null) continue; + + // skip over impossibly huge files of an arbitrary threshold size + if (file.Size > ICON_LOADER_SKIP_THRESHOLD_SIZE) continue; + + byte[] data = file.GetData(); + if (data == null) continue; + + try + { + ObjectModel picture = UniversalEditor.Common.Reflection.GetAvailableObjectModel(data, file.Name, "UniversalEditor.ObjectModels.Multimedia.Picture.PictureObjectModel"); + UniversalEditor.ObjectModels.Multimedia.Picture.PictureObjectModel pic = (picture as UniversalEditor.ObjectModels.Multimedia.Picture.PictureObjectModel); + if (pic != null) + { + // System.Reflection.MethodInfo miToBitmap = picture.GetType().GetMethod("ToBitmap", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + Bitmap bitmap = pic.ToBitmap(); // (miToBitmap.Invoke(picture, null) as Bitmap); + if (bitmap != null) lvi.Image = bitmap; + //lv.Invoke(new Action(InvalidateItem), lvi); + } + } + catch + { + } + } + } + catch + { + // quietly ignore when collection is modified + } + } + + private void InvalidateItem(AwesomeControls.ListView.ListViewItem lvi) + { + lv.Invalidate(lv.GetItemBounds(lvi)); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + if (tIconLoader != null) + { + tIconLoader.Abort(); + } + tIconLoader = new System.Threading.Thread(tIconLoader_ThreadStart); + + lv.Items.Clear(); + tv.Nodes.Clear(); + + TreeNode tnRoot = new TreeNode(); + tnRoot.Text = ""; + tv.Nodes.Add(tnRoot); + + tv.SelectedNode = tnRoot; + tnRoot.EnsureVisible(); + + FileSystemObjectModel fsom = (base.ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + foreach (Folder folder in fsom.Folders) + { + RecursiveLoadFolder(folder, tnRoot); + } + + if (ObjectModel.Accessor != null) + { + FileAccessor file = (ObjectModel.Accessor as FileAccessor); + if (file != null) tv.Nodes[0].Text = System.IO.Path.GetFileName(file.FileName); + } + UpdateListView(); + + tv.EndUpdate(); + } + + private void RecursiveLoadFile(File file, AwesomeControls.ListView.ListViewItem parent) + { + if (!String.IsNullOrEmpty(txtFilter.Text) && !(file.Name.ToLower().Contains(txtFilter.Text.ToLower()) + /* || !file.Name.ToLower().Match(txtFilter.Text.ToLower()) */ + )) return; + + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + UpdateListViewItem(ref lvi, file); + + if (parent != null) + { + parent.Items.Add(lvi); + } + else + { + lv.Items.Add(lvi); + } + } + + private void UpdateListViewItem(ref AwesomeControls.ListView.ListViewItem lvi, File file) + { + lvi.Data = file; + lvi.ImageKey = "generic-file"; + lvi.Text = file.Name; + + string unit = "bytes"; + double size = (double)file.Size; + if (size >= 1024) + { + size /= 1024; + size = Math.Round(size, 2); + unit = "KB"; + + if (size >= 1024) + { + size /= 1024; + size = Math.Round(size, 2); + unit = "MB"; + + if (size >= 1024) + { + size /= 1024; + size = Math.Round(size, 2); + unit = "GB"; + + if (size >= 1024) + { + size /= 1024; + size = Math.Round(size, 2); + unit = "TB"; + } + } + } + } + + lvi.Details.Add(size.ToString() + " " + unit); + lvi.Details.Add("File"); + lvi.Details.Add(file.ModificationTimestamp.ToString()); + + if ((file.Attributes & FileAttributes.Deleted) == FileAttributes.Deleted) + { + lvi.ForeColor = System.Drawing.Color.FromArgb(215, 157, 133); + } + else if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + { + lvi.ForeColor = System.Drawing.Color.FromArgb(155, 155, 155); + } + else if ((file.Attributes & FileAttributes.Encrypted) == FileAttributes.Encrypted) + { + lvi.ForeColor = System.Drawing.Color.FromArgb(57, 135, 214); + } + else if ((file.Attributes & FileAttributes.Compressed) == FileAttributes.Compressed) + { + lvi.ForeColor = System.Drawing.Color.FromArgb(61, 201, 129); + } + else + { + lvi.ForeColor = System.Drawing.Color.Empty; + } + } + + private void RecursiveLoadFolder(Folder folder, TreeNode parent) + { + TreeNode tn = new TreeNode(); + tn.Text = folder.Name; + tn.ImageKey = "generic-folder-closed"; + tn.SelectedImageKey = "generic-folder-closed"; + tn.Tag = folder; + foreach (Folder folder1 in folder.Folders) + { + RecursiveLoadFolder(folder1, tn); + } + if (parent == null) + { + tv.Nodes.Add(tn); + } + else + { + parent.Nodes.Add(tn); + } + } + + private void RecursiveLoadListViewFolder(Folder folder, AwesomeControls.ListView.ListViewItem parent) + { + if (!String.IsNullOrEmpty(txtFilter.Text) && !(folder.Name.ToLower().Contains(txtFilter.Text.ToLower()) + /* || !folder.Name.ToLower().Match(txtFilter.Text.ToLower()) */ + )) return; + + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = folder.Name; + lvi.ImageKey = "generic-folder-closed"; + lvi.Data = folder; + foreach (Folder folder1 in folder.Folders) + { + RecursiveLoadListViewFolder(folder1, lvi); + } + foreach (File file1 in folder.Files) + { + RecursiveLoadFile(file1, lvi); + } + + if (parent != null) + { + parent.Items.Add(lvi); + } + else + { + lv.Items.Add(lvi); + } + + if (lv.Items.Count == 1) + { + lv.SelectedItems.Clear(); + lv.Items[0].Selected = true; + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + mvarCurrentFolder = (tv.SelectedNode.Tag as Folder); + UpdateListView(); + lv.Refresh(); + } + + private Folder mvarCurrentFolder = null; + + private void UpdateListView() + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + lv.BeginUpdate(); + + lv.Items.Clear(); + + if (tIconLoader != null && tIconLoader.ThreadState != System.Threading.ThreadState.Stopped) + { + tIconLoader.Abort(); + tIconLoader = null; + } + tIconLoader = new System.Threading.Thread(tIconLoader_ThreadStart); + + if (mvarCurrentFolder != null) + { + Folder folder = mvarCurrentFolder; + foreach (Folder folder1 in folder.Folders) + { + RecursiveLoadListViewFolder(folder1, null); + } + foreach (File file in folder.Files) + { + RecursiveLoadFile(file, null); + } + } + else + { + foreach (Folder folder1 in fsom.Folders) + { + RecursiveLoadListViewFolder(folder1, null); + } + foreach (File file in fsom.Files) + { + RecursiveLoadFile(file, null); + } + } + lv.EndUpdate(); + + RecursiveUpdateTreeView(); + + if (tIconLoader != null) + { + tIconLoader.Abort(); + tIconLoader = new System.Threading.Thread(tIconLoader_ThreadStart); + } + tIconLoader.Start(); + } + + private void RecursiveUpdateTreeView(TreeNode parent = null) + { + if (parent == null) + { + foreach (TreeNode tn in tv.Nodes) + { + RecursiveUpdateTreeView(tn); + } + } + else + { + if ((parent.Tag == null && mvarCurrentFolder == null) || (parent.Tag == mvarCurrentFolder)) + { + tv.SelectedNode = parent; + } + + foreach (TreeNode tn in parent.Nodes) + { + RecursiveUpdateTreeView(tn); + } + } + } + + private void lv_MouseMove(object sender, MouseEventArgs e) + { + } + + private void mnuListViewContextView_Click(object sender, EventArgs e) + { + #region Reset all the other items + { + foreach (ToolStripMenuItem tsmi in mnuListViewContextView.DropDownItems) + { + if (tsmi != sender) + { + tsmi.Checked = false; + } + } + } + #endregion + + if (mnuListViewContextViewExtraLargeIcons.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.ExtraLargeIcons; + } + else if (mnuListViewContextViewLargeIcons.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.LargeIcons; + } + else if (mnuListViewContextViewMediumIcons.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.MediumIcons; + } + else if (mnuListViewContextViewSmallIcons.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.SmallIcons; + } + else if (mnuListViewContextViewList.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.List; + } + else if (mnuListViewContextViewDetails.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.Details; + } + else if (mnuListViewContextViewTiles.Checked) + { + lv.Mode = AwesomeControls.ListView.ListViewMode.Tiles; + } + } + + private void lv_ItemDrag(object sender, AwesomeControls.ListView.ListViewItemDragEventArgs e) + { + if (tIconLoader != null && tIconLoader.ThreadState != System.Threading.ThreadState.Stopped) + { + tIconLoader.Abort(); + tIconLoader = null; + } + + List filePaths = new List(); + foreach (AwesomeControls.ListView.ListViewItem lvi in lv.SelectedItems) + { + File file = (lvi.Data as File); + if (file != null) + { + if (String.IsNullOrEmpty(file.Name)) + { + file.Name = "[]"; + } + + string filePath = TemporaryFileManager.CreateTemporaryFile(file.Name); + file.WriteTo(new IO.Writer(new FileAccessor(filePath, true, true, true))); + filePaths.Add(filePath); + + file.Properties["tempfile"] = filePath; + } + } + if (filePaths.Count > 0) + { + DataObject dobj = new DataObject("FileDrop", filePaths.ToArray()); + dobj.SetData(typeof(AwesomeControls.ListView.ListViewItem.ListViewItemCollection), lv.SelectedItems); + + e.DataObject = dobj; + + e.Effects = DragDropEffects.Copy; + if ((Control.ModifierKeys & Keys.ShiftKey) == Keys.ShiftKey) + { + e.Effects = DragDropEffects.Move; + } + } + } + + private void lv_ItemDragComplete(object sender, AwesomeControls.ListView.ListViewItemDragEventArgs e) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + + DataObject dobj = (e.DataObject as DataObject); + AwesomeControls.ListView.ListViewItem.ListViewItemCollection items = (AwesomeControls.ListView.ListViewItem.ListViewItemCollection)e.DataObject.GetData(typeof(AwesomeControls.ListView.ListViewItem.ListViewItemCollection)); + foreach (AwesomeControls.ListView.ListViewItem lvi in items) + { + File file = (lvi.Data as File); + Folder folder = (lvi.Data as Folder); + if (file != null) + { + if (!System.IO.File.Exists(file.Properties["tempfile"].ToString())) + { + if (e.Effects == DragDropEffects.Move) + { + // delete the file from the archive + BeginEdit(); + + fsom.Files.Remove(file); + lv.Items.Remove(lvi); + + EndEdit(); + } + } + } + else if (folder != null) + { + // ExtractFolder(folder); + } + } + } + + private void AddFile_Click(object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog(); + ofd.Title = "Add Files to File System"; + ofd.Filter = "All files (*.*)|*.*"; + ofd.Multiselect = true; + if (ofd.ShowDialog() == DialogResult.OK) + { + foreach (string filename in ofd.FileNames) + { + AddFileToArchive(filename); + } + } + } + + private void AddFolderToArchive(string filename = "", Folder parent = null) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + if (parent == null) + { + if (tv.SelectedNode != null) + { + if (tv.SelectedNode.Tag is Folder) parent = (tv.SelectedNode.Tag as Folder); + } + } + + Folder folder = new Folder(); + folder.Name = System.IO.Path.GetFileName(filename); + + if (parent != null) + { + parent.Folders.Add(folder); + } + else + { + fsom.Folders.Add(folder); + } + + if (System.IO.Directory.Exists(filename) /* && copy */) + { + string[] files = System.IO.Directory.GetFiles(filename); + foreach (string file in files) + { + AddFileToArchive(file, folder); + } + string[] dirs = System.IO.Directory.GetDirectories(filename); + foreach (string dir in dirs) + { + AddFolderToArchive(dir, folder); + } + } + + if (tv.SelectedNode == null || (tv.SelectedNode == tv.Nodes[0] && parent == null) || (tv.SelectedNode.Tag is Folder && tv.SelectedNode.Tag == parent)) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = folder.Name; + lvi.ImageKey = "generic-folder-closed"; + lv.Items.Add(lvi); + lv.Refresh(); + } + + TreeNode tn = new TreeNode(); + tn.Text = folder.Name; + tn.ImageKey = "generic-folder-closed"; + tn.SelectedImageKey = "generic-folder-closed"; + tv.SelectedNode.Nodes.Add(tn); + tn.Tag = folder; + tn.EnsureVisible(); + + if (lv.Focused) + { + // lv.BeginEdit(); + } + else if (tv.Focused) + { + tn.BeginEdit(); + } + } + + private class DirectoryComparer + : IComparer + { + public static readonly DirectoryComparer Instance = new DirectoryComparer(); + public int Compare(string a1, string a2) + { + if (a1.Contains(System.IO.Path.DirectorySeparatorChar.ToString()) || a1.Contains(System.IO.Path.AltDirectorySeparatorChar.ToString())) + { + return 1; + } + return a1.CompareTo(a2); + } + } + + private void AddFilesToArchive(params string[] filenames) + { + BeginEdit(); + + List lstFileNames = new List(filenames); + lstFileNames.Sort(DirectoryComparer.Instance); + + foreach (string filename in lstFileNames) + { + AddFileToArchive(filename); + if ((System.Windows.Forms.Control.ModifierKeys & Keys.Shift) == Keys.Shift) + { + System.IO.File.Delete(filename); + } + } + EndEdit(); + } + private void AddFileToArchive(string filename, Folder parent = null) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + if (System.IO.Directory.Exists(filename)) + { + AddFolderToArchive(filename, parent); + return; + } + + BeginEdit(); + + if (parent == null) + { + if (tv.SelectedNode != null) + { + if (tv.SelectedNode.Tag is Folder) parent = (tv.SelectedNode.Tag as Folder); + } + } + + byte[] data = System.IO.File.ReadAllBytes(filename); + string FileTitle = System.IO.Path.GetFileName(filename); + + File file = new File(); + file.Name = FileTitle; + file.SetData(data); + + if (parent != null) + { + parent.Files.Add(file); + } + else + { + fsom.Files.Add(file); + } + + if (tv.SelectedNode == null || (tv.SelectedNode == tv.Nodes[0] && parent == null) || (tv.SelectedNode.Tag is Folder && tv.SelectedNode.Tag == parent)) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.ImageKey = "generic-file"; + lvi.Text = FileTitle; + lvi.Data = file; + lv.Items.Add(lvi); + + if (tIconLoader != null) + { + if (tIconLoader.ThreadState != System.Threading.ThreadState.Unstarted) + { + tIconLoader = new System.Threading.Thread(tIconLoader_ThreadStart); + } + tIconLoader.Start(); + } + + lv.Refresh(); + } + + EndEdit(); + } + + private void lv_DragOver(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(typeof(AwesomeControls.ListView.ListViewItem.ListViewItemCollection)) && ((Control.ModifierKeys & Keys.Control) != Keys.Control)) + { + e.Effect = DragDropEffects.Move; + return; + } + + string[] formats = e.Data.GetFormats(); + System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection(); + sc.AddRange(formats); + + if (sc.Contains("FileDrop") || sc.Contains("FileNameW") || sc.Contains("FileName")) + { + if ((System.Windows.Forms.Control.ModifierKeys & Keys.Shift) == Keys.Shift) + { + e.Effect = DragDropEffects.Move; + } + else + { + e.Effect = DragDropEffects.Copy; + } + } + } + + private void lv_DragDrop(object sender, DragEventArgs e) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + + string[] formats = e.Data.GetFormats(); + + if (e.Data.GetDataPresent(typeof(AwesomeControls.ListView.ListViewItem.ListViewItemCollection))) + { + if (e.Effect == DragDropEffects.Copy) + { + AwesomeControls.ListView.ListViewItem.ListViewItemCollection lvis = (AwesomeControls.ListView.ListViewItem.ListViewItemCollection)e.Data.GetData(typeof(AwesomeControls.ListView.ListViewItem.ListViewItemCollection)); + foreach (AwesomeControls.ListView.ListViewItem lvi in lvis) + { + File file = (lvi.Data as File); + if (file != null) + { + if (fsom.Files.Contains(file.Name)) + { + fsom.Files.Add("Copy of " + file.Name, file.GetData()); + } + } + } + } + return; + } + + System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection(); + sc.AddRange(formats); + + if (sc.Contains("FileDrop")) + { + string[] FileNames = (string[])e.Data.GetData("FileDrop"); + AddFilesToArchive(FileNames); + } + else if (sc.Contains("FileNameW")) + { + string[] FileNames = (string[])e.Data.GetData("FileNameW"); + AddFilesToArchive(FileNames); + } + else if (sc.Contains("FileName")) + { + string[] FileNames = (string[])e.Data.GetData("FileName"); + AddFilesToArchive(FileNames); + } + else if (sc.Contains("Shell IDList Array")) + { + MessageBox.Show("This item cannot be added to archives at this time.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + + private void mnuListViewContextAddNewFolder_Click(object sender, EventArgs e) + { + AddFolderToArchive(); + } + + private void tv_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (tv.SelectedNode == tv.Nodes[0]) + { + e.CancelEdit = true; + return; + } + } + + private void tv_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + Folder folder = (e.Node.Tag as Folder); + if (folder == null) return; + if (e.Label == null) return; + + folder.Name = e.Label; + e.Node.Text = e.Label; + } + + private void tv_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + TreeNode tn = tv.HitTest(e.Location).Node; + if (tn != null) + { + tv.SelectedNode = tn; + } + } + } + + private void mnuListViewContextAddNewItem_Click(object sender, EventArgs e) + { + + } + + private void mnuListViewContextProperties_Click(object sender, EventArgs e) + { + if (lv.SelectedItems.Count == 0) + { + string fileName = String.Empty; + if (ObjectModel != null && ObjectModel.Accessor != null) fileName = ObjectModel.Accessor.GetFileName(); + if (!String.IsNullOrEmpty(fileName) && System.IO.File.Exists(fileName)) + { + File file = new File(); + file.Name = fileName; + file.SetData(System.IO.File.ReadAllBytes(fileName)); + + Dialogs.FileSystem.FilePropertiesDialog dlg = new Dialogs.FileSystem.FilePropertiesDialog(); + dlg.SelectedObjects.Add(file); + + if (dlg.ShowDialog() == DialogResult.OK) + { + + } + } + else + { + MessageBox.Show("Could not get file information for this editor.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + else if (lv.SelectedItems.Count == 1) + { + File file = (lv.SelectedItems[0].Data as File); + if (file != null) + { + Dialogs.FileSystem.FilePropertiesDialog dlg = new Dialogs.FileSystem.FilePropertiesDialog(); + if (ObjectModel.Accessor != null) + { + dlg.ParentFileName = ObjectModel.Accessor.GetFileName(); + } + dlg.SelectedObjects.Add(file); + + if (dlg.ShowDialog() == DialogResult.OK) + { + AwesomeControls.ListView.ListViewItem lvi = lv.SelectedItems[0]; + UpdateListViewItem(ref lvi, file); + lv.Refresh(); + } + } + } + } + + private void tsbExtract_Click(object sender, EventArgs e) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + AwesomeControls.NativeDialogs.FolderBrowserDialog dlg = new AwesomeControls.NativeDialogs.FolderBrowserDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + File[] files = fsom.GetAllFiles(); + HostApplication.CurrentWindow.UpdateProgress(true); + foreach (File file in files) + { + HostApplication.CurrentWindow.UpdateStatus("Extracting file " + file.Name + " (" + (Array.IndexOf(files, file) + 1).ToString() + " of " + files.Length + ")"); + HostApplication.CurrentWindow.UpdateProgress(0, files.Length, Array.IndexOf(files, file)); + Application.DoEvents(); + + string FileName = dlg.SelectedPath + System.IO.Path.DirectorySeparatorChar.ToString() + file.Name; + string ParentDirectoryName = System.IO.Path.GetDirectoryName(FileName); + if (!System.IO.Directory.Exists(ParentDirectoryName)) + { + System.IO.Directory.CreateDirectory(ParentDirectoryName); + } + file.WriteTo(new IO.Writer(new FileAccessor(FileName))); + } + HostApplication.CurrentWindow.UpdateProgress(false); + HostApplication.CurrentWindow.UpdateStatus("Ready"); + + if (MessageBox.Show("All files in the file system have been saved to:\r\n" + dlg.SelectedPath + "\r\n\r\nWould you like to open the folder?", "Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) + { + System.Diagnostics.Process.Start(dlg.SelectedPath); + } + return; + } + } + + private void txtFilter_TextChanged(object sender, EventArgs e) + { + UpdateListView(); + } + + private void lv_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Back) + { + if (mvarCurrentFolder != null) + { + if (mvarCurrentFolder.Parent != null) + { + mvarCurrentFolder = mvarCurrentFolder.Parent; + } + else + { + mvarCurrentFolder = null; + } + } + else + { + System.Media.SystemSounds.Beep.Play(); + } + RecursiveUpdateTreeView(); + UpdateListView(); + } + } + + private void lv_ItemActivate(object sender, EventArgs e) + { + if (lv.SelectedItems.Count == 1) + { + if (lv.SelectedItems[0].Items.Count > 0) + { + if (lv.SelectedItems[0].Data is Folder) + { + mvarCurrentFolder = (lv.SelectedItems[0].Data as Folder); + + RecursiveUpdateTreeView(); + UpdateListView(); + } + } + } + } + + private void AddNewFolder_Click(object sender, EventArgs e) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + if (mvarCurrentFolder == null) + { + fsom.Folders.Add(fsom.GetNewFolderName()); + } + else + { + mvarCurrentFolder.Folders.Add(mvarCurrentFolder.GetNewFolderName()); + } + + RecursiveUpdateTreeView(); + UpdateListView(); + } + + private void AddExistingFolder_Click(object sender, EventArgs e) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + AwesomeControls.NativeDialogs.FolderBrowserDialog dlg = new AwesomeControls.NativeDialogs.FolderBrowserDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + string path = dlg.SelectedPath; + string name = System.IO.Path.GetFileName(path); + + Folder f = new Folder(); + f.Name = name; + + string[] files = System.IO.Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories); + foreach (string file in files) + { + string fileName = file.Substring(path.Length + 1); + f.AddFile(fileName, System.IO.File.ReadAllBytes(file)); + } + + if (mvarCurrentFolder == null) + { + fsom.Folders.Add(f); + } + else + { + mvarCurrentFolder.Folders.Add(f); + } + + RecursiveUpdateTreeView(); + UpdateListView(); + } + } + + private void AddExistingFolderToCurrent_Click(object sender, EventArgs e) + { + FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); + if (fsom == null) return; + + AwesomeControls.NativeDialogs.FolderBrowserDialog dlg = new AwesomeControls.NativeDialogs.FolderBrowserDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + string path = dlg.SelectedPath; + string name = System.IO.Path.GetDirectoryName(path); + + string[] files = System.IO.Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories); + foreach (string file in files) + { + string fileName = file.Substring(path.Length + 1); + if (mvarCurrentFolder == null) + { + fsom.AddFile(fileName, System.IO.File.ReadAllBytes(file)); + } + else + { + mvarCurrentFolder.AddFile(fileName, System.IO.File.ReadAllBytes(file)); + } + } + + RecursiveUpdateTreeView(); + UpdateListView(); + } + } + + private void lv_ItemLabelEdited(object sender, AwesomeControls.ListView.ListViewItemLabelEditedEventArgs e) + { + File file = (e.Item.Data as File); + file.Name = e.Item.Text; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.resx new file mode 100644 index 00000000..af899060 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FileSystemEditor.resx @@ -0,0 +1,426 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 470, 20 + + + 311, 20 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsMAAALDAE/QCLIAAACa0lE + QVQ4T6WTS08TYRiFa8Rf4satAYGNP8DIysSFGzdGLhu3JsaN0cQQEkUuQlulAQkBUQIxhJuAWAXBtoiA + Uiq932npfdrpZR6/KVVCjDGGSd5MZnGe77znfKMBNCcZjePDLSI7rchhLXvj55CD7cScWjyWR4L7b7gm + 6RnANVMD8Ta8xmuQeIxz6jwW4wMGJj5iGDPy/NUS+peLaIfn6Rmao3twhq4X03QOTKGR93WQegqFZVL+ + MfE2iu8eATQIA4rq4q9PfUMjmt3Rs7gWr5AOjlEihhSZxP3uKt65OvKFArl8iXS2SDxdJJooEDzI49uX + 2XUfUN9ws+Ig0Qm5RdKhceFgRazRhRIz8Eyv0NxkJp45FGOuAm0N7kDmCJDwDuKcrqYUvEtg5bqw3lHO + QPL10dJsoqnRRDRZIBwTAH1dGWD3ptmwhQ8dOD/dwbxwGyXSTmjpIo6dXlKOJ/gs90hm8sQqYn9Uxh3K + sefPYvVkWd7wU39ZANSqdCMLKIpCsaQg5xWkXImUJBJJFdiP5wlE83jCMnYh3vVIbDszzK44qfsF6Bma + LQP0FjgtSollSsRTRRhuhWoN3nAORyBLi6kWjfYUFluC1/O2I0D34HQZUKUXdrQQFSdH1NCEWB1HMIvN + m6VKd6YM+GyN0//m25+A33WJvUOVupyBHD98WXZcEpv2jDg9zdr3FN0jX48DCsUSCbVrVRwTXUdkXCK0 + stgtsWWXWK+Il7eTtPWbjwMSaZl1a4jVrSDv1728XXUxaXSUdx2asmKY2KZ3dJOOoS887DNxX7dG7a8Q + 1TutJnrh0o3/nhP9yuoV+AmCty2TH6mvxgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsMAAALDAE/QCLIAAAB4UlE + QVQ4T62TW1MSYRiA6TdZP6LfoZM/pIum6a50EjsYoWQpHTyMnZjGnDAQJVIqQDnLSREE9sDusk/ft5IM + 4535zryzFzvP8552Xa6rCO/Sd+ZWwvhWt5zn7HII79ImnrdBZl5v8GRxnUevvuCeD/DQ94nJ2Q9MeN/z + 4PkaTn0puEzcuDl6JphbCV3gezYYlo1u9OhoFs2ORf3UpHJicHjUJZk/4VzwrwM7AvlRPz1Bm6bNtBvG + b0VoKmcwERe4r5Or6MOCZ2++OR3kx/xCsIjpVLYdWGa9ZVJrCIGAZR4casRStUEHjxfWHYEt2rb6sKL3 + aInKjT5cqnfJV3UOShqJgkYwVhoIpl4EHIElWu+KyqqA22qPRtvkqGlQrhsUal3SAk4WVOJZhY+b2YFA + nkWGextcYm4JN9sWzN+FERfFmk6mrDG+NSLeXyO2r+APpAYCeU8ZEpbZ7Jgcy6UJWGamopEqag4scyfZ + wbP866Lg/Fxi7mr/XNmyzr5Y2p+cym5aYSfVIfy7zeTLn8MCOf+pvLWEG+LWx11yYmkOnFfZS6tE+3Aw + 3uKeZ3tY0FIMookqob0KX6NFPodyrG5knFl9awlm3sWZWtjlvu8Hd55GuD0dHhbIr+oyeRX/4v85/gJp + +H2+ReWqQAAAAABJRU5ErkJggg== + + + + 751, 20 + + + + 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 + rkJggg== + + + + + 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 + +s/0kDuhxngAAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.Designer.cs new file mode 100644 index 00000000..a33bb5d8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.Designer.cs @@ -0,0 +1,62 @@ +namespace UniversalEditor.Editors +{ + partial class FormattedTextEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txt = new System.Windows.Forms.RichTextBox(); + this.SuspendLayout(); + // + // txt + // + this.txt.Dock = System.Windows.Forms.DockStyle.Fill; + this.txt.HideSelection = false; + this.txt.Location = new System.Drawing.Point(0, 0); + this.txt.Name = "txt"; + this.txt.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedBoth; + this.txt.ShowSelectionMargin = true; + this.txt.Size = new System.Drawing.Size(368, 137); + this.txt.TabIndex = 0; + this.txt.Text = ""; + this.txt.SelectionChanged += new System.EventHandler(this.txt_SelectionChanged); + this.txt.TextChanged += new System.EventHandler(this.txt_TextChanged); + // + // FormattedTextEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.txt); + this.Name = "FormattedTextEditor"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.RichTextBox txt; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.cs new file mode 100644 index 00000000..cf66c04e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.DataFormats.Text.Formatted.RichText; +using UniversalEditor.ObjectModels.Text.Formatted; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors +{ + public partial class FormattedTextEditor : Editor + { + public FormattedTextEditor() + { + InitializeComponent(); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Formatted text"; + _er.SupportedObjectModels.Add(typeof(FormattedTextObjectModel)); + } + return _er; + } + + private static RTFDataFormat rtf = new RTFDataFormat(); + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + FormattedTextObjectModel text = (ObjectModel as FormattedTextObjectModel); + + txt.Text = String.Empty; + + if (text == null) return; + + FormattedTextFont fnt = new FormattedTextFont(); + fnt.Family = FormattedTextFontFamily.Roman; + fnt.Name = "Times New Roman"; + text.Fonts.Add(fnt); + + text.DefaultFont = text.Fonts[0]; + + text.Items.Add(new UniversalEditor.ObjectModels.Text.Formatted.Items.FormattedTextItemLiteral("\r\n")); + + StringAccessor sa = new StringAccessor(); + Document.Save(text, rtf, sa); + + string rtftext = sa.ToString(); + txt.Rtf = rtftext; + } + + private void txt_SelectionChanged(object sender, EventArgs e) + { + + } + + private void txt_TextChanged(object sender, EventArgs e) + { + FormattedTextObjectModel text = (ObjectModel as FormattedTextObjectModel); + if (text == null) return; + + this.BeginEdit(); + + StringAccessor sa = new StringAccessor(txt.Rtf); + Document.Load(text, rtf, sa); + + this.EndEdit(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/FormattedTextEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.Designer.cs new file mode 100644 index 00000000..201dab52 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.Designer.cs @@ -0,0 +1,285 @@ +namespace UniversalEditor.Editors +{ + partial class MarkupEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tv = new System.Windows.Forms.TreeView(); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.sc = new System.Windows.Forms.SplitContainer(); + this.pnlTag = new System.Windows.Forms.Panel(); + this.fraValue = new System.Windows.Forms.GroupBox(); + this.txtValue = new System.Windows.Forms.TextBox(); + this.optValueSpecific = new System.Windows.Forms.RadioButton(); + this.optValueEmpty = new System.Windows.Forms.RadioButton(); + this.fraAttributes = new System.Windows.Forms.GroupBox(); + this.lvAttributes = new System.Windows.Forms.ListView(); + this.chAttributeName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chAttributeValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.lblNamespace = new System.Windows.Forms.Label(); + this.lblTagName = new System.Windows.Forms.Label(); + this.txtNamespace = new System.Windows.Forms.TextBox(); + this.txtTagName = new System.Windows.Forms.TextBox(); + this.sc.Panel1.SuspendLayout(); + this.sc.Panel2.SuspendLayout(); + this.sc.SuspendLayout(); + this.pnlTag.SuspendLayout(); + this.fraValue.SuspendLayout(); + this.fraAttributes.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.ImageIndex = 0; + this.tv.ImageList = this.imlSmallIcons; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.SelectedImageIndex = 0; + this.tv.Size = new System.Drawing.Size(203, 354); + this.tv.TabIndex = 1; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // imlSmallIcons + // + this.imlSmallIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlSmallIcons.ImageSize = new System.Drawing.Size(16, 16); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // sc + // + this.sc.Dock = System.Windows.Forms.DockStyle.Fill; + this.sc.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.sc.Location = new System.Drawing.Point(0, 0); + this.sc.Name = "sc"; + // + // sc.Panel1 + // + this.sc.Panel1.Controls.Add(this.tv); + // + // sc.Panel2 + // + this.sc.Panel2.Controls.Add(this.pnlTag); + this.sc.Size = new System.Drawing.Size(508, 354); + this.sc.SplitterDistance = 203; + this.sc.TabIndex = 2; + // + // pnlTag + // + this.pnlTag.Controls.Add(this.fraValue); + this.pnlTag.Controls.Add(this.fraAttributes); + this.pnlTag.Controls.Add(this.lblNamespace); + this.pnlTag.Controls.Add(this.lblTagName); + this.pnlTag.Controls.Add(this.txtNamespace); + this.pnlTag.Controls.Add(this.txtTagName); + this.pnlTag.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlTag.Enabled = false; + this.pnlTag.Location = new System.Drawing.Point(0, 0); + this.pnlTag.Name = "pnlTag"; + this.pnlTag.Size = new System.Drawing.Size(301, 354); + this.pnlTag.TabIndex = 0; + this.pnlTag.Visible = false; + // + // fraValue + // + this.fraValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraValue.Controls.Add(this.txtValue); + this.fraValue.Controls.Add(this.optValueSpecific); + this.fraValue.Controls.Add(this.optValueEmpty); + this.fraValue.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraValue.Location = new System.Drawing.Point(3, 55); + this.fraValue.Name = "fraValue"; + this.fraValue.Size = new System.Drawing.Size(295, 124); + this.fraValue.TabIndex = 3; + this.fraValue.TabStop = false; + this.fraValue.Text = "Value"; + // + // txtValue + // + this.txtValue.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtValue.Location = new System.Drawing.Point(20, 71); + this.txtValue.Multiline = true; + this.txtValue.Name = "txtValue"; + this.txtValue.ReadOnly = true; + this.txtValue.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtValue.Size = new System.Drawing.Size(269, 47); + this.txtValue.TabIndex = 1; + this.txtValue.Validated += new System.EventHandler(this.txtValue_Validated); + // + // optValueSpecific + // + this.optValueSpecific.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optValueSpecific.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optValueSpecific.Location = new System.Drawing.Point(20, 45); + this.optValueSpecific.Name = "optValueSpecific"; + this.optValueSpecific.Size = new System.Drawing.Size(269, 20); + this.optValueSpecific.TabIndex = 0; + this.optValueSpecific.Text = "Specific &value (no children allowed)"; + this.optValueSpecific.UseVisualStyleBackColor = true; + this.optValueSpecific.CheckedChanged += new System.EventHandler(this.optValue_CheckedChanged); + // + // optValueEmpty + // + this.optValueEmpty.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optValueEmpty.Checked = true; + this.optValueEmpty.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optValueEmpty.Location = new System.Drawing.Point(20, 19); + this.optValueEmpty.Name = "optValueEmpty"; + this.optValueEmpty.Size = new System.Drawing.Size(269, 20); + this.optValueEmpty.TabIndex = 0; + this.optValueEmpty.TabStop = true; + this.optValueEmpty.Text = "&Empty/child elements"; + this.optValueEmpty.UseVisualStyleBackColor = true; + this.optValueEmpty.CheckedChanged += new System.EventHandler(this.optValue_CheckedChanged); + // + // fraAttributes + // + this.fraAttributes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraAttributes.Controls.Add(this.lvAttributes); + this.fraAttributes.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraAttributes.Location = new System.Drawing.Point(3, 185); + this.fraAttributes.Name = "fraAttributes"; + this.fraAttributes.Size = new System.Drawing.Size(295, 166); + this.fraAttributes.TabIndex = 2; + this.fraAttributes.TabStop = false; + this.fraAttributes.Text = "Attributes"; + // + // lvAttributes + // + this.lvAttributes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvAttributes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chAttributeName, + this.chAttributeValue}); + this.lvAttributes.FullRowSelect = true; + this.lvAttributes.GridLines = true; + this.lvAttributes.HideSelection = false; + this.lvAttributes.Location = new System.Drawing.Point(6, 19); + this.lvAttributes.Name = "lvAttributes"; + this.lvAttributes.Size = new System.Drawing.Size(283, 141); + this.lvAttributes.SmallImageList = this.imlSmallIcons; + this.lvAttributes.TabIndex = 0; + this.lvAttributes.UseCompatibleStateImageBehavior = false; + this.lvAttributes.View = System.Windows.Forms.View.Details; + // + // chAttributeName + // + this.chAttributeName.Text = "Name"; + this.chAttributeName.Width = 113; + // + // chAttributeValue + // + this.chAttributeValue.Text = "Value"; + this.chAttributeValue.Width = 157; + // + // lblNamespace + // + this.lblNamespace.AutoSize = true; + this.lblNamespace.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblNamespace.Location = new System.Drawing.Point(3, 32); + this.lblNamespace.Name = "lblNamespace"; + this.lblNamespace.Size = new System.Drawing.Size(67, 13); + this.lblNamespace.TabIndex = 1; + this.lblNamespace.Text = "Name&space:"; + // + // lblTagName + // + this.lblTagName.AutoSize = true; + this.lblTagName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTagName.Location = new System.Drawing.Point(3, 6); + this.lblTagName.Name = "lblTagName"; + this.lblTagName.Size = new System.Drawing.Size(58, 13); + this.lblTagName.TabIndex = 1; + this.lblTagName.Text = "Tag &name:"; + // + // txtNamespace + // + this.txtNamespace.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtNamespace.Location = new System.Drawing.Point(76, 29); + this.txtNamespace.Name = "txtNamespace"; + this.txtNamespace.Size = new System.Drawing.Size(222, 20); + this.txtNamespace.TabIndex = 0; + // + // txtTagName + // + this.txtTagName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTagName.Location = new System.Drawing.Point(76, 3); + this.txtTagName.Name = "txtTagName"; + this.txtTagName.Size = new System.Drawing.Size(222, 20); + this.txtTagName.TabIndex = 0; + // + // MarkupEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.sc); + this.Name = "MarkupEditor"; + this.Size = new System.Drawing.Size(508, 354); + this.sc.Panel1.ResumeLayout(false); + this.sc.Panel2.ResumeLayout(false); + this.sc.ResumeLayout(false); + this.pnlTag.ResumeLayout(false); + this.pnlTag.PerformLayout(); + this.fraValue.ResumeLayout(false); + this.fraValue.PerformLayout(); + this.fraAttributes.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.ImageList imlSmallIcons; + private System.Windows.Forms.SplitContainer sc; + private System.Windows.Forms.Panel pnlTag; + private System.Windows.Forms.Label lblNamespace; + private System.Windows.Forms.Label lblTagName; + private System.Windows.Forms.TextBox txtNamespace; + private System.Windows.Forms.TextBox txtTagName; + private System.Windows.Forms.GroupBox fraAttributes; + private System.Windows.Forms.ListView lvAttributes; + private System.Windows.Forms.ColumnHeader chAttributeName; + private System.Windows.Forms.ColumnHeader chAttributeValue; + private System.Windows.Forms.GroupBox fraValue; + private System.Windows.Forms.RadioButton optValueEmpty; + private System.Windows.Forms.RadioButton optValueSpecific; + private System.Windows.Forms.TextBox txtValue; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.cs new file mode 100644 index 00000000..9cc202a6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor.Editors +{ + public partial class MarkupEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(MarkupObjectModel)); + } + return _er; + } + + public MarkupEditor() + { + InitializeComponent(); + + string dirname = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + "Editors", + "Markup", + "Images" + }); + + // don't even try to load if the data directory does not exist (this should be a global + // Editor functionality, not specific to MarkupEditor...) + if (System.IO.Directory.Exists(dirname)) + { + string[] FileNames = System.IO.Directory.GetFiles(dirname); + + foreach (string FileName in FileNames) + { + string FileTitle = System.IO.Path.GetFileNameWithoutExtension(FileName); + Image image = Image.FromFile(FileName); + imlSmallIcons.Images.Add(FileTitle, image); + } + } + + ActionMenuItem mnuMarkup = new ActionMenuItem("mnuMarkup", "&Markup"); + mnuMarkup.Position = 4; + + ActionMenuItem mnuXMLApplyStylesheet = new ActionMenuItem("mnuXMLApplyStylesheet", "Apply &Stylesheet"); + mnuXMLApplyStylesheet.Click += mnuXMLApplyStylesheet_Click; + + mnuMarkup.Items.Add(mnuXMLApplyStylesheet); + + this.MenuBar.Items.Add(mnuMarkup); + } + + private void mnuXMLApplyStylesheet_Click(object sender, EventArgs e) + { + MessageBox.Show("Applying stylesheet", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + MarkupObjectModel mom = (ObjectModel as MarkupObjectModel); + tv.Nodes.Clear(); + if (mom == null) return; + + foreach (MarkupElement el in mom.Elements) + { + RecursiveLoadElement(el); + } + } + + private void RecursiveLoadElement(MarkupElement el, TreeNode parent = null) + { + TreeNode tn = new TreeNode(); + if (el is MarkupPreprocessorElement) + { + tn.ImageKey = "Preprocessor"; + } + else if (el is MarkupTagElement) + { + tn.ImageKey = "Tag"; + } + else if (el is MarkupCommentElement) + { + tn.ImageKey = "Comment"; + } + tn.Text = el.FullName; + tn.SelectedImageKey = tn.ImageKey; + tn.Tag = el; + + if (el is MarkupContainerElement) + { + foreach (MarkupElement el1 in (el as MarkupContainerElement).Elements) + { + RecursiveLoadElement(el1, tn); + } + } + + if (parent != null) + { + parent.Nodes.Add(tn); + } + else + { + tv.Nodes.Add(tn); + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + pnlTag.Enabled = false; + pnlTag.Visible = false; + + if (e.Node == null) return; + + MarkupElement el = (e.Node.Tag as MarkupElement); + if (el == null) return; + + if (el is MarkupTagElement) + { + MarkupTagElement tag = (el as MarkupTagElement); + pnlTag.Enabled = true; + pnlTag.Visible = true; + + txtTagName.Text = tag.Name; + txtNamespace.Text = tag.Namespace; + + if (String.IsNullOrEmpty(tag.Value)) + { + optValueEmpty.Checked = true; + txtValue.Text = String.Empty; + } + else + { + optValueSpecific.Checked = true; + txtValue.Text = tag.Value; + } + + lvAttributes.Items.Clear(); + foreach (MarkupAttribute att in tag.Attributes) + { + ListViewItem lvi = new ListViewItem(); + lvi.ImageKey = "Attribute"; + lvi.Text = att.Name; + lvi.SubItems.Add(att.Value); + + lvAttributes.Items.Add(lvi); + } + } + } + + private void optValue_CheckedChanged(object sender, EventArgs e) + { + txtValue.ReadOnly = !optValueSpecific.Checked; + } + + private void txtValue_Validated(object sender, EventArgs e) + { + BeginEdit(); + EndEdit(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.resx new file mode 100644 index 00000000..c60914f6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/MarkupEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10, 9 + + + 41 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.Designer.cs new file mode 100644 index 00000000..32d65d63 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.Designer.cs @@ -0,0 +1,64 @@ +namespace UniversalEditor.Editors +{ + partial class PlainTextEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txt = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // txt + // + this.txt.BackColor = System.Drawing.SystemColors.Window; + this.txt.Dock = System.Windows.Forms.DockStyle.Fill; + this.txt.HideSelection = false; + this.txt.Location = new System.Drawing.Point(0, 0); + this.txt.Multiline = true; + this.txt.Name = "txt"; + this.txt.SelectionStart = 0; + this.txt.Size = new System.Drawing.Size(533, 322); + this.txt.TabIndex = 0; + this.txt.TextChanged += new System.EventHandler(this.txt_TextChanged); + this.txt.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txt_KeyDown); + // + // PlainTextEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.txt); + this.Name = "PlainTextEditor"; + this.Size = new System.Drawing.Size(533, 322); + this.ResumeLayout(false); + + } + + #endregion + + // private AwesomeControls.TextBox.TextBoxControl txt; + private System.Windows.Forms.TextBox txt; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.cs new file mode 100644 index 00000000..c0d1cdd0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.ObjectModels.Text.Plain; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors +{ + public partial class PlainTextEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(PlainTextObjectModel)); + } + return _er; + } + + public PlainTextEditor() + { + InitializeComponent(); + txt.Font = new System.Drawing.Font(FontFamily.GenericMonospace, 10); + } + + private int mvarSelectionStart = 0; + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + InhibitUndo = true; + + PlainTextObjectModel text = (ObjectModel as PlainTextObjectModel); + txt.Text = text.Text; + + if (mvarSelectionStart >= txt.Text.Length) mvarSelectionStart = txt.Text.Length; + txt.SelectionStart = mvarSelectionStart; + + InhibitUndo = false; + } + protected override void OnObjectModelSaving(CancelEventArgs e) + { + base.OnObjectModelSaving(e); + + PlainTextObjectModel text = (ObjectModel as PlainTextObjectModel); + text.Text = txt.Text; + } + + private void txt_KeyDown(object sender, KeyEventArgs e) + { + char c = (char)e.KeyValue; + if ((c >= '!' && c <= '~') || e.KeyCode == Keys.Back || e.KeyCode == Keys.Return) + { + mvarSelectionStart = txt.SelectionStart; + if (e.KeyCode == Keys.Return || txt.Text == String.Empty) + { + EndEdit(); + BeginEdit("Text", txt.Text); + } + + if (mvarSelectionStart >= txt.Text.Length) mvarSelectionStart = txt.Text.Length; + txt.SelectionStart = mvarSelectionStart; + } + } + + private void txt_TextChanged(object sender, EventArgs e) + { + PlainTextObjectModel text = (ObjectModel as PlainTextObjectModel); + text.Text = txt.Text; + + // notify the object model that it's being edited + OnDocumentEdited(EventArgs.Empty); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PlainTextEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.Designer.cs new file mode 100644 index 00000000..c7684a91 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.Designer.cs @@ -0,0 +1,324 @@ +namespace UniversalEditor.UserInterface.WindowsForms.Editors +{ + partial class PropertyListEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContextTreeView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextTreeViewNew = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewProperty = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.lv = new System.Windows.Forms.ListView(); + this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.mnuContextListView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.invertSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextListViewNew = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewNewGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewNewProperty = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextListViewProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.mnuContextTreeView.SuspendLayout(); + this.mnuContextListView.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.lv); + this.splitContainer1.Size = new System.Drawing.Size(557, 318); + this.splitContainer1.SplitterDistance = 185; + this.splitContainer1.TabIndex = 0; + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContextTreeView; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.LabelEdit = true; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(185, 318); + this.tv.TabIndex = 0; + this.tv.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_BeforeLabelEdit); + this.tv.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_AfterLabelEdit); + this.tv.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterCollapse); + this.tv.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterExpand); + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown); + // + // mnuContextTreeView + // + this.mnuContextTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewNew, + this.mnuContextTreeViewSep1, + this.mnuContextTreeViewProperties}); + this.mnuContextTreeView.Name = "mnuContextTreeView"; + this.mnuContextTreeView.Size = new System.Drawing.Size(194, 54); + // + // mnuContextTreeViewNew + // + this.mnuContextTreeViewNew.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewNewGroup, + this.mnuContextTreeViewNewProperty}); + this.mnuContextTreeViewNew.Name = "mnuContextTreeViewNew"; + this.mnuContextTreeViewNew.Size = new System.Drawing.Size(193, 22); + this.mnuContextTreeViewNew.Text = "Ne&w"; + // + // mnuContextTreeViewNewGroup + // + this.mnuContextTreeViewNewGroup.Name = "mnuContextTreeViewNewGroup"; + this.mnuContextTreeViewNewGroup.ShortcutKeyDisplayString = "Shift+Ins"; + this.mnuContextTreeViewNewGroup.Size = new System.Drawing.Size(161, 22); + this.mnuContextTreeViewNewGroup.Text = "&Group"; + this.mnuContextTreeViewNewGroup.Click += new System.EventHandler(this.mnuContextListViewNewGroup_Click); + // + // mnuContextTreeViewNewProperty + // + this.mnuContextTreeViewNewProperty.Name = "mnuContextTreeViewNewProperty"; + this.mnuContextTreeViewNewProperty.ShortcutKeyDisplayString = "Ins"; + this.mnuContextTreeViewNewProperty.Size = new System.Drawing.Size(161, 22); + this.mnuContextTreeViewNewProperty.Text = "&Property"; + this.mnuContextTreeViewNewProperty.Click += new System.EventHandler(this.mnuContextListViewNewProperty_Click); + // + // mnuContextTreeViewSep1 + // + this.mnuContextTreeViewSep1.Name = "mnuContextTreeViewSep1"; + this.mnuContextTreeViewSep1.Size = new System.Drawing.Size(190, 6); + // + // mnuContextTreeViewProperties + // + this.mnuContextTreeViewProperties.Name = "mnuContextTreeViewProperties"; + this.mnuContextTreeViewProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuContextTreeViewProperties.Size = new System.Drawing.Size(193, 22); + this.mnuContextTreeViewProperties.Text = "P&roperties..."; + // + // lv + // + this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chName, + this.chValue, + this.chType}); + this.lv.ContextMenuStrip = this.mnuContextListView; + this.lv.Dock = System.Windows.Forms.DockStyle.Fill; + this.lv.FullRowSelect = true; + this.lv.GridLines = true; + this.lv.HideSelection = false; + this.lv.Location = new System.Drawing.Point(0, 0); + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(368, 318); + this.lv.TabIndex = 0; + this.lv.UseCompatibleStateImageBehavior = false; + this.lv.View = System.Windows.Forms.View.Details; + this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate); + // + // chName + // + this.chName.Text = "Name"; + this.chName.Width = 160; + // + // chValue + // + this.chValue.Text = "Value"; + this.chValue.Width = 111; + // + // chType + // + this.chType.Text = "Type"; + this.chType.Width = 87; + // + // mnuContextListView + // + this.mnuContextListView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.deleteToolStripMenuItem, + this.mnuContextListViewSep1, + this.selectAllToolStripMenuItem, + this.invertSelectionToolStripMenuItem, + this.mnuContextListViewSep2, + this.mnuContextListViewNew, + this.mnuContextListViewSep3, + this.mnuContextListViewProperties}); + this.mnuContextListView.Name = "mnuContextListView"; + this.mnuContextListView.Size = new System.Drawing.Size(194, 198); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.cutToolStripMenuItem.Text = "Cu&t"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.deleteToolStripMenuItem.Text = "&Delete"; + // + // mnuContextListViewSep1 + // + this.mnuContextListViewSep1.Name = "mnuContextListViewSep1"; + this.mnuContextListViewSep1.Size = new System.Drawing.Size(190, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.selectAllToolStripMenuItem.Text = "Select &All"; + // + // invertSelectionToolStripMenuItem + // + this.invertSelectionToolStripMenuItem.Name = "invertSelectionToolStripMenuItem"; + this.invertSelectionToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.invertSelectionToolStripMenuItem.Text = "&Invert Selection"; + // + // mnuContextListViewSep2 + // + this.mnuContextListViewSep2.Name = "mnuContextListViewSep2"; + this.mnuContextListViewSep2.Size = new System.Drawing.Size(190, 6); + // + // mnuContextListViewNew + // + this.mnuContextListViewNew.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextListViewNewGroup, + this.mnuContextListViewNewProperty}); + this.mnuContextListViewNew.Name = "mnuContextListViewNew"; + this.mnuContextListViewNew.Size = new System.Drawing.Size(193, 22); + this.mnuContextListViewNew.Text = "Ne&w"; + // + // mnuContextListViewNewGroup + // + this.mnuContextListViewNewGroup.Name = "mnuContextListViewNewGroup"; + this.mnuContextListViewNewGroup.ShortcutKeyDisplayString = "Shift+Ins"; + this.mnuContextListViewNewGroup.Size = new System.Drawing.Size(161, 22); + this.mnuContextListViewNewGroup.Text = "&Group"; + this.mnuContextListViewNewGroup.Click += new System.EventHandler(this.mnuContextListViewNewGroup_Click); + // + // mnuContextListViewNewProperty + // + this.mnuContextListViewNewProperty.Name = "mnuContextListViewNewProperty"; + this.mnuContextListViewNewProperty.ShortcutKeyDisplayString = "Ins"; + this.mnuContextListViewNewProperty.Size = new System.Drawing.Size(161, 22); + this.mnuContextListViewNewProperty.Text = "&Property"; + this.mnuContextListViewNewProperty.Click += new System.EventHandler(this.mnuContextListViewNewProperty_Click); + // + // mnuContextListViewSep3 + // + this.mnuContextListViewSep3.Name = "mnuContextListViewSep3"; + this.mnuContextListViewSep3.Size = new System.Drawing.Size(190, 6); + // + // mnuContextListViewProperties + // + this.mnuContextListViewProperties.Name = "mnuContextListViewProperties"; + this.mnuContextListViewProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuContextListViewProperties.Size = new System.Drawing.Size(193, 22); + this.mnuContextListViewProperties.Text = "P&roperties..."; + this.mnuContextListViewProperties.Click += new System.EventHandler(this.mnuContextListViewProperties_Click); + // + // PropertyListEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "PropertyListEditor"; + this.Size = new System.Drawing.Size(557, 318); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.mnuContextTreeView.ResumeLayout(false); + this.mnuContextListView.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.ListView lv; + private System.Windows.Forms.ColumnHeader chName; + private System.Windows.Forms.ColumnHeader chValue; + private System.Windows.Forms.ColumnHeader chType; + private AwesomeControls.CommandBars.CBContextMenu mnuContextTreeView; + private AwesomeControls.CommandBars.CBContextMenu mnuContextListView; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewNew; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewNewGroup; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewNewProperty; + private System.Windows.Forms.ToolStripSeparator mnuContextListViewSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewProperties; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem invertSelectionToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator mnuContextListViewSep2; + private System.Windows.Forms.ToolStripSeparator mnuContextListViewSep3; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNew; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewGroup; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewProperty; + private System.Windows.Forms.ToolStripSeparator mnuContextTreeViewSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewProperties; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.cs new file mode 100644 index 00000000..da2bf49d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.cs @@ -0,0 +1,645 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.UserInterface.WindowsForms.Editors +{ + public partial class PropertyListEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(PropertyListObjectModel)); + } + return _er; + } + + public PropertyListEditor() + { + InitializeComponent(); + + lv.SmallImageList = base.SmallImageList; + lv.LargeImageList = base.LargeImageList; + tv.ImageList = base.SmallImageList; + // IconMethods.PopulateSystemIcons(base.SmallImageList); + // IconMethods.PopulateSystemIcons(base.LargeImageList); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + PropertyListObjectModel plom = (base.ObjectModel as PropertyListObjectModel); + + tv.Nodes.Clear(); + + TreeNode tnRoot = tv.Nodes.Add(""); + foreach (Group group in plom.Groups) + { + RecursiveAddTreeNode(group, tnRoot); + } + + RefreshListView(); + } + + private void RefreshListView() + { + lv.Items.Clear(); + + Property.PropertyCollection coll = null; + if (mvarSelectedGroup == null) + { + PropertyListObjectModel plom = (base.ObjectModel as PropertyListObjectModel); + coll = plom.Properties; + } + else + { + coll = mvarSelectedGroup.Properties; + } + + foreach (Property property in coll) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = property; + lvi.Text = property.Name; + if (property.Value == null) + { + lvi.SubItems.Add(String.Empty); + } + else + { + lvi.SubItems.Add(property.Value.ToString()); + } + + switch (property.Type) + { + case PropertyValueType.Binary: + { + lvi.ImageKey = "binary"; + break; + } + case PropertyValueType.DoubleWord: + { + lvi.ImageKey = "dword"; + break; + } + case PropertyValueType.ExpandedString: + { + lvi.ImageKey = "string-expanded"; + break; + } + case PropertyValueType.Link: + { + lvi.ImageKey = "link"; + break; + } + case PropertyValueType.None: + { + lvi.ImageKey = "none"; + break; + } + case PropertyValueType.QuadWord: + { + lvi.ImageKey = "qword"; + break; + } + case PropertyValueType.String: + { + lvi.ImageKey = "string"; + break; + } + case PropertyValueType.StringList: + { + lvi.ImageKey = "string-list"; + break; + } + case PropertyValueType.Unknown: + { + lvi.ImageKey = "unknown"; + break; + } + } + + lv.Items.Add(lvi); + } + lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + + private Group mvarSelectedGroup = null; + + private void RecursiveAddTreeNode(Group group, TreeNode parent) + { + TreeNode tn = new TreeNode(); + tn.Tag = group; + tn.Text = group.Name; + tn.ImageKey = "generic-folder-closed"; + tn.SelectedImageKey = "generic-folder-closed"; + + foreach (Group group1 in group.Groups) + { + RecursiveAddTreeNode(group1, tn); + } + + if (parent != null) + { + parent.Nodes.Add(tn); + } + else + { + tv.Nodes.Add(tn); + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + mvarSelectedGroup = (e.Node.Tag as Group); + RefreshListView(); + } + } + + private void tv_AfterExpand(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + if (e.Node.ImageKey == "generic-folder-closed") + { + e.Node.ImageKey = "generic-folder-open"; + e.Node.SelectedImageKey = "generic-folder-open"; + } + } + } + + private void tv_AfterCollapse(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + if (e.Node.ImageKey == "generic-folder-open") + { + e.Node.ImageKey = "generic-folder-closed"; + e.Node.SelectedImageKey = "generic-folder-closed"; + } + } + } + + private void lv_ItemActivate(object sender, EventArgs e) + { + if (lv.SelectedItems.Count == 1) + { + ListViewItem lvi = lv.SelectedItems[0]; + Property prop = (lvi.Tag as Property); + if (prop == null) return; + + Dialogs.PropertyList.PropertyDetailsDialog dlg = new Dialogs.PropertyList.PropertyDetailsDialog(); + dlg.txtPropertyName.Text = prop.Name; + if (prop.Value is byte[]) + { + StringBuilder sb = new StringBuilder(); + byte[] array = (byte[])prop.Value; + for (int i = 0; i < array.Length; i++) + { + sb.Append(array[i].ToString("X").PadLeft(2, '0')); + } + dlg.txtPropertyValue.Text = sb.ToString(); + } + else + { + dlg.txtPropertyValue.Text = prop.Value.ToString(); + } + + switch (prop.Type) + { + case PropertyValueType.Binary: + { + dlg.cboPropertyType.SelectedIndex = 2; + break; + } + case PropertyValueType.DoubleWord: + { + dlg.cboPropertyType.SelectedIndex = 3; + break; + } + case PropertyValueType.ExpandedString: + { + dlg.cboPropertyType.SelectedIndex = 4; + break; + } + case PropertyValueType.Link: + { + dlg.cboPropertyType.SelectedIndex = 5; + break; + } + case PropertyValueType.None: + { + dlg.cboPropertyType.SelectedIndex = 7; + break; + } + case PropertyValueType.QuadWord: + { + dlg.cboPropertyType.SelectedIndex = 8; + break; + } + case PropertyValueType.String: + { + dlg.cboPropertyType.SelectedIndex = 1; + break; + } + case PropertyValueType.StringList: + { + dlg.cboPropertyType.SelectedIndex = 6; + break; + } + case PropertyValueType.Unknown: + { + dlg.cboPropertyType.SelectedIndex = 9; + break; + } + } + if (dlg.ShowDialog() == DialogResult.OK) + { + lvi.Text = dlg.txtPropertyName.Text; + + prop.Name = dlg.txtPropertyName.Text; + if (dlg.cboPropertyType.SelectedIndex == 0) + { + // auto-detect + int dummy32 = 0; + long dummy64 = 0; + string value = dlg.txtPropertyValue.Text; + if (Int32.TryParse(value, out dummy32)) + { + prop.Value = dummy32; + prop.Type = PropertyValueType.DoubleWord; + } + else if (Int64.TryParse(value, out dummy64)) + { + prop.Value = dummy64; + prop.Type = PropertyValueType.QuadWord; + } + else + { + prop.Value = dlg.txtPropertyValue.Text; + prop.Type = PropertyValueType.String; + } + } + else + { + switch (dlg.cboPropertyType.SelectedIndex) + { + case 1: // String + { + prop.Value = dlg.txtPropertyValue.Text; + prop.Type = PropertyValueType.String; + lvi.ImageKey = "string"; + break; + } + case 4: // Expanded String + { + prop.Value = dlg.txtPropertyValue.Text; + prop.Type = PropertyValueType.ExpandedString; + lvi.SubItems[1].Text = Environment.ExpandEnvironmentVariables(dlg.txtPropertyValue.Text); + lvi.ImageKey = "string-expanded"; + break; + } + case 2: // Binary + { + List data = new List(); + for (int i = 0; i < dlg.txtPropertyValue.Text.Length; i += 2) + { + try + { + byte next = Byte.Parse(dlg.txtPropertyValue.Text.Substring(i, 2), System.Globalization.NumberStyles.HexNumber); + data.Add(next); + } + catch (Exception) + { + + } + } + prop.Value = data.ToArray(); + prop.Type = PropertyValueType.Binary; + lvi.ImageKey = "binary"; + break; + } + case 3: // DWORD + { + prop.Value = Int32.Parse(dlg.txtPropertyValue.Text); + prop.Type = PropertyValueType.DoubleWord; + lvi.ImageKey = "dword"; + break; + } + case 8: // QWORD + { + prop.Value = Int64.Parse(dlg.txtPropertyValue.Text); + prop.Type = PropertyValueType.QuadWord; + lvi.ImageKey = "qword"; + break; + } + case 6: // String List + { + prop.Value = dlg.txtPropertyValue.Text.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.None); + prop.Type = PropertyValueType.StringList; + lvi.ImageKey = "string-list"; + break; + } + case 7: // None + { + prop.Value = null; + prop.Type = PropertyValueType.None; + lvi.ImageKey = "none"; + break; + } + case 9: // Unknown + { + prop.Value = null; + prop.Type = PropertyValueType.Unknown; + lvi.ImageKey = "unknown"; + break; + } + } + } + if (dlg.cboPropertyType.SelectedIndex != 4) + { + lvi.SubItems[1].Text = dlg.txtPropertyValue.Text; + } + } + } + } + + + private void mnuContextListViewNewGroup_Click(object sender, EventArgs e) + { + PropertyListObjectModel plom = (base.ObjectModel as PropertyListObjectModel); + if (plom == null) return; + + Group grp = new Group(); + + + Group parent = (tv.SelectedNode == null ? null : (tv.SelectedNode.Tag as Group)); + if (parent != null) + { + parent.Groups.Add(grp); + + TreeNode tn = new TreeNode(); + tn.Tag = grp; + tv.SelectedNode.Nodes.Add(tn); + tn.EnsureVisible(); + tn.BeginEdit(); + } + else + { + plom.Groups.Add(grp); + + TreeNode tn = new TreeNode(); + tn.Tag = grp; + tv.Nodes[0].Nodes.Add(tn); + tn.EnsureVisible(); + tn.BeginEdit(); + } + } + private void mnuContextListViewNewProperty_Click(object sender, EventArgs e) + { + PropertyListObjectModel plom = (base.ObjectModel as PropertyListObjectModel); + if (plom == null) return; + + Dialogs.PropertyList.PropertyDetailsDialog dlg = new Dialogs.PropertyList.PropertyDetailsDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + Property prop = new Property(); + prop.Name = dlg.txtPropertyName.Text; + + if (dlg.cboPropertyType.SelectedIndex == 0) + { + // auto-detect + int dummy32 = 0; + long dummy64 = 0; + string value = dlg.txtPropertyValue.Text; + if (Int32.TryParse(value, out dummy32)) + { + prop.Value = dummy32; + prop.Type = PropertyValueType.DoubleWord; + } + else if (Int64.TryParse(value, out dummy64)) + { + prop.Value = dummy64; + prop.Type = PropertyValueType.QuadWord; + } + else + { + prop.Value = dlg.txtPropertyValue.Text; + prop.Type = PropertyValueType.String; + } + } + else + { + switch (dlg.cboPropertyType.SelectedIndex) + { + case 1: // String + { + prop.Value = dlg.txtPropertyValue.Text; + prop.Type = PropertyValueType.String; + break; + } + case 4: // Expanded String + { + prop.Value = dlg.txtPropertyValue.Text; + prop.Type = PropertyValueType.ExpandedString; + break; + } + case 2: // Binary + { + List data = new List(); + for (int i = 0; i < dlg.txtPropertyValue.Text.Length; i += 2) + { + try + { + byte next = Byte.Parse(dlg.txtPropertyValue.Text.Substring(i, 2), System.Globalization.NumberStyles.HexNumber); + data.Add(next); + } + catch (Exception) + { + + } + } + prop.Value = data.ToArray(); + prop.Type = PropertyValueType.Binary; + break; + } + case 3: // DWORD + { + prop.Value = Int32.Parse(dlg.txtPropertyValue.Text); + prop.Type = PropertyValueType.DoubleWord; + break; + } + case 8: // QWORD + { + prop.Value = Int64.Parse(dlg.txtPropertyValue.Text); + prop.Type = PropertyValueType.QuadWord; + break; + } + case 6: // String List + { + prop.Value = dlg.txtPropertyValue.Text.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.None); + prop.Type = PropertyValueType.StringList; + break; + } + case 7: // None + { + prop.Value = null; + prop.Type = PropertyValueType.None; + break; + } + case 9: // Unknown + { + prop.Value = null; + prop.Type = PropertyValueType.Unknown; + break; + } + } + } + + Group group = null; + if (tv.SelectedNode != null) + { + group = (tv.SelectedNode.Tag as Group); + } + + if (group != null) + { + group.Properties.Add(prop); + } + else + { + plom.Properties.Add(prop); + } + + ListViewItem lvi = new ListViewItem(); + lvi.Text = prop.Name; + lvi.Tag = prop; + if (prop.Type == PropertyValueType.ExpandedString) + { + lvi.SubItems.Add(Environment.ExpandEnvironmentVariables(prop.Value.ToString())); + } + else + { + lvi.SubItems.Add(prop.Value.ToString()); + } + + switch (prop.Type) + { + case PropertyValueType.Binary: + { + lvi.ImageKey = "binary"; + break; + } + case PropertyValueType.DoubleWord: + { + lvi.ImageKey = "dword"; + break; + } + case PropertyValueType.ExpandedString: + { + lvi.ImageKey = "string-expanded"; + break; + } + case PropertyValueType.Link: + { + lvi.ImageKey = "link"; + break; + } + case PropertyValueType.None: + { + lvi.ImageKey = "none"; + break; + } + case PropertyValueType.QuadWord: + { + lvi.ImageKey = "qword"; + break; + } + case PropertyValueType.String: + { + lvi.ImageKey = "string"; + break; + } + case PropertyValueType.StringList: + { + lvi.ImageKey = "string-list"; + break; + } + case PropertyValueType.Unknown: + { + lvi.ImageKey = "unknown"; + break; + } + } + lv.Items.Add(lvi); + } + } + + private void mnuContextListViewProperties_Click(object sender, EventArgs e) + { + lv_ItemActivate(sender, e); + } + + public override void Delete() + { + base.Delete(); + } + + private void tv_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node == null) return; + Group g = (e.Node.Tag as Group); + if (!String.IsNullOrEmpty(e.Label)) + { + BeginEdit(); + + g.Name = e.Label; + e.Node.Text = e.Label; + + EndEdit(); + } + else if (e.Label == null && String.IsNullOrEmpty(g.Name)) + { + if (g.Parent == null) + { + (ObjectModel as PropertyListObjectModel).Groups.Remove(g); + } + else + { + g.Parent.Groups.Remove(g); + } + e.Node.Remove(); + } + else + { + e.Node.Text = g.Name; + } + } + + private void tv_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node == null) return; + if (e.Node == tv.Nodes[0]) e.CancelEdit = true; + } + + private void tv_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + TreeNode tn = tv.HitTest(e.Location).Node; + if (tn != null) tv.SelectedNode = tn; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.resx new file mode 100644 index 00000000..44d7b654 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/PropertyListEditor.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 247, 7 + + + 405, 7 + + + 31 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs new file mode 100644 index 00000000..1a2b95f7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.Designer.cs @@ -0,0 +1,356 @@ +namespace UniversalEditor.Editors +{ + partial class ShortcutEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.cboTargetType = new System.Windows.Forms.ComboBox(); + this.txtTarget = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.cmdBrowseTarget = new System.Windows.Forms.Button(); + this.txtStartIn = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtShortcutKey = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.cboWindowSize = new System.Windows.Forms.ComboBox(); + this.txtComment = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.fraShortcutInformation = new System.Windows.Forms.GroupBox(); + this.fraAdvancedOptions = new System.Windows.Forms.GroupBox(); + this.chkRunInSeparateMemorySpace = new System.Windows.Forms.CheckBox(); + this.chkRunWithDifferentCredentials = new System.Windows.Forms.CheckBox(); + this.fraIcon = new System.Windows.Forms.GroupBox(); + this.lvIcons = new System.Windows.Forms.ListView(); + this.txtIconFileName = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.label7 = new System.Windows.Forms.Label(); + this.fraShortcutInformation.SuspendLayout(); + this.fraAdvancedOptions.SuspendLayout(); + this.fraIcon.SuspendLayout(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(18, 25); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(64, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Target type:"; + // + // cboTargetType + // + this.cboTargetType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboTargetType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboTargetType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboTargetType.FormattingEnabled = true; + this.cboTargetType.Items.AddRange(new object[] { + "Local file/directory", + "Shell namespace extension"}); + this.cboTargetType.Location = new System.Drawing.Point(94, 22); + this.cboTargetType.Name = "cboTargetType"; + this.cboTargetType.Size = new System.Drawing.Size(383, 21); + this.cboTargetType.TabIndex = 1; + this.cboTargetType.SelectedIndexChanged += new System.EventHandler(this.cboTargetType_SelectedIndexChanged); + // + // txtTarget + // + this.txtTarget.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTarget.Location = new System.Drawing.Point(94, 49); + this.txtTarget.Name = "txtTarget"; + this.txtTarget.Size = new System.Drawing.Size(383, 20); + this.txtTarget.TabIndex = 2; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(18, 52); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(41, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Target:"; + // + // cmdBrowseTarget + // + this.cmdBrowseTarget.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowseTarget.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowseTarget.Location = new System.Drawing.Point(402, 75); + this.cmdBrowseTarget.Name = "cmdBrowseTarget"; + this.cmdBrowseTarget.Size = new System.Drawing.Size(75, 23); + this.cmdBrowseTarget.TabIndex = 4; + this.cmdBrowseTarget.Text = "&Browse..."; + this.cmdBrowseTarget.UseVisualStyleBackColor = true; + this.cmdBrowseTarget.Click += new System.EventHandler(this.cmdBrowseTarget_Click); + // + // txtStartIn + // + this.txtStartIn.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtStartIn.Location = new System.Drawing.Point(94, 104); + this.txtStartIn.Name = "txtStartIn"; + this.txtStartIn.Size = new System.Drawing.Size(383, 20); + this.txtStartIn.TabIndex = 2; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(18, 107); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(43, 13); + this.label3.TabIndex = 3; + this.label3.Text = "Start in:"; + // + // txtShortcutKey + // + this.txtShortcutKey.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtShortcutKey.Location = new System.Drawing.Point(94, 130); + this.txtShortcutKey.Name = "txtShortcutKey"; + this.txtShortcutKey.Size = new System.Drawing.Size(383, 20); + this.txtShortcutKey.TabIndex = 2; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(18, 133); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(70, 13); + this.label4.TabIndex = 3; + this.label4.Text = "Shortcut key:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(18, 159); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(70, 13); + this.label5.TabIndex = 0; + this.label5.Text = "Window size:"; + // + // cboWindowSize + // + this.cboWindowSize.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboWindowSize.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboWindowSize.FormattingEnabled = true; + this.cboWindowSize.Location = new System.Drawing.Point(94, 156); + this.cboWindowSize.Name = "cboWindowSize"; + this.cboWindowSize.Size = new System.Drawing.Size(383, 21); + this.cboWindowSize.TabIndex = 1; + // + // txtComment + // + this.txtComment.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtComment.Location = new System.Drawing.Point(94, 183); + this.txtComment.Name = "txtComment"; + this.txtComment.Size = new System.Drawing.Size(383, 20); + this.txtComment.TabIndex = 2; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(18, 186); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(54, 13); + this.label6.TabIndex = 3; + this.label6.Text = "Comment:"; + // + // fraShortcutInformation + // + this.fraShortcutInformation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraShortcutInformation.Controls.Add(this.label1); + this.fraShortcutInformation.Controls.Add(this.cmdBrowseTarget); + this.fraShortcutInformation.Controls.Add(this.cboTargetType); + this.fraShortcutInformation.Controls.Add(this.label4); + this.fraShortcutInformation.Controls.Add(this.label5); + this.fraShortcutInformation.Controls.Add(this.label3); + this.fraShortcutInformation.Controls.Add(this.cboWindowSize); + this.fraShortcutInformation.Controls.Add(this.label6); + this.fraShortcutInformation.Controls.Add(this.txtTarget); + this.fraShortcutInformation.Controls.Add(this.label2); + this.fraShortcutInformation.Controls.Add(this.txtComment); + this.fraShortcutInformation.Controls.Add(this.txtShortcutKey); + this.fraShortcutInformation.Controls.Add(this.txtStartIn); + this.fraShortcutInformation.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraShortcutInformation.Location = new System.Drawing.Point(3, 3); + this.fraShortcutInformation.Name = "fraShortcutInformation"; + this.fraShortcutInformation.Size = new System.Drawing.Size(483, 224); + this.fraShortcutInformation.TabIndex = 5; + this.fraShortcutInformation.TabStop = false; + this.fraShortcutInformation.Text = "Shortcut information"; + // + // fraAdvancedOptions + // + this.fraAdvancedOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraAdvancedOptions.Controls.Add(this.chkRunInSeparateMemorySpace); + this.fraAdvancedOptions.Controls.Add(this.chkRunWithDifferentCredentials); + this.fraAdvancedOptions.Location = new System.Drawing.Point(3, 233); + this.fraAdvancedOptions.Name = "fraAdvancedOptions"; + this.fraAdvancedOptions.Size = new System.Drawing.Size(483, 43); + this.fraAdvancedOptions.TabIndex = 6; + this.fraAdvancedOptions.TabStop = false; + this.fraAdvancedOptions.Text = "Advanced options"; + // + // chkRunInSeparateMemorySpace + // + this.chkRunInSeparateMemorySpace.AutoSize = true; + this.chkRunInSeparateMemorySpace.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkRunInSeparateMemorySpace.Location = new System.Drawing.Point(196, 19); + this.chkRunInSeparateMemorySpace.Name = "chkRunInSeparateMemorySpace"; + this.chkRunInSeparateMemorySpace.Size = new System.Drawing.Size(178, 18); + this.chkRunInSeparateMemorySpace.TabIndex = 0; + this.chkRunInSeparateMemorySpace.Text = "Run in separate memory space"; + this.chkRunInSeparateMemorySpace.UseVisualStyleBackColor = true; + // + // chkRunWithDifferentCredentials + // + this.chkRunWithDifferentCredentials.AutoSize = true; + this.chkRunWithDifferentCredentials.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkRunWithDifferentCredentials.Location = new System.Drawing.Point(21, 19); + this.chkRunWithDifferentCredentials.Name = "chkRunWithDifferentCredentials"; + this.chkRunWithDifferentCredentials.Size = new System.Drawing.Size(169, 18); + this.chkRunWithDifferentCredentials.TabIndex = 0; + this.chkRunWithDifferentCredentials.Text = "Run with different credentials"; + this.chkRunWithDifferentCredentials.UseVisualStyleBackColor = true; + // + // fraIcon + // + this.fraIcon.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraIcon.Controls.Add(this.lvIcons); + this.fraIcon.Controls.Add(this.txtIconFileName); + this.fraIcon.Controls.Add(this.button1); + this.fraIcon.Controls.Add(this.label7); + this.fraIcon.Location = new System.Drawing.Point(3, 282); + this.fraIcon.Name = "fraIcon"; + this.fraIcon.Size = new System.Drawing.Size(483, 114); + this.fraIcon.TabIndex = 7; + this.fraIcon.TabStop = false; + this.fraIcon.Text = "Icon"; + // + // lvIcons + // + this.lvIcons.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvIcons.Location = new System.Drawing.Point(94, 47); + this.lvIcons.Name = "lvIcons"; + this.lvIcons.Size = new System.Drawing.Size(383, 61); + this.lvIcons.TabIndex = 5; + this.lvIcons.UseCompatibleStateImageBehavior = false; + // + // txtIconFileName + // + this.txtIconFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtIconFileName.Location = new System.Drawing.Point(94, 21); + this.txtIconFileName.Name = "txtIconFileName"; + this.txtIconFileName.ReadOnly = true; + this.txtIconFileName.Size = new System.Drawing.Size(302, 20); + this.txtIconFileName.TabIndex = 0; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(402, 19); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 4; + this.button1.Text = "&Browse..."; + this.button1.UseVisualStyleBackColor = true; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(18, 24); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(55, 13); + this.label7.TabIndex = 3; + this.label7.Text = "File name:"; + // + // WindowsShortcutEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraIcon); + this.Controls.Add(this.fraAdvancedOptions); + this.Controls.Add(this.fraShortcutInformation); + this.Name = "WindowsShortcutEditor"; + this.Size = new System.Drawing.Size(489, 399); + this.fraShortcutInformation.ResumeLayout(false); + this.fraShortcutInformation.PerformLayout(); + this.fraAdvancedOptions.ResumeLayout(false); + this.fraAdvancedOptions.PerformLayout(); + this.fraIcon.ResumeLayout(false); + this.fraIcon.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cboTargetType; + private System.Windows.Forms.TextBox txtTarget; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button cmdBrowseTarget; + private System.Windows.Forms.TextBox txtStartIn; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtShortcutKey; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox cboWindowSize; + private System.Windows.Forms.TextBox txtComment; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.GroupBox fraShortcutInformation; + private System.Windows.Forms.GroupBox fraAdvancedOptions; + private System.Windows.Forms.CheckBox chkRunWithDifferentCredentials; + private System.Windows.Forms.CheckBox chkRunInSeparateMemorySpace; + private System.Windows.Forms.GroupBox fraIcon; + private System.Windows.Forms.ListView lvIcons; + private System.Windows.Forms.TextBox txtIconFileName; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label7; + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs new file mode 100644 index 00000000..5036884d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Shortcut; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors +{ + public partial class ShortcutEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(ShortcutObjectModel)); + } + return _er; + } + + public ShortcutEditor() + { + InitializeComponent(); + cboTargetType.SelectedIndex = 0; + } + + private void cboTargetType_SelectedIndexChanged(object sender, EventArgs e) + { + txtTarget.ReadOnly = (cboTargetType.SelectedIndex == 1); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + ShortcutObjectModel doc = (base.ObjectModel as ShortcutObjectModel); + if (doc == null) return; + + /* + if (doc.Type == ShortcutType.Normal) + { + cboTargetType.SelectedIndex = 0; + } + else + { + cboTargetType.SelectedIndex = 1; + switch (doc.Type) + { + case ShortcutType.Computer: + txtTarget.Text = "My Computer"; + break; + case ShortcutType.Documents: + txtTarget.Text = "My Documents"; + break; + case ShortcutType.Network: + txtTarget.Text = "My Network Places"; + break; + case ShortcutType.Trash: + txtTarget.Text = "Recycle Bin"; + break; + case ShortcutType.Unknown: + txtTarget.Text = Common.Methods.ArrayToString(doc.ShellTarget); + break; + case ShortcutType.Normal: + txtTarget.Text = doc.Target; + break; + } + } + */ + + if (doc.IconFileName != "") + { + txtIconFileName.Text = doc.IconFileName; + + // Read the icons from the file, through Resource Viewer + } + } + + private void cmdBrowseTarget_Click(object sender, EventArgs e) + { + switch (cboTargetType.SelectedIndex) + { + case 0: + break; + case 1: + break; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Editors/ShortcutEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ExtensionMethods.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ExtensionMethods.cs new file mode 100644 index 00000000..98a129d7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ExtensionMethods.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public static class ExtensionMethods + { + public static bool CompareTo(this CommandShortcutKey value, System.Windows.Forms.Keys keyData) + { + // first look at modifier keys + if (!(((value.Modifiers & CommandShortcutKeyModifiers.Alt) == CommandShortcutKeyModifiers.Alt) + && ((keyData & System.Windows.Forms.Keys.Alt) == System.Windows.Forms.Keys.Alt))) return false; + + return true; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/FakesAssemblies/UniversalEditor.Plugins.Multimedia.Fakes.dll b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/FakesAssemblies/UniversalEditor.Plugins.Multimedia.Fakes.dll new file mode 100644 index 0000000000000000000000000000000000000000..07e686a05cc987b13cb00fbb7b43e79683fbc001 GIT binary patch literal 512000 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 type of ExtensibleDataStorage.Media.SPC700.SPC700ExtendedID666Tag + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SPC700ExtendedID666Tag.SPC700ExtendedID666Tag() + + + Sets the shim of SPC700ExtendedID666Tag.get_Enabled() + + + Sets the shim of SPC700ExtendedID666Tag.set_Enabled(Boolean value) + + + Define shims for all instances members + + + Sets the shim of SPC700ExtendedID666Tag.get_Enabled() + + + Sets the shim of SPC700ExtendedID666Tag.set_Enabled(Boolean value) + + + Stub type of ExtensibleDataStorage.Media.SPC700.SPC700ExtendedID666Tag + + + Initializes a new instance + + + Initializes a new instance of type StubSPC700ExtendedID666Tag + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Contains custom delegates used for the stubs and shims of UniversalEditor.Plugins.Multimedia + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Project.LMMS.LMMSCompressedDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of LMMSCompressedDataFormat.LMMSCompressedDataFormat() + + + Sets the shim of LMMSCompressedDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of LMMSCompressedDataFormat.MakeReference() + + + Sets the shim of LMMSCompressedDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of LMMSCompressedDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of LMMSCompressedDataFormat.MakeReference() + + + Sets the shim of LMMSCompressedDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Project.LMMS.LMMSProjectDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of LMMSProjectDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of LMMSProjectDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of LMMSProjectDataFormat.LMMSProjectDataFormat() + + + Sets the shim of LMMSProjectDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of LMMSProjectDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of LMMSProjectDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of LMMSProjectDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Project.LMMS.LMMSCompressedDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubLMMSCompressedDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of LMMSCompressedDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of LMMSCompressedDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of LMMSCompressedDataFormat.MakeReference() + + + Sets the stub of LMMSCompressedDataFormat.MakeReference() + + + Sets the stub of LMMSCompressedDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of LMMSCompressedDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Project.LMMS.LMMSProjectDataFormat + + + Initializes a new instance + + + Sets the stub of LMMSProjectDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of LMMSProjectDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of LMMSProjectDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of LMMSProjectDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubLMMSProjectDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of LMMSProjectDataFormat.MakeReference() + + + Sets the stub of LMMSProjectDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI.MIDICommand + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MIDICommand.get_Channel() + + + Sets the shim of MIDICommand.set_Channel(Byte value) + + + Sets the shim of MIDICommand.get_Command() + + + Sets the shim of MIDICommand.set_Command(Byte value) + + + Sets the shim of MIDICommand.get_CommandType() + + + Sets the shim of MIDICommand.set_CommandType(MIDICommandType value) + + + Sets the shim of MIDICommand.MIDICommand() + + + Define shims for all instances members + + + Sets the shim of MIDICommand.get_Channel() + + + Sets the shim of MIDICommand.set_Channel(Byte value) + + + Sets the shim of MIDICommand.get_Command() + + + Sets the shim of MIDICommand.set_Command(Byte value) + + + Sets the shim of MIDICommand.get_CommandType() + + + Sets the shim of MIDICommand.set_CommandType(MIDICommandType value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI.MIDIDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of MIDIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MIDIDataFormat.MIDIDataFormat() + + + Sets the shim of MIDIDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MIDIDataFormat.MakeReference() + + + Sets the shim of MIDIDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of MIDIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MIDIDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MIDIDataFormat.MakeReference() + + + Sets the shim of MIDIDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI.MIDICommand + + + Initializes a new instance + + + Initializes a new instance of type StubMIDICommand + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI.MIDIDataFormat + + + Initializes a new instance + + + Sets the stub of MIDIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MIDIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMIDIDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MIDIDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MIDIDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MIDIDataFormat.MakeReference() + + + Sets the stub of MIDIDataFormat.MakeReference() + + + Sets the stub of MIDIDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MIDIDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MusicXML.MusicXMLDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of MusicXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MusicXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MusicXMLDataFormat.MusicXMLDataFormat() + + + Sets the shim of MusicXMLDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of MusicXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MusicXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MusicXMLDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MusicXML.MusicXMLDataFormat + + + Initializes a new instance + + + Sets the stub of MusicXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MusicXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MusicXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MusicXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMusicXMLDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MusicXMLDataFormat.MakeReference() + + + Sets the stub of MusicXMLDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.NIFF.NIFFDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of NIFFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NIFFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of NIFFDataFormat.NIFFDataFormat() + + + Sets the shim of NIFFDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of NIFFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NIFFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NIFFDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.NIFF.NIFFDataFormat + + + Initializes a new instance + + + Sets the stub of NIFFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NIFFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NIFFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NIFFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubNIFFDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of NIFFDataFormat.MakeReference() + + + Sets the stub of NIFFDataFormat.MakeReference() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700DataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SPC700DataFormat.SPC700DataFormat() + + + Sets the shim of SPC700DataFormat.get_Generator() + + + Sets the shim of SPC700DataFormat.set_Generator(SPC700Emulator value) + + + Sets the shim of SPC700DataFormat.get_ID666DefaultChannelDisables() + + + Sets the shim of SPC700DataFormat.set_ID666DefaultChannelDisables(Byte value) + + + Sets the shim of SPC700DataFormat.get_ID666Reserved() + + + Sets the shim of SPC700DataFormat.set_ID666Reserved(Byte[] value) + + + Sets the shim of SPC700DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of SPC700DataFormat.MakeReference() + + + Sets the shim of SPC700DataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of SPC700DataFormat.get_Generator() + + + Sets the shim of SPC700DataFormat.set_Generator(SPC700Emulator value) + + + Sets the shim of SPC700DataFormat.get_ID666DefaultChannelDisables() + + + Sets the shim of SPC700DataFormat.set_ID666DefaultChannelDisables(Byte value) + + + Sets the shim of SPC700DataFormat.get_ID666Reserved() + + + Sets the shim of SPC700DataFormat.set_ID666Reserved(Byte[] value) + + + Sets the shim of SPC700DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of SPC700DataFormat.MakeReference() + + + Sets the shim of SPC700DataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700ID666Tag + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SPC700ID666Tag.get_Comments() + + + Sets the shim of SPC700ID666Tag.set_Comments(String value) + + + Sets the shim of SPC700ID666Tag.SPC700ID666Tag() + + + Sets the shim of SPC700ID666Tag.get_DefaultDisables() + + + Sets the shim of SPC700ID666Tag.set_DefaultDisables(Boolean value) + + + Sets the shim of SPC700ID666Tag.get_DumpDate() + + + Sets the shim of SPC700ID666Tag.set_DumpDate(DateTime value) + + + Sets the shim of SPC700ID666Tag.get_DumperName() + + + Sets the shim of SPC700ID666Tag.set_DumperName(String value) + + + Sets the shim of SPC700ID666Tag.get_Emulator() + + + Sets the shim of SPC700ID666Tag.set_Emulator(SPC700Emulator value) + + + Sets the shim of SPC700ID666Tag.get_Format() + + + Sets the shim of SPC700ID666Tag.set_Format(SPC700ID666Format value) + + + Sets the shim of SPC700ID666Tag.get_GameTitle() + + + Sets the shim of SPC700ID666Tag.set_GameTitle(String value) + + + Sets the shim of SPC700ID666Tag.get_SongArtist() + + + Sets the shim of SPC700ID666Tag.set_SongArtist(String value) + + + Sets the shim of SPC700ID666Tag.get_SongTitle() + + + Sets the shim of SPC700ID666Tag.set_SongTitle(String value) + + + Sets the shim of SPC700ID666Tag.get_fFadeLength() + + + Sets the shim of SPC700ID666Tag.set_fFadeLength(Byte[] value) + + + Sets the shim of SPC700ID666Tag.get_fFadeOutSeconds() + + + Sets the shim of SPC700ID666Tag.set_fFadeOutSeconds(Byte[] value) + + + Sets the shim of SPC700ID666Tag.get_fReserved2() + + + Sets the shim of SPC700ID666Tag.set_fReserved2(Byte[] value) + + + Define shims for all instances members + + + Sets the shim of SPC700ID666Tag.get_Comments() + + + Sets the shim of SPC700ID666Tag.set_Comments(String value) + + + Sets the shim of SPC700ID666Tag.get_DefaultDisables() + + + Sets the shim of SPC700ID666Tag.set_DefaultDisables(Boolean value) + + + Sets the shim of SPC700ID666Tag.get_DumpDate() + + + Sets the shim of SPC700ID666Tag.set_DumpDate(DateTime value) + + + Sets the shim of SPC700ID666Tag.get_DumperName() + + + Sets the shim of SPC700ID666Tag.set_DumperName(String value) + + + Sets the shim of SPC700ID666Tag.get_Emulator() + + + Sets the shim of SPC700ID666Tag.set_Emulator(SPC700Emulator value) + + + Sets the shim of SPC700ID666Tag.get_Format() + + + Sets the shim of SPC700ID666Tag.set_Format(SPC700ID666Format value) + + + Sets the shim of SPC700ID666Tag.get_GameTitle() + + + Sets the shim of SPC700ID666Tag.set_GameTitle(String value) + + + Sets the shim of SPC700ID666Tag.get_SongArtist() + + + Sets the shim of SPC700ID666Tag.set_SongArtist(String value) + + + Sets the shim of SPC700ID666Tag.get_SongTitle() + + + Sets the shim of SPC700ID666Tag.set_SongTitle(String value) + + + Sets the shim of SPC700ID666Tag.get_fFadeLength() + + + Sets the shim of SPC700ID666Tag.set_fFadeLength(Byte[] value) + + + Sets the shim of SPC700ID666Tag.get_fFadeOutSeconds() + + + Sets the shim of SPC700ID666Tag.set_fFadeOutSeconds(Byte[] value) + + + Sets the shim of SPC700ID666Tag.get_fReserved2() + + + Sets the shim of SPC700ID666Tag.set_fReserved2(Byte[] value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700Memory + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SPC700Memory.SPC700Memory() + + + Sets the shim of SPC700Memory.get_fDSP() + + + Sets the shim of SPC700Memory.set_fDSP(Byte[] value) + + + Sets the shim of SPC700Memory.get_fExtra() + + + Sets the shim of SPC700Memory.set_fExtra(Byte[] value) + + + Sets the shim of SPC700Memory.get_fRAM() + + + Sets the shim of SPC700Memory.set_fRAM(Byte[] value) + + + Sets the shim of SPC700Memory.get_fUnused() + + + Sets the shim of SPC700Memory.set_fUnused(Byte[] value) + + + Define shims for all instances members + + + Sets the shim of SPC700Memory.get_fDSP() + + + Sets the shim of SPC700Memory.set_fDSP(Byte[] value) + + + Sets the shim of SPC700Memory.get_fExtra() + + + Sets the shim of SPC700Memory.set_fExtra(Byte[] value) + + + Sets the shim of SPC700Memory.get_fRAM() + + + Sets the shim of SPC700Memory.set_fRAM(Byte[] value) + + + Sets the shim of SPC700Memory.get_fUnused() + + + Sets the shim of SPC700Memory.set_fUnused(Byte[] value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700Registers + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SPC700Registers.SPC700Registers() + + + Sets the shim of SPC700Registers.get_fA() + + + Sets the shim of SPC700Registers.set_fA(Byte value) + + + Sets the shim of SPC700Registers.get_fPC() + + + Sets the shim of SPC700Registers.set_fPC(UInt16 value) + + + Sets the shim of SPC700Registers.get_fPSW() + + + Sets the shim of SPC700Registers.set_fPSW(Byte value) + + + Sets the shim of SPC700Registers.get_fReserved1() + + + Sets the shim of SPC700Registers.set_fReserved1(UInt16 value) + + + Sets the shim of SPC700Registers.get_fSP() + + + Sets the shim of SPC700Registers.set_fSP(Byte value) + + + Sets the shim of SPC700Registers.get_fX() + + + Sets the shim of SPC700Registers.set_fX(Byte value) + + + Sets the shim of SPC700Registers.get_fY() + + + Sets the shim of SPC700Registers.set_fY(Byte value) + + + Define shims for all instances members + + + Sets the shim of SPC700Registers.get_fA() + + + Sets the shim of SPC700Registers.set_fA(Byte value) + + + Sets the shim of SPC700Registers.get_fPC() + + + Sets the shim of SPC700Registers.set_fPC(UInt16 value) + + + Sets the shim of SPC700Registers.get_fPSW() + + + Sets the shim of SPC700Registers.set_fPSW(Byte value) + + + Sets the shim of SPC700Registers.get_fReserved1() + + + Sets the shim of SPC700Registers.set_fReserved1(UInt16 value) + + + Sets the shim of SPC700Registers.get_fSP() + + + Sets the shim of SPC700Registers.set_fSP(Byte value) + + + Sets the shim of SPC700Registers.get_fX() + + + Sets the shim of SPC700Registers.set_fX(Byte value) + + + Sets the shim of SPC700Registers.get_fY() + + + Sets the shim of SPC700Registers.set_fY(Byte value) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700DataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubSPC700DataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of SPC700DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SPC700DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SPC700DataFormat.MakeReference() + + + Sets the stub of SPC700DataFormat.MakeReference() + + + Sets the stub of SPC700DataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of SPC700DataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700ID666Tag + + + Initializes a new instance + + + Initializes a new instance of type StubSPC700ID666Tag + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700Memory + + + Initializes a new instance + + + Initializes a new instance of type StubSPC700Memory + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC.SPC700Registers + + + Initializes a new instance + + + Initializes a new instance of type StubSPC700Registers + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.UTAU.USTDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of USTDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of USTDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of USTDataFormat.USTDataFormat() + + + Sets the shim of USTDataFormat.InitializePhonemeDictionary() + + + Sets the shim of USTDataFormat.InitializePhonemeDictionary(String FileName) + + + Sets the shim of USTDataFormat.LyricToPhoneme(String lyric) + + + Sets the shim of USTDataFormat.MakeReference() + + + Sets the shim of USTDataFormat.USTDataFormat() + + + Define shims for all instances members + + + Sets the shim of USTDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of USTDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of USTDataFormat.LyricToPhoneme(String lyric) + + + Sets the shim of USTDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.UTAU.USTDataFormat + + + Initializes a new instance + + + Sets the stub of USTDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of USTDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of USTDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of USTDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubUSTDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of WindowsConfigurationDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WindowsConfigurationDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of USTDataFormat.MakeReference() + + + Sets the stub of USTDataFormat.MakeReference() + + + Sets the stub of WindowsConfigurationDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of WindowsConfigurationDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.Vocaloid.VSQDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of VSQDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VSQDataFormat.VSQDataFormat() + + + Sets the shim of VSQDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of VSQDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of VSQDataFormat.MakeReference() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.Vocaloid.VSQXDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of VSQXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of VSQXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of VSQXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VSQXDataFormat.VSQXDataFormat() + + + Sets the shim of VSQXDataFormat.MakeReference() + + + Sets the shim of VSQXDataFormat.get_ProductVendor() + + + Sets the shim of VSQXDataFormat.set_ProductVendor(String value) + + + Sets the shim of VSQXDataFormat.get_ProductVersion() + + + Sets the shim of VSQXDataFormat.set_ProductVersion(Version value) + + + Define shims for all instances members + + + Sets the shim of VSQXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of VSQXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of VSQXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of VSQXDataFormat.MakeReference() + + + Sets the shim of VSQXDataFormat.get_ProductVendor() + + + Sets the shim of VSQXDataFormat.set_ProductVendor(String value) + + + Sets the shim of VSQXDataFormat.get_ProductVersion() + + + Sets the shim of VSQXDataFormat.set_ProductVersion(Version value) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.Vocaloid.VSQDataFormat + + + Initializes a new instance + + + Sets the stub of VSQDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of VSQDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubVSQDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MIDIDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MIDIDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of VSQDataFormat.MakeReference() + + + Sets the stub of VSQDataFormat.MakeReference() + + + Sets the stub of MIDIDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MIDIDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.Vocaloid.VSQXDataFormat + + + Initializes a new instance + + + Sets the stub of VSQXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of VSQXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of VSQXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of VSQXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of VSQXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of VSQXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubVSQXDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of VSQXDataFormat.MakeReference() + + + Sets the stub of VSQXDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Voicebank.DirectWave.DirectWavePatchDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of DirectWavePatchDataFormat.DirectWavePatchDataFormat() + + + Sets the shim of DirectWavePatchDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of DirectWavePatchDataFormat.MakeReference() + + + Sets the shim of DirectWavePatchDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of DirectWavePatchDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of DirectWavePatchDataFormat.MakeReference() + + + Sets the shim of DirectWavePatchDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Voicebank.DirectWave.DirectWavePatchDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubDirectWavePatchDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DirectWavePatchDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of DirectWavePatchDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of DirectWavePatchDataFormat.MakeReference() + + + Sets the stub of DirectWavePatchDataFormat.MakeReference() + + + Sets the stub of DirectWavePatchDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of DirectWavePatchDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeDictionaryXMLDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of PhonemeDictionaryXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PhonemeDictionaryXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PhonemeDictionaryXMLDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PhonemeDictionaryXMLDataFormat.PhonemeDictionaryXMLDataFormat() + + + Sets the shim of PhonemeDictionaryXMLDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of PhonemeDictionaryXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PhonemeDictionaryXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PhonemeDictionaryXMLDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PhonemeDictionaryXMLDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeDictionaryXMLDataFormat + + + Initializes a new instance + + + Sets the stub of PhonemeDictionaryXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PhonemeDictionaryXMLDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PhonemeDictionaryXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PhonemeDictionaryXMLDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PhonemeDictionaryXMLDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PhonemeDictionaryXMLDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubPhonemeDictionaryXMLDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PhonemeDictionaryXMLDataFormat.MakeReference() + + + Sets the stub of PhonemeDictionaryXMLDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.AdvancedAudioCodec.AACDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AACDataFormat.AACDataFormat() + + + Sets the shim of AACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of AACDataFormat.MakeReference() + + + Sets the shim of AACDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of AACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of AACDataFormat.MakeReference() + + + Sets the shim of AACDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.AdvancedAudioCodec.AACDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubAACDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of AACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of AACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of AACDataFormat.MakeReference() + + + Sets the stub of AACDataFormat.MakeReference() + + + Sets the stub of AACDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of AACDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.BRSTM.BRSTMDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of BRSTMDataFormat.BRSTMDataFormat() + + + Sets the shim of BRSTMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of BRSTMDataFormat.MakeReference() + + + Sets the shim of BRSTMDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of BRSTMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of BRSTMDataFormat.MakeReference() + + + Sets the shim of BRSTMDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.BRSTM.BRSTMDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubBRSTMDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of BRSTMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of BRSTMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of BRSTMDataFormat.MakeReference() + + + Sets the stub of BRSTMDataFormat.MakeReference() + + + Sets the stub of BRSTMDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of BRSTMDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.FLACDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of FLACDataFormat.FLACDataFormat() + + + Sets the shim of FLACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of FLACDataFormat.MakeReference() + + + Sets the shim of FLACDataFormat.get_MetadataBlocks() + + + Sets the shim of FLACDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of FLACDataFormat.SaveMetadataBlockHeader(BinaryWriter bw, FLACMetadataBlockHeader header) + + + Sets the shim of FLACDataFormat.SaveMetadataBlockStreamInfo(BinaryWriter bw, FLACMetadataBlockStreamInfo block) + + + Define shims for all instances members + + + Sets the shim of FLACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of FLACDataFormat.MakeReference() + + + Sets the shim of FLACDataFormat.get_MetadataBlocks() + + + Sets the shim of FLACDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of FLACDataFormat.SaveMetadataBlockHeader(BinaryWriter bw, FLACMetadataBlockHeader header) + + + Sets the shim of FLACDataFormat.SaveMetadataBlockStreamInfo(BinaryWriter bw, FLACMetadataBlockStreamInfo block) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.FLACDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubFLACDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of FLACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of FLACDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of FLACDataFormat.MakeReference() + + + Sets the stub of FLACDataFormat.MakeReference() + + + Sets the stub of FLACDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of FLACDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlock + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of FLACMetadataBlock.FLACMetadataBlock() + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlock+FLACMetadataBlockCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of FLACMetadataBlockCollection.FLACMetadataBlockCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlockHeader + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of FLACMetadataBlockHeader.get_BlockType() + + + Sets the shim of FLACMetadataBlockHeader.set_BlockType(FLACMetadataBlockType value) + + + Sets the shim of FLACMetadataBlockHeader.FLACMetadataBlockHeader() + + + Sets the shim of FLACMetadataBlockHeader.get_ContentLength() + + + Sets the shim of FLACMetadataBlockHeader.set_ContentLength(Int32 value) + + + Sets the shim of FLACMetadataBlockHeader.get_IsLastMetadataBlock() + + + Sets the shim of FLACMetadataBlockHeader.set_IsLastMetadataBlock(Boolean value) + + + Define shims for all instances members + + + Sets the shim of FLACMetadataBlockHeader.get_BlockType() + + + Sets the shim of FLACMetadataBlockHeader.set_BlockType(FLACMetadataBlockType value) + + + Sets the shim of FLACMetadataBlockHeader.get_ContentLength() + + + Sets the shim of FLACMetadataBlockHeader.set_ContentLength(Int32 value) + + + Sets the shim of FLACMetadataBlockHeader.get_IsLastMetadataBlock() + + + Sets the shim of FLACMetadataBlockHeader.set_IsLastMetadataBlock(Boolean value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlockStreamInfo + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of FLACMetadataBlockStreamInfo.get_BitsPerSample() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_BitsPerSample(Byte value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_ChannelCount() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_ChannelCount(Byte value) + + + Sets the shim of FLACMetadataBlockStreamInfo.FLACMetadataBlockStreamInfo() + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MD5Signature() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MD5Signature(Int16 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MaximumBlockSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MaximumBlockSize(Int16 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MaximumFrameSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MaximumFrameSize(Int32 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MinimumBlockSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MinimumBlockSize(Int16 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MinimumFrameSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MinimumFrameSize(Int32 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_SampleRate() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_SampleRate(Int32 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_TotalSamplesInStream() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_TotalSamplesInStream(Int64 value) + + + Define shims for all instances members + + + Sets the shim of FLACMetadataBlockStreamInfo.get_BitsPerSample() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_BitsPerSample(Byte value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_ChannelCount() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_ChannelCount(Byte value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MD5Signature() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MD5Signature(Int16 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MaximumBlockSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MaximumBlockSize(Int16 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MaximumFrameSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MaximumFrameSize(Int32 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MinimumBlockSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MinimumBlockSize(Int16 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_MinimumFrameSize() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_MinimumFrameSize(Int32 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_SampleRate() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_SampleRate(Int32 value) + + + Sets the shim of FLACMetadataBlockStreamInfo.get_TotalSamplesInStream() + + + Sets the shim of FLACMetadataBlockStreamInfo.set_TotalSamplesInStream(Int64 value) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlock + + + Initializes a new instance + + + Initializes a new instance of type StubFLACMetadataBlock + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlockHeader + + + Initializes a new instance + + + Initializes a new instance of type StubFLACMetadataBlockHeader + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal.FLACMetadataBlockStreamInfo + + + Initializes a new instance + + + Initializes a new instance of type StubFLACMetadataBlockStreamInfo + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MP3.MP3DataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MP3DataFormat.MP3DataFormat() + + + Sets the shim of MP3DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MP3DataFormat.MakeReference() + + + Sets the shim of MP3DataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of MP3DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MP3DataFormat.MakeReference() + + + Sets the shim of MP3DataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MP3.MP3DataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMP3DataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MP3DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MP3DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MP3DataFormat.MakeReference() + + + Sets the stub of MP3DataFormat.MakeReference() + + + Sets the stub of MP3DataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MP3DataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MP4.MP4DataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MP4DataFormat.MP4DataFormat() + + + Sets the shim of MP4DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MP4DataFormat.MakeReference() + + + Sets the shim of MP4DataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of MP4DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MP4DataFormat.MakeReference() + + + Sets the shim of MP4DataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MP4.MP4DataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMP4DataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MP4DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MP4DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MP4DataFormat.MakeReference() + + + Sets the stub of MP4DataFormat.MakeReference() + + + Sets the stub of MP4DataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MP4DataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MicrosoftWave.MicrosoftWaveDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of MicrosoftWaveDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MicrosoftWaveDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MicrosoftWaveDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MicrosoftWaveDataFormat.MicrosoftWaveDataFormat() + + + Sets the shim of MicrosoftWaveDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the shim of MicrosoftWaveDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of MicrosoftWaveDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MicrosoftWaveDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MicrosoftWaveDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of MicrosoftWaveDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the shim of MicrosoftWaveDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MicrosoftWave.MicrosoftWaveDataFormat + + + Initializes a new instance + + + Sets the stub of MicrosoftWaveDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MicrosoftWaveDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MicrosoftWaveDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MicrosoftWaveDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MicrosoftWaveDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of MicrosoftWaveDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMicrosoftWaveDataFormat + + + Sets the stub of MicrosoftWaveDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the stub of MicrosoftWaveDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MicrosoftWaveDataFormat.MakeReference() + + + Sets the stub of MicrosoftWaveDataFormat.MakeReference() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MonkeyAudio.APEDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of APEDataFormat.APEDataFormat() + + + Sets the shim of APEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of APEDataFormat.MakeReference() + + + Sets the shim of APEDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of APEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of APEDataFormat.MakeReference() + + + Sets the shim of APEDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MonkeyAudio.APLDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of APLDataFormat.APLDataFormat() + + + Sets the shim of APLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of APLDataFormat.MakeReference() + + + Sets the shim of APLDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of APLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of APLDataFormat.MakeReference() + + + Sets the shim of APLDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MonkeyAudio.APEDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubAPEDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of APEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of APEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of APEDataFormat.MakeReference() + + + Sets the stub of APEDataFormat.MakeReference() + + + Sets the stub of APEDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of APEDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MonkeyAudio.APLDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubAPLDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of APLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of APLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of APLDataFormat.MakeReference() + + + Sets the stub of APLDataFormat.MakeReference() + + + Sets the stub of APLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of APLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.OGG.OGGDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of OGGDataFormat.OGGDataFormat() + + + Sets the shim of OGGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of OGGDataFormat.MakeReference() + + + Sets the shim of OGGDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of OGGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of OGGDataFormat.MakeReference() + + + Sets the shim of OGGDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.OGG.OGGDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubOGGDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of OGGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of OGGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of OGGDataFormat.MakeReference() + + + Sets the stub of OGGDataFormat.MakeReference() + + + Sets the stub of OGGDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of OGGDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.REX2.REX2DataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of REX2DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of REX2DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of REX2DataFormat.REX2DataFormat() + + + Sets the shim of REX2DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the shim of REX2DataFormat.MakeReference() + + + Sets the shim of REX2DataFormat.get_RIFFTagsLittleEndian() + + + Define shims for all instances members + + + Sets the shim of REX2DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of REX2DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of REX2DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the shim of REX2DataFormat.MakeReference() + + + Sets the shim of REX2DataFormat.get_RIFFTagsLittleEndian() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.REX2.REX2DataFormat + + + Initializes a new instance + + + Sets the stub of REX2DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of REX2DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of REX2DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of REX2DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of RIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of RIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubREX2DataFormat + + + Sets the stub of REX2DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of REX2DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of REX2DataFormat.MakeReference() + + + Sets the stub of REX2DataFormat.MakeReference() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of REX2DataFormat.get_RIFFTagsLittleEndian() + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of REX2DataFormat.get_RIFFTagsLittleEndian() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.RealAudio.RealAudioDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of RealAudioDataFormat.RealAudioDataFormat() + + + Sets the shim of RealAudioDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of RealAudioDataFormat.MakeReference() + + + Sets the shim of RealAudioDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of RealAudioDataFormat.get_Version() + + + Define shims for all instances members + + + Sets the shim of RealAudioDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of RealAudioDataFormat.MakeReference() + + + Sets the shim of RealAudioDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of RealAudioDataFormat.get_Version() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.RealAudio.RealAudioDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubRealAudioDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of RealAudioDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RealAudioDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RealAudioDataFormat.MakeReference() + + + Sets the stub of RealAudioDataFormat.MakeReference() + + + Sets the stub of RealAudioDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RealAudioDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.Shorten.ShortenDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ShortenDataFormat.ShortenDataFormat() + + + Sets the shim of ShortenDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ShortenDataFormat.MakeReference() + + + Sets the shim of ShortenDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of ShortenDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ShortenDataFormat.MakeReference() + + + Sets the shim of ShortenDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.Shorten.ShortenDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubShortenDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of ShortenDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ShortenDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ShortenDataFormat.MakeReference() + + + Sets the stub of ShortenDataFormat.MakeReference() + + + Sets the stub of ShortenDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of ShortenDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.SunAu.SunAuDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SunAuDataFormat.SunAuDataFormat() + + + Sets the shim of SunAuDataFormat.get_Encoding() + + + Sets the shim of SunAuDataFormat.set_Encoding(SunAuEncoding value) + + + Sets the shim of SunAuDataFormat.Int32ToSunAuEncoding(Int32 encoding) + + + Sets the shim of SunAuDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of SunAuDataFormat.MakeReference() + + + Sets the shim of SunAuDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of SunAuDataFormat.SunAuEncodingToInt32(SunAuEncoding encoding) + + + Define shims for all instances members + + + Sets the shim of SunAuDataFormat.get_Encoding() + + + Sets the shim of SunAuDataFormat.set_Encoding(SunAuEncoding value) + + + Sets the shim of SunAuDataFormat.Int32ToSunAuEncoding(Int32 encoding) + + + Sets the shim of SunAuDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of SunAuDataFormat.MakeReference() + + + Sets the shim of SunAuDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of SunAuDataFormat.SunAuEncodingToInt32(SunAuEncoding encoding) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.SunAu.SunAuDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubSunAuDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of SunAuDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SunAuDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SunAuDataFormat.MakeReference() + + + Sets the stub of SunAuDataFormat.MakeReference() + + + Sets the stub of SunAuDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of SunAuDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.WavPack.WavPackDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of WavPackDataFormat.WavPackDataFormat() + + + Sets the shim of WavPackDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of WavPackDataFormat.MakeReference() + + + Sets the shim of WavPackDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of WavPackDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of WavPackDataFormat.MakeReference() + + + Sets the shim of WavPackDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Audio.Waveform.WavPack.WavPackDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubWavPackDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of WavPackDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WavPackDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WavPackDataFormat.MakeReference() + + + Sets the stub of WavPackDataFormat.MakeReference() + + + Sets the stub of WavPackDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of WavPackDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.BluRay.HDMVDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of HDMVDataFormat.HDMVDataFormat() + + + Sets the shim of HDMVDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of HDMVDataFormat.MakeReference() + + + Sets the shim of HDMVDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of HDMVDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of HDMVDataFormat.MakeReference() + + + Sets the shim of HDMVDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.BluRay.INDXDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of INDXDataFormat.INDXDataFormat() + + + Sets the shim of INDXDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of INDXDataFormat.MakeReference() + + + Sets the shim of INDXDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of INDXDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of INDXDataFormat.MakeReference() + + + Sets the shim of INDXDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.BluRay.MOBJDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MOBJDataFormat.MOBJDataFormat() + + + Sets the shim of MOBJDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MOBJDataFormat.MakeReference() + + + Sets the shim of MOBJDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of MOBJDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MOBJDataFormat.MakeReference() + + + Sets the shim of MOBJDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.BluRay.MPLSDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MPLSDataFormat.MPLSDataFormat() + + + Sets the shim of MPLSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MPLSDataFormat.MakeReference() + + + Sets the shim of MPLSDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of MPLSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MPLSDataFormat.MakeReference() + + + Sets the shim of MPLSDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.BluRay.HDMVDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubHDMVDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of HDMVDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of HDMVDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of HDMVDataFormat.MakeReference() + + + Sets the stub of HDMVDataFormat.MakeReference() + + + Sets the stub of HDMVDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of HDMVDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.BluRay.INDXDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubINDXDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of INDXDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of INDXDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of INDXDataFormat.MakeReference() + + + Sets the stub of INDXDataFormat.MakeReference() + + + Sets the stub of INDXDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of INDXDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.BluRay.MOBJDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMOBJDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MOBJDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MOBJDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MOBJDataFormat.MakeReference() + + + Sets the stub of MOBJDataFormat.MakeReference() + + + Sets the stub of MOBJDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MOBJDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.BluRay.MPLSDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMPLSDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MPLSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MPLSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MPLSDataFormat.MakeReference() + + + Sets the stub of MPLSDataFormat.MakeReference() + + + Sets the stub of MPLSDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MPLSDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Palette.Adobe.ACODataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ACODataFormat.ACODataFormat() + + + Sets the shim of ACODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ACODataFormat.MakeReference() + + + Sets the shim of ACODataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of ACODataFormat.ACODataFormat() + + + Sets the shim of ACODataFormat.get_Version() + + + Sets the shim of ACODataFormat.set_Version(UInt16 value) + + + Define shims for all instances members + + + Sets the shim of ACODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ACODataFormat.MakeReference() + + + Sets the shim of ACODataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of ACODataFormat.get_Version() + + + Sets the shim of ACODataFormat.set_Version(UInt16 value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Palette.Adobe.ASEDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ASEDataFormat.ASEDataFormat() + + + Sets the shim of ASEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ASEDataFormat.MakeReference() + + + Sets the shim of ASEDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of ASEDataFormat.ASEDataFormat() + + + Define shims for all instances members + + + Sets the shim of ASEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ASEDataFormat.MakeReference() + + + Sets the shim of ASEDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Palette.Adobe.ACODataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubACODataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of ACODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ACODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ACODataFormat.MakeReference() + + + Sets the stub of ACODataFormat.MakeReference() + + + Sets the stub of ACODataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of ACODataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Palette.Adobe.ASEDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubASEDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of ASEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ASEDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ASEDataFormat.MakeReference() + + + Sets the stub of ASEDataFormat.MakeReference() + + + Sets the stub of ASEDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of ASEDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Palette.GIMP.GPLDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GPLDataFormat.GPLDataFormat() + + + Sets the shim of GPLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GPLDataFormat.MakeReference() + + + Sets the shim of GPLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of GPLDataFormat.GPLDataFormat() + + + Define shims for all instances members + + + Sets the shim of GPLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GPLDataFormat.MakeReference() + + + Sets the shim of GPLDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Palette.GIMP.GPLDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubGPLDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of GPLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GPLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GPLDataFormat.MakeReference() + + + Sets the stub of GPLDataFormat.MakeReference() + + + Sets the stub of GPLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of GPLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Palette.PaintShop.PaintShopPaletteDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PaintShopPaletteDataFormat.PaintShopPaletteDataFormat() + + + Sets the shim of PaintShopPaletteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of PaintShopPaletteDataFormat.MakeReference() + + + Sets the shim of PaintShopPaletteDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of PaintShopPaletteDataFormat.PaintShopPaletteDataFormat() + + + Define shims for all instances members + + + Sets the shim of PaintShopPaletteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of PaintShopPaletteDataFormat.MakeReference() + + + Sets the shim of PaintShopPaletteDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Palette.PaintShop.PaintShopPaletteDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubPaintShopPaletteDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of PaintShopPaletteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PaintShopPaletteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PaintShopPaletteDataFormat.MakeReference() + + + Sets the stub of PaintShopPaletteDataFormat.MakeReference() + + + Sets the stub of PaintShopPaletteDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of PaintShopPaletteDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.ARGB.ARGBDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ARGBDataFormat.ARGBDataFormat() + + + Sets the shim of ARGBDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ARGBDataFormat.MakeReference() + + + Sets the shim of ARGBDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of ARGBDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ARGBDataFormat.MakeReference() + + + Sets the shim of ARGBDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.ARGB.ARGBDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubARGBDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of ARGBDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ARGBDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ARGBDataFormat.MakeReference() + + + Sets the stub of ARGBDataFormat.MakeReference() + + + Sets the stub of ARGBDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of ARGBDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.Bitmap.BitmapDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of BitmapDataFormat.BitmapDataFormat() + + + Sets the shim of BitmapDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of BitmapDataFormat.MakeReference() + + + Sets the shim of BitmapDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of BitmapDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of BitmapDataFormat.MakeReference() + + + Sets the shim of BitmapDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.Bitmap.BitmapInfoHeader + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of BitmapInfoHeader.Load(BinaryReader br) + + + Sets the shim of BitmapInfoHeader.Save(BinaryWriter bw, BitmapInfoHeader header) + + + Define shims for all instances members + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.Bitmap.BitmapDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubBitmapDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of BitmapDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of BitmapDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of BitmapDataFormat.MakeReference() + + + Sets the stub of BitmapDataFormat.MakeReference() + + + Sets the stub of BitmapDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of BitmapDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.ChaosWorks.CWESpriteDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of CWESpriteDataFormat.CWESpriteDataFormat() + + + Sets the shim of CWESpriteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CWESpriteDataFormat.MakeReference() + + + Sets the shim of CWESpriteDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of CWESpriteDataFormat.CWESpriteDataFormat() + + + Define shims for all instances members + + + Sets the shim of CWESpriteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CWESpriteDataFormat.MakeReference() + + + Sets the shim of CWESpriteDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.ChaosWorks.CWESpriteDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubCWESpriteDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of CWESpriteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CWESpriteDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CWESpriteDataFormat.MakeReference() + + + Sets the stub of CWESpriteDataFormat.MakeReference() + + + Sets the stub of CWESpriteDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of CWESpriteDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.CompressedBG.CompressedBGDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of CompressedBGDataFormat.CompressedBGDataFormat() + + + Sets the shim of CompressedBGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CompressedBGDataFormat.MakeReference() + + + Sets the shim of CompressedBGDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of CompressedBGDataFormat.CompressedBGDataFormat() + + + Sets the shim of CompressedBGDataFormat.color_add(UInt32 x, UInt32 y) + + + Sets the shim of CompressedBGDataFormat.color_avg(UInt32 x, UInt32 y) + + + Sets the shim of CompressedBGDataFormat.extract(Byte[] src, UInt32 bpp) + + + Sets the shim of CompressedBGDataFormat.hash_update(Int32& hash_val) + + + Sets the shim of CompressedBGDataFormat.hash_update(UInt32& hash_val) + + + Sets the shim of CompressedBGDataFormat.readVariable(Byte[] ptr) + + + Define shims for all instances members + + + Sets the shim of CompressedBGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CompressedBGDataFormat.MakeReference() + + + Sets the shim of CompressedBGDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of CompressedBGDataFormat.hash_update(Int32& hash_val) + + + Sets the shim of CompressedBGDataFormat.hash_update(UInt32& hash_val) + + + Sets the shim of CompressedBGDataFormat.readVariable(Byte[] ptr) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.CompressedBG.CompressedBGDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubCompressedBGDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of CompressedBGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CompressedBGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CompressedBGDataFormat.MakeReference() + + + Sets the stub of CompressedBGDataFormat.MakeReference() + + + Sets the stub of CompressedBGDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of CompressedBGDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.CURDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of CURDataFormat.CURDataFormat() + + + Sets the shim of CURDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CURDataFormat.MakeReference() + + + Sets the shim of CURDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of CURDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CURDataFormat.MakeReference() + + + Sets the shim of CURDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.MicrosoftDDSDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of MicrosoftDDSDataFormat.MicrosoftDDSDataFormat() + + + Sets the shim of MicrosoftDDSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MicrosoftDDSDataFormat.MakeReference() + + + Sets the shim of MicrosoftDDSDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of MicrosoftDDSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of MicrosoftDDSDataFormat.MakeReference() + + + Sets the shim of MicrosoftDDSDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.CURDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubCURDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of CURDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CURDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CURDataFormat.MakeReference() + + + Sets the stub of CURDataFormat.MakeReference() + + + Sets the stub of CURDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of CURDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.MicrosoftDDSDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubMicrosoftDDSDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of MicrosoftDDSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MicrosoftDDSDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of MicrosoftDDSDataFormat.MakeReference() + + + Sets the stub of MicrosoftDDSDataFormat.MakeReference() + + + Sets the stub of MicrosoftDDSDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of MicrosoftDDSDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.GIM.GIMDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GIMDataFormat.GIMDataFormat() + + + Sets the shim of GIMDataFormat.get_CreationApplication() + + + Sets the shim of GIMDataFormat.set_CreationApplication(String value) + + + Sets the shim of GIMDataFormat.get_CreationUserName() + + + Sets the shim of GIMDataFormat.set_CreationUserName(String value) + + + Sets the shim of GIMDataFormat.get_Endianness() + + + Sets the shim of GIMDataFormat.set_Endianness(Endianness value) + + + Sets the shim of GIMDataFormat.get_ImageFormat() + + + Sets the shim of GIMDataFormat.set_ImageFormat(GIMImageFormat value) + + + Sets the shim of GIMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GIMDataFormat.MakeReference() + + + Sets the shim of GIMDataFormat.get_OriginalFileName() + + + Sets the shim of GIMDataFormat.set_OriginalFileName(String value) + + + Sets the shim of GIMDataFormat.get_PaletteFormat() + + + Sets the shim of GIMDataFormat.set_PaletteFormat(GIMPaletteFormat value) + + + Sets the shim of GIMDataFormat.get_Palette() + + + Sets the shim of GIMDataFormat.get_PixelOrder() + + + Sets the shim of GIMDataFormat.set_PixelOrder(GIMPixelOrder value) + + + Sets the shim of GIMDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of GIMDataFormat.GIMDataFormat() + + + Define shims for all instances members + + + Sets the shim of GIMDataFormat.get_CreationApplication() + + + Sets the shim of GIMDataFormat.set_CreationApplication(String value) + + + Sets the shim of GIMDataFormat.get_CreationUserName() + + + Sets the shim of GIMDataFormat.set_CreationUserName(String value) + + + Sets the shim of GIMDataFormat.get_Endianness() + + + Sets the shim of GIMDataFormat.set_Endianness(Endianness value) + + + Sets the shim of GIMDataFormat.get_ImageFormat() + + + Sets the shim of GIMDataFormat.set_ImageFormat(GIMImageFormat value) + + + Sets the shim of GIMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GIMDataFormat.MakeReference() + + + Sets the shim of GIMDataFormat.get_OriginalFileName() + + + Sets the shim of GIMDataFormat.set_OriginalFileName(String value) + + + Sets the shim of GIMDataFormat.get_PaletteFormat() + + + Sets the shim of GIMDataFormat.set_PaletteFormat(GIMPaletteFormat value) + + + Sets the shim of GIMDataFormat.get_Palette() + + + Sets the shim of GIMDataFormat.get_PixelOrder() + + + Sets the shim of GIMDataFormat.set_PixelOrder(GIMPixelOrder value) + + + Sets the shim of GIMDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.GIM.GIMSwizzleEncoder + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GIMSwizzleEncoder.GIMSwizzleEncoder() + + + Sets the shim of GIMSwizzleEncoder.Decode(Byte[]& Buf, Int32 Pointer, Int32 Width, Int32 Height) + + + Sets the shim of GIMSwizzleEncoder.Encode(Byte[]& Buf, Int32 Pointer, Int32 Width, Int32 Height) + + + Define shims for all instances members + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.GIM.GIMDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubGIMDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of GIMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GIMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GIMDataFormat.MakeReference() + + + Sets the stub of GIMDataFormat.MakeReference() + + + Sets the stub of GIMDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of GIMDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.GIM.GIMSwizzleEncoder + + + Initializes a new instance + + + Initializes a new instance of type StubGIMSwizzleEncoder + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange.GraphicsInterchangeDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GraphicsInterchangeDataFormat.GraphicsInterchangeDataFormat() + + + Sets the shim of GraphicsInterchangeDataFormat.get_Extensions() + + + Sets the shim of GraphicsInterchangeDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GraphicsInterchangeDataFormat.MakeReference() + + + Sets the shim of GraphicsInterchangeDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of GraphicsInterchangeDataFormat.get_Extensions() + + + Sets the shim of GraphicsInterchangeDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GraphicsInterchangeDataFormat.MakeReference() + + + Sets the shim of GraphicsInterchangeDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange.GraphicsInterchangeExtensionBlock + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlock() + + + Sets the shim of GraphicsInterchangeExtensionBlock.get_DataBlocks() + + + Sets the shim of GraphicsInterchangeExtensionBlock.get_ID() + + + Sets the shim of GraphicsInterchangeExtensionBlock.set_ID(Byte value) + + + Define shims for all instances members + + + Sets the shim of GraphicsInterchangeExtensionBlock.get_DataBlocks() + + + Sets the shim of GraphicsInterchangeExtensionBlock.get_ID() + + + Sets the shim of GraphicsInterchangeExtensionBlock.set_ID(Byte value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange.GraphicsInterchangeExtensionBlock+GraphicsInterchangeExtensionBlockCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.Add(Byte id, Byte[][] dataBlocks) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.GraphicsInterchangeExtensionBlockCollection() + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.Contains(Byte id) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.InsertItem(Int32 index, GraphicsInterchangeExtensionBlock item) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.get_Item(Byte id) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.Remove(Byte id) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.RemoveItem(Int32 index) + + + Define shims for all instances members + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.Add(Byte id, Byte[][] dataBlocks) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.Contains(Byte id) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.InsertItem(Int32 index, GraphicsInterchangeExtensionBlock item) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.get_Item(Byte id) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.Remove(Byte id) + + + Sets the shim of GraphicsInterchangeExtensionBlockCollection.RemoveItem(Int32 index) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange.GraphicsInterchangeDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubGraphicsInterchangeDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of GraphicsInterchangeDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GraphicsInterchangeDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GraphicsInterchangeDataFormat.MakeReference() + + + Sets the stub of GraphicsInterchangeDataFormat.MakeReference() + + + Sets the stub of GraphicsInterchangeDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of GraphicsInterchangeDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange.GraphicsInterchangeExtensionBlock + + + Initializes a new instance + + + Initializes a new instance of type StubGraphicsInterchangeExtensionBlock + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.I16.I16DataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of I16DataFormat.I16DataFormat() + + + Sets the shim of I16DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of I16DataFormat.MakeReference() + + + Sets the shim of I16DataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of I16DataFormat.I16DataFormat() + + + Define shims for all instances members + + + Sets the shim of I16DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of I16DataFormat.MakeReference() + + + Sets the shim of I16DataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.I16.I16DataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubI16DataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of I16DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of I16DataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of I16DataFormat.MakeReference() + + + Sets the stub of I16DataFormat.MakeReference() + + + Sets the stub of I16DataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of I16DataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.Icon.Microsoft.GroupICODataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of GroupICODataFormat.GroupICODataFormat() + + + Sets the shim of GroupICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GroupICODataFormat.MakeReference() + + + Sets the shim of GroupICODataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of GroupICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of GroupICODataFormat.MakeReference() + + + Sets the shim of GroupICODataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.Icon.Microsoft.ICODataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ICODataFormat.ICODataFormat() + + + Sets the shim of ICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ICODataFormat.MakeReference() + + + Sets the shim of ICODataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of ICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ICODataFormat.MakeReference() + + + Sets the shim of ICODataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.Icon.Microsoft.GroupICODataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubGroupICODataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of GroupICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GroupICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of GroupICODataFormat.MakeReference() + + + Sets the stub of GroupICODataFormat.MakeReference() + + + Sets the stub of GroupICODataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of GroupICODataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.Icon.Microsoft.ICODataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubICODataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of ICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ICODataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ICODataFormat.MakeReference() + + + Sets the stub of ICODataFormat.MakeReference() + + + Sets the stub of ICODataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of ICODataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.JPEG.JPEGDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of JPEGDataFormat.JPEGDataFormat() + + + Sets the shim of JPEGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of JPEGDataFormat.MakeReference() + + + Sets the shim of JPEGDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of JPEGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of JPEGDataFormat.MakeReference() + + + Sets the shim of JPEGDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.JPEG.JPEGDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubJPEGDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of JPEGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of JPEGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of JPEGDataFormat.MakeReference() + + + Sets the stub of JPEGDataFormat.MakeReference() + + + Sets the stub of JPEGDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of JPEGDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.LEAD.CMPDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of CMPDataFormat.CMPDataFormat() + + + Sets the shim of CMPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CMPDataFormat.MakeReference() + + + Sets the shim of CMPDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of CMPDataFormat.CMPDataFormat() + + + Define shims for all instances members + + + Sets the shim of CMPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of CMPDataFormat.MakeReference() + + + Sets the shim of CMPDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.LEAD.CMPDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubCMPDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of CMPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CMPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CMPDataFormat.MakeReference() + + + Sets the stub of CMPDataFormat.MakeReference() + + + Sets the stub of CMPDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of CMPDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics.PNGChunk + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PNGChunk.get_CRC() + + + Sets the shim of PNGChunk.set_CRC(Int32 value) + + + Sets the shim of PNGChunk.PNGChunk() + + + Sets the shim of PNGChunk.get_Data() + + + Sets the shim of PNGChunk.set_Data(Byte[] value) + + + Sets the shim of PNGChunk.get_Name() + + + Sets the shim of PNGChunk.set_Name(String value) + + + Sets the shim of PNGChunk.ToString() + + + Define shims for all instances members + + + Sets the shim of PNGChunk.get_CRC() + + + Sets the shim of PNGChunk.set_CRC(Int32 value) + + + Sets the shim of PNGChunk.get_Data() + + + Sets the shim of PNGChunk.set_Data(Byte[] value) + + + Sets the shim of PNGChunk.get_Name() + + + Sets the shim of PNGChunk.set_Name(String value) + + + Sets the shim of PNGChunk.ToString() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics.PNGChunk+PNGChunkCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Sets the shim of PNGChunkCollection.Add(String name, Byte[] data) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PNGChunkCollection.PNGChunkCollection() + + + Sets the shim of PNGChunkCollection.InsertItem(Int32 index, PNGChunk item) + + + Sets the shim of PNGChunkCollection.get_Item(String name) + + + Sets the shim of PNGChunkCollection.RemoveItem(Int32 index) + + + Define shims for all instances members + + + Sets the shim of PNGChunkCollection.Add(String name, Byte[] data) + + + Sets the shim of PNGChunkCollection.InsertItem(Int32 index, PNGChunk item) + + + Sets the shim of PNGChunkCollection.get_Item(String name) + + + Sets the shim of PNGChunkCollection.RemoveItem(Int32 index) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics.PNGDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PNGDataFormat.PNGDataFormat() + + + Sets the shim of PNGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of PNGDataFormat.MakeReference() + + + Sets the shim of PNGDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of PNGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of PNGDataFormat.MakeReference() + + + Sets the shim of PNGDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics.PNGChunk + + + Initializes a new instance + + + Initializes a new instance of type StubPNGChunk + + + Sets the stub of PNGChunk.ToString() + + + Sets the stub of PNGChunk.ToString() + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics.PNGDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubPNGDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of PNGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PNGDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PNGDataFormat.MakeReference() + + + Sets the stub of PNGDataFormat.MakeReference() + + + Sets the stub of PNGDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of PNGDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.PortablePixelmap.PPMDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PPMDataFormat.PPMDataFormat() + + + Sets the shim of PPMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of PPMDataFormat.MakeReference() + + + Sets the shim of PPMDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of PPMDataFormat.PPMDataFormat() + + + Define shims for all instances members + + + Sets the shim of PPMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of PPMDataFormat.MakeReference() + + + Sets the shim of PPMDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.PortablePixelmap.PPMDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubPPMDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of PPMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PPMDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PPMDataFormat.MakeReference() + + + Sets the stub of PPMDataFormat.MakeReference() + + + Sets the stub of PPMDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of PPMDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.TMH.TMHDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of TMHDataFormat.TMHDataFormat() + + + Sets the shim of TMHDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of TMHDataFormat.MakeReference() + + + Sets the shim of TMHDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of TMHDataFormat.TMHDataFormat() + + + Define shims for all instances members + + + Sets the shim of TMHDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of TMHDataFormat.MakeReference() + + + Sets the shim of TMHDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.TMH.TMHDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubTMHDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of TMHDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of TMHDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of TMHDataFormat.MakeReference() + + + Sets the stub of TMHDataFormat.MakeReference() + + + Sets the stub of TMHDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of TMHDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.Targa.TargaExtensionArea + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of TargaExtensionArea.get_AttributesType() + + + Sets the shim of TargaExtensionArea.set_AttributesType(Int32 value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of TargaExtensionArea.get_ColorCorrectionTable() + + + Sets the shim of TargaExtensionArea.get_ColorKey() + + + Sets the shim of TargaExtensionArea.set_ColorKey(Color value) + + + Sets the shim of TargaExtensionArea.TargaExtensionArea() + + + Sets the shim of TargaExtensionArea.get_DateCreated() + + + Sets the shim of TargaExtensionArea.set_DateCreated(DateTime value) + + + Sets the shim of TargaExtensionArea.get_Enabled() + + + Sets the shim of TargaExtensionArea.set_Enabled(Boolean value) + + + Sets the shim of TargaExtensionArea.get_GammaDenominator() + + + Sets the shim of TargaExtensionArea.set_GammaDenominator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_GammaNumerator() + + + Sets the shim of TargaExtensionArea.set_GammaNumerator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_JobTime() + + + Sets the shim of TargaExtensionArea.set_JobTime(TimeSpan value) + + + Sets the shim of TargaExtensionArea.get_PixelAspectRatioDenominator() + + + Sets the shim of TargaExtensionArea.set_PixelAspectRatioDenominator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_PixelAspectRatioNumerator() + + + Sets the shim of TargaExtensionArea.set_PixelAspectRatioNumerator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_ScanLineTable() + + + Sets the shim of TargaExtensionArea.get_SoftwareID() + + + Sets the shim of TargaExtensionArea.set_SoftwareID(String value) + + + Sets the shim of TargaExtensionArea.get_VersionString() + + + Sets the shim of TargaExtensionArea.set_VersionString(String value) + + + Define shims for all instances members + + + Sets the shim of TargaExtensionArea.get_AttributesType() + + + Sets the shim of TargaExtensionArea.set_AttributesType(Int32 value) + + + Sets the shim of TargaExtensionArea.get_ColorCorrectionTable() + + + Sets the shim of TargaExtensionArea.get_ColorKey() + + + Sets the shim of TargaExtensionArea.set_ColorKey(Color value) + + + Sets the shim of TargaExtensionArea.get_DateCreated() + + + Sets the shim of TargaExtensionArea.set_DateCreated(DateTime value) + + + Sets the shim of TargaExtensionArea.get_Enabled() + + + Sets the shim of TargaExtensionArea.set_Enabled(Boolean value) + + + Sets the shim of TargaExtensionArea.get_GammaDenominator() + + + Sets the shim of TargaExtensionArea.set_GammaDenominator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_GammaNumerator() + + + Sets the shim of TargaExtensionArea.set_GammaNumerator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_JobTime() + + + Sets the shim of TargaExtensionArea.set_JobTime(TimeSpan value) + + + Sets the shim of TargaExtensionArea.get_PixelAspectRatioDenominator() + + + Sets the shim of TargaExtensionArea.set_PixelAspectRatioDenominator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_PixelAspectRatioNumerator() + + + Sets the shim of TargaExtensionArea.set_PixelAspectRatioNumerator(Int32 value) + + + Sets the shim of TargaExtensionArea.get_ScanLineTable() + + + Sets the shim of TargaExtensionArea.get_SoftwareID() + + + Sets the shim of TargaExtensionArea.set_SoftwareID(String value) + + + Sets the shim of TargaExtensionArea.get_VersionString() + + + Sets the shim of TargaExtensionArea.set_VersionString(String value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.Targa.TrueVisionTGADataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of TrueVisionTGADataFormat.get_BytesPerPixel() + + + Sets the shim of TrueVisionTGADataFormat.set_BytesPerPixel(Int32 value) + + + Sets the shim of TrueVisionTGADataFormat.TrueVisionTGADataFormat() + + + Sets the shim of TrueVisionTGADataFormat.get_ExtensionArea() + + + Sets the shim of TrueVisionTGADataFormat.get_FormatVersion() + + + Sets the shim of TrueVisionTGADataFormat.set_FormatVersion(Int32 value) + + + Sets the shim of TrueVisionTGADataFormat.GetColorFrom2Bytes(Byte one, Byte two) + + + Sets the shim of TrueVisionTGADataFormat.GetFirstPixelDestination(TargaVerticalTransferOrder verticalTransferOrder, TargaHorizontalTransferOrder horizontalTransferOrder) + + + Sets the shim of TrueVisionTGADataFormat.GetImageDataOffset(Int32 colorMapLength, Byte imageIDLength, Byte colorMapEntrySize) + + + Sets the shim of TrueVisionTGADataFormat.get_ImageType() + + + Sets the shim of TrueVisionTGADataFormat.set_ImageType(TargaImageType value) + + + Sets the shim of TrueVisionTGADataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of TrueVisionTGADataFormat.MakeReference() + + + Sets the shim of TrueVisionTGADataFormat.get_PixelDepth() + + + Sets the shim of TrueVisionTGADataFormat.set_PixelDepth(Byte value) + + + Sets the shim of TrueVisionTGADataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of TrueVisionTGADataFormat.get_BytesPerPixel() + + + Sets the shim of TrueVisionTGADataFormat.set_BytesPerPixel(Int32 value) + + + Sets the shim of TrueVisionTGADataFormat.get_ExtensionArea() + + + Sets the shim of TrueVisionTGADataFormat.get_FormatVersion() + + + Sets the shim of TrueVisionTGADataFormat.set_FormatVersion(Int32 value) + + + Sets the shim of TrueVisionTGADataFormat.GetFirstPixelDestination(TargaVerticalTransferOrder verticalTransferOrder, TargaHorizontalTransferOrder horizontalTransferOrder) + + + Sets the shim of TrueVisionTGADataFormat.GetImageDataOffset(Int32 colorMapLength, Byte imageIDLength, Byte colorMapEntrySize) + + + Sets the shim of TrueVisionTGADataFormat.get_ImageType() + + + Sets the shim of TrueVisionTGADataFormat.set_ImageType(TargaImageType value) + + + Sets the shim of TrueVisionTGADataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of TrueVisionTGADataFormat.MakeReference() + + + Sets the shim of TrueVisionTGADataFormat.get_PixelDepth() + + + Sets the shim of TrueVisionTGADataFormat.set_PixelDepth(Byte value) + + + Sets the shim of TrueVisionTGADataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.Targa.TargaExtensionArea + + + Initializes a new instance + + + Initializes a new instance of type StubTargaExtensionArea + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.Targa.TrueVisionTGADataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubTrueVisionTGADataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of TrueVisionTGADataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of TrueVisionTGADataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of TrueVisionTGADataFormat.MakeReference() + + + Sets the stub of TrueVisionTGADataFormat.MakeReference() + + + Sets the stub of TrueVisionTGADataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of TrueVisionTGADataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.HeaderFrm + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.HuffCode + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.HuffmanTable + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.IntRef + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of IntRef.IntRef() + + + Sets the shim of IntRef.IntRef(Int32 value) + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.QuantTree + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of QuantTree.QuantTree() + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.TableDHT + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of TableDHT.TableDHT() + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.TableDTT + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.Table_DQT + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of Table_DQT.Table_DQT() + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.WSQDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of WSQDataFormat.AssertNextMarker(BinaryReader br, UInt16 ExpectedMarker) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of WSQDataFormat.BuildHuffmanCodes(HuffCode[] huffcodeTable) + + + Sets the shim of WSQDataFormat.BuildHuffmanSizes(Int32[] huffbits, Int32 maxHuffcounts) + + + Sets the shim of WSQDataFormat.BuildQTree() + + + Sets the shim of WSQDataFormat.BuildWTree(Int16 width, Int16 height) + + + Sets the shim of WSQDataFormat.WSQDataFormat() + + + Sets the shim of WSQDataFormat.DecodeHuffmanTable(BinaryReader br, Int32 size) + + + Sets the shim of WSQDataFormat.GenerateHuffmanDecodeTable(HuffCode[] huffcodeTable, Int32[] maxcode, Int32[] mincode, Int32[] valptr, Int32[] huffbits) + + + Sets the shim of WSQDataFormat.ImageToByteArray(Single[] img, Int32 width, Int32 height, Single mShift, Single rScale) + + + Sets the shim of WSQDataFormat.JoinLets(Single[] newdata, Single[] olddata, Int32 newIndex, Int32 oldIndex, Int32 len1, Int32 len2, Int32 pitch, Int32 stride, Single[] hi, Int32 hsz, Single[] lo, Int32 lsz, Int32 inv) + + + Sets the shim of WSQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of WSQDataFormat.MakeReference() + + + Sets the shim of WSQDataFormat.ProcessComment(BinaryReader br) + + + Sets the shim of WSQDataFormat.ProcessHuffmanTable(BinaryReader br) + + + Sets the shim of WSQDataFormat.ProcessQuantizationTable(BinaryReader br) + + + Sets the shim of WSQDataFormat.ProcessTable(BinaryReader br, Int32 marker) + + + Sets the shim of WSQDataFormat.ProcessTransformTable(BinaryReader br) + + + Sets the shim of WSQDataFormat.ReconstructWSQ(Single[] fdata, Int32 width, Int32 height) + + + Sets the shim of WSQDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of WSQDataFormat.WSQDataFormat() + + + Sets the shim of WSQDataFormat.Unquantize(Int32[] sip, Int32 width, Int32 height) + + + Sets the shim of WSQDataFormat.getCHuffmanTable(BinaryReader br, Int32 maxHuffcounts, Int32 bytesLeft, Boolean readTableLen) + + + Sets the shim of WSQDataFormat.intSign(Int32 power) + + + Sets the shim of WSQDataFormat.qtree16(Int32 start, Int32 lenx, Int32 leny, Int32 x, Int32 y, Int32 rw, Int32 cl) + + + Sets the shim of WSQDataFormat.qtree4(Int32 start, Int32 lenx, Int32 leny, Int32 x, Int32 y) + + + Sets the shim of WSQDataFormat.wtree4(Int32 start1, Int32 start2, Int32 lenx, Int32 leny, Int32 x, Int32 y, Int32 stop1) + + + Define shims for all instances members + + + Sets the shim of WSQDataFormat.AssertNextMarker(BinaryReader br, UInt16 ExpectedMarker) + + + Sets the shim of WSQDataFormat.BuildHuffmanCodes(HuffCode[] huffcodeTable) + + + Sets the shim of WSQDataFormat.BuildHuffmanSizes(Int32[] huffbits, Int32 maxHuffcounts) + + + Sets the shim of WSQDataFormat.BuildQTree() + + + Sets the shim of WSQDataFormat.BuildWTree(Int16 width, Int16 height) + + + Sets the shim of WSQDataFormat.DecodeHuffmanTable(BinaryReader br, Int32 size) + + + Sets the shim of WSQDataFormat.GenerateHuffmanDecodeTable(HuffCode[] huffcodeTable, Int32[] maxcode, Int32[] mincode, Int32[] valptr, Int32[] huffbits) + + + Sets the shim of WSQDataFormat.ImageToByteArray(Single[] img, Int32 width, Int32 height, Single mShift, Single rScale) + + + Sets the shim of WSQDataFormat.JoinLets(Single[] newdata, Single[] olddata, Int32 newIndex, Int32 oldIndex, Int32 len1, Int32 len2, Int32 pitch, Int32 stride, Single[] hi, Int32 hsz, Single[] lo, Int32 lsz, Int32 inv) + + + Sets the shim of WSQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of WSQDataFormat.MakeReference() + + + Sets the shim of WSQDataFormat.ProcessComment(BinaryReader br) + + + Sets the shim of WSQDataFormat.ProcessHuffmanTable(BinaryReader br) + + + Sets the shim of WSQDataFormat.ProcessQuantizationTable(BinaryReader br) + + + Sets the shim of WSQDataFormat.ProcessTable(BinaryReader br, Int32 marker) + + + Sets the shim of WSQDataFormat.ProcessTransformTable(BinaryReader br) + + + Sets the shim of WSQDataFormat.ReconstructWSQ(Single[] fdata, Int32 width, Int32 height) + + + Sets the shim of WSQDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the shim of WSQDataFormat.Unquantize(Int32[] sip, Int32 width, Int32 height) + + + Sets the shim of WSQDataFormat.getCHuffmanTable(BinaryReader br, Int32 maxHuffcounts, Int32 bytesLeft, Boolean readTableLen) + + + Sets the shim of WSQDataFormat.intSign(Int32 power) + + + Sets the shim of WSQDataFormat.qtree16(Int32 start, Int32 lenx, Int32 leny, Int32 x, Int32 y, Int32 rw, Int32 cl) + + + Sets the shim of WSQDataFormat.qtree4(Int32 start, Int32 lenx, Int32 leny, Int32 x, Int32 y) + + + Sets the shim of WSQDataFormat.wtree4(Int32 start1, Int32 start2, Int32 lenx, Int32 leny, Int32 x, Int32 y, Int32 stop1) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.WavletTree + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Define shims for all instances members + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.IntRef + + + Initializes a new instance + + + Initializes a new instance + + + Initializes a new instance of type StubIntRef + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.QuantTree + + + Initializes a new instance + + + Initializes a new instance of type StubQuantTree + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.TableDHT + + + Initializes a new instance + + + Initializes a new instance of type StubTableDHT + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.Table_DQT + + + Initializes a new instance + + + Initializes a new instance of type StubTable_DQT + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.WSQDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubWSQDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of WSQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WSQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WSQDataFormat.MakeReference() + + + Sets the stub of WSQDataFormat.MakeReference() + + + Sets the stub of WSQDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of WSQDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.Internal.Constants + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of Constants.Constants() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Picture.WebP.WebPDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of WebPDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of WebPDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of WebPDataFormat.WebPDataFormat() + + + Sets the shim of WebPDataFormat.MakeReference() + + + Sets the shim of WebPDataFormat.WebPDataFormat() + + + Define shims for all instances members + + + Sets the shim of WebPDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of WebPDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of WebPDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Picture.WebP.WebPDataFormat + + + Initializes a new instance + + + Sets the stub of WebPDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of WebPDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of WebPDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of WebPDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of RIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of RIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubWebPDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WebPDataFormat.MakeReference() + + + Sets the stub of WebPDataFormat.MakeReference() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.CDDA.CDDADataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of CDDADataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of CDDADataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of CDDADataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of CDDADataFormat.CDDADataFormat() + + + Sets the shim of CDDADataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of CDDADataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of CDDADataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of CDDADataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of CDDADataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.CDDA.CDDADataFormat + + + Initializes a new instance + + + Sets the stub of CDDADataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of CDDADataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of CDDADataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of CDDADataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of CDDADataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of CDDADataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubCDDADataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of CDDADataFormat.MakeReference() + + + Sets the stub of CDDADataFormat.MakeReference() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.ASXDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of ASXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of ASXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of ASXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ASXDataFormat.ASXDataFormat() + + + Sets the shim of ASXDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of ASXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of ASXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of ASXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of ASXDataFormat.MakeReference() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.HTMLPlaylistDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of HTMLPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of HTMLPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of HTMLPlaylistDataFormat.HTMLPlaylistDataFormat() + + + Sets the shim of HTMLPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the shim of HTMLPlaylistDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of HTMLPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of HTMLPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of HTMLPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the shim of HTMLPlaylistDataFormat.MakeReference() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.M3UDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of M3UDataFormat.M3UDataFormat() + + + Sets the shim of M3UDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of M3UDataFormat.MakeReference() + + + Sets the shim of M3UDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of M3UDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of M3UDataFormat.MakeReference() + + + Sets the shim of M3UDataFormat.SaveInternal(ObjectModel objectModel) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.NotepadPlusPlaylistDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of NotepadPlusPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NotepadPlusPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NotepadPlusPlaylistDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of NotepadPlusPlaylistDataFormat.NotepadPlusPlaylistDataFormat() + + + Sets the shim of NotepadPlusPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the shim of NotepadPlusPlaylistDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of NotepadPlusPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NotepadPlusPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NotepadPlusPlaylistDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of NotepadPlusPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the shim of NotepadPlusPlaylistDataFormat.MakeReference() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.PLSDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of PLSDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PLSDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PLSDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PLSDataFormat.PLSDataFormat() + + + Sets the shim of PLSDataFormat.MakeReference() + + + Sets the shim of PLSDataFormat.get_Version() + + + Sets the shim of PLSDataFormat.set_Version(Int32 value) + + + Define shims for all instances members + + + Sets the shim of PLSDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PLSDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PLSDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of PLSDataFormat.MakeReference() + + + Sets the shim of PLSDataFormat.get_Version() + + + Sets the shim of PLSDataFormat.set_Version(Int32 value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.SMILDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of SMILDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of SMILDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of SMILDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SMILDataFormat.SMILDataFormat() + + + Sets the shim of SMILDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the shim of SMILDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of SMILDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of SMILDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of SMILDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of SMILDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the shim of SMILDataFormat.MakeReference() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Playlist.XSPFDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of XSPFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of XSPFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of XSPFDataFormat.XSPFDataFormat() + + + Sets the shim of XSPFDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the shim of XSPFDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of XSPFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of XSPFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of XSPFDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the shim of XSPFDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.ASXDataFormat + + + Initializes a new instance + + + Sets the stub of ASXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of ASXDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of ASXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of ASXDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of ASXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of ASXDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubASXDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ASXDataFormat.MakeReference() + + + Sets the stub of ASXDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.HTMLPlaylistDataFormat + + + Initializes a new instance + + + Sets the stub of HTMLPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of HTMLPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of HTMLPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of HTMLPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubHTMLPlaylistDataFormat + + + Sets the stub of HTMLPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the stub of HTMLPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of HTMLPlaylistDataFormat.MakeReference() + + + Sets the stub of HTMLPlaylistDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.M3UDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubM3UDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of M3UDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of M3UDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of M3UDataFormat.MakeReference() + + + Sets the stub of M3UDataFormat.MakeReference() + + + Sets the stub of M3UDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of M3UDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.NotepadPlusPlaylistDataFormat + + + Initializes a new instance + + + Sets the stub of NotepadPlusPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NotepadPlusPlaylistDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NotepadPlusPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NotepadPlusPlaylistDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NotepadPlusPlaylistDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of NotepadPlusPlaylistDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubNotepadPlusPlaylistDataFormat + + + Sets the stub of NotepadPlusPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the stub of NotepadPlusPlaylistDataFormat.IsObjectModelSupported(ObjectModel omb) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of NotepadPlusPlaylistDataFormat.MakeReference() + + + Sets the stub of NotepadPlusPlaylistDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.PLSDataFormat + + + Initializes a new instance + + + Sets the stub of PLSDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PLSDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PLSDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PLSDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PLSDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of PLSDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubPLSDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of WindowsConfigurationDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of WindowsConfigurationDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of PLSDataFormat.MakeReference() + + + Sets the stub of PLSDataFormat.MakeReference() + + + Sets the stub of WindowsConfigurationDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of WindowsConfigurationDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.SMILDataFormat + + + Initializes a new instance + + + Sets the stub of SMILDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of SMILDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of SMILDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of SMILDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of SMILDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of SMILDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubSMILDataFormat + + + Sets the stub of SMILDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of SMILDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SMILDataFormat.MakeReference() + + + Sets the stub of SMILDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Playlist.XSPFDataFormat + + + Initializes a new instance + + + Sets the stub of XSPFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of XSPFDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of XSPFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of XSPFDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubXSPFDataFormat + + + Sets the stub of XSPFDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XSPFDataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XMLDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of XSPFDataFormat.MakeReference() + + + Sets the stub of XSPFDataFormat.MakeReference() + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of XMLDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.AVI.AVIDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of AVIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of AVIDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AVIDataFormat.AVIDataFormat() + + + Sets the shim of AVIDataFormat.MakeReference() + + + Define shims for all instances members + + + Sets the shim of AVIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of AVIDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the shim of AVIDataFormat.MakeReference() + + + Stub type of UniversalEditor.DataFormats.Multimedia.Video.AVI.AVIDataFormat + + + Initializes a new instance + + + Sets the stub of AVIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of AVIDataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of AVIDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of AVIDataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of RIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of RIFFDataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubAVIDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of RIFFDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of AVIDataFormat.MakeReference() + + + Sets the stub of AVIDataFormat.MakeReference() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of RIFFDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Sets the stub of RIFFDataFormat.get_RIFFTagsBigEndian() + + + Sets the stub of RIFFDataFormat.get_RIFFTagsLittleEndian() + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.RAD.Bink.BinkDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of BinkDataFormat.BinkDataFormat() + + + Sets the shim of BinkDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of BinkDataFormat.MakeReference() + + + Sets the shim of BinkDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of BinkDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of BinkDataFormat.MakeReference() + + + Sets the shim of BinkDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Video.RAD.Bink.BinkDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubBinkDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of BinkDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of BinkDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of BinkDataFormat.MakeReference() + + + Sets the stub of BinkDataFormat.MakeReference() + + + Sets the stub of BinkDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of BinkDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.RAD.Smacker.SmackerDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SmackerDataFormat.SmackerDataFormat() + + + Sets the shim of SmackerDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of SmackerDataFormat.MakeReference() + + + Sets the shim of SmackerDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of SmackerDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of SmackerDataFormat.MakeReference() + + + Sets the shim of SmackerDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Video.RAD.Smacker.SmackerDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubSmackerDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of SmackerDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SmackerDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of SmackerDataFormat.MakeReference() + + + Sets the stub of SmackerDataFormat.MakeReference() + + + Sets the stub of SmackerDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of SmackerDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.ROQ.ROQChunk + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of ROQChunk.get_Argument() + + + Sets the shim of ROQChunk.set_Argument(Int16 value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ROQChunk.ROQChunk() + + + Sets the shim of ROQChunk.get_Data() + + + Sets the shim of ROQChunk.set_Data(Byte[] value) + + + Sets the shim of ROQChunk.get_ID() + + + Sets the shim of ROQChunk.set_ID(Int16 value) + + + Define shims for all instances members + + + Sets the shim of ROQChunk.get_Argument() + + + Sets the shim of ROQChunk.set_Argument(Int16 value) + + + Sets the shim of ROQChunk.get_Data() + + + Sets the shim of ROQChunk.set_Data(Byte[] value) + + + Sets the shim of ROQChunk.get_ID() + + + Sets the shim of ROQChunk.set_ID(Int16 value) + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.ROQ.ROQChunk+ROQChunkCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ROQChunkCollection.ROQChunkCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.ROQ.ROQDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ROQDataFormat.ROQDataFormat() + + + Sets the shim of ROQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ROQDataFormat.MakeReference() + + + Sets the shim of ROQDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of ROQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of ROQDataFormat.MakeReference() + + + Sets the shim of ROQDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Video.ROQ.ROQChunk + + + Initializes a new instance + + + Initializes a new instance of type StubROQChunk + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.DataFormats.Multimedia.Video.ROQ.ROQDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubROQDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of ROQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ROQDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of ROQDataFormat.MakeReference() + + + Sets the stub of ROQDataFormat.MakeReference() + + + Sets the stub of ROQDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of ROQDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.DataFormats.Multimedia.Video.THP.THPDataFormat + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of THPDataFormat.THPDataFormat() + + + Sets the shim of THPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of THPDataFormat.MakeReference() + + + Sets the shim of THPDataFormat.SaveInternal(ObjectModel objectModel) + + + Define shims for all instances members + + + Sets the shim of THPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the shim of THPDataFormat.MakeReference() + + + Sets the shim of THPDataFormat.SaveInternal(ObjectModel objectModel) + + + Stub type of UniversalEditor.DataFormats.Multimedia.Video.THP.THPDataFormat + + + Initializes a new instance + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.AfterSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeLoadInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Sets the stub of DataFormat.BeforeSaveInternal(Stack`1<ObjectModel> objectModels) + + + Initializes a new instance of type StubTHPDataFormat + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of DataFormat.IsObjectModelSupported(ObjectModel objectModel) + + + Sets the stub of THPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of THPDataFormat.LoadInternal(ObjectModel& objectModel) + + + Sets the stub of THPDataFormat.MakeReference() + + + Sets the stub of THPDataFormat.MakeReference() + + + Sets the stub of THPDataFormat.SaveInternal(ObjectModel objectModel) + + + Sets the stub of THPDataFormat.SaveInternal(ObjectModel objectModel) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.Color + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of Color.FromArgb(Byte red, Byte green, Byte blue, Byte alpha) + + + Sets the shim of Color.FromArgb(Double red, Double green, Double blue, Double alpha) + + + Sets the shim of Color.FromArgb(Single red, Single green, Single blue, Single alpha) + + + Define shims for all instances members + + + Shim type of UniversalEditor.Colors + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of Colors.get_Black() + + + Sets the shim of Colors.get_Coral() + + + Sets the shim of Colors.get_LightGoldenrodYellow() + + + Sets the shim of Colors.get_LightGray() + + + Sets the shim of Colors.get_LightGreen() + + + Sets the shim of Colors.Colors() + + + Sets the shim of Colors.get_Transparent() + + + Sets the shim of Colors.get_White() + + + Shim type of UniversalEditor.ExtensionMethods + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of ExtensionMethods.ReadColorRGBA4444(BinaryReader br) + + + Sets the shim of ExtensionMethods.ReadColorRGBA5551(BinaryReader br) + + + Sets the shim of ExtensionMethods.ReadColorRGBA5650(BinaryReader br) + + + Sets the shim of ExtensionMethods.ReadColorRGBA8888(BinaryReader br) + + + Sets the shim of ExtensionMethods.ReadColorRGBASingle(BinaryReader br) + + + Sets the shim of ExtensionMethods.ReadColorRGBSingle(BinaryReader br) + + + Shim type of UniversalEditor.PositionVector2 + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of PositionVector2.op_Addition(PositionVector2 left, PositionVector2 right) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PositionVector2.op_Division(PositionVector2 left, PositionVector2 right) + + + Sets the shim of PositionVector2.op_Multiply(PositionVector2 left, PositionVector2 right) + + + Sets the shim of PositionVector2.PositionVector2() + + + Sets the shim of PositionVector2.op_Subtraction(PositionVector2 left, PositionVector2 right) + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.AudioObjectModel + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AudioObjectModel.AudioObjectModel() + + + Sets the shim of AudioObjectModel.get_Information() + + + Define shims for all instances members + + + Sets the shim of AudioObjectModel.get_Information() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.AudioObjectModelInformation + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of AudioObjectModelInformation.get_AlbumTitle() + + + Sets the shim of AudioObjectModelInformation.set_AlbumTitle(String value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AudioObjectModelInformation.Clear() + + + Sets the shim of AudioObjectModelInformation.get_Comments() + + + Sets the shim of AudioObjectModelInformation.set_Comments(String value) + + + Sets the shim of AudioObjectModelInformation.AudioObjectModelInformation() + + + Sets the shim of AudioObjectModelInformation.get_Creator() + + + Sets the shim of AudioObjectModelInformation.set_Creator(String value) + + + Sets the shim of AudioObjectModelInformation.get_CustomProperties() + + + Sets the shim of AudioObjectModelInformation.get_DateCreated() + + + Sets the shim of AudioObjectModelInformation.set_DateCreated(DateTime value) + + + Sets the shim of AudioObjectModelInformation.get_FadeOutDelay() + + + Sets the shim of AudioObjectModelInformation.set_FadeOutDelay(Int32 value) + + + Sets the shim of AudioObjectModelInformation.get_FadeOutLength() + + + Sets the shim of AudioObjectModelInformation.set_FadeOutLength(Int32 value) + + + Sets the shim of AudioObjectModelInformation.get_Genre() + + + Sets the shim of AudioObjectModelInformation.set_Genre(String value) + + + Sets the shim of AudioObjectModelInformation.get_SongArtist() + + + Sets the shim of AudioObjectModelInformation.set_SongArtist(String value) + + + Sets the shim of AudioObjectModelInformation.get_SongTitle() + + + Sets the shim of AudioObjectModelInformation.set_SongTitle(String value) + + + Sets the shim of AudioObjectModelInformation.get_TrackNumber() + + + Sets the shim of AudioObjectModelInformation.set_TrackNumber(Int32 value) + + + Define shims for all instances members + + + Sets the shim of AudioObjectModelInformation.get_AlbumTitle() + + + Sets the shim of AudioObjectModelInformation.set_AlbumTitle(String value) + + + Sets the shim of AudioObjectModelInformation.Clear() + + + Sets the shim of AudioObjectModelInformation.get_Comments() + + + Sets the shim of AudioObjectModelInformation.set_Comments(String value) + + + Sets the shim of AudioObjectModelInformation.get_Creator() + + + Sets the shim of AudioObjectModelInformation.set_Creator(String value) + + + Sets the shim of AudioObjectModelInformation.get_CustomProperties() + + + Sets the shim of AudioObjectModelInformation.get_DateCreated() + + + Sets the shim of AudioObjectModelInformation.set_DateCreated(DateTime value) + + + Sets the shim of AudioObjectModelInformation.get_FadeOutDelay() + + + Sets the shim of AudioObjectModelInformation.set_FadeOutDelay(Int32 value) + + + Sets the shim of AudioObjectModelInformation.get_FadeOutLength() + + + Sets the shim of AudioObjectModelInformation.set_FadeOutLength(Int32 value) + + + Sets the shim of AudioObjectModelInformation.get_Genre() + + + Sets the shim of AudioObjectModelInformation.set_Genre(String value) + + + Sets the shim of AudioObjectModelInformation.get_SongArtist() + + + Sets the shim of AudioObjectModelInformation.set_SongArtist(String value) + + + Sets the shim of AudioObjectModelInformation.get_SongTitle() + + + Sets the shim of AudioObjectModelInformation.set_SongTitle(String value) + + + Sets the shim of AudioObjectModelInformation.get_TrackNumber() + + + Sets the shim of AudioObjectModelInformation.set_TrackNumber(Int32 value) + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.AudioObjectModel + + + Initializes a new instance + + + Sets the stub of ObjectModel.Clear() + + + Sets the stub of ObjectModel.Clear() + + + Sets the stub of ObjectModel.CopyTo(ObjectModel where) + + + Sets the stub of ObjectModel.CopyTo(ObjectModel where) + + + Initializes a new instance of type StubAudioObjectModel + + + Sets the stub of ObjectModel.MakeReference() + + + Sets the stub of ObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.AudioObjectModelInformation + + + Initializes a new instance + + + Initializes a new instance of type StubAudioObjectModelInformation + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Project.AudioProjectObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AudioProjectObjectModel.Clear() + + + Sets the shim of AudioProjectObjectModel.AudioProjectObjectModel() + + + Sets the shim of AudioProjectObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of AudioProjectObjectModel.MakeReference() + + + Define shims for all instances members + + + Sets the shim of AudioProjectObjectModel.Clear() + + + Sets the shim of AudioProjectObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of AudioProjectObjectModel.MakeReference() + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Project.AudioProjectObjectModel + + + Initializes a new instance + + + Sets the stub of AudioProjectObjectModel.Clear() + + + Sets the stub of AudioProjectObjectModel.Clear() + + + Sets the stub of AudioProjectObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of AudioProjectObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubAudioProjectObjectModel + + + Sets the stub of AudioProjectObjectModel.MakeReference() + + + Sets the stub of AudioProjectObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Soundfont.SoundfontObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SoundfontObjectModel.Clear() + + + Sets the shim of SoundfontObjectModel.SoundfontObjectModel() + + + Sets the shim of SoundfontObjectModel.CopyTo(ObjectModel where) + + + Define shims for all instances members + + + Sets the shim of SoundfontObjectModel.Clear() + + + Sets the shim of SoundfontObjectModel.CopyTo(ObjectModel where) + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Soundfont.SoundfontObjectModel + + + Initializes a new instance + + + Sets the stub of SoundfontObjectModel.Clear() + + + Sets the stub of SoundfontObjectModel.Clear() + + + Sets the stub of SoundfontObjectModel.CopyTo(ObjectModel where) + + + Sets the stub of SoundfontObjectModel.CopyTo(ObjectModel where) + + + Initializes a new instance of type StubSoundfontObjectModel + + + Sets the stub of ObjectModel.MakeReference() + + + Sets the stub of ObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommand + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommand.Clone() + + + Sets the shim of SynthesizedAudioCommand.SynthesizedAudioCommand() + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioCommand.Clone() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommand+SynthesizedAudioCommandCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Sets the shim of SynthesizedAudioCommandCollection.Add(Double length) + + + Sets the shim of SynthesizedAudioCommandCollection.Add(SynthesizedAudioPredefinedNote note, Double length, Int32 octave, Single volume) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommandCollection.SynthesizedAudioCommandCollection() + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioCommandCollection.Add(Double length) + + + Sets the shim of SynthesizedAudioCommandCollection.Add(SynthesizedAudioPredefinedNote note, Double length, Int32 octave, Single volume) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandNote + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Sets the shim of SynthesizedAudioCommandNote.get_Accent() + + + Sets the shim of SynthesizedAudioCommandNote.set_Accent(Int32 value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommandNote.Clone() + + + Sets the shim of SynthesizedAudioCommandNote.SynthesizedAudioCommandNote() + + + Sets the shim of SynthesizedAudioCommandNote.get_Decay() + + + Sets the shim of SynthesizedAudioCommandNote.set_Decay(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Envelope() + + + Sets the shim of SynthesizedAudioCommandNote.set_Envelope(String[] value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Frequency() + + + Sets the shim of SynthesizedAudioCommandNote.set_Frequency(Double value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Intensity() + + + Sets the shim of SynthesizedAudioCommandNote.set_Intensity(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Length() + + + Sets the shim of SynthesizedAudioCommandNote.set_Length(Double value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Lyric() + + + Sets the shim of SynthesizedAudioCommandNote.set_Lyric(String value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Modulation() + + + Sets the shim of SynthesizedAudioCommandNote.set_Modulation(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Opening() + + + Sets the shim of SynthesizedAudioCommandNote.set_Opening(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PBType() + + + Sets the shim of SynthesizedAudioCommandNote.set_PBType(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Phoneme() + + + Sets the shim of SynthesizedAudioCommandNote.set_Phoneme(String value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PitchBendDepth() + + + Sets the shim of SynthesizedAudioCommandNote.set_PitchBendDepth(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PitchBendLength() + + + Sets the shim of SynthesizedAudioCommandNote.set_PitchBendLength(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Pitches() + + + Sets the shim of SynthesizedAudioCommandNote.set_Pitches(Double[] value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PortamentoFalling() + + + Sets the shim of SynthesizedAudioCommandNote.set_PortamentoFalling(Boolean value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PortamentoRising() + + + Sets the shim of SynthesizedAudioCommandNote.set_PortamentoRising(Boolean value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Position() + + + Sets the shim of SynthesizedAudioCommandNote.set_Position(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PreUtterance() + + + Sets the shim of SynthesizedAudioCommandNote.set_PreUtterance(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Protected() + + + Sets the shim of SynthesizedAudioCommandNote.set_Protected(Boolean value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VBR() + + + Sets the shim of SynthesizedAudioCommandNote.set_VBR(Double[] value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VibratoLength() + + + Sets the shim of SynthesizedAudioCommandNote.set_VibratoLength(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VibratoType() + + + Sets the shim of SynthesizedAudioCommandNote.set_VibratoType(SynthesizedAudioVibratoType value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VoiceOverlap() + + + Sets the shim of SynthesizedAudioCommandNote.set_VoiceOverlap(Int32 value) + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioCommandNote.get_Accent() + + + Sets the shim of SynthesizedAudioCommandNote.set_Accent(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.Clone() + + + Sets the shim of SynthesizedAudioCommandNote.get_Decay() + + + Sets the shim of SynthesizedAudioCommandNote.set_Decay(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Envelope() + + + Sets the shim of SynthesizedAudioCommandNote.set_Envelope(String[] value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Frequency() + + + Sets the shim of SynthesizedAudioCommandNote.set_Frequency(Double value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Intensity() + + + Sets the shim of SynthesizedAudioCommandNote.set_Intensity(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Length() + + + Sets the shim of SynthesizedAudioCommandNote.set_Length(Double value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Lyric() + + + Sets the shim of SynthesizedAudioCommandNote.set_Lyric(String value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Modulation() + + + Sets the shim of SynthesizedAudioCommandNote.set_Modulation(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Opening() + + + Sets the shim of SynthesizedAudioCommandNote.set_Opening(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PBType() + + + Sets the shim of SynthesizedAudioCommandNote.set_PBType(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Phoneme() + + + Sets the shim of SynthesizedAudioCommandNote.set_Phoneme(String value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PitchBendDepth() + + + Sets the shim of SynthesizedAudioCommandNote.set_PitchBendDepth(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PitchBendLength() + + + Sets the shim of SynthesizedAudioCommandNote.set_PitchBendLength(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Pitches() + + + Sets the shim of SynthesizedAudioCommandNote.set_Pitches(Double[] value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PortamentoFalling() + + + Sets the shim of SynthesizedAudioCommandNote.set_PortamentoFalling(Boolean value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PortamentoRising() + + + Sets the shim of SynthesizedAudioCommandNote.set_PortamentoRising(Boolean value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Position() + + + Sets the shim of SynthesizedAudioCommandNote.set_Position(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_PreUtterance() + + + Sets the shim of SynthesizedAudioCommandNote.set_PreUtterance(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_Protected() + + + Sets the shim of SynthesizedAudioCommandNote.set_Protected(Boolean value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VBR() + + + Sets the shim of SynthesizedAudioCommandNote.set_VBR(Double[] value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VibratoLength() + + + Sets the shim of SynthesizedAudioCommandNote.set_VibratoLength(Int32 value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VibratoType() + + + Sets the shim of SynthesizedAudioCommandNote.set_VibratoType(SynthesizedAudioVibratoType value) + + + Sets the shim of SynthesizedAudioCommandNote.get_VoiceOverlap() + + + Sets the shim of SynthesizedAudioCommandNote.set_VoiceOverlap(Int32 value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandRest + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommandRest.SynthesizedAudioCommandRest() + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandTempo + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommandTempo.Clone() + + + Sets the shim of SynthesizedAudioCommandTempo.SynthesizedAudioCommandTempo() + + + Sets the shim of SynthesizedAudioCommandTempo.SynthesizedAudioCommandTempo(Double tempo) + + + Sets the shim of SynthesizedAudioCommandTempo.get_Tempo() + + + Sets the shim of SynthesizedAudioCommandTempo.set_Tempo(Double value) + + + Sets the shim of SynthesizedAudioCommandTempo.ToString() + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioCommandTempo.Clone() + + + Sets the shim of SynthesizedAudioCommandTempo.get_Tempo() + + + Sets the shim of SynthesizedAudioCommandTempo.set_Tempo(Double value) + + + Sets the shim of SynthesizedAudioCommandTempo.ToString() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandText + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommandText.Clone() + + + Sets the shim of SynthesizedAudioCommandText.SynthesizedAudioCommandText() + + + Sets the shim of SynthesizedAudioCommandText.SynthesizedAudioCommandText(String text) + + + Sets the shim of SynthesizedAudioCommandText.get_Text() + + + Sets the shim of SynthesizedAudioCommandText.set_Text(String value) + + + Sets the shim of SynthesizedAudioCommandText.ToString() + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioCommandText.Clone() + + + Sets the shim of SynthesizedAudioCommandText.get_Text() + + + Sets the shim of SynthesizedAudioCommandText.set_Text(String value) + + + Sets the shim of SynthesizedAudioCommandText.ToString() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandTimeSignature + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioCommandTimeSignature.Clone() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.SynthesizedAudioCommandTimeSignature() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.SynthesizedAudioCommandTimeSignature(Byte numerator, Byte denominator, Byte ticksPerMetronomeClick, Byte numberOf32ndNotesPerQuarterNote) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_Denominator() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_Denominator(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_NumberOf32ndNotesPerQuarterNote() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_NumberOf32ndNotesPerQuarterNote(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_Numerator() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_Numerator(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_TicksPerMetronomeClick() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_TicksPerMetronomeClick(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.ToString() + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioCommandTimeSignature.Clone() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_Denominator() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_Denominator(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_NumberOf32ndNotesPerQuarterNote() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_NumberOf32ndNotesPerQuarterNote(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_Numerator() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_Numerator(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.get_TicksPerMetronomeClick() + + + Sets the shim of SynthesizedAudioCommandTimeSignature.set_TicksPerMetronomeClick(Byte value) + + + Sets the shim of SynthesizedAudioCommandTimeSignature.ToString() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioObjectModel.get_ChannelCount() + + + Sets the shim of SynthesizedAudioObjectModel.set_ChannelCount(Int16 value) + + + Sets the shim of SynthesizedAudioObjectModel.Clear() + + + Sets the shim of SynthesizedAudioObjectModel.SynthesizedAudioObjectModel() + + + Sets the shim of SynthesizedAudioObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of SynthesizedAudioObjectModel.MakeReference() + + + Sets the shim of SynthesizedAudioObjectModel.get_Name() + + + Sets the shim of SynthesizedAudioObjectModel.set_Name(String value) + + + Sets the shim of SynthesizedAudioObjectModel.get_Tempo() + + + Sets the shim of SynthesizedAudioObjectModel.set_Tempo(Double value) + + + Sets the shim of SynthesizedAudioObjectModel.get_Tracks() + + + Sets the shim of SynthesizedAudioObjectModel.get_Voices() + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioObjectModel.get_ChannelCount() + + + Sets the shim of SynthesizedAudioObjectModel.set_ChannelCount(Int16 value) + + + Sets the shim of SynthesizedAudioObjectModel.Clear() + + + Sets the shim of SynthesizedAudioObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of SynthesizedAudioObjectModel.MakeReference() + + + Sets the shim of SynthesizedAudioObjectModel.get_Name() + + + Sets the shim of SynthesizedAudioObjectModel.set_Name(String value) + + + Sets the shim of SynthesizedAudioObjectModel.get_Tempo() + + + Sets the shim of SynthesizedAudioObjectModel.set_Tempo(Double value) + + + Sets the shim of SynthesizedAudioObjectModel.get_Tracks() + + + Sets the shim of SynthesizedAudioObjectModel.get_Voices() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioPredefinedNoteConverter + + + Initializes a new shim instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioPredefinedNoteConverter.ChangeFrequency(Double oldFrequency, Int32 detuneBy) + + + Sets the shim of SynthesizedAudioPredefinedNoteConverter.GetFrequency(Int32 note) + + + Sets the shim of SynthesizedAudioPredefinedNoteConverter.GetFrequency(Int32 note, Int32 octave) + + + Sets the shim of SynthesizedAudioPredefinedNoteConverter.GetFrequency(SynthesizedAudioPredefinedNote note, Int32 octave) + + + Sets the shim of SynthesizedAudioPredefinedNoteConverter.GetNote(Double frequency) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioStylePlugin + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioStylePlugin.SynthesizedAudioStylePlugin() + + + Sets the shim of SynthesizedAudioStylePlugin.get_ID() + + + Sets the shim of SynthesizedAudioStylePlugin.set_ID(Guid value) + + + Sets the shim of SynthesizedAudioStylePlugin.get_Name() + + + Sets the shim of SynthesizedAudioStylePlugin.set_Name(String value) + + + Sets the shim of SynthesizedAudioStylePlugin.get_Version() + + + Sets the shim of SynthesizedAudioStylePlugin.set_Version(Version value) + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioStylePlugin.get_ID() + + + Sets the shim of SynthesizedAudioStylePlugin.set_ID(Guid value) + + + Sets the shim of SynthesizedAudioStylePlugin.get_Name() + + + Sets the shim of SynthesizedAudioStylePlugin.set_Name(String value) + + + Sets the shim of SynthesizedAudioStylePlugin.get_Version() + + + Sets the shim of SynthesizedAudioStylePlugin.set_Version(Version value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioTrack + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioTrack.Clone() + + + Sets the shim of SynthesizedAudioTrack.get_Color() + + + Sets the shim of SynthesizedAudioTrack.set_Color(Color value) + + + Sets the shim of SynthesizedAudioTrack.get_Commands() + + + Sets the shim of SynthesizedAudioTrack.get_Comment() + + + Sets the shim of SynthesizedAudioTrack.set_Comment(String value) + + + Sets the shim of SynthesizedAudioTrack.SynthesizedAudioTrack() + + + Sets the shim of SynthesizedAudioTrack.get_ID() + + + Sets the shim of SynthesizedAudioTrack.set_ID(String value) + + + Sets the shim of SynthesizedAudioTrack.get_IsMuted() + + + Sets the shim of SynthesizedAudioTrack.set_IsMuted(Boolean value) + + + Sets the shim of SynthesizedAudioTrack.get_IsSolo() + + + Sets the shim of SynthesizedAudioTrack.set_IsSolo(Boolean value) + + + Sets the shim of SynthesizedAudioTrack.get_Name() + + + Sets the shim of SynthesizedAudioTrack.set_Name(String value) + + + Sets the shim of SynthesizedAudioTrack.get_Panpot() + + + Sets the shim of SynthesizedAudioTrack.set_Panpot(Byte value) + + + Sets the shim of SynthesizedAudioTrack.get_Synthesizer() + + + Sets the shim of SynthesizedAudioTrack.set_Synthesizer(VoicebankObjectModel value) + + + Sets the shim of SynthesizedAudioTrack.get_Tempo() + + + Sets the shim of SynthesizedAudioTrack.set_Tempo(Double value) + + + Sets the shim of SynthesizedAudioTrack.get_Volume() + + + Sets the shim of SynthesizedAudioTrack.set_Volume(Byte value) + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioTrack.Clone() + + + Sets the shim of SynthesizedAudioTrack.get_Color() + + + Sets the shim of SynthesizedAudioTrack.set_Color(Color value) + + + Sets the shim of SynthesizedAudioTrack.get_Commands() + + + Sets the shim of SynthesizedAudioTrack.get_Comment() + + + Sets the shim of SynthesizedAudioTrack.set_Comment(String value) + + + Sets the shim of SynthesizedAudioTrack.get_ID() + + + Sets the shim of SynthesizedAudioTrack.set_ID(String value) + + + Sets the shim of SynthesizedAudioTrack.get_IsMuted() + + + Sets the shim of SynthesizedAudioTrack.set_IsMuted(Boolean value) + + + Sets the shim of SynthesizedAudioTrack.get_IsSolo() + + + Sets the shim of SynthesizedAudioTrack.set_IsSolo(Boolean value) + + + Sets the shim of SynthesizedAudioTrack.get_Name() + + + Sets the shim of SynthesizedAudioTrack.set_Name(String value) + + + Sets the shim of SynthesizedAudioTrack.get_Panpot() + + + Sets the shim of SynthesizedAudioTrack.set_Panpot(Byte value) + + + Sets the shim of SynthesizedAudioTrack.get_Synthesizer() + + + Sets the shim of SynthesizedAudioTrack.set_Synthesizer(VoicebankObjectModel value) + + + Sets the shim of SynthesizedAudioTrack.get_Tempo() + + + Sets the shim of SynthesizedAudioTrack.set_Tempo(Double value) + + + Sets the shim of SynthesizedAudioTrack.get_Volume() + + + Sets the shim of SynthesizedAudioTrack.set_Volume(Byte value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioTrack+SynthesizedAudioTrackCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Sets the shim of SynthesizedAudioTrackCollection.Add(SynthesizedAudioTrack item) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of SynthesizedAudioTrackCollection.SynthesizedAudioTrackCollection() + + + Sets the shim of SynthesizedAudioTrackCollection.get_Item(String ID) + + + Define shims for all instances members + + + Sets the shim of SynthesizedAudioTrackCollection.Add(SynthesizedAudioTrack item) + + + Sets the shim of SynthesizedAudioTrackCollection.get_Item(String ID) + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommand + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioCommand.Clone() + + + Sets the stub of SynthesizedAudioCommand.Clone() + + + Initializes a new instance of type StubSynthesizedAudioCommand + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandNote + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioCommandNote.Clone() + + + Sets the stub of SynthesizedAudioCommandNote.Clone() + + + Initializes a new instance of type StubSynthesizedAudioCommandNote + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandRest + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioCommandNote.Clone() + + + Sets the stub of SynthesizedAudioCommandNote.Clone() + + + Initializes a new instance of type StubSynthesizedAudioCommandRest + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandTempo + + + Initializes a new instance + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioCommandTempo.Clone() + + + Sets the stub of SynthesizedAudioCommandTempo.Clone() + + + Initializes a new instance of type StubSynthesizedAudioCommandTempo + + + Sets the stub of SynthesizedAudioCommandTempo.ToString() + + + Sets the stub of SynthesizedAudioCommandTempo.ToString() + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandText + + + Initializes a new instance + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioCommandText.Clone() + + + Sets the stub of SynthesizedAudioCommandText.Clone() + + + Initializes a new instance of type StubSynthesizedAudioCommandText + + + Sets the stub of SynthesizedAudioCommandText.ToString() + + + Sets the stub of SynthesizedAudioCommandText.ToString() + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioCommandTimeSignature + + + Initializes a new instance + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioCommandTimeSignature.Clone() + + + Sets the stub of SynthesizedAudioCommandTimeSignature.Clone() + + + Initializes a new instance of type StubSynthesizedAudioCommandTimeSignature + + + Sets the stub of SynthesizedAudioCommandTimeSignature.ToString() + + + Sets the stub of SynthesizedAudioCommandTimeSignature.ToString() + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioObjectModel + + + Initializes a new instance + + + Sets the stub of SynthesizedAudioObjectModel.Clear() + + + Sets the stub of SynthesizedAudioObjectModel.Clear() + + + Sets the stub of SynthesizedAudioObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of SynthesizedAudioObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubSynthesizedAudioObjectModel + + + Sets the stub of SynthesizedAudioObjectModel.MakeReference() + + + Sets the stub of SynthesizedAudioObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioStylePlugin + + + Initializes a new instance + + + Initializes a new instance of type StubSynthesizedAudioStylePlugin + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized.SynthesizedAudioTrack + + + Initializes a new instance + + + Initializes a new instance of type StubSynthesizedAudioTrack + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Sets the shim of VoicebankObjectModel.get_BankSelect() + + + Sets the shim of VoicebankObjectModel.set_BankSelect(Int32 value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VoicebankObjectModel.Clear() + + + Sets the shim of VoicebankObjectModel.VoicebankObjectModel() + + + Sets the shim of VoicebankObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of VoicebankObjectModel.get_CreatorVersion() + + + Sets the shim of VoicebankObjectModel.set_CreatorVersion(Version value) + + + Sets the shim of VoicebankObjectModel.get_DocumentProperties() + + + Sets the shim of VoicebankObjectModel.GetSampleFromPhoneme(String phoneme, Double frequency) + + + Sets the shim of VoicebankObjectModel.get_ID() + + + Sets the shim of VoicebankObjectModel.set_ID(String value) + + + Sets the shim of VoicebankObjectModel.get_InstallationPath() + + + Sets the shim of VoicebankObjectModel.set_InstallationPath(String value) + + + Sets the shim of VoicebankObjectModel.MakeReference() + + + Sets the shim of VoicebankObjectModel.get_ProgramChange() + + + Sets the shim of VoicebankObjectModel.set_ProgramChange(Int32 value) + + + Sets the shim of VoicebankObjectModel.get_Samples() + + + Sets the shim of VoicebankObjectModel.get_SynthesisParameters() + + + Define shims for all instances members + + + Sets the shim of VoicebankObjectModel.get_BankSelect() + + + Sets the shim of VoicebankObjectModel.set_BankSelect(Int32 value) + + + Sets the shim of VoicebankObjectModel.Clear() + + + Sets the shim of VoicebankObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of VoicebankObjectModel.get_CreatorVersion() + + + Sets the shim of VoicebankObjectModel.set_CreatorVersion(Version value) + + + Sets the shim of VoicebankObjectModel.get_DocumentProperties() + + + Sets the shim of VoicebankObjectModel.GetSampleFromPhoneme(String phoneme, Double frequency) + + + Sets the shim of VoicebankObjectModel.get_ID() + + + Sets the shim of VoicebankObjectModel.set_ID(String value) + + + Sets the shim of VoicebankObjectModel.get_InstallationPath() + + + Sets the shim of VoicebankObjectModel.set_InstallationPath(String value) + + + Sets the shim of VoicebankObjectModel.MakeReference() + + + Sets the shim of VoicebankObjectModel.get_ProgramChange() + + + Sets the shim of VoicebankObjectModel.set_ProgramChange(Int32 value) + + + Sets the shim of VoicebankObjectModel.get_Samples() + + + Sets the shim of VoicebankObjectModel.get_SynthesisParameters() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankObjectModel+VoicebankObjectModelCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VoicebankObjectModelCollection.VoicebankObjectModelCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankSample + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VoicebankSample.get_ChannelCount() + + + Sets the shim of VoicebankSample.set_ChannelCount(Int16 value) + + + Sets the shim of VoicebankSample.Clone() + + + Sets the shim of VoicebankSample.VoicebankSample() + + + Sets the shim of VoicebankSample.get_Data() + + + Sets the shim of VoicebankSample.set_Data(Byte[] value) + + + Sets the shim of VoicebankSample.get_Dummy() + + + Sets the shim of VoicebankSample.set_Dummy(Int32 value) + + + Sets the shim of VoicebankSample.get_FileName() + + + Sets the shim of VoicebankSample.set_FileName(String value) + + + Sets the shim of VoicebankSample.get_Frequency() + + + Sets the shim of VoicebankSample.set_Frequency(Int32 value) + + + Sets the shim of VoicebankSample.get_MaximumFrequency() + + + Sets the shim of VoicebankSample.set_MaximumFrequency(Int32 value) + + + Sets the shim of VoicebankSample.get_MinimumFrequency() + + + Sets the shim of VoicebankSample.set_MinimumFrequency(Int32 value) + + + Sets the shim of VoicebankSample.get_Name() + + + Sets the shim of VoicebankSample.set_Name(String value) + + + Sets the shim of VoicebankSample.get_Phoneme() + + + Sets the shim of VoicebankSample.set_Phoneme(String value) + + + Sets the shim of VoicebankSample.get_Waveform() + + + Sets the shim of VoicebankSample.set_Waveform(WaveformAudioObjectModel value) + + + Define shims for all instances members + + + Sets the shim of VoicebankSample.get_ChannelCount() + + + Sets the shim of VoicebankSample.set_ChannelCount(Int16 value) + + + Sets the shim of VoicebankSample.Clone() + + + Sets the shim of VoicebankSample.get_Data() + + + Sets the shim of VoicebankSample.set_Data(Byte[] value) + + + Sets the shim of VoicebankSample.get_Dummy() + + + Sets the shim of VoicebankSample.set_Dummy(Int32 value) + + + Sets the shim of VoicebankSample.get_FileName() + + + Sets the shim of VoicebankSample.set_FileName(String value) + + + Sets the shim of VoicebankSample.get_Frequency() + + + Sets the shim of VoicebankSample.set_Frequency(Int32 value) + + + Sets the shim of VoicebankSample.get_MaximumFrequency() + + + Sets the shim of VoicebankSample.set_MaximumFrequency(Int32 value) + + + Sets the shim of VoicebankSample.get_MinimumFrequency() + + + Sets the shim of VoicebankSample.set_MinimumFrequency(Int32 value) + + + Sets the shim of VoicebankSample.get_Name() + + + Sets the shim of VoicebankSample.set_Name(String value) + + + Sets the shim of VoicebankSample.get_Phoneme() + + + Sets the shim of VoicebankSample.set_Phoneme(String value) + + + Sets the shim of VoicebankSample.get_Waveform() + + + Sets the shim of VoicebankSample.set_Waveform(WaveformAudioObjectModel value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankSample+VoicebankSampleCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Sets the shim of VoicebankSampleCollection.Add(String Name, Byte[] data) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VoicebankSampleCollection.VoicebankSampleCollection() + + + Sets the shim of VoicebankSampleCollection.Contains(String Name) + + + Sets the shim of VoicebankSampleCollection.InsertItem(Int32 index, VoicebankSample item) + + + Sets the shim of VoicebankSampleCollection.get_Item(String Name) + + + Define shims for all instances members + + + Sets the shim of VoicebankSampleCollection.Add(String Name, Byte[] data) + + + Sets the shim of VoicebankSampleCollection.Contains(String Name) + + + Sets the shim of VoicebankSampleCollection.InsertItem(Int32 index, VoicebankSample item) + + + Sets the shim of VoicebankSampleCollection.get_Item(String Name) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankSynthesisParameters + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VoicebankSynthesisParameters.get_Breathiness() + + + Sets the shim of VoicebankSynthesisParameters.set_Breathiness(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.get_Brightness() + + + Sets the shim of VoicebankSynthesisParameters.set_Brightness(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.Clear() + + + Sets the shim of VoicebankSynthesisParameters.get_Clearness() + + + Sets the shim of VoicebankSynthesisParameters.set_Clearness(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.VoicebankSynthesisParameters() + + + Sets the shim of VoicebankSynthesisParameters.get_GenderFactor() + + + Sets the shim of VoicebankSynthesisParameters.set_GenderFactor(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.get_Openness() + + + Sets the shim of VoicebankSynthesisParameters.set_Openness(Byte value) + + + Define shims for all instances members + + + Sets the shim of VoicebankSynthesisParameters.get_Breathiness() + + + Sets the shim of VoicebankSynthesisParameters.set_Breathiness(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.get_Brightness() + + + Sets the shim of VoicebankSynthesisParameters.set_Brightness(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.Clear() + + + Sets the shim of VoicebankSynthesisParameters.get_Clearness() + + + Sets the shim of VoicebankSynthesisParameters.set_Clearness(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.get_GenderFactor() + + + Sets the shim of VoicebankSynthesisParameters.set_GenderFactor(Byte value) + + + Sets the shim of VoicebankSynthesisParameters.get_Openness() + + + Sets the shim of VoicebankSynthesisParameters.set_Openness(Byte value) + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankObjectModel + + + Initializes a new instance + + + Sets the stub of VoicebankObjectModel.Clear() + + + Sets the stub of VoicebankObjectModel.Clear() + + + Sets the stub of VoicebankObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of VoicebankObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubVoicebankObjectModel + + + Sets the stub of VoicebankObjectModel.MakeReference() + + + Sets the stub of VoicebankObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankSample + + + Initializes a new instance + + + Initializes a new instance of type StubVoicebankSample + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank.VoicebankSynthesisParameters + + + Initializes a new instance + + + Initializes a new instance of type StubVoicebankSynthesisParameters + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.Phoneme + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of Phoneme.Clone() + + + Sets the shim of Phoneme.Phoneme() + + + Sets the shim of Phoneme.get_Mappings() + + + Sets the shim of Phoneme.get_Value() + + + Sets the shim of Phoneme.set_Value(String value) + + + Define shims for all instances members + + + Sets the shim of Phoneme.Clone() + + + Sets the shim of Phoneme.get_Mappings() + + + Sets the shim of Phoneme.get_Value() + + + Sets the shim of Phoneme.set_Value(String value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.Phoneme+PhonemeCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PhonemeCollection.PhonemeCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeDictionaryObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PhonemeDictionaryObjectModel.Clear() + + + Sets the shim of PhonemeDictionaryObjectModel.PhonemeDictionaryObjectModel() + + + Sets the shim of PhonemeDictionaryObjectModel.CopyTo(ObjectModel where) + + + Sets the shim of PhonemeDictionaryObjectModel.MakeReference() + + + Sets the shim of PhonemeDictionaryObjectModel.get_PhonemeLists() + + + Sets the shim of PhonemeDictionaryObjectModel.PhonemeDictionaryObjectModel() + + + Define shims for all instances members + + + Sets the shim of PhonemeDictionaryObjectModel.Clear() + + + Sets the shim of PhonemeDictionaryObjectModel.CopyTo(ObjectModel where) + + + Sets the shim of PhonemeDictionaryObjectModel.MakeReference() + + + Sets the shim of PhonemeDictionaryObjectModel.get_PhonemeLists() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeList + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PhonemeList.Clone() + + + Sets the shim of PhonemeList.PhonemeList() + + + Sets the shim of PhonemeList.GetPhonemeFromMapping(String mapping) + + + Sets the shim of PhonemeList.get_LanguageID() + + + Sets the shim of PhonemeList.set_LanguageID(Int32 value) + + + Sets the shim of PhonemeList.get_Phonemes() + + + Define shims for all instances members + + + Sets the shim of PhonemeList.Clone() + + + Sets the shim of PhonemeList.GetPhonemeFromMapping(String mapping) + + + Sets the shim of PhonemeList.get_LanguageID() + + + Sets the shim of PhonemeList.set_LanguageID(Int32 value) + + + Sets the shim of PhonemeList.get_Phonemes() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeList+PhonemeListCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PhonemeListCollection.PhonemeListCollection() + + + Define shims for all instances members + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.Phoneme + + + Initializes a new instance + + + Initializes a new instance of type StubPhoneme + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeDictionaryObjectModel + + + Initializes a new instance + + + Sets the stub of PhonemeDictionaryObjectModel.Clear() + + + Sets the stub of PhonemeDictionaryObjectModel.Clear() + + + Sets the stub of PhonemeDictionaryObjectModel.CopyTo(ObjectModel where) + + + Sets the stub of PhonemeDictionaryObjectModel.CopyTo(ObjectModel where) + + + Initializes a new instance of type StubPhonemeDictionaryObjectModel + + + Sets the stub of PhonemeDictionaryObjectModel.MakeReference() + + + Sets the stub of PhonemeDictionaryObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary.PhonemeList + + + Initializes a new instance + + + Initializes a new instance of type StubPhonemeList + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Waveform.WaveformAudioExtendedHeader + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of WaveformAudioExtendedHeader.get_ChannelMask() + + + Sets the shim of WaveformAudioExtendedHeader.set_ChannelMask(Int32 value) + + + Sets the shim of WaveformAudioExtendedHeader.WaveformAudioExtendedHeader() + + + Sets the shim of WaveformAudioExtendedHeader.get_Enabled() + + + Sets the shim of WaveformAudioExtendedHeader.set_Enabled(Boolean value) + + + Sets the shim of WaveformAudioExtendedHeader.get_SubFormatGUID() + + + Sets the shim of WaveformAudioExtendedHeader.set_SubFormatGUID(Guid value) + + + Sets the shim of WaveformAudioExtendedHeader.get_ValidBitsPerSample() + + + Sets the shim of WaveformAudioExtendedHeader.set_ValidBitsPerSample(Int16 value) + + + Define shims for all instances members + + + Sets the shim of WaveformAudioExtendedHeader.get_ChannelMask() + + + Sets the shim of WaveformAudioExtendedHeader.set_ChannelMask(Int32 value) + + + Sets the shim of WaveformAudioExtendedHeader.get_Enabled() + + + Sets the shim of WaveformAudioExtendedHeader.set_Enabled(Boolean value) + + + Sets the shim of WaveformAudioExtendedHeader.get_SubFormatGUID() + + + Sets the shim of WaveformAudioExtendedHeader.set_SubFormatGUID(Guid value) + + + Sets the shim of WaveformAudioExtendedHeader.get_ValidBitsPerSample() + + + Sets the shim of WaveformAudioExtendedHeader.set_ValidBitsPerSample(Int16 value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Waveform.WaveformAudioHeader + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of WaveformAudioHeader.get_BitsPerSample() + + + Sets the shim of WaveformAudioHeader.set_BitsPerSample(Int16 value) + + + Sets the shim of WaveformAudioHeader.get_BlockAlignment() + + + Sets the shim of WaveformAudioHeader.set_BlockAlignment(Int16 value) + + + Sets the shim of WaveformAudioHeader.get_ChannelCount() + + + Sets the shim of WaveformAudioHeader.set_ChannelCount(Int16 value) + + + Sets the shim of WaveformAudioHeader.WaveformAudioHeader() + + + Sets the shim of WaveformAudioHeader.get_DataRate() + + + Sets the shim of WaveformAudioHeader.set_DataRate(Int32 value) + + + Sets the shim of WaveformAudioHeader.get_Format() + + + Sets the shim of WaveformAudioHeader.set_Format(WaveformAudioKnownFormat value) + + + Sets the shim of WaveformAudioHeader.get_FormatTag() + + + Sets the shim of WaveformAudioHeader.set_FormatTag(UInt16 value) + + + Sets the shim of WaveformAudioHeader.get_SampleRate() + + + Sets the shim of WaveformAudioHeader.set_SampleRate(Int32 value) + + + Define shims for all instances members + + + Sets the shim of WaveformAudioHeader.get_BitsPerSample() + + + Sets the shim of WaveformAudioHeader.set_BitsPerSample(Int16 value) + + + Sets the shim of WaveformAudioHeader.get_BlockAlignment() + + + Sets the shim of WaveformAudioHeader.set_BlockAlignment(Int16 value) + + + Sets the shim of WaveformAudioHeader.get_ChannelCount() + + + Sets the shim of WaveformAudioHeader.set_ChannelCount(Int16 value) + + + Sets the shim of WaveformAudioHeader.get_DataRate() + + + Sets the shim of WaveformAudioHeader.set_DataRate(Int32 value) + + + Sets the shim of WaveformAudioHeader.get_Format() + + + Sets the shim of WaveformAudioHeader.set_Format(WaveformAudioKnownFormat value) + + + Sets the shim of WaveformAudioHeader.get_FormatTag() + + + Sets the shim of WaveformAudioHeader.set_FormatTag(UInt16 value) + + + Sets the shim of WaveformAudioHeader.get_SampleRate() + + + Sets the shim of WaveformAudioHeader.set_SampleRate(Int32 value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Audio.Waveform.WaveformAudioObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of WaveformAudioObjectModel.Clear() + + + Sets the shim of WaveformAudioObjectModel.WaveformAudioObjectModel() + + + Sets the shim of WaveformAudioObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of WaveformAudioObjectModel.get_ExtendedHeader() + + + Sets the shim of WaveformAudioObjectModel.get_Header() + + + Sets the shim of WaveformAudioObjectModel.MakeReference() + + + Sets the shim of WaveformAudioObjectModel.get_RawData() + + + Sets the shim of WaveformAudioObjectModel.set_RawData(Byte[] value) + + + Sets the shim of WaveformAudioObjectModel.get_RawSamples() + + + Sets the shim of WaveformAudioObjectModel.set_RawSamples(Int16[] value) + + + Define shims for all instances members + + + Sets the shim of WaveformAudioObjectModel.Clear() + + + Sets the shim of WaveformAudioObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of WaveformAudioObjectModel.get_ExtendedHeader() + + + Sets the shim of WaveformAudioObjectModel.get_Header() + + + Sets the shim of WaveformAudioObjectModel.MakeReference() + + + Sets the shim of WaveformAudioObjectModel.get_RawData() + + + Sets the shim of WaveformAudioObjectModel.set_RawData(Byte[] value) + + + Sets the shim of WaveformAudioObjectModel.get_RawSamples() + + + Sets the shim of WaveformAudioObjectModel.set_RawSamples(Int16[] value) + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Waveform.WaveformAudioExtendedHeader + + + Initializes a new instance + + + Initializes a new instance of type StubWaveformAudioExtendedHeader + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Waveform.WaveformAudioHeader + + + Initializes a new instance + + + Initializes a new instance of type StubWaveformAudioHeader + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Audio.Waveform.WaveformAudioObjectModel + + + Initializes a new instance + + + Sets the stub of WaveformAudioObjectModel.Clear() + + + Sets the stub of WaveformAudioObjectModel.Clear() + + + Sets the stub of WaveformAudioObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of WaveformAudioObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubWaveformAudioObjectModel + + + Sets the stub of WaveformAudioObjectModel.MakeReference() + + + Sets the stub of WaveformAudioObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Palette.PaletteEntry + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PaletteEntry.Clone() + + + Sets the shim of PaletteEntry.get_Color() + + + Sets the shim of PaletteEntry.set_Color(Color value) + + + Sets the shim of PaletteEntry.PaletteEntry() + + + Sets the shim of PaletteEntry.get_Name() + + + Sets the shim of PaletteEntry.set_Name(String value) + + + Sets the shim of PaletteEntry.get_Selected() + + + Sets the shim of PaletteEntry.set_Selected(Boolean value) + + + Define shims for all instances members + + + Sets the shim of PaletteEntry.Clone() + + + Sets the shim of PaletteEntry.get_Color() + + + Sets the shim of PaletteEntry.set_Color(Color value) + + + Sets the shim of PaletteEntry.get_Name() + + + Sets the shim of PaletteEntry.set_Name(String value) + + + Sets the shim of PaletteEntry.get_Selected() + + + Sets the shim of PaletteEntry.set_Selected(Boolean value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Palette.PaletteEntry+PaletteEntryCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Sets the shim of PaletteEntryCollection.Add(Color color, String colorName) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PaletteEntryCollection.PaletteEntryCollection() + + + Define shims for all instances members + + + Sets the shim of PaletteEntryCollection.Add(Color color, String colorName) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Palette.PaletteObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PaletteObjectModel.Clear() + + + Sets the shim of PaletteObjectModel.PaletteObjectModel() + + + Sets the shim of PaletteObjectModel.CopyTo(ObjectModel where) + + + Sets the shim of PaletteObjectModel.get_Entries() + + + Sets the shim of PaletteObjectModel.MakeReference() + + + Sets the shim of PaletteObjectModel.PaletteObjectModel() + + + Define shims for all instances members + + + Sets the shim of PaletteObjectModel.Clear() + + + Sets the shim of PaletteObjectModel.CopyTo(ObjectModel where) + + + Sets the shim of PaletteObjectModel.get_Entries() + + + Sets the shim of PaletteObjectModel.MakeReference() + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Palette.PaletteEntry + + + Initializes a new instance + + + Initializes a new instance of type StubPaletteEntry + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Palette.PaletteObjectModel + + + Initializes a new instance + + + Sets the stub of PaletteObjectModel.Clear() + + + Sets the stub of PaletteObjectModel.Clear() + + + Sets the stub of PaletteObjectModel.CopyTo(ObjectModel where) + + + Sets the stub of PaletteObjectModel.CopyTo(ObjectModel where) + + + Initializes a new instance of type StubPaletteObjectModel + + + Sets the stub of PaletteObjectModel.MakeReference() + + + Sets the stub of PaletteObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Picture.Collection.PictureCollectionObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PictureCollectionObjectModel.Clear() + + + Sets the shim of PictureCollectionObjectModel.PictureCollectionObjectModel() + + + Sets the shim of PictureCollectionObjectModel.CopyTo(ObjectModel where) + + + Sets the shim of PictureCollectionObjectModel.MakeReference() + + + Sets the shim of PictureCollectionObjectModel.get_Pictures() + + + Define shims for all instances members + + + Sets the shim of PictureCollectionObjectModel.Clear() + + + Sets the shim of PictureCollectionObjectModel.CopyTo(ObjectModel where) + + + Sets the shim of PictureCollectionObjectModel.MakeReference() + + + Sets the shim of PictureCollectionObjectModel.get_Pictures() + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Picture.Collection.PictureCollectionObjectModel + + + Initializes a new instance + + + Sets the stub of PictureCollectionObjectModel.Clear() + + + Sets the stub of PictureCollectionObjectModel.Clear() + + + Sets the stub of PictureCollectionObjectModel.CopyTo(ObjectModel where) + + + Sets the stub of PictureCollectionObjectModel.CopyTo(ObjectModel where) + + + Initializes a new instance of type StubPictureCollectionObjectModel + + + Sets the stub of PictureCollectionObjectModel.MakeReference() + + + Sets the stub of PictureCollectionObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Picture.PictureObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PictureObjectModel.Clear() + + + Sets the shim of PictureObjectModel.ClearPixel(Int32 x, Int32 y) + + + Sets the shim of PictureObjectModel.get_ColorMap() + + + Sets the shim of PictureObjectModel.PictureObjectModel() + + + Sets the shim of PictureObjectModel.PictureObjectModel(Int32 width, Int32 height) + + + Sets the shim of PictureObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of PictureObjectModel.FromByteArray(Byte[] data, Int32 width, Int32 height) + + + Sets the shim of PictureObjectModel.GetPixel(Int32 x, Int32 y) + + + Sets the shim of PictureObjectModel.GetPixel(PositionVector2 point) + + + Sets the shim of PictureObjectModel.get_Height() + + + Sets the shim of PictureObjectModel.set_Height(Int32 value) + + + Sets the shim of PictureObjectModel.MakeReference() + + + Sets the shim of PictureObjectModel.SetPixel(Color color) + + + Sets the shim of PictureObjectModel.SetPixel(Color color, Int32 x, Int32 y) + + + Sets the shim of PictureObjectModel.ToByteArray() + + + Sets the shim of PictureObjectModel.get_Width() + + + Sets the shim of PictureObjectModel.set_Width(Int32 value) + + + Define shims for all instances members + + + Sets the shim of PictureObjectModel.Clear() + + + Sets the shim of PictureObjectModel.ClearPixel(Int32 x, Int32 y) + + + Sets the shim of PictureObjectModel.get_ColorMap() + + + Sets the shim of PictureObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of PictureObjectModel.GetPixel(Int32 x, Int32 y) + + + Sets the shim of PictureObjectModel.GetPixel(PositionVector2 point) + + + Sets the shim of PictureObjectModel.get_Height() + + + Sets the shim of PictureObjectModel.set_Height(Int32 value) + + + Sets the shim of PictureObjectModel.MakeReference() + + + Sets the shim of PictureObjectModel.SetPixel(Color color) + + + Sets the shim of PictureObjectModel.SetPixel(Color color, Int32 x, Int32 y) + + + Sets the shim of PictureObjectModel.ToByteArray() + + + Sets the shim of PictureObjectModel.get_Width() + + + Sets the shim of PictureObjectModel.set_Width(Int32 value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Picture.PictureObjectModel+PictureObjectModelCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PictureObjectModelCollection.PictureObjectModelCollection() + + + Define shims for all instances members + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Picture.PictureObjectModel + + + Initializes a new instance + + + Initializes a new instance + + + Sets the stub of PictureObjectModel.Clear() + + + Sets the stub of PictureObjectModel.Clear() + + + Sets the stub of PictureObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of PictureObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubPictureObjectModel + + + Sets the stub of PictureObjectModel.MakeReference() + + + Sets the stub of PictureObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistAlbumInformation + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of PlaylistAlbumInformation.get_Artist() + + + Sets the shim of PlaylistAlbumInformation.set_Artist(String value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PlaylistAlbumInformation.PlaylistAlbumInformation() + + + Sets the shim of PlaylistAlbumInformation.get_Title() + + + Sets the shim of PlaylistAlbumInformation.set_Title(String value) + + + Define shims for all instances members + + + Sets the shim of PlaylistAlbumInformation.get_Artist() + + + Sets the shim of PlaylistAlbumInformation.set_Artist(String value) + + + Sets the shim of PlaylistAlbumInformation.get_Title() + + + Sets the shim of PlaylistAlbumInformation.set_Title(String value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistEntry + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of PlaylistEntry.get_Abstract() + + + Sets the shim of PlaylistEntry.set_Abstract(String value) + + + Sets the shim of PlaylistEntry.get_AlbumArtImageURL() + + + Sets the shim of PlaylistEntry.set_AlbumArtImageURL(String value) + + + Sets the shim of PlaylistEntry.get_Album() + + + Sets the shim of PlaylistEntry.get_Author() + + + Sets the shim of PlaylistEntry.set_Author(String value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PlaylistEntry.Clone() + + + Sets the shim of PlaylistEntry.PlaylistEntry() + + + Sets the shim of PlaylistEntry.get_Copyright() + + + Sets the shim of PlaylistEntry.set_Copyright(String value) + + + Sets the shim of PlaylistEntry.get_CustomInformation() + + + Sets the shim of PlaylistEntry.get_FileName() + + + Sets the shim of PlaylistEntry.set_FileName(String value) + + + Sets the shim of PlaylistEntry.get_Length() + + + Sets the shim of PlaylistEntry.set_Length(Int64 value) + + + Sets the shim of PlaylistEntry.get_Offset() + + + Sets the shim of PlaylistEntry.set_Offset(Int64 value) + + + Sets the shim of PlaylistEntry.get_Title() + + + Sets the shim of PlaylistEntry.set_Title(String value) + + + Sets the shim of PlaylistEntry.get_TrackNumber() + + + Sets the shim of PlaylistEntry.set_TrackNumber(Int32 value) + + + Define shims for all instances members + + + Sets the shim of PlaylistEntry.get_Abstract() + + + Sets the shim of PlaylistEntry.set_Abstract(String value) + + + Sets the shim of PlaylistEntry.get_AlbumArtImageURL() + + + Sets the shim of PlaylistEntry.set_AlbumArtImageURL(String value) + + + Sets the shim of PlaylistEntry.get_Album() + + + Sets the shim of PlaylistEntry.get_Author() + + + Sets the shim of PlaylistEntry.set_Author(String value) + + + Sets the shim of PlaylistEntry.Clone() + + + Sets the shim of PlaylistEntry.get_Copyright() + + + Sets the shim of PlaylistEntry.set_Copyright(String value) + + + Sets the shim of PlaylistEntry.get_CustomInformation() + + + Sets the shim of PlaylistEntry.get_FileName() + + + Sets the shim of PlaylistEntry.set_FileName(String value) + + + Sets the shim of PlaylistEntry.get_Length() + + + Sets the shim of PlaylistEntry.set_Length(Int64 value) + + + Sets the shim of PlaylistEntry.get_Offset() + + + Sets the shim of PlaylistEntry.set_Offset(Int64 value) + + + Sets the shim of PlaylistEntry.get_Title() + + + Sets the shim of PlaylistEntry.set_Title(String value) + + + Sets the shim of PlaylistEntry.get_TrackNumber() + + + Sets the shim of PlaylistEntry.set_TrackNumber(Int32 value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistEntry+PlaylistEntryCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PlaylistEntryCollection.PlaylistEntryCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Sets the shim of PlaylistObjectModel.get_Abstract() + + + Sets the shim of PlaylistObjectModel.set_Abstract(String value) + + + Sets the shim of PlaylistObjectModel.get_Author() + + + Sets the shim of PlaylistObjectModel.set_Author(String value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of PlaylistObjectModel.Clear() + + + Sets the shim of PlaylistObjectModel.PlaylistObjectModel() + + + Sets the shim of PlaylistObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of PlaylistObjectModel.get_Copyright() + + + Sets the shim of PlaylistObjectModel.set_Copyright(String value) + + + Sets the shim of PlaylistObjectModel.get_CustomInformation() + + + Sets the shim of PlaylistObjectModel.get_Entries() + + + Sets the shim of PlaylistObjectModel.get_ID() + + + Sets the shim of PlaylistObjectModel.set_ID(Guid value) + + + Sets the shim of PlaylistObjectModel.MakeReference() + + + Sets the shim of PlaylistObjectModel.get_Title() + + + Sets the shim of PlaylistObjectModel.set_Title(String value) + + + Define shims for all instances members + + + Sets the shim of PlaylistObjectModel.get_Abstract() + + + Sets the shim of PlaylistObjectModel.set_Abstract(String value) + + + Sets the shim of PlaylistObjectModel.get_Author() + + + Sets the shim of PlaylistObjectModel.set_Author(String value) + + + Sets the shim of PlaylistObjectModel.Clear() + + + Sets the shim of PlaylistObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of PlaylistObjectModel.get_Copyright() + + + Sets the shim of PlaylistObjectModel.set_Copyright(String value) + + + Sets the shim of PlaylistObjectModel.get_CustomInformation() + + + Sets the shim of PlaylistObjectModel.get_Entries() + + + Sets the shim of PlaylistObjectModel.get_ID() + + + Sets the shim of PlaylistObjectModel.set_ID(Guid value) + + + Sets the shim of PlaylistObjectModel.MakeReference() + + + Sets the shim of PlaylistObjectModel.get_Title() + + + Sets the shim of PlaylistObjectModel.set_Title(String value) + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistAlbumInformation + + + Initializes a new instance + + + Initializes a new instance of type StubPlaylistAlbumInformation + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistEntry + + + Initializes a new instance + + + Initializes a new instance of type StubPlaylistEntry + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Playlist.PlaylistObjectModel + + + Initializes a new instance + + + Sets the stub of PlaylistObjectModel.Clear() + + + Sets the stub of PlaylistObjectModel.Clear() + + + Sets the stub of PlaylistObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of PlaylistObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubPlaylistObjectModel + + + Sets the stub of PlaylistObjectModel.MakeReference() + + + Sets the stub of PlaylistObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.AudioTrack + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AudioTrack.Clone() + + + Sets the shim of AudioTrack.AudioTrack() + + + Sets the shim of AudioTrack.get_Name() + + + Sets the shim of AudioTrack.set_Name(String value) + + + Sets the shim of AudioTrack.get_ObjectModel() + + + Sets the shim of AudioTrack.set_ObjectModel(WaveformAudioObjectModel value) + + + Define shims for all instances members + + + Sets the shim of AudioTrack.Clone() + + + Sets the shim of AudioTrack.get_Name() + + + Sets the shim of AudioTrack.set_Name(String value) + + + Sets the shim of AudioTrack.get_ObjectModel() + + + Sets the shim of AudioTrack.set_ObjectModel(WaveformAudioObjectModel value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.AudioTrack+AudioTrackCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AudioTrackCollection.AudioTrackCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.VideoFrame + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VideoFrame.Clone() + + + Sets the shim of VideoFrame.VideoFrame() + + + Sets the shim of VideoFrame.get_ObjectModel() + + + Sets the shim of VideoFrame.set_ObjectModel(PictureObjectModel value) + + + Define shims for all instances members + + + Sets the shim of VideoFrame.Clone() + + + Sets the shim of VideoFrame.get_ObjectModel() + + + Sets the shim of VideoFrame.set_ObjectModel(PictureObjectModel value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.VideoFrame+VideoFrameCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VideoFrameCollection.VideoFrameCollection() + + + Define shims for all instances members + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.VideoObjectModel + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Sets the shim of VideoObjectModel.get_AudioTracks() + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VideoObjectModel.Clear() + + + Sets the shim of VideoObjectModel.VideoObjectModel() + + + Sets the shim of VideoObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of VideoObjectModel.MakeReference() + + + Sets the shim of VideoObjectModel.get_VideoTracks() + + + Define shims for all instances members + + + Sets the shim of VideoObjectModel.get_AudioTracks() + + + Sets the shim of VideoObjectModel.Clear() + + + Sets the shim of VideoObjectModel.CopyTo(ObjectModel destination) + + + Sets the shim of VideoObjectModel.MakeReference() + + + Sets the shim of VideoObjectModel.get_VideoTracks() + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.VideoTrack + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VideoTrack.get_BlockDimension() + + + Sets the shim of VideoTrack.set_BlockDimension(Int32 value) + + + Sets the shim of VideoTrack.Clone() + + + Sets the shim of VideoTrack.VideoTrack() + + + Sets the shim of VideoTrack.get_FrameRate() + + + Sets the shim of VideoTrack.set_FrameRate(Int32 value) + + + Sets the shim of VideoTrack.get_Frames() + + + Sets the shim of VideoTrack.get_Height() + + + Sets the shim of VideoTrack.set_Height(Int32 value) + + + Sets the shim of VideoTrack.get_Name() + + + Sets the shim of VideoTrack.set_Name(String value) + + + Sets the shim of VideoTrack.get_SubBlockDimension() + + + Sets the shim of VideoTrack.set_SubBlockDimension(Int32 value) + + + Sets the shim of VideoTrack.get_Width() + + + Sets the shim of VideoTrack.set_Width(Int32 value) + + + Define shims for all instances members + + + Sets the shim of VideoTrack.get_BlockDimension() + + + Sets the shim of VideoTrack.set_BlockDimension(Int32 value) + + + Sets the shim of VideoTrack.Clone() + + + Sets the shim of VideoTrack.get_FrameRate() + + + Sets the shim of VideoTrack.set_FrameRate(Int32 value) + + + Sets the shim of VideoTrack.get_Frames() + + + Sets the shim of VideoTrack.get_Height() + + + Sets the shim of VideoTrack.set_Height(Int32 value) + + + Sets the shim of VideoTrack.get_Name() + + + Sets the shim of VideoTrack.set_Name(String value) + + + Sets the shim of VideoTrack.get_SubBlockDimension() + + + Sets the shim of VideoTrack.set_SubBlockDimension(Int32 value) + + + Sets the shim of VideoTrack.get_Width() + + + Sets the shim of VideoTrack.set_Width(Int32 value) + + + Shim type of UniversalEditor.ObjectModels.Multimedia.Video.VideoTrack+VideoTrackCollection + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Binds the members of the interface to the shim. + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of VideoTrackCollection.VideoTrackCollection() + + + Define shims for all instances members + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Video.AudioTrack + + + Initializes a new instance + + + Initializes a new instance of type StubAudioTrack + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Video.VideoFrame + + + Initializes a new instance + + + Initializes a new instance of type StubVideoFrame + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Video.VideoObjectModel + + + Initializes a new instance + + + Sets the stub of VideoObjectModel.Clear() + + + Sets the stub of VideoObjectModel.Clear() + + + Sets the stub of VideoObjectModel.CopyTo(ObjectModel destination) + + + Sets the stub of VideoObjectModel.CopyTo(ObjectModel destination) + + + Initializes a new instance of type StubVideoObjectModel + + + Sets the stub of VideoObjectModel.MakeReference() + + + Sets the stub of VideoObjectModel.MakeReference() + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Sets the stub of ObjectModel.Replace(String FindWhat, String ReplaceWith) + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Stub type of UniversalEditor.ObjectModels.Multimedia.Video.VideoTrack + + + Initializes a new instance + + + Initializes a new instance of type StubVideoTrack + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + Shim type of UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.AudioObjectModelDocumentProperties + + + Initializes a new shim instance + + + Initializes a new shim for the given instance + + + Assigns the 'Current' behavior for all methods of the shimmed type + + + Assigns the 'NotImplemented' behavior for all methods of the shimmed type + + + Sets the shim of AudioObjectModelDocumentProperties.get_AlbumTitle() + + + Sets the shim of AudioObjectModelDocumentProperties.set_AlbumTitle(String value) + + + Assigns the behavior for all methods of the shimmed type + + + Sets the shim of AudioObjectModelDocumentProperties.get_Comments() + + + Sets the shim of AudioObjectModelDocumentProperties.set_Comments(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.AudioObjectModelDocumentProperties() + + + Sets the shim of AudioObjectModelDocumentProperties.get_Creator() + + + Sets the shim of AudioObjectModelDocumentProperties.set_Creator(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_DateCreated() + + + Sets the shim of AudioObjectModelDocumentProperties.set_DateCreated(DateTime value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_FadeOutDelay() + + + Sets the shim of AudioObjectModelDocumentProperties.set_FadeOutDelay(Int32 value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_FadeOutLength() + + + Sets the shim of AudioObjectModelDocumentProperties.set_FadeOutLength(Int32 value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_GeneratorAuthor() + + + Sets the shim of AudioObjectModelDocumentProperties.set_GeneratorAuthor(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_GeneratorTitle() + + + Sets the shim of AudioObjectModelDocumentProperties.set_GeneratorTitle(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_GeneratorVersion() + + + Sets the shim of AudioObjectModelDocumentProperties.set_GeneratorVersion(Version value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_SongArtist() + + + Sets the shim of AudioObjectModelDocumentProperties.set_SongArtist(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_SongTitle() + + + Sets the shim of AudioObjectModelDocumentProperties.set_SongTitle(String value) + + + Define shims for all instances members + + + Sets the shim of AudioObjectModelDocumentProperties.get_AlbumTitle() + + + Sets the shim of AudioObjectModelDocumentProperties.set_AlbumTitle(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_Comments() + + + Sets the shim of AudioObjectModelDocumentProperties.set_Comments(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_Creator() + + + Sets the shim of AudioObjectModelDocumentProperties.set_Creator(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_DateCreated() + + + Sets the shim of AudioObjectModelDocumentProperties.set_DateCreated(DateTime value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_FadeOutDelay() + + + Sets the shim of AudioObjectModelDocumentProperties.set_FadeOutDelay(Int32 value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_FadeOutLength() + + + Sets the shim of AudioObjectModelDocumentProperties.set_FadeOutLength(Int32 value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_GeneratorAuthor() + + + Sets the shim of AudioObjectModelDocumentProperties.set_GeneratorAuthor(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_GeneratorTitle() + + + Sets the shim of AudioObjectModelDocumentProperties.set_GeneratorTitle(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_GeneratorVersion() + + + Sets the shim of AudioObjectModelDocumentProperties.set_GeneratorVersion(Version value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_SongArtist() + + + Sets the shim of AudioObjectModelDocumentProperties.set_SongArtist(String value) + + + Sets the shim of AudioObjectModelDocumentProperties.get_SongTitle() + + + Sets the shim of AudioObjectModelDocumentProperties.set_SongTitle(String value) + + + Stub type of UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.AudioObjectModelDocumentProperties + + + Initializes a new instance + + + Initializes a new instance of type StubAudioObjectModelDocumentProperties + + + Gets or sets a value that indicates if the base method should be called instead of the fallback behavior + + + Gets or sets the instance behavior. + + + Gets or sets the instance observer. + + + diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/HostApplication.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/HostApplication.cs new file mode 100644 index 00000000..07d72627 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/HostApplication.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public static class HostApplication + { + private static IHostApplicationWindow mvarCurrentWindow = null; + public static IHostApplicationWindow CurrentWindow { get { return mvarCurrentWindow; } set { mvarCurrentWindow = value; } } + + private static HostApplicationOutputWindow mvarOutputWindow = new HostApplicationOutputWindow(); + public static HostApplicationOutputWindow OutputWindow { get { return mvarOutputWindow; } set { mvarOutputWindow = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IHostApplicationWindow.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IHostApplicationWindow.cs new file mode 100644 index 00000000..93c26300 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IHostApplicationWindow.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public interface IHostApplicationWindow + { + void NewFile(); + void NewProject(); + + void OpenFile(); + void OpenFile(params string[] FileNames); + void OpenProject(); + void OpenProject(string FileName); + + void SaveFile(); + void SaveFileAs(); + void SaveFileAs(string FileName, DataFormat df); + + void SaveProject(); + void SaveProjectAs(); + void SaveProjectAs(string FileName); + + void SaveAll(); + + void ToggleMenuItemEnabled(string menuItemName, bool enabled); + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IconMethods.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IconMethods.cs new file mode 100644 index 00000000..61921219 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/IconMethods.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.IO; + +internal static class IconMethods +{ + public enum IconSize + { + Large, + Small + } + private static class Internal + { + #region Old ExtractAssociatedIcon + public static HandleRef NullHandleRef = default(HandleRef); + [DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon", CharSet = CharSet.Auto)] + public static extern IntPtr IntExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index); + public static IntPtr ExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index) + { + return IntExtractAssociatedIcon(hInst, iconPath, ref index); + } + #endregion + #region New ExtractIconEx + [DllImport("shell32.dll", EntryPoint = "ExtractIconEx")] + public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons); + + #endregion + } + + #region Old ExtractAssociatedIcon + private static Icon __ExtractAssociatedIcon(string filePath, int index) + { + Uri uri = null; + if ((filePath == null)) + { + throw new ArgumentException("Argument cannot be null.", "filePath"); + } + try + { + uri = new Uri(filePath); + } + catch (UriFormatException) + { + filePath = Path.GetFullPath(filePath); + uri = new Uri(filePath); + } + //If uri.IsUnc Then + // Throw New ArgumentException("File path cannot be a UNC path.", "filePath") + //End If + if (uri.IsFile | uri.IsUnc) + { + if (!File.Exists(filePath)) + { + throw new FileNotFoundException(filePath); + } + System.Text.StringBuilder iconPath = new System.Text.StringBuilder(260); + iconPath.Append(filePath); + IntPtr handle = Internal.ExtractAssociatedIcon(Internal.NullHandleRef, iconPath, ref index); + if ((handle != IntPtr.Zero)) + { + return Icon.FromHandle(handle); + } + } + return null; + } + #endregion + #region New ExtractIconEx + private static Icon __EIEExtractAssociatedIcon(string filePath, int index, IconSize size) + { + IntPtr[] phiconLarge = new IntPtr[] { IntPtr.Zero }; + IntPtr[] phiconSmall = new IntPtr[] { IntPtr.Zero }; + + Internal.ExtractIconEx(filePath, index, phiconLarge, phiconSmall, 1); + + switch (size) + { + case IconSize.Large: + try + { + return Icon.FromHandle(phiconLarge[0]); + } + catch (ArgumentException) + { + return null; + } + case IconSize.Small: + try + { + return Icon.FromHandle(phiconSmall[0]); + } + catch (ArgumentException) + { + return null; + } + } + return null; + } + #endregion + + public static Icon ExtractFileTypeIcon(string filePath) + { + string ext = System.IO.Path.GetExtension(filePath); + + string iconPath = String.Empty; + int iconIndex = 0; + + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + { + break; + } + case PlatformID.Unix: + { + break; + } + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + // TODO: Implement something that uses along the lines of MIME info + // specification + + /* + http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html + + + + + MS Word Files + + + + */ + + Microsoft.Win32.RegistryKey rkExt = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); + + string className = rkExt.GetValue(String.Empty, String.Empty).ToString(); + Microsoft.Win32.RegistryKey rkClass = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(className); + if (rkClass != null) + { + Microsoft.Win32.RegistryKey rkDefaultIcon = rkClass.OpenSubKey("DefaultIcon"); + if (rkDefaultIcon != null) + { + string defaultIconPath = rkDefaultIcon.GetValue(String.Empty, String.Empty).ToString(); + int splitIndex = defaultIconPath.LastIndexOf(','); + + string defaultIconFileName = defaultIconPath.Substring(0, splitIndex); + string defaultIconIndex = defaultIconPath.Substring(splitIndex + 1); + + Int32.TryParse(defaultIconIndex, out iconIndex); + if (defaultIconFileName.StartsWith("\"")) + { + defaultIconFileName = defaultIconFileName.Substring(1); + } + if (defaultIconFileName.EndsWith("\"")) + { + defaultIconFileName = defaultIconFileName.Substring(0, defaultIconFileName.Length - 1); + } + + iconPath = defaultIconFileName; + } + } + break; + } + } + + + Icon icon = ExtractAssociatedIcon(iconPath, iconIndex); + return icon; + } + + public static Icon ExtractAssociatedIcon(string filePath, int index = 0) + { + return ExtractAssociatedIcon(filePath, index, IconSize.Large); + } + public static Icon ExtractAssociatedIcon(string filePath, int index, IconSize size) + { + Icon icon = null; + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + // TODO: Mac OS X support? + break; + case PlatformID.Unix: + break; + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + icon = __EIEExtractAssociatedIcon(filePath, index, size); + break; + case PlatformID.Xbox: + break; + } + return icon; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ImageListExtensionMethods.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ImageListExtensionMethods.cs new file mode 100644 index 00000000..8a8f9f28 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/ImageListExtensionMethods.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public static class ImageListExtensionMethods + { + public static void PopulateSystemIcons(this System.Windows.Forms.TreeView tv) + { + System.Windows.Forms.ImageList iml = new System.Windows.Forms.ImageList(); + iml.ImageSize = new Size(16, 16); + iml.PopulateSystemIcons(); + + tv.ImageList = iml; + } + public static void PopulateSystemIcons(this System.Windows.Forms.ListView lv) + { + System.Windows.Forms.ImageList imlSmallIcons = new System.Windows.Forms.ImageList(); + imlSmallIcons.ImageSize = new Size(16, 16); + System.Windows.Forms.ImageList imlLargeIcons = new System.Windows.Forms.ImageList(); + imlLargeIcons.ImageSize = new Size(32, 32); + + lv.LargeImageList = imlLargeIcons; + lv.SmallImageList = imlSmallIcons; + } + public static void PopulateSystemIcons(this System.Windows.Forms.ImageList iml) + { + switch (Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + break; + case PlatformID.Unix: + break; + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + string strSize = "32x32"; + IconMethods.IconSize icnSize = IconMethods.IconSize.Large; + + if (iml.ImageSize.Width == 16 && iml.ImageSize.Height == 16) + { + strSize = "16x16"; + icnSize = IconMethods.IconSize.Small; + } + + Image imageFile = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ImageList/" + strSize + "/generic-file.png"); + if (imageFile != null) + { + iml.Images.Add("generic-file", imageFile); + } + else + { + Icon iconFile = IconMethods.ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, icnSize); + iml.Images.Add("generic-file", iconFile); + } + + Image imageDocument = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ImageList/" + strSize + "/generic-document.png"); + if (imageDocument != null) + { + iml.Images.Add("generic-document", imageDocument); + } + else + { + Icon iconDocument = IconMethods.ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, icnSize); + iml.Images.Add("generic-document", iconDocument); + } + + Image imageApplication = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ImageList/" + strSize + "/generic-application.png"); + if (imageApplication != null) + { + iml.Images.Add("generic-application", imageApplication); + } + else + { + Icon iconApplication = IconMethods.ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, icnSize); + iml.Images.Add("generic-application", iconApplication); + } + + Image imageFolderClosed = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ImageList/" + strSize + "/generic-folder-closed.png"); + if (imageFolderClosed != null) + { + iml.Images.Add("generic-folder-closed", imageFolderClosed); + } + else + { + Icon iconFolderClosed = IconMethods.ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, icnSize); + iml.Images.Add("generic-folder-closed", iconFolderClosed); + } + + Image imageFolderOpen = AwesomeControls.Theming.Theme.CurrentTheme.GetImage("ImageList/" + strSize + "/generic-folder-open.png"); + if (imageFolderOpen != null) + { + iml.Images.Add("generic-folder-open", imageFolderOpen); + } + else + { + Icon iconFolderOpen = IconMethods.ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, icnSize); + iml.Images.Add("generic-folder-open", iconFolderOpen); + } + return; + } + } + // throw new PlatformNotSupportedException(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/MenuBar.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/MenuBar.cs new file mode 100644 index 00000000..8ebc1d77 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/MenuBar.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public class MenuBar + { + private MenuItem.MenuItemCollection mvarItems = new MenuItem.MenuItemCollection(); + public MenuItem.MenuItemCollection Items { get { return mvarItems; } } + } + public abstract class MenuItem + { + public class MenuItemCollection + : System.Collections.ObjectModel.Collection + { + private System.Collections.Generic.Dictionary itemsByName = new Dictionary(); + + public ActionMenuItem Add(string name, string title) + { + return Add(name, title, null); + } + public ActionMenuItem Add(string name, string title, EventHandler onClick) + { + return Add(name, title, onClick, Count); + } + public ActionMenuItem Add(string name, string title, EventHandler onClick, int position) + { + ActionMenuItem item = new ActionMenuItem(name, title); + if (onClick != null) + { + item.Click += onClick; + } + item.Position = position; + Add(item); + return item; + } + public SeparatorMenuItem AddSeparator() + { + return AddSeparator(Count); + } + public SeparatorMenuItem AddSeparator(int position) + { + SeparatorMenuItem item = new SeparatorMenuItem(); + item.Position = position; + Add(item); + return item; + } + + public MenuItem this[string name] + { + get + { + return itemsByName[name]; + } + } + + public bool Contains(string name) + { + return itemsByName.ContainsKey(name); + } + public bool Remove(string name) + { + if (itemsByName.ContainsKey(name)) + { + base.Remove(itemsByName[name]); + return true; + } + return false; + } + + protected override void InsertItem(int index, MenuItem item) + { + item.mvarParent = this; + base.InsertItem(index, item); + itemsByName.Add(item.Name, item); + } + protected override void RemoveItem(int index) + { + this[index].mvarParent = null; + itemsByName.Remove(this[index].Name); + base.RemoveItem(index); + } + + internal void UpdateName(MenuItem item, string oldName) + { + itemsByName.Remove(oldName); + itemsByName.Add(item.Name, item); + } + } + + private MenuItemCollection mvarParent = null; + + private string mvarName = String.Empty; + public string Name + { + get { return mvarName; } + set + { + string oldName = mvarName; mvarName = value; + if (mvarParent != null) + { + mvarParent.UpdateName(this, oldName); + } + } + } + + private int mvarPosition = -1; + public int Position { get { return mvarPosition; } set { mvarPosition = value; } } + } + public class ActionMenuItem : MenuItem + { + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private MenuItem.MenuItemCollection mvarItems = new MenuItem.MenuItemCollection(); + public MenuItem.MenuItemCollection Items { get { return mvarItems; } } + + public event EventHandler Click; + + public ActionMenuItem(string title) + { + base.Name = title; + mvarTitle = title; + } + public ActionMenuItem(string name, string title) + { + base.Name = name; + mvarTitle = title; + } + + + public void OnClick(EventArgs e) + { + if (Click != null) + { + Click(this, e); + } + } + } + public class SeparatorMenuItem : MenuItem + { + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.Designer.cs new file mode 100644 index 00000000..d3ec3451 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.UserInterface.WindowsForms +{ + partial class OptionPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.cs new file mode 100644 index 00000000..c63e056a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/OptionPanel.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public partial class OptionPanel : UserControl, IOptionPanelImplementation + { + public OptionPanel() + { + InitializeComponent(); + mvarOptionGroups = base.GetType().FullName.Split(new char[] { '.' }); + } + + public virtual void LoadSettings() + { + } + public virtual void SaveSettings() + { + } + public virtual void ResetSettings() + { + } + + private string[] mvarOptionGroups = null; + public virtual string[] OptionGroups + { + get { return mvarOptionGroups; } + } + + public virtual bool IsAvailable + { + get { return false; } + } + + private Image mvarIconImage = null; + public Image IconImage { get { return mvarIconImage; } set { mvarIconImage = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..f94a0b0b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor Windows Forms user interface library")] +[assembly: AssemblyDescription("Contains user interface components used in the Windows Forms version of Universal Editor.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2012-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("709317af-c7d4-4936-9b85-6a5e49fdbfdc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.Designer.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.Designer.cs new file mode 100644 index 00000000..8ff68cd7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AddExisting { + get { + object obj = ResourceManager.GetObject("AddExisting", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AddNew { + get { + object obj = ResourceManager.GetObject("AddNew", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap AddNewFolder { + get { + object obj = ResourceManager.GetObject("AddNewFolder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.resx b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.resx new file mode 100644 index 00000000..c4f13e95 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\AddExisting.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AddNew.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\AddNewFolder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddExisting.png b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddExisting.png new file mode 100644 index 0000000000000000000000000000000000000000..09c9c57c1cf6acf85717f46bc6c30b52bbe6e6ff GIT binary patch literal 555 zcmV+`0@VG9P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu0 z6apgU@!5+20013nR9JLFZ*6U5Zgc_CX>@2HM@dakWG-a~0004k zNkl%c!&1@Q9qhp6kCs;Y>H(n1O( zN79L&{dZ=D^x)3*zh=L2dnp0xx;imbfGdy!^S~V3gV6)`U~(`4pazfvfM{TEX*;ER zu(eU~^vNeoxjesnmP@Y|Fpoo`8o=EF__nqUM6w4oO+(HD7tmY-z&tqU4InL;<>B&+ zdns8de`WP*kqsuXclSMGu`}sT0Z=4Urk^0DymL=x_spd2hT|3zVB>Se`OT^<1Q*^s z=i=fy+=aPV-oMF}w{w`m&u%Wz4!Z1&N;bPuN!-@Q!}F6 zhvIxUdaw(p_gME`Kj;}^@T~54Pg^afJJ&A%kE7xN&#c5TWNN>9v`g%N%h1N1# zZ&QA6V%2rHJon8z6`g;)=Xhwf7Rg;=!kt_)1W1*NTAB3$Ivxi{%1Ni-_dOK2?qTwY!K40RaBcsuwVKh6En4ECH z4ml!Q%N$q-&5pV>&A^}tS4b`b;0yy@l%_df#D+(dHVv4jA=csBmBL9Ojrfbp=^Mek zugXzSU2E_+KNL)x1OT!si`@+~Xv0;sVVy_ypR+Iwps&n^0JO2tMMDk#-G&Cu?qX|T zJwHLiTOr~p)9L?FDE@iX9rC$$-nPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu0 z6aWYed~)9a00JmUL_t(I%cYaeOH@%5z<+NV#__9cW=tc?UDQg4f<6c|l6JXi;YO%k z1yQu}F9;IJpj8x=>lQ77B7(A6G%ZqxKwO1rnpvg}IPdvB?zyMM8%>Ic@WA167w4Sc z`CYD~s%$5cGw-fzV{RXfnI`6ocW66)8PBh!vf|Q~zv29|LAL!Ut5bK$w)Rnz&6BEC zzLxH>(r}*9XGImUSo>$HDyoVTEZx^s+CaLK%F-eY&CTFXf}~;B1>o-xC(d0WIs0~y znp_9j!>!cqJi93$^t;8ri|vSczN19f&BIPqi@C$y{$?lOo{w$?SuFg-foa*5~GDjjTFtd1)+@XuCew$yag(#2!5Q%Xfe{`rD zaR{oynw}4nJCj1hV#G4E(8a+Q^#qY&&5Pm{0IanDTp0(^_^uWh8UP@&G4_Lr5)czs zwl>&^a=*mSWn+ScmjRKfN))BkQ;r=NrQ*fZiH%~hid6SEq8Pg+tKv+x*jUB$ed!&aF9 O0000R literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddNewFolder.png b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/Resources/AddNewFolder.png new file mode 100644 index 0000000000000000000000000000000000000000..214e514d3f00f54d32ad0be3f0a69cac4e4945d0 GIT binary patch literal 756 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu0 z6ago`wtmL|0013nR9JLFZ*6U5Zgc_CX>@2HM@dakWG-a~0006@ zNklmQmt4jBC&{xMB*P{u}SQ917ctjgJ2;B zF<23oR3dQ=Dny#Pl=@xX_qn~#&CpUTBu;XMlbrA6oSY+4O8ie`h`%?zzjrisEZ@Pr z_Fks$9-?>j459R>Z*OV&7nRPw1ISm$Sy*{M+u~ums!zzD9iy#hfDGW;rPJxpQ8sVe z#kvif1wgg6M)&AJXx~p)-x}!H!s_i+>UI(0>cvxO=gzfswr2pum=oj_H*b}!>EFoK z(cNPFN`I;@8DiZKf7QtJB~m!b_5R!-r=#STNE?ZTt?))^FkM{mb+W zpCAi9%z&bq1xs2>4P_JI3UCF}6VK^gJU}^l8)08FG4_t@4+lB0>IGSh@uzYNB{+-l z1;R^kieL-6x>nR|v03PLfPPu$o}xZ02|)Nu@!WjM@(Z9|AF0K+l2;l9hx~ z5sbu}9B&G|R>aa!8jCD5>WyC<5FH{alFLapCzNsytP6sc#8P9m!j%@~Dm3$amLLR5 zZIJbG%+yP)su7*U8jI8psS-^Y3EmNdN4W~xW#m%+Ac&kjH%2orsMY6Ft1sZ|w58rq mG@1&f^dFyLf2+j*zVmk(6^1YJ;U+Zz0000 + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + Library + Properties + UniversalEditor + UniversalEditor.UserInterface.WindowsForms + v4.0 + 512 + + + + true + full + false + ..\..\..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + true + false + + + none + true + ..\..\..\..\Output\Release\ + TRACE + prompt + 4 + + + + + + + + + + + UserControl + + + DocumentTypeSelector.cs + + + UserControl + + + ErrorMessage.cs + + + UserControl + + + ProgressPanel.cs + + + + Form + + + CommentDialog.cs + + + + Form + + + FilePropertiesDialogImpl.cs + + + Form + + + PropertyDetailsDialog.cs + + + UserControl + + + Editor.cs + + + UserControl + + + FileSystemEditor.cs + + + UserControl + + + LocalFileSystemExplorer.cs + + + UserControl + + + FormattedTextEditor.cs + + + UserControl + + + MarkupEditor.cs + + + UserControl + + + PropertyListEditor.cs + + + UserControl + + + PlainTextEditor.cs + + + UserControl + + + ShortcutEditor.cs + + + + + + UserControl + + + OptionPanel.cs + + + + True + True + Resources.resx + + + + + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {BE4D0BA3-0888-42A5-9C09-FC308A4509D2} + UniversalEditor.Plugins.Multimedia + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {369cfd53-3e65-4a9e-8bdd-4ccd78bf3e33} + UniversalEditor.Plugins.Multimedia.Binders.GdiPlus + + + + + DocumentTypeSelector.cs + + + ErrorMessage.cs + + + ProgressPanel.cs + + + CommentDialog.cs + + + FilePropertiesDialogImpl.cs + + + PropertyDetailsDialog.cs + + + Editor.cs + + + FileSystemEditor.cs + + + LocalFileSystemExplorer.cs + + + FormattedTextEditor.cs + + + MarkupEditor.cs + + + PropertyListEditor.cs + + + PlainTextEditor.cs + + + ShortcutEditor.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/VirtualFileDataObject.cs b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/VirtualFileDataObject.cs new file mode 100644 index 00000000..e3d45b91 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Libraries/UniversalEditor.UserInterface.WindowsForms/VirtualFileDataObject.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +namespace UniversalEditor.UserInterface.WindowsForms +{ + public class VirtualFileDescriptor + { + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private int? mvarLength = null; + public int? Length { get { return mvarLength; } set { mvarLength = value; } } + + private DateTime? mvarDateModified = null; + public DateTime? DateModified { get { return mvarDateModified; } set { mvarDateModified = value; } } + + private System.IO.Stream mvarStream = null; + public System.IO.Stream Stream { get { return mvarStream; } set { mvarStream = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.Designer.cs new file mode 100644 index 00000000..afe64736 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.Designer.cs @@ -0,0 +1,115 @@ +namespace UniversalEditor.Controls +{ + partial class ComplexObjectPropertiesControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtElementID = new AwesomeControls.GuidTextBox.GuidTextBoxControl(); + this.chkIsEmpty = new System.Windows.Forms.CheckBox(); + this.txtModificationDate = new System.Windows.Forms.DateTimePicker(); + this.lblElementID = new System.Windows.Forms.Label(); + this.lblModificationDate = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // txtElementID + // + this.txtElementID.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtElementID.Location = new System.Drawing.Point(100, 3); + this.txtElementID.MinimumSize = new System.Drawing.Size(362, 29); + this.txtElementID.Name = "txtElementID"; + this.txtElementID.Size = new System.Drawing.Size(362, 29); + this.txtElementID.TabIndex = 13; + this.txtElementID.Value = new System.Guid("00000000-0000-0000-0000-000000000000"); + // + // chkIsEmpty + // + this.chkIsEmpty.AutoSize = true; + this.chkIsEmpty.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkIsEmpty.Location = new System.Drawing.Point(100, 64); + this.chkIsEmpty.Name = "chkIsEmpty"; + this.chkIsEmpty.Size = new System.Drawing.Size(61, 18); + this.chkIsEmpty.TabIndex = 16; + this.chkIsEmpty.Text = "&Empty"; + this.chkIsEmpty.UseVisualStyleBackColor = true; + // + // txtModificationDate + // + this.txtModificationDate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtModificationDate.Location = new System.Drawing.Point(100, 38); + this.txtModificationDate.Name = "txtModificationDate"; + this.txtModificationDate.ShowCheckBox = true; + this.txtModificationDate.Size = new System.Drawing.Size(362, 20); + this.txtModificationDate.TabIndex = 15; + // + // lblElementID + // + this.lblElementID.AutoSize = true; + this.lblElementID.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblElementID.Location = new System.Drawing.Point(3, 8); + this.lblElementID.Name = "lblElementID"; + this.lblElementID.Size = new System.Drawing.Size(62, 13); + this.lblElementID.TabIndex = 12; + this.lblElementID.Text = "Element ID:"; + // + // lblModificationDate + // + this.lblModificationDate.AutoSize = true; + this.lblModificationDate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblModificationDate.Location = new System.Drawing.Point(3, 40); + this.lblModificationDate.Name = "lblModificationDate"; + this.lblModificationDate.Size = new System.Drawing.Size(91, 13); + this.lblModificationDate.TabIndex = 14; + this.lblModificationDate.Text = "&Modification date:"; + // + // ComplexObjectPropertiesControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.txtElementID); + this.Controls.Add(this.chkIsEmpty); + this.Controls.Add(this.txtModificationDate); + this.Controls.Add(this.lblElementID); + this.Controls.Add(this.lblModificationDate); + this.MinimumSize = new System.Drawing.Size(465, 102); + this.Name = "ComplexObjectPropertiesControl"; + this.Size = new System.Drawing.Size(465, 102); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblElementID; + private System.Windows.Forms.Label lblModificationDate; + private AwesomeControls.GuidTextBox.GuidTextBoxControl txtElementID; + private System.Windows.Forms.CheckBox chkIsEmpty; + private System.Windows.Forms.DateTimePicker txtModificationDate; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.cs new file mode 100644 index 00000000..4b1c1579 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Controls +{ + public partial class ComplexObjectPropertiesControl : UserControl + { + public ComplexObjectPropertiesControl() + { + InitializeComponent(); + } + + public Guid ElementID + { + get { return txtElementID.Value; } + set { txtElementID.Value = value; } + } + + public DateTime? ModificationDate + { + get + { + if (txtModificationDate.Checked) + { + return txtModificationDate.Value; + } + return null; + } + set + { + if (value != null) + { + txtModificationDate.Value = value.Value; + txtModificationDate.Checked = true; + } + else + { + txtModificationDate.Checked = false; + } + } + } + + public bool IsEmpty + { + get { return chkIsEmpty.Checked; } + set { chkIsEmpty.Checked = value; } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Controls/ComplexObjectPropertiesControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.Designer.cs new file mode 100644 index 00000000..441b42e6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.Designer.cs @@ -0,0 +1,200 @@ +namespace UniversalEditor.Dialogs.Contact +{ + partial class EmailPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblEmailAddress = new System.Windows.Forms.Label(); + this.txtEmailAddress = new System.Windows.Forms.TextBox(); + this.cmdCompose = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.fraLabels = new System.Windows.Forms.GroupBox(); + this.lvLabels = new AwesomeControls.CollectionListView.CollectionListViewControl(); + this.fraProperties = new System.Windows.Forms.GroupBox(); + this.copc = new UniversalEditor.Controls.ComplexObjectPropertiesControl(); + this.fraLabels.SuspendLayout(); + this.fraProperties.SuspendLayout(); + this.SuspendLayout(); + // + // lblEmailAddress + // + this.lblEmailAddress.AutoSize = true; + this.lblEmailAddress.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblEmailAddress.Location = new System.Drawing.Point(12, 15); + this.lblEmailAddress.Name = "lblEmailAddress"; + this.lblEmailAddress.Size = new System.Drawing.Size(78, 13); + this.lblEmailAddress.TabIndex = 0; + this.lblEmailAddress.Text = "&E-mail address:"; + // + // txtEmailAddress + // + this.txtEmailAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtEmailAddress.Location = new System.Drawing.Point(109, 12); + this.txtEmailAddress.Name = "txtEmailAddress"; + this.txtEmailAddress.Size = new System.Drawing.Size(380, 20); + this.txtEmailAddress.TabIndex = 1; + // + // cmdCompose + // + this.cmdCompose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCompose.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCompose.Location = new System.Drawing.Point(414, 38); + this.cmdCompose.Name = "cmdCompose"; + this.cmdCompose.Size = new System.Drawing.Size(75, 23); + this.cmdCompose.TabIndex = 2; + this.cmdCompose.Text = "Co&mpose..."; + this.cmdCompose.UseVisualStyleBackColor = true; + this.cmdCompose.Click += new System.EventHandler(this.cmdCompose_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(414, 340); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 6; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(333, 340); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 5; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // fraLabels + // + this.fraLabels.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraLabels.Controls.Add(this.lvLabels); + this.fraLabels.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraLabels.Location = new System.Drawing.Point(12, 199); + this.fraLabels.Name = "fraLabels"; + this.fraLabels.Size = new System.Drawing.Size(477, 135); + this.fraLabels.TabIndex = 4; + this.fraLabels.TabStop = false; + this.fraLabels.Text = "Labels"; + // + // lvLabels + // + this.lvLabels.AllowItemInsert = true; + this.lvLabels.AllowItemModify = true; + this.lvLabels.AllowItemRemove = true; + this.lvLabels.AllowItemReorder = false; + this.lvLabels.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvLabels.FullRowSelect = true; + this.lvLabels.HideSelection = true; + this.lvLabels.ItemNamePlural = "items"; + this.lvLabels.ItemNameSingular = "item"; + this.lvLabels.Location = new System.Drawing.Point(6, 19); + this.lvLabels.MultiSelect = false; + this.lvLabels.Name = "lvLabels"; + this.lvLabels.ShowGridLines = true; + this.lvLabels.Size = new System.Drawing.Size(465, 110); + this.lvLabels.TabIndex = 0; + this.lvLabels.RequestItemProperties += new AwesomeControls.CollectionListView.ItemPropertiesEventHandler(this.lvLabels_RequestItemProperties); + // + // fraProperties + // + this.fraProperties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraProperties.Controls.Add(this.copc); + this.fraProperties.Location = new System.Drawing.Point(12, 67); + this.fraProperties.Name = "fraProperties"; + this.fraProperties.Size = new System.Drawing.Size(477, 126); + this.fraProperties.TabIndex = 3; + this.fraProperties.TabStop = false; + this.fraProperties.Text = "Properties"; + // + // copc + // + this.copc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.copc.ElementID = new System.Guid("00000000-0000-0000-0000-000000000000"); + this.copc.IsEmpty = false; + this.copc.Location = new System.Drawing.Point(6, 19); + this.copc.MinimumSize = new System.Drawing.Size(465, 102); + this.copc.ModificationDate = new System.DateTime(2015, 5, 18, 15, 29, 37, 74); + this.copc.Name = "copc"; + this.copc.Size = new System.Drawing.Size(465, 102); + this.copc.TabIndex = 0; + // + // EmailPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(501, 375); + this.Controls.Add(this.fraProperties); + this.Controls.Add(this.fraLabels); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdCompose); + this.Controls.Add(this.txtEmailAddress); + this.Controls.Add(this.lblEmailAddress); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(517, 413); + this.Name = "EmailPropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "E-mail Address Properties"; + this.fraLabels.ResumeLayout(false); + this.fraProperties.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblEmailAddress; + private System.Windows.Forms.Button cmdCompose; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtEmailAddress; + private System.Windows.Forms.GroupBox fraLabels; + private System.Windows.Forms.GroupBox fraProperties; + internal Controls.ComplexObjectPropertiesControl copc; + internal AwesomeControls.CollectionListView.CollectionListViewControl lvLabels; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.cs new file mode 100644 index 00000000..8c86c639 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Contact; + +namespace UniversalEditor.Dialogs.Contact +{ + public partial class EmailPropertiesDialogImpl : Form + { + public EmailPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdCompose_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start("mailto:" + txtEmailAddress.Text); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + private void lvLabels_RequestItemProperties(object sender, AwesomeControls.CollectionListView.ItemPropertiesEventArgs e) + { + LabelPropertiesDialog dlg = new LabelPropertiesDialog(); + + ContactLabel label = (e.Item.Data as ContactLabel); + if (label == null) label = new ContactLabel(); + dlg.ElementID = label.ElementID; + dlg.IsEmpty = label.IsEmpty; + dlg.Label = label.Value; + dlg.ModificationDate = label.ModificationDate; + + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + label.ElementID = dlg.ElementID; + label.IsEmpty = dlg.IsEmpty; + label.Value = dlg.Label; + label.ModificationDate = dlg.ModificationDate; + + e.Item.Text = label.Value; + e.Item.Data = label; + } + } + } + public class EmailPropertiesDialog + { + private string mvarEmailAddress = String.Empty; + public string EmailAddress { get { return mvarEmailAddress; } set { mvarEmailAddress = value ; } } + + private Guid mvarElementID = Guid.Empty; + public Guid ElementID { get { return mvarElementID; } set { mvarElementID = value; } } + + private DateTime? mvarModificationDate = null; + public DateTime? ModificationDate { get { return mvarModificationDate; } set { mvarModificationDate = value; } } + + private bool mvarIsEmpty = false; + public bool IsEmpty { get { return mvarIsEmpty; } set { mvarIsEmpty = value; } } + + private ContactLabel.ContactLabelCollection mvarLabels = new ContactLabel.ContactLabelCollection(); + public ContactLabel.ContactLabelCollection Labels { get { return mvarLabels; } } + + public DialogResult ShowDialog() + { + EmailPropertiesDialogImpl dlg = new EmailPropertiesDialogImpl(); + dlg.txtEmailAddress.Text = mvarEmailAddress; + dlg.copc.ElementID = mvarElementID; + dlg.copc.IsEmpty = mvarIsEmpty; + dlg.copc.ModificationDate = mvarModificationDate; + foreach (ContactLabel item in mvarLabels) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Text = item.Value; + lvi.Data = item; + dlg.lvLabels.Items.Add(lvi); + } + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarEmailAddress = dlg.txtEmailAddress.Text; + mvarElementID = dlg.copc.ElementID; + mvarIsEmpty = dlg.copc.IsEmpty; + mvarModificationDate = dlg.copc.ModificationDate; + + mvarLabels.Clear(); + foreach (AwesomeControls.ListView.ListViewItem lvi in dlg.lvLabels.Items) + { + mvarLabels.Add(lvi.Data as ContactLabel); + } + + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/EmailPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.Designer.cs new file mode 100644 index 00000000..04b96fed --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.Designer.cs @@ -0,0 +1,179 @@ +namespace UniversalEditor.Dialogs.Contact +{ + partial class LabelPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblLabel = new System.Windows.Forms.Label(); + this.txtLabel = new System.Windows.Forms.TextBox(); + this.lblElementID = new System.Windows.Forms.Label(); + this.txtModificationDate = new System.Windows.Forms.DateTimePicker(); + this.lblModificationDate = new System.Windows.Forms.Label(); + this.chkIsEmpty = new System.Windows.Forms.CheckBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.txtElementID = new AwesomeControls.GuidTextBox.GuidTextBoxControl(); + this.SuspendLayout(); + // + // lblLabel + // + this.lblLabel.AutoSize = true; + this.lblLabel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblLabel.Location = new System.Drawing.Point(12, 50); + this.lblLabel.Name = "lblLabel"; + this.lblLabel.Size = new System.Drawing.Size(36, 13); + this.lblLabel.TabIndex = 2; + this.lblLabel.Text = "&Label:"; + // + // txtLabel + // + this.txtLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtLabel.Location = new System.Drawing.Point(109, 47); + this.txtLabel.Name = "txtLabel"; + this.txtLabel.Size = new System.Drawing.Size(362, 20); + this.txtLabel.TabIndex = 3; + // + // lblElementID + // + this.lblElementID.AutoSize = true; + this.lblElementID.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblElementID.Location = new System.Drawing.Point(12, 17); + this.lblElementID.Name = "lblElementID"; + this.lblElementID.Size = new System.Drawing.Size(62, 13); + this.lblElementID.TabIndex = 0; + this.lblElementID.Text = "Element ID:"; + // + // txtModificationDate + // + this.txtModificationDate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtModificationDate.Location = new System.Drawing.Point(109, 73); + this.txtModificationDate.Name = "txtModificationDate"; + this.txtModificationDate.ShowCheckBox = true; + this.txtModificationDate.Size = new System.Drawing.Size(362, 20); + this.txtModificationDate.TabIndex = 5; + // + // lblModificationDate + // + this.lblModificationDate.AutoSize = true; + this.lblModificationDate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblModificationDate.Location = new System.Drawing.Point(12, 75); + this.lblModificationDate.Name = "lblModificationDate"; + this.lblModificationDate.Size = new System.Drawing.Size(91, 13); + this.lblModificationDate.TabIndex = 4; + this.lblModificationDate.Text = "&Modification date:"; + // + // chkIsEmpty + // + this.chkIsEmpty.AutoSize = true; + this.chkIsEmpty.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkIsEmpty.Location = new System.Drawing.Point(109, 99); + this.chkIsEmpty.Name = "chkIsEmpty"; + this.chkIsEmpty.Size = new System.Drawing.Size(61, 18); + this.chkIsEmpty.TabIndex = 6; + this.chkIsEmpty.Text = "&Empty"; + this.chkIsEmpty.UseVisualStyleBackColor = true; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(396, 133); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 8; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(315, 133); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 7; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // txtElementID + // + this.txtElementID.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtElementID.Location = new System.Drawing.Point(109, 12); + this.txtElementID.MinimumSize = new System.Drawing.Size(362, 29); + this.txtElementID.Name = "txtElementID"; + this.txtElementID.Size = new System.Drawing.Size(362, 29); + this.txtElementID.TabIndex = 1; + this.txtElementID.Value = new System.Guid("00000000-0000-0000-0000-000000000000"); + // + // LabelPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(483, 168); + this.Controls.Add(this.txtElementID); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.chkIsEmpty); + this.Controls.Add(this.txtModificationDate); + this.Controls.Add(this.lblElementID); + this.Controls.Add(this.txtLabel); + this.Controls.Add(this.lblModificationDate); + this.Controls.Add(this.lblLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(499, 206); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(499, 206); + this.Name = "LabelPropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Label Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblLabel; + private System.Windows.Forms.Label lblElementID; + private System.Windows.Forms.Label lblModificationDate; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtLabel; + internal System.Windows.Forms.DateTimePicker txtModificationDate; + internal System.Windows.Forms.CheckBox chkIsEmpty; + internal AwesomeControls.GuidTextBox.GuidTextBoxControl txtElementID; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.cs new file mode 100644 index 00000000..c585fc47 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Contact +{ + internal partial class LabelPropertiesDialogImpl : Form + { + public LabelPropertiesDialogImpl() + { + InitializeComponent(); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + public class LabelPropertiesDialog + { + private Guid mvarElementID = Guid.Empty; + public Guid ElementID { get { return mvarElementID; } set { mvarElementID = value; } } + + private string mvarLabel = String.Empty; + public string Label { get { return mvarLabel; } set { mvarLabel = value; } } + + private DateTime? mvarModificationDate = null; + public DateTime? ModificationDate { get { return mvarModificationDate; } set { mvarModificationDate = value; } } + + private bool mvarIsEmpty = false; + public bool IsEmpty { get { return mvarIsEmpty; } set { mvarIsEmpty = value; } } + + public DialogResult ShowDialog() + { + LabelPropertiesDialogImpl dlg = new LabelPropertiesDialogImpl(); + dlg.txtElementID.Value = mvarElementID; + dlg.txtLabel.Text = mvarLabel; + if (mvarModificationDate != null) + { + dlg.txtModificationDate.Value = mvarModificationDate.Value; + dlg.txtModificationDate.Checked = true; + } + else + { + dlg.txtModificationDate.Checked = false; + } + dlg.chkIsEmpty.Checked = mvarIsEmpty; + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarElementID = dlg.txtElementID.Value; + mvarLabel = dlg.txtLabel.Text; + if (dlg.txtModificationDate.Checked) + { + mvarModificationDate = dlg.txtModificationDate.Value; + } + else + { + mvarModificationDate = null; + } + mvarIsEmpty = dlg.chkIsEmpty.Checked; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/LabelPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.Designer.cs new file mode 100644 index 00000000..17da924c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.Designer.cs @@ -0,0 +1,239 @@ +namespace UniversalEditor.Dialogs.Contact +{ + partial class NamePropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.lblGivenName = new System.Windows.Forms.Label(); + this.txtGivenName = new System.Windows.Forms.TextBox(); + this.lblMiddleName = new System.Windows.Forms.Label(); + this.txtMiddleName = new System.Windows.Forms.TextBox(); + this.lblFamilyName = new System.Windows.Forms.Label(); + this.txtFamilyName = new System.Windows.Forms.TextBox(); + this.cboDisplayName = new System.Windows.Forms.ComboBox(); + this.lblDisplayName = new System.Windows.Forms.Label(); + this.lblPersonalTitle = new System.Windows.Forms.Label(); + this.txtPersonalTitle = new System.Windows.Forms.TextBox(); + this.lblNickname = new System.Windows.Forms.Label(); + this.txtNickname = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(308, 169); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 13; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(227, 169); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 12; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // lblGivenName + // + this.lblGivenName.AutoSize = true; + this.lblGivenName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblGivenName.Location = new System.Drawing.Point(12, 15); + this.lblGivenName.Name = "lblGivenName"; + this.lblGivenName.Size = new System.Drawing.Size(67, 13); + this.lblGivenName.TabIndex = 0; + this.lblGivenName.Text = "&Given name:"; + // + // txtGivenName + // + this.txtGivenName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGivenName.Location = new System.Drawing.Point(91, 12); + this.txtGivenName.Name = "txtGivenName"; + this.txtGivenName.Size = new System.Drawing.Size(292, 20); + this.txtGivenName.TabIndex = 1; + // + // lblMiddleName + // + this.lblMiddleName.AutoSize = true; + this.lblMiddleName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblMiddleName.Location = new System.Drawing.Point(12, 41); + this.lblMiddleName.Name = "lblMiddleName"; + this.lblMiddleName.Size = new System.Drawing.Size(70, 13); + this.lblMiddleName.TabIndex = 2; + this.lblMiddleName.Text = "&Middle name:"; + // + // txtMiddleName + // + this.txtMiddleName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMiddleName.Location = new System.Drawing.Point(91, 38); + this.txtMiddleName.Name = "txtMiddleName"; + this.txtMiddleName.Size = new System.Drawing.Size(292, 20); + this.txtMiddleName.TabIndex = 3; + // + // lblFamilyName + // + this.lblFamilyName.AutoSize = true; + this.lblFamilyName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblFamilyName.Location = new System.Drawing.Point(12, 67); + this.lblFamilyName.Name = "lblFamilyName"; + this.lblFamilyName.Size = new System.Drawing.Size(68, 13); + this.lblFamilyName.TabIndex = 4; + this.lblFamilyName.Text = "&Family name:"; + // + // txtFamilyName + // + this.txtFamilyName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFamilyName.Location = new System.Drawing.Point(91, 64); + this.txtFamilyName.Name = "txtFamilyName"; + this.txtFamilyName.Size = new System.Drawing.Size(292, 20); + this.txtFamilyName.TabIndex = 5; + // + // cboDisplayName + // + this.cboDisplayName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboDisplayName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboDisplayName.FormattingEnabled = true; + this.cboDisplayName.Location = new System.Drawing.Point(91, 90); + this.cboDisplayName.Name = "cboDisplayName"; + this.cboDisplayName.Size = new System.Drawing.Size(292, 21); + this.cboDisplayName.TabIndex = 7; + // + // lblDisplayName + // + this.lblDisplayName.AutoSize = true; + this.lblDisplayName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblDisplayName.Location = new System.Drawing.Point(12, 93); + this.lblDisplayName.Name = "lblDisplayName"; + this.lblDisplayName.Size = new System.Drawing.Size(73, 13); + this.lblDisplayName.TabIndex = 6; + this.lblDisplayName.Text = "&Display name:"; + // + // lblPersonalTitle + // + this.lblPersonalTitle.AutoSize = true; + this.lblPersonalTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblPersonalTitle.Location = new System.Drawing.Point(12, 120); + this.lblPersonalTitle.Name = "lblPersonalTitle"; + this.lblPersonalTitle.Size = new System.Drawing.Size(70, 13); + this.lblPersonalTitle.TabIndex = 8; + this.lblPersonalTitle.Text = "&Personal title:"; + // + // txtPersonalTitle + // + this.txtPersonalTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPersonalTitle.Location = new System.Drawing.Point(91, 117); + this.txtPersonalTitle.Name = "txtPersonalTitle"; + this.txtPersonalTitle.Size = new System.Drawing.Size(292, 20); + this.txtPersonalTitle.TabIndex = 9; + // + // lblNickname + // + this.lblNickname.AutoSize = true; + this.lblNickname.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblNickname.Location = new System.Drawing.Point(12, 146); + this.lblNickname.Name = "lblNickname"; + this.lblNickname.Size = new System.Drawing.Size(58, 13); + this.lblNickname.TabIndex = 10; + this.lblNickname.Text = "&Nickname:"; + // + // txtNickname + // + this.txtNickname.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtNickname.Location = new System.Drawing.Point(91, 143); + this.txtNickname.Name = "txtNickname"; + this.txtNickname.Size = new System.Drawing.Size(292, 20); + this.txtNickname.TabIndex = 11; + // + // NamePropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(395, 204); + this.Controls.Add(this.cboDisplayName); + this.Controls.Add(this.txtNickname); + this.Controls.Add(this.txtPersonalTitle); + this.Controls.Add(this.lblNickname); + this.Controls.Add(this.txtFamilyName); + this.Controls.Add(this.lblPersonalTitle); + this.Controls.Add(this.lblDisplayName); + this.Controls.Add(this.lblFamilyName); + this.Controls.Add(this.txtMiddleName); + this.Controls.Add(this.lblMiddleName); + this.Controls.Add(this.txtGivenName); + this.Controls.Add(this.lblGivenName); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(411, 242); + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(411, 242); + this.Name = "NamePropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Name Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Label lblGivenName; + private System.Windows.Forms.Label lblMiddleName; + private System.Windows.Forms.Label lblFamilyName; + private System.Windows.Forms.Label lblDisplayName; + private System.Windows.Forms.Label lblPersonalTitle; + private System.Windows.Forms.Label lblNickname; + internal System.Windows.Forms.TextBox txtGivenName; + internal System.Windows.Forms.TextBox txtMiddleName; + internal System.Windows.Forms.TextBox txtFamilyName; + internal System.Windows.Forms.ComboBox cboDisplayName; + internal System.Windows.Forms.TextBox txtPersonalTitle; + internal System.Windows.Forms.TextBox txtNickname; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.cs new file mode 100644 index 00000000..e236a231 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Contact +{ + internal partial class NamePropertiesDialogImpl : Form + { + public NamePropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + public class NamePropertiesDialog + { + private string mvarGivenName = String.Empty; + public string GivenName { get { return mvarGivenName; } set { mvarGivenName = value; } } + + private string mvarMiddleName = String.Empty; + public string MiddleName { get { return mvarMiddleName; } set { mvarMiddleName = value; } } + + private string mvarFamilyName = String.Empty; + public string FamilyName { get { return mvarFamilyName; } set { mvarFamilyName = value; } } + + private string mvarDisplayName = String.Empty; + public string DisplayName { get { return mvarDisplayName; } set { mvarDisplayName = value; } } + + private string mvarPersonalTitle = String.Empty; + public string PersonalTitle { get { return mvarPersonalTitle; } set { mvarPersonalTitle = value; } } + + private string mvarNickname = String.Empty; + public string Nickname { get { return mvarNickname; } set { mvarNickname = value; } } + + public DialogResult ShowDialog() + { + NamePropertiesDialogImpl dlg = new NamePropertiesDialogImpl(); + dlg.txtGivenName.Text = mvarGivenName; + dlg.txtMiddleName.Text = mvarMiddleName; + dlg.txtFamilyName.Text = mvarFamilyName; + dlg.cboDisplayName.Text = mvarDisplayName; + dlg.txtPersonalTitle.Text = mvarPersonalTitle; + dlg.txtNickname.Text = mvarNickname; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarGivenName = dlg.txtGivenName.Text; + mvarMiddleName = dlg.txtMiddleName.Text; + mvarFamilyName = dlg.txtFamilyName.Text; + mvarDisplayName = dlg.cboDisplayName.Text; + mvarPersonalTitle = dlg.txtPersonalTitle.Text; + mvarNickname = dlg.txtNickname.Text; + + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Dialogs/Contact/NamePropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.Designer.cs new file mode 100644 index 00000000..ea9346a8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.Designer.cs @@ -0,0 +1,230 @@ +namespace UniversalEditor.Editors.Contact +{ + partial class ContactEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Summary"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Names and E-mail Addresses"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Physical Addresses"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Employment"); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Family and Relationships"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Notes"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Digital IDs and Certificates"); + this.sc = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlGeneral = new System.Windows.Forms.Panel(); + this.tblGeneral = new System.Windows.Forms.TableLayoutPanel(); + this.fraEmailAddresses = new System.Windows.Forms.GroupBox(); + this.lvEmailAddresses = new AwesomeControls.CollectionListView.CollectionListViewControl(); + this.fraNames = new System.Windows.Forms.GroupBox(); + this.lvNames = new AwesomeControls.CollectionListView.CollectionListViewControl(); + this.sc.Panel1.SuspendLayout(); + this.sc.Panel2.SuspendLayout(); + this.sc.SuspendLayout(); + this.pnlGeneral.SuspendLayout(); + this.tblGeneral.SuspendLayout(); + this.fraEmailAddresses.SuspendLayout(); + this.fraNames.SuspendLayout(); + this.SuspendLayout(); + // + // sc + // + this.sc.Dock = System.Windows.Forms.DockStyle.Fill; + this.sc.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.sc.IsSplitterFixed = true; + this.sc.Location = new System.Drawing.Point(0, 0); + this.sc.Name = "sc"; + // + // sc.Panel1 + // + this.sc.Panel1.Controls.Add(this.tv); + // + // sc.Panel2 + // + this.sc.Panel2.Controls.Add(this.pnlGeneral); + this.sc.Size = new System.Drawing.Size(588, 289); + this.sc.SplitterDistance = 163; + this.sc.TabIndex = 0; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.FullRowSelect = true; + this.tv.ItemHeight = 26; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode1.Name = "nodeSummary"; + treeNode1.Text = "Summary"; + treeNode2.Name = "nodeNameAndEmail"; + treeNode2.Text = "Names and E-mail Addresses"; + treeNode3.Name = "nodePhysicalAddresses"; + treeNode3.Text = "Physical Addresses"; + treeNode4.Name = "nodeEmployment"; + treeNode4.Text = "Employment"; + treeNode5.Name = "nodeFamilyAndRelationships"; + treeNode5.Text = "Family and Relationships"; + treeNode6.Name = "nodeNotes"; + treeNode6.Text = "Notes"; + treeNode7.Name = "nodeDigitalIDs"; + treeNode7.Text = "Digital IDs and Certificates"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3, + treeNode4, + treeNode5, + treeNode6, + treeNode7}); + this.tv.ShowLines = false; + this.tv.ShowRootLines = false; + this.tv.Size = new System.Drawing.Size(163, 289); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // pnlGeneral + // + this.pnlGeneral.Controls.Add(this.tblGeneral); + this.pnlGeneral.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlGeneral.Location = new System.Drawing.Point(0, 0); + this.pnlGeneral.Name = "pnlGeneral"; + this.pnlGeneral.Size = new System.Drawing.Size(421, 289); + this.pnlGeneral.TabIndex = 0; + // + // tblGeneral + // + this.tblGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tblGeneral.ColumnCount = 1; + this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblGeneral.Controls.Add(this.fraEmailAddresses, 0, 1); + this.tblGeneral.Controls.Add(this.fraNames, 0, 0); + this.tblGeneral.Location = new System.Drawing.Point(3, 3); + this.tblGeneral.Name = "tblGeneral"; + this.tblGeneral.RowCount = 2; + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblGeneral.Size = new System.Drawing.Size(415, 283); + this.tblGeneral.TabIndex = 1; + // + // fraEmailAddresses + // + this.fraEmailAddresses.Controls.Add(this.lvEmailAddresses); + this.fraEmailAddresses.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraEmailAddresses.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEmailAddresses.Location = new System.Drawing.Point(3, 144); + this.fraEmailAddresses.Name = "fraEmailAddresses"; + this.fraEmailAddresses.Size = new System.Drawing.Size(409, 136); + this.fraEmailAddresses.TabIndex = 1; + this.fraEmailAddresses.TabStop = false; + this.fraEmailAddresses.Text = "E-mail addresses"; + // + // lvEmailAddresses + // + this.lvEmailAddresses.AllowItemInsert = true; + this.lvEmailAddresses.AllowItemModify = true; + this.lvEmailAddresses.AllowItemRemove = true; + this.lvEmailAddresses.AllowItemReorder = false; + this.lvEmailAddresses.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvEmailAddresses.FullRowSelect = false; + this.lvEmailAddresses.HideSelection = true; + this.lvEmailAddresses.ItemNamePlural = "items"; + this.lvEmailAddresses.ItemNameSingular = "item"; + this.lvEmailAddresses.Location = new System.Drawing.Point(6, 19); + this.lvEmailAddresses.MultiSelect = false; + this.lvEmailAddresses.Name = "lvEmailAddresses"; + this.lvEmailAddresses.ShowGridLines = true; + this.lvEmailAddresses.Size = new System.Drawing.Size(397, 111); + this.lvEmailAddresses.TabIndex = 0; + this.lvEmailAddresses.RequestItemProperties += new AwesomeControls.CollectionListView.ItemPropertiesEventHandler(this.lvEmailAddresses_RequestItemProperties); + // + // fraNames + // + this.fraNames.Controls.Add(this.lvNames); + this.fraNames.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraNames.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraNames.Location = new System.Drawing.Point(3, 3); + this.fraNames.Name = "fraNames"; + this.fraNames.Size = new System.Drawing.Size(409, 135); + this.fraNames.TabIndex = 0; + this.fraNames.TabStop = false; + this.fraNames.Text = "Names"; + // + // lvNames + // + this.lvNames.AllowItemInsert = true; + this.lvNames.AllowItemModify = true; + this.lvNames.AllowItemRemove = true; + this.lvNames.AllowItemReorder = false; + this.lvNames.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvNames.FullRowSelect = false; + this.lvNames.HideSelection = true; + this.lvNames.ItemNamePlural = "items"; + this.lvNames.ItemNameSingular = "item"; + this.lvNames.Location = new System.Drawing.Point(6, 22); + this.lvNames.MultiSelect = false; + this.lvNames.Name = "lvNames"; + this.lvNames.ShowGridLines = true; + this.lvNames.Size = new System.Drawing.Size(397, 107); + this.lvNames.TabIndex = 0; + this.lvNames.RequestItemProperties += new AwesomeControls.CollectionListView.ItemPropertiesEventHandler(this.lvNames_RequestItemProperties); + // + // ContactEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.sc); + this.Name = "ContactEditor"; + this.Size = new System.Drawing.Size(588, 289); + this.sc.Panel1.ResumeLayout(false); + this.sc.Panel2.ResumeLayout(false); + this.sc.ResumeLayout(false); + this.pnlGeneral.ResumeLayout(false); + this.tblGeneral.ResumeLayout(false); + this.fraEmailAddresses.ResumeLayout(false); + this.fraNames.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer sc; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlGeneral; + private System.Windows.Forms.GroupBox fraNames; + private System.Windows.Forms.TableLayoutPanel tblGeneral; + private System.Windows.Forms.GroupBox fraEmailAddresses; + private AwesomeControls.CollectionListView.CollectionListViewControl lvEmailAddresses; + private AwesomeControls.CollectionListView.CollectionListViewControl lvNames; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.cs new file mode 100644 index 00000000..10471721 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Dialogs.Contact; +using UniversalEditor.ObjectModels.Contact; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Contact +{ + public partial class ContactEditor : Editor + { + public ContactEditor() + { + InitializeComponent(); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(ContactObjectModel)); + } + return _er; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + + lvNames.Items.Clear(); + lvEmailAddresses.Items.Clear(); + + ContactObjectModel contact = (ObjectModel as ContactObjectModel); + if (contact == null) return; + + tv.Nodes.Add("General Information"); + tv.Nodes.Add("Physical Addresses"); + tv.Nodes.Add("Family and Relationships"); + tv.Nodes.Add("Notes"); + tv.Nodes.Add("Digital IDs and Certificates"); + + foreach (ContactName name in contact.Names) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Data = name; + if (!String.IsNullOrEmpty(name.FormattedName)) + { + lvi.Text = name.FormattedName; + } + else + { + lvi.Text = name.FamilyName + ", " + name.GivenName + " " + name.MiddleName; + } + lvNames.Items.Add(lvi); + } + foreach (ContactEmailAddress email in contact.EmailAddresses) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Data = email; + lvi.Text = email.Address; + lvEmailAddresses.Items.Add(lvi); + } + + } + + private void lvNames_RequestItemProperties(object sender, AwesomeControls.CollectionListView.ItemPropertiesEventArgs e) + { + NamePropertiesDialog dlg = new NamePropertiesDialog(); + + ContactName name = (e.Item.Data as ContactName); + if (name == null) name = new ContactName(); + + dlg.GivenName = name.GivenName; + dlg.MiddleName = name.MiddleName; + dlg.FamilyName = name.FamilyName; + dlg.DisplayName = name.FormattedName; + dlg.PersonalTitle = name.Title; + dlg.Nickname = name.Nickname; + + if (dlg.ShowDialog() == DialogResult.Cancel) + { + e.Cancel = true; + return; + } + + BeginEdit(); + + name.GivenName = dlg.GivenName; + name.MiddleName = dlg.MiddleName; + name.FamilyName = dlg.FamilyName; + name.FormattedName = dlg.DisplayName; + name.Title = dlg.PersonalTitle; + name.Nickname = dlg.Nickname; + + if (!String.IsNullOrEmpty(name.FormattedName)) + { + e.Item.Text = name.FormattedName; + } + else + { + e.Item.Text = name.FamilyName + ", " + name.GivenName + " " + name.MiddleName; + } + e.Item.Details.Clear(); + + e.Item.Data = name; + + EndEdit(); + } + + private void lvEmailAddresses_RequestItemProperties(object sender, AwesomeControls.CollectionListView.ItemPropertiesEventArgs e) + { + EmailPropertiesDialog dlg = new EmailPropertiesDialog(); + + ContactEmailAddress email = (e.Item.Data as ContactEmailAddress); + if (email == null) email = new ContactEmailAddress(); + + dlg.EmailAddress = email.Address; + dlg.ElementID = email.ElementID; + dlg.IsEmpty = email.IsEmpty; + foreach (ContactLabel item in email.Labels) + { + dlg.Labels.Add(item); + } + dlg.ModificationDate = email.ModificationDate; + // dlg.Type = email.Type; + + if (dlg.ShowDialog() == DialogResult.Cancel) + { + e.Cancel = true; + return; + } + + BeginEdit(); + + email.Address = dlg.EmailAddress; + email.ElementID = dlg.ElementID; + email.IsEmpty = dlg.IsEmpty; + email.Labels.Clear(); + foreach (ContactLabel item in dlg.Labels) + { + email.Labels.Add(item); + } + email.ModificationDate = dlg.ModificationDate; + // email.Type = dlg.Type; + + e.Item.Text = email.Address; + e.Item.Details.Clear(); + + e.Item.Data = email; + + EndEdit(); + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Editors/Contact/ContactEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..db45e10d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Address Book plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2015 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fe3befe8-e0f4-4f6f-9859-3ac032b32116")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..647525b2 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms/UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms.csproj @@ -0,0 +1,128 @@ + + + + + Debug + AnyCPU + {740341DE-FFE0-4456-B2A7-7FEC7E52E4F9} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.AddressBook.UserInterface.WindowsForms + v3.5 + 512 + + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + UserControl + + + ComplexObjectPropertiesControl.cs + + + Form + + + EmailPropertiesDialog.cs + + + Form + + + LabelPropertiesDialog.cs + + + Form + + + NamePropertiesDialog.cs + + + UserControl + + + ContactEditor.cs + + + + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {AC2E7D52-E3C0-4C5A-A13E-B77F6D41C46E} + UniversalEditor.Plugins.AddressBook + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + + + + ComplexObjectPropertiesControl.cs + + + EmailPropertiesDialog.cs + + + LabelPropertiesDialog.cs + + + NamePropertiesDialog.cs + + + ContactEditor.cs + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.Designer.cs new file mode 100644 index 00000000..662fded4 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.Designer.cs @@ -0,0 +1,121 @@ +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + partial class AttachmentPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.txtTitle = new System.Windows.Forms.TextBox(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdBrowse = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Location = new System.Drawing.Point(12, 15); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(30, 13); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "&Title:"; + // + // txtTitle + // + this.txtTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTitle.Location = new System.Drawing.Point(48, 12); + this.txtTitle.Name = "txtTitle"; + this.txtTitle.Size = new System.Drawing.Size(291, 20); + this.txtTitle.TabIndex = 1; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(183, 76); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 3; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(264, 76); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 4; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdBrowse + // + this.cmdBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowse.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowse.Location = new System.Drawing.Point(264, 38); + this.cmdBrowse.Name = "cmdBrowse"; + this.cmdBrowse.Size = new System.Drawing.Size(75, 23); + this.cmdBrowse.TabIndex = 2; + this.cmdBrowse.Text = "B&rowse..."; + this.cmdBrowse.UseVisualStyleBackColor = true; + this.cmdBrowse.Click += new System.EventHandler(this.cmdBrowse_Click); + // + // AttachmentPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(351, 111); + this.Controls.Add(this.cmdBrowse); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.txtTitle); + this.Controls.Add(this.lblTitle); + this.Name = "AttachmentPropertiesDialogImpl"; + this.Text = "Attachment Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblTitle; + internal System.Windows.Forms.TextBox txtTitle; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdBrowse; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.cs new file mode 100644 index 00000000..f18d62a0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + internal partial class AttachmentPropertiesDialogImpl : Form + { + public AttachmentPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtTitle.Text)) + { + MessageBox.Show("Please enter or choose a file name for this attachment.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + private void cmdBrowse_Click(object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog(); + if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + txtTitle.Text = System.IO.Path.GetFileName(ofd.FileName); + } + } + } + + [System.Diagnostics.DebuggerNonUserCode()] + public class AttachmentPropertiesDialog + { + private string mvarItem = String.Empty; + public string Item { get { return mvarItem; } set { mvarItem = value; } } + public DialogResult ShowDialog() + { + AttachmentPropertiesDialogImpl dlg = new AttachmentPropertiesDialogImpl(); + + dlg.txtTitle.Text = mvarItem; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarItem = dlg.txtTitle.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/AttachmentPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.Designer.cs new file mode 100644 index 00000000..e43ff9ff --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.Designer.cs @@ -0,0 +1,106 @@ +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + partial class CategoryPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.txtTitle = new System.Windows.Forms.TextBox(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Location = new System.Drawing.Point(12, 15); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(30, 13); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "&Title:"; + // + // txtTitle + // + this.txtTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTitle.Location = new System.Drawing.Point(48, 12); + this.txtTitle.Name = "txtTitle"; + this.txtTitle.Size = new System.Drawing.Size(291, 20); + this.txtTitle.TabIndex = 1; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(183, 52); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(264, 52); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // CategoryPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(351, 87); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.txtTitle); + this.Controls.Add(this.lblTitle); + this.Name = "CategoryPropertiesDialogImpl"; + this.Text = "Category Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblTitle; + internal System.Windows.Forms.TextBox txtTitle; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdCancel; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.cs new file mode 100644 index 00000000..acf44c11 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + internal partial class CategoryPropertiesDialogImpl : Form + { + public CategoryPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtTitle.Text)) + { + MessageBox.Show("Please provide a title for this category.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + + [System.Diagnostics.DebuggerNonUserCode()] + public class CategoryPropertiesDialog + { + private Category mvarItem = null; + public Category Item { get { return mvarItem; } set { mvarItem = value; } } + public DialogResult ShowDialog() + { + CategoryPropertiesDialogImpl dlg = new CategoryPropertiesDialogImpl(); + + if (mvarItem == null) mvarItem = new Category(); + dlg.txtTitle.Text = mvarItem.Title; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarItem.Title = dlg.txtTitle.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/CategoryPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.Designer.cs new file mode 100644 index 00000000..3b5696b3 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.Designer.cs @@ -0,0 +1,106 @@ +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + partial class KeywordPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.txtTitle = new System.Windows.Forms.TextBox(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Location = new System.Drawing.Point(12, 15); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(30, 13); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "&Title:"; + // + // txtTitle + // + this.txtTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTitle.Location = new System.Drawing.Point(48, 12); + this.txtTitle.Name = "txtTitle"; + this.txtTitle.Size = new System.Drawing.Size(291, 20); + this.txtTitle.TabIndex = 1; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(183, 52); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(264, 52); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // KeywordPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(351, 87); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.txtTitle); + this.Controls.Add(this.lblTitle); + this.Name = "KeywordPropertiesDialogImpl"; + this.Text = "Keyword Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblTitle; + internal System.Windows.Forms.TextBox txtTitle; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdCancel; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.cs new file mode 100644 index 00000000..9e494a05 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + internal partial class KeywordPropertiesDialogImpl : Form + { + public KeywordPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtTitle.Text)) + { + MessageBox.Show("Please provide a title for this category.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + + [System.Diagnostics.DebuggerNonUserCode()] + public class KeywordPropertiesDialog + { + private string mvarItem = String.Empty; + public string Item { get { return mvarItem; } set { mvarItem = value; } } + public DialogResult ShowDialog() + { + CategoryPropertiesDialogImpl dlg = new CategoryPropertiesDialogImpl(); + + dlg.txtTitle.Text = mvarItem; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarItem = dlg.txtTitle.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/KeywordPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.Designer.cs new file mode 100644 index 00000000..58086976 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.Designer.cs @@ -0,0 +1,106 @@ +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + partial class ListingPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.txtTitle = new System.Windows.Forms.TextBox(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Location = new System.Drawing.Point(12, 15); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(30, 13); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "&Title:"; + // + // txtTitle + // + this.txtTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTitle.Location = new System.Drawing.Point(48, 12); + this.txtTitle.Name = "txtTitle"; + this.txtTitle.Size = new System.Drawing.Size(291, 20); + this.txtTitle.TabIndex = 1; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(183, 52); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(264, 52); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // ListingPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(351, 87); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.txtTitle); + this.Controls.Add(this.lblTitle); + this.Name = "ListingPropertiesDialogImpl"; + this.Text = "Listing Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblTitle; + internal System.Windows.Forms.TextBox txtTitle; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdCancel; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.cs new file mode 100644 index 00000000..93b10186 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + internal partial class ListingPropertiesDialogImpl : Form + { + public ListingPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtTitle.Text)) + { + MessageBox.Show("Please provide a title for this listing.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + + [System.Diagnostics.DebuggerNonUserCode()] + public class ListingPropertiesDialog + { + private Listing mvarItem = null; + public Listing Item { get { return mvarItem; } set { mvarItem = value; } } + public DialogResult ShowDialog() + { + ListingPropertiesDialogImpl dlg = new ListingPropertiesDialogImpl(); + + if (mvarItem == null) mvarItem = new Listing(); + dlg.txtTitle.Text = mvarItem.Title; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarItem.Title = dlg.txtTitle.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ListingPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.Designer.cs new file mode 100644 index 00000000..7aa907f1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.Designer.cs @@ -0,0 +1,106 @@ +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + partial class PlatformPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.txtTitle = new System.Windows.Forms.TextBox(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTitle.Location = new System.Drawing.Point(12, 15); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(30, 13); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "&Title:"; + // + // txtTitle + // + this.txtTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTitle.Location = new System.Drawing.Point(48, 12); + this.txtTitle.Name = "txtTitle"; + this.txtTitle.Size = new System.Drawing.Size(291, 20); + this.txtTitle.TabIndex = 1; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(183, 52); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(264, 52); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // PlatformPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(351, 87); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.txtTitle); + this.Controls.Add(this.lblTitle); + this.Name = "PlatformPropertiesDialogImpl"; + this.Text = "Platform Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblTitle; + internal System.Windows.Forms.TextBox txtTitle; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.Button cmdCancel; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.cs new file mode 100644 index 00000000..d6a0edd2 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + internal partial class PlatformPropertiesDialogImpl : Form + { + public PlatformPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtTitle.Text)) + { + MessageBox.Show("Please provide a title for this listing.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + + [System.Diagnostics.DebuggerNonUserCode()] + public class PlatformPropertiesDialog + { + private Platform mvarItem = null; + public Platform Item { get { return mvarItem; } set { mvarItem = value; } } + public DialogResult ShowDialog() + { + PlatformPropertiesDialogImpl dlg = new PlatformPropertiesDialogImpl(); + + if (mvarItem == null) mvarItem = new Platform(); + dlg.txtTitle.Text = mvarItem.Title; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarItem.Title = dlg.txtTitle.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/PlatformPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.Designer.cs new file mode 100644 index 00000000..508f3226 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.Designer.cs @@ -0,0 +1,422 @@ +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + partial class ProductPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblProductTitle = new System.Windows.Forms.Label(); + this.txtProductTitle = new System.Windows.Forms.TextBox(); + this.cboCategory = new System.Windows.Forms.ComboBox(); + this.lblCategory = new System.Windows.Forms.Label(); + this.lblPlatform = new System.Windows.Forms.Label(); + this.cboPlatform = new System.Windows.Forms.ComboBox(); + this.lblListing = new System.Windows.Forms.Label(); + this.cboListing = new System.Windows.Forms.ComboBox(); + this.tblKeywordsFiles = new System.Windows.Forms.TableLayoutPanel(); + this.fraKeywords = new System.Windows.Forms.GroupBox(); + this.cmdKeywordClear = new System.Windows.Forms.Button(); + this.cmdKeywordRemove = new System.Windows.Forms.Button(); + this.cmdKeywordModify = new System.Windows.Forms.Button(); + this.cmdKeywordAdd = new System.Windows.Forms.Button(); + this.lvKeywords = new System.Windows.Forms.ListView(); + this.chKeyword = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraFiles = new System.Windows.Forms.GroupBox(); + this.cmdFileClear = new System.Windows.Forms.Button(); + this.cmdFileAdd = new System.Windows.Forms.Button(); + this.cmdFileRemove = new System.Windows.Forms.Button(); + this.lvFiles = new System.Windows.Forms.ListView(); + this.chFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdFileModify = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.tblKeywordsFiles.SuspendLayout(); + this.fraKeywords.SuspendLayout(); + this.fraFiles.SuspendLayout(); + this.SuspendLayout(); + // + // lblProductTitle + // + this.lblProductTitle.AutoSize = true; + this.lblProductTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblProductTitle.Location = new System.Drawing.Point(12, 15); + this.lblProductTitle.Name = "lblProductTitle"; + this.lblProductTitle.Size = new System.Drawing.Size(66, 13); + this.lblProductTitle.TabIndex = 0; + this.lblProductTitle.Text = "Product &title:"; + // + // txtProductTitle + // + this.txtProductTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtProductTitle.Location = new System.Drawing.Point(84, 12); + this.txtProductTitle.Name = "txtProductTitle"; + this.txtProductTitle.Size = new System.Drawing.Size(602, 20); + this.txtProductTitle.TabIndex = 1; + // + // cboCategory + // + this.cboCategory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboCategory.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboCategory.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboCategory.FormattingEnabled = true; + this.cboCategory.Location = new System.Drawing.Point(84, 38); + this.cboCategory.Name = "cboCategory"; + this.cboCategory.Size = new System.Drawing.Size(602, 21); + this.cboCategory.TabIndex = 3; + // + // lblCategory + // + this.lblCategory.AutoSize = true; + this.lblCategory.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblCategory.Location = new System.Drawing.Point(12, 41); + this.lblCategory.Name = "lblCategory"; + this.lblCategory.Size = new System.Drawing.Size(52, 13); + this.lblCategory.TabIndex = 2; + this.lblCategory.Text = "&Category:"; + // + // lblPlatform + // + this.lblPlatform.AutoSize = true; + this.lblPlatform.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblPlatform.Location = new System.Drawing.Point(12, 68); + this.lblPlatform.Name = "lblPlatform"; + this.lblPlatform.Size = new System.Drawing.Size(48, 13); + this.lblPlatform.TabIndex = 4; + this.lblPlatform.Text = "&Platform:"; + // + // cboPlatform + // + this.cboPlatform.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboPlatform.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboPlatform.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboPlatform.FormattingEnabled = true; + this.cboPlatform.Location = new System.Drawing.Point(84, 65); + this.cboPlatform.Name = "cboPlatform"; + this.cboPlatform.Size = new System.Drawing.Size(602, 21); + this.cboPlatform.TabIndex = 5; + // + // lblListing + // + this.lblListing.AutoSize = true; + this.lblListing.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblListing.Location = new System.Drawing.Point(12, 95); + this.lblListing.Name = "lblListing"; + this.lblListing.Size = new System.Drawing.Size(40, 13); + this.lblListing.TabIndex = 6; + this.lblListing.Text = "&Listing:"; + // + // cboListing + // + this.cboListing.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboListing.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboListing.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboListing.FormattingEnabled = true; + this.cboListing.Location = new System.Drawing.Point(84, 92); + this.cboListing.Name = "cboListing"; + this.cboListing.Size = new System.Drawing.Size(602, 21); + this.cboListing.TabIndex = 7; + // + // tblKeywordsFiles + // + this.tblKeywordsFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tblKeywordsFiles.ColumnCount = 2; + this.tblKeywordsFiles.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblKeywordsFiles.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblKeywordsFiles.Controls.Add(this.fraKeywords, 0, 0); + this.tblKeywordsFiles.Controls.Add(this.fraFiles, 1, 0); + this.tblKeywordsFiles.Location = new System.Drawing.Point(12, 120); + this.tblKeywordsFiles.Name = "tblKeywordsFiles"; + this.tblKeywordsFiles.RowCount = 1; + this.tblKeywordsFiles.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tblKeywordsFiles.Size = new System.Drawing.Size(674, 169); + this.tblKeywordsFiles.TabIndex = 8; + // + // fraKeywords + // + this.fraKeywords.Controls.Add(this.cmdKeywordClear); + this.fraKeywords.Controls.Add(this.cmdKeywordRemove); + this.fraKeywords.Controls.Add(this.cmdKeywordModify); + this.fraKeywords.Controls.Add(this.cmdKeywordAdd); + this.fraKeywords.Controls.Add(this.lvKeywords); + this.fraKeywords.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraKeywords.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraKeywords.Location = new System.Drawing.Point(3, 3); + this.fraKeywords.Name = "fraKeywords"; + this.fraKeywords.Size = new System.Drawing.Size(331, 163); + this.fraKeywords.TabIndex = 0; + this.fraKeywords.TabStop = false; + this.fraKeywords.Text = "Keywords"; + // + // cmdKeywordClear + // + this.cmdKeywordClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdKeywordClear.Enabled = false; + this.cmdKeywordClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdKeywordClear.Location = new System.Drawing.Point(249, 19); + this.cmdKeywordClear.Name = "cmdKeywordClear"; + this.cmdKeywordClear.Size = new System.Drawing.Size(75, 23); + this.cmdKeywordClear.TabIndex = 3; + this.cmdKeywordClear.Text = "Cl&ear"; + this.cmdKeywordClear.UseVisualStyleBackColor = true; + this.cmdKeywordClear.Click += new System.EventHandler(this.cmdKeywordClear_Click); + // + // cmdKeywordRemove + // + this.cmdKeywordRemove.Enabled = false; + this.cmdKeywordRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdKeywordRemove.Location = new System.Drawing.Point(168, 19); + this.cmdKeywordRemove.Name = "cmdKeywordRemove"; + this.cmdKeywordRemove.Size = new System.Drawing.Size(75, 23); + this.cmdKeywordRemove.TabIndex = 2; + this.cmdKeywordRemove.Text = "&Remove"; + this.cmdKeywordRemove.UseVisualStyleBackColor = true; + this.cmdKeywordRemove.Click += new System.EventHandler(this.cmdKeywordRemove_Click); + // + // cmdKeywordModify + // + this.cmdKeywordModify.Enabled = false; + this.cmdKeywordModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdKeywordModify.Location = new System.Drawing.Point(87, 19); + this.cmdKeywordModify.Name = "cmdKeywordModify"; + this.cmdKeywordModify.Size = new System.Drawing.Size(75, 23); + this.cmdKeywordModify.TabIndex = 1; + this.cmdKeywordModify.Text = "&Modify..."; + this.cmdKeywordModify.UseVisualStyleBackColor = true; + this.cmdKeywordModify.Click += new System.EventHandler(this.cmdKeywordModify_Click); + // + // cmdKeywordAdd + // + this.cmdKeywordAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdKeywordAdd.Location = new System.Drawing.Point(6, 19); + this.cmdKeywordAdd.Name = "cmdKeywordAdd"; + this.cmdKeywordAdd.Size = new System.Drawing.Size(75, 23); + this.cmdKeywordAdd.TabIndex = 0; + this.cmdKeywordAdd.Text = "&Add..."; + this.cmdKeywordAdd.UseVisualStyleBackColor = true; + this.cmdKeywordAdd.Click += new System.EventHandler(this.cmdKeywordAdd_Click); + // + // lvKeywords + // + this.lvKeywords.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvKeywords.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chKeyword}); + this.lvKeywords.FullRowSelect = true; + this.lvKeywords.GridLines = true; + this.lvKeywords.HideSelection = false; + this.lvKeywords.Location = new System.Drawing.Point(6, 48); + this.lvKeywords.Name = "lvKeywords"; + this.lvKeywords.Size = new System.Drawing.Size(318, 109); + this.lvKeywords.TabIndex = 4; + this.lvKeywords.UseCompatibleStateImageBehavior = false; + this.lvKeywords.View = System.Windows.Forms.View.Details; + this.lvKeywords.ItemActivate += new System.EventHandler(this.lvKeywords_ItemActivate); + this.lvKeywords.SelectedIndexChanged += new System.EventHandler(this.lvKeywords_SelectedIndexChanged); + // + // chKeyword + // + this.chKeyword.Text = "Keyword"; + this.chKeyword.Width = 307; + // + // fraFiles + // + this.fraFiles.Controls.Add(this.cmdFileClear); + this.fraFiles.Controls.Add(this.cmdFileAdd); + this.fraFiles.Controls.Add(this.cmdFileRemove); + this.fraFiles.Controls.Add(this.lvFiles); + this.fraFiles.Controls.Add(this.cmdFileModify); + this.fraFiles.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraFiles.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraFiles.Location = new System.Drawing.Point(340, 3); + this.fraFiles.Name = "fraFiles"; + this.fraFiles.Size = new System.Drawing.Size(331, 163); + this.fraFiles.TabIndex = 1; + this.fraFiles.TabStop = false; + this.fraFiles.Text = "Files"; + // + // cmdFileClear + // + this.cmdFileClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdFileClear.Enabled = false; + this.cmdFileClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFileClear.Location = new System.Drawing.Point(250, 19); + this.cmdFileClear.Name = "cmdFileClear"; + this.cmdFileClear.Size = new System.Drawing.Size(75, 23); + this.cmdFileClear.TabIndex = 3; + this.cmdFileClear.Text = "Cl&ear"; + this.cmdFileClear.UseVisualStyleBackColor = true; + this.cmdFileClear.Click += new System.EventHandler(this.cmdFileClear_Click); + // + // cmdFileAdd + // + this.cmdFileAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFileAdd.Location = new System.Drawing.Point(6, 19); + this.cmdFileAdd.Name = "cmdFileAdd"; + this.cmdFileAdd.Size = new System.Drawing.Size(75, 23); + this.cmdFileAdd.TabIndex = 0; + this.cmdFileAdd.Text = "&Add..."; + this.cmdFileAdd.UseVisualStyleBackColor = true; + this.cmdFileAdd.Click += new System.EventHandler(this.cmdFileAdd_Click); + // + // cmdFileRemove + // + this.cmdFileRemove.Enabled = false; + this.cmdFileRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFileRemove.Location = new System.Drawing.Point(168, 19); + this.cmdFileRemove.Name = "cmdFileRemove"; + this.cmdFileRemove.Size = new System.Drawing.Size(75, 23); + this.cmdFileRemove.TabIndex = 2; + this.cmdFileRemove.Text = "&Remove"; + this.cmdFileRemove.UseVisualStyleBackColor = true; + this.cmdFileRemove.Click += new System.EventHandler(this.cmdFileRemove_Click); + // + // lvFiles + // + this.lvFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chFileName}); + this.lvFiles.FullRowSelect = true; + this.lvFiles.GridLines = true; + this.lvFiles.HideSelection = false; + this.lvFiles.Location = new System.Drawing.Point(6, 48); + this.lvFiles.Name = "lvFiles"; + this.lvFiles.Size = new System.Drawing.Size(319, 109); + this.lvFiles.TabIndex = 4; + this.lvFiles.UseCompatibleStateImageBehavior = false; + this.lvFiles.View = System.Windows.Forms.View.Details; + this.lvFiles.ItemActivate += new System.EventHandler(this.lvFiles_ItemActivate); + this.lvFiles.SelectedIndexChanged += new System.EventHandler(this.lvFiles_SelectedIndexChanged); + // + // chFileName + // + this.chFileName.Text = "File name"; + this.chFileName.Width = 309; + // + // cmdFileModify + // + this.cmdFileModify.Enabled = false; + this.cmdFileModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFileModify.Location = new System.Drawing.Point(87, 19); + this.cmdFileModify.Name = "cmdFileModify"; + this.cmdFileModify.Size = new System.Drawing.Size(75, 23); + this.cmdFileModify.TabIndex = 1; + this.cmdFileModify.Text = "&Modify..."; + this.cmdFileModify.UseVisualStyleBackColor = true; + this.cmdFileModify.Click += new System.EventHandler(this.cmdFileModify_Click); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(611, 295); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 10; + this.cmdCancel.Text = "Ca&ncel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(530, 295); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 9; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // ProductPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(698, 331); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.tblKeywordsFiles); + this.Controls.Add(this.cboListing); + this.Controls.Add(this.cboPlatform); + this.Controls.Add(this.lblListing); + this.Controls.Add(this.cboCategory); + this.Controls.Add(this.lblPlatform); + this.Controls.Add(this.txtProductTitle); + this.Controls.Add(this.lblCategory); + this.Controls.Add(this.lblProductTitle); + this.MinimumSize = new System.Drawing.Size(714, 369); + this.Name = "ProductPropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Product Properties"; + this.tblKeywordsFiles.ResumeLayout(false); + this.fraKeywords.ResumeLayout(false); + this.fraFiles.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblProductTitle; + internal System.Windows.Forms.TextBox txtProductTitle; + internal System.Windows.Forms.ComboBox cboCategory; + private System.Windows.Forms.Label lblCategory; + private System.Windows.Forms.Label lblPlatform; + internal System.Windows.Forms.ComboBox cboPlatform; + private System.Windows.Forms.Label lblListing; + internal System.Windows.Forms.ComboBox cboListing; + private System.Windows.Forms.TableLayoutPanel tblKeywordsFiles; + private System.Windows.Forms.GroupBox fraKeywords; + private System.Windows.Forms.GroupBox fraFiles; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.ListView lvKeywords; + private System.Windows.Forms.Button cmdKeywordAdd; + private System.Windows.Forms.Button cmdKeywordClear; + private System.Windows.Forms.Button cmdKeywordRemove; + private System.Windows.Forms.Button cmdKeywordModify; + private System.Windows.Forms.Button cmdFileClear; + private System.Windows.Forms.Button cmdFileAdd; + private System.Windows.Forms.Button cmdFileRemove; + internal System.Windows.Forms.ListView lvFiles; + private System.Windows.Forms.Button cmdFileModify; + private System.Windows.Forms.ColumnHeader chKeyword; + private System.Windows.Forms.ColumnHeader chFileName; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.cs new file mode 100644 index 00000000..850ecd7b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.cs @@ -0,0 +1,283 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Dialogs.Catalog.ArkAngles +{ + internal partial class ProductPropertiesDialogImpl : Form + { + public ProductPropertiesDialogImpl() + { + InitializeComponent(); + + Font = SystemFonts.MenuFont; + + RefreshButtons(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtProductTitle.Text)) + { + MessageBox.Show("Please enter a product title.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + List warnings = new List(); + if (cboCategory.SelectedIndex == -1) + { + warnings.Add("You did not specify a category."); + } + if (cboPlatform.SelectedIndex == -1) + { + warnings.Add("You did not specify a platform."); + } + if (cboListing.SelectedIndex == -1) + { + warnings.Add("You did not specify a listing."); + } + + if (warnings.Count > 0) + { + StringBuilder issues = new StringBuilder(); + foreach (string warning in warnings) + { + issues.Append("•"); + issues.Append(" "); + issues.Append(warning); + if (warnings.IndexOf(warning) < warnings.Count - 1) issues.AppendLine(); + } + if (MessageBox.Show("The following issues were detected that you may want to resolve before continuing:\r\n\r\n" + issues.ToString() + "\r\n\r\nContinue anyway?", "Unresolved Issues", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.No) return; + } + + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdKeywordAdd_Click(object sender, EventArgs e) + { + KeywordPropertiesDialog dlg = new KeywordPropertiesDialog(); + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = dlg.Item; + lvKeywords.Items.Add(lvi); + } + } + + private void cmdKeywordModify_Click(object sender, EventArgs e) + { + if (lvKeywords.SelectedItems.Count < 1) return; + + KeywordPropertiesDialog dlg = new KeywordPropertiesDialog(); + dlg.Item = lvKeywords.SelectedItems[0].Text; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + lvKeywords.SelectedItems[0].Text = dlg.Item; + } + } + + private void cmdKeywordRemove_Click(object sender, EventArgs e) + { + if (lvKeywords.SelectedItems.Count < 1) return; + + if (MessageBox.Show("Are you sure you want to remove the selected keywords from the list?", "Remove Keywords", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) return; + + while (lvKeywords.SelectedItems.Count > 0) + { + lvKeywords.SelectedItems[0].Remove(); + } + } + + private void cmdKeywordClear_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to remove all keywords from the list?", "Remove Keywords", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) return; + lvKeywords.Items.Clear(); + } + + private void lvKeywords_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void lvKeywords_ItemActivate(object sender, EventArgs e) + { + cmdKeywordModify_Click(sender, e); + } + + private void RefreshButtons() + { + cmdKeywordModify.Enabled = (lvKeywords.SelectedItems.Count == 1); + cmdKeywordRemove.Enabled = (lvKeywords.SelectedItems.Count >= 1); + cmdKeywordClear.Enabled = (lvKeywords.Items.Count > 0); + + cmdFileModify.Enabled = (lvFiles.SelectedItems.Count == 1); + cmdFileRemove.Enabled = (lvFiles.SelectedItems.Count >= 1); + cmdFileClear.Enabled = (lvFiles.Items.Count > 0); + } + + private void cmdFileAdd_Click(object sender, EventArgs e) + { + AttachmentPropertiesDialog dlg = new AttachmentPropertiesDialog(); + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = dlg.Item; + lvFiles.Items.Add(lvi); + } + } + + private void cmdFileModify_Click(object sender, EventArgs e) + { + if (lvFiles.SelectedItems.Count < 1) return; + + AttachmentPropertiesDialog dlg = new AttachmentPropertiesDialog(); + dlg.Item = lvFiles.SelectedItems[0].Text; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + lvFiles.SelectedItems[0].Text = dlg.Item; + } + } + + private void cmdFileRemove_Click(object sender, EventArgs e) + { + if (lvFiles.SelectedItems.Count < 1) return; + + if (MessageBox.Show("Are you sure you want to remove the selected files from the list?", "Remove Files", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) return; + + while (lvFiles.SelectedItems.Count > 0) + { + lvFiles.SelectedItems[0].Remove(); + } + } + + private void cmdFileClear_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to remove all files from the list?", "Remove Files", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) return; + lvFiles.Items.Clear(); + } + + private void lvFiles_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void lvFiles_ItemActivate(object sender, EventArgs e) + { + cmdFileModify_Click(sender, e); + } + } + public class ProductPropertiesDialog + { + private CatalogObjectModel mvarCatalog = null; + public CatalogObjectModel Catalog { get { return mvarCatalog; } set { mvarCatalog = value; } } + + private Product mvarItem = null; + public Product Item { get { return mvarItem; } set { mvarItem = value; } } + + public DialogResult ShowDialog() + { + if (mvarCatalog == null) throw new ArgumentNullException("Please specify a catalog"); + + ProductPropertiesDialogImpl dlg = new ProductPropertiesDialogImpl(); + + dlg.cboCategory.Items.Clear(); + foreach (Category item in mvarCatalog.Categories) + { + dlg.cboCategory.Items.Add(item); + } + + dlg.cboListing.Items.Clear(); + foreach (Listing item in mvarCatalog.Listings) + { + dlg.cboListing.Items.Add(item); + } + + dlg.cboPlatform.Items.Clear(); + foreach (Platform item in mvarCatalog.Platforms) + { + dlg.cboPlatform.Items.Add(item); + } + + if (mvarItem == null) mvarItem = new Product(); + + if (mvarItem.Category == null) + { + dlg.cboCategory.SelectedItem = null; + } + else + { + dlg.cboCategory.SelectedItem = mvarItem.Category; + } + + if (mvarItem.Listing == null) + { + dlg.cboListing.SelectedItem = null; + } + else + { + dlg.cboListing.SelectedItem = mvarItem.Listing; + } + + if (mvarItem.Platform == null) + { + dlg.cboPlatform.SelectedItem = null; + } + else + { + dlg.cboPlatform.SelectedItem = mvarItem.Platform; + } + + dlg.txtProductTitle.Text = mvarItem.Title; + + foreach (string keyword in mvarItem.Keywords) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = keyword; + dlg.lvKeywords.Items.Add(lvi); + } + + foreach (string fileName in mvarItem.AssociatedFiles) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = fileName; + dlg.lvFiles.Items.Add(lvi); + } + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarItem.Category = (dlg.cboCategory.SelectedItem as Category); + mvarItem.Listing = (dlg.cboListing.SelectedItem as Listing); + mvarItem.Platform = (dlg.cboPlatform.SelectedItem as Platform); + mvarItem.Title = dlg.txtProductTitle.Text; + + mvarItem.Keywords.Clear(); + foreach (ListViewItem lvi in dlg.lvKeywords.Items) + { + mvarItem.Keywords.Add(lvi.Text); + } + + mvarItem.AssociatedFiles.Clear(); + foreach (ListViewItem lvi in dlg.lvFiles.Items) + { + mvarItem.AssociatedFiles.Add(lvi.Text); + } + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Catalog/ArkAngles/ProductPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.Designer.cs new file mode 100644 index 00000000..43fe93ba --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.Designer.cs @@ -0,0 +1,47 @@ +namespace UniversalEditor.Dialogs.Setup.ArkAngles +{ + partial class ActionPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ActionPropertiesDialogImpl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(447, 274); + this.Name = "ActionPropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Action Properties"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.cs new file mode 100644 index 00000000..98f652a4 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Setup.ArkAngles +{ + internal partial class ActionPropertiesDialogImpl : Form + { + public ActionPropertiesDialogImpl() + { + InitializeComponent(); + } + } + public class ActionPropertiesDialog + { + public DialogResult ShowDialog() + { + ActionPropertiesDialogImpl dlg = new ActionPropertiesDialogImpl(); + if (dlg.ShowDialog() == DialogResult.OK) + { + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Dialogs/Setup/ArkAngles/ActionPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.Designer.cs new file mode 100644 index 00000000..bed648e9 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.Designer.cs @@ -0,0 +1,556 @@ +namespace UniversalEditor.Editors.Catalog.ArkAngles +{ + partial class ArkAnglesCatalogEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode36 = new System.Windows.Forms.TreeNode("General"); + System.Windows.Forms.TreeNode treeNode37 = new System.Windows.Forms.TreeNode("Categories"); + System.Windows.Forms.TreeNode treeNode38 = new System.Windows.Forms.TreeNode("Platforms"); + System.Windows.Forms.TreeNode treeNode39 = new System.Windows.Forms.TreeNode("Listings"); + System.Windows.Forms.TreeNode treeNode40 = new System.Windows.Forms.TreeNode("Products"); + this.scMain = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlPlatforms = new System.Windows.Forms.Panel(); + this.cmdPlatformClear = new System.Windows.Forms.Button(); + this.cmdPlatformRemove = new System.Windows.Forms.Button(); + this.cmdPlatformModify = new System.Windows.Forms.Button(); + this.cmdPlatformAdd = new System.Windows.Forms.Button(); + this.lvPlatforms = new System.Windows.Forms.ListView(); + this.chPlatformTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chPlatformProducts = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlCategories = new System.Windows.Forms.Panel(); + this.cmdCategoryClear = new System.Windows.Forms.Button(); + this.cmdCategoryRemove = new System.Windows.Forms.Button(); + this.cmdCategoryModify = new System.Windows.Forms.Button(); + this.cmdCategoryAdd = new System.Windows.Forms.Button(); + this.lvCategories = new System.Windows.Forms.ListView(); + this.chCategoryTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chCategoryProducts = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlGeneral = new System.Windows.Forms.Panel(); + this.pnlProducts = new System.Windows.Forms.Panel(); + this.cmdProductClear = new System.Windows.Forms.Button(); + this.cmdProductRemove = new System.Windows.Forms.Button(); + this.cmdProductModify = new System.Windows.Forms.Button(); + this.cmdProductAdd = new System.Windows.Forms.Button(); + this.lvProducts = new System.Windows.Forms.ListView(); + this.chProductTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chProductCategory = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chProductPlatform = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chProductListing = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlListings = new System.Windows.Forms.Panel(); + this.cmdListingClear = new System.Windows.Forms.Button(); + this.cmdListingRemove = new System.Windows.Forms.Button(); + this.cmdListingModify = new System.Windows.Forms.Button(); + this.cmdListingsAdd = new System.Windows.Forms.Button(); + this.lvListings = new System.Windows.Forms.ListView(); + this.chListingTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chListingProductCount = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.scMain.Panel1.SuspendLayout(); + this.scMain.Panel2.SuspendLayout(); + this.scMain.SuspendLayout(); + this.pnlPlatforms.SuspendLayout(); + this.pnlCategories.SuspendLayout(); + this.pnlProducts.SuspendLayout(); + this.pnlListings.SuspendLayout(); + this.SuspendLayout(); + // + // scMain + // + this.scMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.scMain.Location = new System.Drawing.Point(0, 0); + this.scMain.Name = "scMain"; + // + // scMain.Panel1 + // + this.scMain.Panel1.Controls.Add(this.tv); + // + // scMain.Panel2 + // + this.scMain.Panel2.Controls.Add(this.pnlCategories); + this.scMain.Panel2.Controls.Add(this.pnlGeneral); + this.scMain.Panel2.Controls.Add(this.pnlProducts); + this.scMain.Panel2.Controls.Add(this.pnlListings); + this.scMain.Panel2.Controls.Add(this.pnlPlatforms); + this.scMain.Size = new System.Drawing.Size(492, 376); + this.scMain.SplitterDistance = 164; + this.scMain.TabIndex = 0; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode36.Name = "nodeGeneral"; + treeNode36.Text = "General"; + treeNode37.Name = "nodeCategories"; + treeNode37.Text = "Categories"; + treeNode38.Name = "nodePlatforms"; + treeNode38.Text = "Platforms"; + treeNode39.Name = "nodeListings"; + treeNode39.Text = "Listings"; + treeNode40.Name = "nodeProducts"; + treeNode40.Text = "Products"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode36, + treeNode37, + treeNode38, + treeNode39, + treeNode40}); + this.tv.Size = new System.Drawing.Size(164, 376); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // pnlPlatforms + // + this.pnlPlatforms.Controls.Add(this.cmdPlatformClear); + this.pnlPlatforms.Controls.Add(this.cmdPlatformRemove); + this.pnlPlatforms.Controls.Add(this.cmdPlatformModify); + this.pnlPlatforms.Controls.Add(this.cmdPlatformAdd); + this.pnlPlatforms.Controls.Add(this.lvPlatforms); + this.pnlPlatforms.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlPlatforms.Location = new System.Drawing.Point(0, 0); + this.pnlPlatforms.Name = "pnlPlatforms"; + this.pnlPlatforms.Size = new System.Drawing.Size(324, 376); + this.pnlPlatforms.TabIndex = 2; + // + // cmdPlatformClear + // + this.cmdPlatformClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdPlatformClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPlatformClear.Location = new System.Drawing.Point(246, 3); + this.cmdPlatformClear.Name = "cmdPlatformClear"; + this.cmdPlatformClear.Size = new System.Drawing.Size(75, 23); + this.cmdPlatformClear.TabIndex = 3; + this.cmdPlatformClear.Text = "&Clear"; + this.cmdPlatformClear.UseVisualStyleBackColor = true; + this.cmdPlatformClear.Click += new System.EventHandler(this.cmdPlatformClear_Click); + // + // cmdPlatformRemove + // + this.cmdPlatformRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPlatformRemove.Location = new System.Drawing.Point(165, 3); + this.cmdPlatformRemove.Name = "cmdPlatformRemove"; + this.cmdPlatformRemove.Size = new System.Drawing.Size(75, 23); + this.cmdPlatformRemove.TabIndex = 4; + this.cmdPlatformRemove.Text = "&Remove"; + this.cmdPlatformRemove.UseVisualStyleBackColor = true; + this.cmdPlatformRemove.Click += new System.EventHandler(this.cmdPlatformRemove_Click); + // + // cmdPlatformModify + // + this.cmdPlatformModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPlatformModify.Location = new System.Drawing.Point(84, 3); + this.cmdPlatformModify.Name = "cmdPlatformModify"; + this.cmdPlatformModify.Size = new System.Drawing.Size(75, 23); + this.cmdPlatformModify.TabIndex = 5; + this.cmdPlatformModify.Text = "&Modify"; + this.cmdPlatformModify.UseVisualStyleBackColor = true; + this.cmdPlatformModify.Click += new System.EventHandler(this.cmdPlatformModify_Click); + // + // cmdPlatformAdd + // + this.cmdPlatformAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPlatformAdd.Location = new System.Drawing.Point(3, 3); + this.cmdPlatformAdd.Name = "cmdPlatformAdd"; + this.cmdPlatformAdd.Size = new System.Drawing.Size(75, 23); + this.cmdPlatformAdd.TabIndex = 6; + this.cmdPlatformAdd.Text = "&Add"; + this.cmdPlatformAdd.UseVisualStyleBackColor = true; + this.cmdPlatformAdd.Click += new System.EventHandler(this.cmdPlatformAdd_Click); + // + // lvPlatforms + // + this.lvPlatforms.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvPlatforms.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chPlatformTitle, + this.chPlatformProducts}); + this.lvPlatforms.FullRowSelect = true; + this.lvPlatforms.GridLines = true; + this.lvPlatforms.HideSelection = false; + this.lvPlatforms.Location = new System.Drawing.Point(3, 32); + this.lvPlatforms.Name = "lvPlatforms"; + this.lvPlatforms.Size = new System.Drawing.Size(318, 341); + this.lvPlatforms.TabIndex = 2; + this.lvPlatforms.UseCompatibleStateImageBehavior = false; + this.lvPlatforms.View = System.Windows.Forms.View.Details; + this.lvPlatforms.ItemActivate += new System.EventHandler(this.lvPlatforms_ItemActivate); + this.lvPlatforms.SelectedIndexChanged += new System.EventHandler(this.lvPlatforms_SelectedIndexChanged); + // + // chPlatformTitle + // + this.chPlatformTitle.Text = "Title"; + this.chPlatformTitle.Width = 249; + // + // chPlatformProducts + // + this.chPlatformProducts.Text = "Products"; + // + // pnlCategories + // + this.pnlCategories.Controls.Add(this.cmdCategoryClear); + this.pnlCategories.Controls.Add(this.cmdCategoryRemove); + this.pnlCategories.Controls.Add(this.cmdCategoryModify); + this.pnlCategories.Controls.Add(this.cmdCategoryAdd); + this.pnlCategories.Controls.Add(this.lvCategories); + this.pnlCategories.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlCategories.Location = new System.Drawing.Point(0, 0); + this.pnlCategories.Name = "pnlCategories"; + this.pnlCategories.Size = new System.Drawing.Size(324, 376); + this.pnlCategories.TabIndex = 1; + // + // cmdCategoryClear + // + this.cmdCategoryClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCategoryClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCategoryClear.Location = new System.Drawing.Point(246, 3); + this.cmdCategoryClear.Name = "cmdCategoryClear"; + this.cmdCategoryClear.Size = new System.Drawing.Size(75, 23); + this.cmdCategoryClear.TabIndex = 3; + this.cmdCategoryClear.Text = "&Clear"; + this.cmdCategoryClear.UseVisualStyleBackColor = true; + this.cmdCategoryClear.Click += new System.EventHandler(this.cmdCategoryClear_Click); + // + // cmdCategoryRemove + // + this.cmdCategoryRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCategoryRemove.Location = new System.Drawing.Point(165, 3); + this.cmdCategoryRemove.Name = "cmdCategoryRemove"; + this.cmdCategoryRemove.Size = new System.Drawing.Size(75, 23); + this.cmdCategoryRemove.TabIndex = 4; + this.cmdCategoryRemove.Text = "&Remove"; + this.cmdCategoryRemove.UseVisualStyleBackColor = true; + this.cmdCategoryRemove.Click += new System.EventHandler(this.cmdCategoryRemove_Click); + // + // cmdCategoryModify + // + this.cmdCategoryModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCategoryModify.Location = new System.Drawing.Point(84, 3); + this.cmdCategoryModify.Name = "cmdCategoryModify"; + this.cmdCategoryModify.Size = new System.Drawing.Size(75, 23); + this.cmdCategoryModify.TabIndex = 5; + this.cmdCategoryModify.Text = "&Modify"; + this.cmdCategoryModify.UseVisualStyleBackColor = true; + this.cmdCategoryModify.Click += new System.EventHandler(this.cmdCategoryModify_Click); + // + // cmdCategoryAdd + // + this.cmdCategoryAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCategoryAdd.Location = new System.Drawing.Point(3, 3); + this.cmdCategoryAdd.Name = "cmdCategoryAdd"; + this.cmdCategoryAdd.Size = new System.Drawing.Size(75, 23); + this.cmdCategoryAdd.TabIndex = 6; + this.cmdCategoryAdd.Text = "&Add"; + this.cmdCategoryAdd.UseVisualStyleBackColor = true; + this.cmdCategoryAdd.Click += new System.EventHandler(this.cmdCategoryAdd_Click); + // + // lvCategories + // + this.lvCategories.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvCategories.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chCategoryTitle, + this.chCategoryProducts}); + this.lvCategories.FullRowSelect = true; + this.lvCategories.GridLines = true; + this.lvCategories.HideSelection = false; + this.lvCategories.Location = new System.Drawing.Point(3, 32); + this.lvCategories.Name = "lvCategories"; + this.lvCategories.Size = new System.Drawing.Size(318, 341); + this.lvCategories.TabIndex = 2; + this.lvCategories.UseCompatibleStateImageBehavior = false; + this.lvCategories.View = System.Windows.Forms.View.Details; + this.lvCategories.SelectedIndexChanged += new System.EventHandler(this.lvCategories_SelectedIndexChanged); + // + // chCategoryTitle + // + this.chCategoryTitle.Text = "Title"; + this.chCategoryTitle.Width = 113; + // + // chCategoryProducts + // + this.chCategoryProducts.Text = "Products"; + this.chCategoryProducts.Width = 81; + // + // pnlGeneral + // + this.pnlGeneral.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlGeneral.Location = new System.Drawing.Point(0, 0); + this.pnlGeneral.Name = "pnlGeneral"; + this.pnlGeneral.Size = new System.Drawing.Size(324, 376); + this.pnlGeneral.TabIndex = 0; + // + // pnlProducts + // + this.pnlProducts.Controls.Add(this.cmdProductClear); + this.pnlProducts.Controls.Add(this.cmdProductRemove); + this.pnlProducts.Controls.Add(this.cmdProductModify); + this.pnlProducts.Controls.Add(this.cmdProductAdd); + this.pnlProducts.Controls.Add(this.lvProducts); + this.pnlProducts.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlProducts.Location = new System.Drawing.Point(0, 0); + this.pnlProducts.Name = "pnlProducts"; + this.pnlProducts.Size = new System.Drawing.Size(324, 376); + this.pnlProducts.TabIndex = 4; + // + // cmdProductClear + // + this.cmdProductClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdProductClear.Enabled = false; + this.cmdProductClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdProductClear.Location = new System.Drawing.Point(246, 3); + this.cmdProductClear.Name = "cmdProductClear"; + this.cmdProductClear.Size = new System.Drawing.Size(75, 23); + this.cmdProductClear.TabIndex = 1; + this.cmdProductClear.Text = "&Clear"; + this.cmdProductClear.UseVisualStyleBackColor = true; + this.cmdProductClear.Click += new System.EventHandler(this.cmdProductClear_Click); + // + // cmdProductRemove + // + this.cmdProductRemove.Enabled = false; + this.cmdProductRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdProductRemove.Location = new System.Drawing.Point(165, 3); + this.cmdProductRemove.Name = "cmdProductRemove"; + this.cmdProductRemove.Size = new System.Drawing.Size(75, 23); + this.cmdProductRemove.TabIndex = 1; + this.cmdProductRemove.Text = "&Remove"; + this.cmdProductRemove.UseVisualStyleBackColor = true; + this.cmdProductRemove.Click += new System.EventHandler(this.cmdProductRemove_Click); + // + // cmdProductModify + // + this.cmdProductModify.Enabled = false; + this.cmdProductModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdProductModify.Location = new System.Drawing.Point(84, 3); + this.cmdProductModify.Name = "cmdProductModify"; + this.cmdProductModify.Size = new System.Drawing.Size(75, 23); + this.cmdProductModify.TabIndex = 1; + this.cmdProductModify.Text = "&Modify"; + this.cmdProductModify.UseVisualStyleBackColor = true; + this.cmdProductModify.Click += new System.EventHandler(this.cmdProductModify_Click); + // + // cmdProductAdd + // + this.cmdProductAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdProductAdd.Location = new System.Drawing.Point(3, 3); + this.cmdProductAdd.Name = "cmdProductAdd"; + this.cmdProductAdd.Size = new System.Drawing.Size(75, 23); + this.cmdProductAdd.TabIndex = 1; + this.cmdProductAdd.Text = "&Add"; + this.cmdProductAdd.UseVisualStyleBackColor = true; + this.cmdProductAdd.Click += new System.EventHandler(this.cmdProductAdd_Click); + // + // lvProducts + // + this.lvProducts.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvProducts.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chProductTitle, + this.chProductCategory, + this.chProductPlatform, + this.chProductListing}); + this.lvProducts.FullRowSelect = true; + this.lvProducts.GridLines = true; + this.lvProducts.HideSelection = false; + this.lvProducts.Location = new System.Drawing.Point(3, 32); + this.lvProducts.Name = "lvProducts"; + this.lvProducts.Size = new System.Drawing.Size(318, 341); + this.lvProducts.TabIndex = 0; + this.lvProducts.UseCompatibleStateImageBehavior = false; + this.lvProducts.View = System.Windows.Forms.View.Details; + this.lvProducts.ItemActivate += new System.EventHandler(this.lvProducts_ItemActivate); + this.lvProducts.SelectedIndexChanged += new System.EventHandler(this.lvProducts_SelectedIndexChanged); + // + // chProductTitle + // + this.chProductTitle.Text = "Title"; + this.chProductTitle.Width = 113; + // + // chProductCategory + // + this.chProductCategory.Text = "Category"; + // + // chProductPlatform + // + this.chProductPlatform.Text = "Platform"; + // + // chProductListing + // + this.chProductListing.Text = "Listing"; + this.chProductListing.Width = 81; + // + // pnlListings + // + this.pnlListings.Controls.Add(this.cmdListingClear); + this.pnlListings.Controls.Add(this.cmdListingRemove); + this.pnlListings.Controls.Add(this.cmdListingModify); + this.pnlListings.Controls.Add(this.cmdListingsAdd); + this.pnlListings.Controls.Add(this.lvListings); + this.pnlListings.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlListings.Location = new System.Drawing.Point(0, 0); + this.pnlListings.Name = "pnlListings"; + this.pnlListings.Size = new System.Drawing.Size(324, 376); + this.pnlListings.TabIndex = 3; + // + // cmdListingClear + // + this.cmdListingClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdListingClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdListingClear.Location = new System.Drawing.Point(246, 3); + this.cmdListingClear.Name = "cmdListingClear"; + this.cmdListingClear.Size = new System.Drawing.Size(75, 23); + this.cmdListingClear.TabIndex = 3; + this.cmdListingClear.Text = "&Clear"; + this.cmdListingClear.UseVisualStyleBackColor = true; + this.cmdListingClear.Click += new System.EventHandler(this.cmdListingClear_Click); + // + // cmdListingRemove + // + this.cmdListingRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdListingRemove.Location = new System.Drawing.Point(165, 3); + this.cmdListingRemove.Name = "cmdListingRemove"; + this.cmdListingRemove.Size = new System.Drawing.Size(75, 23); + this.cmdListingRemove.TabIndex = 4; + this.cmdListingRemove.Text = "&Remove"; + this.cmdListingRemove.UseVisualStyleBackColor = true; + this.cmdListingRemove.Click += new System.EventHandler(this.cmdListingRemove_Click); + // + // cmdListingModify + // + this.cmdListingModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdListingModify.Location = new System.Drawing.Point(84, 3); + this.cmdListingModify.Name = "cmdListingModify"; + this.cmdListingModify.Size = new System.Drawing.Size(75, 23); + this.cmdListingModify.TabIndex = 5; + this.cmdListingModify.Text = "&Modify"; + this.cmdListingModify.UseVisualStyleBackColor = true; + this.cmdListingModify.Click += new System.EventHandler(this.cmdListingModify_Click); + // + // cmdListingsAdd + // + this.cmdListingsAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdListingsAdd.Location = new System.Drawing.Point(3, 3); + this.cmdListingsAdd.Name = "cmdListingsAdd"; + this.cmdListingsAdd.Size = new System.Drawing.Size(75, 23); + this.cmdListingsAdd.TabIndex = 6; + this.cmdListingsAdd.Text = "&Add"; + this.cmdListingsAdd.UseVisualStyleBackColor = true; + this.cmdListingsAdd.Click += new System.EventHandler(this.cmdListingAdd_Click); + // + // lvListings + // + this.lvListings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvListings.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chListingTitle, + this.chListingProductCount}); + this.lvListings.FullRowSelect = true; + this.lvListings.GridLines = true; + this.lvListings.HideSelection = false; + this.lvListings.Location = new System.Drawing.Point(3, 32); + this.lvListings.Name = "lvListings"; + this.lvListings.Size = new System.Drawing.Size(318, 341); + this.lvListings.TabIndex = 2; + this.lvListings.UseCompatibleStateImageBehavior = false; + this.lvListings.View = System.Windows.Forms.View.Details; + // + // chListingTitle + // + this.chListingTitle.Text = "Title"; + this.chListingTitle.Width = 252; + // + // chListingProductCount + // + this.chListingProductCount.Text = "Products"; + // + // ArkAnglesCatalogEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.scMain); + this.MinimumSize = new System.Drawing.Size(492, 376); + this.Name = "ArkAnglesCatalogEditor"; + this.Size = new System.Drawing.Size(492, 376); + this.scMain.Panel1.ResumeLayout(false); + this.scMain.Panel2.ResumeLayout(false); + this.scMain.ResumeLayout(false); + this.pnlPlatforms.ResumeLayout(false); + this.pnlCategories.ResumeLayout(false); + this.pnlProducts.ResumeLayout(false); + this.pnlListings.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer scMain; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlGeneral; + private System.Windows.Forms.Panel pnlListings; + private System.Windows.Forms.Panel pnlPlatforms; + private System.Windows.Forms.Panel pnlCategories; + private System.Windows.Forms.Panel pnlProducts; + private System.Windows.Forms.Button cmdProductClear; + private System.Windows.Forms.Button cmdProductRemove; + private System.Windows.Forms.Button cmdProductModify; + private System.Windows.Forms.Button cmdProductAdd; + private System.Windows.Forms.ListView lvProducts; + private System.Windows.Forms.ColumnHeader chProductTitle; + private System.Windows.Forms.ColumnHeader chProductCategory; + private System.Windows.Forms.ColumnHeader chProductPlatform; + private System.Windows.Forms.ColumnHeader chProductListing; + private System.Windows.Forms.Button cmdListingClear; + private System.Windows.Forms.Button cmdListingRemove; + private System.Windows.Forms.Button cmdListingModify; + private System.Windows.Forms.Button cmdListingsAdd; + private System.Windows.Forms.ListView lvListings; + private System.Windows.Forms.ColumnHeader chListingTitle; + private System.Windows.Forms.Button cmdPlatformClear; + private System.Windows.Forms.Button cmdPlatformRemove; + private System.Windows.Forms.Button cmdPlatformModify; + private System.Windows.Forms.Button cmdPlatformAdd; + private System.Windows.Forms.ListView lvPlatforms; + private System.Windows.Forms.ColumnHeader chPlatformTitle; + private System.Windows.Forms.Button cmdCategoryClear; + private System.Windows.Forms.Button cmdCategoryRemove; + private System.Windows.Forms.Button cmdCategoryModify; + private System.Windows.Forms.Button cmdCategoryAdd; + private System.Windows.Forms.ListView lvCategories; + private System.Windows.Forms.ColumnHeader chCategoryTitle; + private System.Windows.Forms.ColumnHeader chCategoryProducts; + private System.Windows.Forms.ColumnHeader chListingProductCount; + private System.Windows.Forms.ColumnHeader chPlatformProducts; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.cs new file mode 100644 index 00000000..6a52ed31 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.cs @@ -0,0 +1,386 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.Dialogs.Catalog.ArkAngles; +using UniversalEditor.ObjectModels.Catalog.ArkAngles; + +namespace UniversalEditor.Editors.Catalog.ArkAngles +{ + public partial class ArkAnglesCatalogEditor : Editor + { + public ArkAnglesCatalogEditor() + { + InitializeComponent(); + RefreshButtons(); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Catalog Editor"; + _er.SupportedObjectModels.Add(typeof(CatalogObjectModel)); + } + return _er; + } + + private void SwitchTo(string name) + { + foreach (Control ctl in scMain.Panel2.Controls) + { + if (name != null && (ctl.Name.Substring(3) == name)) + { + ctl.Enabled = true; + ctl.Visible = true; + continue; + } + + ctl.Visible = false; + ctl.Enabled = false; + } + RefreshButtons(); + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + SwitchTo(e.Node.Name.Substring(4)); + } + else + { + SwitchTo(null); + } + } + + private void cmdProductAdd_Click(object sender, EventArgs e) + { + ProductPropertiesDialog dlg = new ProductPropertiesDialog(); + dlg.Catalog = (ObjectModel as CatalogObjectModel); + if (dlg.ShowDialog() == DialogResult.OK) + { + (ObjectModel as CatalogObjectModel).Products.Add(dlg.Item); + + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, dlg.Item); + lvProducts.Items.Add(lvi); + } + } + + private void UpdateListViewItem(ref ListViewItem lvi, Product product) + { + lvi.Tag = product; + lvi.SubItems.Clear(); + + lvi.Text = product.Title; + lvi.SubItems.Add(product.Category == null ? String.Empty : product.Category.Title); + lvi.SubItems.Add(product.Platform == null ? String.Empty : product.Platform.Title); + lvi.SubItems.Add(product.Listing == null ? String.Empty : product.Listing.Title); + } + private void UpdateListViewItem(ref ListViewItem lvi, Listing listing) + { + lvi.Tag = listing; + lvi.Text = listing.Title; + } + private void UpdateListViewItem(ref ListViewItem lvi, Platform platform) + { + lvi.Tag = platform; + lvi.Text = platform.Title; + } + private void UpdateListViewItem(ref ListViewItem lvi, Category category) + { + lvi.Tag = category; + lvi.Text = category.Title; + } + + private void cmdProductModify_Click(object sender, EventArgs e) + { + ListViewItem lvi = lvProducts.SelectedItems[0]; + Product product = (lvi.Tag as Product); + if (product == null) return; + + ProductPropertiesDialog dlg = new ProductPropertiesDialog(); + dlg.Catalog = (ObjectModel as CatalogObjectModel); + dlg.Item = product; + if (dlg.ShowDialog() == DialogResult.OK) + { + UpdateListViewItem(ref lvi, dlg.Item); + } + } + + private void cmdProductRemove_Click(object sender, EventArgs e) + { + if (lvProducts.SelectedItems.Count > 0) + { + if (MessageBox.Show("Are you sure you want to remove the selected product(s) from the list?", "Remove Products", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + while (lvProducts.SelectedItems.Count > 0) + { + (ObjectModel as CatalogObjectModel).Products.Remove(lvProducts.SelectedItems[0].Tag as Product); + lvProducts.SelectedItems[0].Remove(); + } + RefreshButtons(); + } + } + + private void cmdProductClear_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to remove all product(s) from the list?", "Remove Products", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + (ObjectModel as CatalogObjectModel).Products.Clear(); + lvProducts.Items.Clear(); + RefreshButtons(); + } + + private void RefreshButtons() + { + cmdListingModify.Enabled = (lvListings.SelectedItems.Count == 1); + cmdListingRemove.Enabled = (lvListings.SelectedItems.Count > 0); + cmdListingClear.Enabled = (lvListings.Items.Count > 0); + + cmdCategoryModify.Enabled = (lvCategories.SelectedItems.Count == 1); + cmdCategoryRemove.Enabled = (lvCategories.SelectedItems.Count > 0); + cmdCategoryClear.Enabled = (lvCategories.Items.Count > 0); + + cmdPlatformModify.Enabled = (lvPlatforms.SelectedItems.Count == 1); + cmdPlatformRemove.Enabled = (lvPlatforms.SelectedItems.Count > 0); + cmdPlatformClear.Enabled = (lvPlatforms.Items.Count > 0); + + cmdProductModify.Enabled = (lvProducts.SelectedItems.Count == 1); + cmdProductRemove.Enabled = (lvProducts.SelectedItems.Count > 0); + cmdProductClear.Enabled = (lvProducts.Items.Count > 0); + } + + private void lvProducts_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void lvProducts_ItemActivate(object sender, EventArgs e) + { + cmdProductModify_Click(sender, e); + } + + private void cmdListingAdd_Click(object sender, EventArgs e) + { + ListingPropertiesDialog dlg = new ListingPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + (ObjectModel as CatalogObjectModel).Listings.Add(dlg.Item); + + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, dlg.Item); + lvListings.Items.Add(lvi); + } + } + + + private void cmdListingModify_Click(object sender, EventArgs e) + { + ListViewItem lvi = lvProducts.SelectedItems[0]; + Listing item = (lvi.Tag as Listing); + if (item == null) return; + + ListingPropertiesDialog dlg = new ListingPropertiesDialog(); + dlg.Item = item; + if (dlg.ShowDialog() == DialogResult.OK) + { + UpdateListViewItem(ref lvi, dlg.Item); + } + } + + private void cmdListingRemove_Click(object sender, EventArgs e) + { + if (lvListings.SelectedItems.Count > 0) + { + if (MessageBox.Show("Are you sure you want to remove the selected listing(s) from the list?", "Remove Listings", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + while (lvListings.SelectedItems.Count > 0) + { + (ObjectModel as CatalogObjectModel).Listings.Remove(lvListings.SelectedItems[0].Tag as Listing); + lvListings.SelectedItems[0].Remove(); + } + RefreshButtons(); + } + } + + private void cmdListingClear_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to remove all listing(s) from the list?", "Remove Listings", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + (ObjectModel as CatalogObjectModel).Listings.Clear(); + lvListings.Items.Clear(); + RefreshButtons(); + } + + #region Platform Management + private void cmdPlatformAdd_Click(object sender, EventArgs e) + { + PlatformPropertiesDialog dlg = new PlatformPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + (ObjectModel as CatalogObjectModel).Platforms.Add(dlg.Item); + + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, dlg.Item); + lvPlatforms.Items.Add(lvi); + } + } + + + private void cmdPlatformModify_Click(object sender, EventArgs e) + { + if (lvProducts.SelectedItems.Count <= 0) return; + + ListViewItem lvi = lvProducts.SelectedItems[0]; + Platform item = (lvi.Tag as Platform); + if (item == null) return; + + PlatformPropertiesDialog dlg = new PlatformPropertiesDialog(); + dlg.Item = item; + if (dlg.ShowDialog() == DialogResult.OK) + { + UpdateListViewItem(ref lvi, dlg.Item); + } + } + + private void cmdPlatformRemove_Click(object sender, EventArgs e) + { + if (lvPlatforms.SelectedItems.Count > 0) + { + if (MessageBox.Show("Are you sure you want to remove the selected platform(s) from the list?", "Remove Platforms", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + while (lvPlatforms.SelectedItems.Count > 0) + { + (ObjectModel as CatalogObjectModel).Platforms.Remove(lvPlatforms.SelectedItems[0].Tag as Platform); + lvPlatforms.SelectedItems[0].Remove(); + } + RefreshButtons(); + } + } + + private void cmdPlatformClear_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to remove all platform(s) from the list?", "Remove Platforms", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + (ObjectModel as CatalogObjectModel).Platforms.Clear(); + lvPlatforms.Items.Clear(); + RefreshButtons(); + } + + private void lvPlatforms_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void lvPlatforms_ItemActivate(object sender, EventArgs e) + { + cmdPlatformModify_Click(sender, e); + } + #endregion + + #region Category Management + + private void lvCategories_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void cmdCategoryAdd_Click(object sender, EventArgs e) + { + CategoryPropertiesDialog dlg = new CategoryPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + (ObjectModel as CatalogObjectModel).Categories.Add(dlg.Item); + + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, dlg.Item); + lvCategories.Items.Add(lvi); + } + } + + private void cmdCategoryModify_Click(object sender, EventArgs e) + { + if (lvProducts.SelectedItems.Count <= 0) return; + + ListViewItem lvi = lvProducts.SelectedItems[0]; + Category item = (lvi.Tag as Category); + if (item == null) return; + + CategoryPropertiesDialog dlg = new CategoryPropertiesDialog(); + dlg.Item = item; + if (dlg.ShowDialog() == DialogResult.OK) + { + UpdateListViewItem(ref lvi, dlg.Item); + } + } + + private void cmdCategoryRemove_Click(object sender, EventArgs e) + { + if (lvCategories.SelectedItems.Count > 0) + { + if (MessageBox.Show("Are you sure you want to remove the selected categories from the list?", "Remove Categories", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + while (lvPlatforms.SelectedItems.Count > 0) + { + (ObjectModel as CatalogObjectModel).Categories.Remove(lvCategories.SelectedItems[0].Tag as Category); + lvCategories.SelectedItems[0].Remove(); + } + RefreshButtons(); + } + } + + private void cmdCategoryClear_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure you want to remove all categories from the list?", "Remove Categories", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + (ObjectModel as CatalogObjectModel).Categories.Clear(); + lvCategories.Items.Clear(); + RefreshButtons(); + } + + #endregion + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + lvCategories.Items.Clear(); + lvListings.Items.Clear(); + lvPlatforms.Items.Clear(); + lvProducts.Items.Clear(); + + CatalogObjectModel catalog = (ObjectModel as CatalogObjectModel); + if (catalog == null) return; + + foreach (Category item in catalog.Categories) + { + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, item); + lvCategories.Items.Add(lvi); + } + foreach (Listing item in catalog.Listings) + { + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, item); + lvListings.Items.Add(lvi); + } + foreach (Platform item in catalog.Platforms) + { + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, item); + lvPlatforms.Items.Add(lvi); + } + foreach (Product item in catalog.Products) + { + ListViewItem lvi = new ListViewItem(); + UpdateListViewItem(ref lvi, item); + lvProducts.Items.Add(lvi); + } + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Catalog/ArkAngles/ArkAnglesCatalogEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.Designer.cs new file mode 100644 index 00000000..9e9b56b6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.Designer.cs @@ -0,0 +1,734 @@ +namespace UniversalEditor.Editors.Setup.ArkAngles +{ + partial class ArkAnglesSetupEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("General"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Installation"); + this.lblProductTitle = new System.Windows.Forms.Label(); + this.txtHeaderText = new System.Windows.Forms.TextBox(); + this.lblFooterText = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.pnlUninstallationTitle = new System.Windows.Forms.Panel(); + this.label7 = new System.Windows.Forms.Label(); + this.picUninstallationTitle = new System.Windows.Forms.PictureBox(); + this.lblUninstallationTitle = new System.Windows.Forms.Label(); + this.lblLogFileName = new System.Windows.Forms.Label(); + this.txtLogFileName = new System.Windows.Forms.TextBox(); + this.pnlUninstallation = new System.Windows.Forms.Panel(); + this.chkRestart = new System.Windows.Forms.CheckBox(); + this.fraAutomatedActions = new System.Windows.Forms.GroupBox(); + this.cmdPostInstallActionMoveDown = new System.Windows.Forms.Button(); + this.cmdPostInstallActionMoveUp = new System.Windows.Forms.Button(); + this.lvPostInstallActions = new System.Windows.Forms.ListView(); + this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraAppearance = new System.Windows.Forms.GroupBox(); + this.lblAppearanceButtonLabel = new System.Windows.Forms.Label(); + this.lblAppearanceTitleBackground = new System.Windows.Forms.Label(); + this.lblAppearanceBackgroundBottom = new System.Windows.Forms.Label(); + this.lblAppearanceFooter = new System.Windows.Forms.Label(); + this.lblAppearanceTitleForeground = new System.Windows.Forms.Label(); + this.lblAppearanceBackgroundTop = new System.Windows.Forms.Label(); + this.cmdAppearanceButtonLabel = new System.Windows.Forms.Button(); + this.cmdAppearanceTitleBackground = new System.Windows.Forms.Button(); + this.cmdAppearanceBackgroundBottom = new System.Windows.Forms.Button(); + this.cmdAppearanceFooter = new System.Windows.Forms.Button(); + this.cmdAppearanceTitleForeground = new System.Windows.Forms.Button(); + this.lblAppearanceTitleShadowOffset = new System.Windows.Forms.Label(); + this.lblAppearanceOther = new System.Windows.Forms.Label(); + this.lblAppearanceTitle = new System.Windows.Forms.Label(); + this.txtAppearanceTitleShadowOffset = new System.Windows.Forms.NumericUpDown(); + this.cmdAppearanceBackgroundTop = new System.Windows.Forms.Button(); + this.lblAppearanceBackground = new System.Windows.Forms.Label(); + this.fraGeneral = new System.Windows.Forms.GroupBox(); + this.scMain = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlInstallation = new System.Windows.Forms.Panel(); + this.fraInstallationProcess = new System.Windows.Forms.GroupBox(); + this.pnlGeneral = new System.Windows.Forms.Panel(); + this.lv = new AwesomeControls.CollectionListView.CollectionListViewControl(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + this.pnlUninstallationTitle.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picUninstallationTitle)).BeginInit(); + this.pnlUninstallation.SuspendLayout(); + this.fraAutomatedActions.SuspendLayout(); + this.fraAppearance.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtAppearanceTitleShadowOffset)).BeginInit(); + this.fraGeneral.SuspendLayout(); + this.scMain.Panel1.SuspendLayout(); + this.scMain.Panel2.SuspendLayout(); + this.scMain.SuspendLayout(); + this.pnlInstallation.SuspendLayout(); + this.fraInstallationProcess.SuspendLayout(); + this.pnlGeneral.SuspendLayout(); + this.SuspendLayout(); + // + // lblProductTitle + // + this.lblProductTitle.AutoSize = true; + this.lblProductTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblProductTitle.Location = new System.Drawing.Point(6, 22); + this.lblProductTitle.Name = "lblProductTitle"; + this.lblProductTitle.Size = new System.Drawing.Size(65, 13); + this.lblProductTitle.TabIndex = 1; + this.lblProductTitle.Text = "&Header text:"; + // + // txtHeaderText + // + this.txtHeaderText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtHeaderText.Location = new System.Drawing.Point(77, 19); + this.txtHeaderText.Name = "txtHeaderText"; + this.txtHeaderText.Size = new System.Drawing.Size(169, 20); + this.txtHeaderText.TabIndex = 2; + this.txtHeaderText.Text = "Your Application Setup"; + // + // lblFooterText + // + this.lblFooterText.AutoSize = true; + this.lblFooterText.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblFooterText.Location = new System.Drawing.Point(6, 48); + this.lblFooterText.Name = "lblFooterText"; + this.lblFooterText.Size = new System.Drawing.Size(60, 13); + this.lblFooterText.TabIndex = 1; + this.lblFooterText.Text = "&Footer text:"; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(77, 45); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(169, 20); + this.textBox2.TabIndex = 2; + this.textBox2.Text = "Copyright ©2015 Your Company Name"; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(250, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(30, 13); + this.label2.TabIndex = 1; + this.label2.Text = "&Size:"; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(252, 48); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(30, 13); + this.label3.TabIndex = 1; + this.label3.Text = "Si&ze:"; + // + // numericUpDown1 + // + this.numericUpDown1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.numericUpDown1.Location = new System.Drawing.Point(288, 20); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(49, 20); + this.numericUpDown1.TabIndex = 3; + this.numericUpDown1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.numericUpDown1.Value = new decimal(new int[] { + 23, + 0, + 0, + 0}); + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(343, 22); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(16, 13); + this.label4.TabIndex = 1; + this.label4.Text = "pt"; + // + // numericUpDown2 + // + this.numericUpDown2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.numericUpDown2.Location = new System.Drawing.Point(286, 46); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(49, 20); + this.numericUpDown2.TabIndex = 3; + this.numericUpDown2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(341, 48); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(16, 13); + this.label5.TabIndex = 1; + this.label5.Text = "pt"; + // + // pnlUninstallationTitle + // + this.pnlUninstallationTitle.BackColor = System.Drawing.SystemColors.Window; + this.pnlUninstallationTitle.Controls.Add(this.label7); + this.pnlUninstallationTitle.Controls.Add(this.picUninstallationTitle); + this.pnlUninstallationTitle.Controls.Add(this.lblUninstallationTitle); + this.pnlUninstallationTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlUninstallationTitle.Location = new System.Drawing.Point(0, 0); + this.pnlUninstallationTitle.Name = "pnlUninstallationTitle"; + this.pnlUninstallationTitle.Size = new System.Drawing.Size(562, 56); + this.pnlUninstallationTitle.TabIndex = 5; + // + // label7 + // + this.label7.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.label7.Dock = System.Windows.Forms.DockStyle.Bottom; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(0, 54); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(562, 2); + this.label7.TabIndex = 0; + // + // picUninstallationTitle + // + this.picUninstallationTitle.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.picUninstallationTitle.Image = global::UniversalEditor.Properties.Resources.Uninstall; + this.picUninstallationTitle.Location = new System.Drawing.Point(13, 12); + this.picUninstallationTitle.Name = "picUninstallationTitle"; + this.picUninstallationTitle.Size = new System.Drawing.Size(32, 32); + this.picUninstallationTitle.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.picUninstallationTitle.TabIndex = 0; + this.picUninstallationTitle.TabStop = false; + // + // lblUninstallationTitle + // + this.lblUninstallationTitle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.lblUninstallationTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblUninstallationTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold); + this.lblUninstallationTitle.Location = new System.Drawing.Point(51, 22); + this.lblUninstallationTitle.Name = "lblUninstallationTitle"; + this.lblUninstallationTitle.Size = new System.Drawing.Size(508, 13); + this.lblUninstallationTitle.TabIndex = 1; + this.lblUninstallationTitle.Text = "Uninstallation"; + // + // lblLogFileName + // + this.lblLogFileName.AutoSize = true; + this.lblLogFileName.Location = new System.Drawing.Point(3, 65); + this.lblLogFileName.Name = "lblLogFileName"; + this.lblLogFileName.Size = new System.Drawing.Size(73, 13); + this.lblLogFileName.TabIndex = 6; + this.lblLogFileName.Text = "&Log file name:"; + // + // txtLogFileName + // + this.txtLogFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtLogFileName.Location = new System.Drawing.Point(82, 62); + this.txtLogFileName.Name = "txtLogFileName"; + this.txtLogFileName.Size = new System.Drawing.Size(477, 20); + this.txtLogFileName.TabIndex = 2; + // + // pnlUninstallation + // + this.pnlUninstallation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlUninstallation.Controls.Add(this.pnlUninstallationTitle); + this.pnlUninstallation.Controls.Add(this.lblLogFileName); + this.pnlUninstallation.Controls.Add(this.txtLogFileName); + this.pnlUninstallation.Location = new System.Drawing.Point(0, 322); + this.pnlUninstallation.Name = "pnlUninstallation"; + this.pnlUninstallation.Size = new System.Drawing.Size(562, 90); + this.pnlUninstallation.TabIndex = 7; + // + // chkRestart + // + this.chkRestart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.chkRestart.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkRestart.Location = new System.Drawing.Point(6, 103); + this.chkRestart.Name = "chkRestart"; + this.chkRestart.Size = new System.Drawing.Size(353, 17); + this.chkRestart.TabIndex = 7; + this.chkRestart.Text = "Provide &restart option upon installation completion"; + this.chkRestart.UseVisualStyleBackColor = true; + // + // fraAutomatedActions + // + this.fraAutomatedActions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraAutomatedActions.Controls.Add(this.cmdPostInstallActionMoveDown); + this.fraAutomatedActions.Controls.Add(this.cmdPostInstallActionMoveUp); + this.fraAutomatedActions.Controls.Add(this.lvPostInstallActions); + this.fraAutomatedActions.Controls.Add(this.chkRestart); + this.fraAutomatedActions.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraAutomatedActions.Location = new System.Drawing.Point(3, 3); + this.fraAutomatedActions.Name = "fraAutomatedActions"; + this.fraAutomatedActions.Size = new System.Drawing.Size(365, 131); + this.fraAutomatedActions.TabIndex = 8; + this.fraAutomatedActions.TabStop = false; + this.fraAutomatedActions.Text = "Automated actions"; + // + // cmdPostInstallActionMoveDown + // + this.cmdPostInstallActionMoveDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdPostInstallActionMoveDown.Enabled = false; + this.cmdPostInstallActionMoveDown.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPostInstallActionMoveDown.Location = new System.Drawing.Point(284, 48); + this.cmdPostInstallActionMoveDown.Name = "cmdPostInstallActionMoveDown"; + this.cmdPostInstallActionMoveDown.Size = new System.Drawing.Size(75, 23); + this.cmdPostInstallActionMoveDown.TabIndex = 1; + this.cmdPostInstallActionMoveDown.Text = "Move &Down"; + this.cmdPostInstallActionMoveDown.UseVisualStyleBackColor = true; + // + // cmdPostInstallActionMoveUp + // + this.cmdPostInstallActionMoveUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdPostInstallActionMoveUp.Enabled = false; + this.cmdPostInstallActionMoveUp.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPostInstallActionMoveUp.Location = new System.Drawing.Point(284, 19); + this.cmdPostInstallActionMoveUp.Name = "cmdPostInstallActionMoveUp"; + this.cmdPostInstallActionMoveUp.Size = new System.Drawing.Size(75, 23); + this.cmdPostInstallActionMoveUp.TabIndex = 1; + this.cmdPostInstallActionMoveUp.Text = "Move &Up"; + this.cmdPostInstallActionMoveUp.UseVisualStyleBackColor = true; + // + // lvPostInstallActions + // + this.lvPostInstallActions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvPostInstallActions.CheckBoxes = true; + this.lvPostInstallActions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTitle}); + this.lvPostInstallActions.FullRowSelect = true; + this.lvPostInstallActions.HideSelection = false; + this.lvPostInstallActions.Location = new System.Drawing.Point(6, 19); + this.lvPostInstallActions.Name = "lvPostInstallActions"; + this.lvPostInstallActions.Size = new System.Drawing.Size(272, 78); + this.lvPostInstallActions.TabIndex = 0; + this.lvPostInstallActions.UseCompatibleStateImageBehavior = false; + this.lvPostInstallActions.View = System.Windows.Forms.View.Details; + this.lvPostInstallActions.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.lvPostInstallActions_ItemCheck); + this.lvPostInstallActions.SelectedIndexChanged += new System.EventHandler(this.lvPostInstallActions_SelectedIndexChanged); + // + // chTitle + // + this.chTitle.Text = "Title"; + this.chTitle.Width = 185; + // + // fraAppearance + // + this.fraAppearance.Controls.Add(this.lblAppearanceButtonLabel); + this.fraAppearance.Controls.Add(this.lblAppearanceTitleBackground); + this.fraAppearance.Controls.Add(this.lblAppearanceBackgroundBottom); + this.fraAppearance.Controls.Add(this.lblAppearanceFooter); + this.fraAppearance.Controls.Add(this.lblAppearanceTitleForeground); + this.fraAppearance.Controls.Add(this.lblAppearanceBackgroundTop); + this.fraAppearance.Controls.Add(this.cmdAppearanceButtonLabel); + this.fraAppearance.Controls.Add(this.cmdAppearanceTitleBackground); + this.fraAppearance.Controls.Add(this.cmdAppearanceBackgroundBottom); + this.fraAppearance.Controls.Add(this.cmdAppearanceFooter); + this.fraAppearance.Controls.Add(this.cmdAppearanceTitleForeground); + this.fraAppearance.Controls.Add(this.lblAppearanceTitleShadowOffset); + this.fraAppearance.Controls.Add(this.lblAppearanceOther); + this.fraAppearance.Controls.Add(this.lblAppearanceTitle); + this.fraAppearance.Controls.Add(this.txtAppearanceTitleShadowOffset); + this.fraAppearance.Controls.Add(this.cmdAppearanceBackgroundTop); + this.fraAppearance.Controls.Add(this.lblAppearanceBackground); + this.fraAppearance.Location = new System.Drawing.Point(3, 86); + this.fraAppearance.Name = "fraAppearance"; + this.fraAppearance.Size = new System.Drawing.Size(361, 198); + this.fraAppearance.TabIndex = 9; + this.fraAppearance.TabStop = false; + this.fraAppearance.Text = "Appearance"; + // + // lblAppearanceButtonLabel + // + this.lblAppearanceButtonLabel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceButtonLabel.Location = new System.Drawing.Point(161, 145); + this.lblAppearanceButtonLabel.Name = "lblAppearanceButtonLabel"; + this.lblAppearanceButtonLabel.Size = new System.Drawing.Size(75, 15); + this.lblAppearanceButtonLabel.TabIndex = 2; + this.lblAppearanceButtonLabel.Text = "Button Label"; + this.lblAppearanceButtonLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // lblAppearanceTitleBackground + // + this.lblAppearanceTitleBackground.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceTitleBackground.Location = new System.Drawing.Point(161, 97); + this.lblAppearanceTitleBackground.Name = "lblAppearanceTitleBackground"; + this.lblAppearanceTitleBackground.Size = new System.Drawing.Size(75, 15); + this.lblAppearanceTitleBackground.TabIndex = 2; + this.lblAppearanceTitleBackground.Text = "Background"; + this.lblAppearanceTitleBackground.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // lblAppearanceBackgroundBottom + // + this.lblAppearanceBackgroundBottom.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceBackgroundBottom.Location = new System.Drawing.Point(161, 49); + this.lblAppearanceBackgroundBottom.Name = "lblAppearanceBackgroundBottom"; + this.lblAppearanceBackgroundBottom.Size = new System.Drawing.Size(75, 15); + this.lblAppearanceBackgroundBottom.TabIndex = 2; + this.lblAppearanceBackgroundBottom.Text = "Bottom"; + this.lblAppearanceBackgroundBottom.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // lblAppearanceFooter + // + this.lblAppearanceFooter.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceFooter.Location = new System.Drawing.Point(80, 145); + this.lblAppearanceFooter.Name = "lblAppearanceFooter"; + this.lblAppearanceFooter.Size = new System.Drawing.Size(75, 15); + this.lblAppearanceFooter.TabIndex = 2; + this.lblAppearanceFooter.Text = "Footer"; + this.lblAppearanceFooter.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // lblAppearanceTitleForeground + // + this.lblAppearanceTitleForeground.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceTitleForeground.Location = new System.Drawing.Point(80, 97); + this.lblAppearanceTitleForeground.Name = "lblAppearanceTitleForeground"; + this.lblAppearanceTitleForeground.Size = new System.Drawing.Size(75, 15); + this.lblAppearanceTitleForeground.TabIndex = 2; + this.lblAppearanceTitleForeground.Text = "Foreground"; + this.lblAppearanceTitleForeground.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // lblAppearanceBackgroundTop + // + this.lblAppearanceBackgroundTop.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceBackgroundTop.Location = new System.Drawing.Point(80, 49); + this.lblAppearanceBackgroundTop.Name = "lblAppearanceBackgroundTop"; + this.lblAppearanceBackgroundTop.Size = new System.Drawing.Size(75, 15); + this.lblAppearanceBackgroundTop.TabIndex = 2; + this.lblAppearanceBackgroundTop.Text = "Top"; + this.lblAppearanceBackgroundTop.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // cmdAppearanceButtonLabel + // + this.cmdAppearanceButtonLabel.BackColor = System.Drawing.Color.Black; + this.cmdAppearanceButtonLabel.Location = new System.Drawing.Point(161, 115); + this.cmdAppearanceButtonLabel.Name = "cmdAppearanceButtonLabel"; + this.cmdAppearanceButtonLabel.Size = new System.Drawing.Size(75, 23); + this.cmdAppearanceButtonLabel.TabIndex = 1; + this.cmdAppearanceButtonLabel.UseVisualStyleBackColor = false; + this.cmdAppearanceButtonLabel.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdAppearanceTitleBackground + // + this.cmdAppearanceTitleBackground.BackColor = System.Drawing.Color.Black; + this.cmdAppearanceTitleBackground.Location = new System.Drawing.Point(161, 67); + this.cmdAppearanceTitleBackground.Name = "cmdAppearanceTitleBackground"; + this.cmdAppearanceTitleBackground.Size = new System.Drawing.Size(75, 23); + this.cmdAppearanceTitleBackground.TabIndex = 1; + this.cmdAppearanceTitleBackground.UseVisualStyleBackColor = false; + this.cmdAppearanceTitleBackground.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdAppearanceBackgroundBottom + // + this.cmdAppearanceBackgroundBottom.BackColor = System.Drawing.Color.Lime; + this.cmdAppearanceBackgroundBottom.Location = new System.Drawing.Point(161, 19); + this.cmdAppearanceBackgroundBottom.Name = "cmdAppearanceBackgroundBottom"; + this.cmdAppearanceBackgroundBottom.Size = new System.Drawing.Size(75, 23); + this.cmdAppearanceBackgroundBottom.TabIndex = 1; + this.cmdAppearanceBackgroundBottom.UseVisualStyleBackColor = false; + this.cmdAppearanceBackgroundBottom.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdAppearanceFooter + // + this.cmdAppearanceFooter.BackColor = System.Drawing.Color.Black; + this.cmdAppearanceFooter.Location = new System.Drawing.Point(80, 115); + this.cmdAppearanceFooter.Name = "cmdAppearanceFooter"; + this.cmdAppearanceFooter.Size = new System.Drawing.Size(75, 23); + this.cmdAppearanceFooter.TabIndex = 1; + this.cmdAppearanceFooter.UseVisualStyleBackColor = false; + this.cmdAppearanceFooter.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdAppearanceTitleForeground + // + this.cmdAppearanceTitleForeground.BackColor = System.Drawing.Color.White; + this.cmdAppearanceTitleForeground.Location = new System.Drawing.Point(80, 67); + this.cmdAppearanceTitleForeground.Name = "cmdAppearanceTitleForeground"; + this.cmdAppearanceTitleForeground.Size = new System.Drawing.Size(75, 23); + this.cmdAppearanceTitleForeground.TabIndex = 1; + this.cmdAppearanceTitleForeground.UseVisualStyleBackColor = false; + this.cmdAppearanceTitleForeground.Click += new System.EventHandler(this.cmdColor_Click); + // + // lblAppearanceTitleShadowOffset + // + this.lblAppearanceTitleShadowOffset.AutoSize = true; + this.lblAppearanceTitleShadowOffset.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceTitleShadowOffset.Location = new System.Drawing.Point(6, 174); + this.lblAppearanceTitleShadowOffset.Name = "lblAppearanceTitleShadowOffset"; + this.lblAppearanceTitleShadowOffset.Size = new System.Drawing.Size(99, 13); + this.lblAppearanceTitleShadowOffset.TabIndex = 0; + this.lblAppearanceTitleShadowOffset.Text = "Title shadow &offset:"; + // + // lblAppearanceOther + // + this.lblAppearanceOther.AutoSize = true; + this.lblAppearanceOther.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceOther.Location = new System.Drawing.Point(6, 120); + this.lblAppearanceOther.Name = "lblAppearanceOther"; + this.lblAppearanceOther.Size = new System.Drawing.Size(36, 13); + this.lblAppearanceOther.TabIndex = 0; + this.lblAppearanceOther.Text = "Other:"; + // + // lblAppearanceTitle + // + this.lblAppearanceTitle.AutoSize = true; + this.lblAppearanceTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceTitle.Location = new System.Drawing.Point(6, 72); + this.lblAppearanceTitle.Name = "lblAppearanceTitle"; + this.lblAppearanceTitle.Size = new System.Drawing.Size(30, 13); + this.lblAppearanceTitle.TabIndex = 0; + this.lblAppearanceTitle.Text = "Title:"; + // + // txtAppearanceTitleShadowOffset + // + this.txtAppearanceTitleShadowOffset.Location = new System.Drawing.Point(111, 172); + this.txtAppearanceTitleShadowOffset.Name = "txtAppearanceTitleShadowOffset"; + this.txtAppearanceTitleShadowOffset.Size = new System.Drawing.Size(49, 20); + this.txtAppearanceTitleShadowOffset.TabIndex = 3; + this.txtAppearanceTitleShadowOffset.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // cmdAppearanceBackgroundTop + // + this.cmdAppearanceBackgroundTop.BackColor = System.Drawing.Color.Cyan; + this.cmdAppearanceBackgroundTop.Location = new System.Drawing.Point(80, 19); + this.cmdAppearanceBackgroundTop.Name = "cmdAppearanceBackgroundTop"; + this.cmdAppearanceBackgroundTop.Size = new System.Drawing.Size(75, 23); + this.cmdAppearanceBackgroundTop.TabIndex = 1; + this.cmdAppearanceBackgroundTop.UseVisualStyleBackColor = false; + this.cmdAppearanceBackgroundTop.Click += new System.EventHandler(this.cmdColor_Click); + // + // lblAppearanceBackground + // + this.lblAppearanceBackground.AutoSize = true; + this.lblAppearanceBackground.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblAppearanceBackground.Location = new System.Drawing.Point(6, 24); + this.lblAppearanceBackground.Name = "lblAppearanceBackground"; + this.lblAppearanceBackground.Size = new System.Drawing.Size(68, 13); + this.lblAppearanceBackground.TabIndex = 0; + this.lblAppearanceBackground.Text = "Background:"; + // + // fraGeneral + // + this.fraGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraGeneral.Controls.Add(this.lblProductTitle); + this.fraGeneral.Controls.Add(this.textBox2); + this.fraGeneral.Controls.Add(this.label2); + this.fraGeneral.Controls.Add(this.txtHeaderText); + this.fraGeneral.Controls.Add(this.label4); + this.fraGeneral.Controls.Add(this.numericUpDown1); + this.fraGeneral.Controls.Add(this.label5); + this.fraGeneral.Controls.Add(this.lblFooterText); + this.fraGeneral.Controls.Add(this.label3); + this.fraGeneral.Controls.Add(this.numericUpDown2); + this.fraGeneral.Location = new System.Drawing.Point(3, 3); + this.fraGeneral.Name = "fraGeneral"; + this.fraGeneral.Size = new System.Drawing.Size(365, 77); + this.fraGeneral.TabIndex = 11; + this.fraGeneral.TabStop = false; + this.fraGeneral.Text = "General"; + // + // scMain + // + this.scMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.scMain.Location = new System.Drawing.Point(0, 0); + this.scMain.Name = "scMain"; + // + // scMain.Panel1 + // + this.scMain.Panel1.Controls.Add(this.tv); + // + // scMain.Panel2 + // + this.scMain.Panel2.Controls.Add(this.pnlInstallation); + this.scMain.Panel2.Controls.Add(this.pnlGeneral); + this.scMain.Size = new System.Drawing.Size(562, 412); + this.scMain.SplitterDistance = 187; + this.scMain.TabIndex = 13; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode1.Name = "nodeGeneral"; + treeNode1.Text = "General"; + treeNode2.Name = "nodeInstallation"; + treeNode2.Text = "Installation"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2}); + this.tv.Size = new System.Drawing.Size(187, 412); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // pnlInstallation + // + this.pnlInstallation.Controls.Add(this.fraInstallationProcess); + this.pnlInstallation.Controls.Add(this.fraAutomatedActions); + this.pnlInstallation.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlInstallation.Location = new System.Drawing.Point(0, 0); + this.pnlInstallation.Name = "pnlInstallation"; + this.pnlInstallation.Size = new System.Drawing.Size(371, 412); + this.pnlInstallation.TabIndex = 2; + // + // fraInstallationProcess + // + this.fraInstallationProcess.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraInstallationProcess.Controls.Add(this.lv); + this.fraInstallationProcess.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraInstallationProcess.Location = new System.Drawing.Point(3, 140); + this.fraInstallationProcess.Name = "fraInstallationProcess"; + this.fraInstallationProcess.Size = new System.Drawing.Size(365, 269); + this.fraInstallationProcess.TabIndex = 9; + this.fraInstallationProcess.TabStop = false; + this.fraInstallationProcess.Text = "Installation process"; + // + // pnlGeneral + // + this.pnlGeneral.Controls.Add(this.fraGeneral); + this.pnlGeneral.Controls.Add(this.fraAppearance); + this.pnlGeneral.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlGeneral.Location = new System.Drawing.Point(0, 0); + this.pnlGeneral.Name = "pnlGeneral"; + this.pnlGeneral.Size = new System.Drawing.Size(371, 412); + this.pnlGeneral.TabIndex = 0; + // + // lv + // + this.lv.AllowItemInsert = true; + this.lv.AllowItemModify = true; + this.lv.AllowItemRemove = true; + this.lv.AllowItemReorder = false; + this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lv.Location = new System.Drawing.Point(6, 19); + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(353, 244); + this.lv.TabIndex = 0; + // + // ArkAnglesSetupEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.scMain); + this.Controls.Add(this.pnlUninstallation); + this.Name = "ArkAnglesSetupEditor"; + this.Size = new System.Drawing.Size(562, 412); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + this.pnlUninstallationTitle.ResumeLayout(false); + this.pnlUninstallationTitle.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picUninstallationTitle)).EndInit(); + this.pnlUninstallation.ResumeLayout(false); + this.pnlUninstallation.PerformLayout(); + this.fraAutomatedActions.ResumeLayout(false); + this.fraAppearance.ResumeLayout(false); + this.fraAppearance.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtAppearanceTitleShadowOffset)).EndInit(); + this.fraGeneral.ResumeLayout(false); + this.fraGeneral.PerformLayout(); + this.scMain.Panel1.ResumeLayout(false); + this.scMain.Panel2.ResumeLayout(false); + this.scMain.ResumeLayout(false); + this.pnlInstallation.ResumeLayout(false); + this.fraInstallationProcess.ResumeLayout(false); + this.pnlGeneral.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblProductTitle; + private System.Windows.Forms.TextBox txtHeaderText; + private System.Windows.Forms.Label lblFooterText; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Panel pnlUninstallationTitle; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.PictureBox picUninstallationTitle; + private System.Windows.Forms.Label lblUninstallationTitle; + private System.Windows.Forms.Label lblLogFileName; + private System.Windows.Forms.TextBox txtLogFileName; + private System.Windows.Forms.Panel pnlUninstallation; + private System.Windows.Forms.CheckBox chkRestart; + private System.Windows.Forms.GroupBox fraAutomatedActions; + private System.Windows.Forms.Button cmdPostInstallActionMoveDown; + private System.Windows.Forms.Button cmdPostInstallActionMoveUp; + private System.Windows.Forms.ListView lvPostInstallActions; + private System.Windows.Forms.ColumnHeader chTitle; + private System.Windows.Forms.GroupBox fraAppearance; + private System.Windows.Forms.Button cmdAppearanceBackgroundBottom; + private System.Windows.Forms.Button cmdAppearanceBackgroundTop; + private System.Windows.Forms.Label lblAppearanceBackground; + private System.Windows.Forms.Label lblAppearanceBackgroundBottom; + private System.Windows.Forms.Label lblAppearanceBackgroundTop; + private System.Windows.Forms.Label lblAppearanceTitleBackground; + private System.Windows.Forms.Label lblAppearanceTitleForeground; + private System.Windows.Forms.Button cmdAppearanceTitleBackground; + private System.Windows.Forms.Button cmdAppearanceTitleForeground; + private System.Windows.Forms.Label lblAppearanceTitle; + private System.Windows.Forms.GroupBox fraGeneral; + private System.Windows.Forms.Label lblAppearanceTitleShadowOffset; + private System.Windows.Forms.NumericUpDown txtAppearanceTitleShadowOffset; + private System.Windows.Forms.Label lblAppearanceButtonLabel; + private System.Windows.Forms.Label lblAppearanceFooter; + private System.Windows.Forms.Button cmdAppearanceButtonLabel; + private System.Windows.Forms.Button cmdAppearanceFooter; + private System.Windows.Forms.Label lblAppearanceOther; + private System.Windows.Forms.SplitContainer scMain; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlInstallation; + private System.Windows.Forms.GroupBox fraInstallationProcess; + private System.Windows.Forms.Panel pnlGeneral; + private AwesomeControls.CollectionListView.CollectionListViewControl lv; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.cs new file mode 100644 index 00000000..11b6cccb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Dialogs.Setup.ArkAngles; +using UniversalEditor.ObjectModels.Setup.ArkAngles; +using UniversalEditor.ObjectModels.Setup.ArkAngles.Actions; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Setup.ArkAngles +{ + public partial class ArkAnglesSetupEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Ark Angles Setup editor"; + _er.SupportedObjectModels.Add(typeof(SetupObjectModel)); + } + return _er; + } + + public ArkAnglesSetupEditor() + { + InitializeComponent(); + + lvPostInstallActions.Items.Clear(); + + List cmds = new List(); + cmds.Add(AutoStartCommand.Install); + cmds.Add(AutoStartCommand.Catalog); + cmds.Add(null); + cmds.Add(AutoStartCommand.Restart); + cmds.Add(AutoStartCommand.Exit); + + foreach (AutoStartCommand cmd in cmds) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = cmd; + if (cmd == null) + { + lvi.Checked = true; + lvi.ForeColor = Color.FromKnownColor(KnownColor.GrayText); + lvi.Text = "(Installation Process)"; + } + else + { + if (cmd == AutoStartCommand.Install) + { + lvi.Text = "Install"; + } + else if (cmd == AutoStartCommand.Catalog) + { + lvi.Text = "Catalog"; + } + else if (cmd == AutoStartCommand.Restart) + { + lvi.Text = "Restart"; + } + else if (cmd == AutoStartCommand.Exit) + { + lvi.Text = "Exit"; + } + } + lvPostInstallActions.Items.Add(lvi); + } + + SwitchTo("General"); + } + + private void lvPostInstallActions_ItemCheck(object sender, ItemCheckEventArgs e) + { + if (lvPostInstallActions.Items[e.Index].Tag == null) e.NewValue = CheckState.Checked; + } + + private void lvPostInstallActions_SelectedIndexChanged(object sender, EventArgs e) + { + cmdPostInstallActionMoveDown.Enabled = (lvPostInstallActions.SelectedItems.Count == 1 && lvPostInstallActions.SelectedItems[0].Tag != null && lvPostInstallActions.SelectedItems[0].Index < lvPostInstallActions.Items.Count - 1); + cmdPostInstallActionMoveUp.Enabled = (lvPostInstallActions.SelectedItems.Count == 1 && lvPostInstallActions.SelectedItems[0].Tag != null && lvPostInstallActions.SelectedItems[0].Index > 0); + } + + private void cmdColor_Click(object sender, EventArgs e) + { + Control cmd = (sender as Control); + ColorDialog dlg = new ColorDialog(); + dlg.Color = cmd.BackColor; + if (dlg.ShowDialog() == DialogResult.OK) + { + cmd.BackColor = dlg.Color; + } + } + + private void SwitchTo(string name) + { + foreach (Control ctl in scMain.Panel2.Controls) + { + if (name != null && (ctl.Name.Substring(3) == name)) + { + ctl.Enabled = true; + ctl.Visible = true; + continue; + } + + ctl.Visible = false; + ctl.Enabled = false; + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + SwitchTo(e.Node.Name.Substring(4)); + } + else + { + SwitchTo(null); + } + } + + /* + private void cmdActionAdd_Click(object sender, EventArgs e) + { + ActionPropertiesDialog dlg = new ActionPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + + } + } + + private void cmdActionModify_Click(object sender, EventArgs e) + { + if (lvActions.SelectedItems.Count != 1) return; + + ActionPropertiesDialog dlg = new ActionPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + + } + } + */ + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Editors/Setup/ArkAngles/ArkAnglesSetupEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..df35a1bb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Ark Angles plugin for Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2015 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0745c53c-1c88-44ae-affb-fa319c3a5516")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.Designer.cs new file mode 100644 index 00000000..e1ea5add --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18444 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Setup { + get { + object obj = ResourceManager.GetObject("Setup", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Uninstall { + get { + object obj = ResourceManager.GetObject("Uninstall", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.resx new file mode 100644 index 00000000..663cc4be --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Setup.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Uninstall.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Resources/Setup.ico b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Resources/Setup.ico new file mode 100644 index 0000000000000000000000000000000000000000..3ea2605b6854f6fa29652044648fd9cf5d22b7a2 GIT binary patch literal 766 zcmbtSF>ZrE5ZuHkL5HifMyaBF0vA_AN|CR)uyjZiToK8D`;Za1z`w*~VD_z$ivM}mT z#*sS^7gJa)uthFL)3)u&sA^Bhhr)AJRg=-!7i-mkI2){e*B&MaHH7W8b>U4L;FWi6 z8d?)a(D2mwS?@W&q#@Mzvmt10D%p_XsU{3Mz`31h**VoIrz)D#BPMY|nI5PmskQ$@ ztJIp6>|5Ux|Im-epZ&iz$1mseREztUd}YmHKF{=YQS-YJLpXPQWv-5z(`M9C``i@W uS~h(u+1W@kUc!i8r07I8UI^-ApQwSwUwMHSf4^e%Qhx#H@wsCF literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Resources/Uninstall.ico b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/Resources/Uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..78083ce350f25e7a1eb69e1046a2b3c003a7a5e5 GIT binary patch literal 766 zcmZvZ!AiqG5Qe8Vkld0HQSs6mFX9XIs6q~c2VbQHVFNv63qtc8zJXB4H7B2=M{gwLX61$nILqOYeDt1ow;I?>GE$bd5xP{)ksu94O zzz&s$Q@#qV>Zsco7U!mTfOan6geF$7R+q-dOqemjmC4eu#8qed_rMzV$eH(xRdQoU{xAoR+o4vRoj5 zwi~c0y$N`^0gDa38IPf!ue|-wzfno$$I+zCWatwaw2=(gpAx@RpXpj;)b^QDV{-VN h>!}Q1z#H-djy(S_;Ya9fRygl*^eA%jEHdf5R9_ManS=lU literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..345ce539 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms/UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms.csproj @@ -0,0 +1,177 @@ + + + + + Debug + AnyCPU + {CF83423B-800F-4EF9-8955-E7A8C2C5C057} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.ArkAngles.UserInterface.WindowsForms + v3.5 + 512 + + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + ..\..\..\..\..\..\AwesomeControls\bin\Debug\AwesomeControls.dll + + + + + Form + + + AttachmentPropertiesDialog.cs + + + Form + + + KeywordPropertiesDialog.cs + + + Form + + + CategoryPropertiesDialog.cs + + + Form + + + PlatformPropertiesDialog.cs + + + Form + + + ListingPropertiesDialog.cs + + + Form + + + ProductPropertiesDialog.cs + + + Form + + + ActionPropertiesDialog.cs + + + UserControl + + + ArkAnglesCatalogEditor.cs + + + UserControl + + + ArkAnglesSetupEditor.cs + + + + True + True + Resources.resx + + + + + AttachmentPropertiesDialog.cs + + + KeywordPropertiesDialog.cs + + + CategoryPropertiesDialog.cs + + + PlatformPropertiesDialog.cs + + + ListingPropertiesDialog.cs + + + ProductPropertiesDialog.cs + + + ActionPropertiesDialog.cs + + + ArkAnglesCatalogEditor.cs + + + ArkAnglesSetupEditor.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {21D14362-103A-4B38-8FB8-EEA6C7C89E09} + UniversalEditor.Plugins.ArkAngles + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.Designer.cs new file mode 100644 index 00000000..e120f1ec --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.Editors +{ + partial class FixtureEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.cs new file mode 100644 index 00000000..b92f9ce8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/FixtureEditor.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.Editors +{ + public partial class FixtureEditor : UserControl + { + public FixtureEditor() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.Designer.cs new file mode 100644 index 00000000..89305423 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.Editors +{ + partial class LightingScriptEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.cs new file mode 100644 index 00000000..445baf22 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Editors/LightingScriptEditor.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.Editors +{ + public partial class LightingScriptEditor : UserControl + { + public LightingScriptEditor() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..5bf0e085 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UniversalEditor.Plugins.Auraluminous.UserInterface.WinForms")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("City of Orlando")] +[assembly: AssemblyProduct("UniversalEditor.Plugins.Auraluminous.UserInterface.WinForms")] +[assembly: AssemblyCopyright("Copyright © City of Orlando 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9b99390d-0e59-4262-b41a-98356efa6af5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..e0009ceb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms/UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms.csproj @@ -0,0 +1,112 @@ + + + + + Debug + AnyCPU + {15E460DD-7256-4645-ADFC-254FDE1B377A} + Library + Properties + UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms + UniversalEditor.Plugins.Auraluminous.UserInterface.WindowsForms + v3.5 + 512 + + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + UserControl + + + FixtureEditor.cs + + + UserControl + + + LightingScriptEditor.cs + + + + + + {88676fe6-d6c0-4480-bea0-a649d14cb1bd} + Auraluminous.Engine + + + {ef886e1a-d553-43da-857c-29da0d6e0dae} + UniversalEditor.Plugins.Auraluminous + + + {617d9eb5-ca93-45d6-aa6b-5a012b7698ac} + AwesomeControls + + + {0936544e-e909-4e70-870c-2f60acba480e} + Enttec.OpenDMX + + + {e735d457-50d8-4958-b68c-79617595b023} + FTD2XX + + + {ddc1ce36-60e0-4b09-a288-cb14ace252dd} + MonoMidi + + + {e0897b7b-617a-4709-a4c6-fc0f6b441b2a} + Surodoine + + + {3f664673-7e22-4486-9ad0-fc81861d0b78} + UniversalEditor.Compression + + + {2d4737e6-6d95-408a-90db-8dff38147e85} + UniversalEditor.Core + + + {8622ebc4-8e20-476e-b284-33d472081f5c} + UniversalEditor.UserInterface + + + {30467e5c-05bc-4856-aadc-13906ef4cadd} + UniversalEditor.Essential + + + {bcbb72bd-0ecb-4ff2-8d91-e466361fb6f9} + UniversalEditor.UserInterface.WindowsForms + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.Designer.cs new file mode 100644 index 00000000..dcc3df3d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.Designer.cs @@ -0,0 +1,271 @@ +namespace UniversalEditor.Editors.Executable +{ + partial class ExecutableEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlSections = new System.Windows.Forms.Panel(); + this.lvSections = new System.Windows.Forms.ListView(); + this.chSectionName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chSectionOffset = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chSectionLength = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.mnuContextListViewSections = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextListViewSectionsDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewSectionsSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextListViewSectionsImport = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextListViewSectionsExport = new System.Windows.Forms.ToolStripMenuItem(); + this.pnlSection = new System.Windows.Forms.Panel(); + this.lblSectionName = new System.Windows.Forms.Label(); + this.txtSectionName = new System.Windows.Forms.TextBox(); + this.fraSectionCharacteristics = new System.Windows.Forms.GroupBox(); + this.lvSectionCharacteristics = new System.Windows.Forms.ListView(); + this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlSections.SuspendLayout(); + this.mnuContextListViewSections.SuspendLayout(); + this.pnlSection.SuspendLayout(); + this.fraSectionCharacteristics.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlSection); + this.splitContainer1.Panel2.Controls.Add(this.pnlSections); + this.splitContainer1.Size = new System.Drawing.Size(502, 247); + this.splitContainer1.SplitterDistance = 167; + this.splitContainer1.TabIndex = 0; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(167, 247); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // pnlSections + // + this.pnlSections.Controls.Add(this.lvSections); + this.pnlSections.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlSections.Location = new System.Drawing.Point(0, 0); + this.pnlSections.Name = "pnlSections"; + this.pnlSections.Size = new System.Drawing.Size(331, 247); + this.pnlSections.TabIndex = 0; + // + // lvSections + // + this.lvSections.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chSectionName, + this.chSectionOffset, + this.chSectionLength}); + this.lvSections.ContextMenuStrip = this.mnuContextListViewSections; + this.lvSections.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvSections.FullRowSelect = true; + this.lvSections.GridLines = true; + this.lvSections.HideSelection = false; + this.lvSections.Location = new System.Drawing.Point(0, 0); + this.lvSections.Name = "lvSections"; + this.lvSections.Size = new System.Drawing.Size(331, 247); + this.lvSections.TabIndex = 0; + this.lvSections.UseCompatibleStateImageBehavior = false; + this.lvSections.View = System.Windows.Forms.View.Details; + // + // chSectionName + // + this.chSectionName.Text = "Name"; + this.chSectionName.Width = 191; + // + // chSectionOffset + // + this.chSectionOffset.Text = "Offset"; + // + // chSectionLength + // + this.chSectionLength.Text = "Length"; + // + // mnuContextListViewSections + // + this.mnuContextListViewSections.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextListViewSectionsDelete, + this.mnuContextListViewSectionsSep1, + this.mnuContextListViewSectionsImport, + this.mnuContextListViewSectionsExport}); + this.mnuContextListViewSections.Name = "mnuContextListViewSections"; + this.mnuContextListViewSections.Size = new System.Drawing.Size(119, 76); + this.mnuContextListViewSections.Opening += new System.ComponentModel.CancelEventHandler(this.mnuContextListViewSections_Opening); + // + // mnuContextListViewSectionsDelete + // + this.mnuContextListViewSectionsDelete.Name = "mnuContextListViewSectionsDelete"; + this.mnuContextListViewSectionsDelete.Size = new System.Drawing.Size(118, 22); + this.mnuContextListViewSectionsDelete.Text = "&Delete"; + this.mnuContextListViewSectionsDelete.Click += new System.EventHandler(this.mnuContextListViewSectionsDelete_Click); + // + // mnuContextListViewSectionsSep1 + // + this.mnuContextListViewSectionsSep1.Name = "mnuContextListViewSectionsSep1"; + this.mnuContextListViewSectionsSep1.Size = new System.Drawing.Size(115, 6); + // + // mnuContextListViewSectionsImport + // + this.mnuContextListViewSectionsImport.Name = "mnuContextListViewSectionsImport"; + this.mnuContextListViewSectionsImport.Size = new System.Drawing.Size(118, 22); + this.mnuContextListViewSectionsImport.Text = "&Import..."; + this.mnuContextListViewSectionsImport.Click += new System.EventHandler(this.mnuContextListViewSectionsImport_Click); + // + // mnuContextListViewSectionsExport + // + this.mnuContextListViewSectionsExport.Enabled = false; + this.mnuContextListViewSectionsExport.Name = "mnuContextListViewSectionsExport"; + this.mnuContextListViewSectionsExport.Size = new System.Drawing.Size(118, 22); + this.mnuContextListViewSectionsExport.Text = "&Export..."; + this.mnuContextListViewSectionsExport.Click += new System.EventHandler(this.mnuContextListViewSectionsExport_Click); + // + // pnlSection + // + this.pnlSection.Controls.Add(this.fraSectionCharacteristics); + this.pnlSection.Controls.Add(this.txtSectionName); + this.pnlSection.Controls.Add(this.lblSectionName); + this.pnlSection.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlSection.Location = new System.Drawing.Point(0, 0); + this.pnlSection.Name = "pnlSection"; + this.pnlSection.Size = new System.Drawing.Size(331, 247); + this.pnlSection.TabIndex = 1; + // + // lblSectionName + // + this.lblSectionName.AutoSize = true; + this.lblSectionName.Location = new System.Drawing.Point(3, 6); + this.lblSectionName.Name = "lblSectionName"; + this.lblSectionName.Size = new System.Drawing.Size(75, 13); + this.lblSectionName.TabIndex = 0; + this.lblSectionName.Text = "Section &name:"; + // + // txtSectionName + // + this.txtSectionName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSectionName.Location = new System.Drawing.Point(84, 3); + this.txtSectionName.Name = "txtSectionName"; + this.txtSectionName.Size = new System.Drawing.Size(244, 20); + this.txtSectionName.TabIndex = 1; + // + // fraSectionCharacteristics + // + this.fraSectionCharacteristics.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraSectionCharacteristics.Controls.Add(this.lvSectionCharacteristics); + this.fraSectionCharacteristics.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraSectionCharacteristics.Location = new System.Drawing.Point(3, 29); + this.fraSectionCharacteristics.Name = "fraSectionCharacteristics"; + this.fraSectionCharacteristics.Size = new System.Drawing.Size(325, 161); + this.fraSectionCharacteristics.TabIndex = 2; + this.fraSectionCharacteristics.TabStop = false; + this.fraSectionCharacteristics.Text = "Characteristics"; + // + // lvSectionCharacteristics + // + this.lvSectionCharacteristics.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvSectionCharacteristics.CheckBoxes = true; + this.lvSectionCharacteristics.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTitle}); + this.lvSectionCharacteristics.FullRowSelect = true; + this.lvSectionCharacteristics.GridLines = true; + this.lvSectionCharacteristics.HideSelection = false; + this.lvSectionCharacteristics.Location = new System.Drawing.Point(6, 19); + this.lvSectionCharacteristics.Name = "lvSectionCharacteristics"; + this.lvSectionCharacteristics.Size = new System.Drawing.Size(313, 136); + this.lvSectionCharacteristics.TabIndex = 0; + this.lvSectionCharacteristics.UseCompatibleStateImageBehavior = false; + this.lvSectionCharacteristics.View = System.Windows.Forms.View.Details; + // + // chTitle + // + this.chTitle.Text = "Characteristic"; + this.chTitle.Width = 300; + // + // ExecutableEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "ExecutableEditor"; + this.Size = new System.Drawing.Size(502, 247); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlSections.ResumeLayout(false); + this.mnuContextListViewSections.ResumeLayout(false); + this.pnlSection.ResumeLayout(false); + this.pnlSection.PerformLayout(); + this.fraSectionCharacteristics.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlSections; + private System.Windows.Forms.ListView lvSections; + private System.Windows.Forms.ColumnHeader chSectionName; + private System.Windows.Forms.ColumnHeader chSectionOffset; + private System.Windows.Forms.ColumnHeader chSectionLength; + private AwesomeControls.CommandBars.CBContextMenu mnuContextListViewSections; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewSectionsExport; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewSectionsImport; + private System.Windows.Forms.ToolStripMenuItem mnuContextListViewSectionsDelete; + private System.Windows.Forms.ToolStripSeparator mnuContextListViewSectionsSep1; + private System.Windows.Forms.Panel pnlSection; + private System.Windows.Forms.TextBox txtSectionName; + private System.Windows.Forms.Label lblSectionName; + private System.Windows.Forms.GroupBox fraSectionCharacteristics; + private System.Windows.Forms.ListView lvSectionCharacteristics; + private System.Windows.Forms.ColumnHeader chTitle; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.cs new file mode 100644 index 00000000..825c8ce1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.ObjectModels.Executable; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Executable +{ + public partial class ExecutableEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(ExecutableObjectModel)); + } + return _er; + } + + public ExecutableEditor() + { + InitializeComponent(); + tv.PopulateSystemIcons(); + + string[] names = Enum.GetNames(typeof(ExecutableSectionCharacteristics)); + Array values = (Enum.GetValues(typeof(ExecutableSectionCharacteristics)) as Array); + + for (int i = 0; i < names.Length; i++) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = names[i]; + lvi.Tag = (ExecutableSectionCharacteristics) values.GetValue(i); + lvSectionCharacteristics.Items.Add(lvi); + } + + SwitchTo(null); + } + + private void SwitchTo(string name) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (name != null) + { + if (ctl.Name == "pnl" + name) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + + switch (name) + { + case "Section": + { + ExecutableSection section = (tv.SelectedNode.Tag as ExecutableSection); + txtSectionName.Text = section.Name; + foreach (ListViewItem lvi in lvSectionCharacteristics.Items) + { + ExecutableSectionCharacteristics value = (ExecutableSectionCharacteristics)lvi.Tag; + lvi.Checked = ((section.Characteristics & value) == value); + } + break; + } + } + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + lvSections.Items.Clear(); + + ExecutableObjectModel executable = (ObjectModel as ExecutableObjectModel); + if (executable == null) return; + + TreeNode nodeSections = new TreeNode(); + nodeSections.Name = "nodeSections"; + nodeSections.Text = "Sections"; + nodeSections.ImageKey = "generic-folder-closed"; + nodeSections.SelectedImageKey = "generic-folder-closed"; + + foreach (ExecutableSection section in executable.Sections) + { + TreeNode nodeSection = new TreeNode(); + nodeSection.Name = "nodeSection" + executable.Sections.IndexOf(section).ToString(); + nodeSection.Text = section.Name; + nodeSection.Tag = section; + nodeSections.Nodes.Add(nodeSection); + + ListViewItem lvi = new ListViewItem(); + lvi.Tag = section; + lvi.Text = section.Name; + lvi.SubItems.Add(section.PhysicalAddress.ToString()); + lvi.SubItems.Add(section.VirtualSize.ToString()); + lvSections.Items.Add(lvi); + } + tv.Nodes.Add(nodeSections); + } + + private void mnuContextListViewSections_Opening(object sender, CancelEventArgs e) + { + mnuContextListViewSectionsDelete.Enabled = (lvSections.SelectedItems.Count > 0); + mnuContextListViewSectionsExport.Enabled = (lvSections.SelectedItems.Count > 0); + } + + private void mnuContextListViewSectionsExport_Click(object sender, EventArgs e) + { + foreach (ListViewItem lvi in lvSections.SelectedItems) + { + ExecutableSection section = (lvi.Tag as ExecutableSection); + + SaveFileDialog sfd = new SaveFileDialog(); + sfd.FileName = section.Name; + if (sfd.ShowDialog() == DialogResult.OK) + { + section.Save(sfd.FileName); + } + } + } + + private void mnuContextListViewSectionsImport_Click(object sender, EventArgs e) + { + ExecutableObjectModel executable = (ObjectModel as ExecutableObjectModel); + if (executable == null) return; + + OpenFileDialog ofd = new OpenFileDialog(); + if (ofd.ShowDialog() == DialogResult.OK) + { + ExecutableSection section = new ExecutableSection(); + section.Name = System.IO.Path.GetFileName(ofd.FileName); + section.Load(ofd.FileName); + + BeginEdit(); + executable.Sections.Add(section); + EndEdit(); + + ListViewItem lvi = new ListViewItem(); + lvi.Tag = section; + lvi.Text = System.IO.Path.GetFileName(section.Name); + lvi.SubItems.Add((0).ToString()); + lvi.SubItems.Add((0).ToString()); + + lvSections.Items.Add(lvi); + } + } + + private void mnuContextListViewSectionsDelete_Click(object sender, EventArgs e) + { + ExecutableObjectModel executable = (ObjectModel as ExecutableObjectModel); + if (executable == null) return; + + if (lvSections.SelectedItems.Count == 0) return; + if (MessageBox.Show("Are you sure you want to delete the selected sections?", "Delete Sections", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + + while (lvSections.SelectedItems.Count > 0) + { + ExecutableSection section = (lvSections.SelectedItems[0].Tag as ExecutableSection); + if (section != null) executable.Sections.Remove(section); + lvSections.SelectedItems[0].Remove(); + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (tv.SelectedNode != null) + { + if (tv.SelectedNode.Tag is ExecutableSection) + { + SwitchTo("Section"); + } + else + { + SwitchTo(tv.SelectedNode.Name.Substring("node".Length)); + } + } + else + { + SwitchTo(null); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.resx new file mode 100644 index 00000000..6435bc7f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Editors/Executable/ExecutableEditor.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..f5679ed0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Executable plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("Provides user interface components for the Executable plugin of Universal Editor.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7c391036-c29b-497c-8154-e04234f0ff26")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..5316a5fc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms/UniversalEditor.Plugins.Executable.UserInterface.WindowsForms.csproj @@ -0,0 +1,89 @@ + + + + + Debug + AnyCPU + {EE70D9BB-52FB-4BF5-A704-06F4881301CF} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.Executable.UserInterface.WindowsForms + v3.5 + 512 + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + ..\..\..\..\..\..\AwesomeControls\bin\Debug\AwesomeControls.dll + + + + + UserControl + + + ExecutableEditor.cs + + + + + + ExecutableEditor.cs + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {791A36F8-5D96-452B-89D2-78BA74596A1E} + UniversalEditor.Plugins.Executable + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.Designer.cs new file mode 100644 index 00000000..9ecc7fa8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.Designer.cs @@ -0,0 +1,76 @@ +namespace UniversalEditor.Controls.Icarus +{ + partial class IcarusExpressionTextBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txt = new System.Windows.Forms.TextBox(); + this.cmd = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // txt + // + this.txt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.txt.Location = new System.Drawing.Point(0, 1); + this.txt.Name = "txt"; + this.txt.ReadOnly = true; + this.txt.Size = new System.Drawing.Size(75, 20); + this.txt.TabIndex = 0; + this.txt.Click += new System.EventHandler(this.cmd_Click); + // + // cmd + // + this.cmd.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.cmd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmd.Location = new System.Drawing.Point(77, 0); + this.cmd.Name = "cmd"; + this.cmd.Size = new System.Drawing.Size(23, 23); + this.cmd.TabIndex = 1; + this.cmd.Text = "..."; + this.cmd.UseVisualStyleBackColor = true; + this.cmd.Click += new System.EventHandler(this.cmd_Click); + // + // IcarusExpressionTextBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmd); + this.Controls.Add(this.txt); + this.MinimumSize = new System.Drawing.Size(100, 22); + this.Name = "IcarusExpressionTextBox"; + this.Size = new System.Drawing.Size(100, 22); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txt; + private System.Windows.Forms.Button cmd; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.cs new file mode 100644 index 00000000..b78a8fab --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.Dialogs.Icarus; + +namespace UniversalEditor.Controls.Icarus +{ + public partial class IcarusExpressionTextBox : UserControl + { + public IcarusExpressionTextBox() + { + InitializeComponent(); + } + + public string Expression + { + get { return txt.Text; } + set { txt.Text = value; } + } + + private void cmd_Click(object sender, EventArgs e) + { + IcarusExpressionHelperDialog dlg = new IcarusExpressionHelperDialog(); + dlg.Expression = txt.Text; + if (dlg.ShowDialog() == DialogResult.OK) + { + txt.Text = dlg.Expression; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/Icarus/IcarusExpressionTextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.Designer.cs new file mode 100644 index 00000000..9ecc7fa8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.Designer.cs @@ -0,0 +1,76 @@ +namespace UniversalEditor.Controls.Icarus +{ + partial class IcarusExpressionTextBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txt = new System.Windows.Forms.TextBox(); + this.cmd = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // txt + // + this.txt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.txt.Location = new System.Drawing.Point(0, 1); + this.txt.Name = "txt"; + this.txt.ReadOnly = true; + this.txt.Size = new System.Drawing.Size(75, 20); + this.txt.TabIndex = 0; + this.txt.Click += new System.EventHandler(this.cmd_Click); + // + // cmd + // + this.cmd.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.cmd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmd.Location = new System.Drawing.Point(77, 0); + this.cmd.Name = "cmd"; + this.cmd.Size = new System.Drawing.Size(23, 23); + this.cmd.TabIndex = 1; + this.cmd.Text = "..."; + this.cmd.UseVisualStyleBackColor = true; + this.cmd.Click += new System.EventHandler(this.cmd_Click); + // + // IcarusExpressionTextBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmd); + this.Controls.Add(this.txt); + this.MinimumSize = new System.Drawing.Size(100, 22); + this.Name = "IcarusExpressionTextBox"; + this.Size = new System.Drawing.Size(100, 22); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txt; + private System.Windows.Forms.Button cmd; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.cs new file mode 100644 index 00000000..477cb2fa --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.Dialogs.RavenSoftware.Icarus; + +namespace UniversalEditor.Controls.Icarus +{ + public partial class IcarusExpressionTextBox : UserControl + { + public IcarusExpressionTextBox() + { + InitializeComponent(); + } + + public string Expression + { + get { return txt.Text; } + set { txt.Text = value; } + } + + private void cmd_Click(object sender, EventArgs e) + { + IcarusExpressionHelperDialog dlg = new IcarusExpressionHelperDialog(); + dlg.Expression = txt.Text; + if (dlg.ShowDialog() == DialogResult.OK) + { + txt.Text = dlg.Expression; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Controls/RavenSoftware/Icarus/IcarusExpressionTextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.Designer.cs new file mode 100644 index 00000000..52b1625c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.Designer.cs @@ -0,0 +1,285 @@ +namespace UniversalEditor.Dialogs.Icarus +{ + partial class IcarusExpressionHelperDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.optGET = new System.Windows.Forms.RadioButton(); + this.optTag = new System.Windows.Forms.RadioButton(); + this.cboGETParameterType = new System.Windows.Forms.ComboBox(); + this.cboGETParameterName = new System.Windows.Forms.ComboBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.lblRangeFrom = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.lblRangeTo = new System.Windows.Forms.Label(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.optConstant = new System.Windows.Forms.RadioButton(); + this.textBox3 = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + this.SuspendLayout(); + // + // optGET + // + this.optGET.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optGET.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optGET.Location = new System.Drawing.Point(12, 61); + this.optGET.Name = "optGET"; + this.optGET.Size = new System.Drawing.Size(416, 17); + this.optGET.TabIndex = 2; + this.optGET.TabStop = true; + this.optGET.Text = "&GET"; + this.optGET.UseVisualStyleBackColor = true; + // + // optTag + // + this.optTag.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optTag.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optTag.Location = new System.Drawing.Point(12, 111); + this.optTag.Name = "optTag"; + this.optTag.Size = new System.Drawing.Size(416, 17); + this.optTag.TabIndex = 5; + this.optTag.TabStop = true; + this.optTag.Text = "&TAG"; + this.optTag.UseVisualStyleBackColor = true; + // + // cboGETParameterType + // + this.cboGETParameterType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboGETParameterType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboGETParameterType.FormattingEnabled = true; + this.cboGETParameterType.Items.AddRange(new object[] { + "FLOAT", + "STRING", + "VECTOR"}); + this.cboGETParameterType.Location = new System.Drawing.Point(39, 84); + this.cboGETParameterType.Name = "cboGETParameterType"; + this.cboGETParameterType.Size = new System.Drawing.Size(113, 21); + this.cboGETParameterType.TabIndex = 3; + // + // cboGETParameterName + // + this.cboGETParameterName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboGETParameterName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboGETParameterName.FormattingEnabled = true; + this.cboGETParameterName.Items.AddRange(new object[] { + "SET_PARM1", + "SET_PARM2", + "SET_PARM3", + "SET_PARM4", + "SET_PARM5", + "SET_PARM6", + "SET_PARM7", + "SET_PARM8", + "SET_PARM9", + "SET_PARM10", + "SET_PARM11", + "SET_PARM12", + "SET_PARM13", + "SET_PARM14", + "SET_PARM15", + "SET_PARM16"}); + this.cboGETParameterName.Location = new System.Drawing.Point(158, 84); + this.cboGETParameterName.Name = "cboGETParameterName"; + this.cboGETParameterName.Size = new System.Drawing.Size(251, 21); + this.cboGETParameterName.TabIndex = 4; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(158, 134); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(251, 20); + this.textBox2.TabIndex = 7; + // + // comboBox1 + // + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Items.AddRange(new object[] { + "ORIGIN", + "ANGLES"}); + this.comboBox1.Location = new System.Drawing.Point(39, 134); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(113, 21); + this.comboBox1.TabIndex = 6; + // + // radioButton1 + // + this.radioButton1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.radioButton1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton1.Location = new System.Drawing.Point(12, 161); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(416, 17); + this.radioButton1.TabIndex = 8; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "&Range"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // lblRangeFrom + // + this.lblRangeFrom.AutoSize = true; + this.lblRangeFrom.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblRangeFrom.Location = new System.Drawing.Point(39, 186); + this.lblRangeFrom.Name = "lblRangeFrom"; + this.lblRangeFrom.Size = new System.Drawing.Size(30, 13); + this.lblRangeFrom.TabIndex = 9; + this.lblRangeFrom.Text = "&From"; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(75, 184); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(107, 20); + this.numericUpDown1.TabIndex = 10; + // + // lblRangeTo + // + this.lblRangeTo.AutoSize = true; + this.lblRangeTo.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblRangeTo.Location = new System.Drawing.Point(192, 186); + this.lblRangeTo.Name = "lblRangeTo"; + this.lblRangeTo.Size = new System.Drawing.Size(16, 13); + this.lblRangeTo.TabIndex = 11; + this.lblRangeTo.Text = "&to"; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(214, 184); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(107, 20); + this.numericUpDown2.TabIndex = 12; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(353, 234); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 14; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(272, 234); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 13; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // optConstant + // + this.optConstant.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optConstant.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optConstant.Location = new System.Drawing.Point(12, 12); + this.optConstant.Name = "optConstant"; + this.optConstant.Size = new System.Drawing.Size(416, 17); + this.optConstant.TabIndex = 0; + this.optConstant.TabStop = true; + this.optConstant.Text = "&Constant"; + this.optConstant.UseVisualStyleBackColor = true; + // + // textBox3 + // + this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox3.Location = new System.Drawing.Point(39, 35); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(370, 20); + this.textBox3.TabIndex = 1; + // + // IcarusExpressionHelperDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(440, 269); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.numericUpDown2); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.lblRangeTo); + this.Controls.Add(this.lblRangeFrom); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.cboGETParameterName); + this.Controls.Add(this.cboGETParameterType); + this.Controls.Add(this.radioButton1); + this.Controls.Add(this.optTag); + this.Controls.Add(this.optConstant); + this.Controls.Add(this.optGET); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox3); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "IcarusExpressionHelperDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Expression Helper"; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RadioButton optGET; + private System.Windows.Forms.RadioButton optTag; + private System.Windows.Forms.ComboBox cboGETParameterType; + private System.Windows.Forms.ComboBox cboGETParameterName; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.Label lblRangeFrom; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.Label lblRangeTo; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.RadioButton optConstant; + private System.Windows.Forms.TextBox textBox3; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.cs new file mode 100644 index 00000000..373d3e98 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Icarus +{ + public partial class IcarusExpressionHelperDialog : Form + { + public IcarusExpressionHelperDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private string mvarExpression = String.Empty; + public string Expression + { + get { return mvarExpression; } + set { mvarExpression = value; } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/Icarus/IcarusExpressionHelperDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.Designer.cs new file mode 100644 index 00000000..f17cd6d5 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.Designer.cs @@ -0,0 +1,285 @@ +namespace UniversalEditor.Dialogs.RavenSoftware.Icarus +{ + partial class IcarusExpressionHelperDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.optGET = new System.Windows.Forms.RadioButton(); + this.optTag = new System.Windows.Forms.RadioButton(); + this.cboGETParameterType = new System.Windows.Forms.ComboBox(); + this.cboGETParameterName = new System.Windows.Forms.ComboBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.lblRangeFrom = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.lblRangeTo = new System.Windows.Forms.Label(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.optConstant = new System.Windows.Forms.RadioButton(); + this.textBox3 = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + this.SuspendLayout(); + // + // optGET + // + this.optGET.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optGET.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optGET.Location = new System.Drawing.Point(12, 61); + this.optGET.Name = "optGET"; + this.optGET.Size = new System.Drawing.Size(416, 17); + this.optGET.TabIndex = 2; + this.optGET.TabStop = true; + this.optGET.Text = "&GET"; + this.optGET.UseVisualStyleBackColor = true; + // + // optTag + // + this.optTag.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optTag.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optTag.Location = new System.Drawing.Point(12, 111); + this.optTag.Name = "optTag"; + this.optTag.Size = new System.Drawing.Size(416, 17); + this.optTag.TabIndex = 5; + this.optTag.TabStop = true; + this.optTag.Text = "&TAG"; + this.optTag.UseVisualStyleBackColor = true; + // + // cboGETParameterType + // + this.cboGETParameterType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboGETParameterType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboGETParameterType.FormattingEnabled = true; + this.cboGETParameterType.Items.AddRange(new object[] { + "FLOAT", + "STRING", + "VECTOR"}); + this.cboGETParameterType.Location = new System.Drawing.Point(39, 84); + this.cboGETParameterType.Name = "cboGETParameterType"; + this.cboGETParameterType.Size = new System.Drawing.Size(113, 21); + this.cboGETParameterType.TabIndex = 3; + // + // cboGETParameterName + // + this.cboGETParameterName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboGETParameterName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboGETParameterName.FormattingEnabled = true; + this.cboGETParameterName.Items.AddRange(new object[] { + "SET_PARM1", + "SET_PARM2", + "SET_PARM3", + "SET_PARM4", + "SET_PARM5", + "SET_PARM6", + "SET_PARM7", + "SET_PARM8", + "SET_PARM9", + "SET_PARM10", + "SET_PARM11", + "SET_PARM12", + "SET_PARM13", + "SET_PARM14", + "SET_PARM15", + "SET_PARM16"}); + this.cboGETParameterName.Location = new System.Drawing.Point(158, 84); + this.cboGETParameterName.Name = "cboGETParameterName"; + this.cboGETParameterName.Size = new System.Drawing.Size(251, 21); + this.cboGETParameterName.TabIndex = 4; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(158, 134); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(251, 20); + this.textBox2.TabIndex = 7; + // + // comboBox1 + // + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Items.AddRange(new object[] { + "ORIGIN", + "ANGLES"}); + this.comboBox1.Location = new System.Drawing.Point(39, 134); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(113, 21); + this.comboBox1.TabIndex = 6; + // + // radioButton1 + // + this.radioButton1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.radioButton1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton1.Location = new System.Drawing.Point(12, 161); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(416, 17); + this.radioButton1.TabIndex = 8; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "&Range"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // lblRangeFrom + // + this.lblRangeFrom.AutoSize = true; + this.lblRangeFrom.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblRangeFrom.Location = new System.Drawing.Point(39, 186); + this.lblRangeFrom.Name = "lblRangeFrom"; + this.lblRangeFrom.Size = new System.Drawing.Size(30, 13); + this.lblRangeFrom.TabIndex = 9; + this.lblRangeFrom.Text = "&From"; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(75, 184); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(107, 20); + this.numericUpDown1.TabIndex = 10; + // + // lblRangeTo + // + this.lblRangeTo.AutoSize = true; + this.lblRangeTo.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblRangeTo.Location = new System.Drawing.Point(192, 186); + this.lblRangeTo.Name = "lblRangeTo"; + this.lblRangeTo.Size = new System.Drawing.Size(16, 13); + this.lblRangeTo.TabIndex = 11; + this.lblRangeTo.Text = "&to"; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(214, 184); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(107, 20); + this.numericUpDown2.TabIndex = 12; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(353, 234); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 14; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(272, 234); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 13; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // optConstant + // + this.optConstant.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.optConstant.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optConstant.Location = new System.Drawing.Point(12, 12); + this.optConstant.Name = "optConstant"; + this.optConstant.Size = new System.Drawing.Size(416, 17); + this.optConstant.TabIndex = 0; + this.optConstant.TabStop = true; + this.optConstant.Text = "&Constant"; + this.optConstant.UseVisualStyleBackColor = true; + // + // textBox3 + // + this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox3.Location = new System.Drawing.Point(39, 35); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(370, 20); + this.textBox3.TabIndex = 1; + // + // IcarusExpressionHelperDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(440, 269); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.numericUpDown2); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.lblRangeTo); + this.Controls.Add(this.lblRangeFrom); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.cboGETParameterName); + this.Controls.Add(this.cboGETParameterType); + this.Controls.Add(this.radioButton1); + this.Controls.Add(this.optTag); + this.Controls.Add(this.optConstant); + this.Controls.Add(this.optGET); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox3); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "IcarusExpressionHelperDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Expression Helper"; + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RadioButton optGET; + private System.Windows.Forms.RadioButton optTag; + private System.Windows.Forms.ComboBox cboGETParameterType; + private System.Windows.Forms.ComboBox cboGETParameterName; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.Label lblRangeFrom; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.Label lblRangeTo; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.RadioButton optConstant; + private System.Windows.Forms.TextBox textBox3; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.cs new file mode 100644 index 00000000..e4f5078c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.RavenSoftware.Icarus +{ + public partial class IcarusExpressionHelperDialog : Form + { + public IcarusExpressionHelperDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private string mvarExpression = String.Empty; + public string Expression + { + get { return mvarExpression; } + set { mvarExpression = value; } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Dialogs/RavenSoftware/Icarus/IcarusExpressionHelperDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.Designer.cs new file mode 100644 index 00000000..ae9c6e3e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.Designer.cs @@ -0,0 +1,149 @@ +namespace UniversalEditor.Editors.Icarus +{ + partial class IcarusScriptEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextRun = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContext.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContext; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.FullRowSelect = true; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.ShowLines = false; + this.tv.Size = new System.Drawing.Size(530, 367); + this.tv.TabIndex = 0; + this.tv.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDoubleClick); + // + // mnuContext + // + this.mnuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextRun, + this.mnuContextSep1, + this.mnuContextCut, + this.mnuContextCopy, + this.mnuContextPaste, + this.mnuContextDelete, + this.toolStripMenuItem2, + this.mnuContextProperties}); + this.mnuContext.Name = "mnuContext"; + this.mnuContext.Size = new System.Drawing.Size(194, 148); + // + // mnuContextRun + // + this.mnuContextRun.Name = "mnuContextRun"; + this.mnuContextRun.ShortcutKeyDisplayString = "F5"; + this.mnuContextRun.Size = new System.Drawing.Size(193, 22); + this.mnuContextRun.Text = "&Run"; + // + // mnuContextSep1 + // + this.mnuContextSep1.Name = "mnuContextSep1"; + this.mnuContextSep1.Size = new System.Drawing.Size(190, 6); + // + // mnuContextCut + // + this.mnuContextCut.Name = "mnuContextCut"; + this.mnuContextCut.ShortcutKeyDisplayString = "Ctrl+X"; + this.mnuContextCut.Size = new System.Drawing.Size(193, 22); + this.mnuContextCut.Text = "Cu&t"; + // + // mnuContextCopy + // + this.mnuContextCopy.Name = "mnuContextCopy"; + this.mnuContextCopy.ShortcutKeyDisplayString = "Ctrl+C"; + this.mnuContextCopy.Size = new System.Drawing.Size(193, 22); + this.mnuContextCopy.Text = "&Copy"; + // + // mnuContextPaste + // + this.mnuContextPaste.Name = "mnuContextPaste"; + this.mnuContextPaste.ShortcutKeyDisplayString = "Ctrl+V"; + this.mnuContextPaste.Size = new System.Drawing.Size(193, 22); + this.mnuContextPaste.Text = "&Paste"; + // + // mnuContextDelete + // + this.mnuContextDelete.Name = "mnuContextDelete"; + this.mnuContextDelete.ShortcutKeyDisplayString = "Del"; + this.mnuContextDelete.Size = new System.Drawing.Size(193, 22); + this.mnuContextDelete.Text = "&Delete"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(190, 6); + // + // mnuContextProperties + // + this.mnuContextProperties.Name = "mnuContextProperties"; + this.mnuContextProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuContextProperties.Size = new System.Drawing.Size(193, 22); + this.mnuContextProperties.Text = "P&roperties..."; + // + // IcarusScriptEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tv); + this.Name = "IcarusScriptEditor"; + this.Size = new System.Drawing.Size(530, 367); + this.mnuContext.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private AwesomeControls.CommandBars.CBContextMenu mnuContext; + private System.Windows.Forms.ToolStripMenuItem mnuContextRun; + private System.Windows.Forms.ToolStripSeparator mnuContextSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextPaste; + private System.Windows.Forms.ToolStripMenuItem mnuContextDelete; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem mnuContextProperties; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.cs new file mode 100644 index 00000000..f7a6bbd7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.cs @@ -0,0 +1,456 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Icarus; +using UniversalEditor.ObjectModels.Icarus.Commands; + +namespace UniversalEditor.Editors.Icarus +{ + public partial class IcarusScriptEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(IcarusScriptObjectModel)); + } + return _er; + } + + public IcarusScriptEditor() + { + InitializeComponent(); + mnuContextRun.Font = new Font(mnuContextRun.Font, FontStyle.Bold); + + /* + string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string iconPath = path + System.IO.Path.DirectorySeparatorChar.ToString() + "../Editors/Icarus/Images"; + string[] iconFileNames = System.IO.Directory.GetFiles(iconPath, "*.png"); + foreach (string iconFileName in iconFileNames) + { + Image image = Image.FromFile(iconFileName); + string fileTitle = System.IO.Path.GetFileNameWithoutExtension(iconFileName); + imlSmallIcons.Images.Add(fileTitle, image); + } + */ + + tv.ImageList = SmallImageList; + + ActionMenuItem mnuDebug = MenuBar.Items.Add("mnuDebug", "&Debug", 4); + mnuDebug.Items.Add("mnuDebugStart", "&Start Debugging", mnuDebugStart_Click); + mnuDebug.Items.Add("mnuDebugBreak", "Brea&k Execution", mnuDebugBreak_Click); + mnuDebug.Items.Add("mnuDebugStop", "Stop D&ebugging", mnuDebugStop_Click); + mnuDebug.Items.AddSeparator(); + mnuDebug.Items.Add("mnuDebugStepInto", "Step &Into", mnuDebugStepInto_Click); + mnuDebug.Items.Add("mnuDebugStepOver", "Step &Over", mnuDebugStepOver_Click); + + Toolbar tbDebug = Toolbars.Add("tbDebug", "ICARUS Debug"); + tbDebug.Items.Add("mnuDebugStart", "&Start Debugging", mnuDebugStart_Click); + tbDebug.Items.AddSeparator(); + tbDebug.Items.Add("mnuDebugStepInto", "Step &Into", mnuDebugStepInto_Click); + tbDebug.Items.Add("mnuDebugStepOver", "Step &Over", mnuDebugStepOver_Click); + + mnuDebug.Items["mnuDebugBreak"].Visible = false; + mnuDebug.Items["mnuDebugStop"].Visible = false; + } + + private System.Threading.Thread tDebugger = null; + private void mnuDebugStart_Click(object sender, EventArgs e) + { + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStart"].Visible = false; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugBreak"].Visible = true; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStop"].Visible = true; + + IcarusScriptObjectModel script = (ObjectModel as IcarusScriptObjectModel); + tv.SelectedNode = null; + tasksByName.Clear(); + + if (tDebugger != null) + { + if (tDebugger.IsAlive) tDebugger.Abort(); + tDebugger = null; + } + + tDebugger = new System.Threading.Thread(tDebugger_Start); + tDebugger.Start(); + } + private void mnuDebugBreak_Click(object sender, EventArgs e) + { + + } + private void mnuDebugStop_Click(object sender, EventArgs e) + { + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStart"].Visible = true; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugBreak"].Visible = false; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStop"].Visible = false; + + if (tDebugger != null) + { + if (tDebugger.IsAlive) tDebugger.Abort(); + tDebugger = null; + } + + if (_prevTreeNode != null) + { + _prevTreeNode.BackColor = Color.Empty; + _prevTreeNode = null; + } + } + + private void LogOutputWindow(string text) + { + HostApplication.OutputWindow.WriteLine(text); + } + private void ClearOutputWindow() + { + HostApplication.OutputWindow.Clear(); + } + + private Dictionary treeNodesForCommands = new Dictionary(); + + private void tDebugger_Start() + { + Action _ClearOutputWindow = new Action(ClearOutputWindow); + Action _LogOutputWindow = new Action(LogOutputWindow); + + Invoke(_ClearOutputWindow); + Invoke(_LogOutputWindow, "=== ICARUS Engine Debugger v1.0 - copyright (c) 2013 Mike Becker's Software ==="); + + DateTime dtStart = DateTime.Now; + + IcarusScriptObjectModel script = (ObjectModel as IcarusScriptObjectModel); + foreach (IcarusCommand command in script.Commands) + { + try + { + DebugCommand(command); + } + catch (InvalidOperationException ex) + { + Invoke(_LogOutputWindow, "unknown command (" + (script.Commands.IndexOf(command) + 1).ToString() + " of " + script.Commands.Count.ToString() + "): " + command.GetType().Name); + } + } + + Action _ReleaseTreeNode = new Action(ReleaseTreeNode); + if (_prevTreeNode != null) + { + Invoke(_ReleaseTreeNode, _prevTreeNode); + _prevTreeNode = null; + } + + DateTime dtEnd = DateTime.Now; + + TimeSpan tsDiff = dtEnd - dtStart; + Invoke(_LogOutputWindow, "execution complete, " + tsDiff.ToString() + " elapsed since execution started"); + + Action _UpdateMenuItems = new Action(UpdateMenuItems); + Invoke(_UpdateMenuItems, true); + } + + private void UpdateMenuItems(bool enable) + { + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStart"].Visible = enable; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugBreak"].Visible = !enable; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStop"].Visible = !enable; + } + + private TreeNode _prevTreeNode = null; + private void ActivateTreeNode(TreeNode tn) + { + tn.EnsureVisible(); + tn.BackColor = Color.Yellow; + } + private void ReleaseTreeNode(TreeNode tn) + { + tn.BackColor = Color.Empty; + } + + private Dictionary tasksByName = new Dictionary(); + + private void DebugCommand(IcarusCommand command) + { + Action _ActivateTreeNode = new Action(ActivateTreeNode); + Action _ReleaseTreeNode = new Action(ReleaseTreeNode); + if (_prevTreeNode != null) + { + Invoke(_ReleaseTreeNode, _prevTreeNode); + _prevTreeNode = null; + } + + TreeNode tn = treeNodesForCommands[command]; + Invoke(_ActivateTreeNode, tn); + _prevTreeNode = tn; + + Action _LogOutputWindow = new Action(LogOutputWindow); + if (command is IcarusCommandAffect) + { + IcarusCommandAffect cmd = (command as IcarusCommandAffect); + Invoke(_LogOutputWindow, "on " + cmd.Target.Value.ToString() + "\r\n{"); + foreach (IcarusCommand command1 in cmd.Commands) + { + DebugCommand(command1); + } + Invoke(_LogOutputWindow, "}"); + } + else if (command is IcarusCommandSet) + { + IcarusCommandSet cmd = (command as IcarusCommandSet); + Invoke(_LogOutputWindow, "set " + cmd.ObjectName + " = " + (cmd.Value == null ? "(null)" : cmd.Value.ToString())); + } + else if (command is IcarusCommandWait) + { + IcarusCommandWait cmd = (command as IcarusCommandWait); + int timeout = (int)cmd.Duration; + System.Threading.Thread.Sleep(timeout); + } + else if (command is IcarusCommandPrint) + { + IcarusCommandPrint cmd = (command as IcarusCommandPrint); + string text = cmd.Text; + Invoke(_LogOutputWindow, text); + } + else if (command is IcarusCommandTask) + { + IcarusCommandTask cmd = (command as IcarusCommandTask); + if (tasksByName.ContainsKey(cmd.TaskName)) + { + Invoke(_LogOutputWindow, "WARNING: redefining task \"" + cmd.TaskName + "\""); + } + tasksByName[cmd.TaskName] = cmd; + } + else if (command is IcarusCommandControlFlowDo) + { + IcarusCommandControlFlowDo cmd = (command as IcarusCommandControlFlowDo); + if (!tasksByName.ContainsKey(cmd.Target)) + { + Invoke(_LogOutputWindow, "ERROR: task \"" + cmd.Target + "\" not found!"); + return; + } + + IcarusCommandTask task = tasksByName[cmd.Target]; + foreach (IcarusCommand command1 in task.Commands) + { + DebugCommand(command1); + } + } + else if (command is IcarusCommandLoop) + { + IcarusCommandLoop cmd = (command as IcarusCommandLoop); + float timeout = (float)cmd.Count; + if (timeout == -1) + { + while (true) + { + foreach (IcarusCommand command1 in cmd.Commands) + { + DebugCommand(command1); + } + } + } + else + { + for (float i = 0; i < timeout; i++) + { + foreach (IcarusCommand command1 in cmd.Commands) + { + DebugCommand(command1); + } + } + } + } + else if (command is IcarusCommandControlFlowDo) + { + } + else + { + throw new InvalidOperationException(); + } + + System.Threading.Thread.Sleep(50); + } + + private void mnuDebugStepInto_Click(object sender, EventArgs e) + { + MessageBox.Show("Step Into Icarus Script", "Information", MessageBoxButtons.OK); + } + private void mnuDebugStepOver_Click(object sender, EventArgs e) + { + MessageBox.Show("Step Over Icarus Script", "Information", MessageBoxButtons.OK); + } + + protected override void OnDocumentClosing(CancelEventArgs e) + { + base.OnDocumentClosing(e); + + if (tDebugger != null && tDebugger.IsAlive) + { + if (MessageBox.Show("Do you want to stop debugging?", "ICARUS Debugger", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) + { + e.Cancel = true; + return; + } + + tDebugger.Abort(); + } + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + treeNodesForCommands.Clear(); + + IcarusScriptObjectModel script = (ObjectModel as IcarusScriptObjectModel); + if (script == null) return; + + foreach (IcarusCommand command in script.Commands) + { + RecursiveAddCommand(command); + } + } + + private void RecursiveAddCommand(IcarusCommand command, TreeNode parent = null) + { + TreeNode tn = new TreeNode(); + StringBuilder sb = new StringBuilder(); + if (command == null) return; + + if (command is IcarusPredefinedCommand) + { + sb.Append((command as IcarusPredefinedCommand).Name); + } + else if (command is IcarusCustomCommand) + { + sb.Append((command as IcarusCustomCommand).CommandType.ToString()); + } + tn.ImageKey = command.GetType().Name; + tn.SelectedImageKey = command.GetType().Name; + + if (command is IcarusCommandSet) + { + IcarusCommandSet cmd = (command as IcarusCommandSet); + sb.Append(" ( "); + if (cmd.ObjectName != null) + { + sb.Append(cmd.ObjectName); + } + else + { + sb.Append("null"); + } + sb.Append(", "); + if (cmd.Value != null) + { + sb.Append(cmd.Value.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandAffect) + { + IcarusCommandAffect cmd = (command as IcarusCommandAffect); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandUse) + { + IcarusCommandUse cmd = (command as IcarusCommandUse); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandRun) + { + IcarusCommandRun cmd = (command as IcarusCommandRun); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandKill) + { + IcarusCommandKill cmd = (command as IcarusCommandKill); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + + if (command is IIcarusContainerCommand) + { + IIcarusContainerCommand container = (command as IIcarusContainerCommand); + foreach (IcarusCommand ic1 in container.Commands) + { + RecursiveAddCommand(ic1, tn); + } + + sb.Append(" (" + container.Commands.Count.ToString() + " commands)"); + } + + tn.Text = sb.ToString(); + treeNodesForCommands.Add(command, tn); + + if (parent == null) + { + tv.Nodes.Add(tn); + } + else + { + parent.Nodes.Add(tn); + } + } + + private void tv_MouseDoubleClick(object sender, MouseEventArgs e) + { + TreeNode tn = tv.HitTest(e.Location).Node; + if (tn != null) + { + Dialogs.Icarus.IcarusExpressionHelperDialog dlg = new Dialogs.Icarus.IcarusExpressionHelperDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + + } + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.resx new file mode 100644 index 00000000..16fe9c44 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/Icarus/IcarusScriptEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2, 5 + + + 32 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.Designer.cs new file mode 100644 index 00000000..7c5e0e7d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.Designer.cs @@ -0,0 +1,149 @@ +namespace UniversalEditor.Editors.RavenSoftware.Icarus +{ + partial class IcarusScriptEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextRun = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContext.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContext; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.FullRowSelect = true; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.ShowLines = false; + this.tv.Size = new System.Drawing.Size(530, 367); + this.tv.TabIndex = 0; + this.tv.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDoubleClick); + // + // mnuContext + // + this.mnuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextRun, + this.mnuContextSep1, + this.mnuContextCut, + this.mnuContextCopy, + this.mnuContextPaste, + this.mnuContextDelete, + this.toolStripMenuItem2, + this.mnuContextProperties}); + this.mnuContext.Name = "mnuContext"; + this.mnuContext.Size = new System.Drawing.Size(194, 148); + // + // mnuContextRun + // + this.mnuContextRun.Name = "mnuContextRun"; + this.mnuContextRun.ShortcutKeyDisplayString = "F5"; + this.mnuContextRun.Size = new System.Drawing.Size(193, 22); + this.mnuContextRun.Text = "&Run"; + // + // mnuContextSep1 + // + this.mnuContextSep1.Name = "mnuContextSep1"; + this.mnuContextSep1.Size = new System.Drawing.Size(190, 6); + // + // mnuContextCut + // + this.mnuContextCut.Name = "mnuContextCut"; + this.mnuContextCut.ShortcutKeyDisplayString = "Ctrl+X"; + this.mnuContextCut.Size = new System.Drawing.Size(193, 22); + this.mnuContextCut.Text = "Cu&t"; + // + // mnuContextCopy + // + this.mnuContextCopy.Name = "mnuContextCopy"; + this.mnuContextCopy.ShortcutKeyDisplayString = "Ctrl+C"; + this.mnuContextCopy.Size = new System.Drawing.Size(193, 22); + this.mnuContextCopy.Text = "&Copy"; + // + // mnuContextPaste + // + this.mnuContextPaste.Name = "mnuContextPaste"; + this.mnuContextPaste.ShortcutKeyDisplayString = "Ctrl+V"; + this.mnuContextPaste.Size = new System.Drawing.Size(193, 22); + this.mnuContextPaste.Text = "&Paste"; + // + // mnuContextDelete + // + this.mnuContextDelete.Name = "mnuContextDelete"; + this.mnuContextDelete.ShortcutKeyDisplayString = "Del"; + this.mnuContextDelete.Size = new System.Drawing.Size(193, 22); + this.mnuContextDelete.Text = "&Delete"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(190, 6); + // + // mnuContextProperties + // + this.mnuContextProperties.Name = "mnuContextProperties"; + this.mnuContextProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuContextProperties.Size = new System.Drawing.Size(193, 22); + this.mnuContextProperties.Text = "P&roperties..."; + // + // IcarusScriptEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tv); + this.Name = "IcarusScriptEditor"; + this.Size = new System.Drawing.Size(530, 367); + this.mnuContext.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private AwesomeControls.CommandBars.CBContextMenu mnuContext; + private System.Windows.Forms.ToolStripMenuItem mnuContextRun; + private System.Windows.Forms.ToolStripSeparator mnuContextSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextPaste; + private System.Windows.Forms.ToolStripMenuItem mnuContextDelete; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem mnuContextProperties; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.cs new file mode 100644 index 00000000..6de836f5 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.cs @@ -0,0 +1,447 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.RavenSoftware.Icarus; +using UniversalEditor.ObjectModels.RavenSoftware.Icarus.Commands; + +namespace UniversalEditor.Editors.RavenSoftware.Icarus +{ + public partial class IcarusScriptEditor : Editor + { + public IcarusScriptEditor() + { + InitializeComponent(); + mnuContextRun.Font = new Font(mnuContextRun.Font, FontStyle.Bold); + + /* + string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string iconPath = path + System.IO.Path.DirectorySeparatorChar.ToString() + "../Editors/Icarus/Images"; + string[] iconFileNames = System.IO.Directory.GetFiles(iconPath, "*.png"); + foreach (string iconFileName in iconFileNames) + { + Image image = Image.FromFile(iconFileName); + string fileTitle = System.IO.Path.GetFileNameWithoutExtension(iconFileName); + imlSmallIcons.Images.Add(fileTitle, image); + } + */ + + base.SupportedObjectModels.Add(typeof(IcarusScriptObjectModel)); + + tv.ImageList = SmallImageList; + + ActionMenuItem mnuDebug = MenuBar.Items.Add("mnuDebug", "&Debug", 4); + mnuDebug.Items.Add("mnuDebugStart", "&Start Debugging", mnuDebugStart_Click); + mnuDebug.Items.Add("mnuDebugBreak", "Brea&k Execution", mnuDebugBreak_Click); + mnuDebug.Items.Add("mnuDebugStop", "Stop D&ebugging", mnuDebugStop_Click); + mnuDebug.Items.AddSeparator(); + mnuDebug.Items.Add("mnuDebugStepInto", "Step &Into", mnuDebugStepInto_Click); + mnuDebug.Items.Add("mnuDebugStepOver", "Step &Over", mnuDebugStepOver_Click); + + Toolbar tbDebug = Toolbars.Add("tbDebug", "ICARUS Debug"); + tbDebug.Items.Add("mnuDebugStart", "&Start Debugging", mnuDebugStart_Click); + tbDebug.Items.AddSeparator(); + tbDebug.Items.Add("mnuDebugStepInto", "Step &Into", mnuDebugStepInto_Click); + tbDebug.Items.Add("mnuDebugStepOver", "Step &Over", mnuDebugStepOver_Click); + + mnuDebug.Items["mnuDebugBreak"].Visible = false; + mnuDebug.Items["mnuDebugStop"].Visible = false; + } + + private System.Threading.Thread tDebugger = null; + private void mnuDebugStart_Click(object sender, EventArgs e) + { + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStart"].Visible = false; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugBreak"].Visible = true; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStop"].Visible = true; + + IcarusScriptObjectModel script = (ObjectModel as IcarusScriptObjectModel); + tv.SelectedNode = null; + tasksByName.Clear(); + + if (tDebugger != null) + { + if (tDebugger.IsAlive) tDebugger.Abort(); + tDebugger = null; + } + + tDebugger = new System.Threading.Thread(tDebugger_Start); + tDebugger.Start(); + } + private void mnuDebugBreak_Click(object sender, EventArgs e) + { + + } + private void mnuDebugStop_Click(object sender, EventArgs e) + { + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStart"].Visible = true; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugBreak"].Visible = false; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStop"].Visible = false; + + if (tDebugger != null) + { + if (tDebugger.IsAlive) tDebugger.Abort(); + tDebugger = null; + } + + if (_prevTreeNode != null) + { + _prevTreeNode.BackColor = Color.Empty; + _prevTreeNode = null; + } + } + + private void LogOutputWindow(string text) + { + HostApplication.OutputWindow.WriteLine(text); + } + private void ClearOutputWindow() + { + HostApplication.OutputWindow.Clear(); + } + + private Dictionary treeNodesForCommands = new Dictionary(); + + private void tDebugger_Start() + { + Action _ClearOutputWindow = new Action(ClearOutputWindow); + Action _LogOutputWindow = new Action(LogOutputWindow); + + Invoke(_ClearOutputWindow); + Invoke(_LogOutputWindow, "=== ICARUS Engine Debugger v1.0 - copyright (c) 2013 Mike Becker's Software ==="); + + DateTime dtStart = DateTime.Now; + + IcarusScriptObjectModel script = (ObjectModel as IcarusScriptObjectModel); + foreach (IcarusCommand command in script.Commands) + { + try + { + DebugCommand(command); + } + catch (InvalidOperationException ex) + { + Invoke(_LogOutputWindow, "unknown command (" + (script.Commands.IndexOf(command) + 1).ToString() + " of " + script.Commands.Count.ToString() + "): " + command.GetType().Name); + } + } + + Action _ReleaseTreeNode = new Action(ReleaseTreeNode); + if (_prevTreeNode != null) + { + Invoke(_ReleaseTreeNode, _prevTreeNode); + _prevTreeNode = null; + } + + DateTime dtEnd = DateTime.Now; + + TimeSpan tsDiff = dtEnd - dtStart; + Invoke(_LogOutputWindow, "execution complete, " + tsDiff.ToString() + " elapsed since execution started"); + + Action _UpdateMenuItems = new Action(UpdateMenuItems); + Invoke(_UpdateMenuItems, true); + } + + private void UpdateMenuItems(bool enable) + { + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStart"].Visible = enable; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugBreak"].Visible = !enable; + (MenuBar.Items["mnuDebug"] as ActionMenuItem).Items["mnuDebugStop"].Visible = !enable; + } + + private TreeNode _prevTreeNode = null; + private void ActivateTreeNode(TreeNode tn) + { + tn.EnsureVisible(); + tn.BackColor = Color.Yellow; + } + private void ReleaseTreeNode(TreeNode tn) + { + tn.BackColor = Color.Empty; + } + + private Dictionary tasksByName = new Dictionary(); + + private void DebugCommand(IcarusCommand command) + { + Action _ActivateTreeNode = new Action(ActivateTreeNode); + Action _ReleaseTreeNode = new Action(ReleaseTreeNode); + if (_prevTreeNode != null) + { + Invoke(_ReleaseTreeNode, _prevTreeNode); + _prevTreeNode = null; + } + + TreeNode tn = treeNodesForCommands[command]; + Invoke(_ActivateTreeNode, tn); + _prevTreeNode = tn; + + Action _LogOutputWindow = new Action(LogOutputWindow); + if (command is IcarusCommandAffect) + { + IcarusCommandAffect cmd = (command as IcarusCommandAffect); + Invoke(_LogOutputWindow, "on " + cmd.Target.Value.ToString() + "\r\n{"); + foreach (IcarusCommand command1 in cmd.Commands) + { + DebugCommand(command1); + } + Invoke(_LogOutputWindow, "}"); + } + else if (command is IcarusCommandSet) + { + IcarusCommandSet cmd = (command as IcarusCommandSet); + Invoke(_LogOutputWindow, "set " + cmd.ObjectName + " = " + (cmd.Value == null ? "(null)" : cmd.Value.ToString())); + } + else if (command is IcarusCommandWait) + { + IcarusCommandWait cmd = (command as IcarusCommandWait); + int timeout = (int)cmd.Duration; + System.Threading.Thread.Sleep(timeout); + } + else if (command is IcarusCommandPrint) + { + IcarusCommandPrint cmd = (command as IcarusCommandPrint); + string text = cmd.Text; + Invoke(_LogOutputWindow, text); + } + else if (command is IcarusCommandTask) + { + IcarusCommandTask cmd = (command as IcarusCommandTask); + if (tasksByName.ContainsKey(cmd.TaskName)) + { + Invoke(_LogOutputWindow, "WARNING: redefining task \"" + cmd.TaskName + "\""); + } + tasksByName[cmd.TaskName] = cmd; + } + else if (command is IcarusCommandControlFlowDo) + { + IcarusCommandControlFlowDo cmd = (command as IcarusCommandControlFlowDo); + if (!tasksByName.ContainsKey(cmd.Target)) + { + Invoke(_LogOutputWindow, "ERROR: task \"" + cmd.Target + "\" not found!"); + return; + } + + IcarusCommandTask task = tasksByName[cmd.Target]; + foreach (IcarusCommand command1 in task.Commands) + { + DebugCommand(command1); + } + } + else if (command is IcarusCommandLoop) + { + IcarusCommandLoop cmd = (command as IcarusCommandLoop); + float timeout = (float)cmd.Count; + if (timeout == -1) + { + while (true) + { + foreach (IcarusCommand command1 in cmd.Commands) + { + DebugCommand(command1); + } + } + } + else + { + for (float i = 0; i < timeout; i++) + { + foreach (IcarusCommand command1 in cmd.Commands) + { + DebugCommand(command1); + } + } + } + } + else if (command is IcarusCommandControlFlowDo) + { + } + else + { + throw new InvalidOperationException(); + } + + System.Threading.Thread.Sleep(50); + } + + private void mnuDebugStepInto_Click(object sender, EventArgs e) + { + MessageBox.Show("Step Into Icarus Script", "Information", MessageBoxButtons.OK); + } + private void mnuDebugStepOver_Click(object sender, EventArgs e) + { + MessageBox.Show("Step Over Icarus Script", "Information", MessageBoxButtons.OK); + } + + protected override void OnDocumentClosing(CancelEventArgs e) + { + base.OnDocumentClosing(e); + + if (tDebugger != null && tDebugger.IsAlive) + { + if (MessageBox.Show("Do you want to stop debugging?", "ICARUS Debugger", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) + { + e.Cancel = true; + return; + } + + tDebugger.Abort(); + } + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + treeNodesForCommands.Clear(); + + IcarusScriptObjectModel script = (ObjectModel as IcarusScriptObjectModel); + if (script == null) return; + + foreach (IcarusCommand command in script.Commands) + { + RecursiveAddCommand(command); + } + } + + private void RecursiveAddCommand(IcarusCommand command, TreeNode parent = null) + { + TreeNode tn = new TreeNode(); + StringBuilder sb = new StringBuilder(); + if (command == null) return; + + if (command is IcarusPredefinedCommand) + { + sb.Append((command as IcarusPredefinedCommand).Name); + } + else if (command is IcarusCustomCommand) + { + sb.Append((command as IcarusCustomCommand).CommandType.ToString()); + } + tn.ImageKey = command.GetType().Name; + tn.SelectedImageKey = command.GetType().Name; + + if (command is IcarusCommandSet) + { + IcarusCommandSet cmd = (command as IcarusCommandSet); + sb.Append(" ( "); + if (cmd.ObjectName != null) + { + sb.Append(cmd.ObjectName); + } + else + { + sb.Append("null"); + } + sb.Append(", "); + if (cmd.Value != null) + { + sb.Append(cmd.Value.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandAffect) + { + IcarusCommandAffect cmd = (command as IcarusCommandAffect); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandUse) + { + IcarusCommandUse cmd = (command as IcarusCommandUse); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandRun) + { + IcarusCommandRun cmd = (command as IcarusCommandRun); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + else if (command is IcarusCommandKill) + { + IcarusCommandKill cmd = (command as IcarusCommandKill); + sb.Append(" ( "); + if (cmd.Target != null) + { + sb.Append(cmd.Target.ToString()); + } + else + { + sb.Append("null"); + } + sb.Append(" );"); + } + + if (command is IIcarusContainerCommand) + { + IIcarusContainerCommand container = (command as IIcarusContainerCommand); + foreach (IcarusCommand ic1 in container.Commands) + { + RecursiveAddCommand(ic1, tn); + } + + sb.Append(" (" + container.Commands.Count.ToString() + " commands)"); + } + + tn.Text = sb.ToString(); + treeNodesForCommands.Add(command, tn); + + if (parent == null) + { + tv.Nodes.Add(tn); + } + else + { + parent.Nodes.Add(tn); + } + } + + private void tv_MouseDoubleClick(object sender, MouseEventArgs e) + { + TreeNode tn = tv.HitTest(e.Location).Node; + if (tn != null) + { + Dialogs.RavenSoftware.Icarus.IcarusExpressionHelperDialog dlg = new Dialogs.RavenSoftware.Icarus.IcarusExpressionHelperDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + + } + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.resx new file mode 100644 index 00000000..16fe9c44 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Icarus/IcarusScriptEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2, 5 + + + 32 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.Designer.cs new file mode 100644 index 00000000..9fbeb0b0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.Designer.cs @@ -0,0 +1,236 @@ +namespace UniversalEditor.Editors.RavenSoftware.Strip +{ + partial class StripEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lv = new System.Windows.Forms.ListView(); + this.chGroup = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chLanguage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraList = new System.Windows.Forms.GroupBox(); + this.fraEditor = new System.Windows.Forms.GroupBox(); + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdUpdate = new System.Windows.Forms.Button(); + this.txtValue = new System.Windows.Forms.TextBox(); + this.cboLanguage = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.cboGroup = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.fraList.SuspendLayout(); + this.fraEditor.SuspendLayout(); + this.SuspendLayout(); + // + // lv + // + this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chGroup, + this.chLanguage, + this.chValue}); + this.lv.FullRowSelect = true; + this.lv.GridLines = true; + this.lv.HideSelection = false; + this.lv.Location = new System.Drawing.Point(6, 19); + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(468, 160); + this.lv.TabIndex = 0; + this.lv.UseCompatibleStateImageBehavior = false; + this.lv.View = System.Windows.Forms.View.Details; + this.lv.SelectedIndexChanged += new System.EventHandler(this.lv_SelectedIndexChanged); + // + // chGroup + // + this.chGroup.Text = "Group"; + this.chGroup.Width = 122; + // + // chLanguage + // + this.chLanguage.Text = "Language"; + this.chLanguage.Width = 129; + // + // chValue + // + this.chValue.Text = "Value"; + this.chValue.Width = 208; + // + // fraList + // + this.fraList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraList.Controls.Add(this.lv); + this.fraList.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraList.Location = new System.Drawing.Point(3, 3); + this.fraList.Name = "fraList"; + this.fraList.Size = new System.Drawing.Size(480, 185); + this.fraList.TabIndex = 1; + this.fraList.TabStop = false; + this.fraList.Text = "Entry list"; + // + // fraEditor + // + this.fraEditor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraEditor.Controls.Add(this.cmdRemove); + this.fraEditor.Controls.Add(this.cmdUpdate); + this.fraEditor.Controls.Add(this.txtValue); + this.fraEditor.Controls.Add(this.cboLanguage); + this.fraEditor.Controls.Add(this.label3); + this.fraEditor.Controls.Add(this.label2); + this.fraEditor.Controls.Add(this.cboGroup); + this.fraEditor.Controls.Add(this.label1); + this.fraEditor.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEditor.Location = new System.Drawing.Point(3, 194); + this.fraEditor.Name = "fraEditor"; + this.fraEditor.Size = new System.Drawing.Size(480, 146); + this.fraEditor.TabIndex = 2; + this.fraEditor.TabStop = false; + this.fraEditor.Text = "Entry editor"; + // + // cmdRemove + // + this.cmdRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(399, 77); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(75, 23); + this.cmdRemove.TabIndex = 3; + this.cmdRemove.Text = "&Remove"; + this.cmdRemove.UseVisualStyleBackColor = true; + this.cmdRemove.Click += new System.EventHandler(this.cmdRemove_Click); + // + // cmdUpdate + // + this.cmdUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdUpdate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdUpdate.Location = new System.Drawing.Point(399, 48); + this.cmdUpdate.Name = "cmdUpdate"; + this.cmdUpdate.Size = new System.Drawing.Size(75, 23); + this.cmdUpdate.TabIndex = 3; + this.cmdUpdate.Text = "Upd&ate"; + this.cmdUpdate.UseVisualStyleBackColor = true; + this.cmdUpdate.Click += new System.EventHandler(this.cmdUpdate_Click); + // + // txtValue + // + this.txtValue.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtValue.Location = new System.Drawing.Point(86, 48); + this.txtValue.Multiline = true; + this.txtValue.Name = "txtValue"; + this.txtValue.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtValue.Size = new System.Drawing.Size(307, 92); + this.txtValue.TabIndex = 2; + // + // cboLanguage + // + this.cboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboLanguage.FormattingEnabled = true; + this.cboLanguage.Location = new System.Drawing.Point(273, 19); + this.cboLanguage.Name = "cboLanguage"; + this.cboLanguage.Size = new System.Drawing.Size(201, 21); + this.cboLanguage.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(22, 51); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(37, 13); + this.label3.TabIndex = 0; + this.label3.Text = "&Value:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(209, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(58, 13); + this.label2.TabIndex = 0; + this.label2.Text = "&Language:"; + // + // cboGroup + // + this.cboGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboGroup.FormattingEnabled = true; + this.cboGroup.Location = new System.Drawing.Point(86, 19); + this.cboGroup.Name = "cboGroup"; + this.cboGroup.Size = new System.Drawing.Size(117, 21); + this.cboGroup.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(22, 22); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(39, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Group:"; + // + // StripEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraEditor); + this.Controls.Add(this.fraList); + this.Name = "StripEditor"; + this.Size = new System.Drawing.Size(486, 343); + this.fraList.ResumeLayout(false); + this.fraEditor.ResumeLayout(false); + this.fraEditor.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListView lv; + private System.Windows.Forms.ColumnHeader chGroup; + private System.Windows.Forms.ColumnHeader chLanguage; + private System.Windows.Forms.ColumnHeader chValue; + private System.Windows.Forms.GroupBox fraList; + private System.Windows.Forms.GroupBox fraEditor; + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdUpdate; + private System.Windows.Forms.TextBox txtValue; + private System.Windows.Forms.ComboBox cboLanguage; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox cboGroup; + private System.Windows.Forms.Label label1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.cs new file mode 100644 index 00000000..bb3336cd --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.LanguageTranslation; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.RavenSoftware.Strip +{ + public partial class StripEditor : Editor + { + public StripEditor() + { + InitializeComponent(); + base.SupportedObjectModels.Add(typeof(LanguageTranslationObjectModel)); + Font = SystemFonts.MenuFont; + + ActionMenuItem mnuTools = (base.MenuBar.Items.Add("mnuTools", "&Tools") as ActionMenuItem); + mnuTools.Items.Add("mnuToolsCheckMissingTranslationSets", "Check for missing translation sets", mnuToolsCheckMissingTranslationSets_Click, 3); + mnuTools.Items.AddSeparator(3); + + ActionMenuItem mnuHelp = (base.MenuBar.Items.Add("mnuHelp", "&Help") as ActionMenuItem); + mnuHelp.Items.Add("mnuHelpAboutStripper", "About RavenTech &Stripper", mnuHelpAboutStripper_Click, -1); + } + + private void mnuToolsCheckMissingTranslationSets_Click(object sender, EventArgs e) + { + MessageBox.Show("There are no missing translation sets in the translation file. (Good job, this means your task as a translator is complete!)", "RavenTech Stripper", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + private void mnuHelpAboutStripper_Click(object sender, EventArgs e) + { + MessageBox.Show("RavenTech Stripper (Translation Strip Editor)\r\nCopyright (c)2013 Mike Becker's Software\r\nLicensed under the GNU General Public License\r\n\r\nDesigned for use with the RavenTech game engine and Raven Software's customized Jedi Knight II/Jedi Academy engine.", "RavenTech Stripper", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + lv.Items.Clear(); + + LanguageTranslationObjectModel xlate = (ObjectModel as LanguageTranslationObjectModel); + if (xlate == null) return; + + Color color = Color.Gainsboro; + + foreach (Group group in xlate.Groups) + { + cboGroup.Items.Add(group); + + foreach (Entry entry in group.Entries) + { + ListViewItem lvi = new ListViewItem(); + lvi.BackColor = color; + lvi.Tag = entry; + lvi.Text = group.Title; + lvi.SubItems.Add(entry.Language); + lvi.SubItems.Add(entry.Value); + + if (!cboLanguage.Items.Contains(entry.Language)) + { + cboLanguage.Items.Add(entry.Language); + } + lv.Items.Add(lvi); + } + + if (color == Color.Gainsboro) + { + color = Color.White; + } + else + { + color = Color.Gainsboro; + } + } + lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + + private void lv_SelectedIndexChanged(object sender, EventArgs e) + { + cboGroup.Text = String.Empty; + cboLanguage.Text = String.Empty; + txtValue.Text = String.Empty; + + if (lv.SelectedItems.Count == 1) + { + fraEditor.Enabled = true; + cmdUpdate.Text = "Upd&ate"; + + Entry entry = (lv.SelectedItems[0].Tag as Entry); + cboGroup.Text = entry.Parent.Title; + cboLanguage.Text = entry.Language; + txtValue.Text = entry.Value; + } + else if (lv.SelectedItems.Count > 1) + { + fraEditor.Enabled = false; + } + else + { + fraEditor.Enabled = true; + cmdUpdate.Text = "&Add"; + } + } + + private void cmdUpdate_Click(object sender, EventArgs e) + { + Entry entry = (lv.SelectedItems[0].Tag as Entry); + } + + private void cmdRemove_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/Strip/StripEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.Designer.cs new file mode 100644 index 00000000..7be73f25 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Editors.RavenSoftware.WeaponData +{ + partial class WeaponDataEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.cs new file mode 100644 index 00000000..0037d97e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Editors/RavenSoftware/WeaponData/WeaponDataEditor.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.RavenSoftware.WeaponData +{ + public partial class WeaponDataEditor : Editor + { + public WeaponDataEditor() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a4a8b20c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Icarus plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f1d554ee-6980-40e8-99e6-7534a892528b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..5c7d3701 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms/UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms.csproj @@ -0,0 +1,103 @@ + + + + + Debug + AnyCPU + {F19919B7-1D51-4972-8E4A-E59D68D4926A} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.Icarus.UserInterface.WindowsForms + v3.5 + 512 + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + UserControl + + + IcarusExpressionTextBox.cs + + + Form + + + IcarusExpressionHelperDialog.cs + + + UserControl + + + IcarusScriptEditor.cs + + + + + + IcarusExpressionTextBox.cs + + + IcarusExpressionHelperDialog.cs + + + IcarusScriptEditor.cs + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {B2DFA94A-A468-48A1-AB31-04EE432E7B2B} + UniversalEditor.Plugins.Icarus + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.Designer.cs new file mode 100644 index 00000000..0a5174d4 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.Designer.cs @@ -0,0 +1,129 @@ +namespace UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms.Editors.KnowledgeAdventure.Actor +{ + partial class ActorEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraGeneralInformation = new System.Windows.Forms.GroupBox(); + this.lblName = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.lblImageFileName = new System.Windows.Forms.Label(); + this.txtImageFileName = new System.Windows.Forms.TextBox(); + this.cmdBrowseImageFileName = new System.Windows.Forms.Button(); + this.fraGeneralInformation.SuspendLayout(); + this.SuspendLayout(); + // + // fraGeneralInformation + // + this.fraGeneralInformation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraGeneralInformation.Controls.Add(this.cmdBrowseImageFileName); + this.fraGeneralInformation.Controls.Add(this.txtImageFileName); + this.fraGeneralInformation.Controls.Add(this.lblImageFileName); + this.fraGeneralInformation.Controls.Add(this.txtName); + this.fraGeneralInformation.Controls.Add(this.lblName); + this.fraGeneralInformation.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraGeneralInformation.Location = new System.Drawing.Point(4, 4); + this.fraGeneralInformation.Name = "fraGeneralInformation"; + this.fraGeneralInformation.Size = new System.Drawing.Size(326, 100); + this.fraGeneralInformation.TabIndex = 0; + this.fraGeneralInformation.TabStop = false; + this.fraGeneralInformation.Text = "General information"; + // + // lblName + // + this.lblName.AutoSize = true; + this.lblName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblName.Location = new System.Drawing.Point(15, 22); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(64, 13); + this.lblName.TabIndex = 0; + this.lblName.Text = "Actor &name:"; + // + // txtName + // + this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtName.Location = new System.Drawing.Point(105, 19); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(215, 20); + this.txtName.TabIndex = 1; + // + // lblImageFileName + // + this.lblImageFileName.AutoSize = true; + this.lblImageFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblImageFileName.Location = new System.Drawing.Point(15, 48); + this.lblImageFileName.Name = "lblImageFileName"; + this.lblImageFileName.Size = new System.Drawing.Size(84, 13); + this.lblImageFileName.TabIndex = 0; + this.lblImageFileName.Text = "Image &file name:"; + // + // txtImageFileName + // + this.txtImageFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtImageFileName.Location = new System.Drawing.Point(105, 45); + this.txtImageFileName.Name = "txtImageFileName"; + this.txtImageFileName.Size = new System.Drawing.Size(215, 20); + this.txtImageFileName.TabIndex = 1; + // + // cmdBrowseImageFileName + // + this.cmdBrowseImageFileName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowseImageFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowseImageFileName.Location = new System.Drawing.Point(245, 71); + this.cmdBrowseImageFileName.Name = "cmdBrowseImageFileName"; + this.cmdBrowseImageFileName.Size = new System.Drawing.Size(75, 23); + this.cmdBrowseImageFileName.TabIndex = 2; + this.cmdBrowseImageFileName.Text = "&Browse..."; + this.cmdBrowseImageFileName.UseVisualStyleBackColor = true; + this.cmdBrowseImageFileName.Click += new System.EventHandler(this.cmdBrowseImageFileName_Click); + // + // ActorEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraGeneralInformation); + this.Name = "ActorEditor"; + this.Size = new System.Drawing.Size(333, 227); + this.fraGeneralInformation.ResumeLayout(false); + this.fraGeneralInformation.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraGeneralInformation; + private System.Windows.Forms.Label lblName; + private System.Windows.Forms.Button cmdBrowseImageFileName; + private System.Windows.Forms.TextBox txtImageFileName; + private System.Windows.Forms.Label lblImageFileName; + private System.Windows.Forms.TextBox txtName; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.cs new file mode 100644 index 00000000..1bd03c14 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.KnowledgeAdventure.Actor; + +namespace UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms.Editors.KnowledgeAdventure.Actor +{ + public partial class ActorEditor : Editor + { + public ActorEditor() + { + InitializeComponent(); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(ActorObjectModel)); + } + return _er; + } + + private void cmdBrowseImageFileName_Click(object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog(); + + if (ObjectModel.Accessor != null) + { + string fileName = ObjectModel.Accessor.GetFileName(); + if (System.IO.File.Exists(fileName)) + { + ofd.InitialDirectory = System.IO.Path.GetDirectoryName(fileName); + } + } + + if (ofd.ShowDialog() == DialogResult.OK) + { + txtImageFileName.Text = System.IO.Path.GetFileName(ofd.FileName); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Editors/KnowledgeAdventure/Actor/ActorEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..499fb6d8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UniversalEditor.Plugins.KA.UI.WindowsForms")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("UniversalEditor.Plugins.KA.UI.WindowsForms")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b23117e5-af17-4295-bc0a-eca398120186")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..2038b30d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms/UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms.csproj @@ -0,0 +1,84 @@ + + + + + Debug + AnyCPU + {2006E5F0-E3C2-4F3C-9F55-2171B9334FA4} + Library + Properties + UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms + UniversalEditor.Plugins.KnowledgeAdventure.UserInterface.WindowsForms + v3.5 + 512 + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + UserControl + + + ActorEditor.cs + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {991F734F-D659-4252-8D2D-E6F828474861} + UniversalEditor.Plugins.KnowledgeAdventure + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + ActorEditor.cs + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.Designer.cs new file mode 100644 index 00000000..b512d4e8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.Designer.cs @@ -0,0 +1,45 @@ +namespace UniversalEditor.Controls.Michelangelo +{ + partial class CanvasControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // CanvasControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.Name = "CanvasControl"; + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.cs new file mode 100644 index 00000000..e87a685f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Controls.Michelangelo +{ + public partial class CanvasControl : UserControl + { + public CanvasControl() + { + InitializeComponent(); + + BuildTransparentBackgroundBrush(); + } + + private TextureBrush mvarTransparentBackgroundBrush = null; + private void BuildTransparentBackgroundBrush() + { + Bitmap bitmap = new Bitmap(16, 16); + Graphics g = Graphics.FromImage(bitmap); + + SolidBrush light = new SolidBrush(Color.FromArgb(153, 153, 153)); + SolidBrush dark = new SolidBrush(Color.FromArgb(102, 102, 102)); + + g.FillRectangle(light, new Rectangle(0, 0, 8, 8)); + g.FillRectangle(dark, new Rectangle(8, 0, 8, 8)); + g.FillRectangle(dark, new Rectangle(0, 8, 8, 8)); + g.FillRectangle(light, new Rectangle(8, 8, 8, 8)); + + mvarTransparentBackgroundBrush = new TextureBrush(bitmap); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + e.Graphics.FillRectangle(mvarTransparentBackgroundBrush, new Rectangle(0, 0, Width - 1, Height - 1)); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Controls/Michelangelo/CanvasControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.Designer.cs new file mode 100644 index 00000000..cb4c0b48 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.Designer.cs @@ -0,0 +1,270 @@ +namespace UniversalEditor.Editors.Michelangelo.Canvas +{ + partial class CanvasEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabToolbox = new System.Windows.Forms.TabPage(); + this.treeView2 = new System.Windows.Forms.TreeView(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.splitContainer3 = new System.Windows.Forms.SplitContainer(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabProperties = new System.Windows.Forms.TabPage(); + this.tabControl3 = new System.Windows.Forms.TabControl(); + this.tabExplorer = new System.Windows.Forms.TabPage(); + this.treeView1 = new System.Windows.Forms.TreeView(); + this.tabControl4 = new System.Windows.Forms.TabControl(); + this.tabDocument = new System.Windows.Forms.TabPage(); + this.canvasControl1 = new UniversalEditor.Controls.Michelangelo.CanvasControl(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabToolbox.SuspendLayout(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + this.splitContainer3.Panel1.SuspendLayout(); + this.splitContainer3.Panel2.SuspendLayout(); + this.splitContainer3.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabControl3.SuspendLayout(); + this.tabExplorer.SuspendLayout(); + this.tabControl4.SuspendLayout(); + this.tabDocument.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tabControl1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(713, 509); + this.splitContainer1.SplitterDistance = 158; + this.splitContainer1.TabIndex = 0; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabToolbox); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(0, 0); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(158, 509); + this.tabControl1.TabIndex = 0; + // + // tabToolbox + // + this.tabToolbox.Controls.Add(this.treeView2); + this.tabToolbox.Location = new System.Drawing.Point(4, 22); + this.tabToolbox.Name = "tabToolbox"; + this.tabToolbox.Padding = new System.Windows.Forms.Padding(3); + this.tabToolbox.Size = new System.Drawing.Size(150, 483); + this.tabToolbox.TabIndex = 0; + this.tabToolbox.Text = "Toolbox"; + this.tabToolbox.UseVisualStyleBackColor = true; + // + // treeView2 + // + this.treeView2.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView2.Location = new System.Drawing.Point(3, 3); + this.treeView2.Name = "treeView2"; + this.treeView2.Size = new System.Drawing.Size(144, 477); + this.treeView2.TabIndex = 1; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.splitContainer3); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.tabControl3); + this.splitContainer2.Size = new System.Drawing.Size(551, 509); + this.splitContainer2.SplitterDistance = 341; + this.splitContainer2.TabIndex = 0; + // + // splitContainer3 + // + this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer3.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer3.Location = new System.Drawing.Point(0, 0); + this.splitContainer3.Name = "splitContainer3"; + this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer3.Panel1 + // + this.splitContainer3.Panel1.Controls.Add(this.tabControl4); + // + // splitContainer3.Panel2 + // + this.splitContainer3.Panel2.Controls.Add(this.tabControl2); + this.splitContainer3.Size = new System.Drawing.Size(341, 509); + this.splitContainer3.SplitterDistance = 356; + this.splitContainer3.TabIndex = 1; + // + // tabControl2 + // + this.tabControl2.Controls.Add(this.tabProperties); + this.tabControl2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl2.Location = new System.Drawing.Point(0, 0); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + this.tabControl2.Size = new System.Drawing.Size(341, 149); + this.tabControl2.TabIndex = 1; + // + // tabProperties + // + this.tabProperties.Location = new System.Drawing.Point(4, 22); + this.tabProperties.Name = "tabProperties"; + this.tabProperties.Padding = new System.Windows.Forms.Padding(3); + this.tabProperties.Size = new System.Drawing.Size(333, 123); + this.tabProperties.TabIndex = 0; + this.tabProperties.Text = "Properties"; + this.tabProperties.UseVisualStyleBackColor = true; + // + // tabControl3 + // + this.tabControl3.Controls.Add(this.tabExplorer); + this.tabControl3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl3.Location = new System.Drawing.Point(0, 0); + this.tabControl3.Name = "tabControl3"; + this.tabControl3.SelectedIndex = 0; + this.tabControl3.Size = new System.Drawing.Size(206, 509); + this.tabControl3.TabIndex = 1; + // + // tabExplorer + // + this.tabExplorer.Controls.Add(this.treeView1); + this.tabExplorer.Location = new System.Drawing.Point(4, 22); + this.tabExplorer.Name = "tabExplorer"; + this.tabExplorer.Padding = new System.Windows.Forms.Padding(3); + this.tabExplorer.Size = new System.Drawing.Size(198, 483); + this.tabExplorer.TabIndex = 0; + this.tabExplorer.Text = "Explorer"; + this.tabExplorer.UseVisualStyleBackColor = true; + // + // treeView1 + // + this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.Location = new System.Drawing.Point(3, 3); + this.treeView1.Name = "treeView1"; + this.treeView1.Size = new System.Drawing.Size(192, 477); + this.treeView1.TabIndex = 0; + // + // tabControl4 + // + this.tabControl4.Controls.Add(this.tabDocument); + this.tabControl4.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl4.Location = new System.Drawing.Point(0, 0); + this.tabControl4.Name = "tabControl4"; + this.tabControl4.SelectedIndex = 0; + this.tabControl4.Size = new System.Drawing.Size(341, 356); + this.tabControl4.TabIndex = 0; + // + // tabDocument + // + this.tabDocument.Controls.Add(this.canvasControl1); + this.tabDocument.Location = new System.Drawing.Point(4, 22); + this.tabDocument.Name = "tabDocument"; + this.tabDocument.Padding = new System.Windows.Forms.Padding(3); + this.tabDocument.Size = new System.Drawing.Size(333, 330); + this.tabDocument.TabIndex = 0; + this.tabDocument.Text = "Document"; + this.tabDocument.UseVisualStyleBackColor = true; + // + // canvasControl1 + // + this.canvasControl1.BackColor = System.Drawing.Color.White; + this.canvasControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.canvasControl1.Location = new System.Drawing.Point(3, 3); + this.canvasControl1.Name = "canvasControl1"; + this.canvasControl1.Size = new System.Drawing.Size(327, 324); + this.canvasControl1.TabIndex = 1; + // + // CanvasEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "CanvasEditor"; + this.Size = new System.Drawing.Size(713, 509); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabToolbox.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.ResumeLayout(false); + this.splitContainer3.Panel1.ResumeLayout(false); + this.splitContainer3.Panel2.ResumeLayout(false); + this.splitContainer3.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabControl3.ResumeLayout(false); + this.tabExplorer.ResumeLayout(false); + this.tabControl4.ResumeLayout(false); + this.tabDocument.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabToolbox; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.SplitContainer splitContainer3; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabProperties; + private System.Windows.Forms.TabControl tabControl3; + private System.Windows.Forms.TabPage tabExplorer; + private System.Windows.Forms.TreeView treeView2; + private System.Windows.Forms.TreeView treeView1; + private System.Windows.Forms.TabControl tabControl4; + private System.Windows.Forms.TabPage tabDocument; + private Controls.Michelangelo.CanvasControl canvasControl1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.cs new file mode 100644 index 00000000..4acdb0cc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Michelangelo.Canvas +{ + public partial class CanvasEditor : Editor + { + public CanvasEditor() + { + InitializeComponent(); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Editors/Michelangelo/Canvas/CanvasEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..5ac3e26d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor plugin for Michelangelo - Windows Forms user interface")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Michelangelo")] +[assembly: AssemblyCopyright("Copyright ©2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9d01b3d2-04ae-4693-8be4-895efd3f0cc3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..5f98038b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms/UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms.csproj @@ -0,0 +1,106 @@ + + + + + Debug + AnyCPU + {E1A1FD87-BEA4-41B7-9472-B4E35A0630B5} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.Michelangelo.UserInterface.WindowsForms + v3.5 + 512 + + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + UserControl + + + CanvasControl.cs + + + UserControl + + + CanvasEditor.cs + + + + + + CanvasControl.cs + + + CanvasEditor.cs + + + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + {3F664673-7E22-4486-9AD0-FC81861D0B78} + UniversalEditor.Compression + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {76FD1306-9CA4-428F-993B-B7E4EEEACBF3} + UniversalEditor.Plugins.FileSystem + + + {D623EC26-1A04-4BFE-84EE-E738281499C0} + UniversalEditor.Plugins.Michelangelo + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.Designer.cs new file mode 100644 index 00000000..e117218f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.Designer.cs @@ -0,0 +1,140 @@ +namespace UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript +{ + partial class BootstrapFilePropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdBrowseSourceFileName = new System.Windows.Forms.Button(); + this.txtSourceFileName = new System.Windows.Forms.TextBox(); + this.cmdBrowseDestinationFileName = new System.Windows.Forms.Button(); + this.txtDestinationFileName = new System.Windows.Forms.TextBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // cmdBrowseSourceFileName + // + this.cmdBrowseSourceFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowseSourceFileName.Location = new System.Drawing.Point(12, 12); + this.cmdBrowseSourceFileName.Name = "cmdBrowseSourceFileName"; + this.cmdBrowseSourceFileName.Size = new System.Drawing.Size(125, 23); + this.cmdBrowseSourceFileName.TabIndex = 0; + this.cmdBrowseSourceFileName.Text = "&Source file name:"; + this.cmdBrowseSourceFileName.UseVisualStyleBackColor = true; + this.cmdBrowseSourceFileName.Click += new System.EventHandler(this.cmdBrowseSourceFileName_Click); + // + // txtSourceFileName + // + this.txtSourceFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSourceFileName.HideSelection = false; + this.txtSourceFileName.Location = new System.Drawing.Point(143, 14); + this.txtSourceFileName.Name = "txtSourceFileName"; + this.txtSourceFileName.Size = new System.Drawing.Size(241, 20); + this.txtSourceFileName.TabIndex = 1; + // + // cmdBrowseDestinationFileName + // + this.cmdBrowseDestinationFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowseDestinationFileName.Location = new System.Drawing.Point(12, 41); + this.cmdBrowseDestinationFileName.Name = "cmdBrowseDestinationFileName"; + this.cmdBrowseDestinationFileName.Size = new System.Drawing.Size(125, 23); + this.cmdBrowseDestinationFileName.TabIndex = 2; + this.cmdBrowseDestinationFileName.Text = "&Destination file name:"; + this.cmdBrowseDestinationFileName.UseVisualStyleBackColor = true; + this.cmdBrowseDestinationFileName.Click += new System.EventHandler(this.cmdBrowseDestinationFileName_Click); + // + // txtDestinationFileName + // + this.txtDestinationFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDestinationFileName.HideSelection = false; + this.txtDestinationFileName.Location = new System.Drawing.Point(143, 43); + this.txtDestinationFileName.Name = "txtDestinationFileName"; + this.txtDestinationFileName.Size = new System.Drawing.Size(241, 20); + this.txtDestinationFileName.TabIndex = 3; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(309, 69); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 5; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(228, 69); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 4; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // BootstrapFilePropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(396, 104); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.txtDestinationFileName); + this.Controls.Add(this.txtSourceFileName); + this.Controls.Add(this.cmdBrowseDestinationFileName); + this.Controls.Add(this.cmdBrowseSourceFileName); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(412, 142); + this.Name = "BootstrapFilePropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Bootstrap File Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button cmdBrowseSourceFileName; + private System.Windows.Forms.Button cmdBrowseDestinationFileName; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtSourceFileName; + internal System.Windows.Forms.TextBox txtDestinationFileName; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.cs new file mode 100644 index 00000000..15ec4f6f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript +{ + public partial class BootstrapFilePropertiesDialogImpl : Form + { + public BootstrapFilePropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdBrowseSourceFileName_Click(object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog(); + if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + txtSourceFileName.Text = ofd.FileName; + } + } + + private void cmdBrowseDestinationFileName_Click(object sender, EventArgs e) + { + SaveFileDialog sfd = new SaveFileDialog(); + if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + txtDestinationFileName.Text = sfd.FileName; + } + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtSourceFileName.Text)) + { + MessageBox.Show("Please provide a source file name.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (String.IsNullOrEmpty(txtDestinationFileName.Text)) + { + if (MessageBox.Show("You have not specified a destination file name. Would you like to use the same file name ('" + System.IO.Path.GetFileName(txtSourceFileName.Text) + "') as the source file?", "Destination File Name", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.No) + { + return; + } + txtDestinationFileName.Text = System.IO.Path.GetFileName(txtSourceFileName.Text); + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + public class BootstrapFilePropertiesDialog + { + private string mvarSourceFileName = String.Empty; + public string SourceFileName { get { return mvarSourceFileName; } set { mvarSourceFileName = value; } } + + private string mvarDestinationFileName = String.Empty; + public string DestinationFileName { get { return mvarDestinationFileName; } set { mvarDestinationFileName = value; } } + + public DialogResult ShowDialog() + { + BootstrapFilePropertiesDialogImpl dlg = new BootstrapFilePropertiesDialogImpl(); + dlg.txtSourceFileName.Text = mvarSourceFileName; + dlg.txtDestinationFileName.Text = mvarDestinationFileName; + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarSourceFileName = dlg.txtSourceFileName.Text; + mvarDestinationFileName = dlg.txtDestinationFileName.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/BootstrapFilePropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.Designer.cs new file mode 100644 index 00000000..08ba4063 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.Designer.cs @@ -0,0 +1,188 @@ +namespace UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript +{ + partial class ManageOperatingSystemsDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("(Platform-Independent)"); + System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("Windows 95"); + System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("NT Intel"); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.lv = new System.Windows.Forms.ListView(); + this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdAdd = new System.Windows.Forms.Button(); + this.cmdModify = new System.Windows.Forms.Button(); + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdClear = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(255, 146); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(174, 146); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 1; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // lv + // + this.lv.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lv.CheckBoxes = true; + this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTitle}); + this.lv.FullRowSelect = true; + this.lv.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lv.HideSelection = false; + listViewItem1.Checked = true; + listViewItem1.StateImageIndex = 1; + listViewItem2.Checked = true; + listViewItem2.StateImageIndex = 1; + listViewItem3.Checked = true; + listViewItem3.StateImageIndex = 1; + this.lv.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + listViewItem1, + listViewItem2, + listViewItem3}); + this.lv.Location = new System.Drawing.Point(12, 41); + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(318, 99); + this.lv.TabIndex = 0; + this.lv.UseCompatibleStateImageBehavior = false; + this.lv.View = System.Windows.Forms.View.Details; + this.lv.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.lv_ItemChecked); + this.lv.SelectedIndexChanged += new System.EventHandler(this.lv_SelectedIndexChanged); + // + // chTitle + // + this.chTitle.Text = "Title"; + this.chTitle.Width = 309; + // + // cmdAdd + // + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(12, 12); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(75, 23); + this.cmdAdd.TabIndex = 3; + this.cmdAdd.Text = "&Add..."; + this.cmdAdd.UseVisualStyleBackColor = true; + this.cmdAdd.Click += new System.EventHandler(this.cmdAdd_Click); + // + // cmdModify + // + this.cmdModify.Enabled = false; + this.cmdModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdModify.Location = new System.Drawing.Point(93, 12); + this.cmdModify.Name = "cmdModify"; + this.cmdModify.Size = new System.Drawing.Size(75, 23); + this.cmdModify.TabIndex = 3; + this.cmdModify.Text = "&Modify..."; + this.cmdModify.UseVisualStyleBackColor = true; + this.cmdModify.Click += new System.EventHandler(this.cmdModify_Click); + // + // cmdRemove + // + this.cmdRemove.Enabled = false; + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(174, 12); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(75, 23); + this.cmdRemove.TabIndex = 3; + this.cmdRemove.Text = "&Remove..."; + this.cmdRemove.UseVisualStyleBackColor = true; + this.cmdRemove.Click += new System.EventHandler(this.cmdRemove_Click); + // + // cmdClear + // + this.cmdClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClear.Enabled = false; + this.cmdClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClear.Location = new System.Drawing.Point(255, 12); + this.cmdClear.Name = "cmdClear"; + this.cmdClear.Size = new System.Drawing.Size(75, 23); + this.cmdClear.TabIndex = 3; + this.cmdClear.Text = "Cl&ear"; + this.cmdClear.UseVisualStyleBackColor = true; + this.cmdClear.Click += new System.EventHandler(this.cmdClear_Click); + // + // ManageOperatingSystemsDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(342, 181); + this.Controls.Add(this.cmdClear); + this.Controls.Add(this.cmdRemove); + this.Controls.Add(this.cmdModify); + this.Controls.Add(this.cmdAdd); + this.Controls.Add(this.lv); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(358, 219); + this.Name = "ManageOperatingSystemsDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Manage Operating Systems"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.ListView lv; + private System.Windows.Forms.ColumnHeader chTitle; + private System.Windows.Forms.Button cmdAdd; + private System.Windows.Forms.Button cmdModify; + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdClear; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.cs new file mode 100644 index 00000000..7b6fdb13 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Setup.Microsoft.ACME.BootstrapScript; + +namespace UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript +{ + internal partial class ManageOperatingSystemsDialogImpl : Form + { + public ManageOperatingSystemsDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private BootstrapOperatingSystem.BootstrapOperatingSystemCollection mvarOperatingSystems = new BootstrapOperatingSystem.BootstrapOperatingSystemCollection(); + public BootstrapOperatingSystem.BootstrapOperatingSystemCollection OperatingSystems { get { return mvarOperatingSystems; } } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + lv.Items.Clear(); + + if (mvarOperatingSystems.Count == 0) + { + mvarOperatingSystems.Add(BootstrapOperatingSystem.PlatformIndependent); + } + + foreach (BootstrapOperatingSystem item in mvarOperatingSystems) + { + ListViewItem lvi = new ListViewItem(); + lvi.Checked = item.Enabled; + lvi.Text = item.Name; + lvi.Tag = item; + lv.Items.Add(lvi); + } + + RefreshButtons(); + } + + private void cmdAdd_Click(object sender, EventArgs e) + { + OperatingSystemPropertiesDialog dlg = new OperatingSystemPropertiesDialog(); + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + BootstrapOperatingSystem item = new BootstrapOperatingSystem(); + item.Name = dlg.Name; + item.Enabled = dlg.Enabled; + mvarOperatingSystems.Add(item); + + ListViewItem lvi = new ListViewItem(); + lvi.Checked = item.Enabled; + lvi.Text = item.Name; + lvi.Tag = item; + lv.Items.Add(lvi); + + RefreshButtons(); + } + } + + private void cmdModify_Click(object sender, EventArgs e) + { + if (lv.SelectedItems.Count != 1) return; + + OperatingSystemPropertiesDialog dlg = new OperatingSystemPropertiesDialog(); + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + + } + } + + private void cmdRemove_Click(object sender, EventArgs e) + { + if (lv.SelectedItems.Count == 0) return; + + if (MessageBox.Show("Removing operating systems from the list will delete their associated settings.\r\n\r\nAre you sure you want to remove the selected operating systems and clear their associated settings?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.No) + { + return; + } + + while (lv.SelectedItems.Count > 0) + { + lv.SelectedItems[0].Remove(); + } + RefreshButtons(); + } + + private void cmdClear_Click(object sender, EventArgs e) + { + if (lv.Items.Count == 0) return; + + if (MessageBox.Show("Removing operating systems from the list will delete their associated settings.\r\n\r\nAre you sure you want to remove ALL operating systems and clear their associated settings?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.No) + { + return; + } + + lv.Items.Clear(); + + mvarOperatingSystems.Clear(); + mvarOperatingSystems.Add(BootstrapOperatingSystem.PlatformIndependent); + + foreach (BootstrapOperatingSystem item in mvarOperatingSystems) + { + ListViewItem lvi = new ListViewItem(); + lvi.Checked = item.Enabled; + lvi.Text = item.Name; + lvi.Tag = item; + lv.Items.Add(lvi); + } + + RefreshButtons(); + } + + private void RefreshButtons() + { + cmdModify.Enabled = (lv.SelectedItems.Count == 1); + cmdRemove.Enabled = (lv.SelectedItems.Count > 0); + cmdClear.Enabled = (lv.Items.Count > 1); + + if (lv.SelectedItems.Count > 0) + { + if (lv.SelectedItems[0].Tag == BootstrapOperatingSystem.PlatformIndependent) + { + cmdModify.Enabled = false; + cmdRemove.Enabled = false; + } + } + } + + private void lv_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void lv_ItemChecked(object sender, ItemCheckedEventArgs e) + { + BootstrapOperatingSystem item = (e.Item.Tag as BootstrapOperatingSystem); + if (item == null) return; + + item.Enabled = e.Item.Checked; + } + } + + public class ManageOperatingSystemsDialog + { + private BootstrapOperatingSystem.BootstrapOperatingSystemCollection mvarOperatingSystems = new BootstrapOperatingSystem.BootstrapOperatingSystemCollection(); + public BootstrapOperatingSystem.BootstrapOperatingSystemCollection OperatingSystems { get { return mvarOperatingSystems; } } + + public DialogResult ShowDialog() + { + ManageOperatingSystemsDialogImpl dlg = new ManageOperatingSystemsDialogImpl(); + foreach (BootstrapOperatingSystem item in mvarOperatingSystems) + { + dlg.OperatingSystems.Add(item); + } + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarOperatingSystems.Clear(); + foreach (BootstrapOperatingSystem item in dlg.OperatingSystems) + { + mvarOperatingSystems.Add(item); + } + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/ManageOperatingSystemsDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.Designer.cs new file mode 100644 index 00000000..bc415901 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.Designer.cs @@ -0,0 +1,126 @@ +namespace UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript +{ + partial class OperatingSystemPropertiesDialogImpl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblName = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.chkEnabled = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // lblName + // + this.lblName.AutoSize = true; + this.lblName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblName.Location = new System.Drawing.Point(12, 15); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(38, 13); + this.lblName.TabIndex = 0; + this.lblName.Text = "&Name:"; + // + // txtName + // + this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtName.Location = new System.Drawing.Point(56, 12); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(283, 20); + this.txtName.TabIndex = 1; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(264, 73); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 4; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(183, 73); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 3; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // chkEnabled + // + this.chkEnabled.AutoSize = true; + this.chkEnabled.Checked = true; + this.chkEnabled.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkEnabled.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkEnabled.Location = new System.Drawing.Point(56, 38); + this.chkEnabled.Name = "chkEnabled"; + this.chkEnabled.Size = new System.Drawing.Size(71, 18); + this.chkEnabled.TabIndex = 2; + this.chkEnabled.Text = "&Enabled"; + this.chkEnabled.UseVisualStyleBackColor = true; + // + // OperatingSystemPropertiesDialogImpl + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(351, 108); + this.Controls.Add(this.chkEnabled); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.txtName); + this.Controls.Add(this.lblName); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "OperatingSystemPropertiesDialogImpl"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Operating System Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblName; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtName; + internal System.Windows.Forms.CheckBox chkEnabled; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.cs new file mode 100644 index 00000000..21f8fb10 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript +{ + internal partial class OperatingSystemPropertiesDialogImpl : Form + { + public OperatingSystemPropertiesDialogImpl() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + if (String.IsNullOrEmpty(txtName.Text)) + { + MessageBox.Show("Please enter a name for this operating system.", "Enter Name", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close(); + } + } + public class OperatingSystemPropertiesDialog + { + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private bool mvarEnabled = true; + public bool Enabled { get { return mvarEnabled; } set { mvarEnabled = value; } } + + public DialogResult ShowDialog() + { + OperatingSystemPropertiesDialogImpl dlg = new OperatingSystemPropertiesDialogImpl(); + dlg.txtName.Text = mvarName; + dlg.chkEnabled.Checked = mvarEnabled; + + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarName = dlg.txtName.Text; + mvarEnabled = dlg.chkEnabled.Checked; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Dialogs/Setup/Microsoft/ACME/BootstrapScript/OperatingSystemPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.Designer.cs new file mode 100644 index 00000000..d790137b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.Designer.cs @@ -0,0 +1,457 @@ +namespace UniversalEditor.Editors.Setup.Microsoft.ACME.BootstrapScript +{ + partial class BootstrapScriptEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraGeneral = new System.Windows.Forms.GroupBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.chkRequire31 = new System.Windows.Forms.CheckBox(); + this.txtTemporaryDirectorySize = new System.Windows.Forms.NumericUpDown(); + this.txtTemporaryDirectoryName = new System.Windows.Forms.TextBox(); + this.txtRequire31 = new System.Windows.Forms.TextBox(); + this.txtCommandLine = new System.Windows.Forms.TextBox(); + this.txtWindowClassName = new System.Windows.Forms.TextBox(); + this.txtWindowMessage = new System.Windows.Forms.TextBox(); + this.lblRequire31 = new System.Windows.Forms.Label(); + this.lblTemporaryDirectorySize = new System.Windows.Forms.Label(); + this.lblCommandLine = new System.Windows.Forms.Label(); + this.lblWindowClassName = new System.Windows.Forms.Label(); + this.lblTemporaryDirectoryName = new System.Windows.Forms.Label(); + this.lblWindowMessage = new System.Windows.Forms.Label(); + this.txtWindowTitle = new System.Windows.Forms.TextBox(); + this.lblWindowTitle = new System.Windows.Forms.Label(); + this.fraFiles = new System.Windows.Forms.GroupBox(); + this.cmdFilesClear = new System.Windows.Forms.Button(); + this.cmdFilesRemove = new System.Windows.Forms.Button(); + this.cmdFilesModify = new System.Windows.Forms.Button(); + this.cmdFilesAdd = new System.Windows.Forms.Button(); + this.lvFiles = new System.Windows.Forms.ListView(); + this.chSource = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chDestination = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.lblOperatingSystem = new System.Windows.Forms.Label(); + this.cboOperatingSystem = new System.Windows.Forms.ComboBox(); + this.cmdManageOperatingSystems = new System.Windows.Forms.Button(); + this.fraGeneral.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtTemporaryDirectorySize)).BeginInit(); + this.fraFiles.SuspendLayout(); + this.SuspendLayout(); + // + // fraGeneral + // + this.fraGeneral.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraGeneral.Controls.Add(this.pictureBox1); + this.fraGeneral.Controls.Add(this.chkRequire31); + this.fraGeneral.Controls.Add(this.txtTemporaryDirectorySize); + this.fraGeneral.Controls.Add(this.txtTemporaryDirectoryName); + this.fraGeneral.Controls.Add(this.txtRequire31); + this.fraGeneral.Controls.Add(this.txtCommandLine); + this.fraGeneral.Controls.Add(this.txtWindowClassName); + this.fraGeneral.Controls.Add(this.txtWindowMessage); + this.fraGeneral.Controls.Add(this.lblRequire31); + this.fraGeneral.Controls.Add(this.lblTemporaryDirectorySize); + this.fraGeneral.Controls.Add(this.lblCommandLine); + this.fraGeneral.Controls.Add(this.lblWindowClassName); + this.fraGeneral.Controls.Add(this.lblTemporaryDirectoryName); + this.fraGeneral.Controls.Add(this.lblWindowMessage); + this.fraGeneral.Controls.Add(this.txtWindowTitle); + this.fraGeneral.Controls.Add(this.lblWindowTitle); + this.fraGeneral.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraGeneral.Location = new System.Drawing.Point(4, 32); + this.fraGeneral.Name = "fraGeneral"; + this.fraGeneral.Size = new System.Drawing.Size(479, 208); + this.fraGeneral.TabIndex = 3; + this.fraGeneral.TabStop = false; + this.fraGeneral.Text = "General"; + // + // pictureBox1 + // + this.pictureBox1.Image = global::UniversalEditor.Properties.Resources.setup; + this.pictureBox1.Location = new System.Drawing.Point(13, 26); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.TabIndex = 4; + this.pictureBox1.TabStop = false; + // + // chkRequire31 + // + this.chkRequire31.AutoSize = true; + this.chkRequire31.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkRequire31.Location = new System.Drawing.Point(19, 149); + this.chkRequire31.Name = "chkRequire31"; + this.chkRequire31.Size = new System.Drawing.Size(134, 18); + this.chkRequire31.TabIndex = 12; + this.chkRequire31.Text = "&Require Windows 3.1"; + this.chkRequire31.UseVisualStyleBackColor = true; + this.chkRequire31.CheckedChanged += new System.EventHandler(this.chkRequire31_CheckedChanged); + // + // txtTemporaryDirectorySize + // + this.txtTemporaryDirectorySize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.txtTemporaryDirectorySize.Location = new System.Drawing.Point(405, 97); + this.txtTemporaryDirectorySize.Maximum = new decimal(new int[] { + 65531, + 0, + 0, + 0}); + this.txtTemporaryDirectorySize.Name = "txtTemporaryDirectorySize"; + this.txtTemporaryDirectorySize.Size = new System.Drawing.Size(68, 20); + this.txtTemporaryDirectorySize.TabIndex = 9; + this.txtTemporaryDirectorySize.Value = new decimal(new int[] { + 3200, + 0, + 0, + 0}); + this.txtTemporaryDirectorySize.Validated += new System.EventHandler(this.txtTemporaryDirectorySize_Validated); + // + // txtTemporaryDirectoryName + // + this.txtTemporaryDirectoryName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTemporaryDirectoryName.Location = new System.Drawing.Point(154, 96); + this.txtTemporaryDirectoryName.Name = "txtTemporaryDirectoryName"; + this.txtTemporaryDirectoryName.Size = new System.Drawing.Size(209, 20); + this.txtTemporaryDirectoryName.TabIndex = 7; + this.txtTemporaryDirectoryName.Text = "~msstfqf.t"; + this.txtTemporaryDirectoryName.Validated += new System.EventHandler(this.txtTemporaryDirectoryName_Validated); + // + // txtRequire31 + // + this.txtRequire31.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtRequire31.Location = new System.Drawing.Point(154, 172); + this.txtRequire31.Name = "txtRequire31"; + this.txtRequire31.ReadOnly = true; + this.txtRequire31.Size = new System.Drawing.Size(319, 20); + this.txtRequire31.TabIndex = 14; + this.txtRequire31.Text = "This application requires a newer version of Microsoft Windows."; + this.txtRequire31.Validated += new System.EventHandler(this.txtRequire31_Validated); + // + // txtCommandLine + // + this.txtCommandLine.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtCommandLine.Location = new System.Drawing.Point(154, 123); + this.txtCommandLine.Name = "txtCommandLine"; + this.txtCommandLine.Size = new System.Drawing.Size(319, 20); + this.txtCommandLine.TabIndex = 11; + this.txtCommandLine.Text = "acmsetup /T setup.stf"; + this.txtCommandLine.Validated += new System.EventHandler(this.txtCommandLine_Validated); + // + // txtWindowClassName + // + this.txtWindowClassName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtWindowClassName.Location = new System.Drawing.Point(154, 71); + this.txtWindowClassName.Name = "txtWindowClassName"; + this.txtWindowClassName.Size = new System.Drawing.Size(319, 20); + this.txtWindowClassName.TabIndex = 5; + this.txtWindowClassName.Text = "Stuff-Shell"; + this.txtWindowClassName.Validated += new System.EventHandler(this.txtWindowClassName_Validated); + // + // txtWindowMessage + // + this.txtWindowMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtWindowMessage.Location = new System.Drawing.Point(154, 45); + this.txtWindowMessage.Name = "txtWindowMessage"; + this.txtWindowMessage.Size = new System.Drawing.Size(319, 20); + this.txtWindowMessage.TabIndex = 3; + this.txtWindowMessage.Text = "Initializing Setup..."; + this.txtWindowMessage.Validated += new System.EventHandler(this.txtWindowMessage_Validated); + // + // lblRequire31 + // + this.lblRequire31.AutoSize = true; + this.lblRequire31.Enabled = false; + this.lblRequire31.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblRequire31.Location = new System.Drawing.Point(51, 175); + this.lblRequire31.Name = "lblRequire31"; + this.lblRequire31.Size = new System.Drawing.Size(77, 13); + this.lblRequire31.TabIndex = 13; + this.lblRequire31.Text = "Error &message:"; + // + // lblTemporaryDirectorySize + // + this.lblTemporaryDirectorySize.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.lblTemporaryDirectorySize.AutoSize = true; + this.lblTemporaryDirectorySize.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTemporaryDirectorySize.Location = new System.Drawing.Point(369, 99); + this.lblTemporaryDirectorySize.Name = "lblTemporaryDirectorySize"; + this.lblTemporaryDirectorySize.Size = new System.Drawing.Size(30, 13); + this.lblTemporaryDirectorySize.TabIndex = 8; + this.lblTemporaryDirectorySize.Text = "&Size:"; + // + // lblCommandLine + // + this.lblCommandLine.AutoSize = true; + this.lblCommandLine.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblCommandLine.Location = new System.Drawing.Point(16, 126); + this.lblCommandLine.Name = "lblCommandLine"; + this.lblCommandLine.Size = new System.Drawing.Size(76, 13); + this.lblCommandLine.TabIndex = 10; + this.lblCommandLine.Text = "&Command line:"; + // + // lblWindowClassName + // + this.lblWindowClassName.AutoSize = true; + this.lblWindowClassName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblWindowClassName.Location = new System.Drawing.Point(16, 74); + this.lblWindowClassName.Name = "lblWindowClassName"; + this.lblWindowClassName.Size = new System.Drawing.Size(105, 13); + this.lblWindowClassName.TabIndex = 4; + this.lblWindowClassName.Text = "Window class &name:"; + // + // lblTemporaryDirectoryName + // + this.lblTemporaryDirectoryName.AutoSize = true; + this.lblTemporaryDirectoryName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTemporaryDirectoryName.Location = new System.Drawing.Point(16, 99); + this.lblTemporaryDirectoryName.Name = "lblTemporaryDirectoryName"; + this.lblTemporaryDirectoryName.Size = new System.Drawing.Size(132, 13); + this.lblTemporaryDirectoryName.TabIndex = 6; + this.lblTemporaryDirectoryName.Text = "&Temporary directory name:"; + // + // lblWindowMessage + // + this.lblWindowMessage.AutoSize = true; + this.lblWindowMessage.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblWindowMessage.Location = new System.Drawing.Point(53, 48); + this.lblWindowMessage.Name = "lblWindowMessage"; + this.lblWindowMessage.Size = new System.Drawing.Size(94, 13); + this.lblWindowMessage.TabIndex = 2; + this.lblWindowMessage.Text = "&Window message:"; + // + // txtWindowTitle + // + this.txtWindowTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtWindowTitle.Location = new System.Drawing.Point(154, 19); + this.txtWindowTitle.Name = "txtWindowTitle"; + this.txtWindowTitle.Size = new System.Drawing.Size(319, 20); + this.txtWindowTitle.TabIndex = 1; + this.txtWindowTitle.Text = "Your Application Name Setup"; + this.txtWindowTitle.Validated += new System.EventHandler(this.txtWindowTitle_Validated); + // + // lblWindowTitle + // + this.lblWindowTitle.AutoSize = true; + this.lblWindowTitle.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblWindowTitle.Location = new System.Drawing.Point(53, 22); + this.lblWindowTitle.Name = "lblWindowTitle"; + this.lblWindowTitle.Size = new System.Drawing.Size(68, 13); + this.lblWindowTitle.TabIndex = 0; + this.lblWindowTitle.Text = "Window &title:"; + // + // fraFiles + // + this.fraFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraFiles.Controls.Add(this.cmdFilesClear); + this.fraFiles.Controls.Add(this.cmdFilesRemove); + this.fraFiles.Controls.Add(this.cmdFilesModify); + this.fraFiles.Controls.Add(this.cmdFilesAdd); + this.fraFiles.Controls.Add(this.lvFiles); + this.fraFiles.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraFiles.Location = new System.Drawing.Point(4, 246); + this.fraFiles.Name = "fraFiles"; + this.fraFiles.Size = new System.Drawing.Size(473, 143); + this.fraFiles.TabIndex = 4; + this.fraFiles.TabStop = false; + this.fraFiles.Text = "Files"; + // + // cmdFilesClear + // + this.cmdFilesClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdFilesClear.Enabled = false; + this.cmdFilesClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFilesClear.Location = new System.Drawing.Point(392, 19); + this.cmdFilesClear.Name = "cmdFilesClear"; + this.cmdFilesClear.Size = new System.Drawing.Size(75, 23); + this.cmdFilesClear.TabIndex = 3; + this.cmdFilesClear.Text = "Cl&ear"; + this.cmdFilesClear.UseVisualStyleBackColor = true; + this.cmdFilesClear.Click += new System.EventHandler(this.cmdFilesClear_Click); + // + // cmdFilesRemove + // + this.cmdFilesRemove.Enabled = false; + this.cmdFilesRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFilesRemove.Location = new System.Drawing.Point(168, 19); + this.cmdFilesRemove.Name = "cmdFilesRemove"; + this.cmdFilesRemove.Size = new System.Drawing.Size(75, 23); + this.cmdFilesRemove.TabIndex = 2; + this.cmdFilesRemove.Text = "&Remove"; + this.cmdFilesRemove.UseVisualStyleBackColor = true; + this.cmdFilesRemove.Click += new System.EventHandler(this.cmdFilesRemove_Click); + // + // cmdFilesModify + // + this.cmdFilesModify.Enabled = false; + this.cmdFilesModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFilesModify.Location = new System.Drawing.Point(87, 19); + this.cmdFilesModify.Name = "cmdFilesModify"; + this.cmdFilesModify.Size = new System.Drawing.Size(75, 23); + this.cmdFilesModify.TabIndex = 1; + this.cmdFilesModify.Text = "Mo&dify..."; + this.cmdFilesModify.UseVisualStyleBackColor = true; + this.cmdFilesModify.Click += new System.EventHandler(this.cmdFilesModify_Click); + // + // cmdFilesAdd + // + this.cmdFilesAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFilesAdd.Location = new System.Drawing.Point(6, 19); + this.cmdFilesAdd.Name = "cmdFilesAdd"; + this.cmdFilesAdd.Size = new System.Drawing.Size(75, 23); + this.cmdFilesAdd.TabIndex = 0; + this.cmdFilesAdd.Text = "&Add..."; + this.cmdFilesAdd.UseVisualStyleBackColor = true; + this.cmdFilesAdd.Click += new System.EventHandler(this.cmdFilesAdd_Click); + // + // lvFiles + // + this.lvFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chSource, + this.chDestination}); + this.lvFiles.HideSelection = false; + this.lvFiles.Location = new System.Drawing.Point(6, 48); + this.lvFiles.Name = "lvFiles"; + this.lvFiles.Size = new System.Drawing.Size(461, 89); + this.lvFiles.TabIndex = 4; + this.lvFiles.UseCompatibleStateImageBehavior = false; + this.lvFiles.View = System.Windows.Forms.View.Details; + this.lvFiles.ItemActivate += new System.EventHandler(this.lvFiles_ItemActivate); + this.lvFiles.SelectedIndexChanged += new System.EventHandler(this.lvFiles_SelectedIndexChanged); + // + // chSource + // + this.chSource.Text = "Source"; + this.chSource.Width = 166; + // + // chDestination + // + this.chDestination.Text = "Destination"; + this.chDestination.Width = 287; + // + // lblOperatingSystem + // + this.lblOperatingSystem.AutoSize = true; + this.lblOperatingSystem.Location = new System.Drawing.Point(7, 8); + this.lblOperatingSystem.Name = "lblOperatingSystem"; + this.lblOperatingSystem.Size = new System.Drawing.Size(91, 13); + this.lblOperatingSystem.TabIndex = 0; + this.lblOperatingSystem.Text = "&Operating system:"; + // + // cboOperatingSystem + // + this.cboOperatingSystem.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboOperatingSystem.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboOperatingSystem.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboOperatingSystem.FormattingEnabled = true; + this.cboOperatingSystem.Items.AddRange(new object[] { + "(Platform-Independent)", + "Windows 95", + "NT Intel"}); + this.cboOperatingSystem.Location = new System.Drawing.Point(104, 5); + this.cboOperatingSystem.Name = "cboOperatingSystem"; + this.cboOperatingSystem.Size = new System.Drawing.Size(298, 21); + this.cboOperatingSystem.TabIndex = 1; + this.cboOperatingSystem.SelectedIndexChanged += new System.EventHandler(this.cboOperatingSystem_SelectedIndexChanged); + // + // cmdManageOperatingSystems + // + this.cmdManageOperatingSystems.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdManageOperatingSystems.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdManageOperatingSystems.Location = new System.Drawing.Point(408, 3); + this.cmdManageOperatingSystems.Name = "cmdManageOperatingSystems"; + this.cmdManageOperatingSystems.Size = new System.Drawing.Size(75, 23); + this.cmdManageOperatingSystems.TabIndex = 2; + this.cmdManageOperatingSystems.Text = "Ma&nage..."; + this.cmdManageOperatingSystems.UseVisualStyleBackColor = true; + this.cmdManageOperatingSystems.Click += new System.EventHandler(this.cmdManageOperatingSystems_Click); + // + // BootstrapScriptEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmdManageOperatingSystems); + this.Controls.Add(this.cboOperatingSystem); + this.Controls.Add(this.lblOperatingSystem); + this.Controls.Add(this.fraFiles); + this.Controls.Add(this.fraGeneral); + this.MinimumSize = new System.Drawing.Size(486, 392); + this.Name = "BootstrapScriptEditor"; + this.Size = new System.Drawing.Size(486, 392); + this.fraGeneral.ResumeLayout(false); + this.fraGeneral.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtTemporaryDirectorySize)).EndInit(); + this.fraFiles.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraGeneral; + private System.Windows.Forms.TextBox txtWindowTitle; + private System.Windows.Forms.Label lblWindowTitle; + private System.Windows.Forms.TextBox txtWindowMessage; + private System.Windows.Forms.Label lblWindowMessage; + private System.Windows.Forms.NumericUpDown txtTemporaryDirectorySize; + private System.Windows.Forms.TextBox txtTemporaryDirectoryName; + private System.Windows.Forms.Label lblTemporaryDirectorySize; + private System.Windows.Forms.Label lblTemporaryDirectoryName; + private System.Windows.Forms.TextBox txtCommandLine; + private System.Windows.Forms.Label lblCommandLine; + private System.Windows.Forms.TextBox txtWindowClassName; + private System.Windows.Forms.Label lblWindowClassName; + private System.Windows.Forms.CheckBox chkRequire31; + private System.Windows.Forms.TextBox txtRequire31; + private System.Windows.Forms.Label lblRequire31; + private System.Windows.Forms.GroupBox fraFiles; + private System.Windows.Forms.ListView lvFiles; + private System.Windows.Forms.ColumnHeader chSource; + private System.Windows.Forms.ColumnHeader chDestination; + private System.Windows.Forms.Button cmdFilesClear; + private System.Windows.Forms.Button cmdFilesRemove; + private System.Windows.Forms.Button cmdFilesModify; + private System.Windows.Forms.Button cmdFilesAdd; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label lblOperatingSystem; + private System.Windows.Forms.ComboBox cboOperatingSystem; + private System.Windows.Forms.Button cmdManageOperatingSystems; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.cs new file mode 100644 index 00000000..77274d47 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Setup.Microsoft.ACME.BootstrapScript; +using UniversalEditor.Dialogs.Setup.Microsoft.ACME.BootstrapScript; + +namespace UniversalEditor.Editors.Setup.Microsoft.ACME.BootstrapScript +{ + public partial class BootstrapScriptEditor : Editor + { + public BootstrapScriptEditor() + { + InitializeComponent(); + cboOperatingSystem.SelectedIndex = 0; + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Bootstrap Script Editor"; + _er.SupportedObjectModels.Add(typeof(BootstrapScriptObjectModel)); + } + return _er; + } + + private void chkRequire31_CheckedChanged(object sender, EventArgs e) + { + txtRequire31.ReadOnly = !chkRequire31.Checked; + lblRequire31.Enabled = chkRequire31.Checked; + + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.Require31Enabled = chkRequire31.Checked; + } + EndEdit(); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) script = new BootstrapScriptObjectModel(); + + cboOperatingSystem.Items.Clear(); + foreach (BootstrapOperatingSystem item in script.OperatingSystems) + { + cboOperatingSystem.Items.Add(item); + } + if (cboOperatingSystem.Items.Count > 0) + { + cboOperatingSystem.SelectedIndex = 0; + } + } + + private void txtWindowTitle_TextChanged(object sender, EventArgs e) + { + + } + + private void txtWindowMessage_TextChanged(object sender, EventArgs e) + { + + } + + private void txtWindowTitle_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.WindowTitle = txtWindowTitle.Text; + } + EndEdit(); + } + + private void txtWindowMessage_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.WindowMessage = txtWindowMessage.Text; + } + EndEdit(); + } + + private void txtWindowClassName_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.WindowClassName = txtWindowClassName.Text; + } + EndEdit(); + } + + private void txtTemporaryDirectoryName_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.TemporaryDirectoryName = txtTemporaryDirectoryName.Text; + } + EndEdit(); + } + + private void txtTemporaryDirectorySize_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.TemporaryDirectorySize = (int)txtTemporaryDirectorySize.Value; + } + EndEdit(); + } + + private void txtCommandLine_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.CommandLine = txtCommandLine.Text; + } + EndEdit(); + } + + private void txtRequire31_Validated(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + BeginEdit(); + + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.Require31Message = txtRequire31.Text; + } + + EndEdit(); + } + + private void cmdFilesAdd_Click(object sender, EventArgs e) + { + BootstrapFilePropertiesDialog dlg = new BootstrapFilePropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + ListViewItem lvi = new ListViewItem(); + BootstrapFile file = new BootstrapFile(); + file.SourceFileName = dlg.SourceFileName; + file.DestinationFileName = dlg.DestinationFileName; + + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + BeginEdit(); + + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.Files.Add(file); + } + + EndEdit(); + + lvi.Tag = file; + lvi.Text = file.SourceFileName; + lvi.SubItems.Add(file.DestinationFileName); + lvFiles.Items.Add(lvi); + + RefreshButtons(); + } + } + + private void cmdFilesModify_Click(object sender, EventArgs e) + { + if (lvFiles.SelectedItems.Count == 1) + { + BootstrapFile file = (lvFiles.SelectedItems[0].Tag as BootstrapFile); + + BootstrapFilePropertiesDialog dlg = new BootstrapFilePropertiesDialog(); + dlg.SourceFileName = file.SourceFileName; + dlg.DestinationFileName = file.DestinationFileName; + + if (dlg.ShowDialog() == DialogResult.OK) + { + file.SourceFileName = dlg.SourceFileName; + file.DestinationFileName = dlg.DestinationFileName; + + lvFiles.SelectedItems[0].Text = file.SourceFileName; + lvFiles.SelectedItems[0].SubItems[1].Text = file.DestinationFileName; + } + } + } + + private void cmdFilesRemove_Click(object sender, EventArgs e) + { + if (lvFiles.SelectedItems.Count > 0) + { + if (MessageBox.Show("Are you sure you want to remove the selected files from the list?", "Remove Files", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + BeginEdit(); + + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + foreach (ListViewItem lvi in lvFiles.SelectedItems) + { + item.Files.Remove(lvi.Tag as BootstrapFile); + } + } + EndEdit(); + + while (lvFiles.SelectedItems.Count > 0) + { + lvFiles.SelectedItems[0].Remove(); + } + RefreshButtons(); + } + } + + private void RefreshButtons() + { + cmdFilesModify.Enabled = (lvFiles.SelectedItems.Count == 1); + cmdFilesRemove.Enabled = (lvFiles.SelectedItems.Count > 0); + cmdFilesClear.Enabled = (lvFiles.Items.Count > 0); + } + + private void cmdFilesClear_Click(object sender, EventArgs e) + { + lvFiles.Items.Clear(); + + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + BeginEdit(); + + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + item.Files.Clear(); + } + + EndEdit(); + } + + private void lvFiles_ItemActivate(object sender, EventArgs e) + { + cmdFilesModify_Click(sender, e); + } + + private void lvFiles_SelectedIndexChanged(object sender, EventArgs e) + { + RefreshButtons(); + } + + private void cmdManageOperatingSystems_Click(object sender, EventArgs e) + { + BootstrapScriptObjectModel script = (ObjectModel as BootstrapScriptObjectModel); + if (script == null) return; + + ManageOperatingSystemsDialog dlg = new ManageOperatingSystemsDialog(); + foreach (BootstrapOperatingSystem item in script.OperatingSystems) + { + dlg.OperatingSystems.Add(item); + } + if (dlg.ShowDialog() == DialogResult.OK) + { + script.OperatingSystems.Clear(); + cboOperatingSystem.Items.Clear(); + foreach (BootstrapOperatingSystem item in dlg.OperatingSystems) + { + script.OperatingSystems.Add(item); + + if (item.Enabled) cboOperatingSystem.Items.Add(item); + } + if (cboOperatingSystem.SelectedIndex == -1 && cboOperatingSystem.Items.Count > 0) cboOperatingSystem.SelectedIndex = 0; + } + } + + private void cboOperatingSystem_SelectedIndexChanged(object sender, EventArgs e) + { + BootstrapOperatingSystem item = (cboOperatingSystem.SelectedItem as BootstrapOperatingSystem); + if (item != null) + { + txtWindowTitle.Text = item.WindowTitle; + txtWindowMessage.Text = item.WindowMessage; + txtTemporaryDirectorySize.Value = item.TemporaryDirectorySize; + txtTemporaryDirectoryName.Text = item.TemporaryDirectoryName; + txtCommandLine.Text = item.CommandLine; + txtWindowClassName.Text = item.WindowClassName; + + chkRequire31.Checked = item.Require31Enabled; + txtRequire31.ReadOnly = !item.Require31Enabled; + txtRequire31.Text = item.Require31Message; + lblRequire31.Enabled = item.Require31Enabled; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Editors/Setup/Microsoft/ACME/BootstrapScript/BootstrapScriptEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..096ee5bf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UniversalEditor.Plugins.Microsoft.SoftwareInstallation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UniversalEditor.Plugins.Microsoft.SoftwareInstallation")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("13897d55-f7da-4922-9cdb-bcf8b5efa804")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.Designer.cs new file mode 100644 index 00000000..5ecadb7f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34014 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap setup { + get { + object obj = ResourceManager.GetObject("setup", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.resx new file mode 100644 index 00000000..6924b756 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\setup.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Resources/setup.ico b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Microsoft.SoftwareInstallation.UserInterface.WindowsForms/Resources/setup.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a643f8583fabe6c5b56ce5c0270919f9ad9812a GIT binary patch literal 766 zcmaiyu};G<5QeX`QoNOkwH zO^(azeWtgX`gl$*aKLn@wIm57L@&BFd4p;4N!NOME9H{Zp_@f(#ibOvGo<8CtyM + + + + Debug + AnyCPU + {B6F4A892-3701-445D-A7E9-B5D5C07FEF2D} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.Microsoft.Setup.UserInterface.WindowsForms + v3.5 + 512 + + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + Form + + + BootstrapFilePropertiesDialog.cs + + + Form + + + ManageOperatingSystemsDialog.cs + + + Form + + + OperatingSystemPropertiesDialog.cs + + + UserControl + + + BootstrapScriptEditor.cs + + + + True + True + Resources.resx + + + + + {05127997-B7F3-4802-8021-06C048C8FE63} + UniversalEditor.Plugins.Microsoft.Setup + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + + + BootstrapFilePropertiesDialog.cs + + + ManageOperatingSystemsDialog.cs + + + OperatingSystemPropertiesDialog.cs + + + BootstrapScriptEditor.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/ExtensionMethods.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/ExtensionMethods.cs new file mode 100644 index 00000000..238d95ad --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/ExtensionMethods.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor +{ + public static class ExtensionMethods + { + public static System.Drawing.Bitmap ToBitmap(this PictureObjectModel pic, bool useCompatibilityMode = true) + { + +#if UE_PLUGIN_MM_PICTURE_COMPATIBILITY_SUPPORTED + if (useCompatibilityMode) + { + if (pic.Accessor is Accessors.File.FileAccessor) + { + string filename = (pic.Accessor as Accessors.File.FileAccessor).FileName; + if (filename.EndsWith(".bmp") || filename.EndsWith(".png") || filename.EndsWith(".gif")) + { + System.Drawing.Bitmap bmp = (System.Drawing.Image.FromFile(filename) as System.Drawing.Bitmap); + if (bmp != null) return bmp; + } + } + } +#endif + + // THIS WORKS - DO NOT TOUCH + // IF YOU WANT PROOF, USE THE SAMPLE PROGRAM IN THE BLOCK COMMENT BELOW: + /* + PictureObjectModel pic1 = new PictureObjectModel(4, 4); + pic1.SetPixel(System.Drawing.Color.Red); + pic1.SetPixel(System.Drawing.Color.Green); + pic1.SetPixel(System.Drawing.Color.Blue); + pic1.SetPixel(System.Drawing.Color.Yellow); + + pic1.SetPixel(System.Drawing.Color.Green); + pic1.SetPixel(System.Drawing.Color.Blue); + pic1.SetPixel(System.Drawing.Color.Yellow); + pic1.SetPixel(System.Drawing.Color.Red); + + pic1.SetPixel(System.Drawing.Color.Blue); + pic1.SetPixel(System.Drawing.Color.Yellow); + pic1.SetPixel(System.Drawing.Color.Green); + pic1.SetPixel(System.Drawing.Color.Red); + + pic1.SetPixel(System.Drawing.Color.Blue); + pic1.SetPixel(System.Drawing.Color.Green); + pic1.SetPixel(System.Drawing.Color.Yellow); + pic1.SetPixel(System.Drawing.Color.Red); + pic1.ToBitmap().Save(@"C:\Temp\test1.bmp", System.Drawing.Imaging.ImageFormat.Bmp); + */ + + byte[] imageByteArray = pic.ToByteArray(); + // System.IO.File.WriteAllBytes(@"G:\Applications\Concertroid\bin\Debug\Models\NightcorePrincess\rose_foxtail\test.data", imageByteArray); + + //************** NOTE ******************* + // The memory allocated for Microsoft Bitmaps must be aligned on a 32bit boundary. + // The stride refers to the number of bytes allocated for one scanline of the bitmap. + // In your loop, you copy the pixels one scanline at a time and take into + // consideration the amount of padding that occurs due to memory alignment. + // calculate the stride, in bytes, of the image (32bit aligned width of each image row) + int pixelDepth = 32; + int stride = (((pic.Width * pixelDepth) + 7) / 8); // width in bytes + int padding = 0; + + byte[] newImageByteArray = new byte[imageByteArray.Length + padding]; + Array.Copy(imageByteArray, 0, newImageByteArray, 0, imageByteArray.Length); + + // since the Bitmap constructor requires a pointer to an array of image bytes + // we have to pin down the memory used by the byte array and use the pointer + // of this pinned memory to create the Bitmap. + // This tells the Garbage Collector to leave the memory alone and DO NOT touch it. + System.Runtime.InteropServices.GCHandle imageByteGCHandle = System.Runtime.InteropServices.GCHandle.Alloc(newImageByteArray, System.Runtime.InteropServices.GCHandleType.Pinned); + + IntPtr imageByteHandle = imageByteGCHandle.AddrOfPinnedObject(); + + // Bitmap construction and translation to System.Drawing.Bitmap are handled + // DataFormat-agnostically by the ObjectModel. This code was adapted from the + // reference code for the TrueVisionTGADataFormat but the parameters are different... + System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(pic.Width, pic.Height, stride, System.Drawing.Imaging.PixelFormat.Format32bppArgb, imageByteHandle); + + return bitmap; + } + public static System.Drawing.Color ToGdiColor(this Color color) + { + return System.Drawing.Color.FromArgb((byte)(color.Alpha * 255), (byte)(color.Red * 255), (byte)(color.Green * 255), (byte)(color.Blue * 255)); + } + public static Color ToUniversalColor(this System.Drawing.Color color) + { + return Color.FromRGBA(color.R, color.G, color.B, color.A); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c8a32ab1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GDI+ binder for Universal Editor")] +[assembly: AssemblyDescription("Provides the necessary extension methods to allow Universal Editor code to interoperate in a GDI+ environment.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cf50b7ba-86da-4342-b3d7-a3707690e083")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus.csproj new file mode 100644 index 00000000..f101628a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus/UniversalEditor.Plugins.Multimedia.Binders.GdiPlus.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33} + Library + Properties + UniversalEditor.Plugins.Multimedia.Binders.GdiPlus + UniversalEditor.Plugins.Multimedia.Binders.GdiPlus + v4.0 + 512 + 10.0.0 + 2.0 + + + + true + full + false + ..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {BE4D0BA3-0888-42A5-9C09-FC308A4509D2} + UniversalEditor.Plugins.Multimedia + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.Designer.cs new file mode 100644 index 00000000..82423f51 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Controls.Multimedia.Audio.Synthesized.PianoRoll +{ + partial class PianoRollControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.cs new file mode 100644 index 00000000..235c29ec --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollControl.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Controls.Multimedia.Audio.Synthesized.PianoRoll +{ + public partial class PianoRollControl : UserControl + { + public PianoRollControl() + { + InitializeComponent(); + } + + private Size mvarGridSize = new Size(128, 16); + public Size GridSize { get { return mvarGridSize; } set { mvarGridSize = value; } } + + private Size mvarQuantizationSize = new Size(16, 16); + public Size QuantizationSize { get { return mvarQuantizationSize; } set { mvarQuantizationSize = value; } } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollTool.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollTool.cs new file mode 100644 index 00000000..62d3979e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRoll/PianoRollTool.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Controls.Multimedia.Audio.Synthesized.PianoRoll +{ + public enum PianoRollTool + { + Select, + Draw, + Erase + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.Designer.cs new file mode 100644 index 00000000..33f3bc8e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.Designer.cs @@ -0,0 +1,111 @@ +namespace UniversalEditor.Controls.Multimedia.Audio.Synthesized +{ + partial class PianoRollEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.mnuContext = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextSelect = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextDraw = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextErase = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContext.SuspendLayout(); + this.SuspendLayout(); + // + // mnuContext + // + this.mnuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextSelect, + this.mnuContextDraw, + this.mnuContextErase, + this.mnuContextSep1, + this.mnuContextProperties}); + this.mnuContext.Name = "mnuContext"; + this.mnuContext.Size = new System.Drawing.Size(153, 120); + this.mnuContext.Opening += new System.ComponentModel.CancelEventHandler(this.mnuContext_Opening); + // + // mnuContextSelect + // + this.mnuContextSelect.Name = "mnuContextSelect"; + this.mnuContextSelect.Size = new System.Drawing.Size(152, 22); + this.mnuContextSelect.Text = "&Select"; + this.mnuContextSelect.Click += new System.EventHandler(this.mnuContextSelect_Click); + // + // mnuContextDraw + // + this.mnuContextDraw.Checked = true; + this.mnuContextDraw.CheckState = System.Windows.Forms.CheckState.Checked; + this.mnuContextDraw.Name = "mnuContextDraw"; + this.mnuContextDraw.Size = new System.Drawing.Size(152, 22); + this.mnuContextDraw.Text = "&Draw"; + this.mnuContextDraw.Click += new System.EventHandler(this.mnuContextDraw_Click); + // + // mnuContextErase + // + this.mnuContextErase.Name = "mnuContextErase"; + this.mnuContextErase.Size = new System.Drawing.Size(152, 22); + this.mnuContextErase.Text = "&Erase"; + this.mnuContextErase.Click += new System.EventHandler(this.mnuContextErase_Click); + // + // mnuContextSep1 + // + this.mnuContextSep1.Name = "mnuContextSep1"; + this.mnuContextSep1.Size = new System.Drawing.Size(149, 6); + // + // mnuContextProperties + // + this.mnuContextProperties.Enabled = false; + this.mnuContextProperties.Name = "mnuContextProperties"; + this.mnuContextProperties.Size = new System.Drawing.Size(152, 22); + this.mnuContextProperties.Text = "P&roperties..."; + // + // PianoRollEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.ContextMenuStrip = this.mnuContext; + this.ForeColor = System.Drawing.SystemColors.WindowText; + this.Name = "PianoRollEditor"; + this.Size = new System.Drawing.Size(574, 347); + this.mnuContext.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private AwesomeControls.CommandBars.CBContextMenu mnuContext; + private System.Windows.Forms.ToolStripMenuItem mnuContextSelect; + private System.Windows.Forms.ToolStripMenuItem mnuContextDraw; + private System.Windows.Forms.ToolStripMenuItem mnuContextErase; + private System.Windows.Forms.ToolStripSeparator mnuContextSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextProperties; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.cs new file mode 100644 index 00000000..473a33bf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.Controls.Multimedia.Audio.Synthesized +{ + public partial class PianoRollEditor : Editor + { + public PianoRollEditor() + { + InitializeComponent(); + + base.SupportedObjectModels.Add(typeof(SynthesizedAudioObjectModel)); + base.DoubleBuffered = true; + } + + private int mvarGridSpacingX = 4; + public int GridSpacingX { get { return mvarGridSpacingX; } set { mvarGridSpacingX = value; } } + private int mvarGridSpacingY = 4; + public int GridSpacingY { get { return mvarGridSpacingY; } set { mvarGridSpacingY = value; } } + + private PianoRollEditorTool mvarCurrentTool = PianoRollEditorTool.Draw; + public PianoRollEditorTool CurrentTool + { + get { return mvarCurrentTool; } + set + { + mvarCurrentTool = value; + switch (mvarCurrentTool) + { + case PianoRollEditorTool.Draw: + { + Cursor = MyCursors.Pen; + break; + } + case PianoRollEditorTool.Select: + { + Cursor = Cursors.IBeam; + break; + } + case PianoRollEditorTool.Erase: + { + Cursor = MyCursors.Eraser; + break; + } + } + } + } + + private SynthesizedAudioTrack mvarCurrentTrack = null; + public SynthesizedAudioTrack CurrentTrack { get { return mvarCurrentTrack; } set { mvarCurrentTrack = value; Refresh(); } } + + private SynthesizedAudioCommand mvarSelectedCommand = null; + public SynthesizedAudioCommand SelectedCommand { get { return mvarSelectedCommand; } set { mvarSelectedCommand = value; Refresh(); } } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + SynthesizedAudioObjectModel audio = (ObjectModel as SynthesizedAudioObjectModel); + if (audio == null) return; + if (audio.Tracks.Count < 1) return; + + mvarCurrentTrack = audio.Tracks[0]; + Refresh(); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + } + + private void mnuContext_Opening(object sender, CancelEventArgs e) + { + mnuContextProperties.Enabled = (mvarSelectedCommand != null); + } + + private void mnuContextSelect_Click(object sender, EventArgs e) + { + CurrentTool = PianoRollEditorTool.Select; + } + + private void mnuContextDraw_Click(object sender, EventArgs e) + { + CurrentTool = PianoRollEditorTool.Draw; + } + + private void mnuContextErase_Click(object sender, EventArgs e) + { + CurrentTool = PianoRollEditorTool.Erase; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.resx new file mode 100644 index 00000000..7a8a1901 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9, 5 + + + 40 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditorTool.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditorTool.cs new file mode 100644 index 00000000..e3cfa845 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Synthesized/PianoRollEditorTool.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Controls.Multimedia.Audio.Synthesized +{ + public enum PianoRollEditorTool + { + Select, + Draw, + Erase + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/Track.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/Track.cs new file mode 100644 index 00000000..16aee675 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/Track.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; + +namespace UniversalEditor.Controls.Multimedia.Audio.Waveform.WaveformTrackList +{ + public class Track + { + public class TrackCollection + : System.Collections.ObjectModel.Collection + { + public Track Add(string title, WaveformAudioObjectModel waveform) + { + Track track = new Track(); + track.Title = title; + track.Waveform = waveform; + Add(track); + return track; + } + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private WaveformAudioObjectModel mvarWaveform = null; + public WaveformAudioObjectModel Waveform { get { return mvarWaveform; } set { mvarWaveform = value; } } + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/TrackChannel.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/TrackChannel.cs new file mode 100644 index 00000000..dfc65f05 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/TrackChannel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Controls.Multimedia.Audio.Waveform.WaveformTrackList +{ + public class TrackChannel + { + public class TrackChannelCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.Designer.cs new file mode 100644 index 00000000..e9c32850 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.Designer.cs @@ -0,0 +1,46 @@ +namespace UniversalEditor.Controls.Multimedia.Audio.Waveform.WaveformTrackList +{ + partial class WaveformTrackListControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // WaveformListControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.AppWorkspace; + this.Name = "WaveformListControl"; + this.Size = new System.Drawing.Size(575, 332); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.cs new file mode 100644 index 00000000..1b54d2e0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Controls.Multimedia.Audio.Waveform.WaveformTrackList +{ + public partial class WaveformTrackListControl : UserControl + { + public WaveformTrackListControl() + { + InitializeComponent(); + } + + private class DrawingTools + { + public static class Pens + { + private static Pen _TrackHighlightPen = new Pen(System.Drawing.Color.FromKnownColor(KnownColor.Highlight), 3); + public static Pen TrackHighlightPen { get { return _TrackHighlightPen; } } + } + public static class Brushes + { + private static SolidBrush _TrackBackgroundBrush = new SolidBrush(System.Drawing.Color.FromKnownColor(KnownColor.Control)); + public static SolidBrush TrackBackgroundBrush { get { return _TrackBackgroundBrush; } } + } + } + + private int mvarTrackHeight = 152; + public int TrackHeight { get { return mvarTrackHeight; } } + + private int mvarTrackSpacing = 5; + public int TrackSpacing { get { return mvarTrackSpacing; } } + + private Track.TrackCollection mvarTracks = new Track.TrackCollection(); + public Track.TrackCollection Tracks { get { return mvarTracks; } } + + private Track mvarFocusedTrack = null; + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + int x = 0, y = 0, w = base.Width, h = mvarTrackHeight; + + foreach (Track track in mvarTracks) + { + Rectangle rect = new Rectangle(x, y, w, h); + if (track == mvarFocusedTrack) + { + e.Graphics.DrawRectangle(DrawingTools.Pens.TrackHighlightPen, rect); + } + + rect.Width -= 5; + rect.X += 132; + + rect.Height = mvarTrackHeight + (mvarTrackSpacing * (track.Waveform.Header.ChannelCount - 1)); + int offsetX = 0; + int k = 0; + int zoom = 200; + for (int i = 0; i < track.Waveform.Header.ChannelCount; i++) + { + e.Graphics.FillRectangle(DrawingTools.Brushes.TrackBackgroundBrush, rect); + + List points = new List(); + for (int j = offsetX; j < track.Waveform.RawSamples.Length / track.Waveform.Header.ChannelCount; j += zoom) + { + int z = track.Waveform.RawSamples[j]; + z = (128 - z) + (rect.Bottom / 2); + + points.Add(new Point(rect.X + k, z)); + k += 5; + } + e.Graphics.DrawPolygon(Pens.Blue, points.ToArray()); + } + } + } + } + +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Audio/Waveform/WaveformTrackList/WaveformTrackListControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.Designer.cs new file mode 100644 index 00000000..f81110f0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.Designer.cs @@ -0,0 +1,47 @@ +namespace UniversalEditor.Controls.Multimedia.Palette +{ + partial class ColorListControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ColorListControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Name = "ColorListControl"; + this.Size = new System.Drawing.Size(368, 192); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.cs new file mode 100644 index 00000000..9730d454 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Multimedia.Palette; + +namespace UniversalEditor.Controls.Multimedia.Palette +{ + [DefaultEvent("SelectionChanged")] + public partial class ColorListControl : UserControl + { + public ColorListControl() + { + InitializeComponent(); + } + + private int mvarTileWidth = 32; + public int TileWidth { get { return mvarTileWidth; } set { mvarTileWidth = value; } } + + private int mvarTileHeight = 32; + public int TileHeight { get { return mvarTileHeight; } set { mvarTileHeight = value; } } + + private PaletteEntry.PaletteEntryCollection mvarEntries = new PaletteEntry.PaletteEntryCollection(); + public PaletteEntry.PaletteEntryCollection Entries { get { return mvarEntries; } } + + public Rectangle GetEntryBounds(PaletteEntry entry) + { + Rectangle rect = new Rectangle(0, 0, mvarTileWidth, mvarTileHeight); + foreach (PaletteEntry color in mvarEntries) + { + if (color == entry) break; + + rect.X += mvarTileWidth; + if (rect.Right >= this.Width) + { + rect.Y += mvarTileHeight; + rect.X = 0; + } + } + return rect; + } + + public PaletteEntry SelectedColor + { + get + { + if (mvarSelectedIndex > -1 && mvarSelectedIndex < mvarEntries.Count) + { + return mvarEntries[mvarSelectedIndex]; + } + return null; + } + set + { + if (!mvarEntries.Contains(value)) return; + + Rectangle prevRect = GetEntryBounds(mvarEntries[mvarSelectedIndex]); + mvarSelectedIndex = mvarEntries.IndexOf(value); + Rectangle rect = GetEntryBounds(mvarEntries[mvarSelectedIndex]); + + prevRect.X -= 2; + prevRect.Y -= 2; + prevRect.Width += 4; + prevRect.Height += 4; + + Invalidate(prevRect); + Invalidate(rect); + + OnSelectionChanged(EventArgs.Empty); + } + } + + public event EventHandler SelectionChanged; + protected virtual void OnSelectionChanged(EventArgs e) + { + if (SelectionChanged != null) SelectionChanged(this, e); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Rectangle rect = new Rectangle(0, 0, mvarTileWidth, mvarTileHeight); + foreach (PaletteEntry color in mvarEntries) + { + SolidBrush brush = new SolidBrush(color.Color.ToGdiColor()); + e.Graphics.FillRectangle(brush, rect); + e.Graphics.DrawRectangle(Pens.Black, rect); + + if (mvarSelectedIndex == mvarEntries.IndexOf(color)) + { + e.Graphics.DrawRectangle(new Pen(System.Drawing.Color.FromKnownColor(KnownColor.Highlight), 2), rect); + } + + rect.X += mvarTileWidth; + if (rect.Right >= this.Width) + { + rect.Y += mvarTileHeight; + rect.X = 0; + } + } + } + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + Refresh(); + } + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + if (e.Button == System.Windows.Forms.MouseButtons.Left) + { + PaletteEntry color = HitTest(e.Location); + if (color != null && color != mvarEntries[mvarSelectedIndex]) + { + SelectedColor = color; + } + } + } + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + PaletteEntry color = HitTest(e.Location); + if (color != null && mvarEntries.Contains(color) && color != mvarEntries[mvarSelectedIndex]) + { + SelectedColor = color; + } + } + + private PaletteEntry HitTest(Point point) + { + Rectangle rect = new Rectangle(0, 0, mvarTileWidth, mvarTileHeight); + foreach (PaletteEntry entry in mvarEntries) + { + if (rect.Contains(point)) + { + return entry; + } + rect.X += mvarTileWidth; + if (rect.Right >= this.Width) + { + rect.Y += mvarTileHeight; + rect.X = 0; + } + } + return null; + } + + private int mvarSelectedIndex = 0; + public int SelectedIndex { get { return mvarSelectedIndex; } set { mvarSelectedIndex = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Controls/Multimedia/Palette/ColorListControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.Designer.cs new file mode 100644 index 00000000..d886f218 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.Designer.cs @@ -0,0 +1,419 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Dialogs.Multimedia.Audio +{ + partial class NoteExpressionProperty + { + private IContainer components = null; + private Label lblTemplate; + private ComboBox cboTemplate; + private GroupBox groupBox1; + private GroupBox groupBox2; + private Label label2; + private TextBox textBox1; + private TrackBar trackBar2; + private GroupBox fraBendDepth; + private TextBox txtBendDepth; + private Label label1; + private TrackBar trackBar1; + private GroupBox groupBox3; + private CheckBox checkBox1; + private CheckBox checkBox2; + private GroupBox groupBox4; + private GroupBox groupBox6; + private Label label3; + private TextBox textBox2; + private TrackBar trackBar3; + private GroupBox groupBox7; + private TextBox textBox3; + private Label label4; + private TrackBar trackBar4; + private Button cmdCancel; + private Button cmdOK; + + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + { + this.components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTemplate = new System.Windows.Forms.Label(); + this.cboTemplate = new System.Windows.Forms.ComboBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.trackBar2 = new System.Windows.Forms.TrackBar(); + this.fraBendDepth = new System.Windows.Forms.GroupBox(); + this.txtBendDepth = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.trackBar1 = new System.Windows.Forms.TrackBar(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.trackBar3 = new System.Windows.Forms.TrackBar(); + this.groupBox7 = new System.Windows.Forms.GroupBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.trackBar4 = new System.Windows.Forms.TrackBar(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit(); + this.fraBendDepth.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); + this.groupBox4.SuspendLayout(); + this.groupBox6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit(); + this.groupBox7.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar4)).BeginInit(); + this.SuspendLayout(); + // + // lblTemplate + // + this.lblTemplate.AutoSize = true; + this.lblTemplate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTemplate.Location = new System.Drawing.Point(12, 15); + this.lblTemplate.Name = "lblTemplate"; + this.lblTemplate.Size = new System.Drawing.Size(54, 13); + this.lblTemplate.TabIndex = 0; + this.lblTemplate.Text = "&Template:"; + // + // cboTemplate + // + this.cboTemplate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboTemplate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboTemplate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboTemplate.FormattingEnabled = true; + this.cboTemplate.Location = new System.Drawing.Point(72, 12); + this.cboTemplate.Name = "cboTemplate"; + this.cboTemplate.Size = new System.Drawing.Size(330, 21); + this.cboTemplate.TabIndex = 1; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.groupBox3); + this.groupBox1.Controls.Add(this.groupBox2); + this.groupBox1.Controls.Add(this.fraBendDepth); + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(12, 39); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(192, 261); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Pitch control"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.checkBox2); + this.groupBox3.Controls.Add(this.checkBox1); + this.groupBox3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox3.Location = new System.Drawing.Point(6, 186); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(180, 69); + this.groupBox3.TabIndex = 2; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Add portamento"; + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.checkBox2.Location = new System.Drawing.Point(18, 44); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(145, 18); + this.checkBox2.TabIndex = 1; + this.checkBox2.Text = "During &falling movement"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.checkBox1.Location = new System.Drawing.Point(18, 20); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(142, 18); + this.checkBox1.TabIndex = 0; + this.checkBox1.Text = "During &rising movement"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.textBox1); + this.groupBox2.Controls.Add(this.trackBar2); + this.groupBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox2.Location = new System.Drawing.Point(99, 19); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(87, 161); + this.groupBox2.TabIndex = 1; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Bend &length:"; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(71, 132); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(10, 17); + this.label2.TabIndex = 2; + this.label2.Text = "%"; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.Location = new System.Drawing.Point(14, 129); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(56, 20); + this.textBox1.TabIndex = 1; + this.textBox1.Text = "0"; + this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // trackBar2 + // + this.trackBar2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom))); + this.trackBar2.Location = new System.Drawing.Point(21, 19); + this.trackBar2.Maximum = 100; + this.trackBar2.Name = "trackBar2"; + this.trackBar2.Orientation = System.Windows.Forms.Orientation.Vertical; + this.trackBar2.Size = new System.Drawing.Size(45, 104); + this.trackBar2.TabIndex = 0; + this.trackBar2.TickFrequency = 10; + this.trackBar2.TickStyle = System.Windows.Forms.TickStyle.Both; + // + // fraBendDepth + // + this.fraBendDepth.Controls.Add(this.txtBendDepth); + this.fraBendDepth.Controls.Add(this.label1); + this.fraBendDepth.Controls.Add(this.trackBar1); + this.fraBendDepth.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraBendDepth.Location = new System.Drawing.Point(6, 19); + this.fraBendDepth.Name = "fraBendDepth"; + this.fraBendDepth.Size = new System.Drawing.Size(87, 161); + this.fraBendDepth.TabIndex = 0; + this.fraBendDepth.TabStop = false; + this.fraBendDepth.Text = "&Bend depth:"; + // + // txtBendDepth + // + this.txtBendDepth.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtBendDepth.Location = new System.Drawing.Point(14, 129); + this.txtBendDepth.Name = "txtBendDepth"; + this.txtBendDepth.Size = new System.Drawing.Size(56, 20); + this.txtBendDepth.TabIndex = 1; + this.txtBendDepth.Text = "8"; + this.txtBendDepth.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(71, 132); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(10, 17); + this.label1.TabIndex = 2; + this.label1.Text = "%"; + // + // trackBar1 + // + this.trackBar1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom))); + this.trackBar1.Location = new System.Drawing.Point(21, 19); + this.trackBar1.Maximum = 100; + this.trackBar1.Name = "trackBar1"; + this.trackBar1.Orientation = System.Windows.Forms.Orientation.Vertical; + this.trackBar1.Size = new System.Drawing.Size(45, 104); + this.trackBar1.TabIndex = 0; + this.trackBar1.TickFrequency = 10; + this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.Both; + this.trackBar1.Value = 8; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.groupBox6); + this.groupBox4.Controls.Add(this.groupBox7); + this.groupBox4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox4.Location = new System.Drawing.Point(210, 39); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(192, 261); + this.groupBox4.TabIndex = 3; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Dynamics control"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.label3); + this.groupBox6.Controls.Add(this.textBox2); + this.groupBox6.Controls.Add(this.trackBar3); + this.groupBox6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox6.Location = new System.Drawing.Point(99, 19); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(87, 161); + this.groupBox6.TabIndex = 1; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "&Accent:"; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(71, 132); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(10, 17); + this.label3.TabIndex = 2; + this.label3.Text = "%"; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(14, 129); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(56, 20); + this.textBox2.TabIndex = 1; + this.textBox2.Text = "50"; + this.textBox2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // trackBar3 + // + this.trackBar3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom))); + this.trackBar3.Location = new System.Drawing.Point(21, 19); + this.trackBar3.Maximum = 100; + this.trackBar3.Name = "trackBar3"; + this.trackBar3.Orientation = System.Windows.Forms.Orientation.Vertical; + this.trackBar3.Size = new System.Drawing.Size(45, 104); + this.trackBar3.TabIndex = 0; + this.trackBar3.TickFrequency = 10; + this.trackBar3.TickStyle = System.Windows.Forms.TickStyle.Both; + this.trackBar3.Value = 50; + // + // groupBox7 + // + this.groupBox7.Controls.Add(this.textBox3); + this.groupBox7.Controls.Add(this.label4); + this.groupBox7.Controls.Add(this.trackBar4); + this.groupBox7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox7.Location = new System.Drawing.Point(6, 19); + this.groupBox7.Name = "groupBox7"; + this.groupBox7.Size = new System.Drawing.Size(87, 161); + this.groupBox7.TabIndex = 0; + this.groupBox7.TabStop = false; + this.groupBox7.Text = "&Decay:"; + // + // textBox3 + // + this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox3.Location = new System.Drawing.Point(14, 129); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(56, 20); + this.textBox3.TabIndex = 1; + this.textBox3.Text = "50"; + this.textBox3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(71, 132); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(10, 17); + this.label4.TabIndex = 2; + this.label4.Text = "%"; + // + // trackBar4 + // + this.trackBar4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom))); + this.trackBar4.Location = new System.Drawing.Point(21, 19); + this.trackBar4.Maximum = 100; + this.trackBar4.Name = "trackBar4"; + this.trackBar4.Orientation = System.Windows.Forms.Orientation.Vertical; + this.trackBar4.Size = new System.Drawing.Size(45, 104); + this.trackBar4.TabIndex = 0; + this.trackBar4.TickFrequency = 10; + this.trackBar4.TickStyle = System.Windows.Forms.TickStyle.Both; + this.trackBar4.Value = 50; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(327, 310); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 5; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(246, 310); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 4; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // NoteExpressionProperty + // + this.AcceptButton = this.cmdOK; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(414, 345); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.cboTemplate); + this.Controls.Add(this.lblTemplate); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "NoteExpressionProperty"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Note Expression Properties"; + this.groupBox1.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit(); + this.fraBendDepth.ResumeLayout(false); + this.fraBendDepth.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); + this.groupBox4.ResumeLayout(false); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).EndInit(); + this.groupBox7.ResumeLayout(false); + this.groupBox7.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar4)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.cs new file mode 100644 index 00000000..1fc5fdf0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Audio +{ + public partial class NoteExpressionProperty : Form + { + public NoteExpressionProperty() + { + this.InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/NoteExpressionProperty.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.Designer.cs new file mode 100644 index 00000000..e8c59f80 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.Designer.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Audio +{ + partial class ProgressDialog : Form + { + private IContainer components = null; + internal ProgressBar pb2; + private Button cmdCancel; + private Label lblTrackProgress; + internal ProgressBar pb1; + private Label lblNoteProgress; + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + { + this.components.Dispose(); + } + base.Dispose(disposing); + } + private void InitializeComponent() + { + this.pb2 = new System.Windows.Forms.ProgressBar(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.lblTrackProgress = new System.Windows.Forms.Label(); + this.pb1 = new System.Windows.Forms.ProgressBar(); + this.lblNoteProgress = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // pb2 + // + this.pb2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pb2.Location = new System.Drawing.Point(12, 76); + this.pb2.Name = "pb2"; + this.pb2.Size = new System.Drawing.Size(264, 23); + this.pb2.TabIndex = 3; + // + // cmdCancel + // + this.cmdCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(111, 105); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 4; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // lblTrackProgress + // + this.lblTrackProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblTrackProgress.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblTrackProgress.Location = new System.Drawing.Point(12, 9); + this.lblTrackProgress.Name = "lblTrackProgress"; + this.lblTrackProgress.Size = new System.Drawing.Size(264, 13); + this.lblTrackProgress.TabIndex = 0; + this.lblTrackProgress.Text = "Synthesizing track 1 of 1..."; + // + // pb1 + // + this.pb1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pb1.Location = new System.Drawing.Point(12, 25); + this.pb1.Name = "pb1"; + this.pb1.Size = new System.Drawing.Size(264, 23); + this.pb1.TabIndex = 1; + // + // lblNoteProgress + // + this.lblNoteProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblNoteProgress.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblNoteProgress.Location = new System.Drawing.Point(12, 60); + this.lblNoteProgress.Name = "lblNoteProgress"; + this.lblNoteProgress.Size = new System.Drawing.Size(264, 13); + this.lblNoteProgress.TabIndex = 2; + this.lblNoteProgress.Text = "Synthesizing note 1 of 1..."; + // + // ProgressDialog + // + this.AcceptButton = this.cmdCancel; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(296, 144); + this.Controls.Add(this.lblNoteProgress); + this.Controls.Add(this.lblTrackProgress); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.pb1); + this.Controls.Add(this.pb2); + this.Font = new System.Drawing.Font("Tahoma", 8F); + this.MinimumSize = new System.Drawing.Size(304, 178); + this.Name = "ProgressDialog"; + this.ShowIcon = false; + this.Text = "Progress"; + this.ResumeLayout(false); + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.cs new file mode 100644 index 00000000..dde3bb24 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Audio +{ + public partial class ProgressDialog + { + public ProgressDialog() + { + this.InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/ProgressDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.Designer.cs new file mode 100644 index 00000000..3ac6b9da --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.Designer.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +namespace UniversalEditor.Dialogs.Multimedia.Audio.Synthesized.OptionPanels +{ + partial class SynthesizerPropertiesDialog : Form + { + private IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (this.components != null) + { + this.components.Dispose(); + } + } + base.Dispose(disposing); + } + private void InitializeComponent() + { + base.SuspendLayout(); + base.AutoScaleDimensions = new SizeF(6f, 13f); + base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + base.ClientSize = new Size(526, 295); + base.Name = "SynthesizerPropertiesDialog"; + this.Text = "SynthesizerPropertiesDialog"; + base.ResumeLayout(false); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.cs new file mode 100644 index 00000000..cf0a74a6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/Synthesized/OptionPanels/SynthesizerPropertiesDialog.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Audio.Synthesized.OptionPanels +{ + public partial class SynthesizerPropertiesDialog + { + public SynthesizerPropertiesDialog() + { + this.InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.Designer.cs new file mode 100644 index 00000000..2ffb6b35 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.Designer.cs @@ -0,0 +1,425 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Audio +{ + partial class VoicebankEditorDialog : Form + { + private IContainer components = null; + private GroupBox fraVoiceConfigurations; + private GroupBox fraDefaultParameters; + private Button cmdCancel; + private Button cmdOK; + private ListView listView1; + private ColumnHeader chName; + private Button cmdDelete; + private Button cmdCopy; + private Button cmdAdd; + private ComboBox cboOriginalVoicebank; + private Label label2; + private ComboBox cboSourceEngine; + private Label label1; + private GroupBox fraSynthaloidParameters; + private Label lblWaveType; + private GroupBox fraVOCALOIDParameters; + private Label label3; + private NumericUpDown numericUpDown3; + private Label label6; + private Label label5; + private NumericUpDown numericUpDown1; + private NumericUpDown numericUpDown5; + private NumericUpDown numericUpDown4; + private NumericUpDown numericUpDown2; + private Label label4; + private Label label7; + private TextBox txtSearch; + + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + { + this.components.Dispose(); + } + base.Dispose(disposing); + } + private void InitializeComponent() + { + this.fraVoiceConfigurations = new System.Windows.Forms.GroupBox(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.cmdDelete = new System.Windows.Forms.Button(); + this.cmdCopy = new System.Windows.Forms.Button(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.listView1 = new System.Windows.Forms.ListView(); + this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraDefaultParameters = new System.Windows.Forms.GroupBox(); + this.cboSourceEngine = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.fraVOCALOIDParameters = new System.Windows.Forms.GroupBox(); + this.cboOriginalVoicebank = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown4 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.fraSynthaloidParameters = new System.Windows.Forms.GroupBox(); + this.lblWaveType = new System.Windows.Forms.Label(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.fraVoiceConfigurations.SuspendLayout(); + this.fraDefaultParameters.SuspendLayout(); + this.fraVOCALOIDParameters.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + this.fraSynthaloidParameters.SuspendLayout(); + this.SuspendLayout(); + // + // fraVoiceConfigurations + // + this.fraVoiceConfigurations.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraVoiceConfigurations.Controls.Add(this.txtSearch); + this.fraVoiceConfigurations.Controls.Add(this.cmdDelete); + this.fraVoiceConfigurations.Controls.Add(this.cmdCopy); + this.fraVoiceConfigurations.Controls.Add(this.cmdAdd); + this.fraVoiceConfigurations.Controls.Add(this.listView1); + this.fraVoiceConfigurations.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraVoiceConfigurations.Location = new System.Drawing.Point(12, 12); + this.fraVoiceConfigurations.Name = "fraVoiceConfigurations"; + this.fraVoiceConfigurations.Size = new System.Drawing.Size(448, 162); + this.fraVoiceConfigurations.TabIndex = 0; + this.fraVoiceConfigurations.TabStop = false; + this.fraVoiceConfigurations.Text = "Voice configurations"; + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.Location = new System.Drawing.Point(6, 21); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(193, 20); + this.txtSearch.TabIndex = 4; + // + // cmdDelete + // + this.cmdDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdDelete.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdDelete.Location = new System.Drawing.Point(367, 19); + this.cmdDelete.Name = "cmdDelete"; + this.cmdDelete.Size = new System.Drawing.Size(75, 23); + this.cmdDelete.TabIndex = 2; + this.cmdDelete.Text = "&Delete"; + this.cmdDelete.UseVisualStyleBackColor = true; + // + // cmdCopy + // + this.cmdCopy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCopy.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCopy.Location = new System.Drawing.Point(286, 19); + this.cmdCopy.Name = "cmdCopy"; + this.cmdCopy.Size = new System.Drawing.Size(75, 23); + this.cmdCopy.TabIndex = 1; + this.cmdCopy.Text = "&Copy"; + this.cmdCopy.UseVisualStyleBackColor = true; + // + // cmdAdd + // + this.cmdAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(205, 19); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(75, 23); + this.cmdAdd.TabIndex = 0; + this.cmdAdd.Text = "&Add"; + this.cmdAdd.UseVisualStyleBackColor = true; + // + // listView1 + // + this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chName}); + this.listView1.FullRowSelect = true; + this.listView1.GridLines = true; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(6, 48); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(436, 108); + this.listView1.TabIndex = 3; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // chName + // + this.chName.Text = "Name"; + this.chName.Width = 495; + // + // fraDefaultParameters + // + this.fraDefaultParameters.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraDefaultParameters.Controls.Add(this.cboSourceEngine); + this.fraDefaultParameters.Controls.Add(this.label1); + this.fraDefaultParameters.Controls.Add(this.fraVOCALOIDParameters); + this.fraDefaultParameters.Controls.Add(this.fraSynthaloidParameters); + this.fraDefaultParameters.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraDefaultParameters.Location = new System.Drawing.Point(12, 180); + this.fraDefaultParameters.Name = "fraDefaultParameters"; + this.fraDefaultParameters.Size = new System.Drawing.Size(448, 203); + this.fraDefaultParameters.TabIndex = 1; + this.fraDefaultParameters.TabStop = false; + this.fraDefaultParameters.Text = "Default parameters"; + // + // cboSourceEngine + // + this.cboSourceEngine.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboSourceEngine.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboSourceEngine.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboSourceEngine.FormattingEnabled = true; + this.cboSourceEngine.Items.AddRange(new object[] { + "General MIDI", + "VOCALOID", + "VOCALOID2", + "Synthaloid", + "Voxroid"}); + this.cboSourceEngine.Location = new System.Drawing.Point(108, 19); + this.cboSourceEngine.Name = "cboSourceEngine"; + this.cboSourceEngine.Size = new System.Drawing.Size(334, 21); + this.cboSourceEngine.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(6, 22); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(79, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Source &engine:"; + // + // fraVOCALOIDParameters + // + this.fraVOCALOIDParameters.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraVOCALOIDParameters.Controls.Add(this.cboOriginalVoicebank); + this.fraVOCALOIDParameters.Controls.Add(this.label3); + this.fraVOCALOIDParameters.Controls.Add(this.label2); + this.fraVOCALOIDParameters.Controls.Add(this.numericUpDown3); + this.fraVOCALOIDParameters.Controls.Add(this.label6); + this.fraVOCALOIDParameters.Controls.Add(this.label5); + this.fraVOCALOIDParameters.Controls.Add(this.numericUpDown1); + this.fraVOCALOIDParameters.Controls.Add(this.numericUpDown5); + this.fraVOCALOIDParameters.Controls.Add(this.numericUpDown4); + this.fraVOCALOIDParameters.Controls.Add(this.numericUpDown2); + this.fraVOCALOIDParameters.Controls.Add(this.label4); + this.fraVOCALOIDParameters.Controls.Add(this.label7); + this.fraVOCALOIDParameters.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraVOCALOIDParameters.Location = new System.Drawing.Point(6, 46); + this.fraVOCALOIDParameters.Name = "fraVOCALOIDParameters"; + this.fraVOCALOIDParameters.Size = new System.Drawing.Size(436, 151); + this.fraVOCALOIDParameters.TabIndex = 6; + this.fraVOCALOIDParameters.TabStop = false; + this.fraVOCALOIDParameters.Text = "VOCALOID engine"; + // + // cboOriginalVoicebank + // + this.cboOriginalVoicebank.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboOriginalVoicebank.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboOriginalVoicebank.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboOriginalVoicebank.FormattingEnabled = true; + this.cboOriginalVoicebank.Location = new System.Drawing.Point(124, 19); + this.cboOriginalVoicebank.Name = "cboOriginalVoicebank"; + this.cboOriginalVoicebank.Size = new System.Drawing.Size(306, 21); + this.cboOriginalVoicebank.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(20, 75); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(96, 13); + this.label3.TabIndex = 2; + this.label3.Text = "&Breathiness (BRE):"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(20, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(98, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Original &voicebank:"; + // + // numericUpDown3 + // + this.numericUpDown3.Location = new System.Drawing.Point(133, 125); + this.numericUpDown3.Name = "numericUpDown3"; + this.numericUpDown3.Size = new System.Drawing.Size(54, 20); + this.numericUpDown3.TabIndex = 3; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(251, 75); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(107, 13); + this.label6.TabIndex = 2; + this.label6.Text = "&Gender factor (GEN):"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(20, 127); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(85, 13); + this.label5.TabIndex = 2; + this.label5.Text = "C&learness (CLE):"; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(133, 73); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(54, 20); + this.numericUpDown1.TabIndex = 3; + // + // numericUpDown5 + // + this.numericUpDown5.Location = new System.Drawing.Point(364, 99); + this.numericUpDown5.Name = "numericUpDown5"; + this.numericUpDown5.Size = new System.Drawing.Size(54, 20); + this.numericUpDown5.TabIndex = 3; + // + // numericUpDown4 + // + this.numericUpDown4.Location = new System.Drawing.Point(364, 73); + this.numericUpDown4.Name = "numericUpDown4"; + this.numericUpDown4.Size = new System.Drawing.Size(54, 20); + this.numericUpDown4.TabIndex = 3; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(133, 99); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(54, 20); + this.numericUpDown2.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(20, 101); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(86, 13); + this.label4.TabIndex = 2; + this.label4.Text = "Brigh&tness (BRI):"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(251, 101); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(81, 13); + this.label7.TabIndex = 2; + this.label7.Text = "&Opening (OPE):"; + // + // fraSynthaloidParameters + // + this.fraSynthaloidParameters.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraSynthaloidParameters.Controls.Add(this.lblWaveType); + this.fraSynthaloidParameters.Enabled = false; + this.fraSynthaloidParameters.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraSynthaloidParameters.Location = new System.Drawing.Point(6, 46); + this.fraSynthaloidParameters.Name = "fraSynthaloidParameters"; + this.fraSynthaloidParameters.Size = new System.Drawing.Size(436, 151); + this.fraSynthaloidParameters.TabIndex = 5; + this.fraSynthaloidParameters.TabStop = false; + this.fraSynthaloidParameters.Text = "Synthaloid engine"; + this.fraSynthaloidParameters.Visible = false; + // + // lblWaveType + // + this.lblWaveType.AutoSize = true; + this.lblWaveType.Location = new System.Drawing.Point(20, 25); + this.lblWaveType.Name = "lblWaveType"; + this.lblWaveType.Size = new System.Drawing.Size(62, 13); + this.lblWaveType.TabIndex = 0; + this.lblWaveType.Text = "&Wave type:"; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(385, 389); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 3; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(304, 389); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // VoicebankEditorDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(472, 424); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.fraDefaultParameters); + this.Controls.Add(this.fraVoiceConfigurations); + this.Name = "VoicebankEditorDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Voicebank Editor"; + this.fraVoiceConfigurations.ResumeLayout(false); + this.fraVoiceConfigurations.PerformLayout(); + this.fraDefaultParameters.ResumeLayout(false); + this.fraDefaultParameters.PerformLayout(); + this.fraVOCALOIDParameters.ResumeLayout(false); + this.fraVOCALOIDParameters.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + this.fraSynthaloidParameters.ResumeLayout(false); + this.fraSynthaloidParameters.PerformLayout(); + this.ResumeLayout(false); + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.cs new file mode 100644 index 00000000..51270dc7 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Audio +{ + public partial class VoicebankEditorDialog : Form + { + public VoicebankEditorDialog() + { + this.InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Audio/VoicebankEditorDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.Designer.cs new file mode 100644 index 00000000..446df36a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.Designer.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +namespace UniversalEditor.Dialogs.Multimedia.Picture +{ + partial class ToolSettingsDialog : Form + { + private IContainer components = null; + private Label label1; + private Label label2; + private Button cmdCancel; + private Button cmdOK; + private Label label3; + private ComboBox cboTool; + internal Button cmdColor; + internal TrackBar sldPencilSize; + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + { + this.components.Dispose(); + } + base.Dispose(disposing); + } + private void InitializeComponent() + { + this.label1 = new Label(); + this.cmdColor = new Button(); + this.label2 = new Label(); + this.sldPencilSize = new TrackBar(); + this.cmdCancel = new Button(); + this.cmdOK = new Button(); + this.label3 = new Label(); + this.cboTool = new ComboBox(); + ((ISupportInitialize)this.sldPencilSize).BeginInit(); + base.SuspendLayout(); + this.label1.AutoSize = true; + this.label1.FlatStyle = FlatStyle.System; + this.label1.Location = new Point(13, 44); + this.label1.Name = "label1"; + this.label1.Size = new Size(34, 13); + this.label1.TabIndex = 2; + this.label1.Text = "&Color:"; + this.cmdColor.BackColor = System.Drawing.Color.Black; + this.cmdColor.Location = new Point(53, 39); + this.cmdColor.Name = "cmdColor"; + this.cmdColor.Size = new Size(23, 23); + this.cmdColor.TabIndex = 3; + this.cmdColor.UseVisualStyleBackColor = false; + this.cmdColor.Click += new EventHandler(this.cmdColor_Click); + this.label2.AutoSize = true; + this.label2.FlatStyle = FlatStyle.System; + this.label2.Location = new Point(95, 44); + this.label2.Name = "label2"; + this.label2.Size = new Size(30, 13); + this.label2.TabIndex = 4; + this.label2.Text = "&Size:"; + this.sldPencilSize.Location = new Point(131, 39); + this.sldPencilSize.Name = "sldPencilSize"; + this.sldPencilSize.Size = new Size(194, 45); + this.sldPencilSize.TabIndex = 5; + this.sldPencilSize.Value = 1; + this.cmdCancel.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = FlatStyle.System; + this.cmdCancel.Location = new Point(250, 120); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new Size(75, 23); + this.cmdCancel.TabIndex = 7; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdOK.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.cmdOK.FlatStyle = FlatStyle.System; + this.cmdOK.Location = new Point(169, 120); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new Size(75, 23); + this.cmdOK.TabIndex = 6; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new EventHandler(this.cmdOK_Click); + this.label3.AutoSize = true; + this.label3.FlatStyle = FlatStyle.System; + this.label3.Location = new Point(12, 15); + this.label3.Name = "label3"; + this.label3.Size = new Size(31, 13); + this.label3.TabIndex = 0; + this.label3.Text = "&Tool:"; + this.cboTool.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + this.cboTool.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboTool.FlatStyle = FlatStyle.System; + this.cboTool.FormattingEnabled = true; + this.cboTool.Location = new Point(53, 12); + this.cboTool.Name = "cboTool"; + this.cboTool.Size = new Size(272, 21); + this.cboTool.TabIndex = 1; + base.AcceptButton = this.cmdOK; + base.AutoScaleDimensions = new SizeF(6f, 13f); + base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + base.CancelButton = this.cmdCancel; + base.ClientSize = new Size(337, 155); + base.Controls.Add(this.cboTool); + base.Controls.Add(this.cmdOK); + base.Controls.Add(this.cmdCancel); + base.Controls.Add(this.sldPencilSize); + base.Controls.Add(this.cmdColor); + base.Controls.Add(this.label2); + base.Controls.Add(this.label3); + base.Controls.Add(this.label1); + base.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + base.MaximizeBox = false; + base.MinimizeBox = false; + base.Name = "ToolSettingsDialog"; + base.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Tool Settings"; + ((ISupportInitialize)this.sldPencilSize).EndInit(); + base.ResumeLayout(false); + base.PerformLayout(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.cs new file mode 100644 index 00000000..0619628d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Picture/ToolSettingsDialog.cs @@ -0,0 +1,27 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +namespace UniversalEditor.Dialogs.Multimedia.Picture +{ + public partial class ToolSettingsDialog + { + public ToolSettingsDialog() + { + this.InitializeComponent(); + } + private void cmdColor_Click(object sender, EventArgs e) + { + ColorDialog dlg = new ColorDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + this.cmdColor.BackColor = dlg.Color; + } + } + private void cmdOK_Click(object sender, EventArgs e) + { + base.DialogResult = DialogResult.OK; + base.Close(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.Designer.cs new file mode 100644 index 00000000..1b162ba8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.Designer.cs @@ -0,0 +1,244 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +namespace UniversalEditor.Dialogs.Multimedia.Playlist +{ + partial class PlaylistEntryPropertiesDialog : Form + { + private IContainer components = null; + private Label label1; + private TextBox txtFileName; + private Button cmdBrowseFileName; + private Button cmdCancel; + private Button cmdOK; + private Label label2; + private TextBox textBox1; + private Label label3; + private TextBox textBox2; + private GroupBox fraBookmarks; + private Button button4; + private Button button3; + private Button button2; + private Button button1; + private ListView listView1; + + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + { + this.components.Dispose(); + } + base.Dispose(disposing); + } + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.txtFileName = new System.Windows.Forms.TextBox(); + this.cmdBrowseFileName = new System.Windows.Forms.Button(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.fraBookmarks = new System.Windows.Forms.GroupBox(); + this.button4 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.listView1 = new System.Windows.Forms.ListView(); + this.fraBookmarks.SuspendLayout(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(12, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(55, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&File name:"; + // + // txtFileName + // + this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFileName.Location = new System.Drawing.Point(79, 12); + this.txtFileName.Name = "txtFileName"; + this.txtFileName.Size = new System.Drawing.Size(390, 20); + this.txtFileName.TabIndex = 1; + // + // cmdBrowseFileName + // + this.cmdBrowseFileName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowseFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowseFileName.Location = new System.Drawing.Point(394, 38); + this.cmdBrowseFileName.Name = "cmdBrowseFileName"; + this.cmdBrowseFileName.Size = new System.Drawing.Size(75, 23); + this.cmdBrowseFileName.TabIndex = 2; + this.cmdBrowseFileName.Text = "B&rowse..."; + this.cmdBrowseFileName.UseVisualStyleBackColor = true; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(394, 234); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 2; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(313, 234); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 2; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(12, 70); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(61, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Track &start:"; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.Location = new System.Drawing.Point(79, 67); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(107, 20); + this.textBox1.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(192, 70); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(70, 13); + this.label3.TabIndex = 0; + this.label3.Text = "Track &length:"; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(268, 67); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(107, 20); + this.textBox2.TabIndex = 1; + // + // fraBookmarks + // + this.fraBookmarks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraBookmarks.Controls.Add(this.button4); + this.fraBookmarks.Controls.Add(this.button3); + this.fraBookmarks.Controls.Add(this.button2); + this.fraBookmarks.Controls.Add(this.button1); + this.fraBookmarks.Controls.Add(this.listView1); + this.fraBookmarks.Location = new System.Drawing.Point(12, 93); + this.fraBookmarks.Name = "fraBookmarks"; + this.fraBookmarks.Size = new System.Drawing.Size(457, 135); + this.fraBookmarks.TabIndex = 3; + this.fraBookmarks.TabStop = false; + this.fraBookmarks.Text = "Bookmarks"; + // + // button4 + // + this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button4.Location = new System.Drawing.Point(376, 19); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.TabIndex = 1; + this.button4.Text = "button1"; + this.button4.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(168, 19); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 1; + this.button3.Text = "button1"; + this.button3.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(87, 19); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 1; + this.button2.Text = "button1"; + this.button2.UseVisualStyleBackColor = true; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(6, 19); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // listView1 + // + this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView1.FullRowSelect = true; + this.listView1.GridLines = true; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(6, 48); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(445, 81); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // PlaylistEntryPropertiesDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(481, 269); + this.Controls.Add(this.fraBookmarks); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.cmdBrowseFileName); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label2); + this.Controls.Add(this.txtFileName); + this.Controls.Add(this.label1); + this.MinimumSize = new System.Drawing.Size(489, 303); + this.Name = "PlaylistEntryPropertiesDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Entry Properties"; + this.fraBookmarks.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.cs new file mode 100644 index 00000000..d60cc166 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.cs @@ -0,0 +1,15 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.Multimedia.Playlist +{ + public partial class PlaylistEntryPropertiesDialog : Form + { + public PlaylistEntryPropertiesDialog() + { + this.InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Dialogs/Multimedia/Playlist/PlaylistEntryPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.Designer.cs new file mode 100644 index 00000000..a6564588 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.Designer.cs @@ -0,0 +1,281 @@ +namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized +{ + partial class SynthesizedAudioEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlTrackEditor = new System.Windows.Forms.Panel(); + this.pnlPianoRoll = new UniversalEditor.Controls.Multimedia.Audio.Synthesized.PianoRoll.PianoRollControl(); + this.mnuContextTreeView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.addToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddNewItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddExistingItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddNewFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewAddTrack = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddInstrument = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewExclude = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator(); + this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlTrackEditor.SuspendLayout(); + this.mnuContextTreeView.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlTrackEditor); + this.splitContainer1.Size = new System.Drawing.Size(631, 375); + this.splitContainer1.SplitterDistance = 210; + this.splitContainer1.TabIndex = 0; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(210, 375); + this.tv.TabIndex = 0; + // + // pnlTrackEditor + // + this.pnlTrackEditor.Controls.Add(this.pnlPianoRoll); + this.pnlTrackEditor.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlTrackEditor.Location = new System.Drawing.Point(0, 0); + this.pnlTrackEditor.Name = "pnlTrackEditor"; + this.pnlTrackEditor.Size = new System.Drawing.Size(417, 375); + this.pnlTrackEditor.TabIndex = 0; + // + // pnlPianoRoll + // + this.pnlPianoRoll.BackColor = System.Drawing.SystemColors.Window; + this.pnlPianoRoll.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlPianoRoll.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlPianoRoll.GridSize = new System.Drawing.Size(128, 16); + this.pnlPianoRoll.Location = new System.Drawing.Point(0, 0); + this.pnlPianoRoll.Name = "pnlPianoRoll"; + this.pnlPianoRoll.QuantizationSize = new System.Drawing.Size(16, 16); + this.pnlPianoRoll.Size = new System.Drawing.Size(417, 375); + this.pnlPianoRoll.TabIndex = 0; + // + // mnuContextTreeView + // + this.mnuContextTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addToolStripMenuItem, + this.mnuContextTreeViewSep1, + this.mnuContextTreeViewExclude, + this.toolStripMenuItem3, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.deleteToolStripMenuItem, + this.renameToolStripMenuItem, + this.toolStripMenuItem4, + this.propertiesToolStripMenuItem}); + this.mnuContextTreeView.Name = "mnuContextTreeView"; + this.mnuContextTreeView.Size = new System.Drawing.Size(194, 220); + // + // addToolStripMenuItem + // + this.addToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewAddNewItem, + this.mnuContextTreeViewAddExistingItem, + this.mnuContextTreeViewAddNewFolder, + this.mnuContextTreeViewAddSep1, + this.mnuContextTreeViewAddTrack, + this.mnuContextTreeViewAddInstrument}); + this.addToolStripMenuItem.Name = "addToolStripMenuItem"; + this.addToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.addToolStripMenuItem.Text = "A&dd"; + // + // mnuContextTreeViewAddNewItem + // + this.mnuContextTreeViewAddNewItem.Name = "mnuContextTreeViewAddNewItem"; + this.mnuContextTreeViewAddNewItem.ShortcutKeyDisplayString = "Ctrl+Ins"; + this.mnuContextTreeViewAddNewItem.Size = new System.Drawing.Size(231, 22); + this.mnuContextTreeViewAddNewItem.Text = "Ne&w Item..."; + // + // mnuContextTreeViewAddExistingItem + // + this.mnuContextTreeViewAddExistingItem.Name = "mnuContextTreeViewAddExistingItem"; + this.mnuContextTreeViewAddExistingItem.ShortcutKeyDisplayString = "Ctrl+Shift+Ins"; + this.mnuContextTreeViewAddExistingItem.Size = new System.Drawing.Size(231, 22); + this.mnuContextTreeViewAddExistingItem.Text = "Existin&g Item..."; + // + // mnuContextTreeViewAddNewFolder + // + this.mnuContextTreeViewAddNewFolder.Name = "mnuContextTreeViewAddNewFolder"; + this.mnuContextTreeViewAddNewFolder.Size = new System.Drawing.Size(231, 22); + this.mnuContextTreeViewAddNewFolder.Text = "New Fol&der"; + // + // mnuContextTreeViewAddSep1 + // + this.mnuContextTreeViewAddSep1.Name = "mnuContextTreeViewAddSep1"; + this.mnuContextTreeViewAddSep1.Size = new System.Drawing.Size(228, 6); + // + // mnuContextTreeViewAddTrack + // + this.mnuContextTreeViewAddTrack.Name = "mnuContextTreeViewAddTrack"; + this.mnuContextTreeViewAddTrack.Size = new System.Drawing.Size(231, 22); + this.mnuContextTreeViewAddTrack.Text = "&Track"; + // + // mnuContextTreeViewAddInstrument + // + this.mnuContextTreeViewAddInstrument.Name = "mnuContextTreeViewAddInstrument"; + this.mnuContextTreeViewAddInstrument.Size = new System.Drawing.Size(231, 22); + this.mnuContextTreeViewAddInstrument.Text = "&Instrument"; + // + // mnuContextTreeViewSep1 + // + this.mnuContextTreeViewSep1.Name = "mnuContextTreeViewSep1"; + this.mnuContextTreeViewSep1.Size = new System.Drawing.Size(190, 6); + // + // mnuContextTreeViewExclude + // + this.mnuContextTreeViewExclude.Name = "mnuContextTreeViewExclude"; + this.mnuContextTreeViewExclude.Size = new System.Drawing.Size(193, 22); + this.mnuContextTreeViewExclude.Text = "Exclude from Pro&ject"; + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(190, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+X"; + this.cutToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.cutToolStripMenuItem.Text = "Cu&t"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+C"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+V"; + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.ShortcutKeyDisplayString = "Del"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.deleteToolStripMenuItem.Text = "&Delete"; + // + // renameToolStripMenuItem + // + this.renameToolStripMenuItem.Name = "renameToolStripMenuItem"; + this.renameToolStripMenuItem.ShortcutKeyDisplayString = "F3"; + this.renameToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.renameToolStripMenuItem.Text = "Rena&me"; + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(190, 6); + // + // propertiesToolStripMenuItem + // + this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem"; + this.propertiesToolStripMenuItem.ShortcutKeyDisplayString = "Alt+Enter"; + this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(193, 22); + this.propertiesToolStripMenuItem.Text = "P&roperties..."; + // + // SynthesizedAudioEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "SynthesizedAudioEditor"; + this.Size = new System.Drawing.Size(631, 375); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlTrackEditor.ResumeLayout(false); + this.mnuContextTreeView.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private AwesomeControls.CommandBars.CBContextMenu mnuContextTreeView; + private System.Windows.Forms.ToolStripMenuItem addToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddNewItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddExistingItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddNewFolder; + private System.Windows.Forms.ToolStripSeparator mnuContextTreeViewAddSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddTrack; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddInstrument; + private System.Windows.Forms.ToolStripSeparator mnuContextTreeViewSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewExclude; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem propertiesToolStripMenuItem; + private System.Windows.Forms.Panel pnlTrackEditor; + private UniversalEditor.Controls.Multimedia.Audio.Synthesized.PianoRoll.PianoRollControl pnlPianoRoll; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs new file mode 100644 index 00000000..4bf36af5 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +using UniversalEditor.Controls.Multimedia.Audio.Synthesized.PianoRoll; + +namespace UniversalEditor.Editors.Multimedia.Audio.Synthesized +{ + public partial class SynthesizedAudioEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Synthesized audio"; + _er.SupportedObjectModels.Add(typeof(SynthesizedAudioObjectModel)); + } + return _er; + } + + public SynthesizedAudioEditor() + { + InitializeComponent(); + + #region Menu Bar + #region View + ActionMenuItem mnuView = base.MenuBar.Items.Add("View", "&View"); + mnuView.Items.Add("ViewTrackOverlay", "Track &Overlay", mnuViewTrackOverlay_Click, 3); + mnuView.Items.AddSeparator(4); + #endregion + #region Job + ActionMenuItem mnuJob = base.MenuBar.Items.Add("Job", "&Job", 4); + mnuJob.Items.Add("JobNormalizeNotes", "&Normalize Overlapping Notes...", mnuJobNormalizeNotes_Click); + mnuJob.Items.AddSeparator(); + mnuJob.Items.Add("JobInsertBars", "&Insert Measures...", mnuJobInsertBars_Click); + mnuJob.Items.Add("JobDeleteBars", "&Delete Measures...", mnuJobDeleteBars_Click); + mnuJob.Items.AddSeparator(); + mnuJob.Items.Add("JobRandomize", "Insert &Random Notes...", mnuJobRandomize_Click); + mnuJob.Items.Add("JobConnect", "&Connect Notes...", mnuJobConnect_Click); + mnuJob.Items.AddSeparator(); + mnuJob.Items.Add("JobInsertLyrics", "Insert &Lyrics...", mnuJobInsertLyrics_Click); + #endregion + #region Track + ActionMenuItem mnuTrack = base.MenuBar.Items.Add("Track", "Trac&k", 5); + mnuTrack.Items.Add("TrackEnable", "Enable Trac&k", mnuTrackEnable_Click); + mnuTrack.Items.AddSeparator(); + mnuTrack.Items.Add("TrackAdd", "&Add Track", mnuTrackAdd_Click); + mnuTrack.Items.Add("TrackDuplicate", "Dupli&cate Track", mnuTrackDuplicate_Click); + mnuTrack.Items.Add("TrackRename", "&Rename Track", mnuTrackRename_Click); + mnuTrack.Items.Add("TrackDelete", "&Delete Track", mnuTrackDelete_Click); + mnuTrack.Items.AddSeparator(); + mnuTrack.Items.Add("TrackRenderCurrent", "Render Current &Track", mnuTrackRenderCurrent_Click); + mnuTrack.Items.Add("TrackRenderAll", "Render All Track&s", mnuTrackRenderAll_Click); + #endregion + ActionMenuItem mnuPart = base.MenuBar.Items.Add("Part", "Pa&rt", 6); + ActionMenuItem mnuLyrics = base.MenuBar.Items.Add("Lyrics", "&Lyrics", 7); + ActionMenuItem mnuTransport = base.MenuBar.Items.Add("Transport", "Tra&nsport", 8); + #endregion + } + + #region Event Handlers + #region Menu Bar + #region View + private void mnuViewTrackOverlay_Click(object sender, EventArgs e) + { + } + #endregion + #region Job + private void mnuJobNormalizeNotes_Click(object sender, EventArgs e) + { + } + private void mnuJobInsertBars_Click(object sender, EventArgs e) + { + } + private void mnuJobDeleteBars_Click(object sender, EventArgs e) + { + } + private void mnuJobRandomize_Click(object sender, EventArgs e) + { + } + private void mnuJobConnect_Click(object sender, EventArgs e) + { + } + private void mnuJobInsertLyrics_Click(object sender, EventArgs e) + { + } + #endregion + #region Track + private void mnuTrackEnable_Click(object sender, EventArgs e) + { + } + private void mnuTrackAdd_Click(object sender, EventArgs e) + { + } + private void mnuTrackDuplicate_Click(object sender, EventArgs e) + { + } + private void mnuTrackRename_Click(object sender, EventArgs e) + { + } + private void mnuTrackDelete_Click(object sender, EventArgs e) + { + } + private void mnuTrackRenderCurrent_Click(object sender, EventArgs e) + { + } + private void mnuTrackRenderAll_Click(object sender, EventArgs e) + { + } + #endregion + #endregion + #endregion + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.resx new file mode 100644 index 00000000..81998adf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Synthesized/SynthesizedAudioEditor.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.Designer.cs new file mode 100644 index 00000000..8af59141 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.Designer.cs @@ -0,0 +1,286 @@ +// one line to give the program's name and an idea of what it does. +// Copyright (C) yyyy name of author +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace UniversalEditor.Editors.Multimedia.Audio.Voicebank +{ + partial class VoicebankEditor + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the control. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VoicebankEditor)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.button2 = new System.Windows.Forms.Button(); + this.lvPhonemes = new System.Windows.Forms.ListView(); + this.chPhonemeName = new System.Windows.Forms.ColumnHeader(); + this.chPhonemeData = new System.Windows.Forms.ColumnHeader(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.button1 = new System.Windows.Forms.Button(); + this.lvGroups = new System.Windows.Forms.ListView(); + this.chPhonemeGroupName = new System.Windows.Forms.ColumnHeader(); + this.chPhonemeGroupPhonemeCount = new System.Windows.Forms.ColumnHeader(); + this.chPhonemeGroupData1 = new System.Windows.Forms.ColumnHeader(); + this.chPhonemeGroupData2 = new System.Windows.Forms.ColumnHeader(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.lvExplorer = new System.Windows.Forms.ListView(); + this.imlExplorerLargeIcons = new System.Windows.Forms.ImageList(this.components); + this.imlExplorerSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.button2); + this.groupBox1.Controls.Add(this.lvPhonemes); + this.groupBox1.Location = new System.Drawing.Point(3, 123); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(400, 175); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Phoneme List"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(6, 19); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 0; + this.button2.Text = "button1"; + this.button2.UseVisualStyleBackColor = true; + // + // lvPhonemes + // + this.lvPhonemes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvPhonemes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chPhonemeName, + this.chPhonemeData}); + this.lvPhonemes.FullRowSelect = true; + this.lvPhonemes.GridLines = true; + this.lvPhonemes.HideSelection = false; + this.lvPhonemes.Location = new System.Drawing.Point(6, 48); + this.lvPhonemes.Name = "lvPhonemes"; + this.lvPhonemes.Size = new System.Drawing.Size(388, 121); + this.lvPhonemes.TabIndex = 1; + this.lvPhonemes.UseCompatibleStateImageBehavior = false; + this.lvPhonemes.View = System.Windows.Forms.View.Details; + // + // chPhonemeName + // + this.chPhonemeName.Text = "Name"; + this.chPhonemeName.Width = 285; + // + // chPhonemeData + // + this.chPhonemeData.Text = "Data"; + this.chPhonemeData.Width = 94; + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.button1); + this.groupBox2.Controls.Add(this.lvGroups); + this.groupBox2.Location = new System.Drawing.Point(3, 3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(397, 114); + this.groupBox2.TabIndex = 0; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Phoneme Groups"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(6, 19); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // lvGroups + // + this.lvGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvGroups.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chPhonemeGroupName, + this.chPhonemeGroupPhonemeCount, + this.chPhonemeGroupData1, + this.chPhonemeGroupData2}); + this.lvGroups.FullRowSelect = true; + this.lvGroups.GridLines = true; + this.lvGroups.HideSelection = false; + this.lvGroups.Location = new System.Drawing.Point(6, 48); + this.lvGroups.Name = "lvGroups"; + this.lvGroups.Size = new System.Drawing.Size(385, 60); + this.lvGroups.TabIndex = 1; + this.lvGroups.UseCompatibleStateImageBehavior = false; + this.lvGroups.View = System.Windows.Forms.View.Details; + this.lvGroups.SelectedIndexChanged += new System.EventHandler(this.lvGroups_SelectedIndexChanged); + // + // chPhonemeGroupName + // + this.chPhonemeGroupName.Text = "Name"; + this.chPhonemeGroupName.Width = 190; + // + // chPhonemeGroupPhonemeCount + // + this.chPhonemeGroupPhonemeCount.Text = "Phonemes"; + this.chPhonemeGroupPhonemeCount.Width = 82; + // + // chPhonemeGroupData1 + // + this.chPhonemeGroupData1.Text = "Data 1"; + // + // chPhonemeGroupData2 + // + this.chPhonemeGroupData2.Text = "Data 2"; + // + // tabControl1 + // + this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Location = new System.Drawing.Point(3, 3); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(414, 327); + this.tabControl1.TabIndex = 3; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.groupBox2); + this.tabPage1.Controls.Add(this.groupBox1); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(406, 301); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Programmer"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.lvExplorer); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(406, 301); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Explorer"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // lvExplorer + // + this.lvExplorer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvExplorer.FullRowSelect = true; + this.lvExplorer.GridLines = true; + this.lvExplorer.HideSelection = false; + this.lvExplorer.LargeImageList = this.imlExplorerLargeIcons; + this.lvExplorer.Location = new System.Drawing.Point(3, 3); + this.lvExplorer.Name = "lvExplorer"; + this.lvExplorer.Size = new System.Drawing.Size(400, 295); + this.lvExplorer.SmallImageList = this.imlExplorerSmallIcons; + this.lvExplorer.TabIndex = 1; + this.lvExplorer.UseCompatibleStateImageBehavior = false; + // + // imlExplorerLargeIcons + // + this.imlExplorerLargeIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imlExplorerLargeIcons.ImageStream"))); + this.imlExplorerLargeIcons.TransparentColor = System.Drawing.Color.Transparent; + this.imlExplorerLargeIcons.Images.SetKeyName(0, "folder_closed"); + this.imlExplorerLargeIcons.Images.SetKeyName(1, "folder_open"); + // + // imlExplorerSmallIcons + // + this.imlExplorerSmallIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imlExplorerSmallIcons.ImageStream"))); + this.imlExplorerSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + this.imlExplorerSmallIcons.Images.SetKeyName(0, "folder_closed"); + this.imlExplorerSmallIcons.Images.SetKeyName(1, "folder_open"); + // + // VoiceDatabaseEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tabControl1); + this.Name = "VoiceDatabaseEditor"; + this.Size = new System.Drawing.Size(420, 333); + this.groupBox1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.ResumeLayout(false); + } + private System.Windows.Forms.ImageList imlExplorerSmallIcons; + private System.Windows.Forms.ImageList imlExplorerLargeIcons; + private System.Windows.Forms.ListView lvExplorer; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.ColumnHeader chPhonemeGroupData2; + private System.Windows.Forms.ColumnHeader chPhonemeGroupData1; + private System.Windows.Forms.ListView lvPhonemes; + private System.Windows.Forms.ColumnHeader chPhonemeGroupPhonemeCount; + private System.Windows.Forms.ColumnHeader chPhonemeGroupName; + private System.Windows.Forms.ColumnHeader chPhonemeData; + private System.Windows.Forms.ColumnHeader chPhonemeName; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.ListView lvGroups; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs new file mode 100644 index 00000000..9d1481dc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs @@ -0,0 +1,158 @@ +// one line to give the program's name and an idea of what it does. +// Copyright (C) yyyy name of author +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Multimedia.Audio.Voicebank +{ + // TODO: Create a file-format-independent explorer listview. + + // The VoiceDatabaseEditor uses an Explorer listview interface. This means that + // PhonemeGroups are represented as folders, and Phonemes within those PhonemeGroups + // are represented as files. This makes it easy for a user to add/delete these kinds + // of items without having to learn complex interfaces. + + // Where practical, I'd like to implement this interface in editors. If there is more + // than one editor that can be used to edit a particular type of file (for example, + // VoiceDatabaseProgrammerEditor and VoiceDatabaseExplorerEditor), the different + // editors will be listed when GetAvailableEditors (...) is called. + + // For our test case (EDSEdit), these editors will be listed as tabs near the bottom + // of the screen. The upside to this model of course is that there will be a common + // editor for these types of files. + + // The ExplorerEditorBase will expose a Folders collection and a Files collection. + // The ExplorerEditorBase will also have a built-in search box (which can be hidden + // if developing an app that has its own search methods) and a built-in search + // function Search(string text) (which can be used when developing aformentioned app) + + // When user clicks on a folder (or a file), the ExplorerView will fire an ItemClick + // event (or for double-clicks, an ItemDoubleClick event) that the author of the Editor + // will handle by overriding the OnItemClick (or OnItemDoubleClick) event. The item + // that had been clicked will automatically go into the navigation stack (so a Back/Up + // button can be implemented without too much difficulty) and the author will be + // responsible for populating the next set of items in the hierarchy. + + // Of course, the entire idea behind this is that EDS will become a drop-in replacement + // for any explorer on any system, and will be able to read and edit any files without + // difficulty. + + /// + /// Description of VoiceDatabaseEditor. + /// + public partial class VoicebankEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(VoicebankObjectModel)); + } + return _er; + } + + public VoicebankEditor() + { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + + // Select "Explorer" view by default, it looks nice~ + tabControl1.SelectedIndex = 1; + } + + /* + public override bool NavigateImaginaryPath(string path) + { + if (base.ObjectModel is VoicebankObjectModel) + { + VoicebankObjectModel ddi = (base.ObjectModel as VoicebankObjectModel); + PhonemeGroup pg = ddi.PhonemeGroups[path]; + if (pg != null) + { + lvGroups.Items[ddi.PhonemeGroups.IndexOf(pg)].Selected = true; + } + else + { + MessageBox.Show("Phoneme group " + path + " does not exist in this file!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + return false; + } + */ + + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + if (base.ObjectModel is VoicebankObjectModel) + { + VoicebankObjectModel ddi = (base.ObjectModel as VoicebankObjectModel); + lvGroups.Items.Clear(); + lvPhonemes.Items.Clear(); + + foreach(PhonemeGroup pg in ddi.PhonemeGroups) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = pg.Title; + lvi.SubItems.Add(pg.Phonemes.Count.ToString()); + // lvi.SubItems.Add(pg.Data1.ToString()); + // lvi.SubItems.Add(pg.Data2.ToString()); + lvGroups.Items.Add(lvi); + + ListViewItem lvie = new ListViewItem(); + lvie.Text = pg.Title; + lvie.SubItems.Add(pg.Phonemes.Count.ToString()); + // lvie.SubItems.Add(pg.Data1.ToString()); + // lvie.SubItems.Add(pg.Data2.ToString()); + lvie.ImageKey = "folder_closed"; + lvExplorer.Items.Add(lvie); + } + } + } + + void lvGroups_SelectedIndexChanged(object sender, EventArgs e) + { + if (base.ObjectModel is VoicebankObjectModel) + { + VoicebankObjectModel ddi = (base.ObjectModel as VoicebankObjectModel); + lvPhonemes.Items.Clear(); + if (lvGroups.SelectedIndices.Count == 1) + { + foreach (Phoneme p in ddi.PhonemeGroups[lvGroups.SelectedIndices[0]].Phonemes) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = p.Title; + // lvi.SubItems.Add(p.Data.ToString()); + lvPhonemes.Items.Add(lvi); + } + } + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx new file mode 100644 index 00000000..2009534e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.resx @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9, 8 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACC + GAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA + AwABIAMAAQEBAAEgBgABQP8A/wD/AP8A/wD/AKgAAwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB + Af8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB + Af8DAQH/AwEB/wMBAf8DAQH//wAJAAMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB + Af8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB + Af8DAQH/AwEB/wMBAf8DAQH/AwEB/xAAA4EB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB + AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB + AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB + AoEB/wEBAoEB/wMBAf//AAEAA4EB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB + AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB + AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEBAoEB/wEB + AoEB/wEBAoEB/wEBAoEB/wEBAoEB/wMBAf8MAAOBAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBAoEB/wMBAf//AAEAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKBAf8DAQH/DAADgQH/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8BAQKBAf8DAQH//wABAAOBBf8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/AQECgQH/AwEB/wgAA4EB/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wMBAf8DAQH//wABAAOBBf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wgA + A4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A8AB/wMBAf8DAQH/ + /wABAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + AQECgQH/AwEB/wgAA4EB/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A4EB/wMBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQECgQH/AwEB/wgAA4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/A4EB/wMBAf8DAQH//wABAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/AQECgQH/AwEB/wQAA4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wMBAf8BAQKBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wQAA4EB/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wMBAf8BAQKBAf8DAQH/ + /wABAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + AQECgQH/AwEB/wQAA4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + A4EB/wMBAf8BAQKBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wQAA4EB/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A4EB/wMBAf8BAQKBAf8DAQH//wABAAOBBf8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/AQECgQH/AwEB/wOBAf8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8DAQH/A4EB/wEBAoEB/wMBAf//AAEA + A4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKB + Af8DAQH/A4EB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wMB + Af8DgQH/AQECgQH/AwEB//8AAQADgQX/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wEBAoEB/wMBAf8DgQH/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DgQH/AwEB/wEBA/8BAQKBAf8DAQH//wABAAOBBf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQECgQH/AwEB/wOBAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wOBAf8DAQH/A8AB/wEBAoEB/wMBAf//AAEA + A4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8BAQKB + Af8DAQH/A4Fp/wMBAf8DgQH/AQED/wEBAoEB/wMBAf//AAEAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKBAf8DAQH/BAADgQH/A4EB/wPAAf8DwAH/ + A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/ + A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8BAQP/A8AB/wEBAoEB/wMBAf//AAEAA4EF/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8BAQKBAf8DAQH/ + DAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wEBAoEB/wMBAf//AAEA + A4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQKB + Af8DAQH/DAADgQX/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBAoEB/wMB + Af//AAEAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8BAQKBAf8DAQH/DAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wEB + AoEB/wMBAf//AAEAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQKBAf8DAQH/DAADgQX/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/ + AQED/wPAAf8BAQP/A8AB/wEBL/8DAQH//wAFAAOBdf8BAQKBAf8DAQH/DAADgQX/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8DgQH/A4EB/wOBAf8DgQH/ + A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB//8ACQADgQH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/ + A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPAAf8DwAH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/ + A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DAQH/FAADgQX/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A4EB//8AOQADgQX/AQED/wPAAf8BAQP/A8AB/wEB + A/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A4EB/1QAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/AQED/wPAAf8DgQH//wBBAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/A4EB/1wAA4El/wOBAf//AEkAA4El/wOBAf9kAAOBAf8DgQH/A4EB/wOBAf8DgQH/ + A4EB/wOBAf8DgQH/A4EB//8AUQADgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf//AP8A + /wDPAAFCAU0BPgcAAT4DAAEoAwABgAMAASADAAEBAQABAQYAAQIWAAP/AQAI/wgACP8IAAj/CAAE/wHw + AgABAQgAAYACAAEBAeAPAAHgDwAB4A8AAcAPAAHADwABwA8AAcAPAAGADwABgA8AAYAPAAGAXwABgA8A + AeAPAAHgDwAB4A8AAeACAAEBDAAB4AIAAQMLAAEBAfABAAEfAf8IAAGAAQAC/wH4AQABPwH/CAABwAEB + Av8B/AEAAX8B/wgAAeABAwL/Af4BAAL/CAAB8AEHBv8IAAj/CAAL + + + + 162, 10 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADI + BQAAAk1TRnQBSQFMAgEBAgEAAQUBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABEAMAAQEBAAEgBgABEP8A/wAYAAMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMB + Af8DAQH/AwEB/wMBAf8DAQH/EAADAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/AwEB/wMBAf8DAQH/ + AwEB/wMBAf8DAQH/gAADgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOB + Af8DgQH/A4EB/wMBAf8MAAOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/ + A4EB/wMBAf8DAQH/gAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEB + A/8DgQH/AwEB/wwAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wOBAf8DAQH/ + AwEB/4AAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/A4EB/wMB + Af8IAAOBBf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AwEB/wOBAf8DAQH/ + gAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DgQH/AwEB/wgA + A4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wOBAf8DAQH/A4EB/wMBAf+AAAOB + Bf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wOBAf8DAQH/BAADgQX/ + A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wMBAf8DgQH/A4EB/wMBAf+AAAOB + Bf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wOBAf8DAQH/BAADgSn/ + A4EB/wMBAf8DwAH/A4EB/wMBAf+AAAOBBf8DwAH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wOBAf8DAQH/BAADgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/ + A4EB/wOBAf8DgQH/AQED/wOBAf8DAQH/gAADgQX/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPA + Af8BAQP/A8AB/wEBA/8DgQH/AwEB/wgAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AB/wEBA/8DwAH/A4EB/wMBAf+AAAOBMf8DgQH/AwEB/wgAA4EF/wEBA/8DwAH/AQED/wPAAf8BAQP/ + A8AV/wOBAf8DAQH/gAADgQH/AQED/wPAAf8BAQP/A8AB/wEBA/8DwAH/AQED/wOBAf8DgQH/A4EB/wOB + Af8DgQH/A4EB/wwAA4EF/wPAAf8BAQP/A8AB/wEBA/8DwAX/A4EB/wOBAf8DgQH/A4EB/wOBAf8DgQH/ + iAADgQH/AQED/wPAAf8BAQP/A8AB/wEBA/8DgQH/KAADgRX/A4EB/6QAA4EB/wOBAf8DgQH/A4EB/wOB + Af8wAAOBAf8DgQH/A4EB/wOBAf8DgQH//wChAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA + AYAXAAP/AQAE/wQABP8EAAGAAQEB4AYAAQEBwAYAAQEBwAYAAQEBgAYAAQEBgAYAAQEHAAEBBwABAQcA + AQEBgAYAAQEBgAYAAQMBgAEBBAABgAH/AcABfwQAAcEB/wHgAf8EAAT/BAAL + + + + 37 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.Designer.cs new file mode 100644 index 00000000..33c49a67 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.Designer.cs @@ -0,0 +1,299 @@ +namespace UniversalEditor.Editors.Multimedia.Audio.Voicebank +{ + partial class VoicebankIndexEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tbsTabs = new System.Windows.Forms.TabControl(); + this.tabPhonemes = new System.Windows.Forms.TabPage(); + this.tabPhonemeGroups = new System.Windows.Forms.TabPage(); + this.cmdPhonemeAdd = new System.Windows.Forms.Button(); + this.cmdPhonemeModify = new System.Windows.Forms.Button(); + this.cmdPhonemeRemove = new System.Windows.Forms.Button(); + this.cmdPhonemeClear = new System.Windows.Forms.Button(); + this.lvPhonemes = new System.Windows.Forms.ListView(); + this.chPhonemeName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chPhonemeData = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tvPhonemeGroups = new System.Windows.Forms.TreeView(); + this.mnuContextPhonemeGroups = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextPhonemeGroupsNew = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsAddGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsAddPhoneme = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextPhonemeGroupsCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextPhonemeGroupsSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextPhonemeGroupsProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.tbsTabs.SuspendLayout(); + this.tabPhonemes.SuspendLayout(); + this.tabPhonemeGroups.SuspendLayout(); + this.mnuContextPhonemeGroups.SuspendLayout(); + this.SuspendLayout(); + // + // tbsTabs + // + this.tbsTabs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tbsTabs.Controls.Add(this.tabPhonemes); + this.tbsTabs.Controls.Add(this.tabPhonemeGroups); + this.tbsTabs.Location = new System.Drawing.Point(3, 3); + this.tbsTabs.Name = "tbsTabs"; + this.tbsTabs.SelectedIndex = 0; + this.tbsTabs.Size = new System.Drawing.Size(490, 303); + this.tbsTabs.TabIndex = 0; + // + // tabPhonemes + // + this.tabPhonemes.Controls.Add(this.lvPhonemes); + this.tabPhonemes.Controls.Add(this.cmdPhonemeClear); + this.tabPhonemes.Controls.Add(this.cmdPhonemeRemove); + this.tabPhonemes.Controls.Add(this.cmdPhonemeModify); + this.tabPhonemes.Controls.Add(this.cmdPhonemeAdd); + this.tabPhonemes.Location = new System.Drawing.Point(4, 22); + this.tabPhonemes.Name = "tabPhonemes"; + this.tabPhonemes.Padding = new System.Windows.Forms.Padding(3); + this.tabPhonemes.Size = new System.Drawing.Size(482, 277); + this.tabPhonemes.TabIndex = 0; + this.tabPhonemes.Text = "Phonemes"; + this.tabPhonemes.UseVisualStyleBackColor = true; + // + // tabPhonemeGroups + // + this.tabPhonemeGroups.Controls.Add(this.tvPhonemeGroups); + this.tabPhonemeGroups.Location = new System.Drawing.Point(4, 22); + this.tabPhonemeGroups.Name = "tabPhonemeGroups"; + this.tabPhonemeGroups.Padding = new System.Windows.Forms.Padding(3); + this.tabPhonemeGroups.Size = new System.Drawing.Size(482, 277); + this.tabPhonemeGroups.TabIndex = 1; + this.tabPhonemeGroups.Text = "Phoneme Groups"; + this.tabPhonemeGroups.UseVisualStyleBackColor = true; + // + // cmdPhonemeAdd + // + this.cmdPhonemeAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPhonemeAdd.Location = new System.Drawing.Point(6, 6); + this.cmdPhonemeAdd.Name = "cmdPhonemeAdd"; + this.cmdPhonemeAdd.Size = new System.Drawing.Size(75, 23); + this.cmdPhonemeAdd.TabIndex = 0; + this.cmdPhonemeAdd.Text = "&Add"; + this.cmdPhonemeAdd.UseVisualStyleBackColor = true; + // + // cmdPhonemeModify + // + this.cmdPhonemeModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPhonemeModify.Location = new System.Drawing.Point(87, 6); + this.cmdPhonemeModify.Name = "cmdPhonemeModify"; + this.cmdPhonemeModify.Size = new System.Drawing.Size(75, 23); + this.cmdPhonemeModify.TabIndex = 0; + this.cmdPhonemeModify.Text = "&Modify"; + this.cmdPhonemeModify.UseVisualStyleBackColor = true; + // + // cmdPhonemeRemove + // + this.cmdPhonemeRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPhonemeRemove.Location = new System.Drawing.Point(168, 6); + this.cmdPhonemeRemove.Name = "cmdPhonemeRemove"; + this.cmdPhonemeRemove.Size = new System.Drawing.Size(75, 23); + this.cmdPhonemeRemove.TabIndex = 0; + this.cmdPhonemeRemove.Text = "&Remove"; + this.cmdPhonemeRemove.UseVisualStyleBackColor = true; + // + // cmdPhonemeClear + // + this.cmdPhonemeClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdPhonemeClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPhonemeClear.Location = new System.Drawing.Point(401, 6); + this.cmdPhonemeClear.Name = "cmdPhonemeClear"; + this.cmdPhonemeClear.Size = new System.Drawing.Size(75, 23); + this.cmdPhonemeClear.TabIndex = 0; + this.cmdPhonemeClear.Text = "&Clear"; + this.cmdPhonemeClear.UseVisualStyleBackColor = true; + // + // lvPhonemes + // + this.lvPhonemes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvPhonemes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chPhonemeName, + this.chPhonemeData}); + this.lvPhonemes.FullRowSelect = true; + this.lvPhonemes.GridLines = true; + this.lvPhonemes.HideSelection = false; + this.lvPhonemes.Location = new System.Drawing.Point(6, 35); + this.lvPhonemes.Name = "lvPhonemes"; + this.lvPhonemes.Size = new System.Drawing.Size(470, 236); + this.lvPhonemes.TabIndex = 1; + this.lvPhonemes.UseCompatibleStateImageBehavior = false; + this.lvPhonemes.View = System.Windows.Forms.View.Details; + // + // chPhonemeName + // + this.chPhonemeName.Text = "Name"; + this.chPhonemeName.Width = 396; + // + // chPhonemeData + // + this.chPhonemeData.Text = "Data1"; + // + // tvPhonemeGroups + // + this.tvPhonemeGroups.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tvPhonemeGroups.ContextMenuStrip = this.mnuContextPhonemeGroups; + this.tvPhonemeGroups.Location = new System.Drawing.Point(6, 6); + this.tvPhonemeGroups.Name = "tvPhonemeGroups"; + this.tvPhonemeGroups.Size = new System.Drawing.Size(470, 265); + this.tvPhonemeGroups.TabIndex = 6; + // + // mnuContextPhonemeGroups + // + this.mnuContextPhonemeGroups.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextPhonemeGroupsNew, + this.mnuContextPhonemeGroupsSep1, + this.mnuContextPhonemeGroupsCut, + this.mnuContextPhonemeGroupsCopy, + this.mnuContextPhonemeGroupsPaste, + this.mnuContextPhonemeGroupsDelete, + this.mnuContextPhonemeGroupsSep2, + this.mnuContextPhonemeGroupsProperties}); + this.mnuContextPhonemeGroups.Name = "mnuContextPhonemeGroups"; + this.mnuContextPhonemeGroups.Size = new System.Drawing.Size(137, 148); + // + // mnuContextPhonemeGroupsNew + // + this.mnuContextPhonemeGroupsNew.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextPhonemeGroupsAddGroup, + this.mnuContextPhonemeGroupsAddPhoneme}); + this.mnuContextPhonemeGroupsNew.Name = "mnuContextPhonemeGroupsNew"; + this.mnuContextPhonemeGroupsNew.Size = new System.Drawing.Size(136, 22); + this.mnuContextPhonemeGroupsNew.Text = "Ne&w"; + // + // mnuContextPhonemeGroupsAddGroup + // + this.mnuContextPhonemeGroupsAddGroup.Name = "mnuContextPhonemeGroupsAddGroup"; + this.mnuContextPhonemeGroupsAddGroup.Size = new System.Drawing.Size(161, 22); + this.mnuContextPhonemeGroupsAddGroup.Text = "Phoneme &Group"; + // + // mnuContextPhonemeGroupsAddPhoneme + // + this.mnuContextPhonemeGroupsAddPhoneme.Name = "mnuContextPhonemeGroupsAddPhoneme"; + this.mnuContextPhonemeGroupsAddPhoneme.Size = new System.Drawing.Size(161, 22); + this.mnuContextPhonemeGroupsAddPhoneme.Text = "&Phoneme"; + // + // mnuContextPhonemeGroupsSep1 + // + this.mnuContextPhonemeGroupsSep1.Name = "mnuContextPhonemeGroupsSep1"; + this.mnuContextPhonemeGroupsSep1.Size = new System.Drawing.Size(133, 6); + // + // mnuContextPhonemeGroupsCut + // + this.mnuContextPhonemeGroupsCut.Enabled = false; + this.mnuContextPhonemeGroupsCut.Name = "mnuContextPhonemeGroupsCut"; + this.mnuContextPhonemeGroupsCut.Size = new System.Drawing.Size(136, 22); + this.mnuContextPhonemeGroupsCut.Text = "Cu&t"; + // + // mnuContextPhonemeGroupsCopy + // + this.mnuContextPhonemeGroupsCopy.Enabled = false; + this.mnuContextPhonemeGroupsCopy.Name = "mnuContextPhonemeGroupsCopy"; + this.mnuContextPhonemeGroupsCopy.Size = new System.Drawing.Size(136, 22); + this.mnuContextPhonemeGroupsCopy.Text = "&Copy"; + // + // mnuContextPhonemeGroupsPaste + // + this.mnuContextPhonemeGroupsPaste.Enabled = false; + this.mnuContextPhonemeGroupsPaste.Name = "mnuContextPhonemeGroupsPaste"; + this.mnuContextPhonemeGroupsPaste.Size = new System.Drawing.Size(136, 22); + this.mnuContextPhonemeGroupsPaste.Text = "&Paste"; + // + // mnuContextPhonemeGroupsDelete + // + this.mnuContextPhonemeGroupsDelete.Enabled = false; + this.mnuContextPhonemeGroupsDelete.Name = "mnuContextPhonemeGroupsDelete"; + this.mnuContextPhonemeGroupsDelete.Size = new System.Drawing.Size(136, 22); + this.mnuContextPhonemeGroupsDelete.Text = "&Delete"; + this.mnuContextPhonemeGroupsDelete.Visible = false; + // + // mnuContextPhonemeGroupsSep2 + // + this.mnuContextPhonemeGroupsSep2.Name = "mnuContextPhonemeGroupsSep2"; + this.mnuContextPhonemeGroupsSep2.Size = new System.Drawing.Size(133, 6); + // + // mnuContextPhonemeGroupsProperties + // + this.mnuContextPhonemeGroupsProperties.Enabled = false; + this.mnuContextPhonemeGroupsProperties.Name = "mnuContextPhonemeGroupsProperties"; + this.mnuContextPhonemeGroupsProperties.Size = new System.Drawing.Size(136, 22); + this.mnuContextPhonemeGroupsProperties.Text = "P&roperties..."; + // + // VoicebankIndexEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tbsTabs); + this.Name = "VoicebankIndexEditor"; + this.Size = new System.Drawing.Size(496, 309); + this.tbsTabs.ResumeLayout(false); + this.tabPhonemes.ResumeLayout(false); + this.tabPhonemeGroups.ResumeLayout(false); + this.mnuContextPhonemeGroups.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TabControl tbsTabs; + private System.Windows.Forms.TabPage tabPhonemes; + private System.Windows.Forms.TabPage tabPhonemeGroups; + private System.Windows.Forms.Button cmdPhonemeClear; + private System.Windows.Forms.Button cmdPhonemeRemove; + private System.Windows.Forms.Button cmdPhonemeModify; + private System.Windows.Forms.Button cmdPhonemeAdd; + private System.Windows.Forms.ListView lvPhonemes; + private System.Windows.Forms.ColumnHeader chPhonemeName; + private System.Windows.Forms.ColumnHeader chPhonemeData; + private System.Windows.Forms.TreeView tvPhonemeGroups; + private AwesomeControls.CommandBars.CBContextMenu mnuContextPhonemeGroups; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsNew; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsAddGroup; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsAddPhoneme; + private System.Windows.Forms.ToolStripSeparator mnuContextPhonemeGroupsSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsPaste; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsDelete; + private System.Windows.Forms.ToolStripSeparator mnuContextPhonemeGroupsSep2; + private System.Windows.Forms.ToolStripMenuItem mnuContextPhonemeGroupsProperties; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.cs new file mode 100644 index 00000000..2374aeaf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; +using UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankIndex; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; + +namespace UniversalEditor.Editors.Multimedia.Audio.Voicebank +{ + public partial class VoicebankIndexEditor : Editor + { + public VoicebankIndexEditor() + { + InitializeComponent(); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(VoicebankIndexObjectModel)); + } + return _er; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + lvPhonemes.Items.Clear(); + tvPhonemeGroups.Nodes.Clear(); + + VoicebankIndexObjectModel dbse = (base.ObjectModel as VoicebankIndexObjectModel); + if (dbse == null) return; + + foreach (Phoneme p in dbse.Phonemes) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = p.Title; + lvi.Tag = p; + lvPhonemes.Items.Add(lvi); + } + foreach (PhonemeGroup pg in dbse.Groups) + { + TreeNode tn = new TreeNode(); + tn.Text = pg.Title; + tn.Tag = pg; + + foreach (Phoneme p in pg.Phonemes) + { + TreeNode tn1 = new TreeNode(); + tn1.Text = p.Title; + tn1.Tag = p; + tn.Nodes.Add(tn1); + } + + tvPhonemeGroups.Nodes.Add(tn); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.resx new file mode 100644 index 00000000..2693f522 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Voicebank/VoicebankIndexEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 3 + + + 34 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.Designer.cs new file mode 100644 index 00000000..df120aeb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.Designer.cs @@ -0,0 +1,73 @@ +namespace UniversalEditor.Editors.Multimedia.Audio.Waveform +{ + partial class WaveformAudioEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.trackList = new UniversalEditor.Controls.Multimedia.Audio.Waveform.WaveformTrackList.WaveformTrackListControl(); + this.cmdPlay = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // trackList + // + this.trackList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackList.BackColor = System.Drawing.SystemColors.AppWorkspace; + this.trackList.Location = new System.Drawing.Point(0, 32); + this.trackList.Name = "trackList"; + this.trackList.Size = new System.Drawing.Size(471, 255); + this.trackList.TabIndex = 0; + // + // cmdPlay + // + this.cmdPlay.Location = new System.Drawing.Point(3, 3); + this.cmdPlay.Name = "cmdPlay"; + this.cmdPlay.Size = new System.Drawing.Size(75, 23); + this.cmdPlay.TabIndex = 1; + this.cmdPlay.Text = "&Play"; + this.cmdPlay.UseVisualStyleBackColor = true; + this.cmdPlay.Click += new System.EventHandler(this.cmdPlay_Click); + // + // WaveformAudioEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmdPlay); + this.Controls.Add(this.trackList); + this.Name = "WaveformAudioEditor"; + this.Size = new System.Drawing.Size(471, 287); + this.ResumeLayout(false); + + } + + #endregion + + private Controls.Multimedia.Audio.Waveform.WaveformTrackList.WaveformTrackListControl trackList; + private System.Windows.Forms.Button cmdPlay; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.cs new file mode 100644 index 00000000..c2b6433e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Editors.Multimedia.Audio.Waveform +{ + public partial class WaveformAudioEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(WaveformAudioObjectModel)); + } + return _er; + } + + public WaveformAudioEditor() + { + InitializeComponent(); + } + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + WaveformAudioObjectModel wave = (ObjectModel as WaveformAudioObjectModel); + trackList.Tracks.Add("Track 1", wave); + } + + private void cmdPlay_Click(object sender, EventArgs e) + { + Surodoine.AudioPlayer player = new Surodoine.AudioPlayer(); + cmdPlay.Enabled = false; + + + WaveformAudioObjectModel wave = (ObjectModel as WaveformAudioObjectModel); + player.Play(wave); + cmdPlay.Enabled = true; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Audio/Waveform/WaveformAudioEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.Designer.cs new file mode 100644 index 00000000..e26ff028 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.Designer.cs @@ -0,0 +1,743 @@ +namespace UniversalEditor.Editors.Multimedia.Palette +{ + partial class PaletteEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraColorEditor = new System.Windows.Forms.GroupBox(); + this.cmdColor = new System.Windows.Forms.Button(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.txtHue = new System.Windows.Forms.NumericUpDown(); + this.lblHue = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.trackBar3 = new System.Windows.Forms.TrackBar(); + this.txtSaturation = new System.Windows.Forms.NumericUpDown(); + this.trackBar2 = new System.Windows.Forms.TrackBar(); + this.label2 = new System.Windows.Forms.Label(); + this.trackBar1 = new System.Windows.Forms.TrackBar(); + this.txtValue = new System.Windows.Forms.NumericUpDown(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.sldBlue = new System.Windows.Forms.TrackBar(); + this.txtRed = new System.Windows.Forms.NumericUpDown(); + this.sldGreen = new System.Windows.Forms.TrackBar(); + this.label3 = new System.Windows.Forms.Label(); + this.sldRed = new System.Windows.Forms.TrackBar(); + this.label4 = new System.Windows.Forms.Label(); + this.txtBlue = new System.Windows.Forms.NumericUpDown(); + this.txtGreen = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.trackBar10 = new System.Windows.Forms.TrackBar(); + this.trackBar7 = new System.Windows.Forms.TrackBar(); + this.numericUpDown6 = new System.Windows.Forms.NumericUpDown(); + this.trackBar8 = new System.Windows.Forms.TrackBar(); + this.label6 = new System.Windows.Forms.Label(); + this.trackBar9 = new System.Windows.Forms.TrackBar(); + this.label7 = new System.Windows.Forms.Label(); + this.numericUpDown9 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown7 = new System.Windows.Forms.NumericUpDown(); + this.label9 = new System.Windows.Forms.Label(); + this.numericUpDown8 = new System.Windows.Forms.NumericUpDown(); + this.label8 = new System.Windows.Forms.Label(); + this.fraAvailableColors = new System.Windows.Forms.GroupBox(); + this.cmdClear = new System.Windows.Forms.Button(); + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdUpdate = new System.Windows.Forms.Button(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.pal = new UniversalEditor.Controls.Multimedia.Palette.ColorListControl(); + this.lblColorName = new System.Windows.Forms.Label(); + this.txtColorName = new System.Windows.Forms.TextBox(); + this.fraColorEditor.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtHue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtSaturation)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtValue)).BeginInit(); + this.tabPage2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldBlue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtRed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.sldGreen)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.sldRed)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtBlue)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtGreen)).BeginInit(); + this.tabPage3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar10)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar8)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).BeginInit(); + this.fraAvailableColors.SuspendLayout(); + this.SuspendLayout(); + // + // fraColorEditor + // + this.fraColorEditor.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraColorEditor.Controls.Add(this.txtColorName); + this.fraColorEditor.Controls.Add(this.lblColorName); + this.fraColorEditor.Controls.Add(this.cmdColor); + this.fraColorEditor.Controls.Add(this.tabControl1); + this.fraColorEditor.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraColorEditor.Location = new System.Drawing.Point(3, 3); + this.fraColorEditor.Name = "fraColorEditor"; + this.fraColorEditor.Size = new System.Drawing.Size(506, 168); + this.fraColorEditor.TabIndex = 0; + this.fraColorEditor.TabStop = false; + this.fraColorEditor.Text = "Color Editor"; + // + // cmdColor + // + this.cmdColor.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.cmdColor.BackColor = System.Drawing.Color.Black; + this.cmdColor.Location = new System.Drawing.Point(6, 47); + this.cmdColor.Name = "cmdColor"; + this.cmdColor.Size = new System.Drawing.Size(75, 75); + this.cmdColor.TabIndex = 2; + this.cmdColor.UseVisualStyleBackColor = false; + this.cmdColor.Click += new System.EventHandler(this.cmdColor_Click); + // + // tabControl1 + // + this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage3); + this.tabControl1.Location = new System.Drawing.Point(87, 47); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(413, 115); + this.tabControl1.TabIndex = 1; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.txtHue); + this.tabPage1.Controls.Add(this.lblHue); + this.tabPage1.Controls.Add(this.label1); + this.tabPage1.Controls.Add(this.trackBar3); + this.tabPage1.Controls.Add(this.txtSaturation); + this.tabPage1.Controls.Add(this.trackBar2); + this.tabPage1.Controls.Add(this.label2); + this.tabPage1.Controls.Add(this.trackBar1); + this.tabPage1.Controls.Add(this.txtValue); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(405, 89); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "HSV"; + // + // txtHue + // + this.txtHue.Location = new System.Drawing.Point(70, 6); + this.txtHue.Maximum = new decimal(new int[] { + 239, + 0, + 0, + 0}); + this.txtHue.Name = "txtHue"; + this.txtHue.Size = new System.Drawing.Size(61, 20); + this.txtHue.TabIndex = 1; + this.txtHue.Validated += new System.EventHandler(this.txtHSV_Validated); + // + // lblHue + // + this.lblHue.AutoSize = true; + this.lblHue.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblHue.Location = new System.Drawing.Point(6, 8); + this.lblHue.Name = "lblHue"; + this.lblHue.Size = new System.Drawing.Size(30, 13); + this.lblHue.TabIndex = 0; + this.lblHue.Text = "&Hue:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(6, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Saturation:"; + // + // trackBar3 + // + this.trackBar3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar3.AutoSize = false; + this.trackBar3.Location = new System.Drawing.Point(137, 58); + this.trackBar3.Maximum = 255; + this.trackBar3.Name = "trackBar3"; + this.trackBar3.Size = new System.Drawing.Size(262, 20); + this.trackBar3.TabIndex = 2; + this.trackBar3.TickFrequency = 10; + this.trackBar3.TickStyle = System.Windows.Forms.TickStyle.None; + // + // txtSaturation + // + this.txtSaturation.Location = new System.Drawing.Point(70, 32); + this.txtSaturation.Maximum = new decimal(new int[] { + 240, + 0, + 0, + 0}); + this.txtSaturation.Name = "txtSaturation"; + this.txtSaturation.Size = new System.Drawing.Size(61, 20); + this.txtSaturation.TabIndex = 1; + this.txtSaturation.Validated += new System.EventHandler(this.txtHSV_Validated); + // + // trackBar2 + // + this.trackBar2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar2.AutoSize = false; + this.trackBar2.Location = new System.Drawing.Point(137, 32); + this.trackBar2.Maximum = 255; + this.trackBar2.Name = "trackBar2"; + this.trackBar2.Size = new System.Drawing.Size(262, 20); + this.trackBar2.TabIndex = 2; + this.trackBar2.TickFrequency = 10; + this.trackBar2.TickStyle = System.Windows.Forms.TickStyle.None; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(6, 60); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(37, 13); + this.label2.TabIndex = 0; + this.label2.Text = "&Value:"; + // + // trackBar1 + // + this.trackBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar1.AutoSize = false; + this.trackBar1.Location = new System.Drawing.Point(137, 6); + this.trackBar1.Maximum = 255; + this.trackBar1.Name = "trackBar1"; + this.trackBar1.Size = new System.Drawing.Size(262, 20); + this.trackBar1.TabIndex = 2; + this.trackBar1.TickFrequency = 10; + this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.None; + // + // txtValue + // + this.txtValue.Location = new System.Drawing.Point(70, 58); + this.txtValue.Maximum = new decimal(new int[] { + 240, + 0, + 0, + 0}); + this.txtValue.Name = "txtValue"; + this.txtValue.Size = new System.Drawing.Size(61, 20); + this.txtValue.TabIndex = 1; + this.txtValue.Validated += new System.EventHandler(this.txtHSV_Validated); + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.sldBlue); + this.tabPage2.Controls.Add(this.txtRed); + this.tabPage2.Controls.Add(this.sldGreen); + this.tabPage2.Controls.Add(this.label3); + this.tabPage2.Controls.Add(this.sldRed); + this.tabPage2.Controls.Add(this.label4); + this.tabPage2.Controls.Add(this.txtBlue); + this.tabPage2.Controls.Add(this.txtGreen); + this.tabPage2.Controls.Add(this.label5); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(405, 117); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "RGB"; + // + // sldBlue + // + this.sldBlue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.sldBlue.AutoSize = false; + this.sldBlue.Location = new System.Drawing.Point(137, 58); + this.sldBlue.Maximum = 255; + this.sldBlue.Name = "sldBlue"; + this.sldBlue.Size = new System.Drawing.Size(262, 20); + this.sldBlue.TabIndex = 2; + this.sldBlue.TickFrequency = 10; + this.sldBlue.TickStyle = System.Windows.Forms.TickStyle.None; + this.sldBlue.Scroll += new System.EventHandler(this.sldRGB_Scroll); + // + // txtRed + // + this.txtRed.Location = new System.Drawing.Point(70, 6); + this.txtRed.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.txtRed.Name = "txtRed"; + this.txtRed.Size = new System.Drawing.Size(61, 20); + this.txtRed.TabIndex = 1; + this.txtRed.Validated += new System.EventHandler(this.txtRGB_Validated); + // + // sldGreen + // + this.sldGreen.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.sldGreen.AutoSize = false; + this.sldGreen.Location = new System.Drawing.Point(137, 32); + this.sldGreen.Maximum = 255; + this.sldGreen.Name = "sldGreen"; + this.sldGreen.Size = new System.Drawing.Size(262, 20); + this.sldGreen.TabIndex = 2; + this.sldGreen.TickFrequency = 10; + this.sldGreen.TickStyle = System.Windows.Forms.TickStyle.None; + this.sldGreen.Scroll += new System.EventHandler(this.sldRGB_Scroll); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(6, 8); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(30, 13); + this.label3.TabIndex = 0; + this.label3.Text = "&Red:"; + // + // sldRed + // + this.sldRed.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.sldRed.AutoSize = false; + this.sldRed.Location = new System.Drawing.Point(137, 6); + this.sldRed.Maximum = 255; + this.sldRed.Name = "sldRed"; + this.sldRed.Size = new System.Drawing.Size(262, 20); + this.sldRed.TabIndex = 2; + this.sldRed.TickFrequency = 10; + this.sldRed.TickStyle = System.Windows.Forms.TickStyle.None; + this.sldRed.Scroll += new System.EventHandler(this.sldRGB_Scroll); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(6, 34); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(39, 13); + this.label4.TabIndex = 0; + this.label4.Text = "&Green:"; + // + // txtBlue + // + this.txtBlue.Location = new System.Drawing.Point(70, 58); + this.txtBlue.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.txtBlue.Name = "txtBlue"; + this.txtBlue.Size = new System.Drawing.Size(61, 20); + this.txtBlue.TabIndex = 1; + this.txtBlue.Validated += new System.EventHandler(this.txtRGB_Validated); + // + // txtGreen + // + this.txtGreen.Location = new System.Drawing.Point(70, 32); + this.txtGreen.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.txtGreen.Name = "txtGreen"; + this.txtGreen.Size = new System.Drawing.Size(61, 20); + this.txtGreen.TabIndex = 1; + this.txtGreen.Validated += new System.EventHandler(this.txtRGB_Validated); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(6, 60); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(31, 13); + this.label5.TabIndex = 0; + this.label5.Text = "&Blue:"; + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.trackBar10); + this.tabPage3.Controls.Add(this.trackBar7); + this.tabPage3.Controls.Add(this.numericUpDown6); + this.tabPage3.Controls.Add(this.trackBar8); + this.tabPage3.Controls.Add(this.label6); + this.tabPage3.Controls.Add(this.trackBar9); + this.tabPage3.Controls.Add(this.label7); + this.tabPage3.Controls.Add(this.numericUpDown9); + this.tabPage3.Controls.Add(this.numericUpDown7); + this.tabPage3.Controls.Add(this.label9); + this.tabPage3.Controls.Add(this.numericUpDown8); + this.tabPage3.Controls.Add(this.label8); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Padding = new System.Windows.Forms.Padding(3); + this.tabPage3.Size = new System.Drawing.Size(405, 117); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "CMYK"; + // + // trackBar10 + // + this.trackBar10.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar10.AutoSize = false; + this.trackBar10.Location = new System.Drawing.Point(137, 84); + this.trackBar10.Maximum = 255; + this.trackBar10.Name = "trackBar10"; + this.trackBar10.Size = new System.Drawing.Size(262, 20); + this.trackBar10.TabIndex = 9; + this.trackBar10.TickFrequency = 10; + this.trackBar10.TickStyle = System.Windows.Forms.TickStyle.None; + // + // trackBar7 + // + this.trackBar7.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar7.AutoSize = false; + this.trackBar7.Location = new System.Drawing.Point(137, 58); + this.trackBar7.Maximum = 255; + this.trackBar7.Name = "trackBar7"; + this.trackBar7.Size = new System.Drawing.Size(262, 20); + this.trackBar7.TabIndex = 9; + this.trackBar7.TickFrequency = 10; + this.trackBar7.TickStyle = System.Windows.Forms.TickStyle.None; + // + // numericUpDown6 + // + this.numericUpDown6.Location = new System.Drawing.Point(70, 6); + this.numericUpDown6.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDown6.Name = "numericUpDown6"; + this.numericUpDown6.Size = new System.Drawing.Size(61, 20); + this.numericUpDown6.TabIndex = 6; + // + // trackBar8 + // + this.trackBar8.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar8.AutoSize = false; + this.trackBar8.Location = new System.Drawing.Point(137, 32); + this.trackBar8.Maximum = 255; + this.trackBar8.Name = "trackBar8"; + this.trackBar8.Size = new System.Drawing.Size(262, 20); + this.trackBar8.TabIndex = 10; + this.trackBar8.TickFrequency = 10; + this.trackBar8.TickStyle = System.Windows.Forms.TickStyle.None; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(6, 8); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(34, 13); + this.label6.TabIndex = 3; + this.label6.Text = "&Cyan:"; + // + // trackBar9 + // + this.trackBar9.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar9.AutoSize = false; + this.trackBar9.Location = new System.Drawing.Point(137, 6); + this.trackBar9.Maximum = 255; + this.trackBar9.Name = "trackBar9"; + this.trackBar9.Size = new System.Drawing.Size(262, 20); + this.trackBar9.TabIndex = 11; + this.trackBar9.TickFrequency = 10; + this.trackBar9.TickStyle = System.Windows.Forms.TickStyle.None; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(6, 34); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(52, 13); + this.label7.TabIndex = 4; + this.label7.Text = "&Magenta:"; + // + // numericUpDown9 + // + this.numericUpDown9.Location = new System.Drawing.Point(70, 84); + this.numericUpDown9.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDown9.Name = "numericUpDown9"; + this.numericUpDown9.Size = new System.Drawing.Size(61, 20); + this.numericUpDown9.TabIndex = 7; + // + // numericUpDown7 + // + this.numericUpDown7.Location = new System.Drawing.Point(70, 58); + this.numericUpDown7.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDown7.Name = "numericUpDown7"; + this.numericUpDown7.Size = new System.Drawing.Size(61, 20); + this.numericUpDown7.TabIndex = 7; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label9.Location = new System.Drawing.Point(6, 86); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(37, 13); + this.label9.TabIndex = 5; + this.label9.Text = "Blac&k:"; + // + // numericUpDown8 + // + this.numericUpDown8.Location = new System.Drawing.Point(70, 32); + this.numericUpDown8.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.numericUpDown8.Name = "numericUpDown8"; + this.numericUpDown8.Size = new System.Drawing.Size(61, 20); + this.numericUpDown8.TabIndex = 8; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label8.Location = new System.Drawing.Point(6, 60); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(41, 13); + this.label8.TabIndex = 5; + this.label8.Text = "&Yellow:"; + // + // fraAvailableColors + // + this.fraAvailableColors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraAvailableColors.Controls.Add(this.cmdClear); + this.fraAvailableColors.Controls.Add(this.cmdRemove); + this.fraAvailableColors.Controls.Add(this.cmdUpdate); + this.fraAvailableColors.Controls.Add(this.cmdAdd); + this.fraAvailableColors.Controls.Add(this.pal); + this.fraAvailableColors.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraAvailableColors.Location = new System.Drawing.Point(3, 177); + this.fraAvailableColors.Name = "fraAvailableColors"; + this.fraAvailableColors.Size = new System.Drawing.Size(506, 203); + this.fraAvailableColors.TabIndex = 1; + this.fraAvailableColors.TabStop = false; + this.fraAvailableColors.Text = "Available colors"; + // + // cmdClear + // + this.cmdClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClear.Location = new System.Drawing.Point(425, 19); + this.cmdClear.Name = "cmdClear"; + this.cmdClear.Size = new System.Drawing.Size(75, 23); + this.cmdClear.TabIndex = 1; + this.cmdClear.Text = "&Clear"; + this.cmdClear.UseVisualStyleBackColor = true; + // + // cmdRemove + // + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(168, 19); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(75, 23); + this.cmdRemove.TabIndex = 1; + this.cmdRemove.Text = "&Remove"; + this.cmdRemove.UseVisualStyleBackColor = true; + // + // cmdUpdate + // + this.cmdUpdate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdUpdate.Location = new System.Drawing.Point(87, 19); + this.cmdUpdate.Name = "cmdUpdate"; + this.cmdUpdate.Size = new System.Drawing.Size(75, 23); + this.cmdUpdate.TabIndex = 1; + this.cmdUpdate.Text = "&Update"; + this.cmdUpdate.UseVisualStyleBackColor = true; + // + // cmdAdd + // + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(6, 19); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(75, 23); + this.cmdAdd.TabIndex = 1; + this.cmdAdd.Text = "&Add"; + this.cmdAdd.UseVisualStyleBackColor = true; + // + // pal + // + this.pal.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pal.BackColor = System.Drawing.SystemColors.Window; + this.pal.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pal.Location = new System.Drawing.Point(6, 48); + this.pal.Name = "pal"; + this.pal.SelectedColor = null; + this.pal.SelectedIndex = 0; + this.pal.Size = new System.Drawing.Size(494, 149); + this.pal.TabIndex = 0; + this.pal.TileHeight = 32; + this.pal.TileWidth = 32; + this.pal.SelectionChanged += new System.EventHandler(this.pal_SelectionChanged); + // + // lblColorName + // + this.lblColorName.AutoSize = true; + this.lblColorName.Location = new System.Drawing.Point(16, 22); + this.lblColorName.Name = "lblColorName"; + this.lblColorName.Size = new System.Drawing.Size(38, 13); + this.lblColorName.TabIndex = 3; + this.lblColorName.Text = "&Name:"; + // + // txtColorName + // + this.txtColorName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtColorName.Location = new System.Drawing.Point(87, 19); + this.txtColorName.Name = "txtColorName"; + this.txtColorName.Size = new System.Drawing.Size(413, 20); + this.txtColorName.TabIndex = 4; + // + // PaletteEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraAvailableColors); + this.Controls.Add(this.fraColorEditor); + this.Name = "PaletteEditor"; + this.Size = new System.Drawing.Size(512, 383); + this.fraColorEditor.ResumeLayout(false); + this.fraColorEditor.PerformLayout(); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtHue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtSaturation)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtValue)).EndInit(); + this.tabPage2.ResumeLayout(false); + this.tabPage2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldBlue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtRed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.sldGreen)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.sldRed)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtBlue)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtGreen)).EndInit(); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar10)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar8)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown9)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown8)).EndInit(); + this.fraAvailableColors.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraColorEditor; + private System.Windows.Forms.NumericUpDown txtHue; + private System.Windows.Forms.Label lblHue; + private System.Windows.Forms.TrackBar trackBar1; + private System.Windows.Forms.NumericUpDown txtBlue; + private System.Windows.Forms.NumericUpDown txtValue; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.NumericUpDown txtGreen; + private System.Windows.Forms.NumericUpDown txtSaturation; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown txtRed; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TrackBar sldBlue; + private System.Windows.Forms.TrackBar sldGreen; + private System.Windows.Forms.TrackBar sldRed; + private System.Windows.Forms.TrackBar trackBar3; + private System.Windows.Forms.TrackBar trackBar2; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TrackBar trackBar10; + private System.Windows.Forms.TrackBar trackBar7; + private System.Windows.Forms.NumericUpDown numericUpDown6; + private System.Windows.Forms.TrackBar trackBar8; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TrackBar trackBar9; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.NumericUpDown numericUpDown9; + private System.Windows.Forms.NumericUpDown numericUpDown7; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.NumericUpDown numericUpDown8; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Button cmdColor; + private System.Windows.Forms.GroupBox fraAvailableColors; + private Controls.Multimedia.Palette.ColorListControl pal; + private System.Windows.Forms.Button cmdClear; + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdUpdate; + private System.Windows.Forms.Button cmdAdd; + private System.Windows.Forms.TextBox txtColorName; + private System.Windows.Forms.Label lblColorName; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.cs new file mode 100644 index 00000000..5ea87d1b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Multimedia.Palette; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Multimedia.Palette +{ + public partial class PaletteEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(PaletteObjectModel)); + } + return _er; + } + + public PaletteEditor() + { + InitializeComponent(); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + pal.Entries.Clear(); + + PaletteObjectModel palette = (ObjectModel as PaletteObjectModel); + if (palette == null) return; + + foreach (PaletteEntry color in palette.Entries) + { + pal.Entries.Add(color); + } + pal.Refresh(); + } + + private void pal_SelectionChanged(object sender, EventArgs e) + { + txtColorName.Text = String.Empty; + if (pal.SelectedColor == null) return; + + txtColorName.Text = pal.SelectedColor.Name; + + Color color = pal.SelectedColor.Color; + cmdColor.BackColor = color.ToGdiColor(); + txtHue.Value = (decimal)(cmdColor.BackColor.GetHue() % 239); + txtSaturation.Value = (decimal)(cmdColor.BackColor.GetSaturation() % 240); + txtSaturation.Value = (decimal)(cmdColor.BackColor.GetBrightness() % 240); + + txtRed.Value = (decimal)(color.Red * 255); + txtGreen.Value = (decimal)(color.Green * 255); + txtBlue.Value = (decimal)(color.Blue * 255); + } + + private void cmdColor_Click(object sender, EventArgs e) + { + if (pal.SelectedColor == null) return; + + Color color = pal.SelectedColor.Color; + ColorDialog dlg = new ColorDialog(); + dlg.Color = color.ToGdiColor(); + if (dlg.ShowDialog() == DialogResult.OK) + { + cmdColor.BackColor = dlg.Color; + pal.Entries[pal.SelectedIndex].Color = dlg.Color.ToUniversalColor(); + pal.Refresh(); + } + } + + private void txtHSV_Validated(object sender, EventArgs e) + { + + } + + private void txtRGB_Validated(object sender, EventArgs e) + { + sldRed.Value = (int)txtRed.Value; + sldGreen.Value = (int)txtGreen.Value; + sldBlue.Value = (int)txtBlue.Value; + + UpdateSelectedColor(); + } + + private void UpdateSelectedColor() + { + Color color = Color.FromRGBA((byte)txtRed.Value, (byte)txtGreen.Value, (byte)txtBlue.Value); + pal.Entries[pal.SelectedIndex].Color = color; + pal.Refresh(); + + cmdColor.BackColor = color.ToGdiColor(); + } + + private void sldRGB_Scroll(object sender, EventArgs e) + { + txtRed.Value = sldRed.Value; + txtGreen.Value = sldGreen.Value; + txtBlue.Value = sldBlue.Value; + + UpdateSelectedColor(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Palette/PaletteEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.Designer.cs new file mode 100644 index 00000000..9c78beb4 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.Designer.cs @@ -0,0 +1,547 @@ +namespace UniversalEditor.Editors.Multimedia.Picture.Collection +{ + partial class PictureCollectionEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lv = new AwesomeControls.ListView.ListViewControl(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.pic = new System.Windows.Forms.PictureBox(); + this.pnlTileView = new System.Windows.Forms.Panel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.fraExport = new System.Windows.Forms.GroupBox(); + this.cmdExportAll = new System.Windows.Forms.Button(); + this.cmdExportCurrent = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.cmdAnimatePlay = new System.Windows.Forms.Button(); + this.txtFrameDelay = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.label4 = new System.Windows.Forms.Label(); + this.txtEndFrame = new System.Windows.Forms.NumericUpDown(); + this.txtStartFrame = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.lblStartFrame = new System.Windows.Forms.Label(); + this.fraActions = new System.Windows.Forms.GroupBox(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdReplace = new System.Windows.Forms.Button(); + this.fraView = new System.Windows.Forms.GroupBox(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.optViewStretch = new System.Windows.Forms.RadioButton(); + this.optViewCenter = new System.Windows.Forms.RadioButton(); + this.optViewTile = new System.Windows.Forms.RadioButton(); + this.optViewZoom = new System.Windows.Forms.RadioButton(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic)).BeginInit(); + this.panel1.SuspendLayout(); + this.fraExport.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtFrameDelay)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtEndFrame)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtStartFrame)).BeginInit(); + this.fraActions.SuspendLayout(); + this.fraView.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + this.SuspendLayout(); + // + // lv + // + this.lv.AllowSorting = true; + this.lv.BackColor = System.Drawing.SystemColors.Window; + this.lv.DefaultItemHeight = 24; + this.lv.Dock = System.Windows.Forms.DockStyle.Fill; + this.lv.ForeColor = System.Drawing.SystemColors.WindowText; + this.lv.LargeImageList = null; + this.lv.Location = new System.Drawing.Point(0, 0); + this.lv.Mode = AwesomeControls.ListView.ListViewMode.LargeIcons; + this.lv.Name = "lv"; + this.lv.ShadeColor = System.Drawing.Color.WhiteSmoke; + this.lv.Size = new System.Drawing.Size(620, 167); + this.lv.SmallImageList = null; + this.lv.SortColumn = null; + this.lv.TabIndex = 0; + this.lv.ItemActivate += new System.EventHandler(this.lv_ItemActivate); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.pic); + this.splitContainer1.Panel1.Controls.Add(this.pnlTileView); + this.splitContainer1.Panel1.Controls.Add(this.panel1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.lv); + this.splitContainer1.Size = new System.Drawing.Size(620, 473); + this.splitContainer1.SplitterDistance = 302; + this.splitContainer1.TabIndex = 1; + // + // pic + // + this.pic.Dock = System.Windows.Forms.DockStyle.Fill; + this.pic.Location = new System.Drawing.Point(0, 161); + this.pic.Name = "pic"; + this.pic.Size = new System.Drawing.Size(620, 141); + this.pic.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pic.TabIndex = 0; + this.pic.TabStop = false; + // + // pnlTileView + // + this.pnlTileView.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlTileView.Location = new System.Drawing.Point(0, 161); + this.pnlTileView.Name = "pnlTileView"; + this.pnlTileView.Size = new System.Drawing.Size(620, 141); + this.pnlTileView.TabIndex = 5; + this.pnlTileView.Visible = false; + this.pnlTileView.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlTileView_Paint); + // + // panel1 + // + this.panel1.Controls.Add(this.fraExport); + this.panel1.Controls.Add(this.groupBox1); + this.panel1.Controls.Add(this.fraActions); + this.panel1.Controls.Add(this.fraView); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(620, 161); + this.panel1.TabIndex = 6; + // + // fraExport + // + this.fraExport.Controls.Add(this.cmdExportAll); + this.fraExport.Controls.Add(this.cmdExportCurrent); + this.fraExport.Location = new System.Drawing.Point(300, 3); + this.fraExport.Name = "fraExport"; + this.fraExport.Size = new System.Drawing.Size(317, 48); + this.fraExport.TabIndex = 6; + this.fraExport.TabStop = false; + this.fraExport.Text = "Export"; + // + // cmdExportAll + // + this.cmdExportAll.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExportAll.Location = new System.Drawing.Point(161, 19); + this.cmdExportAll.Name = "cmdExportAll"; + this.cmdExportAll.Size = new System.Drawing.Size(100, 23); + this.cmdExportAll.TabIndex = 3; + this.cmdExportAll.Text = "&All Frames"; + this.cmdExportAll.UseVisualStyleBackColor = true; + this.cmdExportAll.Click += new System.EventHandler(this.cmdExportAll_Click); + // + // cmdExportCurrent + // + this.cmdExportCurrent.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExportCurrent.Location = new System.Drawing.Point(55, 19); + this.cmdExportCurrent.Name = "cmdExportCurrent"; + this.cmdExportCurrent.Size = new System.Drawing.Size(100, 23); + this.cmdExportCurrent.TabIndex = 3; + this.cmdExportCurrent.Text = "&Current Frame"; + this.cmdExportCurrent.UseVisualStyleBackColor = true; + this.cmdExportCurrent.Click += new System.EventHandler(this.cmdExportCurrent_Click); + // + // groupBox1 + // + this.groupBox1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.groupBox1.Controls.Add(this.radioButton2); + this.groupBox1.Controls.Add(this.radioButton1); + this.groupBox1.Controls.Add(this.cmdAnimatePlay); + this.groupBox1.Controls.Add(this.txtFrameDelay); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.numericUpDown1); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.txtEndFrame); + this.groupBox1.Controls.Add(this.txtStartFrame); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.lblStartFrame); + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(300, 57); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(317, 96); + this.groupBox1.TabIndex = 5; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Animate"; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Checked = true; + this.radioButton2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton2.Location = new System.Drawing.Point(6, 71); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(91, 18); + this.radioButton2.TabIndex = 3; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "Frame delay:"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton1.Location = new System.Drawing.Point(6, 45); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(84, 18); + this.radioButton1.TabIndex = 3; + this.radioButton1.Text = "Frame rate:"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // cmdAnimatePlay + // + this.cmdAnimatePlay.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAnimatePlay.Location = new System.Drawing.Point(230, 68); + this.cmdAnimatePlay.Name = "cmdAnimatePlay"; + this.cmdAnimatePlay.Size = new System.Drawing.Size(75, 23); + this.cmdAnimatePlay.TabIndex = 2; + this.cmdAnimatePlay.Text = "&Play"; + this.cmdAnimatePlay.UseVisualStyleBackColor = true; + this.cmdAnimatePlay.Click += new System.EventHandler(this.cmdAnimatePlay_Click); + // + // txtFrameDelay + // + this.txtFrameDelay.Location = new System.Drawing.Point(97, 71); + this.txtFrameDelay.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.txtFrameDelay.Name = "txtFrameDelay"; + this.txtFrameDelay.Size = new System.Drawing.Size(55, 20); + this.txtFrameDelay.TabIndex = 1; + this.txtFrameDelay.Value = new decimal(new int[] { + 50, + 0, + 0, + 0}); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(158, 73); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(20, 13); + this.label5.TabIndex = 0; + this.label5.Text = "ms"; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(97, 45); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(55, 20); + this.numericUpDown1.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(158, 47); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(21, 13); + this.label4.TabIndex = 0; + this.label4.Text = "fps"; + // + // txtEndFrame + // + this.txtEndFrame.Location = new System.Drawing.Point(222, 19); + this.txtEndFrame.Name = "txtEndFrame"; + this.txtEndFrame.Size = new System.Drawing.Size(55, 20); + this.txtEndFrame.TabIndex = 1; + // + // txtStartFrame + // + this.txtStartFrame.Location = new System.Drawing.Point(97, 19); + this.txtStartFrame.Name = "txtStartFrame"; + this.txtStartFrame.Size = new System.Drawing.Size(55, 20); + this.txtStartFrame.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(158, 21); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 0; + this.label1.Text = "End frame:"; + // + // lblStartFrame + // + this.lblStartFrame.AutoSize = true; + this.lblStartFrame.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblStartFrame.Location = new System.Drawing.Point(30, 21); + this.lblStartFrame.Name = "lblStartFrame"; + this.lblStartFrame.Size = new System.Drawing.Size(61, 13); + this.lblStartFrame.TabIndex = 0; + this.lblStartFrame.Text = "Start frame:"; + // + // fraActions + // + this.fraActions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraActions.Controls.Add(this.cmdAdd); + this.fraActions.Controls.Add(this.cmdRemove); + this.fraActions.Controls.Add(this.cmdReplace); + this.fraActions.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraActions.Location = new System.Drawing.Point(3, 3); + this.fraActions.Name = "fraActions"; + this.fraActions.Size = new System.Drawing.Size(291, 48); + this.fraActions.TabIndex = 4; + this.fraActions.TabStop = false; + this.fraActions.Text = "Actions"; + // + // cmdAdd + // + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(27, 19); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(75, 23); + this.cmdAdd.TabIndex = 2; + this.cmdAdd.Text = "A&dd..."; + this.cmdAdd.UseVisualStyleBackColor = true; + // + // cmdRemove + // + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(108, 19); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(75, 23); + this.cmdRemove.TabIndex = 2; + this.cmdRemove.Text = "&Remove..."; + this.cmdRemove.UseVisualStyleBackColor = true; + // + // cmdReplace + // + this.cmdReplace.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdReplace.Location = new System.Drawing.Point(189, 19); + this.cmdReplace.Name = "cmdReplace"; + this.cmdReplace.Size = new System.Drawing.Size(75, 23); + this.cmdReplace.TabIndex = 2; + this.cmdReplace.Text = "Re&place..."; + this.cmdReplace.UseVisualStyleBackColor = true; + // + // fraView + // + this.fraView.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.fraView.Controls.Add(this.checkBox1); + this.fraView.Controls.Add(this.numericUpDown3); + this.fraView.Controls.Add(this.label3); + this.fraView.Controls.Add(this.label2); + this.fraView.Controls.Add(this.numericUpDown2); + this.fraView.Controls.Add(this.optViewStretch); + this.fraView.Controls.Add(this.optViewCenter); + this.fraView.Controls.Add(this.optViewTile); + this.fraView.Controls.Add(this.optViewZoom); + this.fraView.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraView.Location = new System.Drawing.Point(3, 57); + this.fraView.Name = "fraView"; + this.fraView.Size = new System.Drawing.Size(291, 96); + this.fraView.TabIndex = 3; + this.fraView.TabStop = false; + this.fraView.Text = "View"; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Checked = true; + this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.checkBox1.Location = new System.Drawing.Point(159, 51); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(115, 18); + this.checkBox1.TabIndex = 2; + this.checkBox1.Text = "Keep aspect &ratio"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // numericUpDown3 + // + this.numericUpDown3.Location = new System.Drawing.Point(88, 48); + this.numericUpDown3.Name = "numericUpDown3"; + this.numericUpDown3.Size = new System.Drawing.Size(55, 20); + this.numericUpDown3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(95, 71); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(38, 13); + this.label3.TabIndex = 0; + this.label3.Text = "&Height"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(34, 71); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(35, 13); + this.label2.TabIndex = 0; + this.label2.Text = "&Width"; + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(20, 48); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(55, 20); + this.numericUpDown2.TabIndex = 1; + // + // optViewStretch + // + this.optViewStretch.AutoSize = true; + this.optViewStretch.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optViewStretch.Location = new System.Drawing.Point(20, 19); + this.optViewStretch.Name = "optViewStretch"; + this.optViewStretch.Size = new System.Drawing.Size(65, 18); + this.optViewStretch.TabIndex = 1; + this.optViewStretch.Text = "&Stretch"; + this.optViewStretch.UseVisualStyleBackColor = true; + this.optViewStretch.CheckedChanged += new System.EventHandler(this.optView_CheckedChanged); + // + // optViewCenter + // + this.optViewCenter.AutoSize = true; + this.optViewCenter.Checked = true; + this.optViewCenter.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optViewCenter.Location = new System.Drawing.Point(91, 19); + this.optViewCenter.Name = "optViewCenter"; + this.optViewCenter.Size = new System.Drawing.Size(62, 18); + this.optViewCenter.TabIndex = 1; + this.optViewCenter.TabStop = true; + this.optViewCenter.Text = "&Center"; + this.optViewCenter.UseVisualStyleBackColor = true; + this.optViewCenter.CheckedChanged += new System.EventHandler(this.optView_CheckedChanged); + // + // optViewTile + // + this.optViewTile.AutoSize = true; + this.optViewTile.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optViewTile.Location = new System.Drawing.Point(223, 19); + this.optViewTile.Name = "optViewTile"; + this.optViewTile.Size = new System.Drawing.Size(48, 18); + this.optViewTile.TabIndex = 1; + this.optViewTile.Text = "&Tile"; + this.optViewTile.UseVisualStyleBackColor = true; + this.optViewTile.CheckedChanged += new System.EventHandler(this.optView_CheckedChanged); + // + // optViewZoom + // + this.optViewZoom.AutoSize = true; + this.optViewZoom.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optViewZoom.Location = new System.Drawing.Point(159, 19); + this.optViewZoom.Name = "optViewZoom"; + this.optViewZoom.Size = new System.Drawing.Size(58, 18); + this.optViewZoom.TabIndex = 1; + this.optViewZoom.Text = "&Zoom"; + this.optViewZoom.UseVisualStyleBackColor = true; + this.optViewZoom.CheckedChanged += new System.EventHandler(this.optView_CheckedChanged); + // + // PictureCollectionEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "PictureCollectionEditor"; + this.Size = new System.Drawing.Size(620, 473); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pic)).EndInit(); + this.panel1.ResumeLayout(false); + this.fraExport.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtFrameDelay)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtEndFrame)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtStartFrame)).EndInit(); + this.fraActions.ResumeLayout(false); + this.fraView.ResumeLayout(false); + this.fraView.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private AwesomeControls.ListView.ListViewControl lv; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.PictureBox pic; + private System.Windows.Forms.Panel pnlTileView; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox fraActions; + private System.Windows.Forms.Button cmdAdd; + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdReplace; + private System.Windows.Forms.GroupBox fraView; + private System.Windows.Forms.RadioButton optViewStretch; + private System.Windows.Forms.RadioButton optViewCenter; + private System.Windows.Forms.RadioButton optViewTile; + private System.Windows.Forms.RadioButton optViewZoom; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.NumericUpDown txtEndFrame; + private System.Windows.Forms.NumericUpDown txtStartFrame; + private System.Windows.Forms.Label lblStartFrame; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.NumericUpDown numericUpDown3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.Button cmdAnimatePlay; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.NumericUpDown txtFrameDelay; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button cmdExportCurrent; + private System.Windows.Forms.GroupBox fraExport; + private System.Windows.Forms.Button cmdExportAll; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.cs new file mode 100644 index 00000000..d94b89dc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface.WindowsForms; +using UniversalEditor.ObjectModels.Multimedia.Picture.Collection; +using UniversalEditor.ObjectModels.Multimedia.Picture; +using UniversalEditor.Accessors; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Editors.Multimedia.Picture.Collection +{ + public partial class PictureCollectionEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(PictureCollectionObjectModel)); + } + return _er; + } + + public PictureCollectionEditor() + { + InitializeComponent(); + } + + private void optView_CheckedChanged(object sender, EventArgs e) + { + if (optViewCenter.Checked) + { + pic.SizeMode = PictureBoxSizeMode.CenterImage; + pic.Visible = true; + pnlTileView.Visible = false; + } + else if (optViewStretch.Checked) + { + pic.SizeMode = PictureBoxSizeMode.StretchImage; + pic.Visible = true; + pnlTileView.Visible = false; + } + else if (optViewZoom.Checked) + { + pic.SizeMode = PictureBoxSizeMode.Zoom; + pic.Visible = true; + pnlTileView.Visible = false; + } + else if (optViewTile.Checked) + { + pic.Visible = false; + tex = new TextureBrush(pic.Image); + pnlTileView.Visible = true; + } + } + + private TextureBrush tex = null; + private void pnlTileView_Paint(object sender, PaintEventArgs e) + { + e.Graphics.FillRectangle(tex, 0, 0, pnlTileView.Width, pnlTileView.Height); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + PictureCollectionObjectModel pcom = (ObjectModel as PictureCollectionObjectModel); + if (pcom == null) return; + + txtStartFrame.Minimum = 0; + txtStartFrame.Maximum = pcom.Pictures.Count; + txtEndFrame.Minimum = 0; + txtEndFrame.Maximum = pcom.Pictures.Count; + + txtStartFrame.Value = txtStartFrame.Minimum; + txtEndFrame.Value = txtEndFrame.Maximum; + + lv.Items.Clear(); + foreach (PictureObjectModel pic in pcom.Pictures) + { + AwesomeControls.ListView.ListViewItem lvi = new AwesomeControls.ListView.ListViewItem(); + lvi.Data = pic; + lvi.Image = pic.ToBitmap(); + lv.Items.Add(lvi); + } + } + + private void lv_ItemActivate(object sender, EventArgs e) + { + PictureObjectModel picc = (lv.SelectedItems[0].Data as PictureObjectModel); + RenderPicture(picc); + } + + private int _frameDelay = 50; + private int _frameStart = 0; + private int _frameEnd = 0; + + private System.Threading.Thread tPlayThread = null; + private void tPlayThread_ThreadStart() + { + PictureCollectionObjectModel coll = (ObjectModel as PictureCollectionObjectModel); + for (int i = _frameStart; i <= _frameEnd; i++) + { + if (i >= 0 && i < coll.Pictures.Count) + { + PictureObjectModel picc = coll.Pictures[i]; + try + { + Invoke(new Action(RenderPicture), picc); + } + catch (InvalidOperationException ex) + { + } + System.Threading.Thread.Sleep(_frameDelay); + } + + if (i == _frameEnd) + { + i = _frameStart - 1; + } + + if (!IsHandleCreated) break; + } + } + + private PictureObjectModel mvarCurrentPicture = null; + + private void RenderPicture(PictureObjectModel picc) + { + mvarCurrentPicture = picc; + pic.Image = picc.ToBitmap(); + tex = new TextureBrush(pic.Image); + pnlTileView.Refresh(); + } + + private void cmdAnimatePlay_Click(object sender, EventArgs e) + { + if (tPlayThread != null) + { + tPlayThread.Abort(); + tPlayThread = null; + cmdAnimatePlay.Text = "&Play"; + return; + } + else + { + _frameDelay = (int)txtFrameDelay.Value; + _frameStart = (int)txtStartFrame.Value; + _frameEnd = (int)txtEndFrame.Value; + + cmdAnimatePlay.Text = "Sto&p"; + tPlayThread = new System.Threading.Thread(tPlayThread_ThreadStart); + tPlayThread.Start(); + } + } + + private void cmdExportCurrent_Click(object sender, EventArgs e) + { + SaveFileDialog sfd = new SaveFileDialog(); + sfd.Title = "Export Current Frame"; + + ObjectModelReference omr = mvarCurrentPicture.MakeReference(); + + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { ObjectModel = omr }); + sfd.Filter = UniversalEditor.UserInterface.WindowsForms.CommonDialog.GetCommonDialogFilter(assocs); + if (sfd.ShowDialog() == DialogResult.OK) + { + DataFormatReference[] dfrs = UniversalEditor.Common.Reflection.GetAvailableDataFormats(sfd.FileName); + if (dfrs.Length > 0) + { + DataFormat df = dfrs[0].Create(); + Document.Save(mvarCurrentPicture, df, new FileAccessor(sfd.FileName), true); + } + } + } + + private void cmdExportAll_Click(object sender, EventArgs e) + { + MessageBox.Show("Not implemented", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/Collection/PictureCollectionEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.Designer.cs new file mode 100644 index 00000000..356c7639 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.Designer.cs @@ -0,0 +1,46 @@ +namespace UniversalEditor.Editors.Multimedia.Picture +{ + partial class PictureEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // PictureEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "PictureEditor"; + this.Size = new System.Drawing.Size(532, 298); + this.ResumeLayout(false); + + } + + #endregion + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.cs new file mode 100644 index 00000000..4d6b5dfb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Multimedia.Picture; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Editors.Multimedia.Picture +{ + public partial class PictureEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(PictureObjectModel)); + } + return _er; + } + + public PictureEditor() + { + InitializeComponent(); + + Graphics g = Graphics.FromImage(_mTextureImage); + g.FillRectangle(Brushes.Gray, new Rectangle(0, 0, 8, 8)); + g.FillRectangle(Brushes.LightGray, new Rectangle(0, 8, 8, 8)); + g.FillRectangle(Brushes.Gray, new Rectangle(8, 8, 8, 8)); + g.FillRectangle(Brushes.LightGray, new Rectangle(8, 0, 8, 8)); + + _mTextureBrush = new TextureBrush(_mTextureImage); + } + + private Bitmap _mTextureImage = new Bitmap(16, 16); + private TextureBrush _mTextureBrush = null; + private Bitmap _mObjectToBitmap = null; + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + PictureObjectModel picObj = (base.ObjectModel as PictureObjectModel); + if (picObj == null) + { + _mObjectToBitmap = null; + } + else + { + _mObjectToBitmap = picObj.ToBitmap(); + } + Invalidate(); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + base.OnPaintBackground(e); + + PictureObjectModel picObj = (base.ObjectModel as PictureObjectModel); + if (picObj != null) + { + e.Graphics.FillRectangle(_mTextureBrush, new Rectangle(0, 0, picObj.Width, picObj.Height)); + } + } + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + if (_mObjectToBitmap != null) + { + e.Graphics.DrawImage(_mObjectToBitmap, 0, 0); + } + } + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Picture/PictureEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.Designer.cs new file mode 100644 index 00000000..1ef12a63 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.Designer.cs @@ -0,0 +1,371 @@ +namespace UniversalEditor.Editors.Multimedia.Subtitle +{ + partial class SubtitleEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lvEvents = new System.Windows.Forms.ListView(); + this.chEventActor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chEventStart = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chEventEnd = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chEventDuration = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chEventText = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraEvents = new System.Windows.Forms.GroupBox(); + this.cmdEventsClear = new System.Windows.Forms.Button(); + this.cmdEventsRemove = new System.Windows.Forms.Button(); + this.cmdEventsModify = new System.Windows.Forms.Button(); + this.cmdEventsAdd = new System.Windows.Forms.Button(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.fraStyles = new System.Windows.Forms.GroupBox(); + this.cmdStyleClear = new System.Windows.Forms.Button(); + this.cmdStyleAdd = new System.Windows.Forms.Button(); + this.cmdStyleModify = new System.Windows.Forms.Button(); + this.cmdStyleRemove = new System.Windows.Forms.Button(); + this.lvStyles = new System.Windows.Forms.ListView(); + this.chStyleName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraActors = new System.Windows.Forms.GroupBox(); + this.cmdActorClear = new System.Windows.Forms.Button(); + this.cmdActorAdd = new System.Windows.Forms.Button(); + this.cmdActorRemove = new System.Windows.Forms.Button(); + this.cmdActorModify = new System.Windows.Forms.Button(); + this.lvActors = new System.Windows.Forms.ListView(); + this.chActorName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraEvents.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.fraStyles.SuspendLayout(); + this.fraActors.SuspendLayout(); + this.SuspendLayout(); + // + // lvEvents + // + this.lvEvents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvEvents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chEventActor, + this.chEventStart, + this.chEventEnd, + this.chEventDuration, + this.chEventText}); + this.lvEvents.FullRowSelect = true; + this.lvEvents.GridLines = true; + this.lvEvents.HideSelection = false; + this.lvEvents.Location = new System.Drawing.Point(6, 48); + this.lvEvents.Name = "lvEvents"; + this.lvEvents.Size = new System.Drawing.Size(654, 118); + this.lvEvents.TabIndex = 0; + this.lvEvents.UseCompatibleStateImageBehavior = false; + this.lvEvents.View = System.Windows.Forms.View.Details; + // + // chEventActor + // + this.chEventActor.Text = "Actor"; + // + // chEventStart + // + this.chEventStart.Text = "Start"; + // + // chEventEnd + // + this.chEventEnd.Text = "End"; + // + // chEventDuration + // + this.chEventDuration.Text = "Duration"; + // + // chEventText + // + this.chEventText.Text = "Text"; + this.chEventText.Width = 403; + // + // fraEvents + // + this.tableLayoutPanel1.SetColumnSpan(this.fraEvents, 2); + this.fraEvents.Controls.Add(this.cmdEventsClear); + this.fraEvents.Controls.Add(this.cmdEventsRemove); + this.fraEvents.Controls.Add(this.cmdEventsModify); + this.fraEvents.Controls.Add(this.cmdEventsAdd); + this.fraEvents.Controls.Add(this.lvEvents); + this.fraEvents.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraEvents.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEvents.Location = new System.Drawing.Point(3, 180); + this.fraEvents.Name = "fraEvents"; + this.fraEvents.Size = new System.Drawing.Size(666, 172); + this.fraEvents.TabIndex = 1; + this.fraEvents.TabStop = false; + this.fraEvents.Text = "Events"; + // + // cmdEventsClear + // + this.cmdEventsClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdEventsClear.Location = new System.Drawing.Point(585, 19); + this.cmdEventsClear.Name = "cmdEventsClear"; + this.cmdEventsClear.Size = new System.Drawing.Size(75, 23); + this.cmdEventsClear.TabIndex = 1; + this.cmdEventsClear.Text = "Cl&ear"; + this.cmdEventsClear.UseVisualStyleBackColor = true; + // + // cmdEventsRemove + // + this.cmdEventsRemove.Location = new System.Drawing.Point(168, 19); + this.cmdEventsRemove.Name = "cmdEventsRemove"; + this.cmdEventsRemove.Size = new System.Drawing.Size(75, 23); + this.cmdEventsRemove.TabIndex = 1; + this.cmdEventsRemove.Text = "&Remove"; + this.cmdEventsRemove.UseVisualStyleBackColor = true; + // + // cmdEventsModify + // + this.cmdEventsModify.Location = new System.Drawing.Point(87, 19); + this.cmdEventsModify.Name = "cmdEventsModify"; + this.cmdEventsModify.Size = new System.Drawing.Size(75, 23); + this.cmdEventsModify.TabIndex = 1; + this.cmdEventsModify.Text = "&Modify..."; + this.cmdEventsModify.UseVisualStyleBackColor = true; + // + // cmdEventsAdd + // + this.cmdEventsAdd.Location = new System.Drawing.Point(6, 19); + this.cmdEventsAdd.Name = "cmdEventsAdd"; + this.cmdEventsAdd.Size = new System.Drawing.Size(75, 23); + this.cmdEventsAdd.TabIndex = 1; + this.cmdEventsAdd.Text = "&Add..."; + this.cmdEventsAdd.UseVisualStyleBackColor = true; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.fraEvents, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.fraStyles, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.fraActors, 1, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(672, 355); + this.tableLayoutPanel1.TabIndex = 2; + // + // fraStyles + // + this.fraStyles.Controls.Add(this.cmdStyleClear); + this.fraStyles.Controls.Add(this.cmdStyleAdd); + this.fraStyles.Controls.Add(this.cmdStyleModify); + this.fraStyles.Controls.Add(this.cmdStyleRemove); + this.fraStyles.Controls.Add(this.lvStyles); + this.fraStyles.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraStyles.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraStyles.Location = new System.Drawing.Point(3, 3); + this.fraStyles.Name = "fraStyles"; + this.fraStyles.Size = new System.Drawing.Size(330, 171); + this.fraStyles.TabIndex = 2; + this.fraStyles.TabStop = false; + this.fraStyles.Text = "Styles"; + // + // cmdStyleClear + // + this.cmdStyleClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdStyleClear.Location = new System.Drawing.Point(249, 19); + this.cmdStyleClear.Name = "cmdStyleClear"; + this.cmdStyleClear.Size = new System.Drawing.Size(75, 23); + this.cmdStyleClear.TabIndex = 1; + this.cmdStyleClear.Text = "Cl&ear"; + this.cmdStyleClear.UseVisualStyleBackColor = true; + // + // cmdStyleAdd + // + this.cmdStyleAdd.Location = new System.Drawing.Point(6, 19); + this.cmdStyleAdd.Name = "cmdStyleAdd"; + this.cmdStyleAdd.Size = new System.Drawing.Size(75, 23); + this.cmdStyleAdd.TabIndex = 1; + this.cmdStyleAdd.Text = "&Add..."; + this.cmdStyleAdd.UseVisualStyleBackColor = true; + // + // cmdStyleModify + // + this.cmdStyleModify.Location = new System.Drawing.Point(87, 19); + this.cmdStyleModify.Name = "cmdStyleModify"; + this.cmdStyleModify.Size = new System.Drawing.Size(75, 23); + this.cmdStyleModify.TabIndex = 1; + this.cmdStyleModify.Text = "&Modify..."; + this.cmdStyleModify.UseVisualStyleBackColor = true; + // + // cmdStyleRemove + // + this.cmdStyleRemove.Location = new System.Drawing.Point(168, 19); + this.cmdStyleRemove.Name = "cmdStyleRemove"; + this.cmdStyleRemove.Size = new System.Drawing.Size(75, 23); + this.cmdStyleRemove.TabIndex = 1; + this.cmdStyleRemove.Text = "&Remove"; + this.cmdStyleRemove.UseVisualStyleBackColor = true; + // + // lvStyles + // + this.lvStyles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvStyles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chStyleName}); + this.lvStyles.FullRowSelect = true; + this.lvStyles.GridLines = true; + this.lvStyles.HideSelection = false; + this.lvStyles.Location = new System.Drawing.Point(6, 48); + this.lvStyles.Name = "lvStyles"; + this.lvStyles.Size = new System.Drawing.Size(318, 117); + this.lvStyles.TabIndex = 0; + this.lvStyles.UseCompatibleStateImageBehavior = false; + this.lvStyles.View = System.Windows.Forms.View.Details; + // + // chStyleName + // + this.chStyleName.Text = "Name"; + this.chStyleName.Width = 304; + // + // fraActors + // + this.fraActors.Controls.Add(this.cmdActorClear); + this.fraActors.Controls.Add(this.cmdActorAdd); + this.fraActors.Controls.Add(this.cmdActorRemove); + this.fraActors.Controls.Add(this.cmdActorModify); + this.fraActors.Controls.Add(this.lvActors); + this.fraActors.Dock = System.Windows.Forms.DockStyle.Fill; + this.fraActors.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraActors.Location = new System.Drawing.Point(339, 3); + this.fraActors.Name = "fraActors"; + this.fraActors.Size = new System.Drawing.Size(330, 171); + this.fraActors.TabIndex = 2; + this.fraActors.TabStop = false; + this.fraActors.Text = "Actors"; + // + // cmdActorClear + // + this.cmdActorClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdActorClear.Location = new System.Drawing.Point(249, 19); + this.cmdActorClear.Name = "cmdActorClear"; + this.cmdActorClear.Size = new System.Drawing.Size(75, 23); + this.cmdActorClear.TabIndex = 1; + this.cmdActorClear.Text = "Cl&ear"; + this.cmdActorClear.UseVisualStyleBackColor = true; + // + // cmdActorAdd + // + this.cmdActorAdd.Location = new System.Drawing.Point(6, 19); + this.cmdActorAdd.Name = "cmdActorAdd"; + this.cmdActorAdd.Size = new System.Drawing.Size(75, 23); + this.cmdActorAdd.TabIndex = 1; + this.cmdActorAdd.Text = "&Add..."; + this.cmdActorAdd.UseVisualStyleBackColor = true; + // + // cmdActorRemove + // + this.cmdActorRemove.Location = new System.Drawing.Point(168, 19); + this.cmdActorRemove.Name = "cmdActorRemove"; + this.cmdActorRemove.Size = new System.Drawing.Size(75, 23); + this.cmdActorRemove.TabIndex = 1; + this.cmdActorRemove.Text = "&Remove"; + this.cmdActorRemove.UseVisualStyleBackColor = true; + // + // cmdActorModify + // + this.cmdActorModify.Location = new System.Drawing.Point(87, 19); + this.cmdActorModify.Name = "cmdActorModify"; + this.cmdActorModify.Size = new System.Drawing.Size(75, 23); + this.cmdActorModify.TabIndex = 1; + this.cmdActorModify.Text = "&Modify..."; + this.cmdActorModify.UseVisualStyleBackColor = true; + // + // lvActors + // + this.lvActors.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvActors.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chActorName}); + this.lvActors.FullRowSelect = true; + this.lvActors.GridLines = true; + this.lvActors.HideSelection = false; + this.lvActors.Location = new System.Drawing.Point(6, 48); + this.lvActors.Name = "lvActors"; + this.lvActors.Size = new System.Drawing.Size(318, 117); + this.lvActors.TabIndex = 0; + this.lvActors.UseCompatibleStateImageBehavior = false; + this.lvActors.View = System.Windows.Forms.View.Details; + // + // chActorName + // + this.chActorName.Text = "Name"; + this.chActorName.Width = 304; + // + // SubtitleEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tableLayoutPanel1); + this.MinimumSize = new System.Drawing.Size(672, 355); + this.Name = "SubtitleEditor"; + this.Size = new System.Drawing.Size(672, 355); + this.fraEvents.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.fraStyles.ResumeLayout(false); + this.fraActors.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListView lvEvents; + private System.Windows.Forms.ColumnHeader chEventActor; + private System.Windows.Forms.ColumnHeader chEventStart; + private System.Windows.Forms.ColumnHeader chEventEnd; + private System.Windows.Forms.ColumnHeader chEventDuration; + private System.Windows.Forms.ColumnHeader chEventText; + private System.Windows.Forms.GroupBox fraEvents; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.GroupBox fraStyles; + private System.Windows.Forms.GroupBox fraActors; + private System.Windows.Forms.Button cmdEventsClear; + private System.Windows.Forms.Button cmdEventsRemove; + private System.Windows.Forms.Button cmdEventsModify; + private System.Windows.Forms.Button cmdEventsAdd; + private System.Windows.Forms.Button cmdStyleClear; + private System.Windows.Forms.Button cmdStyleAdd; + private System.Windows.Forms.Button cmdStyleModify; + private System.Windows.Forms.Button cmdStyleRemove; + private System.Windows.Forms.Button cmdActorClear; + private System.Windows.Forms.Button cmdActorAdd; + private System.Windows.Forms.Button cmdActorRemove; + private System.Windows.Forms.Button cmdActorModify; + private System.Windows.Forms.ListView lvStyles; + private System.Windows.Forms.ColumnHeader chStyleName; + private System.Windows.Forms.ListView lvActors; + private System.Windows.Forms.ColumnHeader chActorName; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.cs new file mode 100644 index 00000000..963fb67e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.UserInterface.WindowsForms; +using UniversalEditor.ObjectModels.Multimedia.Subtitle; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Editors.Multimedia.Subtitle +{ + public partial class SubtitleEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(SubtitleObjectModel)); + } + return _er; + } + public SubtitleEditor() + { + InitializeComponent(); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + lvStyles.Items.Clear(); + lvActors.Items.Clear(); + lvEvents.Items.Clear(); + + SubtitleObjectModel subtitle = (ObjectModel as SubtitleObjectModel); + if (subtitle == null) return; + + foreach (Style style in subtitle.Styles) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = style.Name; + lvi.Tag = style; + lvStyles.Items.Add(lvi); + } + + foreach (Actor actor in subtitle.Actors) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = actor.Name; + lvi.Tag = actor; + lvStyles.Items.Add(lvi); + } + + foreach (Event evt in subtitle.Events) + { + ListViewItem lvi = new ListViewItem(); + if (evt.Actor != null) + { + lvi.Text = evt.Actor.Name; + } + lvi.SubItems.Add(evt.StartTimestamp.ToString()); + lvi.SubItems.Add(evt.EndTimestamp.ToString()); + lvi.SubItems.Add((evt.EndTimestamp - evt.StartTimestamp).ToString()); + lvi.SubItems.Add(evt.Text); + lvEvents.Items.Add(lvi); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/Subtitle/SubtitleEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.Designer.cs new file mode 100644 index 00000000..a0905500 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.Designer.cs @@ -0,0 +1,37 @@ +namespace UniversalEditor.Editors.Multimedia.VectorImage +{ + partial class VectorImageEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.cs new file mode 100644 index 00000000..70c79a38 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Editors/Multimedia/VectorImage/VectorImageEditor.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Multimedia.VectorImage; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Multimedia.VectorImage +{ + public partial class VectorImageEditor : Editor + { + public VectorImageEditor() + { + InitializeComponent(); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Vector Image"; + _er.SupportedObjectModels.Add(typeof(VectorImageObjectModel)); + } + return _er; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + VectorImageObjectModel vector = (ObjectModel as VectorImageObjectModel); + if (vector != null) + { + + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/MyCursors.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/MyCursors.cs new file mode 100644 index 00000000..1ca63138 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/MyCursors.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor +{ + internal static class MyCursors + { + private static Cursor mvarEraser = null; + public static Cursor Eraser + { + get + { + if (mvarEraser == null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(Properties.Resources.Eraser); + try + { + mvarEraser = new Cursor(ms); + } + catch + { + } + } + return mvarEraser; + } + } + private static Cursor mvarPen = null; + public static Cursor Pen + { + get + { + if (mvarPen == null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(Properties.Resources.Pen); + try + { + mvarPen = new Cursor(ms); + } + catch + { + } + } + return mvarPen; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.Designer.cs new file mode 100644 index 00000000..910c271a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.Designer.cs @@ -0,0 +1,382 @@ +namespace UniversalEditor.OptionPanels.Editors.Audio.Synthesized +{ + partial class EditorOptionPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraVSTiResolution = new System.Windows.Forms.GroupBox(); + this.lblVSTiResolutionDynamics = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.fraVibratoSettings = new System.Windows.Forms.GroupBox(); + this.comboBox6 = new System.Windows.Forms.ComboBox(); + this.label10 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.label6 = new System.Windows.Forms.Label(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.comboBox5 = new System.Windows.Forms.ComboBox(); + this.fraVSTiResolution.SuspendLayout(); + this.fraVibratoSettings.SuspendLayout(); + this.SuspendLayout(); + // + // fraVSTiResolution + // + this.fraVSTiResolution.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraVSTiResolution.Controls.Add(this.comboBox3); + this.fraVSTiResolution.Controls.Add(this.label2); + this.fraVSTiResolution.Controls.Add(this.comboBox2); + this.fraVSTiResolution.Controls.Add(this.label1); + this.fraVSTiResolution.Controls.Add(this.comboBox1); + this.fraVSTiResolution.Controls.Add(this.label5); + this.fraVSTiResolution.Controls.Add(this.label4); + this.fraVSTiResolution.Controls.Add(this.label3); + this.fraVSTiResolution.Controls.Add(this.lblVSTiResolutionDynamics); + this.fraVSTiResolution.Location = new System.Drawing.Point(3, 3); + this.fraVSTiResolution.Name = "fraVSTiResolution"; + this.fraVSTiResolution.Size = new System.Drawing.Size(342, 106); + this.fraVSTiResolution.TabIndex = 0; + this.fraVSTiResolution.TabStop = false; + this.fraVSTiResolution.Text = "VSTi Resolution"; + // + // lblVSTiResolutionDynamics + // + this.lblVSTiResolutionDynamics.AutoSize = true; + this.lblVSTiResolutionDynamics.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblVSTiResolutionDynamics.Location = new System.Drawing.Point(26, 22); + this.lblVSTiResolutionDynamics.Name = "lblVSTiResolutionDynamics"; + this.lblVSTiResolutionDynamics.Size = new System.Drawing.Size(56, 13); + this.lblVSTiResolutionDynamics.TabIndex = 0; + this.lblVSTiResolutionDynamics.Text = "Dy&namics:"; + // + // comboBox1 + // + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Items.AddRange(new object[] { + "1", + "2", + "4", + "8", + "16", + "30", + "60", + "90", + "120", + "240", + "480", + "Free"}); + this.comboBox1.Location = new System.Drawing.Point(164, 19); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(121, 21); + this.comboBox1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(26, 49); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(73, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Vibrato &depth:"; + // + // comboBox2 + // + this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Items.AddRange(new object[] { + "1", + "2", + "4", + "8", + "16", + "30", + "60", + "90", + "120", + "240", + "480", + "Free"}); + this.comboBox2.Location = new System.Drawing.Point(164, 46); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(121, 21); + this.comboBox2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(26, 76); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(64, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Vibrato &rate:"; + // + // comboBox3 + // + this.comboBox3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Items.AddRange(new object[] { + "1", + "2", + "4", + "8", + "16", + "30", + "60", + "90", + "120", + "240", + "480", + "Free"}); + this.comboBox3.Location = new System.Drawing.Point(164, 73); + this.comboBox3.Name = "comboBox3"; + this.comboBox3.Size = new System.Drawing.Size(121, 21); + this.comboBox3.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(291, 22); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(38, 13); + this.label3.TabIndex = 0; + this.label3.Text = "clocks"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(291, 49); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(38, 13); + this.label4.TabIndex = 0; + this.label4.Text = "clocks"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(291, 76); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(38, 13); + this.label5.TabIndex = 0; + this.label5.Text = "clocks"; + // + // fraVibratoSettings + // + this.fraVibratoSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraVibratoSettings.Controls.Add(this.checkBox1); + this.fraVibratoSettings.Controls.Add(this.comboBox5); + this.fraVibratoSettings.Controls.Add(this.comboBox4); + this.fraVibratoSettings.Controls.Add(this.label9); + this.fraVibratoSettings.Controls.Add(this.comboBox6); + this.fraVibratoSettings.Controls.Add(this.label6); + this.fraVibratoSettings.Controls.Add(this.label7); + this.fraVibratoSettings.Controls.Add(this.label10); + this.fraVibratoSettings.Controls.Add(this.label11); + this.fraVibratoSettings.Location = new System.Drawing.Point(3, 115); + this.fraVibratoSettings.Name = "fraVibratoSettings"; + this.fraVibratoSettings.Size = new System.Drawing.Size(342, 134); + this.fraVibratoSettings.TabIndex = 0; + this.fraVibratoSettings.TabStop = false; + this.fraVibratoSettings.Text = "Vibrato settings"; + // + // comboBox6 + // + this.comboBox6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox6.FormattingEnabled = true; + this.comboBox6.Items.AddRange(new object[] { + "50", + "66", + "75", + "100"}); + this.comboBox6.Location = new System.Drawing.Point(164, 19); + this.comboBox6.Name = "comboBox6"; + this.comboBox6.Size = new System.Drawing.Size(121, 21); + this.comboBox6.TabIndex = 1; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label10.Location = new System.Drawing.Point(291, 22); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(15, 13); + this.label10.TabIndex = 0; + this.label10.Text = "%"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label11.Location = new System.Drawing.Point(26, 22); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(111, 13); + this.label11.TabIndex = 0; + this.label11.Text = "Default vibrato &length:"; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.checkBox1.Location = new System.Drawing.Point(26, 46); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(149, 18); + this.checkBox1.TabIndex = 2; + this.checkBox1.Text = "&Enable automatic vibrato"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(47, 73); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(107, 13); + this.label6.TabIndex = 0; + this.label6.Text = "&Minimum note length:"; + // + // comboBox4 + // + this.comboBox4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Items.AddRange(new object[] { + "1", + "2", + "3", + "4"}); + this.comboBox4.Location = new System.Drawing.Point(164, 70); + this.comboBox4.Name = "comboBox4"; + this.comboBox4.Size = new System.Drawing.Size(121, 21); + this.comboBox4.TabIndex = 1; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(291, 73); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(39, 13); + this.label7.TabIndex = 0; + this.label7.Text = "beat(s)"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label9.Location = new System.Drawing.Point(47, 100); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(66, 13); + this.label9.TabIndex = 0; + this.label9.Text = "Vibrato &type:"; + // + // comboBox5 + // + this.comboBox5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox5.FormattingEnabled = true; + this.comboBox5.Items.AddRange(new object[] { + "[Normal] Type 1", + "[Normal] Type 2", + "[Normal] Type 3", + "[Normal] Type 4", + "[Extreme] Type 1", + "[Extreme] Type 2", + "[Extreme] Type 3", + "[Extreme] Type 4", + "[Fast] Type 1", + "[Fast] Type 2", + "[Fast] Type 3", + "[Fast] Type 4", + "[Slight] Type 1", + "[Slight] Type 2", + "[Slight] Type 3", + "[Slight] Type 4"}); + this.comboBox5.Location = new System.Drawing.Point(164, 97); + this.comboBox5.Name = "comboBox5"; + this.comboBox5.Size = new System.Drawing.Size(121, 21); + this.comboBox5.TabIndex = 1; + // + // EditorOptionPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraVibratoSettings); + this.Controls.Add(this.fraVSTiResolution); + this.MinimumSize = new System.Drawing.Size(348, 257); + this.Name = "EditorOptionPanel"; + this.Size = new System.Drawing.Size(348, 257); + this.fraVSTiResolution.ResumeLayout(false); + this.fraVSTiResolution.PerformLayout(); + this.fraVibratoSettings.ResumeLayout(false); + this.fraVibratoSettings.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraVSTiResolution; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label lblVSTiResolutionDynamics; + private System.Windows.Forms.GroupBox fraVibratoSettings; + private System.Windows.Forms.ComboBox comboBox6; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.ComboBox comboBox5; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.cs new file mode 100644 index 00000000..dc840ec3 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.OptionPanels.Editors.Audio.Synthesized +{ + public partial class EditorOptionPanel : OptionPanel + { + public EditorOptionPanel() + { + InitializeComponent(); + } + + private string[] mvarOptionGroups = new string[] { "Editors", "Synthesized Audio" }; + public override string[] OptionGroups { get { return mvarOptionGroups; } } + + public override bool IsAvailable { get { return true; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.layout b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.layout new file mode 100644 index 00000000..3749b777 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.layout @@ -0,0 +1,182 @@ + + + + + + + + Editors + Synthesized Audio + + + + + + +
+ + + + + + + 1 + 2 + 4 + 8 + 16 + 30 + 60 + 90 + 120 + 240 + 480 + Free + + + + + + + + + + + + + 1 + 2 + 4 + 8 + 16 + 30 + 60 + 90 + 120 + 240 + 480 + Free + + + + + + + + + + + + + 1 + 2 + 4 + 8 + 16 + 30 + 60 + 90 + 120 + 240 + 480 + Free + + + + + + +
+ + + + + + + + + + + + + + 50 + 66 + 75 + 100 + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + + + + + + + + + + + + + [Normal] Type 1 + [Normal] Type 2 + [Normal] Type 3 + [Normal] Type 4 + [Extreme] Type 1 + [Extreme] Type 2 + [Extreme] Type 3 + [Extreme] Type 4 + [Fast] Type 1 + [Fast] Type 2 + [Fast] Type 3 + [Fast] Type 4 + [Slight] Type 1 + [Slight] Type 2 + [Slight] Type 3 + [Slight] Type 4 + + + + + + + +
+
+
+
+ +
+
+
+
diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/EditorOptionPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/ExternalProgramsOptionPanel.layout b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/ExternalProgramsOptionPanel.layout new file mode 100644 index 00000000..85d6c84c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/ExternalProgramsOptionPanel.layout @@ -0,0 +1,63 @@ + + + + + + + + Editors + Synthesized Audio + External Programs + + + + + + + + + + + + + + + +
+
+
+
+
diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/MIDIOptionPanel.layout b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/MIDIOptionPanel.layout new file mode 100644 index 00000000..c8424be8 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/MIDIOptionPanel.layout @@ -0,0 +1,57 @@ + + + + + + + + Editors + Synthesized Audio + MIDI Settings + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+
+
+
diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/PhonemeDictionaryOptionPanel.layout b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/PhonemeDictionaryOptionPanel.layout new file mode 100644 index 00000000..d6c23dfa --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/PhonemeDictionaryOptionPanel.layout @@ -0,0 +1,45 @@ + + + + + + + + Editors + Synthesized Audio + Phoneme Dictionary + + + + + + +
+
+
+
+
+
diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SingingStyleDefaultsOptionPanel.layout b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SingingStyleDefaultsOptionPanel.layout new file mode 100644 index 00000000..de6eab6b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SingingStyleDefaultsOptionPanel.layout @@ -0,0 +1,123 @@ + + + + + + + + Editors + Synthesized Audio + Singing Style Defaults + + + + + + + + + + (custom) + normal + accent + strong accent + legato + slow legato + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SynthesizersOptionPanel.layout b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SynthesizersOptionPanel.layout new file mode 100644 index 00000000..cff5d496 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/OptionPanels/Editors/Audio/Synthesized/SynthesizersOptionPanel.layout @@ -0,0 +1,49 @@ + + + + + + + + Editors + Synthesized Audio + Synthesizers + + + + + + +
+
+
+
+
+
diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..7532148f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Multimedia plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2012-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e30fe85c-05bb-4446-b8b3-b9869a7a3b2d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.Designer.cs new file mode 100644 index 00000000..ea2b0f1a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17929 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] Eraser { + get { + object obj = ResourceManager.GetObject("Eraser", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] Pen { + get { + object obj = ResourceManager.GetObject("Pen", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.resx new file mode 100644 index 00000000..a1bb83df --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Eraser.cur;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\Pen.cur;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Resources/Eraser.cur b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/Resources/Eraser.cur new file mode 100644 index 0000000000000000000000000000000000000000..cca9db50a11221b96b30cbadb4aae91a7e0b1456 GIT binary patch literal 4286 zcmeH`F%H5&5Ca`3C@7$!B_+RrpONSAj68)WP*Na_4{ilQxq@P;ywb)>RysSQTVRF` zeGlmpr!}wvuv6<34r)#H1P0AqCSU?4U;-v!0w!PrCQu1b+UjgbY}H4m%nU92Cyz3$ zIkGau`I8#qvNMFww-(N*Kj8@+IgIG3vO*NNaiD#1No6}qq$*e2 zt%$@D$uJ18lGC@y4^|s+0Jk9CVieiqT|h`6BoGn^34{cgK%VF7ISJ}}^N?kk623gd zaqRRxdT{#Oe^phQB#Ct`wD0>l1Lk3T9%t>x!oyj3NV~ad8q*A-D0$O zzH2})ZQGh=kf!M}0&1J;zt(_etUa**EW!Q^50+TUyEW@#X#iSImox974}EI$-+-8U zvS|jdJ&ArmOK8`1a~;aEwASZdUG3|-{+PDg;2XmZ-;UrKY{9RIytPO00RDn!@IvlX QujHtDBiE{b6YrzyKZP(?Gynhq literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..c7e56ef5 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms.csproj @@ -0,0 +1,271 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {D8E59ADD-B591-49AF-B18E-6E0D4581700C} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.Multimedia.UserInterface.WindowsForms + v3.5 + 512 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + UserControl + + + PianoRollControl.cs + + + + + UserControl + + + WaveformTrackListControl.cs + + + UserControl + + + ColorListControl.cs + + + Form + + + NoteExpressionProperty.cs + + + Form + + + ProgressDialog.cs + + + Form + + + SynthesizerPropertiesDialog.cs + + + Form + + + VoicebankEditorDialog.cs + + + Form + + + ToolSettingsDialog.cs + + + Form + + + PlaylistEntryPropertiesDialog.cs + + + UserControl + + + SynthesizedAudioEditor.cs + + + UserControl + + + VoicebankEditor.cs + + + UserControl + + + VoicebankIndexEditor.cs + + + UserControl + + + WaveformAudioEditor.cs + + + UserControl + + + PaletteEditor.cs + + + UserControl + + + PictureCollectionEditor.cs + + + UserControl + + + PictureEditor.cs + + + UserControl + + + SubtitleEditor.cs + + + UserControl + + + VectorImageEditor.cs + + + + UserControl + + + EditorOptionPanel.cs + + + + True + True + Resources.resx + + + + + WaveformTrackListControl.cs + + + ColorListControl.cs + + + NoteExpressionProperty.cs + + + ProgressDialog.cs + + + VoicebankEditorDialog.cs + + + PlaylistEntryPropertiesDialog.cs + + + SynthesizedAudioEditor.cs + + + VoicebankEditor.cs + + + VoicebankIndexEditor.cs + + + WaveformAudioEditor.cs + + + PaletteEditor.cs + + + PictureCollectionEditor.cs + + + PictureEditor.cs + + + SubtitleEditor.cs + + + + EditorOptionPanel.cs + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + {E0897B7B-617A-4709-A4C6-FC0F6B441B2A} + Surodoine + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33} + UniversalEditor.Plugins.Multimedia.Binders.GdiPlus + + + {BE4D0BA3-0888-42A5-9C09-FC308A4509D2} + UniversalEditor.Plugins.Multimedia + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.Designer.cs new file mode 100644 index 00000000..b2f8f929 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.Designer.cs @@ -0,0 +1,320 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Dialogs +{ + partial class TexturePropertiesDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.txtTextureFileName = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.chkFlagAddMap = new System.Windows.Forms.CheckBox(); + this.chkFlagMap = new System.Windows.Forms.CheckBox(); + this.chkFlagTexture = new System.Windows.Forms.CheckBox(); + this.fraTextureFileName = new System.Windows.Forms.GroupBox(); + this.cmdClearTexture = new System.Windows.Forms.Button(); + this.cmdSelectTexture = new System.Windows.Forms.Button(); + this.fraMapFileName = new System.Windows.Forms.GroupBox(); + this.cmdClearMap = new System.Windows.Forms.Button(); + this.cmdSelectMap = new System.Windows.Forms.Button(); + this.txtMapFileName = new System.Windows.Forms.TextBox(); + this.fraDuration = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtDuration = new System.Windows.Forms.NumericUpDown(); + this.groupBox1.SuspendLayout(); + this.fraTextureFileName.SuspendLayout(); + this.fraMapFileName.SuspendLayout(); + this.fraDuration.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtDuration)).BeginInit(); + this.SuspendLayout(); + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(308, 194); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 4; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(227, 194); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 3; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // txtTextureFileName + // + this.txtTextureFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtTextureFileName.Location = new System.Drawing.Point(6, 21); + this.txtTextureFileName.Name = "txtTextureFileName"; + this.txtTextureFileName.ReadOnly = true; + this.txtTextureFileName.Size = new System.Drawing.Size(247, 20); + this.txtTextureFileName.TabIndex = 0; + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.chkFlagAddMap); + this.groupBox1.Controls.Add(this.chkFlagMap); + this.groupBox1.Controls.Add(this.chkFlagTexture); + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(12, 128); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(224, 55); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Flags"; + // + // chkFlagAddMap + // + this.chkFlagAddMap.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.chkFlagAddMap.AutoSize = true; + this.chkFlagAddMap.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkFlagAddMap.Location = new System.Drawing.Point(140, 19); + this.chkFlagAddMap.Name = "chkFlagAddMap"; + this.chkFlagAddMap.Size = new System.Drawing.Size(72, 18); + this.chkFlagAddMap.TabIndex = 2; + this.chkFlagAddMap.Text = "&AddMap"; + this.chkFlagAddMap.UseVisualStyleBackColor = true; + // + // chkFlagMap + // + this.chkFlagMap.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.chkFlagMap.AutoSize = true; + this.chkFlagMap.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkFlagMap.Location = new System.Drawing.Point(87, 19); + this.chkFlagMap.Name = "chkFlagMap"; + this.chkFlagMap.Size = new System.Drawing.Size(53, 18); + this.chkFlagMap.TabIndex = 1; + this.chkFlagMap.Text = "&Map"; + this.chkFlagMap.UseVisualStyleBackColor = true; + // + // chkFlagTexture + // + this.chkFlagTexture.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.chkFlagTexture.AutoSize = true; + this.chkFlagTexture.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkFlagTexture.Location = new System.Drawing.Point(19, 19); + this.chkFlagTexture.Name = "chkFlagTexture"; + this.chkFlagTexture.Size = new System.Drawing.Size(68, 18); + this.chkFlagTexture.TabIndex = 0; + this.chkFlagTexture.Text = "&Texture"; + this.chkFlagTexture.UseVisualStyleBackColor = true; + // + // fraTextureFileName + // + this.fraTextureFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraTextureFileName.Controls.Add(this.cmdClearTexture); + this.fraTextureFileName.Controls.Add(this.cmdSelectTexture); + this.fraTextureFileName.Controls.Add(this.txtTextureFileName); + this.fraTextureFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraTextureFileName.Location = new System.Drawing.Point(12, 12); + this.fraTextureFileName.Name = "fraTextureFileName"; + this.fraTextureFileName.Size = new System.Drawing.Size(371, 52); + this.fraTextureFileName.TabIndex = 0; + this.fraTextureFileName.TabStop = false; + this.fraTextureFileName.Text = "Texture filename"; + // + // cmdClearTexture + // + this.cmdClearTexture.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClearTexture.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClearTexture.Location = new System.Drawing.Point(315, 19); + this.cmdClearTexture.Name = "cmdClearTexture"; + this.cmdClearTexture.Size = new System.Drawing.Size(50, 23); + this.cmdClearTexture.TabIndex = 2; + this.cmdClearTexture.Text = "&Clear"; + this.cmdClearTexture.UseVisualStyleBackColor = true; + this.cmdClearTexture.Click += new System.EventHandler(this.cmdClear_Click); + // + // cmdSelectTexture + // + this.cmdSelectTexture.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdSelectTexture.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdSelectTexture.Location = new System.Drawing.Point(259, 19); + this.cmdSelectTexture.Name = "cmdSelectTexture"; + this.cmdSelectTexture.Size = new System.Drawing.Size(50, 23); + this.cmdSelectTexture.TabIndex = 1; + this.cmdSelectTexture.Text = "&Select"; + this.cmdSelectTexture.UseVisualStyleBackColor = true; + this.cmdSelectTexture.Click += new System.EventHandler(this.cmdSelect_Click); + // + // fraMapFileName + // + this.fraMapFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraMapFileName.Controls.Add(this.cmdClearMap); + this.fraMapFileName.Controls.Add(this.cmdSelectMap); + this.fraMapFileName.Controls.Add(this.txtMapFileName); + this.fraMapFileName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraMapFileName.Location = new System.Drawing.Point(12, 70); + this.fraMapFileName.Name = "fraMapFileName"; + this.fraMapFileName.Size = new System.Drawing.Size(371, 52); + this.fraMapFileName.TabIndex = 1; + this.fraMapFileName.TabStop = false; + this.fraMapFileName.Text = "Map filename"; + // + // cmdClearMap + // + this.cmdClearMap.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClearMap.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClearMap.Location = new System.Drawing.Point(315, 19); + this.cmdClearMap.Name = "cmdClearMap"; + this.cmdClearMap.Size = new System.Drawing.Size(50, 23); + this.cmdClearMap.TabIndex = 2; + this.cmdClearMap.Text = "&Clear"; + this.cmdClearMap.UseVisualStyleBackColor = true; + this.cmdClearMap.Click += new System.EventHandler(this.cmdClear_Click); + // + // cmdSelectMap + // + this.cmdSelectMap.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdSelectMap.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdSelectMap.Location = new System.Drawing.Point(259, 19); + this.cmdSelectMap.Name = "cmdSelectMap"; + this.cmdSelectMap.Size = new System.Drawing.Size(50, 23); + this.cmdSelectMap.TabIndex = 1; + this.cmdSelectMap.Text = "&Select"; + this.cmdSelectMap.UseVisualStyleBackColor = true; + this.cmdSelectMap.Click += new System.EventHandler(this.cmdSelect_Click); + // + // txtMapFileName + // + this.txtMapFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMapFileName.Location = new System.Drawing.Point(6, 21); + this.txtMapFileName.Name = "txtMapFileName"; + this.txtMapFileName.ReadOnly = true; + this.txtMapFileName.Size = new System.Drawing.Size(247, 20); + this.txtMapFileName.TabIndex = 0; + // + // fraDuration + // + this.fraDuration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.fraDuration.Controls.Add(this.label1); + this.fraDuration.Controls.Add(this.txtDuration); + this.fraDuration.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraDuration.Location = new System.Drawing.Point(242, 128); + this.fraDuration.Name = "fraDuration"; + this.fraDuration.Size = new System.Drawing.Size(141, 55); + this.fraDuration.TabIndex = 2; + this.fraDuration.TabStop = false; + this.fraDuration.Text = "Duration"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(115, 21); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(20, 13); + this.label1.TabIndex = 1; + this.label1.Text = "ms"; + // + // txtDuration + // + this.txtDuration.Location = new System.Drawing.Point(6, 19); + this.txtDuration.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.txtDuration.Name = "txtDuration"; + this.txtDuration.Size = new System.Drawing.Size(103, 20); + this.txtDuration.TabIndex = 0; + this.txtDuration.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + // + // TexturePropertiesDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(395, 229); + this.Controls.Add(this.fraMapFileName); + this.Controls.Add(this.fraTextureFileName); + this.Controls.Add(this.fraDuration); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "TexturePropertiesDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Texture Properties"; + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.fraTextureFileName.ResumeLayout(false); + this.fraTextureFileName.PerformLayout(); + this.fraMapFileName.ResumeLayout(false); + this.fraMapFileName.PerformLayout(); + this.fraDuration.ResumeLayout(false); + this.fraDuration.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtDuration)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtTextureFileName; + private System.Windows.Forms.GroupBox groupBox1; + internal System.Windows.Forms.CheckBox chkFlagAddMap; + internal System.Windows.Forms.CheckBox chkFlagMap; + internal System.Windows.Forms.CheckBox chkFlagTexture; + private System.Windows.Forms.GroupBox fraTextureFileName; + private System.Windows.Forms.Button cmdClearTexture; + private System.Windows.Forms.Button cmdSelectTexture; + private System.Windows.Forms.GroupBox fraMapFileName; + private System.Windows.Forms.Button cmdClearMap; + private System.Windows.Forms.Button cmdSelectMap; + internal System.Windows.Forms.TextBox txtMapFileName; + private System.Windows.Forms.GroupBox fraDuration; + private System.Windows.Forms.Label label1; + internal System.Windows.Forms.NumericUpDown txtDuration; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.cs new file mode 100644 index 00000000..c3d1b364 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.Multimedia3D.Model; + +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Dialogs +{ + public partial class TexturePropertiesDialog : Form + { + public TexturePropertiesDialog() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + internal ModelObjectModel ParentModel = null; + + private void cmdSelect_Click(object sender, EventArgs e) + { + OpenFileDialog ofd = new OpenFileDialog(); + if (sender == cmdSelectTexture) + { + if (!String.IsNullOrEmpty(txtTextureFileName.Text) && System.IO.File.Exists(txtTextureFileName.Text)) + { + ofd.FileName = txtTextureFileName.Text; + } + } + else if (sender == cmdSelectMap) + { + if (!String.IsNullOrEmpty(txtMapFileName.Text) && System.IO.File.Exists(txtMapFileName.Text)) + { + ofd.FileName = txtMapFileName.Text; + } + } + + if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + string path = String.Empty; + if (ParentModel.Accessor is FileAccessor) + { + path = System.IO.Path.GetDirectoryName((ParentModel.Accessor as FileAccessor).FileName); + } + + if (sender == cmdSelectTexture) + { + txtTextureFileName.Text = Common.Path.MakeRelativePath(ofd.FileName, path); + } + else if (sender == cmdSelectMap) + { + txtMapFileName.Text = Common.Path.MakeRelativePath(ofd.FileName, path); + } + } + } + + private void cmdClear_Click(object sender, EventArgs e) + { + if (sender == cmdClearTexture) + { + txtTextureFileName.Text = String.Empty; + } + else if (sender == cmdClearMap) + { + txtMapFileName.Text = String.Empty; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Dialogs/TexturePropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.cs new file mode 100644 index 00000000..559e93e0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.cs @@ -0,0 +1,431 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Multimedia3D.Model; +using UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Dialogs; + +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors +{ + public partial class ModelEditor : Editor + { + public ModelEditor() + { + InitializeComponent(); + + base.SupportedObjectModels.Add(typeof(ModelObjectModel)); + + // cboMaterialToon.SelectedIndex = 0; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + Refresh(); + } + public override void Refresh() + { + base.Refresh(); + + tv.Nodes["nodeBones"].Nodes.Clear(); + tv.Nodes["nodeMaterials"].Nodes.Clear(); + + ModelObjectModel model = (ObjectModel as ModelObjectModel); + if (model == null) + { + return; + } + + foreach (ModelBoneGroup group in model.BoneGroups) + { + TreeNode tnGroup = new TreeNode(); + tnGroup.Text = group.Name; + tnGroup.Tag = group; + foreach (ModelBone bone in group.Bones) + { + TreeNode tnBon = new TreeNode(); + tnBon.Text = bone.Name; + tnBon.Tag = bone; + tnGroup.Nodes.Add(tnBon); + } + tv.Nodes["nodeBones"].Nodes.Add(tnGroup); + } + + foreach (ModelMaterial mat in model.Materials) + { + TreeNode tnMat = new TreeNode(); + tnMat.Text = mat.Name; + tnMat.Tag = mat; + tv.Nodes["nodeMaterials"].Nodes.Add(tnMat); + } + } + + private void cmdColor_Click(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + ColorDialog dlg = new ColorDialog(); + if (sender == cmdColorAmbient || sender == pnlColorAmbient) + { + dlg.Color = mat.AmbientColor; + } + else if (sender == cmdColorDiffuse || sender == pnlColorDiffuse) + { + dlg.Color = mat.DiffuseColor; + } + else if (sender == cmdColorSpecular || sender == pnlColorSpecular) + { + dlg.Color = mat.SpecularColor; + } + else if (sender == cmdColorEmissive || sender == pnlColorEmissive) + { + dlg.Color = mat.EmissiveColor; + } + else if (sender == cmdColorEdge || sender == pnlColorEdge) + { + dlg.Color = mat.EdgeColor; + } + if (dlg.ShowDialog() == DialogResult.OK) + { + if (sender == cmdColorAmbient || sender == pnlColorAmbient) + { + pnlColorAmbient.BackColor = dlg.Color; + mat.AmbientColor = dlg.Color; + } + else if (sender == cmdColorDiffuse || sender == pnlColorDiffuse) + { + pnlColorDiffuse.BackColor = dlg.Color; + mat.DiffuseColor = dlg.Color; + } + else if (sender == cmdColorSpecular || sender == pnlColorSpecular) + { + pnlColorSpecular.BackColor = dlg.Color; + mat.SpecularColor = dlg.Color; + } + else if (sender == cmdColorEmissive || sender == pnlColorEmissive) + { + pnlColorEmissive.BackColor = dlg.Color; + mat.EmissiveColor = dlg.Color; + } + else if (sender == cmdColorEdge || sender == pnlColorEdge) + { + pnlColorEdge.BackColor = dlg.Color; + mat.EdgeColor = dlg.Color; + } + } + } + + private void SwitchPanel(Panel panel) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (ctl == panel) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (tv.SelectedNode != null) + { + if (tv.SelectedNode.Tag is ModelMaterial) + { + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + txtMaterialName.Text = mat.Name; + + pnlColorAmbient.BackColor = mat.AmbientColor; + pnlColorDiffuse.BackColor = mat.DiffuseColor; + pnlColorSpecular.BackColor = mat.SpecularColor; + pnlColorEmissive.BackColor = mat.EmissiveColor; + pnlColorEdge.BackColor = mat.EdgeColor; + + chkMaterialEnableAnimation.Checked = mat.EnableAnimation; + chkMaterialEnableLightSource.Checked = mat.EnableLightSource; + chkMaterialEnableGlow.Checked = mat.EnableGlow; + + lvTextures.Items.Clear(); + foreach (ModelTexture tex in mat.Textures) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = tex; + lvi.Text = tex.TextureFileName; + lvi.SubItems.Add(tex.MapFileName); + lvi.SubItems.Add(tex.Duration.ToString() + " ms"); + lvTextures.Items.Add(lvi); + } + cmdTextureClear.Enabled = (lvTextures.Items.Count > 0); + + sldEdgeThickness.Value = (int)(mat.EdgeSize * 100); + txtEdgeThickness.Text = mat.EdgeSize.ToString(); + SwitchPanel(pnlMaterialsMaterial); + } + else if (tv.SelectedNode.Tag is ModelBone) + { + ModelBone bon = (tv.SelectedNode.Tag as ModelBone); + txtBoneName.Text = bon.Name; + cboBoneType.SelectedIndex = (int)(bon.BoneType + 1); + + SwitchPanel(pnlBonesBone); + } + else if (tv.SelectedNode.Tag is ModelBoneGroup) + { + ModelBoneGroup grp = (tv.SelectedNode.Tag as ModelBoneGroup); + txtGroupName.Text = grp.Name; + + SwitchPanel(pnlBonesGroup); + } + else + { + SwitchPanel(null); + } + } + else + { + SwitchPanel(null); + } + } + + private void pnlColorEdge_Paint(object sender, PaintEventArgs e) + { + + } + + private void txtEdgeThickness_Validating(object sender, CancelEventArgs e) + { + float dummy = 0.0f; + if (!Single.TryParse(txtEdgeThickness.Text, out dummy)) + { + MessageBox.Show("Please enter a single-precision floating-point value between 0.0 and 1.0.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + return; + } + else if (dummy > 1.0f) + { + MessageBox.Show("Please enter a single-precision floating-point value between 0.0 and 1.0.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + return; + } + } + + private void txtEdgeThickness_Validated(object sender, EventArgs e) + { + sldEdgeThickness.Value = (int)(Single.Parse(txtEdgeThickness.Text) * 100); + txtEdgeThickness.Text = (sldEdgeThickness.Value / sldEdgeThickness.Maximum).ToString(); + } + + private void chkMaterialFlags_CheckedChanged(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + mat.EnableAnimation = chkMaterialEnableAnimation.Checked; + mat.EnableGlow = chkMaterialEnableGlow.Checked; + mat.EnableLightSource = chkMaterialEnableLightSource.Checked; + } + + private void txtGroupName_Validated(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + + ModelBoneGroup grp = (tv.SelectedNode.Tag as ModelBoneGroup); + if (grp == null) return; + + OnObjectModelEditing(EventArgs.Empty); + grp.Name = txtGroupName.Text; + tv.SelectedNode.Text = grp.Name; + OnObjectModelEdited(EventArgs.Empty); + } + + private void tv_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node != null) + { + if (!(e.Node.Tag is ModelBone || e.Node.Tag is ModelBoneGroup || e.Node.Tag is ModelMaterial)) + { + e.CancelEdit = true; + return; + } + } + } + private void tv_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node != null) + { + if (e.Node.Tag == null) return; + if (e.Label == null) return; + + OnObjectModelEditing(EventArgs.Empty); + if (e.Node.Tag is ModelBone) + { + ModelBone item = (e.Node.Tag as ModelBone); + PushEdit(item, "Name", item.Name); + item.Name = e.Label; + txtBoneName.Text = item.Name; + } + else if (e.Node.Tag is ModelBoneGroup) + { + ModelBoneGroup item = (e.Node.Tag as ModelBoneGroup); + PushEdit(item, "Name", item.Name); + item.Name = e.Label; + txtGroupName.Text = item.Name; + } + else if (e.Node.Tag is ModelMaterial) + { + ModelMaterial item = (e.Node.Tag as ModelMaterial); + PushEdit(item, "Name", item.Name); + item.Name = e.Label; + txtMaterialName.Text = item.Name; + } + OnObjectModelEdited(EventArgs.Empty); + } + } + + private void cmdTextureAdd_Click(object sender, EventArgs e) + { + ModelObjectModel model = (base.ObjectModel as ModelObjectModel); + if (model == null) return; + + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + TexturePropertiesDialog dlg = new TexturePropertiesDialog(); + dlg.ParentModel = model; + if (dlg.ShowDialog() == DialogResult.OK) + { + ModelTexture tex = new ModelTexture(); + tex.Duration = (int)dlg.txtDuration.Value; + tex.TextureFileName = dlg.txtTextureFileName.Text; + tex.MapFileName = dlg.txtMapFileName.Text; + tex.Flags = ModelTextureFlags.None; + + if (dlg.chkFlagAddMap.Checked) + { + tex.Flags |= ModelTextureFlags.AddMap; + } + if (dlg.chkFlagMap.Checked) + { + tex.Flags |= ModelTextureFlags.Map; + } + if (dlg.chkFlagTexture.Checked) + { + tex.Flags |= ModelTextureFlags.Texture; + } + + mat.Textures.Add(tex); + + ListViewItem lvi = new ListViewItem(); + lvi.Tag = tex; + lvi.Text = tex.TextureFileName; + lvi.SubItems.Add(tex.MapFileName); + lvi.SubItems.Add(tex.Duration.ToString() + " ms"); + lvTextures.Items.Add(lvi); + } + } + + private void cmdTextureModify_Click(object sender, EventArgs e) + { + ModelObjectModel model = (base.ObjectModel as ModelObjectModel); + if (model == null) return; + + if (lvTextures.SelectedItems.Count != 1) return; + ListViewItem lvi = lvTextures.SelectedItems[0]; + ModelTexture tex = (lvi.Tag as ModelTexture); + if (tex == null) return; + + TexturePropertiesDialog dlg = new TexturePropertiesDialog(); + dlg.ParentModel = model; + + + dlg.txtDuration.Value = tex.Duration; + dlg.txtMapFileName.Text = tex.MapFileName; + dlg.txtTextureFileName.Text = tex.TextureFileName; + + dlg.chkFlagAddMap.Checked = ((tex.Flags & ModelTextureFlags.AddMap) == ModelTextureFlags.AddMap); + dlg.chkFlagMap.Checked = ((tex.Flags & ModelTextureFlags.Map) == ModelTextureFlags.Map); + dlg.chkFlagTexture.Checked = ((tex.Flags & ModelTextureFlags.Texture) == ModelTextureFlags.Texture); + + if (dlg.ShowDialog() == DialogResult.OK) + { + tex.Duration = (int)dlg.txtDuration.Value; + tex.MapFileName = dlg.txtMapFileName.Text; + tex.TextureFileName = dlg.txtTextureFileName.Text; + + tex.Flags = ModelTextureFlags.None; + if (dlg.chkFlagAddMap.Checked) tex.Flags |= ModelTextureFlags.AddMap; + if (dlg.chkFlagMap.Checked) tex.Flags |= ModelTextureFlags.Map; + if (dlg.chkFlagTexture.Checked) tex.Flags |= ModelTextureFlags.Texture; + + lvi.Text = tex.TextureFileName; + lvi.SubItems[1].Text = tex.MapFileName; + lvi.SubItems[2].Text = (tex.Duration.ToString() + " ms"); + } + } + + private void cmdTextureClear_Click(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + if (MessageBox.Show("Are you sure you want to remove all textures?", "Remove All Textures", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + mat.Textures.Clear(); + lvTextures.Items.Clear(); + } + + private void lvTextures_SelectedIndexChanged(object sender, EventArgs e) + { + cmdTextureModify.Enabled = (lvTextures.SelectedItems.Count == 1); + cmdTextureRemove.Enabled = (lvTextures.SelectedItems.Count > 0); + } + + private void cmdTextureRemove_Click(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + string sz = "texture", sz1 = "Texture"; + if (lvTextures.SelectedItems.Count > 1) + { + sz = "textures"; + sz1 = "Textures"; + } + if (MessageBox.Show("Are you sure you want to remove the selected " + sz + "?", "Remove " + sz1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + + while (lvTextures.SelectedItems.Count > 0) + { + ModelTexture tex = (lvTextures.SelectedItems[0].Tag as ModelTexture); + mat.Textures.Remove(tex); + + lvTextures.SelectedItems[0].Remove(); + } + } + + private void lvTextures_ItemActivate(object sender, EventArgs e) + { + if (lvTextures.SelectedItems.Count == 1) + { + cmdTextureModify_Click(sender, e); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer (miku's conflicted copy 2012-10-08).cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer (miku's conflicted copy 2012-10-08).cs new file mode 100644 index 00000000..08cc2c93 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer (miku's conflicted copy 2012-10-08).cs @@ -0,0 +1,574 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors +{ + partial class ModelEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("Vertices"); + System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("Materials"); + System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("Bones"); + System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("Inverse Kinematics"); + System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("Faces"); + System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("Groups"); + System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("String Table"); + System.Windows.Forms.TreeNode treeNode19 = new System.Windows.Forms.TreeNode("Resources", new System.Windows.Forms.TreeNode[] { + treeNode18}); + System.Windows.Forms.TreeNode treeNode20 = new System.Windows.Forms.TreeNode("Toons"); + System.Windows.Forms.TreeNode treeNode21 = new System.Windows.Forms.TreeNode("Physics"); + System.Windows.Forms.TreeNode treeNode22 = new System.Windows.Forms.TreeNode("Joints"); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.pnlResourcesStringTable = new System.Windows.Forms.Panel(); + this.cboLanguage = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.pnlMaterialsMaterial = new System.Windows.Forms.Panel(); + this.fraColors = new System.Windows.Forms.GroupBox(); + this.fraTextures = new System.Windows.Forms.GroupBox(); + this.cmdColorAmbient = new System.Windows.Forms.Button(); + this.cmdColorDiffuse = new System.Windows.Forms.Button(); + this.pnlColorAmbient = new System.Windows.Forms.Panel(); + this.pnlColorDiffuse = new System.Windows.Forms.Panel(); + this.pnlColorSpecular = new System.Windows.Forms.Panel(); + this.cmdColorSpecular = new System.Windows.Forms.Button(); + this.fraEdge = new System.Windows.Forms.GroupBox(); + this.cmdColorEmissive = new System.Windows.Forms.Button(); + this.pnlColorEmissive = new System.Windows.Forms.Panel(); + this.lblMaterialName = new System.Windows.Forms.Label(); + this.txtMaterialName = new System.Windows.Forms.TextBox(); + this.cmdColorEdge = new System.Windows.Forms.Button(); + this.pnlColorEdge = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.sldEdgeThickness = new System.Windows.Forms.TrackBar(); + this.txtEdgeThickness = new System.Windows.Forms.TextBox(); + this.fraToon = new System.Windows.Forms.GroupBox(); + this.cmdTextureAdd = new System.Windows.Forms.Button(); + this.cmdTextureModify = new System.Windows.Forms.Button(); + this.cmdTextureRemove = new System.Windows.Forms.Button(); + this.cmdTextureClear = new System.Windows.Forms.Button(); + this.lvTextures = new System.Windows.Forms.ListView(); + this.chTextureImageFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chTextureMapFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chTextureDelay = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.label3 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlResourcesStringTable.SuspendLayout(); + this.pnlMaterialsMaterial.SuspendLayout(); + this.fraColors.SuspendLayout(); + this.fraTextures.SuspendLayout(); + this.fraEdge.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldEdgeThickness)).BeginInit(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlMaterialsMaterial); + this.splitContainer1.Panel2.Controls.Add(this.pnlResourcesStringTable); + this.splitContainer1.Size = new System.Drawing.Size(660, 381); + this.splitContainer1.SplitterDistance = 188; + this.splitContainer1.TabIndex = 1; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode12.Name = "nodeVertices"; + treeNode12.Text = "Vertices"; + treeNode13.Name = "nodeMaterials"; + treeNode13.Text = "Materials"; + treeNode14.Name = "nodeBones"; + treeNode14.Text = "Bones"; + treeNode15.Name = "nodeInverseKinematics"; + treeNode15.Text = "Inverse Kinematics"; + treeNode16.Name = "nodeFaces"; + treeNode16.Text = "Faces"; + treeNode17.Name = "nodeGroups"; + treeNode17.Text = "Groups"; + treeNode18.Name = "nodeStringTable"; + treeNode18.Text = "String Table"; + treeNode19.Name = "nodeResources"; + treeNode19.Text = "Resources"; + treeNode20.Name = "nodeToons"; + treeNode20.Text = "Toons"; + treeNode21.Name = "nodePhysics"; + treeNode21.Text = "Physics"; + treeNode22.Name = "nodeJoints"; + treeNode22.Text = "Joints"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode12, + treeNode13, + treeNode14, + treeNode15, + treeNode16, + treeNode17, + treeNode19, + treeNode20, + treeNode21, + treeNode22}); + this.tv.Size = new System.Drawing.Size(188, 381); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // pnlResourcesStringTable + // + this.pnlResourcesStringTable.Controls.Add(this.cboLanguage); + this.pnlResourcesStringTable.Controls.Add(this.label1); + this.pnlResourcesStringTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlResourcesStringTable.Location = new System.Drawing.Point(0, 0); + this.pnlResourcesStringTable.Name = "pnlResourcesStringTable"; + this.pnlResourcesStringTable.Size = new System.Drawing.Size(468, 381); + this.pnlResourcesStringTable.TabIndex = 0; + // + // cboLanguage + // + this.cboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboLanguage.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboLanguage.FormattingEnabled = true; + this.cboLanguage.Location = new System.Drawing.Point(67, 3); + this.cboLanguage.Name = "cboLanguage"; + this.cboLanguage.Size = new System.Drawing.Size(398, 21); + this.cboLanguage.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(3, 6); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Language:"; + // + // pnlMaterialsMaterial + // + this.pnlMaterialsMaterial.Controls.Add(this.fraToon); + this.pnlMaterialsMaterial.Controls.Add(this.txtMaterialName); + this.pnlMaterialsMaterial.Controls.Add(this.lblMaterialName); + this.pnlMaterialsMaterial.Controls.Add(this.fraEdge); + this.pnlMaterialsMaterial.Controls.Add(this.fraTextures); + this.pnlMaterialsMaterial.Controls.Add(this.fraColors); + this.pnlMaterialsMaterial.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlMaterialsMaterial.Location = new System.Drawing.Point(0, 0); + this.pnlMaterialsMaterial.Name = "pnlMaterialsMaterial"; + this.pnlMaterialsMaterial.Size = new System.Drawing.Size(468, 381); + this.pnlMaterialsMaterial.TabIndex = 0; + this.pnlMaterialsMaterial.Visible = false; + // + // fraColors + // + this.fraColors.Controls.Add(this.pnlColorEmissive); + this.fraColors.Controls.Add(this.pnlColorSpecular); + this.fraColors.Controls.Add(this.pnlColorDiffuse); + this.fraColors.Controls.Add(this.pnlColorAmbient); + this.fraColors.Controls.Add(this.cmdColorEmissive); + this.fraColors.Controls.Add(this.cmdColorSpecular); + this.fraColors.Controls.Add(this.cmdColorDiffuse); + this.fraColors.Controls.Add(this.cmdColorAmbient); + this.fraColors.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraColors.Location = new System.Drawing.Point(4, 30); + this.fraColors.Name = "fraColors"; + this.fraColors.Size = new System.Drawing.Size(270, 103); + this.fraColors.TabIndex = 2; + this.fraColors.TabStop = false; + this.fraColors.Text = "Colors"; + // + // fraTextures + // + this.fraTextures.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraTextures.Controls.Add(this.comboBox1); + this.fraTextures.Controls.Add(this.label3); + this.fraTextures.Controls.Add(this.lvTextures); + this.fraTextures.Controls.Add(this.cmdTextureClear); + this.fraTextures.Controls.Add(this.cmdTextureRemove); + this.fraTextures.Controls.Add(this.cmdTextureModify); + this.fraTextures.Controls.Add(this.cmdTextureAdd); + this.fraTextures.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraTextures.Location = new System.Drawing.Point(4, 244); + this.fraTextures.Name = "fraTextures"; + this.fraTextures.Size = new System.Drawing.Size(459, 134); + this.fraTextures.TabIndex = 4; + this.fraTextures.TabStop = false; + this.fraTextures.Text = "Textures"; + // + // cmdColorAmbient + // + this.cmdColorAmbient.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorAmbient.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorAmbient.Location = new System.Drawing.Point(17, 19); + this.cmdColorAmbient.Name = "cmdColorAmbient"; + this.cmdColorAmbient.Size = new System.Drawing.Size(55, 23); + this.cmdColorAmbient.TabIndex = 0; + this.cmdColorAmbient.Text = "&Ambient"; + this.cmdColorAmbient.UseVisualStyleBackColor = true; + this.cmdColorAmbient.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorDiffuse + // + this.cmdColorDiffuse.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorDiffuse.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorDiffuse.Location = new System.Drawing.Point(78, 19); + this.cmdColorDiffuse.Name = "cmdColorDiffuse"; + this.cmdColorDiffuse.Size = new System.Drawing.Size(55, 23); + this.cmdColorDiffuse.TabIndex = 2; + this.cmdColorDiffuse.Text = "&Diffuse"; + this.cmdColorDiffuse.UseVisualStyleBackColor = true; + this.cmdColorDiffuse.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorAmbient + // + this.pnlColorAmbient.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorAmbient.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorAmbient.Location = new System.Drawing.Point(17, 48); + this.pnlColorAmbient.Name = "pnlColorAmbient"; + this.pnlColorAmbient.Size = new System.Drawing.Size(55, 41); + this.pnlColorAmbient.TabIndex = 1; + this.pnlColorAmbient.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorDiffuse + // + this.pnlColorDiffuse.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorDiffuse.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorDiffuse.Location = new System.Drawing.Point(78, 48); + this.pnlColorDiffuse.Name = "pnlColorDiffuse"; + this.pnlColorDiffuse.Size = new System.Drawing.Size(55, 41); + this.pnlColorDiffuse.TabIndex = 3; + this.pnlColorDiffuse.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorSpecular + // + this.pnlColorSpecular.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorSpecular.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorSpecular.Location = new System.Drawing.Point(139, 48); + this.pnlColorSpecular.Name = "pnlColorSpecular"; + this.pnlColorSpecular.Size = new System.Drawing.Size(55, 41); + this.pnlColorSpecular.TabIndex = 5; + this.pnlColorSpecular.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorSpecular + // + this.cmdColorSpecular.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorSpecular.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorSpecular.Location = new System.Drawing.Point(139, 19); + this.cmdColorSpecular.Name = "cmdColorSpecular"; + this.cmdColorSpecular.Size = new System.Drawing.Size(55, 23); + this.cmdColorSpecular.TabIndex = 4; + this.cmdColorSpecular.Text = "&Specular"; + this.cmdColorSpecular.UseVisualStyleBackColor = true; + this.cmdColorSpecular.Click += new System.EventHandler(this.cmdColor_Click); + // + // fraEdge + // + this.fraEdge.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.fraEdge.Controls.Add(this.txtEdgeThickness); + this.fraEdge.Controls.Add(this.sldEdgeThickness); + this.fraEdge.Controls.Add(this.label2); + this.fraEdge.Controls.Add(this.pnlColorEdge); + this.fraEdge.Controls.Add(this.cmdColorEdge); + this.fraEdge.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEdge.Location = new System.Drawing.Point(5, 139); + this.fraEdge.Name = "fraEdge"; + this.fraEdge.Size = new System.Drawing.Size(269, 99); + this.fraEdge.TabIndex = 3; + this.fraEdge.TabStop = false; + this.fraEdge.Tag = ""; + this.fraEdge.Text = "Edge"; + // + // cmdColorEmissive + // + this.cmdColorEmissive.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorEmissive.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorEmissive.Location = new System.Drawing.Point(200, 19); + this.cmdColorEmissive.Name = "cmdColorEmissive"; + this.cmdColorEmissive.Size = new System.Drawing.Size(55, 23); + this.cmdColorEmissive.TabIndex = 6; + this.cmdColorEmissive.Text = "&Emissive"; + this.cmdColorEmissive.UseVisualStyleBackColor = true; + this.cmdColorEmissive.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorEmissive + // + this.pnlColorEmissive.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorEmissive.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorEmissive.Location = new System.Drawing.Point(200, 48); + this.pnlColorEmissive.Name = "pnlColorEmissive"; + this.pnlColorEmissive.Size = new System.Drawing.Size(55, 41); + this.pnlColorEmissive.TabIndex = 7; + this.pnlColorEmissive.Click += new System.EventHandler(this.cmdColor_Click); + // + // lblMaterialName + // + this.lblMaterialName.AutoSize = true; + this.lblMaterialName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblMaterialName.Location = new System.Drawing.Point(3, 6); + this.lblMaterialName.Name = "lblMaterialName"; + this.lblMaterialName.Size = new System.Drawing.Size(38, 13); + this.lblMaterialName.TabIndex = 0; + this.lblMaterialName.Text = "&Name:"; + // + // txtMaterialName + // + this.txtMaterialName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMaterialName.Location = new System.Drawing.Point(47, 3); + this.txtMaterialName.Name = "txtMaterialName"; + this.txtMaterialName.Size = new System.Drawing.Size(418, 20); + this.txtMaterialName.TabIndex = 1; + // + // cmdColorEdge + // + this.cmdColorEdge.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorEdge.Location = new System.Drawing.Point(15, 19); + this.cmdColorEdge.Name = "cmdColorEdge"; + this.cmdColorEdge.Size = new System.Drawing.Size(75, 23); + this.cmdColorEdge.TabIndex = 6; + this.cmdColorEdge.Text = "E&dge Color"; + this.cmdColorEdge.UseVisualStyleBackColor = true; + this.cmdColorEdge.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorEdge + // + this.pnlColorEdge.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorEdge.Location = new System.Drawing.Point(15, 48); + this.pnlColorEdge.Name = "pnlColorEdge"; + this.pnlColorEdge.Size = new System.Drawing.Size(75, 41); + this.pnlColorEdge.TabIndex = 7; + this.pnlColorEdge.Click += new System.EventHandler(this.cmdColor_Click); + this.pnlColorEdge.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlColorEdge_Paint); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(96, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(110, 13); + this.label2.TabIndex = 8; + this.label2.Text = "Edge Line &Thickness:"; + // + // sldEdgeThickness + // + this.sldEdgeThickness.LargeChange = 10; + this.sldEdgeThickness.Location = new System.Drawing.Point(96, 45); + this.sldEdgeThickness.Maximum = 100; + this.sldEdgeThickness.Name = "sldEdgeThickness"; + this.sldEdgeThickness.Size = new System.Drawing.Size(167, 42); + this.sldEdgeThickness.TabIndex = 9; + this.sldEdgeThickness.TickFrequency = 10; + this.sldEdgeThickness.TickStyle = System.Windows.Forms.TickStyle.Both; + // + // txtEdgeThickness + // + this.txtEdgeThickness.Location = new System.Drawing.Point(212, 19); + this.txtEdgeThickness.Name = "txtEdgeThickness"; + this.txtEdgeThickness.Size = new System.Drawing.Size(51, 20); + this.txtEdgeThickness.TabIndex = 10; + this.txtEdgeThickness.Validating += new System.ComponentModel.CancelEventHandler(this.txtEdgeThickness_Validating); + this.txtEdgeThickness.Validated += new System.EventHandler(this.txtEdgeThickness_Validated); + // + // fraToon + // + this.fraToon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.fraToon.Location = new System.Drawing.Point(280, 30); + this.fraToon.Name = "fraToon"; + this.fraToon.Size = new System.Drawing.Size(183, 209); + this.fraToon.TabIndex = 5; + this.fraToon.TabStop = false; + this.fraToon.Text = "Mapping"; + // + // cmdTextureAdd + // + this.cmdTextureAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureAdd.Location = new System.Drawing.Point(135, 19); + this.cmdTextureAdd.Name = "cmdTextureAdd"; + this.cmdTextureAdd.Size = new System.Drawing.Size(75, 23); + this.cmdTextureAdd.TabIndex = 0; + this.cmdTextureAdd.Text = "&Add..."; + this.cmdTextureAdd.UseVisualStyleBackColor = true; + // + // cmdTextureModify + // + this.cmdTextureModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureModify.Location = new System.Drawing.Point(216, 19); + this.cmdTextureModify.Name = "cmdTextureModify"; + this.cmdTextureModify.Size = new System.Drawing.Size(75, 23); + this.cmdTextureModify.TabIndex = 0; + this.cmdTextureModify.Text = "&Modify..."; + this.cmdTextureModify.UseVisualStyleBackColor = true; + // + // cmdTextureRemove + // + this.cmdTextureRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureRemove.Location = new System.Drawing.Point(297, 19); + this.cmdTextureRemove.Name = "cmdTextureRemove"; + this.cmdTextureRemove.Size = new System.Drawing.Size(75, 23); + this.cmdTextureRemove.TabIndex = 0; + this.cmdTextureRemove.Text = "&Remove"; + this.cmdTextureRemove.UseVisualStyleBackColor = true; + // + // cmdTextureClear + // + this.cmdTextureClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdTextureClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureClear.Location = new System.Drawing.Point(378, 19); + this.cmdTextureClear.Name = "cmdTextureClear"; + this.cmdTextureClear.Size = new System.Drawing.Size(75, 23); + this.cmdTextureClear.TabIndex = 0; + this.cmdTextureClear.Text = "&Clear"; + this.cmdTextureClear.UseVisualStyleBackColor = true; + // + // lvTextures + // + this.lvTextures.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvTextures.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTextureImageFileName, + this.chTextureMapFileName, + this.chTextureDelay}); + this.lvTextures.FullRowSelect = true; + this.lvTextures.GridLines = true; + this.lvTextures.HideSelection = false; + this.lvTextures.Location = new System.Drawing.Point(6, 48); + this.lvTextures.Name = "lvTextures"; + this.lvTextures.Size = new System.Drawing.Size(447, 80); + this.lvTextures.TabIndex = 1; + this.lvTextures.UseCompatibleStateImageBehavior = false; + this.lvTextures.View = System.Windows.Forms.View.Details; + // + // chTextureImageFileName + // + this.chTextureImageFileName.Text = "Image filename"; + this.chTextureImageFileName.Width = 192; + // + // chTextureMapFileName + // + this.chTextureMapFileName.Text = "Map filename"; + this.chTextureMapFileName.Width = 170; + // + // chTextureDelay + // + this.chTextureDelay.Text = "Delay (ms)"; + this.chTextureDelay.Width = 74; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(22, 24); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 2; + this.label3.Text = "&Toon:"; + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(63, 21); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(66, 21); + this.comboBox1.TabIndex = 3; + // + // ModelEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.MinimumSize = new System.Drawing.Size(660, 381); + this.Name = "ModelEditor"; + this.Size = new System.Drawing.Size(660, 381); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlResourcesStringTable.ResumeLayout(false); + this.pnlResourcesStringTable.PerformLayout(); + this.pnlMaterialsMaterial.ResumeLayout(false); + this.pnlMaterialsMaterial.PerformLayout(); + this.fraColors.ResumeLayout(false); + this.fraTextures.ResumeLayout(false); + this.fraTextures.PerformLayout(); + this.fraEdge.ResumeLayout(false); + this.fraEdge.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldEdgeThickness)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlResourcesStringTable; + private System.Windows.Forms.ComboBox cboLanguage; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel pnlMaterialsMaterial; + private System.Windows.Forms.GroupBox fraTextures; + private System.Windows.Forms.GroupBox fraColors; + private System.Windows.Forms.Panel pnlColorSpecular; + private System.Windows.Forms.Panel pnlColorDiffuse; + private System.Windows.Forms.Panel pnlColorAmbient; + private System.Windows.Forms.Button cmdColorSpecular; + private System.Windows.Forms.Button cmdColorDiffuse; + private System.Windows.Forms.Button cmdColorAmbient; + private System.Windows.Forms.GroupBox fraEdge; + private System.Windows.Forms.Panel pnlColorEmissive; + private System.Windows.Forms.Button cmdColorEmissive; + private System.Windows.Forms.TextBox txtMaterialName; + private System.Windows.Forms.Label lblMaterialName; + private System.Windows.Forms.Panel pnlColorEdge; + private System.Windows.Forms.Button cmdColorEdge; + private System.Windows.Forms.TrackBar sldEdgeThickness; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtEdgeThickness; + private System.Windows.Forms.GroupBox fraToon; + private System.Windows.Forms.ListView lvTextures; + private System.Windows.Forms.Button cmdTextureClear; + private System.Windows.Forms.Button cmdTextureRemove; + private System.Windows.Forms.Button cmdTextureModify; + private System.Windows.Forms.Button cmdTextureAdd; + private System.Windows.Forms.ColumnHeader chTextureImageFileName; + private System.Windows.Forms.ColumnHeader chTextureMapFileName; + private System.Windows.Forms.ColumnHeader chTextureDelay; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label label3; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer.cs new file mode 100644 index 00000000..5c65557b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.designer.cs @@ -0,0 +1,1014 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors +{ + partial class ModelEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.TreeNode treeNode11 = new System.Windows.Forms.TreeNode("Vertices"); + System.Windows.Forms.TreeNode treeNode12 = new System.Windows.Forms.TreeNode("Materials"); + System.Windows.Forms.TreeNode treeNode13 = new System.Windows.Forms.TreeNode("Bones"); + System.Windows.Forms.TreeNode treeNode14 = new System.Windows.Forms.TreeNode("Inverse Kinematics"); + System.Windows.Forms.TreeNode treeNode15 = new System.Windows.Forms.TreeNode("Faces"); + System.Windows.Forms.TreeNode treeNode16 = new System.Windows.Forms.TreeNode("String Table"); + System.Windows.Forms.TreeNode treeNode17 = new System.Windows.Forms.TreeNode("Resources", new System.Windows.Forms.TreeNode[] { + treeNode16}); + System.Windows.Forms.TreeNode treeNode18 = new System.Windows.Forms.TreeNode("Toons"); + System.Windows.Forms.TreeNode treeNode19 = new System.Windows.Forms.TreeNode("Physics"); + System.Windows.Forms.TreeNode treeNode20 = new System.Windows.Forms.TreeNode("Joints"); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContextTreeView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextTreeViewAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.vertexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.materialToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.faceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.stringTableToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.rigidBodyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.jointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.pnlBonesGroup = new System.Windows.Forms.Panel(); + this.txtGroupName = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.pnlBonesBone = new System.Windows.Forms.Panel(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.cboBoneType = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.txtBoneName = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.pnlResourcesStringTable = new System.Windows.Forms.Panel(); + this.cboLanguage = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.pnlMaterialsMaterial = new System.Windows.Forms.Panel(); + this.fraToon = new System.Windows.Forms.GroupBox(); + this.lvMapping = new System.Windows.Forms.ListView(); + this.txtMaterialName = new System.Windows.Forms.TextBox(); + this.lblMaterialName = new System.Windows.Forms.Label(); + this.fraEdge = new System.Windows.Forms.GroupBox(); + this.txtEdgeThickness = new System.Windows.Forms.TextBox(); + this.sldEdgeThickness = new System.Windows.Forms.TrackBar(); + this.label2 = new System.Windows.Forms.Label(); + this.pnlColorEdge = new System.Windows.Forms.Panel(); + this.cmdColorEdge = new System.Windows.Forms.Button(); + this.fraTextures = new System.Windows.Forms.GroupBox(); + this.chkMaterialEnableAnimation = new System.Windows.Forms.CheckBox(); + this.cboMaterialToon = new System.Windows.Forms.ComboBox(); + this.chkMaterialEnableGlow = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.chkMaterialEnableLightSource = new System.Windows.Forms.CheckBox(); + this.lvTextures = new System.Windows.Forms.ListView(); + this.chTextureImageFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chTextureMapFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chTextureDelay = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdTextureClear = new System.Windows.Forms.Button(); + this.cmdTextureRemove = new System.Windows.Forms.Button(); + this.cmdTextureModify = new System.Windows.Forms.Button(); + this.cmdTextureAdd = new System.Windows.Forms.Button(); + this.fraColors = new System.Windows.Forms.GroupBox(); + this.pnlColorEmissive = new System.Windows.Forms.Panel(); + this.pnlColorSpecular = new System.Windows.Forms.Panel(); + this.pnlColorDiffuse = new System.Windows.Forms.Panel(); + this.pnlColorAmbient = new System.Windows.Forms.Panel(); + this.cmdColorEmissive = new System.Windows.Forms.Button(); + this.cmdColorSpecular = new System.Windows.Forms.Button(); + this.cmdColorDiffuse = new System.Windows.Forms.Button(); + this.cmdColorAmbient = new System.Windows.Forms.Button(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.mnuContextTreeView.SuspendLayout(); + this.pnlBonesGroup.SuspendLayout(); + this.pnlBonesBone.SuspendLayout(); + this.pnlResourcesStringTable.SuspendLayout(); + this.pnlMaterialsMaterial.SuspendLayout(); + this.fraToon.SuspendLayout(); + this.fraEdge.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldEdgeThickness)).BeginInit(); + this.fraTextures.SuspendLayout(); + this.fraColors.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlMaterialsMaterial); + this.splitContainer1.Panel2.Controls.Add(this.pnlBonesGroup); + this.splitContainer1.Panel2.Controls.Add(this.pnlBonesBone); + this.splitContainer1.Panel2.Controls.Add(this.pnlResourcesStringTable); + this.splitContainer1.Size = new System.Drawing.Size(660, 393); + this.splitContainer1.SplitterDistance = 188; + this.splitContainer1.TabIndex = 1; + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContextTreeView; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.LabelEdit = true; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode11.Name = "nodeVertices"; + treeNode11.Text = "Vertices"; + treeNode12.Name = "nodeMaterials"; + treeNode12.Text = "Materials"; + treeNode13.Name = "nodeBones"; + treeNode13.Text = "Bones"; + treeNode14.Name = "nodeInverseKinematics"; + treeNode14.Text = "Inverse Kinematics"; + treeNode15.Name = "nodeFaces"; + treeNode15.Text = "Faces"; + treeNode16.Name = "nodeStringTable"; + treeNode16.Text = "String Table"; + treeNode17.Name = "nodeResources"; + treeNode17.Text = "Resources"; + treeNode18.Name = "nodeToons"; + treeNode18.Text = "Toons"; + treeNode19.Name = "nodePhysics"; + treeNode19.Text = "Physics"; + treeNode20.Name = "nodeJoints"; + treeNode20.Text = "Joints"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode11, + treeNode12, + treeNode13, + treeNode14, + treeNode15, + treeNode17, + treeNode18, + treeNode19, + treeNode20}); + this.tv.Size = new System.Drawing.Size(188, 393); + this.tv.TabIndex = 0; + this.tv.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_BeforeLabelEdit); + this.tv.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_AfterLabelEdit); + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // mnuContextTreeView + // + this.mnuContextTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewAdd, + this.toolStripMenuItem2, + this.mnuContextTreeViewCut, + this.mnuContextTreeViewCopy, + this.mnuContextTreeViewPaste, + this.mnuContextTreeViewDelete}); + this.mnuContextTreeView.Name = "mnuContextTreeView"; + this.mnuContextTreeView.Size = new System.Drawing.Size(145, 120); + // + // mnuContextTreeViewAdd + // + this.mnuContextTreeViewAdd.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.vertexToolStripMenuItem, + this.materialToolStripMenuItem, + this.boneToolStripMenuItem, + this.faceToolStripMenuItem, + this.groupToolStripMenuItem, + this.stringTableToolStripMenuItem, + this.toonToolStripMenuItem, + this.toolStripMenuItem1, + this.rigidBodyToolStripMenuItem, + this.jointToolStripMenuItem}); + this.mnuContextTreeViewAdd.Name = "mnuContextTreeViewAdd"; + this.mnuContextTreeViewAdd.Size = new System.Drawing.Size(144, 22); + this.mnuContextTreeViewAdd.Text = "A&dd"; + // + // vertexToolStripMenuItem + // + this.vertexToolStripMenuItem.Name = "vertexToolStripMenuItem"; + this.vertexToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.vertexToolStripMenuItem.Text = "&Vertex"; + // + // materialToolStripMenuItem + // + this.materialToolStripMenuItem.Name = "materialToolStripMenuItem"; + this.materialToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.materialToolStripMenuItem.Text = "&Material"; + // + // boneToolStripMenuItem + // + this.boneToolStripMenuItem.Name = "boneToolStripMenuItem"; + this.boneToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.boneToolStripMenuItem.Text = "&Bone"; + // + // faceToolStripMenuItem + // + this.faceToolStripMenuItem.Name = "faceToolStripMenuItem"; + this.faceToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.faceToolStripMenuItem.Text = "&Face"; + // + // groupToolStripMenuItem + // + this.groupToolStripMenuItem.Name = "groupToolStripMenuItem"; + this.groupToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.groupToolStripMenuItem.Text = "&Group"; + // + // stringTableToolStripMenuItem + // + this.stringTableToolStripMenuItem.Name = "stringTableToolStripMenuItem"; + this.stringTableToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.stringTableToolStripMenuItem.Text = "&String Table"; + // + // toonToolStripMenuItem + // + this.toonToolStripMenuItem.Name = "toonToolStripMenuItem"; + this.toonToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.toonToolStripMenuItem.Text = "&Toon"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(128, 6); + // + // rigidBodyToolStripMenuItem + // + this.rigidBodyToolStripMenuItem.Name = "rigidBodyToolStripMenuItem"; + this.rigidBodyToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.rigidBodyToolStripMenuItem.Text = "&Rigid Body"; + // + // jointToolStripMenuItem + // + this.jointToolStripMenuItem.Name = "jointToolStripMenuItem"; + this.jointToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.jointToolStripMenuItem.Text = "&Joint"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(141, 6); + // + // mnuContextTreeViewCut + // + this.mnuContextTreeViewCut.Name = "mnuContextTreeViewCut"; + this.mnuContextTreeViewCut.ShortcutKeyDisplayString = "Ctrl+X"; + this.mnuContextTreeViewCut.Size = new System.Drawing.Size(144, 22); + this.mnuContextTreeViewCut.Text = "Cu&t"; + // + // mnuContextTreeViewCopy + // + this.mnuContextTreeViewCopy.Name = "mnuContextTreeViewCopy"; + this.mnuContextTreeViewCopy.ShortcutKeyDisplayString = "Ctrl+C"; + this.mnuContextTreeViewCopy.Size = new System.Drawing.Size(144, 22); + this.mnuContextTreeViewCopy.Text = "&Copy"; + // + // mnuContextTreeViewPaste + // + this.mnuContextTreeViewPaste.Name = "mnuContextTreeViewPaste"; + this.mnuContextTreeViewPaste.ShortcutKeyDisplayString = "Ctrl+V"; + this.mnuContextTreeViewPaste.Size = new System.Drawing.Size(144, 22); + this.mnuContextTreeViewPaste.Text = "&Paste"; + // + // mnuContextTreeViewDelete + // + this.mnuContextTreeViewDelete.Name = "mnuContextTreeViewDelete"; + this.mnuContextTreeViewDelete.ShortcutKeyDisplayString = "Del"; + this.mnuContextTreeViewDelete.Size = new System.Drawing.Size(144, 22); + this.mnuContextTreeViewDelete.Text = "&Delete"; + // + // pnlBonesGroup + // + this.pnlBonesGroup.Controls.Add(this.txtGroupName); + this.pnlBonesGroup.Controls.Add(this.label13); + this.pnlBonesGroup.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlBonesGroup.Location = new System.Drawing.Point(0, 0); + this.pnlBonesGroup.Name = "pnlBonesGroup"; + this.pnlBonesGroup.Size = new System.Drawing.Size(468, 393); + this.pnlBonesGroup.TabIndex = 2; + this.pnlBonesGroup.Visible = false; + // + // txtGroupName + // + this.txtGroupName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGroupName.Location = new System.Drawing.Point(47, 3); + this.txtGroupName.Name = "txtGroupName"; + this.txtGroupName.Size = new System.Drawing.Size(418, 20); + this.txtGroupName.TabIndex = 3; + this.txtGroupName.Validated += new System.EventHandler(this.txtGroupName_Validated); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label13.Location = new System.Drawing.Point(3, 6); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(38, 13); + this.label13.TabIndex = 2; + this.label13.Text = "&Name:"; + // + // pnlBonesBone + // + this.pnlBonesBone.Controls.Add(this.comboBox4); + this.pnlBonesBone.Controls.Add(this.label8); + this.pnlBonesBone.Controls.Add(this.comboBox3); + this.pnlBonesBone.Controls.Add(this.label7); + this.pnlBonesBone.Controls.Add(this.comboBox2); + this.pnlBonesBone.Controls.Add(this.label6); + this.pnlBonesBone.Controls.Add(this.cboBoneType); + this.pnlBonesBone.Controls.Add(this.label5); + this.pnlBonesBone.Controls.Add(this.txtBoneName); + this.pnlBonesBone.Controls.Add(this.label4); + this.pnlBonesBone.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlBonesBone.Location = new System.Drawing.Point(0, 0); + this.pnlBonesBone.Name = "pnlBonesBone"; + this.pnlBonesBone.Size = new System.Drawing.Size(468, 393); + this.pnlBonesBone.TabIndex = 1; + this.pnlBonesBone.Visible = false; + // + // comboBox4 + // + this.comboBox4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Location = new System.Drawing.Point(221, 84); + this.comboBox4.Name = "comboBox4"; + this.comboBox4.Size = new System.Drawing.Size(121, 21); + this.comboBox4.TabIndex = 5; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label8.Location = new System.Drawing.Point(174, 87); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(20, 13); + this.label8.TabIndex = 4; + this.label8.Text = "&IK:"; + // + // comboBox3 + // + this.comboBox3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Location = new System.Drawing.Point(221, 57); + this.comboBox3.Name = "comboBox3"; + this.comboBox3.Size = new System.Drawing.Size(121, 21); + this.comboBox3.TabIndex = 5; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(174, 60); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(33, 13); + this.label7.TabIndex = 4; + this.label7.Text = "&Child:"; + // + // comboBox2 + // + this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Location = new System.Drawing.Point(221, 30); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(121, 21); + this.comboBox2.TabIndex = 5; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(174, 33); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(41, 13); + this.label6.TabIndex = 4; + this.label6.Text = "&Parent:"; + // + // cboBoneType + // + this.cboBoneType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboBoneType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboBoneType.FormattingEnabled = true; + this.cboBoneType.Items.AddRange(new object[] { + "Unknown", + "Rotate", + "Rotate/move", + "Inverse kinematics", + "Blank", + "IK-influenced rotation", + "Influenced rotation", + "IKConnect", + "Hidden", + "Twist", + "Revolution"}); + this.cboBoneType.Location = new System.Drawing.Point(47, 29); + this.cboBoneType.Name = "cboBoneType"; + this.cboBoneType.Size = new System.Drawing.Size(121, 21); + this.cboBoneType.TabIndex = 5; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(3, 32); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(34, 13); + this.label5.TabIndex = 4; + this.label5.Text = "&Type:"; + // + // txtBoneName + // + this.txtBoneName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtBoneName.Location = new System.Drawing.Point(47, 3); + this.txtBoneName.Name = "txtBoneName"; + this.txtBoneName.Size = new System.Drawing.Size(418, 20); + this.txtBoneName.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(3, 6); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(38, 13); + this.label4.TabIndex = 2; + this.label4.Text = "&Name:"; + // + // pnlResourcesStringTable + // + this.pnlResourcesStringTable.Controls.Add(this.cboLanguage); + this.pnlResourcesStringTable.Controls.Add(this.label1); + this.pnlResourcesStringTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlResourcesStringTable.Location = new System.Drawing.Point(0, 0); + this.pnlResourcesStringTable.Name = "pnlResourcesStringTable"; + this.pnlResourcesStringTable.Size = new System.Drawing.Size(468, 393); + this.pnlResourcesStringTable.TabIndex = 0; + // + // cboLanguage + // + this.cboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboLanguage.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboLanguage.FormattingEnabled = true; + this.cboLanguage.Location = new System.Drawing.Point(67, 3); + this.cboLanguage.Name = "cboLanguage"; + this.cboLanguage.Size = new System.Drawing.Size(398, 21); + this.cboLanguage.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(3, 6); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Language:"; + // + // pnlMaterialsMaterial + // + this.pnlMaterialsMaterial.Controls.Add(this.fraToon); + this.pnlMaterialsMaterial.Controls.Add(this.txtMaterialName); + this.pnlMaterialsMaterial.Controls.Add(this.lblMaterialName); + this.pnlMaterialsMaterial.Controls.Add(this.fraEdge); + this.pnlMaterialsMaterial.Controls.Add(this.fraTextures); + this.pnlMaterialsMaterial.Controls.Add(this.fraColors); + this.pnlMaterialsMaterial.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlMaterialsMaterial.Location = new System.Drawing.Point(0, 0); + this.pnlMaterialsMaterial.Name = "pnlMaterialsMaterial"; + this.pnlMaterialsMaterial.Size = new System.Drawing.Size(468, 393); + this.pnlMaterialsMaterial.TabIndex = 0; + this.pnlMaterialsMaterial.Visible = false; + // + // fraToon + // + this.fraToon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraToon.Controls.Add(this.lvMapping); + this.fraToon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraToon.Location = new System.Drawing.Point(280, 30); + this.fraToon.Name = "fraToon"; + this.fraToon.Size = new System.Drawing.Size(185, 208); + this.fraToon.TabIndex = 5; + this.fraToon.TabStop = false; + this.fraToon.Text = "Mapping"; + // + // lvMapping + // + this.lvMapping.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvMapping.Location = new System.Drawing.Point(6, 19); + this.lvMapping.Name = "lvMapping"; + this.lvMapping.Size = new System.Drawing.Size(173, 184); + this.lvMapping.TabIndex = 0; + this.lvMapping.UseCompatibleStateImageBehavior = false; + // + // txtMaterialName + // + this.txtMaterialName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMaterialName.Location = new System.Drawing.Point(47, 3); + this.txtMaterialName.Name = "txtMaterialName"; + this.txtMaterialName.Size = new System.Drawing.Size(418, 20); + this.txtMaterialName.TabIndex = 1; + // + // lblMaterialName + // + this.lblMaterialName.AutoSize = true; + this.lblMaterialName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblMaterialName.Location = new System.Drawing.Point(3, 6); + this.lblMaterialName.Name = "lblMaterialName"; + this.lblMaterialName.Size = new System.Drawing.Size(38, 13); + this.lblMaterialName.TabIndex = 0; + this.lblMaterialName.Text = "&Name:"; + // + // fraEdge + // + this.fraEdge.Controls.Add(this.txtEdgeThickness); + this.fraEdge.Controls.Add(this.sldEdgeThickness); + this.fraEdge.Controls.Add(this.label2); + this.fraEdge.Controls.Add(this.pnlColorEdge); + this.fraEdge.Controls.Add(this.cmdColorEdge); + this.fraEdge.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEdge.Location = new System.Drawing.Point(5, 139); + this.fraEdge.Name = "fraEdge"; + this.fraEdge.Size = new System.Drawing.Size(269, 99); + this.fraEdge.TabIndex = 3; + this.fraEdge.TabStop = false; + this.fraEdge.Tag = ""; + this.fraEdge.Text = "Edge"; + // + // txtEdgeThickness + // + this.txtEdgeThickness.Location = new System.Drawing.Point(212, 19); + this.txtEdgeThickness.Name = "txtEdgeThickness"; + this.txtEdgeThickness.Size = new System.Drawing.Size(51, 20); + this.txtEdgeThickness.TabIndex = 10; + this.txtEdgeThickness.Validating += new System.ComponentModel.CancelEventHandler(this.txtEdgeThickness_Validating); + this.txtEdgeThickness.Validated += new System.EventHandler(this.txtEdgeThickness_Validated); + // + // sldEdgeThickness + // + this.sldEdgeThickness.LargeChange = 10; + this.sldEdgeThickness.Location = new System.Drawing.Point(96, 45); + this.sldEdgeThickness.Maximum = 100; + this.sldEdgeThickness.Name = "sldEdgeThickness"; + this.sldEdgeThickness.Size = new System.Drawing.Size(167, 45); + this.sldEdgeThickness.TabIndex = 9; + this.sldEdgeThickness.TickFrequency = 10; + this.sldEdgeThickness.TickStyle = System.Windows.Forms.TickStyle.Both; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(96, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(110, 13); + this.label2.TabIndex = 8; + this.label2.Text = "Edge Line Thic&kness:"; + // + // pnlColorEdge + // + this.pnlColorEdge.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorEdge.Location = new System.Drawing.Point(15, 48); + this.pnlColorEdge.Name = "pnlColorEdge"; + this.pnlColorEdge.Size = new System.Drawing.Size(75, 41); + this.pnlColorEdge.TabIndex = 7; + this.pnlColorEdge.Click += new System.EventHandler(this.cmdColor_Click); + this.pnlColorEdge.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlColorEdge_Paint); + // + // cmdColorEdge + // + this.cmdColorEdge.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorEdge.Location = new System.Drawing.Point(15, 19); + this.cmdColorEdge.Name = "cmdColorEdge"; + this.cmdColorEdge.Size = new System.Drawing.Size(75, 23); + this.cmdColorEdge.TabIndex = 6; + this.cmdColorEdge.Text = "E&dge Color"; + this.cmdColorEdge.UseVisualStyleBackColor = true; + this.cmdColorEdge.Click += new System.EventHandler(this.cmdColor_Click); + // + // fraTextures + // + this.fraTextures.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraTextures.Controls.Add(this.chkMaterialEnableAnimation); + this.fraTextures.Controls.Add(this.cboMaterialToon); + this.fraTextures.Controls.Add(this.chkMaterialEnableGlow); + this.fraTextures.Controls.Add(this.label3); + this.fraTextures.Controls.Add(this.chkMaterialEnableLightSource); + this.fraTextures.Controls.Add(this.lvTextures); + this.fraTextures.Controls.Add(this.cmdTextureClear); + this.fraTextures.Controls.Add(this.cmdTextureRemove); + this.fraTextures.Controls.Add(this.cmdTextureModify); + this.fraTextures.Controls.Add(this.cmdTextureAdd); + this.fraTextures.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraTextures.Location = new System.Drawing.Point(4, 244); + this.fraTextures.Name = "fraTextures"; + this.fraTextures.Size = new System.Drawing.Size(459, 146); + this.fraTextures.TabIndex = 4; + this.fraTextures.TabStop = false; + this.fraTextures.Text = "Textures"; + // + // chkMaterialEnableAnimation + // + this.chkMaterialEnableAnimation.AutoSize = true; + this.chkMaterialEnableAnimation.Location = new System.Drawing.Point(186, 21); + this.chkMaterialEnableAnimation.Name = "chkMaterialEnableAnimation"; + this.chkMaterialEnableAnimation.Size = new System.Drawing.Size(107, 17); + this.chkMaterialEnableAnimation.TabIndex = 0; + this.chkMaterialEnableAnimation.Text = "Enable &animation"; + this.chkMaterialEnableAnimation.UseVisualStyleBackColor = true; + this.chkMaterialEnableAnimation.CheckedChanged += new System.EventHandler(this.chkMaterialFlags_CheckedChanged); + // + // cboMaterialToon + // + this.cboMaterialToon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboMaterialToon.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboMaterialToon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboMaterialToon.FormattingEnabled = true; + this.cboMaterialToon.Items.AddRange(new object[] { + "(none)", + "Toon01.bmp", + "Toon02.bmp", + "Toon03.bmp", + "Toon04.bmp", + "Toon05.bmp", + "Toon06.bmp", + "Toon07.bmp", + "Toon08.bmp", + "Toon09.bmp", + "Toon10.bmp"}); + this.cboMaterialToon.Location = new System.Drawing.Point(348, 19); + this.cboMaterialToon.Name = "cboMaterialToon"; + this.cboMaterialToon.Size = new System.Drawing.Size(105, 21); + this.cboMaterialToon.TabIndex = 3; + // + // chkMaterialEnableGlow + // + this.chkMaterialEnableGlow.AutoSize = true; + this.chkMaterialEnableGlow.Location = new System.Drawing.Point(96, 21); + this.chkMaterialEnableGlow.Name = "chkMaterialEnableGlow"; + this.chkMaterialEnableGlow.Size = new System.Drawing.Size(84, 17); + this.chkMaterialEnableGlow.TabIndex = 0; + this.chkMaterialEnableGlow.Text = "Enable &glow"; + this.chkMaterialEnableGlow.UseVisualStyleBackColor = true; + this.chkMaterialEnableGlow.CheckedChanged += new System.EventHandler(this.chkMaterialFlags_CheckedChanged); + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(307, 24); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Too&n:"; + // + // chkMaterialEnableLightSource + // + this.chkMaterialEnableLightSource.AutoSize = true; + this.chkMaterialEnableLightSource.Location = new System.Drawing.Point(6, 21); + this.chkMaterialEnableLightSource.Name = "chkMaterialEnableLightSource"; + this.chkMaterialEnableLightSource.Size = new System.Drawing.Size(84, 17); + this.chkMaterialEnableLightSource.TabIndex = 0; + this.chkMaterialEnableLightSource.Text = "&Light source"; + this.chkMaterialEnableLightSource.UseVisualStyleBackColor = true; + this.chkMaterialEnableLightSource.CheckedChanged += new System.EventHandler(this.chkMaterialFlags_CheckedChanged); + // + // lvTextures + // + this.lvTextures.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvTextures.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTextureImageFileName, + this.chTextureMapFileName, + this.chTextureDelay}); + this.lvTextures.FullRowSelect = true; + this.lvTextures.GridLines = true; + this.lvTextures.HideSelection = false; + this.lvTextures.Location = new System.Drawing.Point(6, 75); + this.lvTextures.Name = "lvTextures"; + this.lvTextures.Size = new System.Drawing.Size(447, 65); + this.lvTextures.TabIndex = 1; + this.lvTextures.UseCompatibleStateImageBehavior = false; + this.lvTextures.View = System.Windows.Forms.View.Details; + this.lvTextures.ItemActivate += new System.EventHandler(this.lvTextures_ItemActivate); + this.lvTextures.SelectedIndexChanged += new System.EventHandler(this.lvTextures_SelectedIndexChanged); + // + // chTextureImageFileName + // + this.chTextureImageFileName.Text = "Image filename"; + this.chTextureImageFileName.Width = 192; + // + // chTextureMapFileName + // + this.chTextureMapFileName.Text = "Map filename"; + this.chTextureMapFileName.Width = 170; + // + // chTextureDelay + // + this.chTextureDelay.Text = "Delay (ms)"; + this.chTextureDelay.Width = 74; + // + // cmdTextureClear + // + this.cmdTextureClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdTextureClear.Enabled = false; + this.cmdTextureClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureClear.Location = new System.Drawing.Point(378, 46); + this.cmdTextureClear.Name = "cmdTextureClear"; + this.cmdTextureClear.Size = new System.Drawing.Size(75, 23); + this.cmdTextureClear.TabIndex = 0; + this.cmdTextureClear.Text = "&Clear"; + this.cmdTextureClear.UseVisualStyleBackColor = true; + this.cmdTextureClear.Click += new System.EventHandler(this.cmdTextureClear_Click); + // + // cmdTextureRemove + // + this.cmdTextureRemove.Enabled = false; + this.cmdTextureRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureRemove.Location = new System.Drawing.Point(168, 46); + this.cmdTextureRemove.Name = "cmdTextureRemove"; + this.cmdTextureRemove.Size = new System.Drawing.Size(75, 23); + this.cmdTextureRemove.TabIndex = 0; + this.cmdTextureRemove.Text = "&Remove"; + this.cmdTextureRemove.UseVisualStyleBackColor = true; + this.cmdTextureRemove.Click += new System.EventHandler(this.cmdTextureRemove_Click); + // + // cmdTextureModify + // + this.cmdTextureModify.Enabled = false; + this.cmdTextureModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureModify.Location = new System.Drawing.Point(87, 46); + this.cmdTextureModify.Name = "cmdTextureModify"; + this.cmdTextureModify.Size = new System.Drawing.Size(75, 23); + this.cmdTextureModify.TabIndex = 0; + this.cmdTextureModify.Text = "&Modify..."; + this.cmdTextureModify.UseVisualStyleBackColor = true; + this.cmdTextureModify.Click += new System.EventHandler(this.cmdTextureModify_Click); + // + // cmdTextureAdd + // + this.cmdTextureAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureAdd.Location = new System.Drawing.Point(6, 46); + this.cmdTextureAdd.Name = "cmdTextureAdd"; + this.cmdTextureAdd.Size = new System.Drawing.Size(75, 23); + this.cmdTextureAdd.TabIndex = 0; + this.cmdTextureAdd.Text = "&Add..."; + this.cmdTextureAdd.UseVisualStyleBackColor = true; + this.cmdTextureAdd.Click += new System.EventHandler(this.cmdTextureAdd_Click); + // + // fraColors + // + this.fraColors.Controls.Add(this.pnlColorEmissive); + this.fraColors.Controls.Add(this.pnlColorSpecular); + this.fraColors.Controls.Add(this.pnlColorDiffuse); + this.fraColors.Controls.Add(this.pnlColorAmbient); + this.fraColors.Controls.Add(this.cmdColorEmissive); + this.fraColors.Controls.Add(this.cmdColorSpecular); + this.fraColors.Controls.Add(this.cmdColorDiffuse); + this.fraColors.Controls.Add(this.cmdColorAmbient); + this.fraColors.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraColors.Location = new System.Drawing.Point(4, 30); + this.fraColors.Name = "fraColors"; + this.fraColors.Size = new System.Drawing.Size(270, 103); + this.fraColors.TabIndex = 2; + this.fraColors.TabStop = false; + this.fraColors.Text = "Colors"; + // + // pnlColorEmissive + // + this.pnlColorEmissive.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorEmissive.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorEmissive.Location = new System.Drawing.Point(200, 48); + this.pnlColorEmissive.Name = "pnlColorEmissive"; + this.pnlColorEmissive.Size = new System.Drawing.Size(55, 41); + this.pnlColorEmissive.TabIndex = 7; + this.pnlColorEmissive.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorSpecular + // + this.pnlColorSpecular.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorSpecular.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorSpecular.Location = new System.Drawing.Point(139, 48); + this.pnlColorSpecular.Name = "pnlColorSpecular"; + this.pnlColorSpecular.Size = new System.Drawing.Size(55, 41); + this.pnlColorSpecular.TabIndex = 5; + this.pnlColorSpecular.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorDiffuse + // + this.pnlColorDiffuse.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorDiffuse.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorDiffuse.Location = new System.Drawing.Point(78, 48); + this.pnlColorDiffuse.Name = "pnlColorDiffuse"; + this.pnlColorDiffuse.Size = new System.Drawing.Size(55, 41); + this.pnlColorDiffuse.TabIndex = 3; + this.pnlColorDiffuse.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorAmbient + // + this.pnlColorAmbient.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorAmbient.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorAmbient.Location = new System.Drawing.Point(17, 48); + this.pnlColorAmbient.Name = "pnlColorAmbient"; + this.pnlColorAmbient.Size = new System.Drawing.Size(55, 41); + this.pnlColorAmbient.TabIndex = 1; + this.pnlColorAmbient.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorEmissive + // + this.cmdColorEmissive.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorEmissive.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorEmissive.Location = new System.Drawing.Point(200, 19); + this.cmdColorEmissive.Name = "cmdColorEmissive"; + this.cmdColorEmissive.Size = new System.Drawing.Size(55, 23); + this.cmdColorEmissive.TabIndex = 6; + this.cmdColorEmissive.Text = "E&missive"; + this.cmdColorEmissive.UseVisualStyleBackColor = true; + this.cmdColorEmissive.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorSpecular + // + this.cmdColorSpecular.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorSpecular.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorSpecular.Location = new System.Drawing.Point(139, 19); + this.cmdColorSpecular.Name = "cmdColorSpecular"; + this.cmdColorSpecular.Size = new System.Drawing.Size(55, 23); + this.cmdColorSpecular.TabIndex = 4; + this.cmdColorSpecular.Text = "&Specular"; + this.cmdColorSpecular.UseVisualStyleBackColor = true; + this.cmdColorSpecular.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorDiffuse + // + this.cmdColorDiffuse.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorDiffuse.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorDiffuse.Location = new System.Drawing.Point(78, 19); + this.cmdColorDiffuse.Name = "cmdColorDiffuse"; + this.cmdColorDiffuse.Size = new System.Drawing.Size(55, 23); + this.cmdColorDiffuse.TabIndex = 2; + this.cmdColorDiffuse.Text = "&Diffuse"; + this.cmdColorDiffuse.UseVisualStyleBackColor = true; + this.cmdColorDiffuse.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorAmbient + // + this.cmdColorAmbient.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorAmbient.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorAmbient.Location = new System.Drawing.Point(17, 19); + this.cmdColorAmbient.Name = "cmdColorAmbient"; + this.cmdColorAmbient.Size = new System.Drawing.Size(55, 23); + this.cmdColorAmbient.TabIndex = 0; + this.cmdColorAmbient.Text = "&Ambient"; + this.cmdColorAmbient.UseVisualStyleBackColor = true; + this.cmdColorAmbient.Click += new System.EventHandler(this.cmdColor_Click); + // + // ModelEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.MinimumSize = new System.Drawing.Size(660, 393); + this.Name = "ModelEditor"; + this.Size = new System.Drawing.Size(660, 393); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.mnuContextTreeView.ResumeLayout(false); + this.pnlBonesGroup.ResumeLayout(false); + this.pnlBonesGroup.PerformLayout(); + this.pnlBonesBone.ResumeLayout(false); + this.pnlBonesBone.PerformLayout(); + this.pnlResourcesStringTable.ResumeLayout(false); + this.pnlResourcesStringTable.PerformLayout(); + this.pnlMaterialsMaterial.ResumeLayout(false); + this.pnlMaterialsMaterial.PerformLayout(); + this.fraToon.ResumeLayout(false); + this.fraEdge.ResumeLayout(false); + this.fraEdge.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldEdgeThickness)).EndInit(); + this.fraTextures.ResumeLayout(false); + this.fraTextures.PerformLayout(); + this.fraColors.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlResourcesStringTable; + private System.Windows.Forms.ComboBox cboLanguage; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel pnlMaterialsMaterial; + private System.Windows.Forms.GroupBox fraTextures; + private System.Windows.Forms.GroupBox fraColors; + private System.Windows.Forms.Panel pnlColorSpecular; + private System.Windows.Forms.Panel pnlColorDiffuse; + private System.Windows.Forms.Panel pnlColorAmbient; + private System.Windows.Forms.Button cmdColorSpecular; + private System.Windows.Forms.Button cmdColorDiffuse; + private System.Windows.Forms.Button cmdColorAmbient; + private System.Windows.Forms.GroupBox fraEdge; + private System.Windows.Forms.Panel pnlColorEmissive; + private System.Windows.Forms.Button cmdColorEmissive; + private System.Windows.Forms.TextBox txtMaterialName; + private System.Windows.Forms.Label lblMaterialName; + private System.Windows.Forms.Panel pnlColorEdge; + private System.Windows.Forms.Button cmdColorEdge; + private System.Windows.Forms.TrackBar sldEdgeThickness; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtEdgeThickness; + private System.Windows.Forms.GroupBox fraToon; + private System.Windows.Forms.ListView lvTextures; + private System.Windows.Forms.Button cmdTextureClear; + private System.Windows.Forms.Button cmdTextureRemove; + private System.Windows.Forms.Button cmdTextureModify; + private System.Windows.Forms.Button cmdTextureAdd; + private System.Windows.Forms.ColumnHeader chTextureImageFileName; + private System.Windows.Forms.ColumnHeader chTextureMapFileName; + private System.Windows.Forms.ColumnHeader chTextureDelay; + private System.Windows.Forms.ComboBox cboMaterialToon; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ListView lvMapping; + private AwesomeControls.CommandBars.CBContextMenu mnuContextTreeView; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAdd; + private System.Windows.Forms.ToolStripMenuItem vertexToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem materialToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boneToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem faceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem groupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem stringTableToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toonToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem rigidBodyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jointToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewPaste; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewDelete; + private System.Windows.Forms.Panel pnlBonesBone; + private System.Windows.Forms.TextBox txtBoneName; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox cboBoneType; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox chkMaterialEnableAnimation; + private System.Windows.Forms.CheckBox chkMaterialEnableGlow; + private System.Windows.Forms.CheckBox chkMaterialEnableLightSource; + private System.Windows.Forms.Panel pnlBonesGroup; + private System.Windows.Forms.TextBox txtGroupName; + private System.Windows.Forms.Label label13; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.resx new file mode 100644 index 00000000..81998adf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/ModelEditor.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.cs new file mode 100644 index 00000000..0c41b682 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.cs @@ -0,0 +1,488 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.Multimedia3D.Model; +using UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Dialogs; + +using AwesomeControls.PropertyGrid; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors +{ + public partial class ModelEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(ModelObjectModel)); + } + return _er; + } + public ModelEditor() + { + InitializeComponent(); + + // cboMaterialToon.SelectedIndex = 0; + + PropertyDataType dtTorus = new PropertyDataType("Torus"); + + PropertyGroup pgTorus_AU_IB = new PropertyGroup("Torus_AU_IB", dtTorus); + + PropertyDataType dtVector3 = new PropertyDataType("Vector3"); + dtVector3.Properties.Add(new Property("X")); + dtVector3.Properties.Add(new Property("Y")); + dtVector3.Properties.Add(new Property("Z")); + dtVector3.PropertyValueRendering += delegate(object sender, PropertyValueRenderingEventArgs e) + { + StringBuilder sb = new StringBuilder(); + sb.Append("{ "); + sb.Append(e.Property.Properties["X"].Value.ToString()); + sb.Append(", "); + sb.Append(e.Property.Properties["Y"].Value.ToString()); + sb.Append(", "); + sb.Append(e.Property.Properties["Z"].Value.ToString()); + sb.Append(" }"); + e.DisplayString = sb.ToString(); + }; + dtVector3.PropertyValueParsing += delegate(object sender, PropertyValueParsingEventArgs e) + { + string w = e.DisplayString; + if (!w.StartsWith("{") && !w.EndsWith("}")) + { + e.Cancel = true; + return; + } + w = w.Substring(1, w.Length - 2).Trim(); + string[] x = w.Split(","); + if (x.Length != 3) + { + } + }; + + pgTorus_AU_IB.Properties.Add(new Property("Translate")); + pgTorus_AU_IB.Properties[pgTorus_AU_IB.Properties.Count - 1].DataType = dtVector3; + pgTorus_AU_IB.Properties[pgTorus_AU_IB.Properties.Count - 1].Properties["X"].Value = -3.713; + pgTorus_AU_IB.Properties[pgTorus_AU_IB.Properties.Count - 1].Properties["Y"].Value = 0.000; + pgTorus_AU_IB.Properties[pgTorus_AU_IB.Properties.Count - 1].Properties["Z"].Value = 3.984; + + base.PropertyGroups.Add(pgTorus_AU_IB); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + Refresh(); + } + public override void Refresh() + { + base.Refresh(); + + TreeNode tnModel = tv.Nodes["nodeModel"]; + tnModel.Nodes["nodeBones"].Nodes.Clear(); + tnModel.Nodes["nodeMaterials"].Nodes.Clear(); + + ModelObjectModel model = (ObjectModel as ModelObjectModel); + if (model == null) + { + return; + } + + foreach (ModelBoneGroup group in model.BoneGroups) + { + TreeNode tnGroup = new TreeNode(); + tnGroup.Text = group.Name; + tnGroup.Tag = group; + foreach (ModelBone bone in group.Bones) + { + TreeNode tnBon = new TreeNode(); + tnBon.Text = bone.Name; + tnBon.Tag = bone; + tnGroup.Nodes.Add(tnBon); + } + tnModel.Nodes["nodeBones"].Nodes.Add(tnGroup); + } + + foreach (ModelMaterial mat in model.Materials) + { + TreeNode tnMat = new TreeNode(); + tnMat.Text = mat.Name; + tnMat.Tag = mat; + tnModel.Nodes["nodeMaterials"].Nodes.Add(tnMat); + } + } + + private void cmdColor_Click(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + ColorDialog dlg = new ColorDialog(); + if (sender == cmdColorAmbient || sender == pnlColorAmbient) + { + dlg.Color = mat.AmbientColor.ToGdiColor(); + } + else if (sender == cmdColorDiffuse || sender == pnlColorDiffuse) + { + dlg.Color = mat.DiffuseColor.ToGdiColor(); + } + else if (sender == cmdColorSpecular || sender == pnlColorSpecular) + { + dlg.Color = mat.SpecularColor.ToGdiColor(); + } + else if (sender == cmdColorEmissive || sender == pnlColorEmissive) + { + dlg.Color = mat.EmissiveColor.ToGdiColor(); + } + else if (sender == cmdColorEdge || sender == pnlColorEdge) + { + dlg.Color = mat.EdgeColor.ToGdiColor(); + } + if (dlg.ShowDialog() == DialogResult.OK) + { + if (sender == cmdColorAmbient || sender == pnlColorAmbient) + { + pnlColorAmbient.BackColor = dlg.Color; + mat.AmbientColor = dlg.Color.ToUniversalColor(); + } + else if (sender == cmdColorDiffuse || sender == pnlColorDiffuse) + { + pnlColorDiffuse.BackColor = dlg.Color; + mat.DiffuseColor = dlg.Color.ToUniversalColor(); + } + else if (sender == cmdColorSpecular || sender == pnlColorSpecular) + { + pnlColorSpecular.BackColor = dlg.Color; + mat.SpecularColor = dlg.Color.ToUniversalColor(); + } + else if (sender == cmdColorEmissive || sender == pnlColorEmissive) + { + pnlColorEmissive.BackColor = dlg.Color; + mat.EmissiveColor = dlg.Color.ToUniversalColor(); + } + else if (sender == cmdColorEdge || sender == pnlColorEdge) + { + pnlColorEdge.BackColor = dlg.Color; + mat.EdgeColor = dlg.Color.ToUniversalColor(); + } + } + } + + private void SwitchPanel(Panel panel) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (ctl == panel) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (tv.SelectedNode != null) + { + if (tv.SelectedNode.Tag is ModelMaterial) + { + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + txtMaterialName.Text = mat.Name; + + pnlColorAmbient.BackColor = mat.AmbientColor.ToGdiColor(); + pnlColorDiffuse.BackColor = mat.DiffuseColor.ToGdiColor(); + pnlColorSpecular.BackColor = mat.SpecularColor.ToGdiColor(); + pnlColorEmissive.BackColor = mat.EmissiveColor.ToGdiColor(); + pnlColorEdge.BackColor = mat.EdgeColor.ToGdiColor(); + + chkMaterialEnableAnimation.Checked = mat.EnableAnimation; + chkMaterialEnableLightSource.Checked = mat.AlwaysLight; + chkMaterialEnableGlow.Checked = mat.EnableGlow; + + lvTextures.Items.Clear(); + foreach (ModelTexture tex in mat.Textures) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = tex; + lvi.Text = tex.TextureFileName; + lvi.SubItems.Add(tex.MapFileName); + lvi.SubItems.Add(tex.Duration.ToString() + " ms"); + lvTextures.Items.Add(lvi); + } + cmdTextureClear.Enabled = (lvTextures.Items.Count > 0); + + sldEdgeThickness.Value = (int)(mat.EdgeSize * 100); + txtEdgeThickness.Text = mat.EdgeSize.ToString(); + SwitchPanel(pnlMaterialsMaterial); + } + else if (tv.SelectedNode.Tag is ModelBone) + { + ModelBone bon = (tv.SelectedNode.Tag as ModelBone); + txtBoneName.Text = bon.Name; + cboBoneType.SelectedIndex = (int)(bon.BoneType + 1); + + SwitchPanel(pnlBonesBone); + } + else if (tv.SelectedNode.Tag is ModelBoneGroup) + { + ModelBoneGroup grp = (tv.SelectedNode.Tag as ModelBoneGroup); + txtGroupName.Text = grp.Name; + + SwitchPanel(pnlBonesGroup); + } + else if (tv.SelectedNode.Name == "nodeModel") + { + SwitchPanel(pnlModelEditor); + } + else + { + SwitchPanel(null); + } + } + else + { + SwitchPanel(null); + } + } + + private void pnlColorEdge_Paint(object sender, PaintEventArgs e) + { + + } + + private void txtEdgeThickness_Validating(object sender, CancelEventArgs e) + { + float dummy = 0.0f; + if (!Single.TryParse(txtEdgeThickness.Text, out dummy)) + { + MessageBox.Show("Please enter a single-precision floating-point value between 0.0 and 1.0.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + return; + } + else if (dummy > 1.0f) + { + MessageBox.Show("Please enter a single-precision floating-point value between 0.0 and 1.0.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + e.Cancel = true; + return; + } + } + + private void txtEdgeThickness_Validated(object sender, EventArgs e) + { + sldEdgeThickness.Value = (int)(Single.Parse(txtEdgeThickness.Text) * 100); + txtEdgeThickness.Text = (sldEdgeThickness.Value / sldEdgeThickness.Maximum).ToString(); + } + + private void chkMaterialFlags_CheckedChanged(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + mat.EnableAnimation = chkMaterialEnableAnimation.Checked; + mat.EnableGlow = chkMaterialEnableGlow.Checked; + mat.AlwaysLight = chkMaterialEnableLightSource.Checked; + } + + private void txtGroupName_Validated(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + + ModelBoneGroup grp = (tv.SelectedNode.Tag as ModelBoneGroup); + if (grp == null) return; + + BeginEdit(); + grp.Name = txtGroupName.Text; + tv.SelectedNode.Text = grp.Name; + EndEdit(); + } + + private void tv_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node != null) + { + if (!(e.Node.Tag is ModelBone || e.Node.Tag is ModelBoneGroup || e.Node.Tag is ModelMaterial)) + { + e.CancelEdit = true; + return; + } + } + } + private void tv_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Node != null) + { + if (e.Node.Tag == null) return; + if (e.Label == null) return; + + BeginEdit(); + if (e.Node.Tag is ModelBone) + { + ModelBone item = (e.Node.Tag as ModelBone); + item.Name = e.Label; + txtBoneName.Text = item.Name; + } + else if (e.Node.Tag is ModelBoneGroup) + { + ModelBoneGroup item = (e.Node.Tag as ModelBoneGroup); + item.Name = e.Label; + txtGroupName.Text = item.Name; + } + else if (e.Node.Tag is ModelMaterial) + { + ModelMaterial item = (e.Node.Tag as ModelMaterial); + item.Name = e.Label; + txtMaterialName.Text = item.Name; + } + EndEdit(); + } + } + + private void cmdTextureAdd_Click(object sender, EventArgs e) + { + ModelObjectModel model = (base.ObjectModel as ModelObjectModel); + if (model == null) return; + + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + TexturePropertiesDialog dlg = new TexturePropertiesDialog(); + dlg.ParentModel = model; + if (dlg.ShowDialog() == DialogResult.OK) + { + ModelTexture tex = new ModelTexture(); + tex.Duration = (int)dlg.txtDuration.Value; + tex.TextureFileName = dlg.txtTextureFileName.Text; + tex.MapFileName = dlg.txtMapFileName.Text; + tex.Flags = ModelTextureFlags.None; + + if (dlg.chkFlagAddMap.Checked) + { + tex.Flags |= ModelTextureFlags.AddMap; + } + if (dlg.chkFlagMap.Checked) + { + tex.Flags |= ModelTextureFlags.Map; + } + if (dlg.chkFlagTexture.Checked) + { + tex.Flags |= ModelTextureFlags.Texture; + } + + mat.Textures.Add(tex); + + ListViewItem lvi = new ListViewItem(); + lvi.Tag = tex; + lvi.Text = tex.TextureFileName; + lvi.SubItems.Add(tex.MapFileName); + lvi.SubItems.Add(tex.Duration.ToString() + " ms"); + lvTextures.Items.Add(lvi); + } + } + + private void cmdTextureModify_Click(object sender, EventArgs e) + { + ModelObjectModel model = (base.ObjectModel as ModelObjectModel); + if (model == null) return; + + if (lvTextures.SelectedItems.Count != 1) return; + ListViewItem lvi = lvTextures.SelectedItems[0]; + ModelTexture tex = (lvi.Tag as ModelTexture); + if (tex == null) return; + + TexturePropertiesDialog dlg = new TexturePropertiesDialog(); + dlg.ParentModel = model; + + + dlg.txtDuration.Value = tex.Duration; + dlg.txtMapFileName.Text = tex.MapFileName; + dlg.txtTextureFileName.Text = tex.TextureFileName; + + dlg.chkFlagAddMap.Checked = ((tex.Flags & ModelTextureFlags.AddMap) == ModelTextureFlags.AddMap); + dlg.chkFlagMap.Checked = ((tex.Flags & ModelTextureFlags.Map) == ModelTextureFlags.Map); + dlg.chkFlagTexture.Checked = ((tex.Flags & ModelTextureFlags.Texture) == ModelTextureFlags.Texture); + + if (dlg.ShowDialog() == DialogResult.OK) + { + tex.Duration = (int)dlg.txtDuration.Value; + tex.MapFileName = dlg.txtMapFileName.Text; + tex.TextureFileName = dlg.txtTextureFileName.Text; + + tex.Flags = ModelTextureFlags.None; + if (dlg.chkFlagAddMap.Checked) tex.Flags |= ModelTextureFlags.AddMap; + if (dlg.chkFlagMap.Checked) tex.Flags |= ModelTextureFlags.Map; + if (dlg.chkFlagTexture.Checked) tex.Flags |= ModelTextureFlags.Texture; + + lvi.Text = tex.TextureFileName; + lvi.SubItems[1].Text = tex.MapFileName; + lvi.SubItems[2].Text = (tex.Duration.ToString() + " ms"); + } + } + + private void cmdTextureClear_Click(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + if (MessageBox.Show("Are you sure you want to remove all textures?", "Remove All Textures", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + mat.Textures.Clear(); + lvTextures.Items.Clear(); + } + + private void lvTextures_SelectedIndexChanged(object sender, EventArgs e) + { + cmdTextureModify.Enabled = (lvTextures.SelectedItems.Count == 1); + cmdTextureRemove.Enabled = (lvTextures.SelectedItems.Count > 0); + } + + private void cmdTextureRemove_Click(object sender, EventArgs e) + { + if (tv.SelectedNode == null) return; + ModelMaterial mat = (tv.SelectedNode.Tag as ModelMaterial); + if (mat == null) return; + + string sz = "texture", sz1 = "Texture"; + if (lvTextures.SelectedItems.Count > 1) + { + sz = "textures"; + sz1 = "Textures"; + } + if (MessageBox.Show("Are you sure you want to remove the selected " + sz + "?", "Remove " + sz1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; + + while (lvTextures.SelectedItems.Count > 0) + { + ModelTexture tex = (lvTextures.SelectedItems[0].Tag as ModelTexture); + mat.Textures.Remove(tex); + + lvTextures.SelectedItems[0].Remove(); + } + } + + private void lvTextures_ItemActivate(object sender, EventArgs e) + { + if (lvTextures.SelectedItems.Count == 1) + { + cmdTextureModify_Click(sender, e); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.designer.cs new file mode 100644 index 00000000..90319872 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.designer.cs @@ -0,0 +1,1026 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors +{ + partial class ModelEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Materials"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Bones"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Inverse Kinematics"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Faces"); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("String Table"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Resources", new System.Windows.Forms.TreeNode[] { + treeNode5}); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Toons"); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("Physics"); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("Joints"); + System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("Model", new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3, + treeNode4, + treeNode6, + treeNode7, + treeNode8, + treeNode9}); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContextTreeView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextTreeViewAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.vertexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.materialToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.boneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.faceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.groupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.stringTableToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.rigidBodyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.jointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.pnlMaterialsMaterial = new System.Windows.Forms.Panel(); + this.fraToon = new System.Windows.Forms.GroupBox(); + this.lvMapping = new System.Windows.Forms.ListView(); + this.txtMaterialName = new System.Windows.Forms.TextBox(); + this.lblMaterialName = new System.Windows.Forms.Label(); + this.fraEdge = new System.Windows.Forms.GroupBox(); + this.txtEdgeThickness = new System.Windows.Forms.TextBox(); + this.sldEdgeThickness = new System.Windows.Forms.TrackBar(); + this.label2 = new System.Windows.Forms.Label(); + this.pnlColorEdge = new System.Windows.Forms.Panel(); + this.cmdColorEdge = new System.Windows.Forms.Button(); + this.fraTextures = new System.Windows.Forms.GroupBox(); + this.chkMaterialEnableAnimation = new System.Windows.Forms.CheckBox(); + this.cboMaterialToon = new System.Windows.Forms.ComboBox(); + this.chkMaterialEnableGlow = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); + this.chkMaterialEnableLightSource = new System.Windows.Forms.CheckBox(); + this.lvTextures = new System.Windows.Forms.ListView(); + this.chTextureImageFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chTextureMapFileName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chTextureDelay = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdTextureClear = new System.Windows.Forms.Button(); + this.cmdTextureRemove = new System.Windows.Forms.Button(); + this.cmdTextureModify = new System.Windows.Forms.Button(); + this.cmdTextureAdd = new System.Windows.Forms.Button(); + this.fraColors = new System.Windows.Forms.GroupBox(); + this.pnlColorEmissive = new System.Windows.Forms.Panel(); + this.pnlColorSpecular = new System.Windows.Forms.Panel(); + this.pnlColorDiffuse = new System.Windows.Forms.Panel(); + this.pnlColorAmbient = new System.Windows.Forms.Panel(); + this.cmdColorEmissive = new System.Windows.Forms.Button(); + this.cmdColorSpecular = new System.Windows.Forms.Button(); + this.cmdColorDiffuse = new System.Windows.Forms.Button(); + this.cmdColorAmbient = new System.Windows.Forms.Button(); + this.pnlBonesGroup = new System.Windows.Forms.Panel(); + this.txtGroupName = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.pnlBonesBone = new System.Windows.Forms.Panel(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.cboBoneType = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.txtBoneName = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.pnlResourcesStringTable = new System.Windows.Forms.Panel(); + this.cboLanguage = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.pnlModelEditor = new System.Windows.Forms.Panel(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.mnuContextTreeView.SuspendLayout(); + this.pnlMaterialsMaterial.SuspendLayout(); + this.fraToon.SuspendLayout(); + this.fraEdge.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldEdgeThickness)).BeginInit(); + this.fraTextures.SuspendLayout(); + this.fraColors.SuspendLayout(); + this.pnlBonesGroup.SuspendLayout(); + this.pnlBonesBone.SuspendLayout(); + this.pnlResourcesStringTable.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlModelEditor); + this.splitContainer1.Panel2.Controls.Add(this.pnlBonesGroup); + this.splitContainer1.Panel2.Controls.Add(this.pnlBonesBone); + this.splitContainer1.Panel2.Controls.Add(this.pnlResourcesStringTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlMaterialsMaterial); + this.splitContainer1.Size = new System.Drawing.Size(805, 306); + this.splitContainer1.SplitterDistance = 188; + this.splitContainer1.TabIndex = 1; + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContextTreeView; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.LabelEdit = true; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + treeNode1.Name = "nodeMaterials"; + treeNode1.Text = "Materials"; + treeNode2.Name = "nodeBones"; + treeNode2.Text = "Bones"; + treeNode3.Name = "nodeInverseKinematics"; + treeNode3.Text = "Inverse Kinematics"; + treeNode4.Name = "nodeFaces"; + treeNode4.Text = "Faces"; + treeNode5.Name = "nodeStringTable"; + treeNode5.Text = "String Table"; + treeNode6.Name = "nodeResources"; + treeNode6.Text = "Resources"; + treeNode7.Name = "nodeToons"; + treeNode7.Text = "Toons"; + treeNode8.Name = "nodePhysics"; + treeNode8.Text = "Physics"; + treeNode9.Name = "nodeJoints"; + treeNode9.Text = "Joints"; + treeNode10.Name = "nodeModel"; + treeNode10.Text = "Model"; + this.tv.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode10}); + this.tv.Size = new System.Drawing.Size(188, 306); + this.tv.TabIndex = 0; + this.tv.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_BeforeLabelEdit); + this.tv.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tv_AfterLabelEdit); + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + // + // mnuContextTreeView + // + this.mnuContextTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewAdd, + this.toolStripMenuItem2, + this.mnuContextTreeViewCut, + this.mnuContextTreeViewCopy, + this.mnuContextTreeViewPaste, + this.mnuContextTreeViewDelete}); + this.mnuContextTreeView.Name = "mnuContextTreeView"; + this.mnuContextTreeView.Size = new System.Drawing.Size(140, 120); + // + // mnuContextTreeViewAdd + // + this.mnuContextTreeViewAdd.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.vertexToolStripMenuItem, + this.materialToolStripMenuItem, + this.boneToolStripMenuItem, + this.faceToolStripMenuItem, + this.groupToolStripMenuItem, + this.stringTableToolStripMenuItem, + this.toonToolStripMenuItem, + this.toolStripMenuItem1, + this.rigidBodyToolStripMenuItem, + this.jointToolStripMenuItem}); + this.mnuContextTreeViewAdd.Name = "mnuContextTreeViewAdd"; + this.mnuContextTreeViewAdd.Size = new System.Drawing.Size(139, 22); + this.mnuContextTreeViewAdd.Text = "A&dd"; + // + // vertexToolStripMenuItem + // + this.vertexToolStripMenuItem.Name = "vertexToolStripMenuItem"; + this.vertexToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.vertexToolStripMenuItem.Text = "&Vertex"; + // + // materialToolStripMenuItem + // + this.materialToolStripMenuItem.Name = "materialToolStripMenuItem"; + this.materialToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.materialToolStripMenuItem.Text = "&Material"; + // + // boneToolStripMenuItem + // + this.boneToolStripMenuItem.Name = "boneToolStripMenuItem"; + this.boneToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.boneToolStripMenuItem.Text = "&Bone"; + // + // faceToolStripMenuItem + // + this.faceToolStripMenuItem.Name = "faceToolStripMenuItem"; + this.faceToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.faceToolStripMenuItem.Text = "&Face"; + // + // groupToolStripMenuItem + // + this.groupToolStripMenuItem.Name = "groupToolStripMenuItem"; + this.groupToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.groupToolStripMenuItem.Text = "&Group"; + // + // stringTableToolStripMenuItem + // + this.stringTableToolStripMenuItem.Name = "stringTableToolStripMenuItem"; + this.stringTableToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.stringTableToolStripMenuItem.Text = "&String Table"; + // + // toonToolStripMenuItem + // + this.toonToolStripMenuItem.Name = "toonToolStripMenuItem"; + this.toonToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.toonToolStripMenuItem.Text = "&Toon"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(134, 6); + // + // rigidBodyToolStripMenuItem + // + this.rigidBodyToolStripMenuItem.Name = "rigidBodyToolStripMenuItem"; + this.rigidBodyToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.rigidBodyToolStripMenuItem.Text = "&Rigid Body"; + // + // jointToolStripMenuItem + // + this.jointToolStripMenuItem.Name = "jointToolStripMenuItem"; + this.jointToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.jointToolStripMenuItem.Text = "&Joint"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(136, 6); + // + // mnuContextTreeViewCut + // + this.mnuContextTreeViewCut.Name = "mnuContextTreeViewCut"; + this.mnuContextTreeViewCut.ShortcutKeyDisplayString = "Ctrl+X"; + this.mnuContextTreeViewCut.Size = new System.Drawing.Size(139, 22); + this.mnuContextTreeViewCut.Text = "Cu&t"; + // + // mnuContextTreeViewCopy + // + this.mnuContextTreeViewCopy.Name = "mnuContextTreeViewCopy"; + this.mnuContextTreeViewCopy.ShortcutKeyDisplayString = "Ctrl+C"; + this.mnuContextTreeViewCopy.Size = new System.Drawing.Size(139, 22); + this.mnuContextTreeViewCopy.Text = "&Copy"; + // + // mnuContextTreeViewPaste + // + this.mnuContextTreeViewPaste.Name = "mnuContextTreeViewPaste"; + this.mnuContextTreeViewPaste.ShortcutKeyDisplayString = "Ctrl+V"; + this.mnuContextTreeViewPaste.Size = new System.Drawing.Size(139, 22); + this.mnuContextTreeViewPaste.Text = "&Paste"; + // + // mnuContextTreeViewDelete + // + this.mnuContextTreeViewDelete.Name = "mnuContextTreeViewDelete"; + this.mnuContextTreeViewDelete.ShortcutKeyDisplayString = "Del"; + this.mnuContextTreeViewDelete.Size = new System.Drawing.Size(139, 22); + this.mnuContextTreeViewDelete.Text = "&Delete"; + // + // pnlMaterialsMaterial + // + this.pnlMaterialsMaterial.Controls.Add(this.fraToon); + this.pnlMaterialsMaterial.Controls.Add(this.txtMaterialName); + this.pnlMaterialsMaterial.Controls.Add(this.lblMaterialName); + this.pnlMaterialsMaterial.Controls.Add(this.fraEdge); + this.pnlMaterialsMaterial.Controls.Add(this.fraTextures); + this.pnlMaterialsMaterial.Controls.Add(this.fraColors); + this.pnlMaterialsMaterial.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlMaterialsMaterial.Location = new System.Drawing.Point(0, 0); + this.pnlMaterialsMaterial.Name = "pnlMaterialsMaterial"; + this.pnlMaterialsMaterial.Size = new System.Drawing.Size(613, 306); + this.pnlMaterialsMaterial.TabIndex = 0; + this.pnlMaterialsMaterial.Visible = false; + // + // fraToon + // + this.fraToon.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.fraToon.Controls.Add(this.lvMapping); + this.fraToon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraToon.Location = new System.Drawing.Point(4, 244); + this.fraToon.Name = "fraToon"; + this.fraToon.Size = new System.Drawing.Size(270, 59); + this.fraToon.TabIndex = 5; + this.fraToon.TabStop = false; + this.fraToon.Text = "Mapping"; + // + // lvMapping + // + this.lvMapping.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvMapping.Location = new System.Drawing.Point(6, 19); + this.lvMapping.Name = "lvMapping"; + this.lvMapping.Size = new System.Drawing.Size(258, 35); + this.lvMapping.TabIndex = 0; + this.lvMapping.UseCompatibleStateImageBehavior = false; + // + // txtMaterialName + // + this.txtMaterialName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMaterialName.Location = new System.Drawing.Point(47, 3); + this.txtMaterialName.Name = "txtMaterialName"; + this.txtMaterialName.Size = new System.Drawing.Size(563, 20); + this.txtMaterialName.TabIndex = 1; + // + // lblMaterialName + // + this.lblMaterialName.AutoSize = true; + this.lblMaterialName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblMaterialName.Location = new System.Drawing.Point(3, 6); + this.lblMaterialName.Name = "lblMaterialName"; + this.lblMaterialName.Size = new System.Drawing.Size(38, 13); + this.lblMaterialName.TabIndex = 0; + this.lblMaterialName.Text = "&Name:"; + // + // fraEdge + // + this.fraEdge.Controls.Add(this.txtEdgeThickness); + this.fraEdge.Controls.Add(this.sldEdgeThickness); + this.fraEdge.Controls.Add(this.label2); + this.fraEdge.Controls.Add(this.pnlColorEdge); + this.fraEdge.Controls.Add(this.cmdColorEdge); + this.fraEdge.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraEdge.Location = new System.Drawing.Point(5, 139); + this.fraEdge.Name = "fraEdge"; + this.fraEdge.Size = new System.Drawing.Size(269, 99); + this.fraEdge.TabIndex = 3; + this.fraEdge.TabStop = false; + this.fraEdge.Tag = ""; + this.fraEdge.Text = "Edge"; + // + // txtEdgeThickness + // + this.txtEdgeThickness.Location = new System.Drawing.Point(212, 19); + this.txtEdgeThickness.Name = "txtEdgeThickness"; + this.txtEdgeThickness.Size = new System.Drawing.Size(51, 20); + this.txtEdgeThickness.TabIndex = 10; + this.txtEdgeThickness.Validating += new System.ComponentModel.CancelEventHandler(this.txtEdgeThickness_Validating); + this.txtEdgeThickness.Validated += new System.EventHandler(this.txtEdgeThickness_Validated); + // + // sldEdgeThickness + // + this.sldEdgeThickness.LargeChange = 10; + this.sldEdgeThickness.Location = new System.Drawing.Point(96, 45); + this.sldEdgeThickness.Maximum = 100; + this.sldEdgeThickness.Name = "sldEdgeThickness"; + this.sldEdgeThickness.Size = new System.Drawing.Size(167, 45); + this.sldEdgeThickness.TabIndex = 9; + this.sldEdgeThickness.TickFrequency = 10; + this.sldEdgeThickness.TickStyle = System.Windows.Forms.TickStyle.Both; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(96, 22); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(110, 13); + this.label2.TabIndex = 8; + this.label2.Text = "Edge Line Thic&kness:"; + // + // pnlColorEdge + // + this.pnlColorEdge.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorEdge.Location = new System.Drawing.Point(15, 48); + this.pnlColorEdge.Name = "pnlColorEdge"; + this.pnlColorEdge.Size = new System.Drawing.Size(75, 41); + this.pnlColorEdge.TabIndex = 7; + this.pnlColorEdge.Click += new System.EventHandler(this.cmdColor_Click); + this.pnlColorEdge.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlColorEdge_Paint); + // + // cmdColorEdge + // + this.cmdColorEdge.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorEdge.Location = new System.Drawing.Point(15, 19); + this.cmdColorEdge.Name = "cmdColorEdge"; + this.cmdColorEdge.Size = new System.Drawing.Size(75, 23); + this.cmdColorEdge.TabIndex = 6; + this.cmdColorEdge.Text = "E&dge Color"; + this.cmdColorEdge.UseVisualStyleBackColor = true; + this.cmdColorEdge.Click += new System.EventHandler(this.cmdColor_Click); + // + // fraTextures + // + this.fraTextures.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraTextures.Controls.Add(this.chkMaterialEnableAnimation); + this.fraTextures.Controls.Add(this.cboMaterialToon); + this.fraTextures.Controls.Add(this.chkMaterialEnableGlow); + this.fraTextures.Controls.Add(this.label3); + this.fraTextures.Controls.Add(this.chkMaterialEnableLightSource); + this.fraTextures.Controls.Add(this.lvTextures); + this.fraTextures.Controls.Add(this.cmdTextureClear); + this.fraTextures.Controls.Add(this.cmdTextureRemove); + this.fraTextures.Controls.Add(this.cmdTextureModify); + this.fraTextures.Controls.Add(this.cmdTextureAdd); + this.fraTextures.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraTextures.Location = new System.Drawing.Point(280, 30); + this.fraTextures.Name = "fraTextures"; + this.fraTextures.Size = new System.Drawing.Size(330, 273); + this.fraTextures.TabIndex = 4; + this.fraTextures.TabStop = false; + this.fraTextures.Text = "Textures"; + // + // chkMaterialEnableAnimation + // + this.chkMaterialEnableAnimation.AutoSize = true; + this.chkMaterialEnableAnimation.Location = new System.Drawing.Point(186, 46); + this.chkMaterialEnableAnimation.Name = "chkMaterialEnableAnimation"; + this.chkMaterialEnableAnimation.Size = new System.Drawing.Size(107, 17); + this.chkMaterialEnableAnimation.TabIndex = 0; + this.chkMaterialEnableAnimation.Text = "Enable &animation"; + this.chkMaterialEnableAnimation.UseVisualStyleBackColor = true; + this.chkMaterialEnableAnimation.CheckedChanged += new System.EventHandler(this.chkMaterialFlags_CheckedChanged); + // + // cboMaterialToon + // + this.cboMaterialToon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboMaterialToon.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboMaterialToon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboMaterialToon.FormattingEnabled = true; + this.cboMaterialToon.Items.AddRange(new object[] { + "(none)", + "Toon01.bmp", + "Toon02.bmp", + "Toon03.bmp", + "Toon04.bmp", + "Toon05.bmp", + "Toon06.bmp", + "Toon07.bmp", + "Toon08.bmp", + "Toon09.bmp", + "Toon10.bmp"}); + this.cboMaterialToon.Location = new System.Drawing.Point(12, 19); + this.cboMaterialToon.Name = "cboMaterialToon"; + this.cboMaterialToon.Size = new System.Drawing.Size(105, 21); + this.cboMaterialToon.TabIndex = 3; + // + // chkMaterialEnableGlow + // + this.chkMaterialEnableGlow.AutoSize = true; + this.chkMaterialEnableGlow.Location = new System.Drawing.Point(96, 46); + this.chkMaterialEnableGlow.Name = "chkMaterialEnableGlow"; + this.chkMaterialEnableGlow.Size = new System.Drawing.Size(84, 17); + this.chkMaterialEnableGlow.TabIndex = 0; + this.chkMaterialEnableGlow.Text = "Enable &glow"; + this.chkMaterialEnableGlow.UseVisualStyleBackColor = true; + this.chkMaterialEnableGlow.CheckedChanged += new System.EventHandler(this.chkMaterialFlags_CheckedChanged); + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(-29, 24); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(35, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Too&n:"; + // + // chkMaterialEnableLightSource + // + this.chkMaterialEnableLightSource.AutoSize = true; + this.chkMaterialEnableLightSource.Location = new System.Drawing.Point(6, 46); + this.chkMaterialEnableLightSource.Name = "chkMaterialEnableLightSource"; + this.chkMaterialEnableLightSource.Size = new System.Drawing.Size(84, 17); + this.chkMaterialEnableLightSource.TabIndex = 0; + this.chkMaterialEnableLightSource.Text = "&Light source"; + this.chkMaterialEnableLightSource.UseVisualStyleBackColor = true; + this.chkMaterialEnableLightSource.CheckedChanged += new System.EventHandler(this.chkMaterialFlags_CheckedChanged); + // + // lvTextures + // + this.lvTextures.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvTextures.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTextureImageFileName, + this.chTextureMapFileName, + this.chTextureDelay}); + this.lvTextures.FullRowSelect = true; + this.lvTextures.GridLines = true; + this.lvTextures.HideSelection = false; + this.lvTextures.Location = new System.Drawing.Point(6, 98); + this.lvTextures.Name = "lvTextures"; + this.lvTextures.Size = new System.Drawing.Size(318, 169); + this.lvTextures.TabIndex = 1; + this.lvTextures.UseCompatibleStateImageBehavior = false; + this.lvTextures.View = System.Windows.Forms.View.Details; + this.lvTextures.ItemActivate += new System.EventHandler(this.lvTextures_ItemActivate); + this.lvTextures.SelectedIndexChanged += new System.EventHandler(this.lvTextures_SelectedIndexChanged); + // + // chTextureImageFileName + // + this.chTextureImageFileName.Text = "Image filename"; + this.chTextureImageFileName.Width = 192; + // + // chTextureMapFileName + // + this.chTextureMapFileName.Text = "Map filename"; + this.chTextureMapFileName.Width = 170; + // + // chTextureDelay + // + this.chTextureDelay.Text = "Delay (ms)"; + this.chTextureDelay.Width = 74; + // + // cmdTextureClear + // + this.cmdTextureClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdTextureClear.Enabled = false; + this.cmdTextureClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureClear.Location = new System.Drawing.Point(249, 69); + this.cmdTextureClear.Name = "cmdTextureClear"; + this.cmdTextureClear.Size = new System.Drawing.Size(75, 23); + this.cmdTextureClear.TabIndex = 0; + this.cmdTextureClear.Text = "&Clear"; + this.cmdTextureClear.UseVisualStyleBackColor = true; + this.cmdTextureClear.Click += new System.EventHandler(this.cmdTextureClear_Click); + // + // cmdTextureRemove + // + this.cmdTextureRemove.Enabled = false; + this.cmdTextureRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureRemove.Location = new System.Drawing.Point(168, 69); + this.cmdTextureRemove.Name = "cmdTextureRemove"; + this.cmdTextureRemove.Size = new System.Drawing.Size(75, 23); + this.cmdTextureRemove.TabIndex = 0; + this.cmdTextureRemove.Text = "&Remove"; + this.cmdTextureRemove.UseVisualStyleBackColor = true; + this.cmdTextureRemove.Click += new System.EventHandler(this.cmdTextureRemove_Click); + // + // cmdTextureModify + // + this.cmdTextureModify.Enabled = false; + this.cmdTextureModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureModify.Location = new System.Drawing.Point(87, 69); + this.cmdTextureModify.Name = "cmdTextureModify"; + this.cmdTextureModify.Size = new System.Drawing.Size(75, 23); + this.cmdTextureModify.TabIndex = 0; + this.cmdTextureModify.Text = "&Modify..."; + this.cmdTextureModify.UseVisualStyleBackColor = true; + this.cmdTextureModify.Click += new System.EventHandler(this.cmdTextureModify_Click); + // + // cmdTextureAdd + // + this.cmdTextureAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdTextureAdd.Location = new System.Drawing.Point(6, 69); + this.cmdTextureAdd.Name = "cmdTextureAdd"; + this.cmdTextureAdd.Size = new System.Drawing.Size(75, 23); + this.cmdTextureAdd.TabIndex = 0; + this.cmdTextureAdd.Text = "&Add..."; + this.cmdTextureAdd.UseVisualStyleBackColor = true; + this.cmdTextureAdd.Click += new System.EventHandler(this.cmdTextureAdd_Click); + // + // fraColors + // + this.fraColors.Controls.Add(this.pnlColorEmissive); + this.fraColors.Controls.Add(this.pnlColorSpecular); + this.fraColors.Controls.Add(this.pnlColorDiffuse); + this.fraColors.Controls.Add(this.pnlColorAmbient); + this.fraColors.Controls.Add(this.cmdColorEmissive); + this.fraColors.Controls.Add(this.cmdColorSpecular); + this.fraColors.Controls.Add(this.cmdColorDiffuse); + this.fraColors.Controls.Add(this.cmdColorAmbient); + this.fraColors.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraColors.Location = new System.Drawing.Point(4, 30); + this.fraColors.Name = "fraColors"; + this.fraColors.Size = new System.Drawing.Size(270, 103); + this.fraColors.TabIndex = 2; + this.fraColors.TabStop = false; + this.fraColors.Text = "Colors"; + // + // pnlColorEmissive + // + this.pnlColorEmissive.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorEmissive.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorEmissive.Location = new System.Drawing.Point(200, 48); + this.pnlColorEmissive.Name = "pnlColorEmissive"; + this.pnlColorEmissive.Size = new System.Drawing.Size(55, 41); + this.pnlColorEmissive.TabIndex = 7; + this.pnlColorEmissive.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorSpecular + // + this.pnlColorSpecular.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorSpecular.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorSpecular.Location = new System.Drawing.Point(139, 48); + this.pnlColorSpecular.Name = "pnlColorSpecular"; + this.pnlColorSpecular.Size = new System.Drawing.Size(55, 41); + this.pnlColorSpecular.TabIndex = 5; + this.pnlColorSpecular.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorDiffuse + // + this.pnlColorDiffuse.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorDiffuse.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorDiffuse.Location = new System.Drawing.Point(78, 48); + this.pnlColorDiffuse.Name = "pnlColorDiffuse"; + this.pnlColorDiffuse.Size = new System.Drawing.Size(55, 41); + this.pnlColorDiffuse.TabIndex = 3; + this.pnlColorDiffuse.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlColorAmbient + // + this.pnlColorAmbient.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pnlColorAmbient.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlColorAmbient.Location = new System.Drawing.Point(17, 48); + this.pnlColorAmbient.Name = "pnlColorAmbient"; + this.pnlColorAmbient.Size = new System.Drawing.Size(55, 41); + this.pnlColorAmbient.TabIndex = 1; + this.pnlColorAmbient.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorEmissive + // + this.cmdColorEmissive.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorEmissive.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorEmissive.Location = new System.Drawing.Point(200, 19); + this.cmdColorEmissive.Name = "cmdColorEmissive"; + this.cmdColorEmissive.Size = new System.Drawing.Size(55, 23); + this.cmdColorEmissive.TabIndex = 6; + this.cmdColorEmissive.Text = "E&missive"; + this.cmdColorEmissive.UseVisualStyleBackColor = true; + this.cmdColorEmissive.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorSpecular + // + this.cmdColorSpecular.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorSpecular.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorSpecular.Location = new System.Drawing.Point(139, 19); + this.cmdColorSpecular.Name = "cmdColorSpecular"; + this.cmdColorSpecular.Size = new System.Drawing.Size(55, 23); + this.cmdColorSpecular.TabIndex = 4; + this.cmdColorSpecular.Text = "&Specular"; + this.cmdColorSpecular.UseVisualStyleBackColor = true; + this.cmdColorSpecular.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorDiffuse + // + this.cmdColorDiffuse.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorDiffuse.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorDiffuse.Location = new System.Drawing.Point(78, 19); + this.cmdColorDiffuse.Name = "cmdColorDiffuse"; + this.cmdColorDiffuse.Size = new System.Drawing.Size(55, 23); + this.cmdColorDiffuse.TabIndex = 2; + this.cmdColorDiffuse.Text = "&Diffuse"; + this.cmdColorDiffuse.UseVisualStyleBackColor = true; + this.cmdColorDiffuse.Click += new System.EventHandler(this.cmdColor_Click); + // + // cmdColorAmbient + // + this.cmdColorAmbient.Anchor = System.Windows.Forms.AnchorStyles.None; + this.cmdColorAmbient.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdColorAmbient.Location = new System.Drawing.Point(17, 19); + this.cmdColorAmbient.Name = "cmdColorAmbient"; + this.cmdColorAmbient.Size = new System.Drawing.Size(55, 23); + this.cmdColorAmbient.TabIndex = 0; + this.cmdColorAmbient.Text = "&Ambient"; + this.cmdColorAmbient.UseVisualStyleBackColor = true; + this.cmdColorAmbient.Click += new System.EventHandler(this.cmdColor_Click); + // + // pnlBonesGroup + // + this.pnlBonesGroup.Controls.Add(this.txtGroupName); + this.pnlBonesGroup.Controls.Add(this.label13); + this.pnlBonesGroup.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlBonesGroup.Location = new System.Drawing.Point(0, 0); + this.pnlBonesGroup.Name = "pnlBonesGroup"; + this.pnlBonesGroup.Size = new System.Drawing.Size(613, 306); + this.pnlBonesGroup.TabIndex = 2; + this.pnlBonesGroup.Visible = false; + // + // txtGroupName + // + this.txtGroupName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtGroupName.Location = new System.Drawing.Point(47, 3); + this.txtGroupName.Name = "txtGroupName"; + this.txtGroupName.Size = new System.Drawing.Size(563, 20); + this.txtGroupName.TabIndex = 3; + this.txtGroupName.Validated += new System.EventHandler(this.txtGroupName_Validated); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label13.Location = new System.Drawing.Point(3, 6); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(38, 13); + this.label13.TabIndex = 2; + this.label13.Text = "&Name:"; + // + // pnlBonesBone + // + this.pnlBonesBone.Controls.Add(this.comboBox4); + this.pnlBonesBone.Controls.Add(this.label8); + this.pnlBonesBone.Controls.Add(this.comboBox3); + this.pnlBonesBone.Controls.Add(this.label7); + this.pnlBonesBone.Controls.Add(this.comboBox2); + this.pnlBonesBone.Controls.Add(this.label6); + this.pnlBonesBone.Controls.Add(this.cboBoneType); + this.pnlBonesBone.Controls.Add(this.label5); + this.pnlBonesBone.Controls.Add(this.txtBoneName); + this.pnlBonesBone.Controls.Add(this.label4); + this.pnlBonesBone.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlBonesBone.Location = new System.Drawing.Point(0, 0); + this.pnlBonesBone.Name = "pnlBonesBone"; + this.pnlBonesBone.Size = new System.Drawing.Size(613, 306); + this.pnlBonesBone.TabIndex = 1; + this.pnlBonesBone.Visible = false; + // + // comboBox4 + // + this.comboBox4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Location = new System.Drawing.Point(221, 84); + this.comboBox4.Name = "comboBox4"; + this.comboBox4.Size = new System.Drawing.Size(121, 21); + this.comboBox4.TabIndex = 5; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label8.Location = new System.Drawing.Point(174, 87); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(20, 13); + this.label8.TabIndex = 4; + this.label8.Text = "&IK:"; + // + // comboBox3 + // + this.comboBox3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Location = new System.Drawing.Point(221, 57); + this.comboBox3.Name = "comboBox3"; + this.comboBox3.Size = new System.Drawing.Size(121, 21); + this.comboBox3.TabIndex = 5; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(174, 60); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(33, 13); + this.label7.TabIndex = 4; + this.label7.Text = "&Child:"; + // + // comboBox2 + // + this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Location = new System.Drawing.Point(221, 30); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(121, 21); + this.comboBox2.TabIndex = 5; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(174, 33); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(41, 13); + this.label6.TabIndex = 4; + this.label6.Text = "&Parent:"; + // + // cboBoneType + // + this.cboBoneType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboBoneType.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboBoneType.FormattingEnabled = true; + this.cboBoneType.Items.AddRange(new object[] { + "Unknown", + "Rotate", + "Rotate/move", + "Inverse kinematics", + "Blank", + "IK-influenced rotation", + "Influenced rotation", + "IKConnect", + "Hidden", + "Twist", + "Revolution"}); + this.cboBoneType.Location = new System.Drawing.Point(47, 29); + this.cboBoneType.Name = "cboBoneType"; + this.cboBoneType.Size = new System.Drawing.Size(121, 21); + this.cboBoneType.TabIndex = 5; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(3, 32); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(34, 13); + this.label5.TabIndex = 4; + this.label5.Text = "&Type:"; + // + // txtBoneName + // + this.txtBoneName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtBoneName.Location = new System.Drawing.Point(47, 3); + this.txtBoneName.Name = "txtBoneName"; + this.txtBoneName.Size = new System.Drawing.Size(563, 20); + this.txtBoneName.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(3, 6); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(38, 13); + this.label4.TabIndex = 2; + this.label4.Text = "&Name:"; + // + // pnlResourcesStringTable + // + this.pnlResourcesStringTable.Controls.Add(this.cboLanguage); + this.pnlResourcesStringTable.Controls.Add(this.label1); + this.pnlResourcesStringTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlResourcesStringTable.Location = new System.Drawing.Point(0, 0); + this.pnlResourcesStringTable.Name = "pnlResourcesStringTable"; + this.pnlResourcesStringTable.Size = new System.Drawing.Size(613, 306); + this.pnlResourcesStringTable.TabIndex = 0; + // + // cboLanguage + // + this.cboLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboLanguage.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboLanguage.FormattingEnabled = true; + this.cboLanguage.Location = new System.Drawing.Point(67, 3); + this.cboLanguage.Name = "cboLanguage"; + this.cboLanguage.Size = new System.Drawing.Size(543, 21); + this.cboLanguage.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(3, 6); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Language:"; + // + // pnlModelEditor + // + this.pnlModelEditor.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlModelEditor.Location = new System.Drawing.Point(0, 0); + this.pnlModelEditor.Name = "pnlModelEditor"; + this.pnlModelEditor.Size = new System.Drawing.Size(613, 306); + this.pnlModelEditor.TabIndex = 3; + this.pnlModelEditor.Visible = false; + // + // ModelEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.MinimumSize = new System.Drawing.Size(805, 306); + this.Name = "ModelEditor"; + this.Size = new System.Drawing.Size(805, 306); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.mnuContextTreeView.ResumeLayout(false); + this.pnlMaterialsMaterial.ResumeLayout(false); + this.pnlMaterialsMaterial.PerformLayout(); + this.fraToon.ResumeLayout(false); + this.fraEdge.ResumeLayout(false); + this.fraEdge.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.sldEdgeThickness)).EndInit(); + this.fraTextures.ResumeLayout(false); + this.fraTextures.PerformLayout(); + this.fraColors.ResumeLayout(false); + this.pnlBonesGroup.ResumeLayout(false); + this.pnlBonesGroup.PerformLayout(); + this.pnlBonesBone.ResumeLayout(false); + this.pnlBonesBone.PerformLayout(); + this.pnlResourcesStringTable.ResumeLayout(false); + this.pnlResourcesStringTable.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.Panel pnlResourcesStringTable; + private System.Windows.Forms.ComboBox cboLanguage; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel pnlMaterialsMaterial; + private System.Windows.Forms.GroupBox fraTextures; + private System.Windows.Forms.GroupBox fraColors; + private System.Windows.Forms.Panel pnlColorSpecular; + private System.Windows.Forms.Panel pnlColorDiffuse; + private System.Windows.Forms.Panel pnlColorAmbient; + private System.Windows.Forms.Button cmdColorSpecular; + private System.Windows.Forms.Button cmdColorDiffuse; + private System.Windows.Forms.Button cmdColorAmbient; + private System.Windows.Forms.GroupBox fraEdge; + private System.Windows.Forms.Panel pnlColorEmissive; + private System.Windows.Forms.Button cmdColorEmissive; + private System.Windows.Forms.TextBox txtMaterialName; + private System.Windows.Forms.Label lblMaterialName; + private System.Windows.Forms.Panel pnlColorEdge; + private System.Windows.Forms.Button cmdColorEdge; + private System.Windows.Forms.TrackBar sldEdgeThickness; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtEdgeThickness; + private System.Windows.Forms.GroupBox fraToon; + private System.Windows.Forms.ListView lvTextures; + private System.Windows.Forms.Button cmdTextureClear; + private System.Windows.Forms.Button cmdTextureRemove; + private System.Windows.Forms.Button cmdTextureModify; + private System.Windows.Forms.Button cmdTextureAdd; + private System.Windows.Forms.ColumnHeader chTextureImageFileName; + private System.Windows.Forms.ColumnHeader chTextureMapFileName; + private System.Windows.Forms.ColumnHeader chTextureDelay; + private System.Windows.Forms.ComboBox cboMaterialToon; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ListView lvMapping; + private AwesomeControls.CommandBars.CBContextMenu mnuContextTreeView; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAdd; + private System.Windows.Forms.ToolStripMenuItem vertexToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem materialToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem boneToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem faceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem groupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem stringTableToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toonToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem rigidBodyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem jointToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewPaste; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewDelete; + private System.Windows.Forms.Panel pnlBonesBone; + private System.Windows.Forms.TextBox txtBoneName; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox cboBoneType; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.CheckBox chkMaterialEnableAnimation; + private System.Windows.Forms.CheckBox chkMaterialEnableGlow; + private System.Windows.Forms.CheckBox chkMaterialEnableLightSource; + private System.Windows.Forms.Panel pnlBonesGroup; + private System.Windows.Forms.TextBox txtGroupName; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Panel pnlModelEditor; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.resx new file mode 100644 index 00000000..81998adf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Model/ModelEditor.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.Designer.cs new file mode 100644 index 00000000..d1f854c4 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.Designer.cs @@ -0,0 +1,192 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors.Multimedia3D.Motion +{ + partial class MotionEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabDesign = new System.Windows.Forms.TabPage(); + this.tabProgram = new System.Windows.Forms.TabPage(); + this.lvProgram = new System.Windows.Forms.ListView(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabDesign.SuspendLayout(); + this.tabProgram.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(3, 3); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.panel1); + this.splitContainer1.Size = new System.Drawing.Size(522, 311); + this.splitContainer1.SplitterDistance = 135; + this.splitContainer1.TabIndex = 1; + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabDesign); + this.tabControl1.Controls.Add(this.tabProgram); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(0, 0); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(536, 343); + this.tabControl1.TabIndex = 2; + // + // tabDesign + // + this.tabDesign.Controls.Add(this.splitContainer1); + this.tabDesign.Location = new System.Drawing.Point(4, 22); + this.tabDesign.Name = "tabDesign"; + this.tabDesign.Padding = new System.Windows.Forms.Padding(3); + this.tabDesign.Size = new System.Drawing.Size(528, 317); + this.tabDesign.TabIndex = 0; + this.tabDesign.Text = "Design"; + this.tabDesign.UseVisualStyleBackColor = true; + // + // tabProgram + // + this.tabProgram.Controls.Add(this.button4); + this.tabProgram.Controls.Add(this.button3); + this.tabProgram.Controls.Add(this.button2); + this.tabProgram.Controls.Add(this.button1); + this.tabProgram.Controls.Add(this.lvProgram); + this.tabProgram.Location = new System.Drawing.Point(4, 22); + this.tabProgram.Name = "tabProgram"; + this.tabProgram.Padding = new System.Windows.Forms.Padding(3); + this.tabProgram.Size = new System.Drawing.Size(528, 317); + this.tabProgram.TabIndex = 1; + this.tabProgram.Text = "Program"; + this.tabProgram.UseVisualStyleBackColor = true; + // + // lvProgram + // + this.lvProgram.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvProgram.HideSelection = false; + this.lvProgram.Location = new System.Drawing.Point(3, 32); + this.lvProgram.Name = "lvProgram"; + this.lvProgram.Size = new System.Drawing.Size(522, 282); + this.lvProgram.TabIndex = 0; + this.lvProgram.UseCompatibleStateImageBehavior = false; + // + // button1 + // + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(3, 3); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button2.Location = new System.Drawing.Point(84, 3); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 1; + this.button2.Text = "button1"; + this.button2.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button3.Location = new System.Drawing.Point(165, 3); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 1; + this.button3.Text = "button1"; + this.button3.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button4.Location = new System.Drawing.Point(447, 3); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.TabIndex = 1; + this.button4.Text = "button1"; + this.button4.UseVisualStyleBackColor = true; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.Black; + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(522, 172); + this.panel1.TabIndex = 0; + // + // MotionEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tabControl1); + this.Name = "MotionEditor"; + this.Size = new System.Drawing.Size(536, 343); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabDesign.ResumeLayout(false); + this.tabProgram.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabDesign; + private System.Windows.Forms.TabPage tabProgram; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ListView lvProgram; + private System.Windows.Forms.Panel panel1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.cs new file mode 100644 index 00000000..8a6570f6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Multimedia3D.Motion; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Editors.Multimedia3D.Motion +{ + public partial class MotionEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(MotionObjectModel)); + } + return _er; + } + public MotionEditor() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Editors/Multimedia3D/Motion/MotionEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.Designer.cs new file mode 100644 index 00000000..63683d8c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.Designer.cs @@ -0,0 +1,488 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.OptionPanels.Multimedia3D.Model +{ + partial class GeneralOptionPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraRendering = new System.Windows.Forms.GroupBox(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericUpDown6 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown5 = new System.Windows.Forms.NumericUpDown(); + this.lblFPSLimit = new System.Windows.Forms.Label(); + this.numericUpDown4 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown3 = new System.Windows.Forms.NumericUpDown(); + this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); + this.txtFPSLimit = new System.Windows.Forms.NumericUpDown(); + this.chkLimitScreenFPS = new System.Windows.Forms.CheckBox(); + this.fraControlling = new System.Windows.Forms.GroupBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton3 = new System.Windows.Forms.RadioButton(); + this.panel1 = new System.Windows.Forms.Panel(); + this.optAxisControlPositionLeft = new System.Windows.Forms.RadioButton(); + this.optAxisControlPositionRight = new System.Windows.Forms.RadioButton(); + this.numericUpDown7 = new System.Windows.Forms.NumericUpDown(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.fraRendering.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtFPSLimit)).BeginInit(); + this.fraControlling.SuspendLayout(); + this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).BeginInit(); + this.SuspendLayout(); + // + // fraRendering + // + this.fraRendering.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraRendering.Controls.Add(this.comboBox1); + this.fraRendering.Controls.Add(this.label4); + this.fraRendering.Controls.Add(this.label7); + this.fraRendering.Controls.Add(this.label6); + this.fraRendering.Controls.Add(this.label3); + this.fraRendering.Controls.Add(this.label5); + this.fraRendering.Controls.Add(this.label2); + this.fraRendering.Controls.Add(this.numericUpDown6); + this.fraRendering.Controls.Add(this.numericUpDown5); + this.fraRendering.Controls.Add(this.lblFPSLimit); + this.fraRendering.Controls.Add(this.numericUpDown4); + this.fraRendering.Controls.Add(this.numericUpDown3); + this.fraRendering.Controls.Add(this.numericUpDown2); + this.fraRendering.Controls.Add(this.txtFPSLimit); + this.fraRendering.Controls.Add(this.chkLimitScreenFPS); + this.fraRendering.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraRendering.Location = new System.Drawing.Point(3, 3); + this.fraRendering.Name = "fraRendering"; + this.fraRendering.Size = new System.Drawing.Size(520, 137); + this.fraRendering.TabIndex = 0; + this.fraRendering.TabStop = false; + this.fraRendering.Text = "Rendering"; + // + // comboBox1 + // + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Items.AddRange(new object[] { + "Inch", + "Pixel", + "Pica", + "Point", + "Centimeter"}); + this.comboBox1.Location = new System.Drawing.Point(162, 97); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(91, 21); + this.comboBox1.TabIndex = 8; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(24, 100); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(94, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Measurement &unit:"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label7.Location = new System.Drawing.Point(277, 99); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(119, 13); + this.label7.TabIndex = 13; + this.label7.Text = "Self-&shadow buffer size:"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(277, 73); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(73, 13); + this.label6.TabIndex = 11; + this.label6.Text = "&Far clip plane:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(24, 73); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Output &height:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(277, 47); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(81, 13); + this.label5.TabIndex = 9; + this.label5.Text = "&Near clip plane:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(24, 47); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(70, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Output &width:"; + // + // numericUpDown6 + // + this.numericUpDown6.Location = new System.Drawing.Point(415, 97); + this.numericUpDown6.Name = "numericUpDown6"; + this.numericUpDown6.Size = new System.Drawing.Size(91, 20); + this.numericUpDown6.TabIndex = 14; + // + // numericUpDown5 + // + this.numericUpDown5.Location = new System.Drawing.Point(415, 71); + this.numericUpDown5.Name = "numericUpDown5"; + this.numericUpDown5.Size = new System.Drawing.Size(91, 20); + this.numericUpDown5.TabIndex = 12; + // + // lblFPSLimit + // + this.lblFPSLimit.AutoSize = true; + this.lblFPSLimit.Enabled = false; + this.lblFPSLimit.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblFPSLimit.Location = new System.Drawing.Point(259, 21); + this.lblFPSLimit.Name = "lblFPSLimit"; + this.lblFPSLimit.Size = new System.Drawing.Size(27, 13); + this.lblFPSLimit.TabIndex = 1; + this.lblFPSLimit.Text = "&FPS"; + // + // numericUpDown4 + // + this.numericUpDown4.Location = new System.Drawing.Point(415, 45); + this.numericUpDown4.Name = "numericUpDown4"; + this.numericUpDown4.Size = new System.Drawing.Size(91, 20); + this.numericUpDown4.TabIndex = 10; + // + // numericUpDown3 + // + this.numericUpDown3.Location = new System.Drawing.Point(162, 71); + this.numericUpDown3.Maximum = new decimal(new int[] { + 4096, + 0, + 0, + 0}); + this.numericUpDown3.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDown3.Name = "numericUpDown3"; + this.numericUpDown3.Size = new System.Drawing.Size(91, 20); + this.numericUpDown3.TabIndex = 6; + this.numericUpDown3.Value = new decimal(new int[] { + 1080, + 0, + 0, + 0}); + // + // numericUpDown2 + // + this.numericUpDown2.Location = new System.Drawing.Point(162, 45); + this.numericUpDown2.Maximum = new decimal(new int[] { + 4096, + 0, + 0, + 0}); + this.numericUpDown2.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDown2.Name = "numericUpDown2"; + this.numericUpDown2.Size = new System.Drawing.Size(91, 20); + this.numericUpDown2.TabIndex = 4; + this.numericUpDown2.Value = new decimal(new int[] { + 1920, + 0, + 0, + 0}); + // + // txtFPSLimit + // + this.txtFPSLimit.DecimalPlaces = 1; + this.txtFPSLimit.Enabled = false; + this.txtFPSLimit.Location = new System.Drawing.Point(162, 19); + this.txtFPSLimit.Name = "txtFPSLimit"; + this.txtFPSLimit.Size = new System.Drawing.Size(91, 20); + this.txtFPSLimit.TabIndex = 2; + this.txtFPSLimit.Value = new decimal(new int[] { + 30, + 0, + 0, + 0}); + // + // chkLimitScreenFPS + // + this.chkLimitScreenFPS.AutoSize = true; + this.chkLimitScreenFPS.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkLimitScreenFPS.Location = new System.Drawing.Point(23, 19); + this.chkLimitScreenFPS.Name = "chkLimitScreenFPS"; + this.chkLimitScreenFPS.Size = new System.Drawing.Size(126, 18); + this.chkLimitScreenFPS.TabIndex = 0; + this.chkLimitScreenFPS.Text = "&Limit screen FPS to:"; + this.chkLimitScreenFPS.UseVisualStyleBackColor = true; + this.chkLimitScreenFPS.CheckedChanged += new System.EventHandler(this.chkLimitScreenFPS_CheckedChanged); + // + // fraControlling + // + this.fraControlling.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraControlling.Controls.Add(this.panel2); + this.fraControlling.Controls.Add(this.panel1); + this.fraControlling.Controls.Add(this.numericUpDown7); + this.fraControlling.Controls.Add(this.label11); + this.fraControlling.Controls.Add(this.label10); + this.fraControlling.Controls.Add(this.label8); + this.fraControlling.Controls.Add(this.label9); + this.fraControlling.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraControlling.Location = new System.Drawing.Point(3, 146); + this.fraControlling.Name = "fraControlling"; + this.fraControlling.Size = new System.Drawing.Size(520, 122); + this.fraControlling.TabIndex = 1; + this.fraControlling.TabStop = false; + this.fraControlling.Text = "Controlling"; + // + // panel2 + // + this.panel2.Controls.Add(this.radioButton1); + this.panel2.Controls.Add(this.radioButton2); + this.panel2.Controls.Add(this.radioButton3); + this.panel2.Location = new System.Drawing.Point(162, 76); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(234, 25); + this.panel2.TabIndex = 6; + // + // radioButton1 + // + this.radioButton1.AutoSize = true; + this.radioButton1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton1.Location = new System.Drawing.Point(3, 3); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(57, 18); + this.radioButton1.TabIndex = 0; + this.radioButton1.Text = "&None"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // radioButton2 + // + this.radioButton2.AutoSize = true; + this.radioButton2.Checked = true; + this.radioButton2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton2.Location = new System.Drawing.Point(60, 3); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(64, 18); + this.radioButton2.TabIndex = 1; + this.radioButton2.TabStop = true; + this.radioButton2.Text = "N&ormal"; + this.radioButton2.UseVisualStyleBackColor = true; + // + // radioButton3 + // + this.radioButton3.AutoSize = true; + this.radioButton3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.radioButton3.Location = new System.Drawing.Point(124, 3); + this.radioButton3.Name = "radioButton3"; + this.radioButton3.Size = new System.Drawing.Size(80, 18); + this.radioButton3.TabIndex = 2; + this.radioButton3.Text = "&Advanced"; + this.radioButton3.UseVisualStyleBackColor = true; + // + // panel1 + // + this.panel1.Controls.Add(this.optAxisControlPositionLeft); + this.panel1.Controls.Add(this.optAxisControlPositionRight); + this.panel1.Location = new System.Drawing.Point(162, 45); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(234, 25); + this.panel1.TabIndex = 4; + // + // optAxisControlPositionLeft + // + this.optAxisControlPositionLeft.AutoSize = true; + this.optAxisControlPositionLeft.Checked = true; + this.optAxisControlPositionLeft.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optAxisControlPositionLeft.Location = new System.Drawing.Point(3, 3); + this.optAxisControlPositionLeft.Name = "optAxisControlPositionLeft"; + this.optAxisControlPositionLeft.Size = new System.Drawing.Size(49, 18); + this.optAxisControlPositionLeft.TabIndex = 0; + this.optAxisControlPositionLeft.TabStop = true; + this.optAxisControlPositionLeft.Text = "&Left"; + this.optAxisControlPositionLeft.UseVisualStyleBackColor = true; + // + // optAxisControlPositionRight + // + this.optAxisControlPositionRight.AutoSize = true; + this.optAxisControlPositionRight.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optAxisControlPositionRight.Location = new System.Drawing.Point(57, 3); + this.optAxisControlPositionRight.Name = "optAxisControlPositionRight"; + this.optAxisControlPositionRight.Size = new System.Drawing.Size(56, 18); + this.optAxisControlPositionRight.TabIndex = 1; + this.optAxisControlPositionRight.Text = "&Right"; + this.optAxisControlPositionRight.UseVisualStyleBackColor = true; + // + // numericUpDown7 + // + this.numericUpDown7.DecimalPlaces = 1; + this.numericUpDown7.Location = new System.Drawing.Point(162, 19); + this.numericUpDown7.Name = "numericUpDown7"; + this.numericUpDown7.Size = new System.Drawing.Size(91, 20); + this.numericUpDown7.TabIndex = 1; + this.numericUpDown7.Value = new decimal(new int[] { + 30, + 0, + 0, + 0}); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label11.Location = new System.Drawing.Point(24, 81); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(93, 13); + this.label11.TabIndex = 5; + this.label11.Text = "Bone handle type:"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label10.Location = new System.Drawing.Point(24, 50); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(103, 13); + this.label10.TabIndex = 3; + this.label10.Text = "Axis control position:"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label8.Location = new System.Drawing.Point(24, 21); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(115, 13); + this.label8.TabIndex = 0; + this.label8.Text = "&Keyframes per second:"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label9.Location = new System.Drawing.Point(259, 21); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(27, 13); + this.label9.TabIndex = 2; + this.label9.Text = "FPS"; + // + // GeneralOptionPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraControlling); + this.Controls.Add(this.fraRendering); + this.MinimumSize = new System.Drawing.Size(526, 284); + this.Name = "GeneralOptionPanel"; + this.Size = new System.Drawing.Size(526, 284); + this.fraRendering.ResumeLayout(false); + this.fraRendering.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown6)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtFPSLimit)).EndInit(); + this.fraControlling.ResumeLayout(false); + this.fraControlling.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown7)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraRendering; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lblFPSLimit; + private System.Windows.Forms.NumericUpDown numericUpDown3; + private System.Windows.Forms.NumericUpDown numericUpDown2; + private System.Windows.Forms.NumericUpDown txtFPSLimit; + private System.Windows.Forms.CheckBox chkLimitScreenFPS; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.NumericUpDown numericUpDown6; + private System.Windows.Forms.NumericUpDown numericUpDown5; + private System.Windows.Forms.NumericUpDown numericUpDown4; + private System.Windows.Forms.GroupBox fraControlling; + private System.Windows.Forms.NumericUpDown numericUpDown7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.RadioButton radioButton3; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.RadioButton optAxisControlPositionLeft; + private System.Windows.Forms.RadioButton optAxisControlPositionRight; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label10; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.cs new file mode 100644 index 00000000..e579065f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.OptionPanels.Multimedia3D.Model +{ + public partial class GeneralOptionPanel : OptionPanel + { + public GeneralOptionPanel() + { + InitializeComponent(); + } + + private string[] mvarOptionGroups = new string[] { "Editors", "Model" }; + public override string[] OptionGroups { get { return mvarOptionGroups; } } + + public override bool IsAvailable { get { return true; } } + + private void chkLimitScreenFPS_CheckedChanged(object sender, EventArgs e) + { + txtFPSLimit.Enabled = chkLimitScreenFPS.Checked; + lblFPSLimit.Enabled = chkLimitScreenFPS.Checked; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/OptionPanels/Multimedia3D/Model/GeneralOptionPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.Designer.cs new file mode 100644 index 00000000..b5d73a3a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.Designer.cs @@ -0,0 +1,60 @@ +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Panels.Multimedia3D.Motion +{ + partial class TimelinePanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.timelineControl1 = new AwesomeControls.Timeline.TimelineControl(); + this.SuspendLayout(); + // + // timelineControl1 + // + this.timelineControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.timelineControl1.EntryContextMenuStrip = null; + this.timelineControl1.EntryQuantization = 8; + this.timelineControl1.GroupContextMenuStrip = null; + this.timelineControl1.Location = new System.Drawing.Point(0, 0); + this.timelineControl1.Name = "timelineControl1"; + this.timelineControl1.Size = new System.Drawing.Size(385, 203); + this.timelineControl1.TabIndex = 1; + // + // TimelinePanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.timelineControl1); + this.Name = "TimelinePanel"; + this.Size = new System.Drawing.Size(385, 203); + this.ResumeLayout(false); + + } + + #endregion + + private AwesomeControls.Timeline.TimelineControl timelineControl1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.cs new file mode 100644 index 00000000..259d8ea0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.Panels.Multimedia3D.Motion +{ + public partial class TimelinePanel : UserControl + { + public TimelinePanel() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Panels/Multimedia3D/Motion/TimelinePanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..8fa55be0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Multimedia 3D plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2012-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b356f425-1762-4c94-9073-a6245d87803b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..d08b8e68 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms/UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms.csproj @@ -0,0 +1,137 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492} + Library + Properties + UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms + UniversalEditor.Plugins.Multimedia3D.UserInterface.WindowsForms + v3.5 + 512 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + Form + + + TexturePropertiesDialog.cs + + + UserControl + + + ModelEditor.cs + + + UserControl + + + MotionEditor.cs + + + UserControl + + + GeneralOptionPanel.cs + + + UserControl + + + TimelinePanel.cs + + + + + + TexturePropertiesDialog.cs + + + ModelEditor.cs + + + MotionEditor.cs + + + GeneralOptionPanel.cs + + + TimelinePanel.cs + + + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + {ED627DF7-3E78-4428-AB31-810BA1586E62} + Sanjigen + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33} + UniversalEditor.Plugins.Multimedia.Binders.GdiPlus + + + {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2} + UniversalEditor.Plugins.Multimedia3D + + + {BE4D0BA3-0888-42A5-9C09-FC308A4509D2} + UniversalEditor.Plugins.Multimedia + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.Designer.cs new file mode 100644 index 00000000..9872ffef --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.Designer.cs @@ -0,0 +1,75 @@ +namespace UniversalEditor.Editors.NewWorldComputing.Map +{ + partial class MapEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.fraPreview = new System.Windows.Forms.GroupBox(); + this.pnlMiniMap = new System.Windows.Forms.Panel(); + this.fraPreview.SuspendLayout(); + this.SuspendLayout(); + // + // fraPreview + // + this.fraPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.fraPreview.Controls.Add(this.pnlMiniMap); + this.fraPreview.Location = new System.Drawing.Point(521, 3); + this.fraPreview.Name = "fraPreview"; + this.fraPreview.Size = new System.Drawing.Size(200, 212); + this.fraPreview.TabIndex = 0; + this.fraPreview.TabStop = false; + this.fraPreview.Text = "Preview"; + // + // pnlMiniMap + // + this.pnlMiniMap.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlMiniMap.BackColor = System.Drawing.Color.Black; + this.pnlMiniMap.Location = new System.Drawing.Point(6, 19); + this.pnlMiniMap.Name = "pnlMiniMap"; + this.pnlMiniMap.Size = new System.Drawing.Size(188, 187); + this.pnlMiniMap.TabIndex = 0; + // + // MapEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraPreview); + this.Name = "MapEditor"; + this.Size = new System.Drawing.Size(724, 372); + this.fraPreview.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraPreview; + private System.Windows.Forms.Panel pnlMiniMap; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.cs new file mode 100644 index 00000000..bb46a4cc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.NewWorldComputing.Map +{ + public partial class MapEditor : Editor + { + public MapEditor() + { + InitializeComponent(); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Map/MapEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerAreas/BasicDesignerArea.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerAreas/BasicDesignerArea.cs new file mode 100644 index 00000000..acd26476 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerAreas/BasicDesignerArea.cs @@ -0,0 +1,64 @@ +using AwesomeControls.Designer; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.Multimedia.Picture.Collection; +using UniversalEditor.ObjectModels.NWCSceneLayout; +using UniversalEditor.DataFormats.Multimedia.Picture.NewWorldComputing.ICN; + +namespace UniversalEditor.Editors.NewWorldComputing.Scene.DesignerAreas +{ + public class BasicDesignerArea : DesignerArea + { + private Bitmap _bmpBackground = null; + private TextureBrush brshChecked = null; + + protected override void OnBeforePaint(System.Windows.Forms.PaintEventArgs e) + { + if (mvarScene != null) + { + if (_bmpBackground == null) + { + string ParentDirectory = String.Empty; + if (mvarScene.Accessor is FileAccessor) ParentDirectory = System.IO.Path.GetDirectoryName((mvarScene.Accessor as FileAccessor).FileName); + string ICNFileName = Scene.BackgroundImageFileName; + if (!String.IsNullOrEmpty(ParentDirectory)) ICNFileName = ParentDirectory + System.IO.Path.DirectorySeparatorChar.ToString() + ICNFileName; + + if (!System.IO.File.Exists(ICNFileName)) + { + return; + } + + ICNDataFormat icn = new ICNDataFormat(); + PictureCollectionObjectModel picc = new PictureCollectionObjectModel(); + Document.Load(picc, icn, new FileAccessor(ICNFileName)); + _bmpBackground = picc.Pictures[(int)mvarScene.BackgroundImageIndex].ToBitmap(); + } + if (_bmpBackground != null) + { + e.Graphics.DrawImage(_bmpBackground, ClientRectangle); + } + } + else + { + if (brshChecked == null) + { + Bitmap bmp = new Bitmap(8, 8); + Graphics gfx = Graphics.FromImage(bmp); + gfx.Clear(Colors.DarkGray.ToGdiColor()); + gfx.FillRectangle(new SolidBrush(Colors.Silver.ToGdiColor()), new Rectangle(0, 0, 4, 4)); + gfx.FillRectangle(new SolidBrush(Colors.Silver.ToGdiColor()), new Rectangle(4, 4, 4, 4)); + brshChecked = new TextureBrush(bmp); + } + e.Graphics.FillRectangle(brshChecked, ClientRectangle); + e.Graphics.DrawRectangle(System.Drawing.Pens.Black, ClientRectangle); + } + } + + private NWCSceneLayoutObjectModel mvarScene = null; + public NWCSceneLayoutObjectModel Scene { get { return mvarScene; } set { mvarScene = value; } } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcButtonClass.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcButtonClass.cs new file mode 100644 index 00000000..1aa1f93a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcButtonClass.cs @@ -0,0 +1,166 @@ +using AwesomeControls.Designer; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.Accessors.File; +using UniversalEditor.ObjectModels.NWCSceneLayout; +using UniversalEditor.ObjectModels.NWCSceneLayout.SceneObjects; + +using UniversalEditor.ObjectModels.Multimedia.Picture.Collection; +using UniversalEditor.DataFormats.Multimedia.Picture.NewWorldComputing.ICN; + +namespace UniversalEditor.Editors.NewWorldComputing.Scene.DesignerObjectClasses +{ + public class NwcButtonClass : DesignerObjectClass + { + private static ICNDataFormat icn = new ICNDataFormat(); + + protected override void RenderClientArea(DesignerObjectPaintEventArgs e) + { + SceneObject obj = (SceneObject)e.Item.Properties["SceneObject"]; + if (obj is SceneObjectButton) + { + SceneObjectButton btn = (obj as SceneObjectButton); + + System.Drawing.Bitmap _bmp = null; + if (e.Item.Properties.ContainsKey("Bitmap")) + { + _bmp = (e.Item.Properties["Bitmap"] as System.Drawing.Bitmap); + } + if (_bmp == null) + { + string imageFileName = btn.BackgroundImageFileName; + + string ParentDirectory = String.Empty; + if (e.Item.Properties.ContainsKey("ParentDirectory")) ParentDirectory = e.Item.Properties["ParentDirectory"].ToString(); + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + if (!System.IO.File.Exists(imageFileName)) + { + e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, e.Item.Bounds); + return; + } + + PictureCollectionObjectModel picc = new PictureCollectionObjectModel(); + FileAccessor.Load(imageFileName, picc, icn, true); + _bmp = picc.Pictures[(int)btn.BackgroundImageIndex].ToBitmap(); + e.Item.Properties["Bitmap"] = _bmp; + } + e.Graphics.DrawImage(_bmp, e.Item.Bounds); + } + else if (obj is SceneObjectImage) + { + SceneObjectImage btn = (obj as SceneObjectImage); + + System.Drawing.Bitmap _bmp = null; + if (e.Item.Properties.ContainsKey("Bitmap")) + { + _bmp = (e.Item.Properties["Bitmap"] as System.Drawing.Bitmap); + } + if (_bmp == null) + { + string imageFileName = btn.BackgroundImageFileName; + + string ParentDirectory = String.Empty; + if (e.Item.Properties.ContainsKey("ParentDirectory")) ParentDirectory = e.Item.Properties["ParentDirectory"].ToString(); + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + if (!System.IO.File.Exists(imageFileName)) + { + e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, e.Item.Bounds); + return; + } + + PictureCollectionObjectModel picc = new PictureCollectionObjectModel(); + FileAccessor.Load(imageFileName, picc, icn, true); + _bmp = picc.Pictures[(int)btn.BackgroundImageIndex].ToBitmap(); + e.Item.Properties["Bitmap"] = _bmp; + } + e.Graphics.DrawImage(_bmp, e.Item.Bounds); + } + else if (obj is SceneObjectLabel) + { + SceneObjectLabel lbl = (obj as SceneObjectLabel); + + PictureCollectionObjectModel piccFont = null; + if (e.Item.Properties.ContainsKey("Font")) + { + piccFont = (e.Item.Properties["Font"] as PictureCollectionObjectModel); + } + if (piccFont == null) + { + string imageFileName = lbl.FontFileName; + imageFileName = "FONT.ICN"; + + string ParentDirectory = String.Empty; + if (e.Item.Properties.ContainsKey("ParentDirectory")) ParentDirectory = e.Item.Properties["ParentDirectory"].ToString(); + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + if (!System.IO.File.Exists(imageFileName)) + { + e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, e.Item.Bounds); + return; + } + + piccFont = new PictureCollectionObjectModel(); + FileAccessor.Load(imageFileName, piccFont, icn, true); + e.Item.Properties["Font"] = piccFont; + } + + System.Drawing.Bitmap bitmap = RenderFontICN(lbl.Text, piccFont, e.Item.Bounds); + if (bitmap != null) e.Graphics.DrawImage(bitmap, e.Item.Bounds); + + // e.Graphics.DrawRectangle(System.Drawing.Pens.Black, e.Item.Bounds); + // e.Graphics.DrawString(lbl.Text, System.Drawing.SystemFonts.MenuFont, System.Drawing.Brushes.Black, e.Item.Bounds); + } + + // e.Graphics.FillRectangle(System.Drawing.Brushes.Red, e.Item.Bounds); + } + + private Dictionary icnsdata = null; + private System.Drawing.Bitmap RenderFontICN(string p, PictureCollectionObjectModel piccFont, System.Drawing.Rectangle rectangle) + { + if (icnsdata == null) + { + char[] icns = new char[] { '\'', '!', '"', '*', '$', '%', '&', '\'', '(', ')', '*', '+', '`', '-', '\'', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '\'', '=', '\'', '?', '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '.', ']', '.', '_', ',', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; + icnsdata = new Dictionary(); + for (int i = 0; i < icns.Length; i++) + { + if (icnsdata.ContainsKey(icns[i])) continue; + icnsdata.Add(icns[i], i); + } + } + + if (rectangle.Width <= 0 || rectangle.Height <= 0) return null; + + System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(rectangle.Width, rectangle.Height); + System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap); + + int maxpich = piccFont.MaximumPictureHeight; + + int x = 0, y = 0; + for (int i = 0; i < p.Length; i++) + { + if (p[i] == ' ') + { + x += 8; + continue; + } + int index = icnsdata[p[i]]; + + System.Drawing.Bitmap bmp = piccFont.Pictures[index].ToBitmap(); + int diff = maxpich - bmp.Height; + + graphics.DrawImage(bmp, x, y + diff); + x += bmp.Width; + } + return bitmap; + } + + protected override void RenderNonClientArea(DesignerObjectPaintEventArgs e) + { + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcGenericControlClass.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcGenericControlClass.cs new file mode 100644 index 00000000..1404e962 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/DesignerObjectClasses/NwcGenericControlClass.cs @@ -0,0 +1,182 @@ +using AwesomeControls.Designer; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.NWCSceneLayout; +using UniversalEditor.ObjectModels.NWCSceneLayout.SceneObjects; + +using UniversalEditor.ObjectModels.Multimedia.Picture.Collection; +using UniversalEditor.DataFormats.Multimedia.Picture.NewWorldComputing.ICN; + +namespace UniversalEditor.Editors.NewWorldComputing.Scene.DesignerObjectClasses +{ + public class NwcGenericControlClass : DesignerObjectClass + { + private static ICNDataFormat icn = new ICNDataFormat(); + + protected override void RenderClientArea(DesignerObjectPaintEventArgs e) + { + SceneObject obj = (SceneObject)e.Item.Properties["SceneObject"]; + + string ParentDirectory = String.Empty; + if (e.Item.Properties.ContainsKey("ParentDirectory") && e.Item.Properties["ParentDirectory"] != null) ParentDirectory = e.Item.Properties["ParentDirectory"].ToString(); + + if (obj is SceneObjectButton) + { + SceneObjectButton btn = (obj as SceneObjectButton); + + System.Drawing.Bitmap _bmp = null; + if (e.Item.Properties.ContainsKey("Bitmap")) + { + _bmp = (e.Item.Properties["Bitmap"] as System.Drawing.Bitmap); + } + if (_bmp == null) + { + string imageFileName = btn.BackgroundImageFileName; + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + if (!System.IO.File.Exists(imageFileName)) + { + e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, e.Item.Bounds); + return; + } + + PictureCollectionObjectModel picc = new PictureCollectionObjectModel(); + Document.Load(picc, icn, new FileAccessor(imageFileName)); + _bmp = picc.Pictures[(int)btn.BackgroundImageIndex].ToBitmap(); + e.Item.Properties["Bitmap"] = _bmp; + } + e.Graphics.DrawImage(_bmp, e.Item.Bounds); + } + else if (obj is SceneObjectImage) + { + SceneObjectImage btn = (obj as SceneObjectImage); + + System.Drawing.Bitmap _bmp = null; + if (e.Item.Properties.ContainsKey("Bitmap")) + { + _bmp = (e.Item.Properties["Bitmap"] as System.Drawing.Bitmap); + } + if (_bmp == null) + { + string imageFileName = btn.BackgroundImageFileName; + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + if (!System.IO.File.Exists(imageFileName)) + { + e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, e.Item.Bounds); + return; + } + + PictureCollectionObjectModel picc = new PictureCollectionObjectModel(); + Document.Load(picc, icn, new FileAccessor(imageFileName)); + _bmp = picc.Pictures[(int)btn.BackgroundImageIndex].ToBitmap(); + e.Item.Properties["Bitmap"] = _bmp; + } + e.Graphics.DrawImageUnscaled(_bmp, e.Item.Bounds); + } + else if (obj is SceneObjectLabel) + { + SceneObjectLabel lbl = (obj as SceneObjectLabel); + + PictureCollectionObjectModel piccFont = null; + if (e.Item.Properties.ContainsKey("Font")) + { + piccFont = (e.Item.Properties["Font"] as PictureCollectionObjectModel); + } + if (piccFont == null) + { + string imageFileName = lbl.FontFileName; + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + UniversalEditor.ObjectModels.NewWorldComputing.Font.FontObjectModel font = new ObjectModels.NewWorldComputing.Font.FontObjectModel(); + UniversalEditor.DataFormats.NewWorldComputing.FNT.FNTDataFormat fnt = new DataFormats.NewWorldComputing.FNT.FNTDataFormat(); + try + { + Document.Load(font, fnt, new FileAccessor(imageFileName)); + } + catch (System.IO.FileNotFoundException ex) + { + + } + imageFileName = font.GlyphCollectionFileName; + + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + + if (!System.IO.File.Exists(imageFileName)) + { + e.Graphics.DrawRectangle(System.Drawing.Pens.Blue, e.Item.Bounds); + e.Graphics.DrawString(lbl.Text, System.Windows.Forms.SystemInformation.MenuFont, System.Drawing.Brushes.Black, new System.Drawing.Rectangle(lbl.Left, lbl.Top, lbl.Width, lbl.Height)); + return; + } + + piccFont = new PictureCollectionObjectModel(); + Document.Load(piccFont, icn, new FileAccessor(imageFileName)); + e.Item.Properties["Font"] = piccFont; + } + + System.Drawing.Bitmap bitmap = RenderFontICN(lbl.Text, piccFont, e.Item.Bounds); + if (bitmap != null) e.Graphics.DrawImage(bitmap, e.Item.Bounds); + + // e.Graphics.DrawRectangle(System.Drawing.Pens.Black, e.Item.Bounds); + // e.Graphics.DrawString(lbl.Text, System.Drawing.SystemFonts.MenuFont, System.Drawing.Brushes.Black, e.Item.Bounds); + } + + // e.Graphics.FillRectangle(System.Drawing.Brushes.Red, e.Item.Bounds); + } + + private Dictionary icnsdata = null; + private System.Drawing.Bitmap RenderFontICN(string p, PictureCollectionObjectModel piccFont, System.Drawing.Rectangle rectangle) + { + if (icnsdata == null) + { + char[] icns = new char[] { '\'', '!', '"', '*', '$', '%', '&', '<', '(', ')', '*', '+', '`', '-', '\'', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '.', '=', '.', '?', '\'', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '.', ']', '.', '_', ',', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; + icnsdata = new Dictionary(); + for (int i = 0; i < icns.Length; i++) + { + if (icnsdata.ContainsKey(icns[i])) continue; + icnsdata.Add(icns[i], i); + } + } + + if (rectangle.Width <= 0 || rectangle.Height <= 0) return null; + + System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(rectangle.Width, rectangle.Height); + System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap); + + int maxpich = piccFont.MaximumPictureHeight; + + int x = 0, y = 0; + for (int i = 0; i < p.Length; i++) + { + if (p[i] == ' ') + { + x += 8; + continue; + } + + if (!icnsdata.ContainsKey(p[i])) + { + x += 8; + continue; + } + + int index = icnsdata[p[i]]; + + System.Drawing.Bitmap bmp = piccFont.Pictures[index].ToBitmap(); + int diff = maxpich - bmp.Height; + + graphics.DrawImage(bmp, x, y + diff); + x += bmp.Width; + } + return bitmap; + } + + protected override void RenderNonClientArea(DesignerObjectPaintEventArgs e) + { + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.Designer.cs new file mode 100644 index 00000000..34af0e3d --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.Designer.cs @@ -0,0 +1,397 @@ +namespace UniversalEditor.Editors.NewWorldComputing.Scene +{ + partial class SceneEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dsnr = new AwesomeControls.Designer.DesignerControl(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.chkVisibilityLabel = new System.Windows.Forms.CheckBox(); + this.chkVisibilityImage = new System.Windows.Forms.CheckBox(); + this.chkVisibilityButton = new System.Windows.Forms.CheckBox(); + this.chkVisibilityScreen = new System.Windows.Forms.CheckBox(); + this.fraObjectProperties = new System.Windows.Forms.GroupBox(); + this.pnlObjectSpecificProperties = new System.Windows.Forms.Panel(); + this.pnlObjectPropertiesLabel = new System.Windows.Forms.Panel(); + this.txtFontFilename = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtLabelText = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.pnlObjectPropertiesImage = new System.Windows.Forms.Panel(); + this.pnlObjectPropertiesButton = new System.Windows.Forms.Panel(); + this.pnlCommonProperties = new System.Windows.Forms.Panel(); + this.txtHeight = new System.Windows.Forms.NumericUpDown(); + this.txtTop = new System.Windows.Forms.NumericUpDown(); + this.label6 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txtWidth = new System.Windows.Forms.NumericUpDown(); + this.txtLeft = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.pnlOptions = new System.Windows.Forms.Panel(); + this.groupBox2.SuspendLayout(); + this.fraObjectProperties.SuspendLayout(); + this.pnlObjectSpecificProperties.SuspendLayout(); + this.pnlObjectPropertiesLabel.SuspendLayout(); + this.pnlCommonProperties.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtHeight)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtTop)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtWidth)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtLeft)).BeginInit(); + this.pnlOptions.SuspendLayout(); + this.SuspendLayout(); + // + // dsnr + // + this.dsnr.DefaultObjectClass = null; + this.dsnr.Dock = System.Windows.Forms.DockStyle.Fill; + this.dsnr.EnableCreation = false; + this.dsnr.Location = new System.Drawing.Point(0, 169); + this.dsnr.Name = "dsnr"; + this.dsnr.Size = new System.Drawing.Size(510, 227); + this.dsnr.TabIndex = 0; + this.dsnr.DesignerObjectSelected += new AwesomeControls.Designer.DesignerObjectSelectedEventHandler(this.dsnr_DesignerObjectSelected); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.chkVisibilityLabel); + this.groupBox2.Controls.Add(this.chkVisibilityImage); + this.groupBox2.Controls.Add(this.chkVisibilityButton); + this.groupBox2.Controls.Add(this.chkVisibilityScreen); + this.groupBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox2.Location = new System.Drawing.Point(3, 3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(135, 160); + this.groupBox2.TabIndex = 0; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Filter Objects by Type"; + // + // chkVisibilityLabel + // + this.chkVisibilityLabel.AutoSize = true; + this.chkVisibilityLabel.Checked = true; + this.chkVisibilityLabel.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkVisibilityLabel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkVisibilityLabel.Location = new System.Drawing.Point(15, 92); + this.chkVisibilityLabel.Name = "chkVisibilityLabel"; + this.chkVisibilityLabel.Size = new System.Drawing.Size(58, 18); + this.chkVisibilityLabel.TabIndex = 0; + this.chkVisibilityLabel.Text = "&Label"; + this.chkVisibilityLabel.UseVisualStyleBackColor = true; + this.chkVisibilityLabel.CheckedChanged += new System.EventHandler(this.chkVisibility_CheckedChanged); + // + // chkVisibilityImage + // + this.chkVisibilityImage.AutoSize = true; + this.chkVisibilityImage.Checked = true; + this.chkVisibilityImage.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkVisibilityImage.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkVisibilityImage.Location = new System.Drawing.Point(15, 69); + this.chkVisibilityImage.Name = "chkVisibilityImage"; + this.chkVisibilityImage.Size = new System.Drawing.Size(61, 18); + this.chkVisibilityImage.TabIndex = 0; + this.chkVisibilityImage.Text = "&Image"; + this.chkVisibilityImage.UseVisualStyleBackColor = true; + this.chkVisibilityImage.CheckedChanged += new System.EventHandler(this.chkVisibility_CheckedChanged); + // + // chkVisibilityButton + // + this.chkVisibilityButton.AutoSize = true; + this.chkVisibilityButton.Checked = true; + this.chkVisibilityButton.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkVisibilityButton.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkVisibilityButton.Location = new System.Drawing.Point(15, 46); + this.chkVisibilityButton.Name = "chkVisibilityButton"; + this.chkVisibilityButton.Size = new System.Drawing.Size(63, 18); + this.chkVisibilityButton.TabIndex = 0; + this.chkVisibilityButton.Text = "&Button"; + this.chkVisibilityButton.UseVisualStyleBackColor = true; + this.chkVisibilityButton.CheckedChanged += new System.EventHandler(this.chkVisibility_CheckedChanged); + // + // chkVisibilityScreen + // + this.chkVisibilityScreen.AutoSize = true; + this.chkVisibilityScreen.Checked = true; + this.chkVisibilityScreen.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkVisibilityScreen.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkVisibilityScreen.Location = new System.Drawing.Point(15, 23); + this.chkVisibilityScreen.Name = "chkVisibilityScreen"; + this.chkVisibilityScreen.Size = new System.Drawing.Size(66, 18); + this.chkVisibilityScreen.TabIndex = 0; + this.chkVisibilityScreen.Text = "&Screen"; + this.chkVisibilityScreen.UseVisualStyleBackColor = true; + this.chkVisibilityScreen.CheckedChanged += new System.EventHandler(this.chkVisibility_CheckedChanged); + // + // fraObjectProperties + // + this.fraObjectProperties.Controls.Add(this.pnlObjectSpecificProperties); + this.fraObjectProperties.Controls.Add(this.pnlCommonProperties); + this.fraObjectProperties.Location = new System.Drawing.Point(144, 3); + this.fraObjectProperties.Name = "fraObjectProperties"; + this.fraObjectProperties.Size = new System.Drawing.Size(363, 160); + this.fraObjectProperties.TabIndex = 1; + this.fraObjectProperties.TabStop = false; + this.fraObjectProperties.Text = "Object Properties"; + // + // pnlObjectSpecificProperties + // + this.pnlObjectSpecificProperties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlObjectSpecificProperties.Controls.Add(this.pnlObjectPropertiesLabel); + this.pnlObjectSpecificProperties.Controls.Add(this.pnlObjectPropertiesImage); + this.pnlObjectSpecificProperties.Controls.Add(this.pnlObjectPropertiesButton); + this.pnlObjectSpecificProperties.Location = new System.Drawing.Point(6, 92); + this.pnlObjectSpecificProperties.Name = "pnlObjectSpecificProperties"; + this.pnlObjectSpecificProperties.Size = new System.Drawing.Size(351, 62); + this.pnlObjectSpecificProperties.TabIndex = 3; + // + // pnlObjectPropertiesLabel + // + this.pnlObjectPropertiesLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlObjectPropertiesLabel.Controls.Add(this.txtFontFilename); + this.pnlObjectPropertiesLabel.Controls.Add(this.label2); + this.pnlObjectPropertiesLabel.Controls.Add(this.txtLabelText); + this.pnlObjectPropertiesLabel.Controls.Add(this.label1); + this.pnlObjectPropertiesLabel.Location = new System.Drawing.Point(0, 0); + this.pnlObjectPropertiesLabel.Name = "pnlObjectPropertiesLabel"; + this.pnlObjectPropertiesLabel.Size = new System.Drawing.Size(351, 62); + this.pnlObjectPropertiesLabel.TabIndex = 1; + // + // txtFontFilename + // + this.txtFontFilename.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFontFilename.Location = new System.Drawing.Point(82, 29); + this.txtFontFilename.Name = "txtFontFilename"; + this.txtFontFilename.Size = new System.Drawing.Size(266, 20); + this.txtFontFilename.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(3, 32); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(73, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Font file&name:"; + // + // txtLabelText + // + this.txtLabelText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtLabelText.Location = new System.Drawing.Point(82, 3); + this.txtLabelText.Name = "txtLabelText"; + this.txtLabelText.Size = new System.Drawing.Size(266, 20); + this.txtLabelText.TabIndex = 1; + this.txtLabelText.Validated += new System.EventHandler(this.txtLabelText_Validated); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(3, 6); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(31, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Text:"; + // + // pnlObjectPropertiesImage + // + this.pnlObjectPropertiesImage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlObjectPropertiesImage.Location = new System.Drawing.Point(0, 0); + this.pnlObjectPropertiesImage.Name = "pnlObjectPropertiesImage"; + this.pnlObjectPropertiesImage.Size = new System.Drawing.Size(351, 62); + this.pnlObjectPropertiesImage.TabIndex = 2; + // + // pnlObjectPropertiesButton + // + this.pnlObjectPropertiesButton.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlObjectPropertiesButton.Location = new System.Drawing.Point(0, 0); + this.pnlObjectPropertiesButton.Name = "pnlObjectPropertiesButton"; + this.pnlObjectPropertiesButton.Size = new System.Drawing.Size(351, 62); + this.pnlObjectPropertiesButton.TabIndex = 0; + // + // pnlCommonProperties + // + this.pnlCommonProperties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlCommonProperties.Controls.Add(this.txtHeight); + this.pnlCommonProperties.Controls.Add(this.txtTop); + this.pnlCommonProperties.Controls.Add(this.label6); + this.pnlCommonProperties.Controls.Add(this.label4); + this.pnlCommonProperties.Controls.Add(this.txtWidth); + this.pnlCommonProperties.Controls.Add(this.txtLeft); + this.pnlCommonProperties.Controls.Add(this.label5); + this.pnlCommonProperties.Controls.Add(this.label3); + this.pnlCommonProperties.Location = new System.Drawing.Point(6, 19); + this.pnlCommonProperties.Name = "pnlCommonProperties"; + this.pnlCommonProperties.Size = new System.Drawing.Size(351, 67); + this.pnlCommonProperties.TabIndex = 3; + // + // txtHeight + // + this.txtHeight.Location = new System.Drawing.Point(186, 29); + this.txtHeight.Name = "txtHeight"; + this.txtHeight.Size = new System.Drawing.Size(87, 20); + this.txtHeight.TabIndex = 1; + this.txtHeight.Validated += new System.EventHandler(this.txtBounds_Validated); + // + // txtTop + // + this.txtTop.Location = new System.Drawing.Point(38, 29); + this.txtTop.Name = "txtTop"; + this.txtTop.Size = new System.Drawing.Size(87, 20); + this.txtTop.TabIndex = 1; + this.txtTop.Validated += new System.EventHandler(this.txtBounds_Validated); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(139, 31); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(41, 13); + this.label6.TabIndex = 0; + this.label6.Text = "&Height:"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(3, 31); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(29, 13); + this.label4.TabIndex = 0; + this.label4.Text = "&Top:"; + // + // txtWidth + // + this.txtWidth.Location = new System.Drawing.Point(186, 3); + this.txtWidth.Name = "txtWidth"; + this.txtWidth.Size = new System.Drawing.Size(87, 20); + this.txtWidth.TabIndex = 1; + this.txtWidth.Validated += new System.EventHandler(this.txtBounds_Validated); + // + // txtLeft + // + this.txtLeft.Location = new System.Drawing.Point(38, 3); + this.txtLeft.Name = "txtLeft"; + this.txtLeft.Size = new System.Drawing.Size(87, 20); + this.txtLeft.TabIndex = 1; + this.txtLeft.Validated += new System.EventHandler(this.txtBounds_Validated); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(139, 5); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(38, 13); + this.label5.TabIndex = 0; + this.label5.Text = "&Width:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(3, 5); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(28, 13); + this.label3.TabIndex = 0; + this.label3.Text = "&Left:"; + // + // pnlOptions + // + this.pnlOptions.Controls.Add(this.fraObjectProperties); + this.pnlOptions.Controls.Add(this.groupBox2); + this.pnlOptions.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlOptions.Location = new System.Drawing.Point(0, 0); + this.pnlOptions.Name = "pnlOptions"; + this.pnlOptions.Size = new System.Drawing.Size(510, 169); + this.pnlOptions.TabIndex = 2; + // + // SceneEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.dsnr); + this.Controls.Add(this.pnlOptions); + this.Name = "SceneEditor"; + this.Size = new System.Drawing.Size(510, 396); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.fraObjectProperties.ResumeLayout(false); + this.pnlObjectSpecificProperties.ResumeLayout(false); + this.pnlObjectPropertiesLabel.ResumeLayout(false); + this.pnlObjectPropertiesLabel.PerformLayout(); + this.pnlCommonProperties.ResumeLayout(false); + this.pnlCommonProperties.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.txtHeight)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtTop)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtWidth)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtLeft)).EndInit(); + this.pnlOptions.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private AwesomeControls.Designer.DesignerControl dsnr; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.CheckBox chkVisibilityLabel; + private System.Windows.Forms.CheckBox chkVisibilityImage; + private System.Windows.Forms.CheckBox chkVisibilityButton; + private System.Windows.Forms.CheckBox chkVisibilityScreen; + private System.Windows.Forms.GroupBox fraObjectProperties; + private System.Windows.Forms.Panel pnlOptions; + private System.Windows.Forms.Panel pnlObjectPropertiesButton; + private System.Windows.Forms.Panel pnlObjectPropertiesImage; + private System.Windows.Forms.Panel pnlObjectPropertiesLabel; + private System.Windows.Forms.TextBox txtLabelText; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtFontFilename; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Panel pnlCommonProperties; + private System.Windows.Forms.Panel pnlObjectSpecificProperties; + private System.Windows.Forms.NumericUpDown txtHeight; + private System.Windows.Forms.NumericUpDown txtTop; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.NumericUpDown txtWidth; + private System.Windows.Forms.NumericUpDown txtLeft; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label3; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.cs new file mode 100644 index 00000000..82d5f8bb --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; +using UniversalEditor.ObjectModels.NWCSceneLayout; + +using AwesomeControls.Designer; +using UniversalEditor.Editors.NewWorldComputing.Scene.DesignerObjectClasses; +using UniversalEditor.ObjectModels.Multimedia.Picture.Collection; +using UniversalEditor.Accessors; +using UniversalEditor.DataFormats.Multimedia.Picture.NewWorldComputing.ICN; + +using UniversalEditor.ObjectModels.NWCSceneLayout.SceneObjects; + +using UniversalEditor.Editors.NewWorldComputing.Scene.DesignerAreas; +using UniversalEditor.UserInterface; + +namespace UniversalEditor.Editors.NewWorldComputing.Scene +{ + public partial class SceneEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(NWCSceneLayoutObjectModel)); + } + return _er; + } + public SceneEditor() + { + InitializeComponent(); + base.DoubleBuffered = true; + + txtLeft.Minimum = UInt16.MinValue; + txtLeft.Maximum = UInt16.MaxValue; + + txtTop.Minimum = UInt16.MinValue; + txtTop.Maximum = UInt16.MaxValue; + + txtWidth.Minimum = UInt16.MinValue; + txtWidth.Maximum = UInt16.MaxValue; + + txtHeight.Minimum = UInt16.MinValue; + txtHeight.Maximum = UInt16.MaxValue; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + NWCSceneLayoutObjectModel scene = (ObjectModel as NWCSceneLayoutObjectModel); + if (scene == null) return; + + RefreshEditor(); + } + + private Bitmap _scnBmp = null; + private ICNDataFormat icn = new ICNDataFormat(); + + private void RefreshEditor() + { + dsnr.Areas.Clear(); + + NWCSceneLayoutObjectModel scene = (ObjectModel as NWCSceneLayoutObjectModel); + if (scene == null) return; + + BasicDesignerArea area = new BasicDesignerArea(); + if (chkVisibilityScreen.Checked) + { + area.Scene = scene; + } + area.Left = 0; + area.Top = 0; + area.Width = scene.Width; + area.Height = scene.Height; + + NwcGenericControlClass ocButton = new NwcGenericControlClass(); + // dsnr.Classes.Add(ocButton); + + string ParentDirectory = String.Empty; + if (ObjectModel.Accessor is FileAccessor) ParentDirectory = System.IO.Path.GetDirectoryName((ObjectModel.Accessor as FileAccessor).FileName); + + foreach (SceneObject obj in scene.Objects) + { + if ((obj is SceneObjectButton) && !chkVisibilityButton.Checked) continue; + if ((obj is SceneObjectImage) && !chkVisibilityImage.Checked) continue; + if ((obj is SceneObjectLabel) && !chkVisibilityLabel.Checked) continue; + + DesignerObject objct = new DesignerObject("Object" + (scene.Objects.IndexOf(obj) + 1).ToString(), ocButton); + objct.Bounds = new Rectangle(obj.Left, obj.Top, obj.Width, obj.Height); + objct.Properties.Add("SceneObject", obj); + + objct.Properties.Add("ParentDirectory", ParentDirectory); + + area.Objects.Add(objct); + } + dsnr.Areas.Add(area); + dsnr.Refresh(); + } + + private void chkVisibility_CheckedChanged(object sender, EventArgs e) + { + RefreshEditor(); + } + + private SceneObject mvarCurrentObject = null; + private void dsnr_DesignerObjectSelected(object sender, DesignerObjectSelectedEventArgs e) + { + if (e.Item == null) + { + pnlObjectSpecificProperties.Visible = false; + pnlObjectSpecificProperties.Enabled = false; + pnlCommonProperties.Visible = false; + pnlCommonProperties.Enabled = false; + return; + } + + pnlObjectSpecificProperties.Enabled = true; + pnlObjectSpecificProperties.Visible = true; + pnlCommonProperties.Enabled = true; + pnlCommonProperties.Visible = true; + + txtLeft.Value = e.Item.Left; + txtTop.Value = e.Item.Top; + txtWidth.Value = e.Item.Width; + txtHeight.Value = e.Item.Height; + + SceneObject obj = (e.Item.Properties["SceneObject"] as SceneObject); + if (obj is SceneObjectButton) + { + fraObjectProperties.Text = "Button Properties"; + SwitchObjectPropertiesPanel(pnlObjectPropertiesButton); + } + else if (obj is SceneObjectImage) + { + fraObjectProperties.Text = "Image Properties"; + SwitchObjectPropertiesPanel(pnlObjectPropertiesImage); + } + else if (obj is SceneObjectLabel) + { + SceneObjectLabel lbl = (obj as SceneObjectLabel); + + fraObjectProperties.Text = "Label Properties"; + SwitchObjectPropertiesPanel(pnlObjectPropertiesLabel); + + txtLabelText.Text = lbl.Text; + } + mvarCurrentObject = obj; + } + + private void SwitchObjectPropertiesPanel(Panel pnl) + { + foreach (Control ctl in pnlObjectSpecificProperties.Controls) + { + if (ctl == pnl) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + + private void txtLabelText_Validated(object sender, EventArgs e) + { + if (mvarCurrentObject is SceneObjectLabel) + { + SceneObjectLabel lbl = (mvarCurrentObject as SceneObjectLabel); + lbl.Text = txtLabelText.Text; + dsnr.Refresh(); + } + } + + private void txtBounds_Validated(object sender, EventArgs e) + { + foreach (DesignerObject obj in dsnr.SelectedObjects) + { + obj.Left = (int)txtLeft.Value; + obj.Top = (int)txtTop.Value; + obj.Width = (int)txtWidth.Value; + obj.Height = (int)txtHeight.Value; + } + } + + /* + void dsnr_Paint(object sender, PaintEventArgs e) + { + NWCSceneLayoutObjectModel scene = (ObjectModel as NWCSceneLayoutObjectModel); + if (scene == null) return; + + string ParentDirectory = String.Empty; + if (ObjectModel.Accessor is FileAccessor) ParentDirectory = System.IO.Path.GetDirectoryName((ObjectModel.Accessor as FileAccessor).FileName); + + if (_scnBmp == null) + { + string imageFileName = scene.BackgroundImageFileName; + if (!String.IsNullOrEmpty(ParentDirectory)) imageFileName = ParentDirectory + "\\" + imageFileName; + if (!System.IO.File.Exists(imageFileName)) + { + return; + } + + PictureCollectionObjectModel picc = new PictureCollectionObjectModel(); + FileAccessor.Load(imageFileName, picc, icn, true); + _scnBmp = picc.Pictures[(int)scene.BackgroundImageIndex].ToBitmap(); + } + e.Graphics.DrawImage(_scnBmp, new Rectangle(0, 0, scene.Width, scene.Height)); + + } + */ + + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Editors/NewWorldComputing/Scene/SceneEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..8d9963cd --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("New World Computing plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("43185853-335c-4e15-a927-5b185c97dc10")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..a1415d41 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms/UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms.csproj @@ -0,0 +1,109 @@ + + + + + Debug + AnyCPU + {4250B20B-2DC9-432F-B0C2-BD20B80B4970} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.NewWorldComputing.UserInterface.WindowsForms + v3.5 + 512 + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + UserControl + + + MapEditor.cs + + + + + UserControl + + + SceneEditor.cs + + + + + + + MapEditor.cs + + + SceneEditor.cs + + + + + {617D9EB5-CA93-45D6-AA6B-5A012B7698AC} + AwesomeControls + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33} + UniversalEditor.Plugins.Multimedia.Binders.GdiPlus + + + {BE4D0BA3-0888-42A5-9C09-FC308A4509D2} + UniversalEditor.Plugins.Multimedia + + + {26095090-3F7D-4DB5-A9BF-4C687230FC0F} + UniversalEditor.Plugins.NewWorldComputing + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.Designer.cs new file mode 100644 index 00000000..c6719e11 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.Designer.cs @@ -0,0 +1,453 @@ +namespace UniversalEditor.Editors.RebelSoftware.InstallationScript +{ + partial class InstallationScriptEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Product"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Dialogs"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Shortcuts"); + System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("Welcome"); + System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("License"); + System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("Destination"); + System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("Summary"); + System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("Progress"); + System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("Finish"); + this.tvExplorer = new System.Windows.Forms.TreeView(); + this.scMain = new System.Windows.Forms.SplitContainer(); + this.pnlProduct = new System.Windows.Forms.Panel(); + this.lblProductName = new System.Windows.Forms.Label(); + this.txtProductName = new System.Windows.Forms.TextBox(); + this.lblProductVersion = new System.Windows.Forms.Label(); + this.txtProductVersion = new System.Windows.Forms.TextBox(); + this.lblProductDiskSpace = new System.Windows.Forms.Label(); + this.txtProductDiskSpace = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.lblProductBackgroundColor = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.lblProductBackgroundImage = new System.Windows.Forms.Label(); + this.txtProductBackgroundImage = new System.Windows.Forms.TextBox(); + this.cmdBrowseProductBackgroundImage = new System.Windows.Forms.Button(); + this.pnlDialogs = new System.Windows.Forms.Panel(); + this.lvDialogs = new System.Windows.Forms.ListView(); + this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmdDialogMoveUp = new System.Windows.Forms.Button(); + this.cmdDialogMoveDown = new System.Windows.Forms.Button(); + this.fraProperties = new System.Windows.Forms.GroupBox(); + this.fraPreview = new System.Windows.Forms.GroupBox(); + this.picDialogPreview = new System.Windows.Forms.PictureBox(); + this.pnlDialogPropertiesNone = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.scMain.Panel1.SuspendLayout(); + this.scMain.Panel2.SuspendLayout(); + this.scMain.SuspendLayout(); + this.pnlProduct.SuspendLayout(); + this.pnlDialogs.SuspendLayout(); + this.fraProperties.SuspendLayout(); + this.fraPreview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picDialogPreview)).BeginInit(); + this.pnlDialogPropertiesNone.SuspendLayout(); + this.SuspendLayout(); + // + // tvExplorer + // + this.tvExplorer.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvExplorer.HideSelection = false; + this.tvExplorer.Location = new System.Drawing.Point(0, 0); + this.tvExplorer.Name = "tvExplorer"; + treeNode1.Name = "nodeProduct"; + treeNode1.Text = "Product"; + treeNode2.Name = "nodeDialogs"; + treeNode2.Text = "Dialogs"; + treeNode3.Name = "nodeShortcuts"; + treeNode3.Text = "Shortcuts"; + this.tvExplorer.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3}); + this.tvExplorer.Size = new System.Drawing.Size(181, 406); + this.tvExplorer.TabIndex = 0; + this.tvExplorer.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvExplorer_AfterSelect); + // + // scMain + // + this.scMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.scMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.scMain.Location = new System.Drawing.Point(0, 0); + this.scMain.Name = "scMain"; + // + // scMain.Panel1 + // + this.scMain.Panel1.Controls.Add(this.tvExplorer); + // + // scMain.Panel2 + // + this.scMain.Panel2.Controls.Add(this.pnlDialogs); + this.scMain.Panel2.Controls.Add(this.pnlProduct); + this.scMain.Size = new System.Drawing.Size(534, 406); + this.scMain.SplitterDistance = 181; + this.scMain.TabIndex = 1; + // + // pnlProduct + // + this.pnlProduct.Controls.Add(this.cmdBrowseProductBackgroundImage); + this.pnlProduct.Controls.Add(this.button2); + this.pnlProduct.Controls.Add(this.button1); + this.pnlProduct.Controls.Add(this.label3); + this.pnlProduct.Controls.Add(this.txtProductBackgroundImage); + this.pnlProduct.Controls.Add(this.txtProductDiskSpace); + this.pnlProduct.Controls.Add(this.label2); + this.pnlProduct.Controls.Add(this.lblProductBackgroundImage); + this.pnlProduct.Controls.Add(this.lblProductBackgroundColor); + this.pnlProduct.Controls.Add(this.lblProductDiskSpace); + this.pnlProduct.Controls.Add(this.txtProductVersion); + this.pnlProduct.Controls.Add(this.lblProductVersion); + this.pnlProduct.Controls.Add(this.txtProductName); + this.pnlProduct.Controls.Add(this.lblProductName); + this.pnlProduct.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlProduct.Location = new System.Drawing.Point(0, 0); + this.pnlProduct.Name = "pnlProduct"; + this.pnlProduct.Size = new System.Drawing.Size(349, 406); + this.pnlProduct.TabIndex = 0; + // + // lblProductName + // + this.lblProductName.AutoSize = true; + this.lblProductName.Location = new System.Drawing.Point(3, 6); + this.lblProductName.Name = "lblProductName"; + this.lblProductName.Size = new System.Drawing.Size(76, 13); + this.lblProductName.TabIndex = 0; + this.lblProductName.Text = "Product &name:"; + // + // txtProductName + // + this.txtProductName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtProductName.Location = new System.Drawing.Point(108, 3); + this.txtProductName.Name = "txtProductName"; + this.txtProductName.Size = new System.Drawing.Size(238, 20); + this.txtProductName.TabIndex = 1; + this.txtProductName.Text = "My Application"; + // + // lblProductVersion + // + this.lblProductVersion.AutoSize = true; + this.lblProductVersion.Location = new System.Drawing.Point(3, 32); + this.lblProductVersion.Name = "lblProductVersion"; + this.lblProductVersion.Size = new System.Drawing.Size(84, 13); + this.lblProductVersion.TabIndex = 0; + this.lblProductVersion.Text = "Product &version:"; + // + // txtProductVersion + // + this.txtProductVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtProductVersion.Location = new System.Drawing.Point(108, 29); + this.txtProductVersion.Name = "txtProductVersion"; + this.txtProductVersion.Size = new System.Drawing.Size(238, 20); + this.txtProductVersion.TabIndex = 1; + this.txtProductVersion.Text = "1.0.0.0"; + // + // lblProductDiskSpace + // + this.lblProductDiskSpace.AutoSize = true; + this.lblProductDiskSpace.Location = new System.Drawing.Point(3, 58); + this.lblProductDiskSpace.Name = "lblProductDiskSpace"; + this.lblProductDiskSpace.Size = new System.Drawing.Size(63, 13); + this.lblProductDiskSpace.TabIndex = 0; + this.lblProductDiskSpace.Text = "&Disk space:"; + // + // txtProductDiskSpace + // + this.txtProductDiskSpace.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtProductDiskSpace.Location = new System.Drawing.Point(108, 55); + this.txtProductDiskSpace.Name = "txtProductDiskSpace"; + this.txtProductDiskSpace.Size = new System.Drawing.Size(238, 20); + this.txtProductDiskSpace.TabIndex = 1; + this.txtProductDiskSpace.Text = "60"; + // + // button1 + // + this.button1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.button1.BackColor = System.Drawing.Color.Blue; + this.button1.Location = new System.Drawing.Point(147, 81); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 2; + this.button1.UseVisualStyleBackColor = false; + // + // lblProductBackgroundColor + // + this.lblProductBackgroundColor.AutoSize = true; + this.lblProductBackgroundColor.Location = new System.Drawing.Point(3, 86); + this.lblProductBackgroundColor.Name = "lblProductBackgroundColor"; + this.lblProductBackgroundColor.Size = new System.Drawing.Size(94, 13); + this.lblProductBackgroundColor.TabIndex = 0; + this.lblProductBackgroundColor.Text = "Background color:"; + // + // label2 + // + this.label2.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(144, 107); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 18); + this.label2.TabIndex = 0; + this.label2.Text = "Top"; + this.label2.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // label3 + // + this.label3.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(225, 107); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(78, 18); + this.label3.TabIndex = 0; + this.label3.Text = "Bottom"; + this.label3.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // button2 + // + this.button2.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.button2.BackColor = System.Drawing.Color.Black; + this.button2.Location = new System.Drawing.Point(228, 81); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 2; + this.button2.UseVisualStyleBackColor = false; + // + // lblProductBackgroundImage + // + this.lblProductBackgroundImage.AutoSize = true; + this.lblProductBackgroundImage.Location = new System.Drawing.Point(3, 131); + this.lblProductBackgroundImage.Name = "lblProductBackgroundImage"; + this.lblProductBackgroundImage.Size = new System.Drawing.Size(99, 13); + this.lblProductBackgroundImage.TabIndex = 0; + this.lblProductBackgroundImage.Text = "Background &image:"; + // + // txtProductBackgroundImage + // + this.txtProductBackgroundImage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtProductBackgroundImage.Location = new System.Drawing.Point(108, 128); + this.txtProductBackgroundImage.Name = "txtProductBackgroundImage"; + this.txtProductBackgroundImage.Size = new System.Drawing.Size(238, 20); + this.txtProductBackgroundImage.TabIndex = 1; + // + // cmdBrowseProductBackgroundImage + // + this.cmdBrowseProductBackgroundImage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowseProductBackgroundImage.Location = new System.Drawing.Point(271, 154); + this.cmdBrowseProductBackgroundImage.Name = "cmdBrowseProductBackgroundImage"; + this.cmdBrowseProductBackgroundImage.Size = new System.Drawing.Size(75, 23); + this.cmdBrowseProductBackgroundImage.TabIndex = 3; + this.cmdBrowseProductBackgroundImage.Text = "&Browse..."; + this.cmdBrowseProductBackgroundImage.UseVisualStyleBackColor = true; + // + // pnlDialogs + // + this.pnlDialogs.Controls.Add(this.fraPreview); + this.pnlDialogs.Controls.Add(this.fraProperties); + this.pnlDialogs.Controls.Add(this.cmdDialogMoveDown); + this.pnlDialogs.Controls.Add(this.cmdDialogMoveUp); + this.pnlDialogs.Controls.Add(this.lvDialogs); + this.pnlDialogs.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlDialogs.Location = new System.Drawing.Point(0, 0); + this.pnlDialogs.Name = "pnlDialogs"; + this.pnlDialogs.Size = new System.Drawing.Size(349, 406); + this.pnlDialogs.TabIndex = 1; + // + // lvDialogs + // + this.lvDialogs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvDialogs.CheckBoxes = true; + this.lvDialogs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chTitle}); + this.lvDialogs.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + listViewItem1.StateImageIndex = 0; + listViewItem2.StateImageIndex = 0; + listViewItem3.StateImageIndex = 0; + listViewItem4.StateImageIndex = 0; + listViewItem5.StateImageIndex = 0; + listViewItem6.StateImageIndex = 0; + this.lvDialogs.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + listViewItem1, + listViewItem2, + listViewItem3, + listViewItem4, + listViewItem5, + listViewItem6}); + this.lvDialogs.Location = new System.Drawing.Point(3, 3); + this.lvDialogs.Name = "lvDialogs"; + this.lvDialogs.Size = new System.Drawing.Size(262, 119); + this.lvDialogs.TabIndex = 0; + this.lvDialogs.UseCompatibleStateImageBehavior = false; + this.lvDialogs.View = System.Windows.Forms.View.Details; + this.lvDialogs.SelectedIndexChanged += new System.EventHandler(this.lvDialogs_SelectedIndexChanged); + // + // chTitle + // + this.chTitle.Text = "Title"; + this.chTitle.Width = 169; + // + // cmdDialogMoveUp + // + this.cmdDialogMoveUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdDialogMoveUp.Location = new System.Drawing.Point(271, 3); + this.cmdDialogMoveUp.Name = "cmdDialogMoveUp"; + this.cmdDialogMoveUp.Size = new System.Drawing.Size(75, 23); + this.cmdDialogMoveUp.TabIndex = 1; + this.cmdDialogMoveUp.Text = "Move &Up"; + this.cmdDialogMoveUp.UseVisualStyleBackColor = true; + // + // cmdDialogMoveDown + // + this.cmdDialogMoveDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdDialogMoveDown.Location = new System.Drawing.Point(271, 32); + this.cmdDialogMoveDown.Name = "cmdDialogMoveDown"; + this.cmdDialogMoveDown.Size = new System.Drawing.Size(75, 23); + this.cmdDialogMoveDown.TabIndex = 1; + this.cmdDialogMoveDown.Text = "Move &Down"; + this.cmdDialogMoveDown.UseVisualStyleBackColor = true; + // + // fraProperties + // + this.fraProperties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraProperties.Controls.Add(this.pnlDialogPropertiesNone); + this.fraProperties.Location = new System.Drawing.Point(3, 128); + this.fraProperties.Name = "fraProperties"; + this.fraProperties.Size = new System.Drawing.Size(343, 111); + this.fraProperties.TabIndex = 2; + this.fraProperties.TabStop = false; + this.fraProperties.Text = "Properties"; + // + // fraPreview + // + this.fraPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraPreview.Controls.Add(this.picDialogPreview); + this.fraPreview.Location = new System.Drawing.Point(3, 245); + this.fraPreview.Name = "fraPreview"; + this.fraPreview.Size = new System.Drawing.Size(343, 158); + this.fraPreview.TabIndex = 2; + this.fraPreview.TabStop = false; + this.fraPreview.Text = "Preview"; + // + // pictureBox1 + // + this.picDialogPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.picDialogPreview.Image = global::UniversalEditor.Properties.Resources.Screenshot_Install_01_Welcome; + this.picDialogPreview.Location = new System.Drawing.Point(6, 19); + this.picDialogPreview.Name = "pictureBox1"; + this.picDialogPreview.Size = new System.Drawing.Size(331, 133); + this.picDialogPreview.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picDialogPreview.TabIndex = 0; + this.picDialogPreview.TabStop = false; + // + // pnlDialogPropertiesNone + // + this.pnlDialogPropertiesNone.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlDialogPropertiesNone.Controls.Add(this.label1); + this.pnlDialogPropertiesNone.Location = new System.Drawing.Point(6, 19); + this.pnlDialogPropertiesNone.Name = "pnlDialogPropertiesNone"; + this.pnlDialogPropertiesNone.Size = new System.Drawing.Size(331, 86); + this.pnlDialogPropertiesNone.TabIndex = 0; + // + // label1 + // + this.label1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(52, 37); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(227, 13); + this.label1.TabIndex = 0; + this.label1.Text = "There are no properties available for this dialog"; + // + // InstallationScriptEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.scMain); + this.Name = "InstallationScriptEditor"; + this.Size = new System.Drawing.Size(534, 406); + this.scMain.Panel1.ResumeLayout(false); + this.scMain.Panel2.ResumeLayout(false); + this.scMain.ResumeLayout(false); + this.pnlProduct.ResumeLayout(false); + this.pnlProduct.PerformLayout(); + this.pnlDialogs.ResumeLayout(false); + this.fraProperties.ResumeLayout(false); + this.fraPreview.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picDialogPreview)).EndInit(); + this.pnlDialogPropertiesNone.ResumeLayout(false); + this.pnlDialogPropertiesNone.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tvExplorer; + private System.Windows.Forms.SplitContainer scMain; + private System.Windows.Forms.Panel pnlProduct; + private System.Windows.Forms.TextBox txtProductName; + private System.Windows.Forms.Label lblProductName; + private System.Windows.Forms.TextBox txtProductDiskSpace; + private System.Windows.Forms.Label lblProductDiskSpace; + private System.Windows.Forms.TextBox txtProductVersion; + private System.Windows.Forms.Label lblProductVersion; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lblProductBackgroundColor; + private System.Windows.Forms.Button cmdBrowseProductBackgroundImage; + private System.Windows.Forms.TextBox txtProductBackgroundImage; + private System.Windows.Forms.Label lblProductBackgroundImage; + private System.Windows.Forms.Panel pnlDialogs; + private System.Windows.Forms.Button cmdDialogMoveDown; + private System.Windows.Forms.Button cmdDialogMoveUp; + private System.Windows.Forms.ListView lvDialogs; + private System.Windows.Forms.ColumnHeader chTitle; + private System.Windows.Forms.GroupBox fraPreview; + private System.Windows.Forms.GroupBox fraProperties; + private System.Windows.Forms.PictureBox picDialogPreview; + private System.Windows.Forms.Panel pnlDialogPropertiesNone; + private System.Windows.Forms.Label label1; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.cs new file mode 100644 index 00000000..e607eadd --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.RebelSoftware.InstallationScript; +using UniversalEditor.ObjectModels.RebelSoftware.InstallationScript.Dialogs; + +using ISDialog = UniversalEditor.ObjectModels.RebelSoftware.InstallationScript.Dialog; + +namespace UniversalEditor.Editors.RebelSoftware.InstallationScript +{ + public partial class InstallationScriptEditor : Editor + { + public InstallationScriptEditor() + { + InitializeComponent(); + tvExplorer.PopulateSystemIcons(); + + SwitchTo("Product"); + } + + private static UserInterface.EditorReference _er = null; + public override UserInterface.EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(InstallationScriptObjectModel)); + } + return _er; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + lvDialogs.Items.Clear(); + + InstallationScriptObjectModel script = (ObjectModel as InstallationScriptObjectModel); + if (script == null) return; + + lvDialogs.Items.Clear(); + + foreach (ISDialog dialog in script.Dialogs) + { + ListViewItem lviDialog = new ListViewItem(); + lviDialog.Name = dialog.GetType().FullName; + lviDialog.Checked = true; + lviDialog.Tag = dialog; + lviDialog.Text = GetDialogTitle(dialog); + lvDialogs.Items.Add(lviDialog); + } + + Type[] types = typeof(ISDialog).Assembly.GetTypes(); + List dialogTypes = new List(); + foreach (Type t in types) + { + if (!t.IsAbstract && t.IsSubclassOf(typeof(ISDialog))) + { + dialogTypes.Add(t); + } + } + + foreach (Type t in dialogTypes) + { + if (!lvDialogs.Items.ContainsKey(t.FullName)) + { + ISDialog dialog = (ISDialog)t.Assembly.CreateInstance(t.FullName); + + ListViewItem lvi = new ListViewItem(); + lvi.Name = t.FullName; + lvi.Text = GetDialogTitle(dialog); + lvi.Tag = dialog; + lvi.Checked = false; + lvDialogs.Items.Add(lvi); + } + } + } + + private string GetDialogTitle(ISDialog dialog) + { + if (dialog is CopyFilesDialog) + { + return "Progress"; + } + else if (dialog is DestinationDialog) + { + return "Destination"; + } + else if (dialog is FinishDialog) + { + return "Finish"; + } + else if (dialog is LicenseDialog) + { + return "License"; + } + else if (dialog is StartCopyingDialog) + { + return "Summary"; + } + else if (dialog is WelcomeDialog) + { + return "Welcome"; + } + return dialog.GetType().FullName; + } + + private void tvExplorer_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node != null) + { + SwitchTo(e.Node.Name.Substring(4)); + } + else + { + SwitchTo(null); + } + } + + private void SwitchTo(string name) + { + foreach (Control ctl in scMain.Panel2.Controls) + { + if (name != null && (ctl.Name.Substring(3) == name)) + { + ctl.Enabled = true; + ctl.Visible = true; + continue; + } + + ctl.Visible = false; + ctl.Enabled = false; + } + } + + private void lvDialogs_SelectedIndexChanged(object sender, EventArgs e) + { + if (lvDialogs.SelectedItems.Count != 1) return; + + ListViewItem lvi = lvDialogs.SelectedItems[0]; + + picDialogPreview.Image = null; + + ISDialog dialog = (lvi.Tag as ISDialog); + if (dialog == null) return; + + if (dialog is CopyFilesDialog) + { + picDialogPreview.Image = Properties.Resources.Screenshot_Install_05_Progress; + } + else if (dialog is DestinationDialog) + { + picDialogPreview.Image = Properties.Resources.Screenshot_Install_03_Destination; + } + else if (dialog is FinishDialog) + { + picDialogPreview.Image = Properties.Resources.Screenshot_Install_06_Finish; + } + else if (dialog is LicenseDialog) + { + picDialogPreview.Image = Properties.Resources.Screenshot_Install_02_License; + } + else if (dialog is StartCopyingDialog) + { + picDialogPreview.Image = Properties.Resources.Screenshot_Install_04_Summary; + } + else if (dialog is WelcomeDialog) + { + picDialogPreview.Image = Properties.Resources.Screenshot_Install_01_Welcome; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Editors/RebelSoftware/InstallationScript/InstallationScriptEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ac78a5b0 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("City of Orlando")] +[assembly: AssemblyProduct("UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms")] +[assembly: AssemblyCopyright("Copyright © City of Orlando 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a8f10fb1-daf0-42ba-be16-65243f8159c5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.Designer.cs new file mode 100644 index 00000000..6e0c6354 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.Designer.cs @@ -0,0 +1,153 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18444 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace UniversalEditor.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("UniversalEditor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Install_01_Welcome { + get { + object obj = ResourceManager.GetObject("Screenshot_Install_01_Welcome", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Install_02_License { + get { + object obj = ResourceManager.GetObject("Screenshot_Install_02_License", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Install_03_Destination { + get { + object obj = ResourceManager.GetObject("Screenshot_Install_03_Destination", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Install_04_Summary { + get { + object obj = ResourceManager.GetObject("Screenshot_Install_04_Summary", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Install_05_Progress { + get { + object obj = ResourceManager.GetObject("Screenshot_Install_05_Progress", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Install_06_Finish { + get { + object obj = ResourceManager.GetObject("Screenshot_Install_06_Finish", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Uninstall_01_Welcome { + get { + object obj = ResourceManager.GetObject("Screenshot_Uninstall_01_Welcome", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Uninstall_02_Progress { + get { + object obj = ResourceManager.GetObject("Screenshot_Uninstall_02_Progress", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Screenshot_Uninstall_03_Finish { + get { + object obj = ResourceManager.GetObject("Screenshot_Uninstall_03_Finish", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.resx new file mode 100644 index 00000000..39d7e17a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Properties/Resources.resx @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Screenshot_Install_01_Welcome.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Install_02_License.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Install_03_Destination.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Install_04_Summary.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Install_05_Progress.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Install_06_Finish.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Uninstall_01_Welcome.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Uninstall_02_Progress.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Screenshot_Uninstall_03_Finish.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_01_Welcome.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_01_Welcome.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1e353d6f5202666375574d1c6309709233d906b4 GIT binary patch literal 518454 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 Z2jtIJ@wZ8CGCPnR$PV1A4&d|W{}0BUH7fuB literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_02_License.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_02_License.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5bcff9ca9794d07c8ed6cb42958572c3cbdc5936 GIT binary patch literal 518454 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 EfBBOc^#A|> literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_03_Destination.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_03_Destination.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dda0aba7216b485a5d73e0376821810fe013d032 GIT binary patch literal 518454 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_04_Summary.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_04_Summary.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e05211b7c55c82c0c55faafadb967e5f2cbc4439 GIT binary patch literal 518454 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 z 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_06_Finish.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Install_06_Finish.bmp new file mode 100644 index 0000000000000000000000000000000000000000..426763ac003f6bb19d540b6f0388d94bbd210d9c GIT binary patch literal 518454 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_01_Welcome.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_01_Welcome.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8158e0306dab384b096284e25f4832f42e787158 GIT binary patch literal 518454 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_02_Progress.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_02_Progress.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e06e790e190f48425093c0f84842b7732fe78aa5 GIT binary patch literal 518454 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%0AK(ly-LOle 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_03_Finish.bmp b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms/Resources/Screenshot_Uninstall_03_Finish.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b8a156af7d8903ea8c7147b7f0792bd190319d99 GIT binary patch literal 518454 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 b0u?YmXZX87Q%C_RAO)nrC + + + + Debug + AnyCPU + {14341BB8-05E4-4EF8-AD05-3D3073C1EF00} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.RebelSoftware.UserInterface.WindowsForms + v3.5 + 512 + + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + UserControl + + + InstallationScriptEditor.cs + + + + True + True + Resources.resx + + + + + InstallationScriptEditor.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {311885BE-3FAF-430B-91B2-6EC135D3A8AB} + UniversalEditor.Plugins.RebelSoftware + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.Designer.cs new file mode 100644 index 00000000..2449cf54 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.Designer.cs @@ -0,0 +1,117 @@ +namespace UniversalEditor.Dialogs +{ + partial class ObjectPropertiesDialogBase + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.lblName = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox1.Location = new System.Drawing.Point(12, 38); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(428, 192); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "groupBox1"; + // + // lblName + // + this.lblName.AutoSize = true; + this.lblName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblName.Location = new System.Drawing.Point(12, 15); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(70, 13); + this.lblName.TabIndex = 0; + this.lblName.Text = "Object &name:"; + // + // txtName + // + this.txtName.Location = new System.Drawing.Point(88, 12); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(352, 20); + this.txtName.TabIndex = 1; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(365, 236); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 4; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(284, 236); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 3; + this.cmdOK.Text = "OK"; + this.cmdOK.UseVisualStyleBackColor = true; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // ObjectPropertiesDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size(452, 271); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.txtName); + this.Controls.Add(this.lblName); + this.Controls.Add(this.groupBox1); + this.Name = "ObjectPropertiesDialog"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Object Properties"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label lblName; + internal System.Windows.Forms.TextBox txtName; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.cs new file mode 100644 index 00000000..ab2a9dd6 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs +{ + internal partial class ObjectPropertiesDialogBase : Form + { + public ObjectPropertiesDialogBase() + { + InitializeComponent(); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + } + public class ObjectPropertiesDialog + { + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + public DialogResult ShowDialog() + { + ObjectPropertiesDialogBase dlg = new ObjectPropertiesDialogBase(); + dlg.txtName.Text = mvarName; + if (dlg.ShowDialog() == DialogResult.OK) + { + mvarName = dlg.txtName.Text; + return DialogResult.OK; + } + return DialogResult.Cancel; + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Dialogs/ObjectPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.Designer.cs new file mode 100644 index 00000000..5658859e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.Designer.cs @@ -0,0 +1,215 @@ +namespace UniversalEditor.Editors +{ + partial class CodeEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tvExplorer = new System.Windows.Forms.TreeView(); + this.lvEnum = new System.Windows.Forms.ListView(); + this.chEnumValueName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chEnumValueValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.lvExplorer = new System.Windows.Forms.ListView(); + this.mnuContextTreeView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewClass = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewInterface = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewNamespace = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewMethod = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewMethodCall = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewNewVariable = new System.Windows.Forms.ToolStripMenuItem(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.mnuContextTreeView.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tvExplorer); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.lvEnum); + this.splitContainer1.Panel2.Controls.Add(this.lvExplorer); + this.splitContainer1.Size = new System.Drawing.Size(568, 387); + this.splitContainer1.SplitterDistance = 189; + this.splitContainer1.TabIndex = 1; + // + // tvExplorer + // + this.tvExplorer.ContextMenuStrip = this.mnuContextTreeView; + this.tvExplorer.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvExplorer.HideSelection = false; + this.tvExplorer.Location = new System.Drawing.Point(0, 0); + this.tvExplorer.Name = "tvExplorer"; + this.tvExplorer.Size = new System.Drawing.Size(189, 387); + this.tvExplorer.TabIndex = 0; + this.tvExplorer.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvExplorer_AfterSelect); + // + // lvEnum + // + this.lvEnum.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chEnumValueName, + this.chEnumValueValue}); + this.lvEnum.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvEnum.FullRowSelect = true; + this.lvEnum.GridLines = true; + this.lvEnum.HideSelection = false; + this.lvEnum.Location = new System.Drawing.Point(0, 0); + this.lvEnum.Name = "lvEnum"; + this.lvEnum.Size = new System.Drawing.Size(375, 387); + this.lvEnum.TabIndex = 1; + this.lvEnum.UseCompatibleStateImageBehavior = false; + this.lvEnum.View = System.Windows.Forms.View.Details; + this.lvEnum.Visible = false; + // + // chEnumValueName + // + this.chEnumValueName.Text = "Name"; + // + // chEnumValueValue + // + this.chEnumValueValue.Text = "Value"; + // + // lvExplorer + // + this.lvExplorer.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvExplorer.FullRowSelect = true; + this.lvExplorer.GridLines = true; + this.lvExplorer.HideSelection = false; + this.lvExplorer.Location = new System.Drawing.Point(0, 0); + this.lvExplorer.Name = "lvExplorer"; + this.lvExplorer.Size = new System.Drawing.Size(375, 387); + this.lvExplorer.TabIndex = 0; + this.lvExplorer.UseCompatibleStateImageBehavior = false; + this.lvExplorer.Visible = false; + // + // mnuContextTreeView + // + this.mnuContextTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem}); + this.mnuContextTreeView.Name = "mnuContextTreeView"; + this.mnuContextTreeView.Size = new System.Drawing.Size(96, 26); + this.mnuContextTreeView.Opening += new System.ComponentModel.CancelEventHandler(this.mnuContextTreeView_Opening); + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewNewNamespace, + this.mnuContextTreeViewNewClass, + this.mnuContextTreeViewNewInterface, + this.mnuContextTreeViewNewMethod, + this.mnuContextTreeViewNewMethodCall, + this.mnuContextTreeViewNewVariable}); + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Size = new System.Drawing.Size(95, 22); + this.newToolStripMenuItem.Text = "Ne&w"; + // + // mnuContextTreeViewNewClass + // + this.mnuContextTreeViewNewClass.Name = "mnuContextTreeViewNewClass"; + this.mnuContextTreeViewNewClass.Size = new System.Drawing.Size(152, 22); + this.mnuContextTreeViewNewClass.Text = "&Class"; + this.mnuContextTreeViewNewClass.Click += new System.EventHandler(this.mnuContextTreeViewNew_Click); + // + // mnuContextTreeViewNewInterface + // + this.mnuContextTreeViewNewInterface.Name = "mnuContextTreeViewNewInterface"; + this.mnuContextTreeViewNewInterface.Size = new System.Drawing.Size(152, 22); + this.mnuContextTreeViewNewInterface.Text = "&Interface"; + this.mnuContextTreeViewNewInterface.Click += new System.EventHandler(this.mnuContextTreeViewNew_Click); + // + // mnuContextTreeViewNewNamespace + // + this.mnuContextTreeViewNewNamespace.Name = "mnuContextTreeViewNewNamespace"; + this.mnuContextTreeViewNewNamespace.Size = new System.Drawing.Size(152, 22); + this.mnuContextTreeViewNewNamespace.Text = "&Namespace"; + this.mnuContextTreeViewNewNamespace.Click += new System.EventHandler(this.mnuContextTreeViewNew_Click); + // + // mnuContextTreeViewNewMethod + // + this.mnuContextTreeViewNewMethod.Name = "mnuContextTreeViewNewMethod"; + this.mnuContextTreeViewNewMethod.Size = new System.Drawing.Size(152, 22); + this.mnuContextTreeViewNewMethod.Text = "&Method"; + this.mnuContextTreeViewNewMethod.Click += new System.EventHandler(this.mnuContextTreeViewNew_Click); + // + // mnuContextTreeViewNewMethodCall + // + this.mnuContextTreeViewNewMethodCall.Name = "mnuContextTreeViewNewMethodCall"; + this.mnuContextTreeViewNewMethodCall.Size = new System.Drawing.Size(152, 22); + this.mnuContextTreeViewNewMethodCall.Text = "Method &Call"; + this.mnuContextTreeViewNewMethodCall.Click += new System.EventHandler(this.mnuContextTreeViewNew_Click); + // + // mnuContextTreeViewNewVariable + // + this.mnuContextTreeViewNewVariable.Name = "mnuContextTreeViewNewVariable"; + this.mnuContextTreeViewNewVariable.Size = new System.Drawing.Size(152, 22); + this.mnuContextTreeViewNewVariable.Text = "&Variable"; + this.mnuContextTreeViewNewVariable.Click += new System.EventHandler(this.mnuContextTreeViewNew_Click); + // + // CodeEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "CodeEditor"; + this.Size = new System.Drawing.Size(568, 387); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.mnuContextTreeView.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tvExplorer; + private System.Windows.Forms.ListView lvExplorer; + private System.Windows.Forms.ListView lvEnum; + private System.Windows.Forms.ColumnHeader chEnumValueName; + private System.Windows.Forms.ColumnHeader chEnumValueValue; + private AwesomeControls.CommandBars.CBContextMenu mnuContextTreeView; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewNamespace; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewClass; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewInterface; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewMethod; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewMethodCall; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewNewVariable; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.cs new file mode 100644 index 00000000..9fbf2d90 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.cs @@ -0,0 +1,580 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +using UniversalEditor.ObjectModels.SourceCode; +using UniversalEditor.ObjectModels.SourceCode.CodeElements; +using UniversalEditor.Accessors; + +namespace UniversalEditor.Editors +{ + public partial class CodeEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(CodeObjectModel)); + } + return _er; + } + public CodeEditor() + { + InitializeComponent(); + + #region Initializing Menu Items + ActionMenuItem mnuProject = base.MenuBar.Items.Add("mnuProject", "&Project"); + mnuProject.Items.Add("mnuProjectAddWindow", "Add &Window...", mnuProjectAddWindow_Click, 0); + mnuProject.Items.Add("mnuProjectAddControl", "Add Co&ntrol...", mnuProjectAddControl_Click, 1); + mnuProject.Items.Add("mnuProjectAddClass", "Add &Class...", mnuProjectAddClass_Click, 2); + mnuProject.Items.AddSeparator(3); + + #endregion + #region Initializing Image Lists + tvExplorer.ImageList = base.SmallImageList; + + lvEnum.LargeImageList = base.LargeImageList; + lvEnum.SmallImageList = base.SmallImageList; + + lvExplorer.LargeImageList = base.LargeImageList; + lvExplorer.SmallImageList = base.SmallImageList; + #endregion + } + + #region Menu Item Handlers + private void mnuProjectAddWindow_Click(object sender, EventArgs e) + { + MessageBox.Show("Going to add a new Window to the project", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + HostApplication.CurrentWindow.NewFile(); + } + private void mnuProjectAddControl_Click(object sender, EventArgs e) + { + MessageBox.Show("Going to add a new Control to the project", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + HostApplication.CurrentWindow.NewFile(); + } + private void mnuProjectAddClass_Click(object sender, EventArgs e) + { + MessageBox.Show("Going to add a new Class to the project", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + HostApplication.CurrentWindow.NewFile(); + } + #endregion + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tvExplorer.Nodes.Clear(); + + CodeObjectModel code = (base.ObjectModel as CodeObjectModel); + if (code == null) return; + + TreeNode tnRoot = new TreeNode(); + + string FileName = String.Empty; + if (code.Accessor is FileAccessor) FileName = (code.Accessor as FileAccessor).FileName; + switch (System.IO.Path.GetExtension(FileName)) + { + case ".cs": + { + tnRoot.ImageKey = "project-csharp"; + tnRoot.SelectedImageKey = "project-csharp"; + break; + } + case ".vb": + { + tnRoot.ImageKey = "project-vbnet"; + tnRoot.SelectedImageKey = "project-vbnet"; + break; + } + case ".c": + case ".cpp": + { + tnRoot.ImageKey = "project-cpp"; + tnRoot.SelectedImageKey = "project-cpp"; + break; + } + case ".js": + case ".jsf": + { + tnRoot.ImageKey = "project-jsharp"; + tnRoot.SelectedImageKey = "project-jsharp"; + break; + } + case ".fs": + { + tnRoot.ImageKey = "project-fsharp"; + tnRoot.SelectedImageKey = "project-fsharp"; + break; + } + } + tnRoot.Text = System.IO.Path.GetFileName(FileName); + + foreach (CodeElement element in code.Elements) + { + RecursiveAddTreeNode(element, tnRoot); + } + tvExplorer.Nodes.Add(tnRoot); + } + + private void RecursiveAddTreeNode(CodeElement element, TreeNode parent) + { + if (element == null) return; + + TreeNode tn = new TreeNode(); + if (element is INamedCodeElement) + { + tn.Text = (element as INamedCodeElement).Name; + } + tn.Tag = element; + + if (element is CodeClassElement) + { + CodeClassElement clss = (element as CodeClassElement); + switch (clss.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + tn.ImageKey = "class-internal"; + tn.SelectedImageKey = "class-internal"; + break; + } + case CodeAccessModifiers.Private: + { + tn.ImageKey = "class-private"; + tn.SelectedImageKey = "class-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + tn.ImageKey = "class-protected"; + tn.SelectedImageKey = "class-protected"; + break; + } + default: + { + tn.ImageKey = "class"; + tn.SelectedImageKey = "class"; + break; + } + } + } + else if (element is CodeEnumerationElement) + { + CodeEnumerationElement enumm = (element as CodeEnumerationElement); + switch (enumm.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + tn.ImageKey = "enum-internal"; + tn.SelectedImageKey = "enum-internal"; + break; + } + case CodeAccessModifiers.Private: + { + tn.ImageKey = "enum-private"; + tn.SelectedImageKey = "enum-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + tn.ImageKey = "enum-protected"; + tn.SelectedImageKey = "enum-protected"; + break; + } + default: + { + tn.ImageKey = "enum"; + tn.SelectedImageKey = "enum"; + break; + } + } + + foreach (CodeEnumerationValue cev in enumm.Values) + { + TreeNode tn1 = new TreeNode(); + tn1.Text = cev.Name + " = " + cev.Value.ToString(); + tn1.ImageKey = "enumvalue"; + tn1.SelectedImageKey = "enumvalue"; + tn1.Tag = cev; + tn.Nodes.Add(tn1); + } + } + else if (element is CodeMethodElement) + { + CodeMethodElement meth = (element as CodeMethodElement); + + switch (meth.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + tn.ImageKey = "method-internal"; + tn.SelectedImageKey = "method-internal"; + break; + } + case CodeAccessModifiers.Private: + { + tn.ImageKey = "method-private"; + tn.SelectedImageKey = "method-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + tn.ImageKey = "method-protected"; + tn.SelectedImageKey = "method-protected"; + break; + } + default: + { + tn.ImageKey = "method"; + tn.SelectedImageKey = "method"; + break; + } + } + } + else if (element is CodeNamespaceElement) + { + tn.ImageKey = "namespace"; + tn.SelectedImageKey = "namespace"; + } + else if (element is CodePropertyElement) + { + CodePropertyElement prop = (element as CodePropertyElement); + switch (prop.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + tn.ImageKey = "property-internal"; + tn.SelectedImageKey = "property-internal"; + break; + } + case CodeAccessModifiers.Private: + { + tn.ImageKey = "property-private"; + tn.SelectedImageKey = "property-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + tn.ImageKey = "property-protected"; + tn.SelectedImageKey = "property-protected"; + break; + } + default: + { + tn.ImageKey = "property"; + tn.SelectedImageKey = "property"; + break; + } + } + } + else if (element is CodeVariableElement) + { + CodeVariableElement field = (element as CodeVariableElement); + switch (field.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + tn.ImageKey = "field-internal"; + tn.SelectedImageKey = "field-internal"; + break; + } + case CodeAccessModifiers.Private: + { + tn.ImageKey = "field-private"; + tn.SelectedImageKey = "field-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + tn.ImageKey = "field-protected"; + tn.SelectedImageKey = "field-protected"; + break; + } + default: + { + tn.ImageKey = "field"; + tn.SelectedImageKey = "field"; + break; + } + } + } + + if (element is CodeElementContainerElement) + { + CodeElementContainerElement container = (element as CodeElementContainerElement); + foreach (CodeElement el in container.Elements) + { + RecursiveAddTreeNode(el, tn); + } + } + + if (parent != null) + { + parent.Nodes.Add(tn); + } + else + { + tvExplorer.Nodes.Add(tn); + } + } + + private void tvExplorer_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node.Tag is CodeElementContainerElement) + { + CodeElementContainerElement container = (e.Node.Tag as CodeElementContainerElement); + + lvExplorer.Items.Clear(); + foreach (CodeElement element in container.Elements) + { + ListViewItem lvi = new ListViewItem(); + + #region Class + if (element is CodeClassElement) + { + CodeClassElement el = (element as CodeClassElement); + switch (el.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + lvi.ImageKey = "class-internal"; + break; + } + case CodeAccessModifiers.Private: + { + lvi.ImageKey = "class-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + lvi.ImageKey = "class-protected"; + break; + } + default: + { + lvi.ImageKey = "class"; + break; + } + } + } + #endregion + #region Enum + else if (element is CodeEnumerationElement) + { + CodeEnumerationElement el = (element as CodeEnumerationElement); + switch (el.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + lvi.ImageKey = "enum-internal"; + break; + } + case CodeAccessModifiers.Private: + { + lvi.ImageKey = "enum-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + lvi.ImageKey = "enum-protected"; + break; + } + default: + { + lvi.ImageKey = "enum"; + break; + } + } + } + #endregion + #region Method + else if (element is CodeMethodElement) + { + CodeMethodElement el = (element as CodeMethodElement); + switch (el.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + lvi.ImageKey = "method-internal"; + break; + } + case CodeAccessModifiers.Private: + { + lvi.ImageKey = "method-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + lvi.ImageKey = "method-protected"; + break; + } + default: + { + lvi.ImageKey = "method"; + break; + } + } + } + #endregion + #region Variable + else if (element is CodeVariableElement) + { + CodeVariableElement el = (element as CodeVariableElement); + switch (el.AccessModifiers) + { + case CodeAccessModifiers.Assembly: + case CodeAccessModifiers.FamilyANDAssembly: + case CodeAccessModifiers.FamilyORAssembly: + { + lvi.ImageKey = "field-internal"; + break; + } + case CodeAccessModifiers.Private: + { + lvi.ImageKey = "field-private"; + break; + } + case CodeAccessModifiers.None: + case CodeAccessModifiers.Family: + { + lvi.ImageKey = "field-protected"; + break; + } + default: + { + lvi.ImageKey = "field"; + break; + } + } + } + #endregion + + lvi.Tag = element; + if (element is INamedCodeElement) + { + lvi.Text = (element as INamedCodeElement).Name; + } + lvExplorer.Items.Add(lvi); + } + + lvExplorer.Visible = true; + lvEnum.Visible = false; + lvExplorer.BringToFront(); + } + else if (e.Node.Tag is CodeEnumerationElement) + { + CodeEnumerationElement enumm = (e.Node.Tag as CodeEnumerationElement); + + lvEnum.Items.Clear(); + foreach (CodeEnumerationValue value in enumm.Values) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = value.Name; + lvi.SubItems.Add(value.Value.ToString()); + lvi.Tag = value; + lvi.ImageKey = "enumvalue"; + lvEnum.Items.Add(lvi); + } + lvEnum.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + lvExplorer.Visible = false; + lvEnum.Visible = true; + lvEnum.BringToFront(); + } + } + + private void mnuContextTreeView_Opening(object sender, CancelEventArgs e) + { + if (tvExplorer.SelectedNode == null || tvExplorer.SelectedNode.Tag == null) + { + mnuContextTreeViewNewMethodCall.Visible = false; + mnuContextTreeViewNewVariable.Visible = false; + } + + if (tvExplorer.SelectedNode != null) + { + mnuContextTreeViewNewNamespace.Visible = (!(tvExplorer.SelectedNode.Tag is CodeClassElement)); + mnuContextTreeViewNewMethodCall.Visible = (tvExplorer.SelectedNode.Tag is CodeMethodElement); + } + } + + private void mnuContextTreeViewNew_Click(object sender, EventArgs e) + { + CodeObjectModel code = (ObjectModel as CodeObjectModel); + if (code == null) return; + + string objectType = (sender as ToolStripMenuItem).Name.Substring("mnuContextTreeViewNew".Length).ToLower(); + switch (objectType) + { + case "namespace": + { + Dialogs.ObjectPropertiesDialog dlg = new Dialogs.ObjectPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + TreeNode prev = tvExplorer.SelectedNode; + + TreeNode tn = new TreeNode(); + tn.Text = dlg.Name; + CodeNamespaceElement ce = new CodeNamespaceElement(dlg.Name); + tn.Tag = ce; + ce.Name = dlg.Name.Split(new char[] { '.' }); + + TreeNodeCollection tnc = (tvExplorer.SelectedNode != null ? tvExplorer.SelectedNode.Nodes : tvExplorer.Nodes); + tnc.Add(tn); + tvExplorer.SelectedNode = tn; + + if (prev != null && prev.Tag != null) + { + CodeElementContainerElement ct = (prev.Tag as CodeElementContainerElement); + if (ct != null) + { + ct.Elements.Add(ce); + } + } + else + { + code.Elements.Add(ce); + } + } + break; + } + case "class": + { + break; + } + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.resx new file mode 100644 index 00000000..e0796ed5 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Editors/CodeEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 30 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.Designer.cs new file mode 100644 index 00000000..ead45503 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.Designer.cs @@ -0,0 +1,362 @@ +namespace UniversalEditor.OptionPanels.Editors.CodeEditor +{ + partial class AppearanceOptionPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("XML Attribute"); + System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("XML Attribute Value"); + System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("XML CDATA Section"); + System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("XML Comment"); + System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem("XML Delimiter"); + System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem("XML Documentation Comment"); + System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem("XML Documentation Tag"); + System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem("XML Keyword"); + System.Windows.Forms.ListViewItem listViewItem9 = new System.Windows.Forms.ListViewItem("XML Name"); + System.Windows.Forms.ListViewItem listViewItem10 = new System.Windows.Forms.ListViewItem("XML Processing Instruction"); + System.Windows.Forms.ListViewItem listViewItem11 = new System.Windows.Forms.ListViewItem("XML Text"); + this.fraComponents = new System.Windows.Forms.GroupBox(); + this.cboStyleGroup = new System.Windows.Forms.ComboBox(); + this.lblStyleGroup = new System.Windows.Forms.Label(); + this.lvComponents = new System.Windows.Forms.ListView(); + this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.fraFont = new System.Windows.Forms.GroupBox(); + this.chkFontStrikethrough = new System.Windows.Forms.CheckBox(); + this.chkUnderline = new System.Windows.Forms.CheckBox(); + this.chkFontItalic = new System.Windows.Forms.CheckBox(); + this.chkFontBold = new System.Windows.Forms.CheckBox(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.cboFontFamily = new System.Windows.Forms.ComboBox(); + this.lblFontSize = new System.Windows.Forms.Label(); + this.lblFontFamily = new System.Windows.Forms.Label(); + this.fraColor = new System.Windows.Forms.GroupBox(); + this.cmdColorBackground = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.cmdColorForeground = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.fraPreview = new System.Windows.Forms.GroupBox(); + this.pnlPreview = new System.Windows.Forms.Panel(); + this.fraComponents.SuspendLayout(); + this.fraFont.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + this.fraColor.SuspendLayout(); + this.fraPreview.SuspendLayout(); + this.SuspendLayout(); + // + // fraComponents + // + this.fraComponents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraComponents.Controls.Add(this.cboStyleGroup); + this.fraComponents.Controls.Add(this.lblStyleGroup); + this.fraComponents.Controls.Add(this.lvComponents); + this.fraComponents.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraComponents.Location = new System.Drawing.Point(3, 3); + this.fraComponents.Name = "fraComponents"; + this.fraComponents.Size = new System.Drawing.Size(518, 166); + this.fraComponents.TabIndex = 0; + this.fraComponents.TabStop = false; + this.fraComponents.Text = "Components"; + // + // cboStyleGroup + // + this.cboStyleGroup.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboStyleGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboStyleGroup.FormattingEnabled = true; + this.cboStyleGroup.Location = new System.Drawing.Point(75, 19); + this.cboStyleGroup.Name = "cboStyleGroup"; + this.cboStyleGroup.Size = new System.Drawing.Size(437, 21); + this.cboStyleGroup.TabIndex = 2; + // + // lblStyleGroup + // + this.lblStyleGroup.AutoSize = true; + this.lblStyleGroup.Location = new System.Drawing.Point(6, 22); + this.lblStyleGroup.Name = "lblStyleGroup"; + this.lblStyleGroup.Size = new System.Drawing.Size(63, 13); + this.lblStyleGroup.TabIndex = 1; + this.lblStyleGroup.Text = "Style &group:"; + // + // lvComponents + // + this.lvComponents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvComponents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chName}); + this.lvComponents.FullRowSelect = true; + this.lvComponents.GridLines = true; + this.lvComponents.HideSelection = false; + this.lvComponents.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + listViewItem1, + listViewItem2, + listViewItem3, + listViewItem4, + listViewItem5, + listViewItem6, + listViewItem7, + listViewItem8, + listViewItem9, + listViewItem10, + listViewItem11}); + this.lvComponents.Location = new System.Drawing.Point(6, 46); + this.lvComponents.Name = "lvComponents"; + this.lvComponents.Size = new System.Drawing.Size(506, 114); + this.lvComponents.TabIndex = 0; + this.lvComponents.UseCompatibleStateImageBehavior = false; + this.lvComponents.View = System.Windows.Forms.View.Details; + // + // chName + // + this.chName.Text = "Name"; + this.chName.Width = 154; + // + // fraFont + // + this.fraFont.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraFont.Controls.Add(this.chkFontStrikethrough); + this.fraFont.Controls.Add(this.chkUnderline); + this.fraFont.Controls.Add(this.chkFontItalic); + this.fraFont.Controls.Add(this.chkFontBold); + this.fraFont.Controls.Add(this.numericUpDown1); + this.fraFont.Controls.Add(this.cboFontFamily); + this.fraFont.Controls.Add(this.lblFontSize); + this.fraFont.Controls.Add(this.lblFontFamily); + this.fraFont.Location = new System.Drawing.Point(3, 175); + this.fraFont.Name = "fraFont"; + this.fraFont.Size = new System.Drawing.Size(288, 100); + this.fraFont.TabIndex = 1; + this.fraFont.TabStop = false; + this.fraFont.Text = "Font"; + // + // chkFontStrikethrough + // + this.chkFontStrikethrough.AutoSize = true; + this.chkFontStrikethrough.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkFontStrikethrough.Location = new System.Drawing.Point(122, 48); + this.chkFontStrikethrough.Name = "chkFontStrikethrough"; + this.chkFontStrikethrough.Size = new System.Drawing.Size(95, 18); + this.chkFontStrikethrough.TabIndex = 3; + this.chkFontStrikethrough.Text = "S&trikethrough"; + this.chkFontStrikethrough.UseVisualStyleBackColor = true; + // + // chkUnderline + // + this.chkUnderline.AutoSize = true; + this.chkUnderline.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkUnderline.Location = new System.Drawing.Point(182, 72); + this.chkUnderline.Name = "chkUnderline"; + this.chkUnderline.Size = new System.Drawing.Size(77, 18); + this.chkUnderline.TabIndex = 3; + this.chkUnderline.Text = "&Underline"; + this.chkUnderline.UseVisualStyleBackColor = true; + // + // chkFontItalic + // + this.chkFontItalic.AutoSize = true; + this.chkFontItalic.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkFontItalic.Location = new System.Drawing.Point(122, 72); + this.chkFontItalic.Name = "chkFontItalic"; + this.chkFontItalic.Size = new System.Drawing.Size(54, 18); + this.chkFontItalic.TabIndex = 3; + this.chkFontItalic.Text = "&Italic"; + this.chkFontItalic.UseVisualStyleBackColor = true; + // + // chkFontBold + // + this.chkFontBold.AutoSize = true; + this.chkFontBold.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.chkFontBold.Location = new System.Drawing.Point(63, 72); + this.chkFontBold.Name = "chkFontBold"; + this.chkFontBold.Size = new System.Drawing.Size(53, 18); + this.chkFontBold.TabIndex = 3; + this.chkFontBold.Text = "&Bold"; + this.chkFontBold.UseVisualStyleBackColor = true; + // + // numericUpDown1 + // + this.numericUpDown1.Location = new System.Drawing.Point(63, 46); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(53, 20); + this.numericUpDown1.TabIndex = 2; + // + // cboFontFamily + // + this.cboFontFamily.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboFontFamily.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboFontFamily.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboFontFamily.FormattingEnabled = true; + this.cboFontFamily.Location = new System.Drawing.Point(63, 19); + this.cboFontFamily.Name = "cboFontFamily"; + this.cboFontFamily.Size = new System.Drawing.Size(219, 21); + this.cboFontFamily.TabIndex = 1; + // + // lblFontSize + // + this.lblFontSize.AutoSize = true; + this.lblFontSize.Location = new System.Drawing.Point(18, 48); + this.lblFontSize.Name = "lblFontSize"; + this.lblFontSize.Size = new System.Drawing.Size(30, 13); + this.lblFontSize.TabIndex = 0; + this.lblFontSize.Text = "&Size:"; + // + // lblFontFamily + // + this.lblFontFamily.AutoSize = true; + this.lblFontFamily.Location = new System.Drawing.Point(18, 22); + this.lblFontFamily.Name = "lblFontFamily"; + this.lblFontFamily.Size = new System.Drawing.Size(39, 13); + this.lblFontFamily.TabIndex = 0; + this.lblFontFamily.Text = "&Family:"; + // + // fraColor + // + this.fraColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.fraColor.Controls.Add(this.cmdColorBackground); + this.fraColor.Controls.Add(this.label2); + this.fraColor.Controls.Add(this.cmdColorForeground); + this.fraColor.Controls.Add(this.label1); + this.fraColor.Location = new System.Drawing.Point(297, 175); + this.fraColor.Name = "fraColor"; + this.fraColor.Size = new System.Drawing.Size(218, 100); + this.fraColor.TabIndex = 1; + this.fraColor.TabStop = false; + this.fraColor.Text = "Color"; + // + // cmdColorBackground + // + this.cmdColorBackground.BackColor = System.Drawing.SystemColors.Window; + this.cmdColorBackground.Location = new System.Drawing.Point(91, 46); + this.cmdColorBackground.Name = "cmdColorBackground"; + this.cmdColorBackground.Size = new System.Drawing.Size(75, 23); + this.cmdColorBackground.TabIndex = 1; + this.cmdColorBackground.UseVisualStyleBackColor = false; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(17, 51); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(68, 13); + this.label2.TabIndex = 0; + this.label2.Text = "Background:"; + // + // cmdColorForeground + // + this.cmdColorForeground.BackColor = System.Drawing.SystemColors.WindowText; + this.cmdColorForeground.Location = new System.Drawing.Point(91, 17); + this.cmdColorForeground.Name = "cmdColorForeground"; + this.cmdColorForeground.Size = new System.Drawing.Size(75, 23); + this.cmdColorForeground.TabIndex = 1; + this.cmdColorForeground.UseVisualStyleBackColor = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(17, 22); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(64, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Foreground:"; + // + // fraPreview + // + this.fraPreview.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraPreview.Controls.Add(this.pnlPreview); + this.fraPreview.Location = new System.Drawing.Point(3, 281); + this.fraPreview.Name = "fraPreview"; + this.fraPreview.Size = new System.Drawing.Size(512, 98); + this.fraPreview.TabIndex = 1; + this.fraPreview.TabStop = false; + this.fraPreview.Text = "Preview"; + // + // pnlPreview + // + this.pnlPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlPreview.BackColor = System.Drawing.SystemColors.Window; + this.pnlPreview.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlPreview.Location = new System.Drawing.Point(6, 19); + this.pnlPreview.Name = "pnlPreview"; + this.pnlPreview.Size = new System.Drawing.Size(500, 73); + this.pnlPreview.TabIndex = 0; + // + // AppearanceOptionPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.fraPreview); + this.Controls.Add(this.fraColor); + this.Controls.Add(this.fraFont); + this.Controls.Add(this.fraComponents); + this.Name = "AppearanceOptionPanel"; + this.Size = new System.Drawing.Size(524, 382); + this.fraComponents.ResumeLayout(false); + this.fraComponents.PerformLayout(); + this.fraFont.ResumeLayout(false); + this.fraFont.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + this.fraColor.ResumeLayout(false); + this.fraColor.PerformLayout(); + this.fraPreview.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox fraComponents; + private System.Windows.Forms.ListView lvComponents; + private System.Windows.Forms.GroupBox fraFont; + private System.Windows.Forms.GroupBox fraColor; + private System.Windows.Forms.GroupBox fraPreview; + private System.Windows.Forms.ComboBox cboFontFamily; + private System.Windows.Forms.Label lblFontFamily; + private System.Windows.Forms.ColumnHeader chName; + private System.Windows.Forms.ComboBox cboStyleGroup; + private System.Windows.Forms.Label lblStyleGroup; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private System.Windows.Forms.Label lblFontSize; + private System.Windows.Forms.CheckBox chkFontStrikethrough; + private System.Windows.Forms.CheckBox chkUnderline; + private System.Windows.Forms.CheckBox chkFontItalic; + private System.Windows.Forms.CheckBox chkFontBold; + private System.Windows.Forms.Panel pnlPreview; + private System.Windows.Forms.Button cmdColorForeground; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button cmdColorBackground; + private System.Windows.Forms.Label label2; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.cs new file mode 100644 index 00000000..a54d172b --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.OptionPanels.Editors.CodeEditor +{ + public partial class AppearanceOptionPanel : OptionPanel + { + public AppearanceOptionPanel() + { + InitializeComponent(); + } + + private string[] mvarOptionGroups = new string[] + { + "Editors", + "Code Editor", + "Appearance" + }; + + public override string[] OptionGroups + { + get { return mvarOptionGroups; } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/OptionPanels/Editors/CodeEditor/AppearanceOptionPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2caba290 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Software Development plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("34494c75-e28d-41a5-aa5f-c3c70b492c33")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.Designer.cs new file mode 100644 index 00000000..5b7e92df --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.Designer.cs @@ -0,0 +1,45 @@ +namespace UniversalEditor.PropertySheets +{ + partial class ApplicationPropertySheet + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ApplicationPropertySheet + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "ApplicationPropertySheet"; + this.Size = new System.Drawing.Size(457, 277); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.cs new file mode 100644 index 00000000..5bfbf96a --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.PropertySheets +{ + public partial class ApplicationPropertySheet : UserControl + { + public ApplicationPropertySheet() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/PropertySheets/ApplicationPropertySheet.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..798f5d88 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms/UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms.csproj @@ -0,0 +1,115 @@ + + + + + Debug + AnyCPU + {094E86E4-903B-493C-91EF-4597658748A9} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.SoftwareDevelopment.UserInterface.WindowsForms + v3.5 + 512 + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + ..\..\..\..\..\..\AwesomeControls\bin\Debug\AwesomeControls.dll + + + + + Form + + + ObjectPropertiesDialog.cs + + + UserControl + + + CodeEditor.cs + + + UserControl + + + AppearanceOptionPanel.cs + + + + UserControl + + + ApplicationPropertySheet.cs + + + + + ObjectPropertiesDialog.cs + + + CodeEditor.cs + + + AppearanceOptionPanel.cs + + + ApplicationPropertySheet.cs + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {CC5C9010-83EF-491D-9262-2CED509D895D} + UniversalEditor.Plugins.SoftwareDevelopment + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.Designer.cs new file mode 100644 index 00000000..239a8f87 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.Designer.cs @@ -0,0 +1,250 @@ +namespace UniversalEditor.Editors +{ + partial class StoryEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.mnuContextTreeView = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuContextTreeViewAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddNewItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewAddExistingItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewExclude = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewCut = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewPaste = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewRename = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuContextTreeViewSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuContextTreeViewProperties = new System.Windows.Forms.ToolStripMenuItem(); + this.lv = new System.Windows.Forms.ListView(); + this.imlSmallIcons = new System.Windows.Forms.ImageList(this.components); + this.imlLargeIcons = new System.Windows.Forms.ImageList(this.components); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.mnuContextTreeView.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.lv); + this.splitContainer1.Size = new System.Drawing.Size(616, 306); + this.splitContainer1.SplitterDistance = 205; + this.splitContainer1.TabIndex = 0; + // + // tv + // + this.tv.ContextMenuStrip = this.mnuContextTreeView; + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.ImageIndex = 0; + this.tv.ImageList = this.imlSmallIcons; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.SelectedImageIndex = 0; + this.tv.Size = new System.Drawing.Size(205, 306); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown); + // + // mnuContextTreeView + // + this.mnuContextTreeView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewAdd, + this.mnuContextTreeViewSep1, + this.mnuContextTreeViewExclude, + this.mnuContextTreeViewSep2, + this.mnuContextTreeViewCut, + this.mnuContextTreeViewCopy, + this.mnuContextTreeViewPaste, + this.mnuContextTreeViewDelete, + this.mnuContextTreeViewRename, + this.mnuContextTreeViewSep3, + this.mnuContextTreeViewProperties}); + this.mnuContextTreeView.Name = "mnuContextTreeView"; + this.mnuContextTreeView.Size = new System.Drawing.Size(190, 198); + this.mnuContextTreeView.Opening += new System.ComponentModel.CancelEventHandler(this.mnuContextTreeView_Opening); + // + // mnuContextTreeViewAdd + // + this.mnuContextTreeViewAdd.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuContextTreeViewAddNewItem, + this.mnuContextTreeViewAddExistingItem}); + this.mnuContextTreeViewAdd.Name = "mnuContextTreeViewAdd"; + this.mnuContextTreeViewAdd.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewAdd.Text = "A&dd"; + // + // mnuContextTreeViewAddNewItem + // + this.mnuContextTreeViewAddNewItem.Name = "mnuContextTreeViewAddNewItem"; + this.mnuContextTreeViewAddNewItem.Size = new System.Drawing.Size(148, 22); + this.mnuContextTreeViewAddNewItem.Text = "Ne&w Item..."; + // + // mnuContextTreeViewAddExistingItem + // + this.mnuContextTreeViewAddExistingItem.Name = "mnuContextTreeViewAddExistingItem"; + this.mnuContextTreeViewAddExistingItem.Size = new System.Drawing.Size(148, 22); + this.mnuContextTreeViewAddExistingItem.Text = "Existin&g Item..."; + // + // mnuContextTreeViewSep1 + // + this.mnuContextTreeViewSep1.Name = "mnuContextTreeViewSep1"; + this.mnuContextTreeViewSep1.Size = new System.Drawing.Size(186, 6); + // + // mnuContextTreeViewExclude + // + this.mnuContextTreeViewExclude.Name = "mnuContextTreeViewExclude"; + this.mnuContextTreeViewExclude.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewExclude.Text = "Exclude From Pro&ject"; + // + // mnuContextTreeViewSep2 + // + this.mnuContextTreeViewSep2.Name = "mnuContextTreeViewSep2"; + this.mnuContextTreeViewSep2.Size = new System.Drawing.Size(186, 6); + // + // mnuContextTreeViewCut + // + this.mnuContextTreeViewCut.Name = "mnuContextTreeViewCut"; + this.mnuContextTreeViewCut.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewCut.Text = "Cu&t"; + // + // mnuContextTreeViewCopy + // + this.mnuContextTreeViewCopy.Name = "mnuContextTreeViewCopy"; + this.mnuContextTreeViewCopy.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewCopy.Text = "&Copy"; + // + // mnuContextTreeViewPaste + // + this.mnuContextTreeViewPaste.Name = "mnuContextTreeViewPaste"; + this.mnuContextTreeViewPaste.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewPaste.Text = "&Paste"; + // + // mnuContextTreeViewDelete + // + this.mnuContextTreeViewDelete.Name = "mnuContextTreeViewDelete"; + this.mnuContextTreeViewDelete.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewDelete.Text = "&Delete"; + // + // mnuContextTreeViewRename + // + this.mnuContextTreeViewRename.Name = "mnuContextTreeViewRename"; + this.mnuContextTreeViewRename.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewRename.Text = "Rena&me"; + // + // mnuContextTreeViewSep3 + // + this.mnuContextTreeViewSep3.Name = "mnuContextTreeViewSep3"; + this.mnuContextTreeViewSep3.Size = new System.Drawing.Size(186, 6); + // + // mnuContextTreeViewProperties + // + this.mnuContextTreeViewProperties.Name = "mnuContextTreeViewProperties"; + this.mnuContextTreeViewProperties.ShortcutKeyDisplayString = "Alt+Enter"; + this.mnuContextTreeViewProperties.Size = new System.Drawing.Size(189, 22); + this.mnuContextTreeViewProperties.Text = "P&roperties..."; + // + // lv + // + this.lv.Dock = System.Windows.Forms.DockStyle.Fill; + this.lv.FullRowSelect = true; + this.lv.GridLines = true; + this.lv.HideSelection = false; + this.lv.LargeImageList = this.imlLargeIcons; + this.lv.Location = new System.Drawing.Point(0, 0); + this.lv.Name = "lv"; + this.lv.Size = new System.Drawing.Size(407, 306); + this.lv.SmallImageList = this.imlSmallIcons; + this.lv.TabIndex = 0; + this.lv.UseCompatibleStateImageBehavior = false; + // + // imlSmallIcons + // + this.imlSmallIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlSmallIcons.ImageSize = new System.Drawing.Size(16, 16); + this.imlSmallIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // imlLargeIcons + // + this.imlLargeIcons.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imlLargeIcons.ImageSize = new System.Drawing.Size(32, 32); + this.imlLargeIcons.TransparentColor = System.Drawing.Color.Transparent; + // + // StoryEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "StoryEditor"; + this.Size = new System.Drawing.Size(616, 306); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.mnuContextTreeView.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.ListView lv; + private System.Windows.Forms.ImageList imlSmallIcons; + private System.Windows.Forms.ImageList imlLargeIcons; + private AwesomeControls.CommandBars.CBContextMenu mnuContextTreeView; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAdd; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddNewItem; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewAddExistingItem; + private System.Windows.Forms.ToolStripSeparator mnuContextTreeViewSep1; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewProperties; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewCut; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewCopy; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewPaste; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewDelete; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewRename; + private System.Windows.Forms.ToolStripSeparator mnuContextTreeViewSep3; + private System.Windows.Forms.ToolStripMenuItem mnuContextTreeViewExclude; + private System.Windows.Forms.ToolStripSeparator mnuContextTreeViewSep2; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.cs new file mode 100644 index 00000000..3c0aaedc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.StoryWriter.Story; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors +{ + public partial class StoryEditor : Editor + { + public StoryEditor() + { + InitializeComponent(); + IconMethods.PopulateSystemIcons(ref imlSmallIcons); + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.Title = "Story"; + _er.SupportedObjectModels.Add(typeof(StoryObjectModel)); + } + return _er; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + StoryObjectModel story = (base.ObjectModel as StoryObjectModel); + + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + + #region Universe + { + TreeNode tnUniverse = tv.Nodes.Add("tnUniverse", "Universe", "generic-folder-closed"); + + TreeNode tnCharacters = tnUniverse.Nodes.Add("tnCharacters", "Characters", "generic-folder-closed"); + foreach (Character chara in story.Characters) + { + TreeNode tn = new TreeNode(); + tn.Text = chara.Name.ToString(); + tn.ImageKey = "character"; + tnCharacters.Nodes.Add(tn); + } + + tnUniverse.Nodes.Add("tnDevices", "Devices", "generic-folder-closed"); + tnUniverse.Nodes.Add("tnLocations", "Locations", "generic-folder-closed"); + tnUniverse.Nodes.Add("tnOrganizations", "Organizations", "generic-folder-closed"); + tnUniverse.Nodes.Add("tnVehicles", "Vehicles", "generic-folder-closed"); + } + #endregion + #region Books + { + tv.Nodes.Add("tnBooks", "Books", "generic-folder-closed"); + } + #endregion + + tv.ExpandAll(); + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + + } + + private void mnuContextTreeView_Opening(object sender, CancelEventArgs e) + { + if (tv.SelectedNode.Tag is Chapter) + { + + } + } + + private void tv_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) + { + TreeNode tn = tv.HitTest(e.Location).Node; + if (tn != null) tv.SelectedNode = tn; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.resx new file mode 100644 index 00000000..42816932 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Editors/StoryEditor.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 256, 8 + + + 15, 8 + + + 135, 8 + + + 38 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/IconMethods.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/IconMethods.cs new file mode 100644 index 00000000..563d35da --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/IconMethods.cs @@ -0,0 +1,250 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.IO; + +internal static class IconMethods +{ + public enum IconSize + { + Large, + Small + } + private static class Internal + { + #region Old ExtractAssociatedIcon + public static HandleRef NullHandleRef = default(HandleRef); + [DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon", CharSet = CharSet.Auto)] + public static extern IntPtr IntExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index); + public static IntPtr ExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index) + { + return IntExtractAssociatedIcon(hInst, iconPath, ref index); + } + #endregion + #region New ExtractIconEx + [DllImport("shell32.dll", EntryPoint = "ExtractIconEx")] + public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, IntPtr[] phiconLarge, IntPtr[] phiconSmall, uint nIcons); + + #endregion + } + + #region Old ExtractAssociatedIcon + private static Icon __ExtractAssociatedIcon(string filePath, int index) + { + Uri uri = null; + if ((filePath == null)) + { + throw new ArgumentException("Argument cannot be null.", "filePath"); + } + try + { + uri = new Uri(filePath); + } + catch (UriFormatException) + { + filePath = Path.GetFullPath(filePath); + uri = new Uri(filePath); + } + //If uri.IsUnc Then + // Throw New ArgumentException("File path cannot be a UNC path.", "filePath") + //End If + if (uri.IsFile | uri.IsUnc) + { + if (!File.Exists(filePath)) + { + throw new FileNotFoundException(filePath); + } + System.Text.StringBuilder iconPath = new System.Text.StringBuilder(260); + iconPath.Append(filePath); + IntPtr handle = Internal.ExtractAssociatedIcon(Internal.NullHandleRef, iconPath, ref index); + if ((handle != IntPtr.Zero)) + { + return Icon.FromHandle(handle); + } + } + return null; + } + #endregion + #region New ExtractIconEx + private static Icon __EIEExtractAssociatedIcon(string filePath, int index, IconSize size) + { + IntPtr[] phiconLarge = new IntPtr[] { IntPtr.Zero }; + IntPtr[] phiconSmall = new IntPtr[] { IntPtr.Zero }; + + Internal.ExtractIconEx(filePath, index, phiconLarge, phiconSmall, 1); + + switch (size) + { + case IconSize.Large: + try + { + return Icon.FromHandle(phiconLarge[0]); + } + catch (ArgumentException) + { + return null; + } + case IconSize.Small: + try + { + return Icon.FromHandle(phiconSmall[0]); + } + catch (ArgumentException) + { + return null; + } + } + return null; + } + #endregion + + public static Icon ExtractFileTypeIcon(string filePath) + { + string ext = System.IO.Path.GetExtension(filePath); + + string iconPath = String.Empty; + int iconIndex = 0; + + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + { + break; + } + case PlatformID.Unix: + { + break; + } + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + // TODO: Implement something that uses along the lines of MIME info + // specification + + /* + http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html + + + + + MS Word Files + + + + */ + + Microsoft.Win32.RegistryKey rkExt = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); + + string className = rkExt.GetValue(String.Empty, String.Empty).ToString(); + Microsoft.Win32.RegistryKey rkClass = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(className); + if (rkClass != null) + { + Microsoft.Win32.RegistryKey rkDefaultIcon = rkClass.OpenSubKey("DefaultIcon"); + if (rkDefaultIcon != null) + { + string defaultIconPath = rkDefaultIcon.GetValue(String.Empty, String.Empty).ToString(); + int splitIndex = defaultIconPath.LastIndexOf(','); + + string defaultIconFileName = defaultIconPath.Substring(0, splitIndex); + string defaultIconIndex = defaultIconPath.Substring(splitIndex + 1); + + Int32.TryParse(defaultIconIndex, out iconIndex); + if (defaultIconFileName.StartsWith("\"")) + { + defaultIconFileName = defaultIconFileName.Substring(1); + } + if (defaultIconFileName.EndsWith("\"")) + { + defaultIconFileName = defaultIconFileName.Substring(0, defaultIconFileName.Length - 1); + } + + iconPath = defaultIconFileName; + } + } + break; + } + } + + + Icon icon = ExtractAssociatedIcon(iconPath, iconIndex); + return icon; + } + + public static Icon ExtractAssociatedIcon(string filePath, int index = 0) + { + return ExtractAssociatedIcon(filePath, index, IconSize.Large); + } + public static Icon ExtractAssociatedIcon(string filePath, int index, IconSize size) + { + Icon icon = null; + switch (System.Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + // TODO: Mac OS X support? + break; + case PlatformID.Unix: + break; + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + icon = __EIEExtractAssociatedIcon(filePath, index, size); + break; + case PlatformID.Xbox: + break; + } + return icon; + } + + + public static void PopulateSystemIcons(ref System.Windows.Forms.ImageList iml) + { + switch (Environment.OSVersion.Platform) + { + case PlatformID.MacOSX: + break; + case PlatformID.Unix: + break; + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + if (iml.ImageSize.Width == 16 && iml.ImageSize.Height == 16) + { + Icon iconFile = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, IconSize.Small); + iml.Images.Add("generic-file", iconFile); + Icon iconDocument = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, IconSize.Small); + iml.Images.Add("generic-document", iconDocument); + Icon iconApplication = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, IconSize.Small); + iml.Images.Add("generic-application", iconApplication); + Icon iconFolderClosed = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, IconSize.Small); + iml.Images.Add("generic-folder-closed", iconFolderClosed); + Icon iconFolderOpen = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, IconSize.Small); + iml.Images.Add("generic-folder-open", iconFolderOpen); + } + else + { + Icon iconFile = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 0, IconSize.Large); + iml.Images.Add("generic-file", iconFile); + Icon iconDocument = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 1, IconSize.Large); + iml.Images.Add("generic-document", iconDocument); + Icon iconApplication = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 2, IconSize.Large); + iml.Images.Add("generic-application", iconApplication); + Icon iconFolderClosed = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 3, IconSize.Large); + iml.Images.Add("generic-folder-closed", iconFolderClosed); + Icon iconFolderOpen = ExtractAssociatedIcon(Environment.GetFolderPath(Environment.SpecialFolder.System) + System.IO.Path.DirectorySeparatorChar + "shell32.dll", 4, IconSize.Large); + iml.Images.Add("generic-folder-open", iconFolderOpen); + } + return; + } + } + // throw new PlatformNotSupportedException(); + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c2679972 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("StoryWriter plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("bfff9c74-41b4-4698-ab71-8c0f7c200a21")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..ec74c159 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms/UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms.csproj @@ -0,0 +1,90 @@ + + + + + Debug + AnyCPU + {F635B40D-4BC1-48CB-9FFD-38076D569640} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.StoryWriter.UserInterface.WindowsForms + v3.5 + 512 + + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Debug\Plugins\ + TRACE + prompt + 4 + + + + + + + + + ..\..\..\..\..\..\AwesomeControls\bin\Debug\AwesomeControls.dll + + + + + UserControl + + + StoryEditor.cs + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {7C861D40-8214-4DC5-89D1-129F267C1D1B} + UniversalEditor.Plugins.StoryWriter + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + + + StoryEditor.cs + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.Designer.cs new file mode 100644 index 00000000..03216770 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.Designer.cs @@ -0,0 +1,356 @@ +namespace UniversalEditor.Dialogs.UnrealEngine +{ + partial class ExportTableEntryPropertiesDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblObjectName = new System.Windows.Forms.Label(); + this.txtObjectName = new System.Windows.Forms.TextBox(); + this.lblParentObjectName = new System.Windows.Forms.Label(); + this.cboParentObjectName = new System.Windows.Forms.ComboBox(); + this.lblClassName = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.fraFlags = new System.Windows.Forms.GroupBox(); + this.cmdBrowse = new System.Windows.Forms.Button(); + this.lblSourceData = new System.Windows.Forms.Label(); + this.txtSourceData = new System.Windows.Forms.TextBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.cmdOK = new System.Windows.Forms.Button(); + this.chkTransactional = new System.Windows.Forms.CheckBox(); + this.chkUnreachable = new System.Windows.Forms.CheckBox(); + this.chkPublic = new System.Windows.Forms.CheckBox(); + this.chkImporting = new System.Windows.Forms.CheckBox(); + this.chkExporting = new System.Windows.Forms.CheckBox(); + this.chkSourceModified = new System.Windows.Forms.CheckBox(); + this.chkGarbageCollect = new System.Windows.Forms.CheckBox(); + this.chkRequireLoad = new System.Windows.Forms.CheckBox(); + this.chkHighlightName = new System.Windows.Forms.CheckBox(); + this.chkRemappedName = new System.Windows.Forms.CheckBox(); + this.chkSuppressed = new System.Windows.Forms.CheckBox(); + this.fraFlags.SuspendLayout(); + this.SuspendLayout(); + // + // lblObjectName + // + this.lblObjectName.AutoSize = true; + this.lblObjectName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblObjectName.Location = new System.Drawing.Point(12, 15); + this.lblObjectName.Name = "lblObjectName"; + this.lblObjectName.Size = new System.Drawing.Size(70, 13); + this.lblObjectName.TabIndex = 0; + this.lblObjectName.Text = "Object &name:"; + // + // txtObjectName + // + this.txtObjectName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtObjectName.Location = new System.Drawing.Point(120, 12); + this.txtObjectName.Name = "txtObjectName"; + this.txtObjectName.Size = new System.Drawing.Size(260, 20); + this.txtObjectName.TabIndex = 1; + // + // lblParentObjectName + // + this.lblParentObjectName.AutoSize = true; + this.lblParentObjectName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblParentObjectName.Location = new System.Drawing.Point(12, 41); + this.lblParentObjectName.Name = "lblParentObjectName"; + this.lblParentObjectName.Size = new System.Drawing.Size(102, 13); + this.lblParentObjectName.TabIndex = 2; + this.lblParentObjectName.Text = "&Parent object name:"; + // + // cboParentObjectName + // + this.cboParentObjectName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboParentObjectName.FormattingEnabled = true; + this.cboParentObjectName.Location = new System.Drawing.Point(120, 38); + this.cboParentObjectName.Name = "cboParentObjectName"; + this.cboParentObjectName.Size = new System.Drawing.Size(260, 21); + this.cboParentObjectName.TabIndex = 3; + // + // lblClassName + // + this.lblClassName.AutoSize = true; + this.lblClassName.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblClassName.Location = new System.Drawing.Point(12, 68); + this.lblClassName.Name = "lblClassName"; + this.lblClassName.Size = new System.Drawing.Size(64, 13); + this.lblClassName.TabIndex = 4; + this.lblClassName.Text = "&Class name:"; + // + // comboBox1 + // + this.comboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(120, 65); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(260, 21); + this.comboBox1.TabIndex = 5; + // + // fraFlags + // + this.fraFlags.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraFlags.Controls.Add(this.chkSuppressed); + this.fraFlags.Controls.Add(this.chkRemappedName); + this.fraFlags.Controls.Add(this.chkHighlightName); + this.fraFlags.Controls.Add(this.chkRequireLoad); + this.fraFlags.Controls.Add(this.chkExporting); + this.fraFlags.Controls.Add(this.chkImporting); + this.fraFlags.Controls.Add(this.chkGarbageCollect); + this.fraFlags.Controls.Add(this.chkSourceModified); + this.fraFlags.Controls.Add(this.chkPublic); + this.fraFlags.Controls.Add(this.chkUnreachable); + this.fraFlags.Controls.Add(this.chkTransactional); + this.fraFlags.Location = new System.Drawing.Point(12, 121); + this.fraFlags.Name = "fraFlags"; + this.fraFlags.Size = new System.Drawing.Size(368, 188); + this.fraFlags.TabIndex = 9; + this.fraFlags.TabStop = false; + this.fraFlags.Text = "Flags"; + // + // cmdBrowse + // + this.cmdBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowse.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdBrowse.Location = new System.Drawing.Point(305, 92); + this.cmdBrowse.Name = "cmdBrowse"; + this.cmdBrowse.Size = new System.Drawing.Size(75, 23); + this.cmdBrowse.TabIndex = 8; + this.cmdBrowse.Text = "&Browse..."; + this.cmdBrowse.UseVisualStyleBackColor = true; + // + // lblSourceData + // + this.lblSourceData.AutoSize = true; + this.lblSourceData.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblSourceData.Location = new System.Drawing.Point(12, 97); + this.lblSourceData.Name = "lblSourceData"; + this.lblSourceData.Size = new System.Drawing.Size(68, 13); + this.lblSourceData.TabIndex = 6; + this.lblSourceData.Text = "Source data:"; + // + // txtSourceData + // + this.txtSourceData.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSourceData.Location = new System.Drawing.Point(120, 94); + this.txtSourceData.Name = "txtSourceData"; + this.txtSourceData.ReadOnly = true; + this.txtSourceData.Size = new System.Drawing.Size(179, 20); + this.txtSourceData.TabIndex = 7; + this.txtSourceData.Text = "(0 bytes)"; + // + // cmdCancel + // + this.cmdCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(305, 315); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(75, 23); + this.cmdCancel.TabIndex = 11; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + // + // cmdOK + // + this.cmdOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdOK.Location = new System.Drawing.Point(224, 315); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(75, 23); + this.cmdOK.TabIndex = 10; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + // + // chkTransactional + // + this.chkTransactional.AutoSize = true; + this.chkTransactional.Location = new System.Drawing.Point(22, 19); + this.chkTransactional.Name = "chkTransactional"; + this.chkTransactional.Size = new System.Drawing.Size(90, 17); + this.chkTransactional.TabIndex = 0; + this.chkTransactional.Text = "&Transactional"; + this.chkTransactional.UseVisualStyleBackColor = true; + // + // chkUnreachable + // + this.chkUnreachable.AutoSize = true; + this.chkUnreachable.Location = new System.Drawing.Point(22, 42); + this.chkUnreachable.Name = "chkUnreachable"; + this.chkUnreachable.Size = new System.Drawing.Size(87, 17); + this.chkUnreachable.TabIndex = 0; + this.chkUnreachable.Text = "Un&reachable"; + this.chkUnreachable.UseVisualStyleBackColor = true; + // + // chkPublic + // + this.chkPublic.AutoSize = true; + this.chkPublic.Location = new System.Drawing.Point(22, 65); + this.chkPublic.Name = "chkPublic"; + this.chkPublic.Size = new System.Drawing.Size(55, 17); + this.chkPublic.TabIndex = 0; + this.chkPublic.Text = "P&ublic"; + this.chkPublic.UseVisualStyleBackColor = true; + // + // chkImporting + // + this.chkImporting.AutoSize = true; + this.chkImporting.Location = new System.Drawing.Point(142, 19); + this.chkImporting.Name = "chkImporting"; + this.chkImporting.Size = new System.Drawing.Size(69, 17); + this.chkImporting.TabIndex = 0; + this.chkImporting.Text = "&Importing"; + this.chkImporting.UseVisualStyleBackColor = true; + // + // chkExporting + // + this.chkExporting.AutoSize = true; + this.chkExporting.Location = new System.Drawing.Point(142, 42); + this.chkExporting.Name = "chkExporting"; + this.chkExporting.Size = new System.Drawing.Size(70, 17); + this.chkExporting.TabIndex = 0; + this.chkExporting.Text = "&Exporting"; + this.chkExporting.UseVisualStyleBackColor = true; + // + // chkSourceModified + // + this.chkSourceModified.AutoSize = true; + this.chkSourceModified.Location = new System.Drawing.Point(22, 88); + this.chkSourceModified.Name = "chkSourceModified"; + this.chkSourceModified.Size = new System.Drawing.Size(102, 17); + this.chkSourceModified.TabIndex = 0; + this.chkSourceModified.Text = "Source &modified"; + this.chkSourceModified.UseVisualStyleBackColor = true; + // + // chkGarbageCollect + // + this.chkGarbageCollect.AutoSize = true; + this.chkGarbageCollect.Location = new System.Drawing.Point(22, 111); + this.chkGarbageCollect.Name = "chkGarbageCollect"; + this.chkGarbageCollect.Size = new System.Drawing.Size(101, 17); + this.chkGarbageCollect.TabIndex = 0; + this.chkGarbageCollect.Text = "Gar&bage collect"; + this.chkGarbageCollect.UseVisualStyleBackColor = true; + // + // chkRequireLoad + // + this.chkRequireLoad.AutoSize = true; + this.chkRequireLoad.Location = new System.Drawing.Point(142, 65); + this.chkRequireLoad.Name = "chkRequireLoad"; + this.chkRequireLoad.Size = new System.Drawing.Size(86, 17); + this.chkRequireLoad.TabIndex = 0; + this.chkRequireLoad.Text = "Re&quire load"; + this.chkRequireLoad.UseVisualStyleBackColor = true; + // + // chkHighlightName + // + this.chkHighlightName.AutoSize = true; + this.chkHighlightName.Location = new System.Drawing.Point(142, 88); + this.chkHighlightName.Name = "chkHighlightName"; + this.chkHighlightName.Size = new System.Drawing.Size(174, 17); + this.chkHighlightName.TabIndex = 0; + this.chkHighlightName.Text = "&Highlight name/eliminate object"; + this.chkHighlightName.UseVisualStyleBackColor = true; + // + // chkRemappedName + // + this.chkRemappedName.AutoSize = true; + this.chkRemappedName.Location = new System.Drawing.Point(142, 111); + this.chkRemappedName.Name = "chkRemappedName"; + this.chkRemappedName.Size = new System.Drawing.Size(189, 17); + this.chkRemappedName.TabIndex = 0; + this.chkRemappedName.Text = "Remappe&d name/singular function"; + this.chkRemappedName.UseVisualStyleBackColor = true; + // + // chkSuppressed + // + this.chkSuppressed.AutoSize = true; + this.chkSuppressed.Location = new System.Drawing.Point(142, 134); + this.chkSuppressed.Name = "chkSuppressed"; + this.chkSuppressed.Size = new System.Drawing.Size(155, 17); + this.chkSuppressed.TabIndex = 0; + this.chkSuppressed.Text = "&Suppressed/state changed"; + this.chkSuppressed.UseVisualStyleBackColor = true; + // + // ExportTableEntryPropertiesDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(392, 350); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.cmdCancel); + this.Controls.Add(this.lblSourceData); + this.Controls.Add(this.cmdBrowse); + this.Controls.Add(this.fraFlags); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.cboParentObjectName); + this.Controls.Add(this.lblClassName); + this.Controls.Add(this.txtSourceData); + this.Controls.Add(this.txtObjectName); + this.Controls.Add(this.lblParentObjectName); + this.Controls.Add(this.lblObjectName); + this.MinimumSize = new System.Drawing.Size(400, 272); + this.Name = "ExportTableEntryPropertiesDialog"; + this.Text = "Export Table Entry Properties"; + this.fraFlags.ResumeLayout(false); + this.fraFlags.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblObjectName; + private System.Windows.Forms.Label lblParentObjectName; + private System.Windows.Forms.Label lblClassName; + private System.Windows.Forms.GroupBox fraFlags; + private System.Windows.Forms.Button cmdBrowse; + private System.Windows.Forms.Label lblSourceData; + private System.Windows.Forms.Button cmdCancel; + private System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtObjectName; + internal System.Windows.Forms.ComboBox cboParentObjectName; + internal System.Windows.Forms.ComboBox comboBox1; + internal System.Windows.Forms.TextBox txtSourceData; + private System.Windows.Forms.CheckBox chkTransactional; + private System.Windows.Forms.CheckBox chkUnreachable; + private System.Windows.Forms.CheckBox chkPublic; + private System.Windows.Forms.CheckBox chkExporting; + private System.Windows.Forms.CheckBox chkImporting; + private System.Windows.Forms.CheckBox chkSourceModified; + private System.Windows.Forms.CheckBox chkGarbageCollect; + private System.Windows.Forms.CheckBox chkRequireLoad; + private System.Windows.Forms.CheckBox chkHighlightName; + private System.Windows.Forms.CheckBox chkRemappedName; + private System.Windows.Forms.CheckBox chkSuppressed; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.cs new file mode 100644 index 00000000..9c143d73 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace UniversalEditor.Dialogs.UnrealEngine +{ + public partial class ExportTableEntryPropertiesDialog : Form + { + public ExportTableEntryPropertiesDialog() + { + InitializeComponent(); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Dialogs/UnrealEngine/ExportTableEntryPropertiesDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs new file mode 100644 index 00000000..15b22fba --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs @@ -0,0 +1,559 @@ +namespace UniversalEditor.Editors.UnrealEngine +{ + partial class UnrealPackageEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tv = new System.Windows.Forms.TreeView(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.pnlExportTable = new System.Windows.Forms.Panel(); + this.cmdExportTableEntryClear = new System.Windows.Forms.Button(); + this.cmdExportTableEntryRemove = new System.Windows.Forms.Button(); + this.cmdExportTableEntryModify = new System.Windows.Forms.Button(); + this.cmdExportTableEntryAdd = new System.Windows.Forms.Button(); + this.lvExportTable = new System.Windows.Forms.ListView(); + this.chExportObjectName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectParent = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectClass = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectFlags = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectOffset = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.mnuContextExportTable = new AwesomeControls.CommandBars.CBContextMenu(this.components); + this.mnuExportTableCopyTo = new System.Windows.Forms.ToolStripMenuItem(); + this.pnlHeritageTable = new System.Windows.Forms.Panel(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.lvHeritageTable = new System.Windows.Forms.ListView(); + this.chHeritageGUID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlImportTable = new System.Windows.Forms.Panel(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.lvImportTable = new System.Windows.Forms.ListView(); + this.chImportPackageName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chImportObjectName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chImportClassName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlNameTable = new System.Windows.Forms.Panel(); + this.cmdNameClear = new System.Windows.Forms.Button(); + this.cmdNameRemove = new System.Windows.Forms.Button(); + this.cmdNameModify = new System.Windows.Forms.Button(); + this.cmdNameAdd = new System.Windows.Forms.Button(); + this.lvNameTable = new System.Windows.Forms.ListView(); + this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chFlags = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlExportTable.SuspendLayout(); + this.mnuContextExportTable.SuspendLayout(); + this.pnlHeritageTable.SuspendLayout(); + this.pnlImportTable.SuspendLayout(); + this.pnlNameTable.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(170, 267); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlExportTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlHeritageTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlImportTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlNameTable); + this.splitContainer1.Size = new System.Drawing.Size(558, 267); + this.splitContainer1.SplitterDistance = 170; + this.splitContainer1.TabIndex = 1; + // + // pnlExportTable + // + this.pnlExportTable.Controls.Add(this.cmdExportTableEntryClear); + this.pnlExportTable.Controls.Add(this.cmdExportTableEntryRemove); + this.pnlExportTable.Controls.Add(this.cmdExportTableEntryModify); + this.pnlExportTable.Controls.Add(this.cmdExportTableEntryAdd); + this.pnlExportTable.Controls.Add(this.lvExportTable); + this.pnlExportTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlExportTable.Enabled = false; + this.pnlExportTable.Location = new System.Drawing.Point(0, 0); + this.pnlExportTable.Name = "pnlExportTable"; + this.pnlExportTable.Size = new System.Drawing.Size(384, 267); + this.pnlExportTable.TabIndex = 2; + this.pnlExportTable.Visible = false; + // + // cmdExportTableEntryClear + // + this.cmdExportTableEntryClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdExportTableEntryClear.Enabled = false; + this.cmdExportTableEntryClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExportTableEntryClear.Location = new System.Drawing.Point(306, 3); + this.cmdExportTableEntryClear.Name = "cmdExportTableEntryClear"; + this.cmdExportTableEntryClear.Size = new System.Drawing.Size(75, 23); + this.cmdExportTableEntryClear.TabIndex = 1; + this.cmdExportTableEntryClear.Text = "&Clear"; + this.cmdExportTableEntryClear.UseVisualStyleBackColor = true; + this.cmdExportTableEntryClear.Click += new System.EventHandler(this.cmdExportTableEntryClear_Click); + // + // cmdExportTableEntryRemove + // + this.cmdExportTableEntryRemove.Enabled = false; + this.cmdExportTableEntryRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExportTableEntryRemove.Location = new System.Drawing.Point(165, 3); + this.cmdExportTableEntryRemove.Name = "cmdExportTableEntryRemove"; + this.cmdExportTableEntryRemove.Size = new System.Drawing.Size(75, 23); + this.cmdExportTableEntryRemove.TabIndex = 1; + this.cmdExportTableEntryRemove.Text = "&Remove..."; + this.cmdExportTableEntryRemove.UseVisualStyleBackColor = true; + this.cmdExportTableEntryRemove.Click += new System.EventHandler(this.cmdExportTableEntryRemove_Click); + // + // cmdExportTableEntryModify + // + this.cmdExportTableEntryModify.Enabled = false; + this.cmdExportTableEntryModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExportTableEntryModify.Location = new System.Drawing.Point(84, 3); + this.cmdExportTableEntryModify.Name = "cmdExportTableEntryModify"; + this.cmdExportTableEntryModify.Size = new System.Drawing.Size(75, 23); + this.cmdExportTableEntryModify.TabIndex = 1; + this.cmdExportTableEntryModify.Text = "&Modify..."; + this.cmdExportTableEntryModify.UseVisualStyleBackColor = true; + this.cmdExportTableEntryModify.Click += new System.EventHandler(this.cmdExportTableEntryModify_Click); + // + // cmdExportTableEntryAdd + // + this.cmdExportTableEntryAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdExportTableEntryAdd.Location = new System.Drawing.Point(3, 3); + this.cmdExportTableEntryAdd.Name = "cmdExportTableEntryAdd"; + this.cmdExportTableEntryAdd.Size = new System.Drawing.Size(75, 23); + this.cmdExportTableEntryAdd.TabIndex = 1; + this.cmdExportTableEntryAdd.Text = "&Add..."; + this.cmdExportTableEntryAdd.UseVisualStyleBackColor = true; + this.cmdExportTableEntryAdd.Click += new System.EventHandler(this.cmdExportTableEntryAdd_Click); + // + // lvExportTable + // + this.lvExportTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvExportTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chExportObjectName, + this.chExportObjectParent, + this.chExportObjectClass, + this.chExportObjectFlags, + this.chExportObjectOffset, + this.chExportObjectSize}); + this.lvExportTable.ContextMenuStrip = this.mnuContextExportTable; + this.lvExportTable.FullRowSelect = true; + this.lvExportTable.GridLines = true; + this.lvExportTable.HideSelection = false; + this.lvExportTable.Location = new System.Drawing.Point(3, 32); + this.lvExportTable.Name = "lvExportTable"; + this.lvExportTable.Size = new System.Drawing.Size(378, 232); + this.lvExportTable.TabIndex = 0; + this.lvExportTable.UseCompatibleStateImageBehavior = false; + this.lvExportTable.View = System.Windows.Forms.View.Details; + this.lvExportTable.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.lvExportTable_ItemDrag); + this.lvExportTable.SelectedIndexChanged += new System.EventHandler(this.lvExportTable_SelectedIndexChanged); + // + // chExportObjectName + // + this.chExportObjectName.Text = "Object"; + this.chExportObjectName.Width = 84; + // + // chExportObjectParent + // + this.chExportObjectParent.Text = "Parent"; + this.chExportObjectParent.Width = 53; + // + // chExportObjectClass + // + this.chExportObjectClass.Text = "Class"; + this.chExportObjectClass.Width = 81; + // + // chExportObjectFlags + // + this.chExportObjectFlags.Text = "Flags"; + this.chExportObjectFlags.Width = 49; + // + // chExportObjectOffset + // + this.chExportObjectOffset.Text = "Offset"; + this.chExportObjectOffset.Width = 45; + // + // chExportObjectSize + // + this.chExportObjectSize.Text = "Size"; + // + // mnuContextExportTable + // + this.mnuContextExportTable.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuExportTableCopyTo}); + this.mnuContextExportTable.Name = "mnuContextExportTable"; + this.mnuContextExportTable.Size = new System.Drawing.Size(127, 26); + // + // mnuExportTableCopyTo + // + this.mnuExportTableCopyTo.Name = "mnuExportTableCopyTo"; + this.mnuExportTableCopyTo.Size = new System.Drawing.Size(126, 22); + this.mnuExportTableCopyTo.Text = "&Copy To..."; + this.mnuExportTableCopyTo.Click += new System.EventHandler(this.mnuExportTableCopyTo_Click); + // + // pnlHeritageTable + // + this.pnlHeritageTable.Controls.Add(this.button9); + this.pnlHeritageTable.Controls.Add(this.button10); + this.pnlHeritageTable.Controls.Add(this.button11); + this.pnlHeritageTable.Controls.Add(this.button12); + this.pnlHeritageTable.Controls.Add(this.lvHeritageTable); + this.pnlHeritageTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlHeritageTable.Enabled = false; + this.pnlHeritageTable.Location = new System.Drawing.Point(0, 0); + this.pnlHeritageTable.Name = "pnlHeritageTable"; + this.pnlHeritageTable.Size = new System.Drawing.Size(384, 267); + this.pnlHeritageTable.TabIndex = 3; + this.pnlHeritageTable.Visible = false; + // + // button9 + // + this.button9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button9.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button9.Location = new System.Drawing.Point(306, 3); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(75, 23); + this.button9.TabIndex = 1; + this.button9.Text = "&Clear"; + this.button9.UseVisualStyleBackColor = true; + // + // button10 + // + this.button10.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button10.Location = new System.Drawing.Point(165, 3); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(75, 23); + this.button10.TabIndex = 1; + this.button10.Text = "&Remove..."; + this.button10.UseVisualStyleBackColor = true; + // + // button11 + // + this.button11.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button11.Location = new System.Drawing.Point(84, 3); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(75, 23); + this.button11.TabIndex = 1; + this.button11.Text = "&Modify..."; + this.button11.UseVisualStyleBackColor = true; + // + // button12 + // + this.button12.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button12.Location = new System.Drawing.Point(3, 3); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(75, 23); + this.button12.TabIndex = 1; + this.button12.Text = "&Add..."; + this.button12.UseVisualStyleBackColor = true; + // + // lvHeritageTable + // + this.lvHeritageTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvHeritageTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chHeritageGUID}); + this.lvHeritageTable.FullRowSelect = true; + this.lvHeritageTable.GridLines = true; + this.lvHeritageTable.HideSelection = false; + this.lvHeritageTable.Location = new System.Drawing.Point(3, 32); + this.lvHeritageTable.Name = "lvHeritageTable"; + this.lvHeritageTable.Size = new System.Drawing.Size(378, 232); + this.lvHeritageTable.TabIndex = 0; + this.lvHeritageTable.UseCompatibleStateImageBehavior = false; + this.lvHeritageTable.View = System.Windows.Forms.View.Details; + // + // chHeritageGUID + // + this.chHeritageGUID.Text = "GUID"; + this.chHeritageGUID.Width = 354; + // + // pnlImportTable + // + this.pnlImportTable.Controls.Add(this.button1); + this.pnlImportTable.Controls.Add(this.button2); + this.pnlImportTable.Controls.Add(this.button3); + this.pnlImportTable.Controls.Add(this.button4); + this.pnlImportTable.Controls.Add(this.lvImportTable); + this.pnlImportTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlImportTable.Enabled = false; + this.pnlImportTable.Location = new System.Drawing.Point(0, 0); + this.pnlImportTable.Name = "pnlImportTable"; + this.pnlImportTable.Size = new System.Drawing.Size(384, 267); + this.pnlImportTable.TabIndex = 1; + this.pnlImportTable.Visible = false; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(306, 3); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "&Clear"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button2.Location = new System.Drawing.Point(165, 3); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 1; + this.button2.Text = "&Remove..."; + this.button2.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button3.Location = new System.Drawing.Point(84, 3); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 1; + this.button3.Text = "&Modify..."; + this.button3.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button4.Location = new System.Drawing.Point(3, 3); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.TabIndex = 1; + this.button4.Text = "&Add..."; + this.button4.UseVisualStyleBackColor = true; + // + // lvImportTable + // + this.lvImportTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvImportTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chImportPackageName, + this.chImportObjectName, + this.chImportClassName}); + this.lvImportTable.FullRowSelect = true; + this.lvImportTable.GridLines = true; + this.lvImportTable.HideSelection = false; + this.lvImportTable.Location = new System.Drawing.Point(3, 32); + this.lvImportTable.Name = "lvImportTable"; + this.lvImportTable.Size = new System.Drawing.Size(378, 232); + this.lvImportTable.TabIndex = 0; + this.lvImportTable.UseCompatibleStateImageBehavior = false; + this.lvImportTable.View = System.Windows.Forms.View.Details; + // + // chImportPackageName + // + this.chImportPackageName.Text = "Package"; + this.chImportPackageName.Width = 97; + // + // chImportObjectName + // + this.chImportObjectName.Text = "Object"; + this.chImportObjectName.Width = 134; + // + // chImportClassName + // + this.chImportClassName.Text = "Class"; + this.chImportClassName.Width = 140; + // + // pnlNameTable + // + this.pnlNameTable.Controls.Add(this.cmdNameClear); + this.pnlNameTable.Controls.Add(this.cmdNameRemove); + this.pnlNameTable.Controls.Add(this.cmdNameModify); + this.pnlNameTable.Controls.Add(this.cmdNameAdd); + this.pnlNameTable.Controls.Add(this.lvNameTable); + this.pnlNameTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlNameTable.Enabled = false; + this.pnlNameTable.Location = new System.Drawing.Point(0, 0); + this.pnlNameTable.Name = "pnlNameTable"; + this.pnlNameTable.Size = new System.Drawing.Size(384, 267); + this.pnlNameTable.TabIndex = 0; + this.pnlNameTable.Visible = false; + // + // cmdNameClear + // + this.cmdNameClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdNameClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameClear.Location = new System.Drawing.Point(306, 3); + this.cmdNameClear.Name = "cmdNameClear"; + this.cmdNameClear.Size = new System.Drawing.Size(75, 23); + this.cmdNameClear.TabIndex = 1; + this.cmdNameClear.Text = "&Clear"; + this.cmdNameClear.UseVisualStyleBackColor = true; + // + // cmdNameRemove + // + this.cmdNameRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameRemove.Location = new System.Drawing.Point(165, 3); + this.cmdNameRemove.Name = "cmdNameRemove"; + this.cmdNameRemove.Size = new System.Drawing.Size(75, 23); + this.cmdNameRemove.TabIndex = 1; + this.cmdNameRemove.Text = "&Remove..."; + this.cmdNameRemove.UseVisualStyleBackColor = true; + // + // cmdNameModify + // + this.cmdNameModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameModify.Location = new System.Drawing.Point(84, 3); + this.cmdNameModify.Name = "cmdNameModify"; + this.cmdNameModify.Size = new System.Drawing.Size(75, 23); + this.cmdNameModify.TabIndex = 1; + this.cmdNameModify.Text = "&Modify..."; + this.cmdNameModify.UseVisualStyleBackColor = true; + // + // cmdNameAdd + // + this.cmdNameAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameAdd.Location = new System.Drawing.Point(3, 3); + this.cmdNameAdd.Name = "cmdNameAdd"; + this.cmdNameAdd.Size = new System.Drawing.Size(75, 23); + this.cmdNameAdd.TabIndex = 1; + this.cmdNameAdd.Text = "&Add..."; + this.cmdNameAdd.UseVisualStyleBackColor = true; + // + // lvNameTable + // + this.lvNameTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvNameTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chName, + this.chFlags}); + this.lvNameTable.FullRowSelect = true; + this.lvNameTable.GridLines = true; + this.lvNameTable.HideSelection = false; + this.lvNameTable.Location = new System.Drawing.Point(3, 32); + this.lvNameTable.Name = "lvNameTable"; + this.lvNameTable.Size = new System.Drawing.Size(378, 232); + this.lvNameTable.TabIndex = 0; + this.lvNameTable.UseCompatibleStateImageBehavior = false; + this.lvNameTable.View = System.Windows.Forms.View.Details; + // + // chName + // + this.chName.Text = "Name"; + this.chName.Width = 231; + // + // chFlags + // + this.chFlags.Text = "Flags"; + this.chFlags.Width = 134; + // + // UnrealPackageEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "UnrealPackageEditor"; + this.Size = new System.Drawing.Size(558, 267); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlExportTable.ResumeLayout(false); + this.mnuContextExportTable.ResumeLayout(false); + this.pnlHeritageTable.ResumeLayout(false); + this.pnlImportTable.ResumeLayout(false); + this.pnlNameTable.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Panel pnlNameTable; + private System.Windows.Forms.ListView lvNameTable; + private System.Windows.Forms.ColumnHeader chName; + private System.Windows.Forms.ColumnHeader chFlags; + private System.Windows.Forms.Button cmdNameClear; + private System.Windows.Forms.Button cmdNameRemove; + private System.Windows.Forms.Button cmdNameModify; + private System.Windows.Forms.Button cmdNameAdd; + private System.Windows.Forms.Panel pnlImportTable; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.ListView lvImportTable; + private System.Windows.Forms.ColumnHeader chImportPackageName; + private System.Windows.Forms.ColumnHeader chImportObjectName; + private System.Windows.Forms.ColumnHeader chImportClassName; + private System.Windows.Forms.Panel pnlExportTable; + private System.Windows.Forms.Button cmdExportTableEntryClear; + private System.Windows.Forms.Button cmdExportTableEntryRemove; + private System.Windows.Forms.Button cmdExportTableEntryModify; + private System.Windows.Forms.Button cmdExportTableEntryAdd; + private System.Windows.Forms.ListView lvExportTable; + private System.Windows.Forms.ColumnHeader chExportObjectParent; + private System.Windows.Forms.ColumnHeader chExportObjectClass; + private System.Windows.Forms.ColumnHeader chExportObjectName; + private System.Windows.Forms.ColumnHeader chExportObjectFlags; + private System.Windows.Forms.ColumnHeader chExportObjectOffset; + private System.Windows.Forms.ColumnHeader chExportObjectSize; + private System.Windows.Forms.Panel pnlHeritageTable; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button12; + private System.Windows.Forms.ListView lvHeritageTable; + private System.Windows.Forms.ColumnHeader chHeritageGUID; + private AwesomeControls.CommandBars.CBContextMenu mnuContextExportTable; + private System.Windows.Forms.ToolStripMenuItem mnuExportTableCopyTo; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs new file mode 100644 index 00000000..0145ea6f --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs @@ -0,0 +1,325 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.Dialogs.UnrealEngine; +using UniversalEditor.ObjectModels.UnrealEngine; +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.UnrealEngine +{ + public partial class UnrealPackageEditor : Editor + { + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(UnrealPackageObjectModel)); + } + return _er; + } + + public UnrealPackageEditor() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + + UnrealPackageObjectModel upk = (ObjectModel as UnrealPackageObjectModel); + if (upk == null) return; + + TreeNode tnToplevel = new TreeNode(); + + if (upk.Accessor is FileAccessor) tnToplevel.Text = System.IO.Path.GetFileName((upk.Accessor as FileAccessor).FileName); + if (String.IsNullOrEmpty(tnToplevel.Text)) tnToplevel.Text = ""; + + #region Name Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeNameTable"; + tn.Text = "Name Table"; + tnToplevel.Nodes.Add(tn); + + foreach (NameTableEntry entry in upk.NameTableEntries) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entry; + lvi.Text = entry.Name; + lvi.SubItems.Add(entry.Flags.ToString()); + lvNameTable.Items.Add(lvi); + } + lvNameTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + #region Export Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeExportTable"; + tn.Text = "Export Table"; + tnToplevel.Nodes.Add(tn); + + foreach (ExportTableEntry entry in upk.ExportTableEntries) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entry; + if (entry.Name == null) + { + lvi.Text = String.Empty; + } + else + { + lvi.Text = entry.Name.ToString(false); + } + if (entry.ObjectParent == null) + { + lvi.SubItems.Add(String.Empty); + } + else + { + lvi.SubItems.Add(entry.ObjectParent.ToString()); + } + if (entry.ObjectClass == null) + { + lvi.SubItems.Add(String.Empty); + } + else + { + lvi.SubItems.Add(entry.ObjectClass.ToString()); + } + lvi.SubItems.Add(entry.Flags.ToString()); + lvi.SubItems.Add(entry.Offset.ToString()); + lvi.SubItems.Add(entry.Size.ToString()); + lvExportTable.Items.Add(lvi); + } + lvExportTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + #region Import Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeImportTable"; + tn.Text = "Import Table"; + tnToplevel.Nodes.Add(tn); + + foreach (ImportTableEntry entry in upk.ImportTableEntries) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entry; + if (entry.PackageName != null) + { + lvi.Text = entry.PackageName.ToString(false); + } + else + { + lvi.Text = "(invalid)"; + } + if (entry.ObjectName != null) + { + lvi.SubItems.Add(entry.ObjectName.ToString(false)); + } + else + { + lvi.SubItems.Add("(invalid)"); + } + if (entry.ClassName != null) + { + lvi.SubItems.Add(entry.ClassName.ToString(false)); + } + else + { + lvi.SubItems.Add("(invalid)"); + } + lvImportTable.Items.Add(lvi); + } + lvImportTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + #region Heritage Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeHeritageTable"; + tn.Text = "Heritage Table"; + tnToplevel.Nodes.Add(tn); + + foreach (Guid guid in upk.PackageGUIDs) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = guid; + lvi.Text = guid.ToString("B"); + lvHeritageTable.Items.Add(lvi); + } + lvHeritageTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + + tv.Nodes.Add(tnToplevel); + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + + if (e.Node.Name.StartsWith("node")) + { + string name = e.Node.Name.Substring(4); + SwitchPanel("pnl" + name); + } + } + + private void SwitchPanel(Panel panel) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (ctl == panel) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + private void SwitchPanel(string panelName) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (ctl is Panel && ctl.Name == panelName) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + + private void tv_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) tv.SelectedNode = tv.HitTest(e.Location).Node; + } + + private void lvExportTable_ItemDrag(object sender, ItemDragEventArgs e) + { + ListViewItem lvi = (e.Item as ListViewItem); + if (lvi == null) return; + + ExportTableEntry ete = (lvi.Tag as ExportTableEntry); + if (ete == null) return; + + string FileName = TemporaryFileManager.CreateTemporaryFile(ete.Name.Name, ete.GetData()); + + DataObject dobj = new DataObject("FileDrop", new string[] { FileName }); + lvExportTable.DoDragDrop(dobj, DragDropEffects.Copy); + } + + private void mnuExportTableCopyTo_Click(object sender, EventArgs e) + { + if (lvExportTable.SelectedItems.Count > 1) + { + AwesomeControls.NativeDialogs.FolderBrowserDialog dlg = new AwesomeControls.NativeDialogs.FolderBrowserDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + foreach (ListViewItem lvi in lvExportTable.SelectedItems) + { + ExportTableEntry ete = (lvi.Tag as ExportTableEntry); + if (ete == null) continue; + + string fileName = dlg.SelectedPath + System.IO.Path.DirectorySeparatorChar.ToString() + ete.Name.Name; + byte[] data = ete.GetData(); + if (data == null) data = new byte[0]; + System.IO.File.WriteAllBytes(fileName, data); + } + } + } + else if (lvExportTable.SelectedItems.Count == 1) + { + foreach (ListViewItem lvi in lvExportTable.SelectedItems) + { + ExportTableEntry ete = (lvi.Tag as ExportTableEntry); + if (ete == null) continue; + + SaveFileDialog sfd = new SaveFileDialog(); + sfd.Title = "Copy '" + ete.Name.Name + "' to..."; + sfd.FileName = ete.Name.Name; + if (sfd.ShowDialog() == DialogResult.OK) + { + byte[] data = ete.GetData(); + if (data == null) data = new byte[0]; + System.IO.File.WriteAllBytes(sfd.FileName, data); + } + } + } + else + { + AwesomeControls.NativeDialogs.FolderBrowserDialog dlg = new AwesomeControls.NativeDialogs.FolderBrowserDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + foreach (ListViewItem lvi in lvExportTable.Items) + { + ExportTableEntry ete = (lvi.Tag as ExportTableEntry); + if (ete == null) continue; + + string fileName = dlg.SelectedPath + System.IO.Path.DirectorySeparatorChar.ToString() + ete.Name.Name; + byte[] data = ete.GetData(); + if (data == null) data = new byte[0]; + System.IO.File.WriteAllBytes(fileName, data); + } + } + } + } + + private void cmdExportTableEntryAdd_Click(object sender, EventArgs e) + { + ExportTableEntryPropertiesDialog dlg = new ExportTableEntryPropertiesDialog(); + if (dlg.ShowDialog() == DialogResult.OK) + { + } + } + + private void cmdExportTableEntryModify_Click(object sender, EventArgs e) + { + if (lvExportTable.SelectedItems.Count == 1) + { + ExportTableEntryPropertiesDialog dlg = new ExportTableEntryPropertiesDialog(); + + if (dlg.ShowDialog() == DialogResult.OK) + { + } + } + } + + private void cmdExportTableEntryRemove_Click(object sender, EventArgs e) + { + + } + + private void cmdExportTableEntryClear_Click(object sender, EventArgs e) + { + + } + + private void lvExportTable_SelectedIndexChanged(object sender, EventArgs e) + { + cmdExportTableEntryModify.Enabled = (lvExportTable.SelectedItems.Count == 1); + cmdExportTableEntryRemove.Enabled = (lvExportTable.SelectedItems.Count > 0); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx new file mode 100644 index 00000000..4577e728 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 11, 7 + + + 44 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..aef284bc --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Unreal Engine plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("66c42923-4b27-4f1e-a5d0-82426f58071c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs new file mode 100644 index 00000000..bd23125c --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs @@ -0,0 +1,63 @@ +using System; + +internal static class TemporaryFileManager +{ + private static Random rand = new Random(); + + private static System.Collections.Specialized.StringCollection mvarTemporaryFileNames = new System.Collections.Specialized.StringCollection(); + private static string mvarTemporaryFilePath = null; + + public static string CreateTemporaryFile(string FileName, byte[] FileData) + { + if (mvarTemporaryFilePath == null) mvarTemporaryFilePath = System.IO.Path.GetTempPath(); + if (!System.IO.Directory.Exists(mvarTemporaryFilePath)) + { + System.IO.Directory.CreateDirectory(mvarTemporaryFilePath); + } + + FileName = System.IO.Path.GetFileName(FileName); + if (FileData == null) FileData = new byte[0]; + + string filePath = mvarTemporaryFilePath + System.IO.Path.DirectorySeparatorChar.ToString() + FileName; + System.IO.File.WriteAllBytes(filePath, FileData); + mvarTemporaryFileNames.Add(filePath); + return filePath; + } + + public static bool RegisterTemporaryDirectory(string prefix, int maxNameLength) + { + if (mvarTemporaryFilePath != null) + { + return false; + } + string name = String.Empty; + do + { + name = prefix + rand.Next(0, (maxNameLength * 10) - 1).ToString().PadLeft(maxNameLength - prefix.Length, '0'); + } + while (System.IO.Directory.Exists(name)); + + string pathName = System.IO.Path.GetTempPath() + System.IO.Path.DirectorySeparatorChar.ToString() + name; + System.IO.Directory.CreateDirectory(pathName); + + mvarTemporaryFilePath = pathName; + return true; + } + public static bool UnregisterTemporaryDirectory() + { + if (mvarTemporaryFilePath == null) return false; + + foreach (string fileName in mvarTemporaryFileNames) + { + if (System.IO.File.Exists(fileName)) + { + System.IO.File.Delete(fileName); + } + } + if (System.IO.Directory.Exists(mvarTemporaryFilePath)) + { + System.IO.Directory.Delete(mvarTemporaryFilePath, true); + } + return true; + } +} \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..ec6d80f9 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj @@ -0,0 +1,98 @@ + + + + + Debug + AnyCPU + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms + v3.5 + 512 + 12.0.0 + 2.0 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + ..\..\..\..\..\..\AwesomeControls\bin\Debug\AwesomeControls.dll + + + + + Form + + + ExportTableEntryPropertiesDialog.cs + + + UserControl + + + UnrealPackageEditor.cs + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {DF96F24E-FED9-4BAC-8389-63590125DC61} + UniversalEditor.Plugins.UnrealEngine + + + + + ExportTableEntryPropertiesDialog.cs + + + UnrealPackageEditor.cs + + + + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.Designer.cs new file mode 100644 index 00000000..ee73f699 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.Designer.cs @@ -0,0 +1,110 @@ +namespace UniversalEditor.Controls.Web.StyleSheet.MeasurementUpDown +{ + partial class MeasurementUpDownControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cboUnit = new System.Windows.Forms.ComboBox(); + this.txt = new System.Windows.Forms.NumericUpDown(); + this.cbo = new System.Windows.Forms.ComboBox(); + ((System.ComponentModel.ISupportInitialize)(this.txt)).BeginInit(); + this.SuspendLayout(); + // + // cboUnit + // + this.cboUnit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cboUnit.FormattingEnabled = true; + this.cboUnit.Items.AddRange(new object[] { + "px", + "pt", + "in", + "cm", + "mm", + "pc", + "em", + "ex", + "%"}); + this.cboUnit.Location = new System.Drawing.Point(80, 0); + this.cboUnit.Name = "cboUnit"; + this.cboUnit.Size = new System.Drawing.Size(40, 21); + this.cboUnit.TabIndex = 6; + this.cboUnit.SelectedIndexChanged += new System.EventHandler(this.cboUnit_SelectedIndexChanged); + // + // txt + // + this.txt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.txt.Location = new System.Drawing.Point(61, 1); + this.txt.Maximum = new decimal(new int[] { + 2147483647, + 0, + 0, + 0}); + this.txt.Minimum = new decimal(new int[] { + -2147483648, + 0, + 0, + -2147483648}); + this.txt.Name = "txt"; + this.txt.Size = new System.Drawing.Size(18, 20); + this.txt.TabIndex = 5; + this.txt.ValueChanged += new System.EventHandler(this.txt_ValueChanged); + // + // cbo + // + this.cbo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbo.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cbo.FormattingEnabled = true; + this.cbo.Location = new System.Drawing.Point(0, 0); + this.cbo.Name = "cbo"; + this.cbo.Size = new System.Drawing.Size(60, 21); + this.cbo.TabIndex = 4; + this.cbo.SelectedIndexChanged += new System.EventHandler(this.cbo_SelectedIndexChanged); + this.cbo.TextUpdate += new System.EventHandler(this.cbo_TextUpdate); + // + // MeasurementUpDown + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cboUnit); + this.Controls.Add(this.txt); + this.Controls.Add(this.cbo); + this.MinimumSize = new System.Drawing.Size(120, 21); + this.Name = "MeasurementUpDown"; + this.Size = new System.Drawing.Size(120, 21); + ((System.ComponentModel.ISupportInitialize)(this.txt)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ComboBox cboUnit; + private System.Windows.Forms.NumericUpDown txt; + private System.Windows.Forms.ComboBox cbo; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.cs new file mode 100644 index 00000000..7bfdd135 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.ObjectModels.Web; + +namespace UniversalEditor.Controls.Web.StyleSheet.MeasurementUpDown +{ + public partial class MeasurementUpDownControl : UserControl + { + private List mvarMeasurementUnits = new List(); + private Dictionary mvarMeasurementUnitsAndNames = new Dictionary(); + private Dictionary mvarMeasurementUnitIndices = new Dictionary(); + + public event EventHandler UnitChanged; + protected virtual void OnUnitChanged(EventArgs e) + { + if (UnitChanged != null) UnitChanged(this, e); + } + public event EventHandler ValueChanged; + protected virtual void OnValueChanged(EventArgs e) + { + if (ValueChanged != null) ValueChanged(this, e); + } + + public decimal MinimumValue { get { return txt.Minimum; } set { txt.Minimum = value; } } + public decimal MaximumValue { get { return txt.Maximum; } set { txt.Maximum = value; } } + + public MeasurementUpDownControl() + { + InitializeComponent(); + + RegisterMeasurementUnitAndName(MeasurementUnit.Pixel, "px"); + RegisterMeasurementUnitAndName(MeasurementUnit.Point, "pt"); + RegisterMeasurementUnitAndName(MeasurementUnit.Inch, "in"); + RegisterMeasurementUnitAndName(MeasurementUnit.Cm, "cm"); + RegisterMeasurementUnitAndName(MeasurementUnit.Mm, "mm"); + RegisterMeasurementUnitAndName(MeasurementUnit.Pica, "pc"); + RegisterMeasurementUnitAndName(MeasurementUnit.Em, "em"); + RegisterMeasurementUnitAndName(MeasurementUnit.Ex, "ex"); + RegisterMeasurementUnitAndName(MeasurementUnit.Percentage, "%"); + + cboUnit.Items.Clear(); + foreach (KeyValuePair kvp in mvarMeasurementUnitsAndNames) + { + cboUnit.Items.Add(kvp.Value); + } + } + + private void RegisterMeasurementUnitAndName(MeasurementUnit measurementUnit, string name) + { + mvarMeasurementUnits.Add(measurementUnit); + mvarMeasurementUnitsAndNames.Add(measurementUnit, name); + mvarMeasurementUnitIndices.Add(measurementUnit, mvarMeasurementUnitIndices.Count + 1); + } + + public System.Windows.Forms.ComboBox.ObjectCollection Items + { + get { return cbo.Items; } + } + + private void cbo_TextUpdate(object sender, EventArgs e) + { + base.Text = cbo.Text; + } + + private bool txt_InhibitValueChanged = false; + private void txt_ValueChanged(object sender, EventArgs e) + { + if (txt_InhibitValueChanged) return; + cbo.Text = txt.Value.ToString(); + OnValueChanged(e); + } + + private void cbo_SelectedIndexChanged(object sender, EventArgs e) + { + int tryval = 0; + if (Int32.TryParse(cbo.Text, out tryval)) + { + txt_InhibitValueChanged = true; + txt.Value = tryval; + txt_InhibitValueChanged = false; + + OnValueChanged(e); + } + } + + public Measurement Value + { + get + { + MeasurementUnit unit = mvarMeasurementUnits[cboUnit.SelectedIndex]; + return new Measurement((double)txt.Value, unit); + } + set + { + cboUnit.SelectedIndex = mvarMeasurementUnitIndices[value.Unit]; + txt.Value = (decimal)value.Value; + } + } + + private void cboUnit_SelectedIndexChanged(object sender, EventArgs e) + { + OnUnitChanged(e); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Controls/Web/StyleSheet/MeasurementUpDown/MeasurementUpDownControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.Designer.cs new file mode 100644 index 00000000..9d79d087 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.Designer.cs @@ -0,0 +1,511 @@ +namespace UniversalEditor.Editors.Web.StyleSheet +{ + partial class StyleSheetEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Font"); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Block"); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Background"); + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Border"); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Box"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Position"); + System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Layout"); + System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("List"); + System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("Table"); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.tv = new System.Windows.Forms.TreeView(); + this.fraCode = new System.Windows.Forms.GroupBox(); + this.txtCode = new System.Windows.Forms.TextBox(); + this.fraPreview = new System.Windows.Forms.GroupBox(); + this.pnlPreview = new System.Windows.Forms.Panel(); + this.fraStyleBuilder = new System.Windows.Forms.GroupBox(); + this.pnlFont = new System.Windows.Forms.Panel(); + this.chkFontTextDecorationBlink = new System.Windows.Forms.CheckBox(); + this.chkFontTextDecorationLineThrough = new System.Windows.Forms.CheckBox(); + this.chkFontTextDecorationOverline = new System.Windows.Forms.CheckBox(); + this.chkFontTextDecorationUnderline = new System.Windows.Forms.CheckBox(); + this.cmdFontColor = new System.Windows.Forms.Button(); + this.comboBox4 = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.cboFontFamily = new System.Windows.Forms.ComboBox(); + this.lblFontFamily = new System.Windows.Forms.Label(); + this.tvStyleBuilder = new System.Windows.Forms.TreeView(); + this.txtFontSize = new UniversalEditor.Controls.Web.StyleSheet.MeasurementUpDown.MeasurementUpDownControl(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.fraCode.SuspendLayout(); + this.fraPreview.SuspendLayout(); + this.fraStyleBuilder.SuspendLayout(); + this.pnlFont.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.fraCode); + this.splitContainer1.Panel2.Controls.Add(this.fraPreview); + this.splitContainer1.Panel2.Controls.Add(this.fraStyleBuilder); + this.splitContainer1.Size = new System.Drawing.Size(560, 425); + this.splitContainer1.SplitterDistance = 186; + this.splitContainer1.TabIndex = 0; + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(186, 425); + this.tv.TabIndex = 0; + // + // fraCode + // + this.fraCode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraCode.Controls.Add(this.txtCode); + this.fraCode.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraCode.Location = new System.Drawing.Point(3, 341); + this.fraCode.Name = "fraCode"; + this.fraCode.Size = new System.Drawing.Size(364, 81); + this.fraCode.TabIndex = 1; + this.fraCode.TabStop = false; + this.fraCode.Text = "Code"; + // + // txtCode + // + this.txtCode.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtCode.Location = new System.Drawing.Point(6, 19); + this.txtCode.Multiline = true; + this.txtCode.Name = "txtCode"; + this.txtCode.ReadOnly = true; + this.txtCode.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtCode.Size = new System.Drawing.Size(352, 56); + this.txtCode.TabIndex = 0; + // + // fraPreview + // + this.fraPreview.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraPreview.Controls.Add(this.pnlPreview); + this.fraPreview.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraPreview.Location = new System.Drawing.Point(3, 254); + this.fraPreview.Name = "fraPreview"; + this.fraPreview.Size = new System.Drawing.Size(364, 81); + this.fraPreview.TabIndex = 1; + this.fraPreview.TabStop = false; + this.fraPreview.Text = "Preview"; + // + // pnlPreview + // + this.pnlPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlPreview.BackColor = System.Drawing.Color.White; + this.pnlPreview.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlPreview.Location = new System.Drawing.Point(6, 19); + this.pnlPreview.Name = "pnlPreview"; + this.pnlPreview.Size = new System.Drawing.Size(352, 56); + this.pnlPreview.TabIndex = 0; + // + // fraStyleBuilder + // + this.fraStyleBuilder.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.fraStyleBuilder.Controls.Add(this.pnlFont); + this.fraStyleBuilder.Controls.Add(this.tvStyleBuilder); + this.fraStyleBuilder.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraStyleBuilder.Location = new System.Drawing.Point(3, 3); + this.fraStyleBuilder.Name = "fraStyleBuilder"; + this.fraStyleBuilder.Size = new System.Drawing.Size(364, 245); + this.fraStyleBuilder.TabIndex = 0; + this.fraStyleBuilder.TabStop = false; + this.fraStyleBuilder.Text = "Style Builder"; + // + // pnlFont + // + this.pnlFont.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlFont.Controls.Add(this.txtFontSize); + this.pnlFont.Controls.Add(this.chkFontTextDecorationBlink); + this.pnlFont.Controls.Add(this.chkFontTextDecorationLineThrough); + this.pnlFont.Controls.Add(this.chkFontTextDecorationOverline); + this.pnlFont.Controls.Add(this.chkFontTextDecorationUnderline); + this.pnlFont.Controls.Add(this.cmdFontColor); + this.pnlFont.Controls.Add(this.comboBox4); + this.pnlFont.Controls.Add(this.label6); + this.pnlFont.Controls.Add(this.label5); + this.pnlFont.Controls.Add(this.comboBox3); + this.pnlFont.Controls.Add(this.label4); + this.pnlFont.Controls.Add(this.comboBox2); + this.pnlFont.Controls.Add(this.label3); + this.pnlFont.Controls.Add(this.comboBox1); + this.pnlFont.Controls.Add(this.label2); + this.pnlFont.Controls.Add(this.label1); + this.pnlFont.Controls.Add(this.cboFontFamily); + this.pnlFont.Controls.Add(this.lblFontFamily); + this.pnlFont.Location = new System.Drawing.Point(101, 19); + this.pnlFont.Name = "pnlFont"; + this.pnlFont.Size = new System.Drawing.Size(257, 220); + this.pnlFont.TabIndex = 1; + // + // chkFontTextDecorationBlink + // + this.chkFontTextDecorationBlink.AutoSize = true; + this.chkFontTextDecorationBlink.Location = new System.Drawing.Point(139, 128); + this.chkFontTextDecorationBlink.Name = "chkFontTextDecorationBlink"; + this.chkFontTextDecorationBlink.Size = new System.Drawing.Size(49, 17); + this.chkFontTextDecorationBlink.TabIndex = 5; + this.chkFontTextDecorationBlink.Text = "&Blink"; + this.chkFontTextDecorationBlink.UseVisualStyleBackColor = true; + // + // chkFontTextDecorationLineThrough + // + this.chkFontTextDecorationLineThrough.AutoSize = true; + this.chkFontTextDecorationLineThrough.Location = new System.Drawing.Point(139, 105); + this.chkFontTextDecorationLineThrough.Name = "chkFontTextDecorationLineThrough"; + this.chkFontTextDecorationLineThrough.Size = new System.Drawing.Size(89, 17); + this.chkFontTextDecorationLineThrough.TabIndex = 5; + this.chkFontTextDecorationLineThrough.Text = "Strikethrough"; + this.chkFontTextDecorationLineThrough.UseVisualStyleBackColor = true; + // + // chkFontTextDecorationOverline + // + this.chkFontTextDecorationOverline.AutoSize = true; + this.chkFontTextDecorationOverline.Location = new System.Drawing.Point(139, 82); + this.chkFontTextDecorationOverline.Name = "chkFontTextDecorationOverline"; + this.chkFontTextDecorationOverline.Size = new System.Drawing.Size(65, 17); + this.chkFontTextDecorationOverline.TabIndex = 5; + this.chkFontTextDecorationOverline.Text = "&Overline"; + this.chkFontTextDecorationOverline.UseVisualStyleBackColor = true; + // + // chkFontTextDecorationUnderline + // + this.chkFontTextDecorationUnderline.AutoSize = true; + this.chkFontTextDecorationUnderline.Location = new System.Drawing.Point(139, 59); + this.chkFontTextDecorationUnderline.Name = "chkFontTextDecorationUnderline"; + this.chkFontTextDecorationUnderline.Size = new System.Drawing.Size(71, 17); + this.chkFontTextDecorationUnderline.TabIndex = 5; + this.chkFontTextDecorationUnderline.Text = "&Underline"; + this.chkFontTextDecorationUnderline.UseVisualStyleBackColor = true; + // + // cmdFontColor + // + this.cmdFontColor.BackColor = System.Drawing.Color.Black; + this.cmdFontColor.Location = new System.Drawing.Point(66, 165); + this.cmdFontColor.Name = "cmdFontColor"; + this.cmdFontColor.Size = new System.Drawing.Size(67, 23); + this.cmdFontColor.TabIndex = 4; + this.cmdFontColor.UseVisualStyleBackColor = false; + this.cmdFontColor.Click += new System.EventHandler(this.cmdFontColor_Click); + // + // comboBox4 + // + this.comboBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBox4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox4.FormattingEnabled = true; + this.comboBox4.Items.AddRange(new object[] { + "normal", + "small-caps", + "inherit"}); + this.comboBox4.Location = new System.Drawing.Point(66, 138); + this.comboBox4.Name = "comboBox4"; + this.comboBox4.Size = new System.Drawing.Size(67, 21); + this.comboBox4.TabIndex = 1; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label6.Location = new System.Drawing.Point(3, 170); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(34, 13); + this.label6.TabIndex = 0; + this.label6.Text = "Color:"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label5.Location = new System.Drawing.Point(3, 141); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(57, 13); + this.label5.TabIndex = 0; + this.label5.Text = "T&ransform:"; + // + // comboBox3 + // + this.comboBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBox3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Items.AddRange(new object[] { + "normal", + "small-caps", + "inherit"}); + this.comboBox3.Location = new System.Drawing.Point(66, 111); + this.comboBox3.Name = "comboBox3"; + this.comboBox3.Size = new System.Drawing.Size(67, 21); + this.comboBox3.TabIndex = 1; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label4.Location = new System.Drawing.Point(3, 114); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(43, 13); + this.label4.TabIndex = 0; + this.label4.Text = "&Variant:"; + // + // comboBox2 + // + this.comboBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Items.AddRange(new object[] { + "italic", + "normal", + "oblique", + "inherit"}); + this.comboBox2.Location = new System.Drawing.Point(66, 84); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(67, 21); + this.comboBox2.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label3.Location = new System.Drawing.Point(3, 87); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(33, 13); + this.label3.TabIndex = 0; + this.label3.Text = "St&yle:"; + // + // comboBox1 + // + this.comboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Items.AddRange(new object[] { + "normal", + "bold", + "lighter", + "bolder", + "100", + "200", + "300", + "400", + "500", + "600", + "700", + "800", + "900", + "inherit"}); + this.comboBox1.Location = new System.Drawing.Point(66, 57); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(67, 21); + this.comboBox1.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label2.Location = new System.Drawing.Point(3, 60); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(44, 13); + this.label2.TabIndex = 0; + this.label2.Text = "&Weight:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.label1.Location = new System.Drawing.Point(3, 33); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(30, 13); + this.label1.TabIndex = 0; + this.label1.Text = "&Size:"; + // + // cboFontFamily + // + this.cboFontFamily.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cboFontFamily.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cboFontFamily.FormattingEnabled = true; + this.cboFontFamily.Location = new System.Drawing.Point(66, 3); + this.cboFontFamily.Name = "cboFontFamily"; + this.cboFontFamily.Size = new System.Drawing.Size(188, 21); + this.cboFontFamily.TabIndex = 1; + // + // lblFontFamily + // + this.lblFontFamily.AutoSize = true; + this.lblFontFamily.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblFontFamily.Location = new System.Drawing.Point(3, 6); + this.lblFontFamily.Name = "lblFontFamily"; + this.lblFontFamily.Size = new System.Drawing.Size(39, 13); + this.lblFontFamily.TabIndex = 0; + this.lblFontFamily.Text = "&Family:"; + // + // tvStyleBuilder + // + this.tvStyleBuilder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.tvStyleBuilder.FullRowSelect = true; + this.tvStyleBuilder.HideSelection = false; + this.tvStyleBuilder.ItemHeight = 24; + this.tvStyleBuilder.Location = new System.Drawing.Point(6, 19); + this.tvStyleBuilder.Name = "tvStyleBuilder"; + treeNode1.Name = "nodeFont"; + treeNode1.Text = "Font"; + treeNode2.Name = "nodeBlock"; + treeNode2.Text = "Block"; + treeNode3.Name = "nodeBackground"; + treeNode3.Text = "Background"; + treeNode4.Name = "nodeBorder"; + treeNode4.Text = "Border"; + treeNode5.Name = "nodeBox"; + treeNode5.Text = "Box"; + treeNode6.Name = "nodePosition"; + treeNode6.Text = "Position"; + treeNode7.Name = "nodeLayout"; + treeNode7.Text = "Layout"; + treeNode8.Name = "nodeList"; + treeNode8.Text = "List"; + treeNode9.Name = "nodeTable"; + treeNode9.Text = "Table"; + this.tvStyleBuilder.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode1, + treeNode2, + treeNode3, + treeNode4, + treeNode5, + treeNode6, + treeNode7, + treeNode8, + treeNode9}); + this.tvStyleBuilder.ShowLines = false; + this.tvStyleBuilder.ShowRootLines = false; + this.tvStyleBuilder.Size = new System.Drawing.Size(89, 220); + this.tvStyleBuilder.TabIndex = 0; + // + // txtFontSize + // + this.txtFontSize.Location = new System.Drawing.Point(66, 30); + this.txtFontSize.MaximumValue = new decimal(new int[] { + 2147483647, + 0, + 0, + 0}); + this.txtFontSize.MinimumSize = new System.Drawing.Size(120, 21); + this.txtFontSize.MinimumValue = new decimal(new int[] { + -2147483648, + 0, + 0, + -2147483648}); + this.txtFontSize.Name = "txtFontSize"; + this.txtFontSize.Size = new System.Drawing.Size(138, 21); + this.txtFontSize.TabIndex = 6; + // + // StyleSheetEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.MinimumSize = new System.Drawing.Size(560, 425); + this.Name = "StyleSheetEditor"; + this.Size = new System.Drawing.Size(560, 425); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.fraCode.ResumeLayout(false); + this.fraCode.PerformLayout(); + this.fraPreview.ResumeLayout(false); + this.fraStyleBuilder.ResumeLayout(false); + this.pnlFont.ResumeLayout(false); + this.pnlFont.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.GroupBox fraPreview; + private System.Windows.Forms.GroupBox fraStyleBuilder; + private System.Windows.Forms.TreeView tvStyleBuilder; + private System.Windows.Forms.Panel pnlFont; + private System.Windows.Forms.ComboBox cboFontFamily; + private System.Windows.Forms.Label lblFontFamily; + private System.Windows.Forms.GroupBox fraCode; + private System.Windows.Forms.TextBox txtCode; + private System.Windows.Forms.Panel pnlPreview; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox comboBox4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Button cmdFontColor; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.CheckBox chkFontTextDecorationBlink; + private System.Windows.Forms.CheckBox chkFontTextDecorationLineThrough; + private System.Windows.Forms.CheckBox chkFontTextDecorationOverline; + private System.Windows.Forms.CheckBox chkFontTextDecorationUnderline; + private Controls.Web.StyleSheet.MeasurementUpDown.MeasurementUpDownControl txtFontSize; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.cs new file mode 100644 index 00000000..f43ffbdf --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.ObjectModels.Web.StyleSheet; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Web.StyleSheet +{ + public partial class StyleSheetEditor : Editor + { + public StyleSheetEditor() + { + InitializeComponent(); + + object[] FontSizes = (base.Configuration.Properties["FontSizes"].Value as object[]); + foreach (object FontSizeO in FontSizes) + { + string FontSize = FontSizeO.ToString(); + txtFontSize.Items.Add(FontSize); + } + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(StyleSheetObjectModel)); + } + return _er; + } + + private void cmdFontColor_Click(object sender, EventArgs e) + { + ColorDialog dlg = new ColorDialog(); + dlg.Color = cmdFontColor.BackColor; + if (dlg.ShowDialog() == DialogResult.OK) + { + cmdFontColor.BackColor = dlg.Color; + } + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/StyleSheet/StyleSheetEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.Designer.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.Designer.cs new file mode 100644 index 00000000..11bb9a5e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.Designer.cs @@ -0,0 +1,57 @@ +namespace UniversalEditor.Editors.Web.WebService.Description +{ + partial class WebServiceDescriptionEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tv = new System.Windows.Forms.TreeView(); + this.SuspendLayout(); + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(557, 297); + this.tv.TabIndex = 0; + // + // WebServiceDescriptionEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tv); + this.Name = "WebServiceDescriptionEditor"; + this.Size = new System.Drawing.Size(557, 297); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.cs new file mode 100644 index 00000000..7654e36e --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using UniversalEditor.ObjectModels.Web.WebService.Description; + +using UniversalEditor.UserInterface; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.Web.WebService.Description +{ + public partial class WebServiceDescriptionEditor : Editor + { + public WebServiceDescriptionEditor() + { + InitializeComponent(); + + tv.ImageList = SmallImageList; + Font = SystemFonts.MenuFont; + } + + private static EditorReference _er = null; + public override EditorReference MakeReference() + { + if (_er == null) + { + _er = base.MakeReference(); + _er.SupportedObjectModels.Add(typeof(WebServiceDescriptionObjectModel)); + } + return _er; + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + + WebServiceDescriptionObjectModel wsdl = (ObjectModel as WebServiceDescriptionObjectModel); + if (wsdl == null) return; + + TreeNode tnToplevel = new TreeNode(); + tnToplevel.Text = wsdl.Name; + tnToplevel.ImageKey = "Service"; + tnToplevel.SelectedImageKey = "Service"; + + TreeNode tnMessages = new TreeNode(); + tnMessages.Text = "Messages"; + tnMessages.ImageKey = "generic-folder-closed"; + tnMessages.SelectedImageKey = "generic-folder-closed"; + + foreach (UniversalEditor.ObjectModels.Web.WebService.Description.Message message in wsdl.Messages) + { + TreeNode tnMessage = new TreeNode(); + tnMessage.Tag = message; + tnMessage.Text = message.Name; + tnMessage.ImageKey = "Message"; + tnMessage.SelectedImageKey = "Message"; + tnMessages.Nodes.Add(tnMessage); + } + tnToplevel.Nodes.Add(tnMessages); + + tv.Nodes.Add(tnToplevel); + } + } +} diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.resx b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Editors/Web/WebService/Description/WebServiceDescriptionEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9e46bd11 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Web Development plugin for Windows Forms engine of Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("bee7fd38-bf81-4693-9cbb-ee98180265af")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/UniversalEditor.Plugins.Web.UserInterface.WindowsForms.csproj b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/UniversalEditor.Plugins.Web.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..6e8566d1 --- /dev/null +++ b/CSharp/V5/Engines/WindowsForms/Plugins/UniversalEditor.Plugins.Web.UserInterface.WindowsForms/UniversalEditor.Plugins.Web.UserInterface.WindowsForms.csproj @@ -0,0 +1,135 @@ + + + + + Debug + AnyCPU + {997FFB89-0ED6-47EB-BD97-68B3138F91AD} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.Web.UserInterface.WindowsForms + v3.5 + 512 + False + False + False + False + obj\$(Configuration)\ + 12.0.0 + 2.0 + + + true + Full + False + ..\..\..\..\Output\Debug\Plugins\ + TRACE;DEBUG + prompt + 4 + obj\ + 4194304 + False + False + Auto + AnyCPU + + + PdbOnly + True + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + 4194304 + False + False + Auto + obj\ + AnyCPU + + + False + obj\ + + + 4194304 + AnyCPU + False + False + Auto + + + False + obj\ + + + + + + + + + + UserControl + + + MeasurementUpDownControl.cs + + + UserControl + + + StyleSheetEditor.cs + + + UserControl + + + WebServiceDescriptionEditor.cs + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9} + UniversalEditor.UserInterface.WindowsForms + + + {8622EBC4-8E20-476E-B284-33D472081F5C} + UniversalEditor.UserInterface + + + {64089452-6A08-47A5-A857-BF418F80D4A3} + UniversalEditor.Plugins.Web + + + + + + MeasurementUpDownControl.cs + + + StyleSheetEditor.cs + + + WebServiceDescriptionEditor.cs + + + + + \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/BlockType.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/BlockType.cs new file mode 100644 index 00000000..27ff37bf --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/BlockType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public enum BlockType + { + Uncompressed, + Static, + Dynamic + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/BurrowsWheelerTransform.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/BurrowsWheelerTransform.cs new file mode 100644 index 00000000..e05e220f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/BurrowsWheelerTransform.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public static class BurrowsWheelerTransform + { + private static char[][] getRotations(char[] array) + { + char[][] cz = new char[array.Length][]; + for (int i = 0; i < cz.Length; i++) + { + cz[i] = BurrowsWheelerTransform.getRotation(array, i); + } + return cz; + } + private static char[] getRotation(char[] array, int rotation) + { + char[] oldArray = new char[array.Length]; + char[] newArray = new char[array.Length]; + array.CopyTo(oldArray, 0); + array.CopyTo(newArray, 0); + for (int i = 0; i < newArray.Length; i++) + { + int rot = 0; + if (i + rotation < newArray.Length) + { + rot = i + rotation; + } + else + { + rot = i + rotation - newArray.Length; + } + newArray[i] = oldArray[rot]; + } + return newArray; + } + public static void Test() + { + char[] sorted = Sorting.AlphabeticSort("FAAOD".ToCharArray()); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/CompressionTracingSwitch.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/CompressionTracingSwitch.cs new file mode 100644 index 00000000..b688409d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/CompressionTracingSwitch.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; + +namespace UniversalEditor.Compression.Common +{ + public class CompressionTracingSwitch : Switch + { + internal static CompressionTracingSwitch tracingSwitch = new CompressionTracingSwitch("CompressionSwitch", "Compression Library Tracing Switch"); + public static bool Informational + { + get + { + return CompressionTracingSwitch.tracingSwitch.SwitchSetting >= 1; + } + } + public static bool Verbose + { + get + { + return CompressionTracingSwitch.tracingSwitch.SwitchSetting >= 2; + } + } + internal CompressionTracingSwitch(string displayName, string description) + : base(displayName, description) + { + } + } + public enum CompressionTracingSwitchLevel + { + Off, + Informational, + Verbose + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/DecodeHelper.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/DecodeHelper.cs new file mode 100644 index 00000000..aa2a74a0 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/DecodeHelper.cs @@ -0,0 +1,292 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public static class DecodeHelper + { + private static readonly uint[] crcTable = new uint[] + { + 0u, + 1996959894u, + 3993919788u, + 2567524794u, + 124634137u, + 1886057615u, + 3915621685u, + 2657392035u, + 249268274u, + 2044508324u, + 3772115230u, + 2547177864u, + 162941995u, + 2125561021u, + 3887607047u, + 2428444049u, + 498536548u, + 1789927666u, + 4089016648u, + 2227061214u, + 450548861u, + 1843258603u, + 4107580753u, + 2211677639u, + 325883990u, + 1684777152u, + 4251122042u, + 2321926636u, + 335633487u, + 1661365465u, + 4195302755u, + 2366115317u, + 997073096u, + 1281953886u, + 3579855332u, + 2724688242u, + 1006888145u, + 1258607687u, + 3524101629u, + 2768942443u, + 901097722u, + 1119000684u, + 3686517206u, + 2898065728u, + 853044451u, + 1172266101u, + 3705015759u, + 2882616665u, + 651767980u, + 1373503546u, + 3369554304u, + 3218104598u, + 565507253u, + 1454621731u, + 3485111705u, + 3099436303u, + 671266974u, + 1594198024u, + 3322730930u, + 2970347812u, + 795835527u, + 1483230225u, + 3244367275u, + 3060149565u, + 1994146192u, + 31158534u, + 2563907772u, + 4023717930u, + 1907459465u, + 112637215u, + 2680153253u, + 3904427059u, + 2013776290u, + 251722036u, + 2517215374u, + 3775830040u, + 2137656763u, + 141376813u, + 2439277719u, + 3865271297u, + 1802195444u, + 476864866u, + 2238001368u, + 4066508878u, + 1812370925u, + 453092731u, + 2181625025u, + 4111451223u, + 1706088902u, + 314042704u, + 2344532202u, + 4240017532u, + 1658658271u, + 366619977u, + 2362670323u, + 4224994405u, + 1303535960u, + 984961486u, + 2747007092u, + 3569037538u, + 1256170817u, + 1037604311u, + 2765210733u, + 3554079995u, + 1131014506u, + 879679996u, + 2909243462u, + 3663771856u, + 1141124467u, + 855842277u, + 2852801631u, + 3708648649u, + 1342533948u, + 654459306u, + 3188396048u, + 3373015174u, + 1466479909u, + 544179635u, + 3110523913u, + 3462522015u, + 1591671054u, + 702138776u, + 2966460450u, + 3352799412u, + 1504918807u, + 783551873u, + 3082640443u, + 3233442989u, + 3988292384u, + 2596254646u, + 62317068u, + 1957810842u, + 3939845945u, + 2647816111u, + 81470997u, + 1943803523u, + 3814918930u, + 2489596804u, + 225274430u, + 2053790376u, + 3826175755u, + 2466906013u, + 167816743u, + 2097651377u, + 4027552580u, + 2265490386u, + 503444072u, + 1762050814u, + 4150417245u, + 2154129355u, + 426522225u, + 1852507879u, + 4275313526u, + 2312317920u, + 282753626u, + 1742555852u, + 4189708143u, + 2394877945u, + 397917763u, + 1622183637u, + 3604390888u, + 2714866558u, + 953729732u, + 1340076626u, + 3518719985u, + 2797360999u, + 1068828381u, + 1219638859u, + 3624741850u, + 2936675148u, + 906185462u, + 1090812512u, + 3747672003u, + 2825379669u, + 829329135u, + 1181335161u, + 3412177804u, + 3160834842u, + 628085408u, + 1382605366u, + 3423369109u, + 3138078467u, + 570562233u, + 1426400815u, + 3317316542u, + 2998733608u, + 733239954u, + 1555261956u, + 3268935591u, + 3050360625u, + 752459403u, + 1541320221u, + 2607071920u, + 3965973030u, + 1969922972u, + 40735498u, + 2617837225u, + 3943577151u, + 1913087877u, + 83908371u, + 2512341634u, + 3803740692u, + 2075208622u, + 213261112u, + 2463272603u, + 3855990285u, + 2094854071u, + 198958881u, + 2262029012u, + 4057260610u, + 1759359992u, + 534414190u, + 2176718541u, + 4139329115u, + 1873836001u, + 414664567u, + 2282248934u, + 4279200368u, + 1711684554u, + 285281116u, + 2405801727u, + 4167216745u, + 1634467795u, + 376229701u, + 2685067896u, + 3608007406u, + 1308918612u, + 956543938u, + 2808555105u, + 3495958263u, + 1231636301u, + 1047427035u, + 2932959818u, + 3654703836u, + 1088359270u, + 936918000u, + 2847714899u, + 3736837829u, + 1202900863u, + 817233897u, + 3183342108u, + 3401237130u, + 1404277552u, + 615818150u, + 3134207493u, + 3453421203u, + 1423857449u, + 601450431u, + 3009837614u, + 3294710456u, + 1567103746u, + 711928724u, + 3020668471u, + 3272380065u, + 1510334235u, + 755167117u + }; + public static uint BitReverse(uint code, int length) + { + uint num = 0u; + do + { + num |= (code & 1u); + num <<= 1; + code >>= 1; + } + while (--length > 0); + return num >> 1; + } + public static uint UpdateCrc32(uint crc32, byte[] buffer, int offset, int length) + { + crc32 ^= 4294967295u; + while (--length >= 0) + { + offset++; + crc32 = (DecodeHelper.crcTable[(int)((IntPtr)((long)((ulong)((crc32 ^ (uint)buffer[offset]) & 255u))))] ^ crc32 >> 8); + } + crc32 ^= 4294967295u; + return crc32; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/HuffmanTree.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/HuffmanTree.cs new file mode 100644 index 00000000..8aff6b64 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/HuffmanTree.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.Compression.Modules.Deflate.Internal; + +namespace UniversalEditor.Compression.Common +{ + public class HuffmanTree + { + internal const int EndOfBlockCode = 256; + internal const int MaxDistTreeElements = 32; + internal const int MaxLiteralTreeElements = 288; + internal const int NumberOfCodeLengthTreeElements = 19; + private byte[] codeLengthArray; + private short[] left; + private short[] right; + private static HuffmanTree staticDistanceTree = new HuffmanTree(HuffmanTree.GetStaticDistanceTreeLength()); + private static HuffmanTree staticLiteralLengthTree = new HuffmanTree(HuffmanTree.GetStaticLiteralTreeLength()); + private short[] table; + private int tableBits; + private int tableMask; + public static HuffmanTree StaticDistanceTree + { + get + { + return HuffmanTree.staticDistanceTree; + } + } + public static HuffmanTree StaticLiteralLengthTree + { + get + { + return HuffmanTree.staticLiteralLengthTree; + } + } + public HuffmanTree(byte[] codeLengths) + { + this.codeLengthArray = codeLengths; + if (this.codeLengthArray.Length == 288) + { + this.tableBits = 9; + } + else + { + this.tableBits = 7; + } + this.tableMask = (1 << this.tableBits) - 1; + this.CreateTable(); + } + private uint[] CalculateHuffmanCode() + { + uint[] numArray = new uint[17]; + byte[] codeLengthArray = this.codeLengthArray; + for (int i = 0; i < codeLengthArray.Length; i++) + { + int index = (int)codeLengthArray[i]; + numArray[index] += 1u; + } + numArray[0] = 0u; + uint[] numArray2 = new uint[17]; + uint num2 = 0u; + for (int j = 1; j <= 16; j++) + { + numArray2[j] = num2 + numArray[j - 1] << 1; + } + uint[] numArray3 = new uint[288]; + for (int k = 0; k < this.codeLengthArray.Length; k++) + { + int length = (int)this.codeLengthArray[k]; + if (length > 0) + { + numArray3[k] = DecodeHelper.BitReverse(numArray2[length], length); + numArray2[length] += 1u; + } + } + return numArray3; + } + private void CreateTable() + { + uint[] numArray = this.CalculateHuffmanCode(); + this.table = new short[1 << this.tableBits]; + this.left = new short[2 * this.codeLengthArray.Length]; + this.right = new short[2 * this.codeLengthArray.Length]; + short length = (short)this.codeLengthArray.Length; + for (int i = 0; i < this.codeLengthArray.Length; i++) + { + int num3 = (int)this.codeLengthArray[i]; + if (num3 > 0) + { + int index = (int)numArray[i]; + if (num3 <= this.tableBits) + { + int num4 = 1 << num3; + if (index >= num4) + { + throw new System.IO.InvalidDataException("InvalidHuffmanData"); + } + int num5 = 1 << this.tableBits - num3; + for (int j = 0; j < num5; j++) + { + this.table[index] = (short)i; + index += num4; + } + } + else + { + int num6 = num3 - this.tableBits; + int num7 = 1 << this.tableBits; + int num8 = index & (1 << this.tableBits) - 1; + short[] table = this.table; + do + { + short num9 = table[num8]; + if (num9 == 0) + { + table[num8] = (short)(-length); + num9 = (short)(-length); + length += 1; + } + if ((index & num7) == 0) + { + table = this.left; + } + else + { + table = this.right; + } + num8 = (int)(-(int)num9); + num7 <<= 1; + num6--; + } + while (num6 != 0); + table[num8] = (short)i; + } + } + } + } + public int GetNextSymbol(InputBuffer input) + { + uint num = input.TryLoad16Bits(); + int result; + if (input.AvailableBits == 0) + { + result = -1; + } + else + { + int index = (int)this.table[(int)((IntPtr)((long)((ulong)num & (ulong)((long)this.tableMask))))]; + if (index < 0) + { + uint num2 = 1u << this.tableBits; + do + { + index = -index; + if ((num & num2) == 0u) + { + index = (int)this.left[index]; + } + else + { + index = (int)this.right[index]; + } + num2 <<= 1; + } + while (index < 0); + } + if ((int)this.codeLengthArray[index] > input.AvailableBits) + { + result = -1; + } + else + { + input.SkipBits((int)this.codeLengthArray[index]); + result = index; + } + } + return result; + } + private static byte[] GetStaticDistanceTreeLength() + { + byte[] buffer = new byte[32]; + for (int i = 0; i < 32; i++) + { + buffer[i] = 5; + } + return buffer; + } + private static byte[] GetStaticLiteralTreeLength() + { + byte[] buffer = new byte[288]; + for (int i = 0; i <= 143; i++) + { + buffer[i] = 8; + } + for (int j = 144; j <= 255; j++) + { + buffer[j] = 9; + } + for (int k = 256; k <= 279; k++) + { + buffer[k] = 7; + } + for (int l = 280; l <= 287; l++) + { + buffer[l] = 8; + } + return buffer; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/InputBuffer.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/InputBuffer.cs new file mode 100644 index 00000000..044a0571 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/InputBuffer.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public class InputBuffer + { + private uint bitBuffer; + private int bitsInBuffer; + private byte[] buffer; + private int end; + private int start; + public int AvailableBits + { + get + { + return this.bitsInBuffer; + } + } + public int AvailableBytes + { + get + { + return this.end - this.start + this.bitsInBuffer / 8; + } + } + public int CopyTo(byte[] output, int offset, int length) + { + int num = 0; + while (this.bitsInBuffer > 0 && length > 0) + { + offset++; + output[offset] = (byte)this.bitBuffer; + this.bitBuffer >>= 8; + this.bitsInBuffer -= 8; + length--; + num++; + } + int result; + if (length == 0) + { + result = num; + } + else + { + int num2 = this.end - this.start; + if (length > num2) + { + length = num2; + } + Array.Copy(this.buffer, this.start, output, offset, length); + this.start += length; + result = num + length; + } + return result; + } + public bool EnsureBitsAvailable(int count) + { + bool result; + if (this.bitsInBuffer < count) + { + if (this.NeedsInput()) + { + result = false; + return result; + } + int CS_0_2 = this.start++; + this.bitBuffer |= (uint)((uint)this.buffer[CS_0_2] << this.bitsInBuffer); + this.bitsInBuffer += 8; + if (this.bitsInBuffer < count) + { + if (this.NeedsInput()) + { + result = false; + return result; + } + CS_0_2 = this.start++; + this.bitBuffer |= (uint)((uint)this.buffer[CS_0_2] << this.bitsInBuffer); + this.bitsInBuffer += 8; + } + } + result = true; + return result; + } + private uint GetBitMask(int count) + { + return (1u << count) - 1u; + } + public int GetBits(int count) + { + int result; + if (!this.EnsureBitsAvailable(count)) + { + result = -1; + } + else + { + int num = (int)(this.bitBuffer & this.GetBitMask(count)); + this.bitBuffer >>= count; + this.bitsInBuffer -= count; + result = num; + } + return result; + } + public bool NeedsInput() + { + return this.start == this.end; + } + public void SetInput(byte[] buffer, int offset, int length) + { + this.buffer = buffer; + this.start = offset; + this.end = offset + length; + } + public void SkipBits(int n) + { + this.bitBuffer >>= n; + this.bitsInBuffer -= n; + } + public void SkipToByteBoundary() + { + this.bitBuffer >>= this.bitsInBuffer % 8; + this.bitsInBuffer -= this.bitsInBuffer % 8; + } + public uint TryLoad16Bits() + { + if (this.bitsInBuffer < 8) + { + if (this.start < this.end) + { + int CS_0_2 = this.start++; + this.bitBuffer |= (uint)((uint)this.buffer[CS_0_2] << this.bitsInBuffer); + this.bitsInBuffer += 8; + } + if (this.start < this.end) + { + int CS_0_2 = this.start++; + this.bitBuffer |= (uint)((uint)this.buffer[CS_0_2] << this.bitsInBuffer); + this.bitsInBuffer += 8; + } + } + else + { + if (this.bitsInBuffer < 16 && this.start < this.end) + { + int CS_0_2 = this.start++; + this.bitBuffer |= (uint)((uint)this.buffer[CS_0_2] << this.bitsInBuffer); + this.bitsInBuffer += 8; + } + } + return this.bitBuffer; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/MT19937ar.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/MT19937ar.cs new file mode 100644 index 00000000..9e628d4e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/MT19937ar.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public class MT19937ar + { + private static short N = 624; + private static short M = 397; + private static uint MATRIX_A = 2567483615u; + private static uint UPPER_MASK = 2147483648u; + private static uint LOWER_MASK = 2147483647u; + private static uint[] mag01 = new uint[] + { + 0u, + MT19937ar.MATRIX_A + }; + private static uint[] mt = new uint[(int)MT19937ar.N]; + private static short mti = (short)(MT19937ar.N + 1); + public void init_genrand(uint s) + { + MT19937ar.mt[0] = (s & 4294967295u); + MT19937ar.mti = 1; + while (MT19937ar.mti < MT19937ar.N) + { + MT19937ar.mt[(int)MT19937ar.mti] = 1812433253u * (MT19937ar.mt[(int)(MT19937ar.mti - 1)] ^ MT19937ar.mt[(int)(MT19937ar.mti - 1)] >> 30) + (uint)MT19937ar.mti; + MT19937ar.mt[(int)MT19937ar.mti] &= 4294967295u; + MT19937ar.mti += 1; + } + } + public void init_by_array(uint[] init_key, short key_length) + { + this.init_genrand(19650218u); + uint i = 1u; + uint j = 0u; + for (uint k = (uint)((MT19937ar.N > key_length) ? ((uint)MT19937ar.N) : ((uint)key_length)); k > 0u; k -= 1u) + { + MT19937ar.mt[(int)((UIntPtr)i)] = (MT19937ar.mt[(int)((UIntPtr)i)] ^ (MT19937ar.mt[(int)((UIntPtr)(i - 1u))] ^ MT19937ar.mt[(int)((UIntPtr)(i - 1u))] >> 30) * 1664525u) + init_key[(int)((UIntPtr)j)] + j; + MT19937ar.mt[(int)((UIntPtr)i)] &= 4294967295u; + i += 1u; + j += 1u; + if ((ulong)i >= (ulong)((long)MT19937ar.N)) + { + MT19937ar.mt[0] = MT19937ar.mt[(int)(MT19937ar.N - 1)]; + i = 1u; + } + if ((ulong)j >= (ulong)((long)key_length)) + { + j = 0u; + } + } + for (uint k = (uint)(MT19937ar.N - 1); k > 0u; k -= 1u) + { + MT19937ar.mt[(int)((UIntPtr)i)] = (MT19937ar.mt[(int)((UIntPtr)i)] ^ (MT19937ar.mt[(int)((UIntPtr)(i - 1u))] ^ MT19937ar.mt[(int)((UIntPtr)(i - 1u))] >> 30) * 1566083941u) - i; + MT19937ar.mt[(int)((UIntPtr)i)] &= 4294967295u; + i += 1u; + if ((ulong)i >= (ulong)((long)MT19937ar.N)) + { + MT19937ar.mt[0] = MT19937ar.mt[(int)(MT19937ar.N - 1)]; + i = 1u; + } + } + MT19937ar.mt[0] = 2147483648u; + } + public uint genrand_int32() + { + uint y; + if (MT19937ar.mti >= MT19937ar.N) + { + if (MT19937ar.mti == MT19937ar.N + 1) + { + this.init_genrand(5489u); + } + short kk; + for (kk = 0; kk < MT19937ar.N - MT19937ar.M; kk += 1) + { + y = ((MT19937ar.mt[(int)kk] & MT19937ar.UPPER_MASK) | (MT19937ar.mt[(int)(kk + 1)] & MT19937ar.LOWER_MASK)); + MT19937ar.mt[(int)kk] = (MT19937ar.mt[(int)(kk + MT19937ar.M)] ^ y >> 1 ^ MT19937ar.mag01[(int)((UIntPtr)(y & 1u))]); + } + while (kk < MT19937ar.N - 1) + { + y = ((MT19937ar.mt[(int)kk] & MT19937ar.UPPER_MASK) | (MT19937ar.mt[(int)(kk + 1)] & MT19937ar.LOWER_MASK)); + MT19937ar.mt[(int)kk] = (MT19937ar.mt[(int)(kk + (MT19937ar.M - MT19937ar.N))] ^ y >> 1 ^ MT19937ar.mag01[(int)((UIntPtr)(y & 1u))]); + kk += 1; + } + y = ((MT19937ar.mt[(int)(MT19937ar.N - 1)] & MT19937ar.UPPER_MASK) | (MT19937ar.mt[0] & MT19937ar.LOWER_MASK)); + MT19937ar.mt[(int)(MT19937ar.N - 1)] = (MT19937ar.mt[(int)(MT19937ar.M - 1)] ^ y >> 1 ^ MT19937ar.mag01[(int)((UIntPtr)(y & 1u))]); + MT19937ar.mti = 0; + } + uint[] arg_15A_0 = MT19937ar.mt; + short expr_151 = MT19937ar.mti; + MT19937ar.mti = (short)(expr_151 + 1); + y = arg_15A_0[(int)expr_151]; + y ^= y >> 11; + y ^= (y << 7 & 2636928640u); + y ^= (y << 15 & 4022730752u); + return y ^ y >> 18; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/Match.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/Match.cs new file mode 100644 index 00000000..74875b69 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/Match.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public class Match + { + private int len; + private int pos; + private MatchState state; + private byte symbol; + internal int Length + { + get + { + return this.len; + } + set + { + this.len = value; + } + } + internal int Position + { + get + { + return this.pos; + } + set + { + this.pos = value; + } + } + internal MatchState State + { + get + { + return this.state; + } + set + { + this.state = value; + } + } + internal byte Symbol + { + get + { + return this.symbol; + } + set + { + this.symbol = value; + } + } + } + public enum MatchState + { + HasMatch = 2, + HasSymbol = 1, + HasSymbolAndMatch = 3 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/RunLengthEncoding.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/RunLengthEncoding.cs new file mode 100644 index 00000000..0ea3fcb4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/RunLengthEncoding.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using UniversalEditor.Accessors; + +namespace UniversalEditor.Compression.Common +{ + public class RunLengthEncoding + { + public static byte[] Encode(byte[] input) + { + byte[] result; + if (input.Length < 2) + { + result = input; + } + else + { + UniversalEditor.IO.Writer bw = new UniversalEditor.IO.Writer(new MemoryAccessor()); + byte last = input[0]; + byte lastCount = 0; + for (int i = 0; i < input.Length; i++) + { + if (input[i] == last) + { + lastCount += 1; + } + else + { + bw.WriteByte(lastCount); + bw.WriteByte(last); + last = input[i]; + lastCount = 1; + } + } + if (input[input.Length - 1] == last) + { + bw.WriteByte(lastCount); + bw.WriteByte(last); + } + bw.Flush(); + bw.Close(); + result = (bw.Accessor as MemoryAccessor).ToArray(); + } + return result; + } + public static byte[] Decode(byte[] input) + { + IO.Reader br = new IO.Reader(new MemoryAccessor(input)); + MemoryStream msOutput = new MemoryStream(); + while (!br.EndOfStream) + { + byte ct = br.ReadByte(); + byte val = br.ReadByte(); + for (int i = 0; i < (int)ct; i++) + { + msOutput.WriteByte(val); + } + } + br.Close(); + msOutput.Flush(); + msOutput.Close(); + return msOutput.ToArray(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Common/Sorting.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/Sorting.cs new file mode 100644 index 00000000..f907fe3b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Common/Sorting.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Common +{ + public static class Sorting + { + public static char[] AlphabeticSort(char[] input) + { + char[] output = new char[input.Length]; + input.CopyTo(output, 0); + int previ = 0; + int swapi = 0; + for (int i = 0; i < output.Length; i++) + { + if (output[i] < output[previ]) + { + char swap = output[i]; + output[i] = output[swapi]; + output[swapi] = swap; + swapi = i; + previ = i; + } + else + { + if (output[i] > output[previ]) + { + swapi = i - 1; + } + } + } + return output; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionFailureException.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionFailureException.cs new file mode 100644 index 00000000..19e2ecf7 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionFailureException.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression +{ + /// + /// The exception that is thrown when a compression or decompression operation results in an error. + /// + [Serializable] + public class CompressionFailureException : Exception + { + public CompressionFailureException() { } + public CompressionFailureException(string message) : base(message) { } + public CompressionFailureException(string message, Exception inner) : base(message, inner) { } + protected CompressionFailureException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + + private CompressionMethod mvarMethod = CompressionMethod.Unknown; + /// + /// The method used during the compression/decompression operation. + /// + public CompressionMethod Method { get { return mvarMethod; } } + + private CompressionMode mvarMode = CompressionMode.Compress; + /// + /// Whether the operation was a compression or a decompression. + /// + public CompressionMode Mode { get { return mvarMode; } } + + public CompressionFailureException(CompressionMethod method) + { + mvarMethod = method; + } + public CompressionFailureException(string message, CompressionMethod method) : base(message) + { + mvarMethod = method; + } + public CompressionFailureException(string message, Exception inner, CompressionMethod method) : base(message, inner) + { + mvarMethod = method; + } + public CompressionFailureException(CompressionMode mode) + { + mvarMode = mode; + } + public CompressionFailureException(string message, CompressionMode mode) : base(message) + { + mvarMode = mode; + } + public CompressionFailureException(string message, Exception inner, CompressionMode mode) : base(message, inner) + { + mvarMode = mode; + } + public CompressionFailureException(CompressionMethod method, CompressionMode mode) + { + mvarMethod = method; + mvarMode = mode; + } + public CompressionFailureException(string message, CompressionMethod method, CompressionMode mode) : base(message) + { + mvarMethod = method; + mvarMode = mode; + } + public CompressionFailureException(string message, Exception inner, CompressionMethod method, CompressionMode mode) : base(message, inner) + { + mvarMethod = method; + mvarMode = mode; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMethod.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMethod.cs new file mode 100644 index 00000000..f884dd05 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMethod.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression +{ + public enum CompressionMethod : sbyte + { + Unknown = -1, + None, + Bzip2, + Bzip2Solid, + Deflate, + Deflate64, + Gzip, + LZMA, + LZMASolid, + LZSS, + LZH, + LZW, + LZX, + PPPMd, + Quantum, + XMemLZX, + Zlib, + ZlibSolid + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMode.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMode.cs new file mode 100644 index 00000000..a1a01456 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionMode.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression +{ + public enum CompressionMode + { + Decompress, + Compress + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModule.cs new file mode 100644 index 00000000..4b12e2a7 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModule.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression +{ + public abstract class CompressionModule + { + public abstract string Name { get; } + + public virtual bool CanCompress { get { return true; } } + public virtual bool CanDecompress { get { return true; } } + + private bool mvarInitialized = false; + protected virtual void InitializeInternal() + { + } + + private void Initialize() + { + if (mvarInitialized) return; + InitializeInternal(); + mvarInitialized = true; + } + + public byte[] Compress(byte[] inputData) + { + System.IO.MemoryStream inputStream = new System.IO.MemoryStream(inputData); + System.IO.MemoryStream outputStream = new System.IO.MemoryStream(); + Compress(inputStream, outputStream); + outputStream.Close(); + return outputStream.ToArray(); + } + public byte[] Decompress(byte[] inputData) + { + System.IO.MemoryStream inputStream = new System.IO.MemoryStream(inputData); + System.IO.MemoryStream outputStream = new System.IO.MemoryStream(); + Decompress(inputStream, outputStream); + outputStream.Close(); + return outputStream.ToArray(); + } + public void Decompress(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + int inputLength = (int)inputStream.Length; + int outputLength = (int)outputStream.Length; + Decompress(inputStream, outputStream, inputLength, outputLength); + } + + public void Compress(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + Initialize(); + CompressInternal(inputStream, outputStream); + } + public void Decompress(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + Initialize(); + DecompressInternal(inputStream, outputStream, inputLength, outputLength); + } + + protected abstract void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream); + protected abstract void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength); + + public static CompressionModule FromKnownCompressionMethod(CompressionMethod method) + { + switch (method) + { + case CompressionMethod.Bzip2: return new Modules.Bzip2.Bzip2CompressionModule(); + case CompressionMethod.Deflate: return new Modules.Deflate.DeflateCompressionModule(); + case CompressionMethod.Gzip: return new Modules.Gzip.GzipCompressionModule(); + case CompressionMethod.LZSS: return new Modules.LZSS.LZSSCompressionModule(); + case CompressionMethod.LZX: return new Modules.LZX.LZXCompressionModule(); + case CompressionMethod.XMemLZX: return new Modules.XMemLZX.XMemLZXCompressionModule(); + case CompressionMethod.Zlib: return new Modules.Zlib.ZlibCompressionModule(); + } + throw new ArgumentException("Could not identify compression module for method " + method.ToString()); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModules.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModules.cs new file mode 100644 index 00000000..eac0aa1d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/CompressionModules.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression +{ + public static class CompressionModules + { + + private static Modules.Bzip2.Bzip2CompressionModule mvarBzip2 = new Modules.Bzip2.Bzip2CompressionModule(); + public static Modules.Bzip2.Bzip2CompressionModule Bzip2 { get { return mvarBzip2; } } + + private static Modules.Deflate.DeflateCompressionModule mvarDeflate = new Modules.Deflate.DeflateCompressionModule(); + public static Modules.Deflate.DeflateCompressionModule Deflate { get { return mvarDeflate; } } + + private static Modules.Gzip.GzipCompressionModule mvarGzip = new Modules.Gzip.GzipCompressionModule(); + public static Modules.Gzip.GzipCompressionModule Gzip { get { return mvarGzip; } } + + private static Modules.Zlib.ZlibCompressionModule mvarZlib = new Modules.Zlib.ZlibCompressionModule(); + public static Modules.Zlib.ZlibCompressionModule Zlib { get { return mvarZlib; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZ/LZ.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZ/LZ.cs new file mode 100644 index 00000000..915085fd --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZ/LZ.cs @@ -0,0 +1,484 @@ +// QuickLZ data compression library +// Copyright (C) 2006-2011 Lasse Mikkel Reinhold +// lar@quicklz.com +// +// QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything +// released into public must be open source) or under a commercial license if such +// has been acquired (see http://www.quicklz.com/order.html). The commercial license +// does not cover derived or ported versions created by third parties under GPL. +// +// Only a subset of the C library has been ported, namely level 1 and 3 not in +// streaming mode. +// +// Version: 1.5.0 final + +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.LZ +{ + public static class LZ + { + public const int QLZ_VERSION_MAJOR = 1; + public const int QLZ_VERSION_MINOR = 5; + public const int QLZ_VERSION_REVISION = 0; + + // Streaming mode not supported + public const int QLZ_STREAMING_BUFFER = 0; + + // Bounds checking not supported Use try...catch instead + public const int QLZ_MEMORY_SAFE = 0; + + // Decrease QLZ_POINTERS_3 to increase level 3 compression speed. Do not edit any other values! + private const int HASH_VALUES = 4096; + private const int MINOFFSET = 2; + private const int UNCONDITIONAL_MATCHLEN = 6; + private const int UNCOMPRESSED_END = 4; + private const int CWORD_LEN = 4; + private const int DEFAULT_HEADERLEN = 9; + private const int QLZ_POINTERS_1 = 1; + private const int QLZ_POINTERS_3 = 16; + + private static int headerLen(byte[] source) + { + return ((source[0] & 2) == 2) ? 9 : 3; + } + + public static int sizeDecompressed(byte[] source) + { + if (headerLen(source) == 9) + return source[5] | (source[6] << 8) | (source[7] << 16) | (source[8] << 24); + else + return source[2]; + } + + public static int sizeCompressed(byte[] source) + { + if (headerLen(source) == 9) + return source[1] | (source[2] << 8) | (source[3] << 16) | (source[4] << 24); + else + return source[1]; + } + + private static void write_header(byte[] dst, int level, bool compressible, int size_compressed, int size_decompressed) + { + dst[0] = (byte)(2 | (compressible ? 1 : 0)); + dst[0] |= (byte)(level << 2); + dst[0] |= (1 << 6); + dst[0] |= (0 << 4); + fast_write(dst, 1, size_decompressed, 4); + fast_write(dst, 5, size_compressed, 4); + } + + + + private static void fast_write(byte[] a, int i, int value, int numbytes) + { + for (int j = 0; j < numbytes; j++) + a[i + j] = (byte)(value >> (j * 8)); + } + + public static byte[] Compress(byte[] source, int level) + { + int src = 0; + int dst = DEFAULT_HEADERLEN + CWORD_LEN; + uint cword_val = 0x80000000; + int cword_ptr = DEFAULT_HEADERLEN; + byte[] destination = new byte[source.Length + 400]; + int[,] hashtable; + int[] cachetable = new int[HASH_VALUES]; + byte[] hash_counter = new byte[HASH_VALUES]; + byte[] d2; + int fetch = 0; + int last_matchstart = (source.Length - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END - 1); + int lits = 0; + + if (level != 1 && level != 3) + throw new ArgumentException("C# version only supports level 1 and 3"); + + if (level == 1) + hashtable = new int[HASH_VALUES, QLZ_POINTERS_1]; + else + hashtable = new int[HASH_VALUES, QLZ_POINTERS_3]; + + if (source.Length == 0) + return new byte[0]; + + if (src <= last_matchstart) + fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); + + while (src <= last_matchstart) + { + if ((cword_val & 1) == 1) + { + if (src > source.Length >> 1 && dst > src - (src >> 5)) + { + d2 = new byte[source.Length + DEFAULT_HEADERLEN]; + write_header(d2, level, false, source.Length, source.Length + DEFAULT_HEADERLEN); + System.Array.Copy(source, 0, d2, DEFAULT_HEADERLEN, source.Length); + return d2; + } + + fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), 4); + cword_ptr = dst; + dst += CWORD_LEN; + cword_val = 0x80000000; + } + + if (level == 1) + { + int hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); + int o = hashtable[hash, 0]; + int cache = cachetable[hash] ^ fetch; + cachetable[hash] = fetch; + hashtable[hash, 0] = src; + + if (cache == 0 && hash_counter[hash] != 0 && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > 3 && source[src] == source[src - 3] && source[src] == source[src - 2] && source[src] == source[src - 1] && source[src] == source[src + 1] && source[src] == source[src + 2]))) + { + cword_val = ((cword_val >> 1) | 0x80000000); + if (source[o + 3] != source[src + 3]) + { + int f = 3 - 2 | (hash << 4); + destination[dst + 0] = (byte)(f >> 0 * 8); + destination[dst + 1] = (byte)(f >> 1 * 8); + src += 3; + dst += 2; + } + else + { + int old_src = src; + int remaining = ((source.Length - UNCOMPRESSED_END - src + 1 - 1) > 255 ? 255 : (source.Length - UNCOMPRESSED_END - src + 1 - 1)); + + src += 4; + if (source[o + src - old_src] == source[src]) + { + src++; + if (source[o + src - old_src] == source[src]) + { + src++; + while (source[o + (src - old_src)] == source[src] && (src - old_src) < remaining) + src++; + } + } + + int matchlen = src - old_src; + + hash <<= 4; + if (matchlen < 18) + { + int f = (hash | (matchlen - 2)); + destination[dst + 0] = (byte)(f >> 0 * 8); + destination[dst + 1] = (byte)(f >> 1 * 8); + dst += 2; + } + else + { + fast_write(destination, dst, hash | (matchlen << 16), 3); + dst += 3; + } + } + fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); + lits = 0; + } + else + { + lits++; + hash_counter[hash] = 1; + destination[dst] = source[src]; + cword_val = (cword_val >> 1); + src++; + dst++; + fetch = ((fetch >> 8) & 0xffff) | (source[src + 2] << 16); + } + + } + else + { + fetch = source[src] | (source[src + 1] << 8) | (source[src + 2] << 16); + + int o, offset2; + int matchlen, k, m, best_k = 0; + byte c; + int remaining = ((source.Length - UNCOMPRESSED_END - src + 1 - 1) > 255 ? 255 : (source.Length - UNCOMPRESSED_END - src + 1 - 1)); + int hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); + + c = hash_counter[hash]; + matchlen = 0; + offset2 = 0; + for (k = 0; k < QLZ_POINTERS_3 && c > k; k++) + { + o = hashtable[hash, k]; + if ((byte)fetch == source[o] && (byte)(fetch >> 8) == source[o + 1] && (byte)(fetch >> 16) == source[o + 2] && o < src - MINOFFSET) + { + m = 3; + while (source[o + m] == source[src + m] && m < remaining) + m++; + if ((m > matchlen) || (m == matchlen && o > offset2)) + { + offset2 = o; + matchlen = m; + best_k = k; + } + } + } + o = offset2; + hashtable[hash, c & (QLZ_POINTERS_3 - 1)] = src; + c++; + hash_counter[hash] = c; + + if (matchlen >= 3 && src - o < 131071) + { + int offset = src - o; + + for (int u = 1; u < matchlen; u++) + { + fetch = source[src + u] | (source[src + u + 1] << 8) | (source[src + u + 2] << 16); + hash = ((fetch >> 12) ^ fetch) & (HASH_VALUES - 1); + c = hash_counter[hash]++; + hashtable[hash, c & (QLZ_POINTERS_3 - 1)] = src + u; + } + + src += matchlen; + cword_val = ((cword_val >> 1) | 0x80000000); + + if (matchlen == 3 && offset <= 63) + { + fast_write(destination, dst, offset << 2, 1); + dst++; + } + else if (matchlen == 3 && offset <= 16383) + { + fast_write(destination, dst, (offset << 2) | 1, 2); + dst += 2; + } + else if (matchlen <= 18 && offset <= 1023) + { + fast_write(destination, dst, ((matchlen - 3) << 2) | (offset << 6) | 2, 2); + dst += 2; + } + else if (matchlen <= 33) + { + fast_write(destination, dst, ((matchlen - 2) << 2) | (offset << 7) | 3, 3); + dst += 3; + } + else + { + fast_write(destination, dst, ((matchlen - 3) << 7) | (offset << 15) | 3, 4); + dst += 4; + } + lits = 0; + } + else + { + destination[dst] = source[src]; + cword_val = (cword_val >> 1); + src++; + dst++; + } + } + } + while (src <= source.Length - 1) + { + if ((cword_val & 1) == 1) + { + fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), 4); + cword_ptr = dst; + dst += CWORD_LEN; + cword_val = 0x80000000; + } + + destination[dst] = source[src]; + src++; + dst++; + cword_val = (cword_val >> 1); + } + while ((cword_val & 1) != 1) + { + cword_val = (cword_val >> 1); + } + fast_write(destination, cword_ptr, (int)((cword_val >> 1) | 0x80000000), CWORD_LEN); + write_header(destination, level, true, source.Length, dst); + d2 = new byte[dst]; + System.Array.Copy(destination, d2, dst); + return d2; + } + public static byte[] Decompress(byte[] source) + { + int level; + int size = sizeDecompressed(source); + int src = headerLen(source); + int dst = 0; + uint cword_val = 1; + byte[] destination = new byte[size]; + int[] hashtable = new int[4096]; + byte[] hash_counter = new byte[4096]; + int last_matchstart = size - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END - 1; + int last_hashed = -1; + int hash; + uint fetch = 0; + + level = (source[0] >> 2) & 0x3; + + if (level != 1 && level != 3) + throw new ArgumentException("C# version only supports level 1 and 3"); + + if ((source[0] & 1) != 1) + { + byte[] d2 = new byte[size]; + System.Array.Copy(source, headerLen(source), d2, 0, size); + return d2; + } + + for (; ; ) + { + if (cword_val == 1) + { + cword_val = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); + src += 4; + if (dst <= last_matchstart) + { + if (level == 1) + fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16)); + else + fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); + } + } + + if ((cword_val & 1) == 1) + { + uint matchlen; + uint offset2; + + cword_val = cword_val >> 1; + + if (level == 1) + { + hash = ((int)fetch >> 4) & 0xfff; + offset2 = (uint)hashtable[hash]; + + if ((fetch & 0xf) != 0) + { + matchlen = (fetch & 0xf) + 2; + src += 2; + } + else + { + matchlen = source[src + 2]; + src += 3; + } + } + else + { + uint offset; + if ((fetch & 3) == 0) + { + offset = (fetch & 0xff) >> 2; + matchlen = 3; + src++; + } + else if ((fetch & 2) == 0) + { + offset = (fetch & 0xffff) >> 2; + matchlen = 3; + src += 2; + } + else if ((fetch & 1) == 0) + { + offset = (fetch & 0xffff) >> 6; + matchlen = ((fetch >> 2) & 15) + 3; + src += 2; + } + else if ((fetch & 127) != 3) + { + offset = (fetch >> 7) & 0x1ffff; + matchlen = ((fetch >> 2) & 0x1f) + 2; + src += 3; + } + else + { + offset = (fetch >> 15); + matchlen = ((fetch >> 7) & 255) + 3; + src += 4; + } + offset2 = (uint)(dst - offset); + } + + destination[dst + 0] = destination[offset2 + 0]; + destination[dst + 1] = destination[offset2 + 1]; + destination[dst + 2] = destination[offset2 + 2]; + + for (int i = 3; i < matchlen; i += 1) + { + destination[dst + i] = destination[offset2 + i]; + } + + dst += (int)matchlen; + + if (level == 1) + { + fetch = (uint)(destination[last_hashed + 1] | (destination[last_hashed + 2] << 8) | (destination[last_hashed + 3] << 16)); + while (last_hashed < dst - matchlen) + { + last_hashed++; + hash = (int)(((fetch >> 12) ^ fetch) & (HASH_VALUES - 1)); + hashtable[hash] = last_hashed; + hash_counter[hash] = 1; + fetch = (uint)(fetch >> 8 & 0xffff | destination[last_hashed + 3] << 16); + } + fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16)); + } + else + { + fetch = (uint)(source[src] | (source[src + 1] << 8) | (source[src + 2] << 16) | (source[src + 3] << 24)); + } + last_hashed = dst - 1; + } + else + { + if (dst <= last_matchstart) + { + destination[dst] = source[src]; + dst += 1; + src += 1; + cword_val = cword_val >> 1; + + if (level == 1) + { + while (last_hashed < dst - 3) + { + last_hashed++; + int fetch2 = destination[last_hashed] | (destination[last_hashed + 1] << 8) | (destination[last_hashed + 2] << 16); + hash = ((fetch2 >> 12) ^ fetch2) & (HASH_VALUES - 1); + hashtable[hash] = last_hashed; + hash_counter[hash] = 1; + } + fetch = (uint)(fetch >> 8 & 0xffff | source[src + 2] << 16); + } + else + { + fetch = (uint)(fetch >> 8 & 0xffff | source[src + 2] << 16 | source[src + 3] << 24); + } + } + else + { + while (dst <= size - 1) + { + if (cword_val == 1) + { + src += CWORD_LEN; + cword_val = 0x80000000; + } + + destination[dst] = source[src]; + dst++; + src++; + cword_val = cword_val >> 1; + } + return destination; + } + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZH/LZHStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZH/LZHStream.cs new file mode 100644 index 00000000..1edea49d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZH/LZHStream.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.LZH +{ + public class LZHStream + { + public static byte[] Compress(byte[] input) + { + return input; + } + public static byte[] Decompress(byte[] input) + { + return input; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZMA/LZMAStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZMA/LZMAStream.cs new file mode 100644 index 00000000..e85475be --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZMA/LZMAStream.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.LZMA +{ + public class LZMAStream : Stream + { + public override long Position + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + public override long Length + { + get + { + throw new NotImplementedException(); + } + } + public override bool CanWrite + { + get + { + throw new NotImplementedException(); + } + } + public override bool CanSeek + { + get + { + throw new NotImplementedException(); + } + } + public override bool CanRead + { + get + { + throw new NotImplementedException(); + } + } + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + public override void Flush() + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZPL2/LZPL2CompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZPL2/LZPL2CompressionModule.cs new file mode 100644 index 00000000..acc98b05 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZPL2/LZPL2CompressionModule.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.LZPL2 +{ + public class LZPL2CompressionModule + { + private int mvarBufferSize = 4096; + public int BufferSize { get { return mvarBufferSize; } set { mvarBufferSize = value; } } + + private static LZPL2CompressionModule mvarDefaultModule = new LZPL2CompressionModule(); + public static LZPL2CompressionModule DefaultModule { get { return mvarDefaultModule; } } + + public byte[] Decompress(byte[] data, uint decompressedSize) + { + byte[] buffer = new byte[mvarBufferSize]; + byte mask = 0, flags = 0, x = 0, y = 0, b = 0; + + uint srcpos = 0, dstpos = 0; + + byte[] decompressedData = new byte[decompressedSize]; + while ((srcpos < data.Length) && (dstpos < decompressedData.Length)) + { + if (mask == 0) + { + flags = data[srcpos++]; + if (srcpos >= data.Length) break; + mask = 1; + } + + if ((flags & mask) != 0) + { + // Raw byte + buffer[dstpos % mvarBufferSize] = data[srcpos]; + decompressedData[dstpos++] = data[srcpos++]; + } + else + { + // Pointer: 0xAB 0xCD (CAB=pointer, D=length) + x = data[srcpos++]; + y = data[srcpos++]; + + int off = (((y & 0xf0) << 4) | x) + 18; + int len = (y & 0x0f) + 3; + + while ((len-- > 0) && (dstpos < decompressedData.Length)) + { + b = buffer[off++ % mvarBufferSize]; + buffer[dstpos % mvarBufferSize] = b; + decompressedData[dstpos++] = b; + } + } + mask <<= 1; + } + return decompressedData; + } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSS2.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSS2.cs new file mode 100644 index 00000000..77584b72 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSS2.cs @@ -0,0 +1,277 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.LZSS +{ + public class LZSS2 + { + class LzWindowDictionary + { + int WindowSize = 0x1000; + int WindowStart = 0; + int WindowLength = 0; + int MinMatchAmount = 3; + int MaxMatchAmount = 18; + int BlockSize = 0; + List[] OffsetList; + + public LzWindowDictionary() + { + // Build the offset list, so Lz compression will become significantly faster + OffsetList = new List[0x100]; + for (int i = 0; i < OffsetList.Length; i++) + OffsetList[i] = new List(); + } + + public int[] Search(byte[] DecompressedData, uint offset, uint length) + { + RemoveOldEntries(DecompressedData[offset]); // Remove old entries for this index + + if (offset < MinMatchAmount || length - offset < MinMatchAmount) // Can't find matches if there isn't enough data + return new int[] { 0, 0 }; + + // Start finding matches + int[] Match = new int[] { 0, 0 }; + int MatchStart; + int MatchSize; + + for (int i = OffsetList[DecompressedData[offset]].Count - 1; i >= 0; i--) + { + MatchStart = OffsetList[DecompressedData[offset]][i]; + MatchSize = 1; + + while (MatchSize < MaxMatchAmount && MatchSize < WindowLength && MatchStart + MatchSize < offset && offset + MatchSize < length && DecompressedData[offset + MatchSize] == DecompressedData[MatchStart + MatchSize]) + MatchSize++; + + if (MatchSize >= MinMatchAmount && MatchSize > Match[1]) // This is a good match + { + Match = new int[] { (int)(offset - MatchStart), MatchSize }; + + if (MatchSize == MaxMatchAmount) // Don't look for more matches + break; + } + } + + // Return the match. + // If no match was made, the distance & length pair will be zero + return Match; + } + + // Slide the window + public void SlideWindow(int Amount) + { + if (WindowLength == WindowSize) + WindowStart += Amount; + else + { + if (WindowLength + Amount <= WindowSize) + WindowLength += Amount; + else + { + Amount -= (WindowSize - WindowLength); + WindowLength = WindowSize; + WindowStart += Amount; + } + } + } + + // Slide the window to the next block + public void SlideBlock() + { + WindowStart += BlockSize; + } + + // Remove old entries + private void RemoveOldEntries(byte index) + { + for (int i = 0; i < OffsetList[index].Count; ) // Don't increment i + { + if (OffsetList[index][i] >= WindowStart) + break; + else + OffsetList[index].RemoveAt(0); + } + } + + // Set variables + public void SetWindowSize(int size) + { + WindowSize = size; + } + public void SetMinMatchAmount(int amount) + { + MinMatchAmount = amount; + } + public void SetMaxMatchAmount(int amount) + { + MaxMatchAmount = amount; + } + public void SetBlockSize(int size) + { + BlockSize = size; + WindowLength = size; // The window will work in blocks now + } + + // Add entries + public void AddEntry(byte[] DecompressedData, int offset) + { + OffsetList[DecompressedData[offset]].Add(offset); + } + public void AddEntryRange(byte[] DecompressedData, int offset, int length) + { + for (int i = 0; i < length; i++) + AddEntry(DecompressedData, offset + i); + } + } + + public class LZSS + { + + /* Decompress */ + public static byte[] Decompress(byte[] data) + { + // Compressed & Decompressed Data Information + uint CompressedSize = (uint)data.Length; + uint DecompressedSize = (uint)(data[0] + data[1]*256); + + uint SourcePointer = 0x4; + uint DestPointer = 0x0; + + byte[] CompressedData = data; + byte[] DecompressedData = new byte[DecompressedSize]; + + // Start Decompression + while (SourcePointer < CompressedSize && DestPointer < DecompressedSize) + { + byte Flag = CompressedData[SourcePointer]; // Compression Flag + SourcePointer++; + + for (int i = 7; i >= 0; i--) + { + if ((Flag & (1 << i)) == 0) // Data is not compressed + { + DecompressedData[DestPointer] = CompressedData[SourcePointer]; + SourcePointer++; + DestPointer++; + } + else // Data is compressed + { + int Distance = (((CompressedData[SourcePointer] & 0xF) << 8) | CompressedData[SourcePointer + 1]) + 1; + int Amount = (CompressedData[SourcePointer] >> 4) + 3; + SourcePointer += 2; + + // Copy the data + for (int j = 0; j < Amount; j++) + { + DecompressedData[DestPointer + j] = DecompressedData[DestPointer - Distance + j]; + } + DestPointer += (uint)Amount; + } + + // Check for out of range + if (SourcePointer >= CompressedSize || DestPointer >= DecompressedSize) break; + } + } + + return DecompressedData; + } + + /* Compress */ + public static byte[] Compress(byte[] DecompressedData, string filename) + { + try + { + uint DecompressedSize = (uint)DecompressedData.Length; + + System.IO.MemoryStream CompressedData = new System.IO.MemoryStream(); + + uint SourcePointer = 0x0; + uint DestPointer = 0x4; + + // Test if the file is too large to be compressed + if (DecompressedData.Length > 0xFFFFFF) + throw new Exception("Input file is too large to compress."); + + // Set up the Lz Compression Dictionary + LzWindowDictionary LzDictionary = new LzWindowDictionary(); + LzDictionary.SetWindowSize(0x1000); + LzDictionary.SetMaxMatchAmount(0xF + 3); + + // Start compression + CompressedData.Write((uint)('\x10' | (DecompressedSize << 8))); + while (SourcePointer < DecompressedSize) + { + byte Flag = 0x0; + uint FlagPosition = DestPointer; + CompressedData.WriteByte(Flag); // It will be filled in later + DestPointer++; + + for (int i = 7; i >= 0; i--) + { + int[] LzSearchMatch = LzDictionary.Search(DecompressedData, SourcePointer, DecompressedSize); + if (LzSearchMatch[1] > 0) // There is a compression match + { + Flag |= (byte)(1 << i); + + CompressedData.WriteByte((byte)((((LzSearchMatch[1] - 3) & 0xF) << 4) | (((LzSearchMatch[0] - 1) & 0xFFF) >> 8))); + CompressedData.WriteByte((byte)((LzSearchMatch[0] - 1) & 0xFF)); + + LzDictionary.AddEntryRange(DecompressedData, (int)SourcePointer, LzSearchMatch[1]); + LzDictionary.SlideWindow(LzSearchMatch[1]); + + SourcePointer += (uint)LzSearchMatch[1]; + DestPointer += 2; + } + else // There wasn't a match + { + Flag |= (byte)(0 << i); + + CompressedData.WriteByte(DecompressedData[SourcePointer]); + + LzDictionary.AddEntry(DecompressedData, (int)SourcePointer); + LzDictionary.SlideWindow(1); + + SourcePointer++; + DestPointer++; + } + + // Check for out of bounds + if (SourcePointer >= DecompressedSize) + break; + } + + // Write the flag. + // Note that the original position gets reset after writing. + CompressedData.Seek(FlagPosition, System.IO.SeekOrigin.Begin); + CompressedData.WriteByte(Flag); + CompressedData.Seek(DestPointer, System.IO.SeekOrigin.Begin); + } + + return CompressedData.ToArray(); + } + catch + { + return null; // An error occured while compressing + } + } + + // Check + public static bool Check(byte[] data, string filename) + { + try + { + // Because this can conflict with other compression formats we are going to add a check them too + return (data.Length > 1 && data[0] == 0x10); //&& + //!Compression.Dictionary[CompressionFormat.PRS].Check(ref data, filename) && + //!Images.Dictionary[GraphicFormat.PVR].Check(ref data, filename)); + } + catch + { + return false; + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSSCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSSCompressionModule.cs new file mode 100644 index 00000000..0f3fb17c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZSS/LZSSCompressionModule.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using UniversalEditor.Compression.Common; + +namespace UniversalEditor.Compression.Modules.LZSS +{ + public class LZSSCompressionModule : CompressionModule + { + public override string Name + { + get { return "lzss"; } + } + protected override void DecompressInternal(Stream inputStream, Stream outputStream, int inputLength, int outputLength) + { + MT19937ar myMT19937ar = new MT19937ar(); + uint act_outputLength = 0u; + uint nActWindowByte = 4080u; + byte[] win = new byte[4096]; + ushort flag = 0; + uint[] init_key = new uint[4]; + byte[] rnd = new byte[1024]; + init_key[0] = ((uint)outputLength | 128u) >> 5; + init_key[1] = ((uint)outputLength << 9 | 6u); + init_key[2] = ((uint)outputLength << 6 | 4u); + init_key[3] = ((uint)outputLength | 72u) >> 3; + myMT19937ar.init_by_array(init_key, 4); + for (uint i = 0u; i < 1024u; i += 1u) + { + rnd[(int)(i)] = (byte)(myMT19937ar.genrand_int32() >> (int)(i % 7u)); + } + uint seed = (uint)outputLength / 1000u % 10u + (uint)outputLength / 100u % 10u + (uint)outputLength / 10u % 10u + (uint)outputLength % 10u & 794u; + win.Initialize(); + byte[] result; + while (act_outputLength < outputLength) + { + flag = (ushort)(flag >> 1); + if (act_outputLength < 32860u) + { + goto IL_EE; + } + IL_EE: + if ((flag & 256) == 0) + { + seed = (seed + 1u & 1023u); + flag = (ushort)((inputStream.ReadByte() ^ rnd[(int)(seed)]) | 65280); + } + seed = (seed + 1u & 1023u); + byte data; + if ((flag & 1) == 0) + { + uint win_offset = (uint)(inputStream.ReadByte() ^ rnd[(int)(seed)]); + seed = (seed + 1u & 1023u); + uint copy_bytes = (uint)(inputStream.ReadByte() ^ rnd[(int)(seed)]); + win_offset |= (copy_bytes & 240u) << 4; + copy_bytes &= 15u; + copy_bytes += 3u; + for (uint i = 0u; i < copy_bytes; i += 1u) + { + data = win[(int)((win_offset + i & 4095u))]; + outputStream.WriteByte(data); + win[(int)((nActWindowByte++))] = data; + nActWindowByte &= 4095u; + if (act_outputLength >= outputLength) return; + } + continue; + } + data = (byte)(inputStream.ReadByte() ^ rnd[(int)(seed)]); + outputStream.WriteByte(data); + win[(int)((nActWindowByte++))] = data; + nActWindowByte &= 4095u; + } + } + protected override void CompressInternal(Stream inputStream, Stream outputStream) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZW/Internal/Element.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZW/Internal/Element.cs new file mode 100644 index 00000000..3f83c1bf --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZW/Internal/Element.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.LZW.Internal +{ + internal struct Element + { + public int prefix; + public int suffix; + public Element(int _prefix, int _suffix) + { + this.prefix = _prefix; + this.suffix = _suffix; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/LZW/LZWStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/LZW/LZWStream.cs new file mode 100644 index 00000000..f67c65ff --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/LZW/LZWStream.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Collections; + +using UniversalEditor.Compression.LZW.Internal; + +namespace UniversalEditor.Compression.LZW +{ + public class LZWStream + { + private const int MAX_CODES = 4096; + private const int BYTE_SIZE = 8; + private const int EXCESS = 4; + private const int ALPHA = 256; + private const int MASK1 = 255; + private const int MASK2 = 15; + private static int c_leftOver; + private static bool c_bitsLeftOver; + private static int[] s; + private static int size; + private static int d_leftOver; + private static bool d_bitsLeftOver; + private static int d_size = 0; + private static Element[] h; + private static void COutput(int pcode, MemoryStream out_Renamed) + { + if (LZWStream.c_bitsLeftOver) + { + int d = pcode & 255; + int c = (LZWStream.c_leftOver << 4) + (pcode >> 8); + out_Renamed.WriteByte((byte)c); + out_Renamed.WriteByte((byte)d); + LZWStream.c_bitsLeftOver = false; + } + else + { + LZWStream.c_leftOver = (pcode & 15); + int c = pcode >> 4; + out_Renamed.WriteByte((byte)c); + LZWStream.c_bitsLeftOver = true; + } + } + public static byte[] Compress(string input) + { + return LZWStream.Compress(input, Encoding.Default); + } + public static byte[] Compress(string input, Encoding encoding) + { + return LZWStream.Compress(encoding.GetBytes(input)); + } + public static byte[] Compress(byte[] input) + { + Hashtable table = new Hashtable(); + for (int i = 0; i < 256; i++) + { + table.Add(i, i); + } + int codeUsed = 256; + MemoryStream in_Renamed = new MemoryStream(input); + MemoryStream out_Renamed = new MemoryStream(); + int c = in_Renamed.ReadByte(); + if (c != -1) + { + int pcode = c; + c = in_Renamed.ReadByte(); + while (in_Renamed.Position < in_Renamed.Length) + { + int j = (pcode << 8) + c; + if (!table.ContainsKey(j)) + { + LZWStream.COutput(pcode, out_Renamed); + if (codeUsed < 4096) + { + table.Add((pcode << 8) + c, codeUsed++); + } + pcode = c; + } + else + { + int e = (int)table[j]; + pcode = e; + } + c = in_Renamed.ReadByte(); + } + LZWStream.COutput(pcode, out_Renamed); + if (LZWStream.c_bitsLeftOver) + { + out_Renamed.WriteByte((byte)(LZWStream.c_leftOver << 4)); + } + } + in_Renamed.Close(); + out_Renamed.Flush(); + out_Renamed.Close(); + return out_Renamed.ToArray(); + } + public static byte[] Decompress(byte[] input) + { + MemoryStream in_Renamed = new MemoryStream(input); + MemoryStream out_Renamed = new MemoryStream(); + int codeUsed = 256; + LZWStream.s = new int[4096]; + LZWStream.h = new Element[4096]; + int pcode = LZWStream.DGetCode(in_Renamed); + if (pcode >= 0) + { + LZWStream.s[0] = pcode; + out_Renamed.WriteByte((byte)LZWStream.s[0]); + LZWStream.size = 0; + while (true) + { + int ccode = LZWStream.DGetCode(in_Renamed); + if (ccode < 0) + { + break; + } + if (ccode < codeUsed) + { + LZWStream.DOutput(ccode, out_Renamed); + if (codeUsed < 4096) + { + LZWStream.h[codeUsed++] = new Element(pcode, LZWStream.s[LZWStream.size]); + } + } + else + { + LZWStream.h[codeUsed++] = new Element(pcode, LZWStream.s[LZWStream.size]); + LZWStream.DOutput(ccode, out_Renamed); + } + pcode = ccode; + } + } + out_Renamed.Flush(); + out_Renamed.Close(); + in_Renamed.Close(); + return out_Renamed.ToArray(); + } + private static void DOutput(int code, MemoryStream out_Renamed) + { + LZWStream.d_size = -1; + while (code >= 256) + { + LZWStream.s[++LZWStream.d_size] = LZWStream.h[code].suffix; + code = LZWStream.h[code].prefix; + } + LZWStream.s[++LZWStream.d_size] = code; + for (int i = LZWStream.d_size; i >= 0; i--) + { + out_Renamed.WriteByte((byte)LZWStream.s[i]); + } + } + private static int DGetCode(MemoryStream in_Renamed) + { + int c = in_Renamed.ReadByte(); + int result; + if (c == -1) + { + result = -1; + } + else + { + int code; + if (LZWStream.d_bitsLeftOver) + { + code = (LZWStream.d_leftOver << 8) + c; + } + else + { + int d = in_Renamed.ReadByte(); + code = (c << 4) + (d >> 4); + LZWStream.d_leftOver = (d & 15); + } + LZWStream.d_bitsLeftOver = !LZWStream.d_bitsLeftOver; + result = code; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Bzip2CompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Bzip2CompressionModule.cs new file mode 100644 index 00000000..bcfad7a9 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Bzip2CompressionModule.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.Modules.Bzip2 +{ + public class Bzip2CompressionModule : CompressionModule + { + private string mvarName = "bzip2"; + public override string Name { get { return mvarName; } } + + public byte[] Compress(byte[] inputData, int level) + { + MemoryStream msIn = new MemoryStream(inputData); + MemoryStream msOut = new MemoryStream(); + Compress(msIn, msOut, level); + return msOut.ToArray(); + } + + public void Compress(System.IO.Stream inputStream, System.IO.Stream outputStream, int level) + { + ICSharpCode.SharpZipLib.BZip2.BZip2.Compress(inputStream, outputStream, false, level); + } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + Compress(inputStream, outputStream, 5); + } + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + ICSharpCode.SharpZipLib.BZip2.BZip2.Decompress(inputStream, outputStream, false); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2.cs new file mode 100644 index 00000000..252b648d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2.cs @@ -0,0 +1,105 @@ +// BZip2.cs +// +// Copyright (C) 2010 David Pierson +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +// Suppress this in CF and 1.1, not needed. Static classes introduced in C# version 2.0 +#if !NETCF_2_0 && !NET_1_1 + +using System; +using System.IO; + +namespace ICSharpCode.SharpZipLib.BZip2 { + + /// + /// An example class to demonstrate compression and decompression of BZip2 streams. + /// + internal static class BZip2 + { + /// + /// Decompress the input writing + /// uncompressed data to the output stream + /// + /// The readable stream containing data to decompress. + /// The output stream to receive the decompressed data. + /// Both streams are closed on completion if true. + public static void Decompress(Stream inStream, Stream outStream, bool isStreamOwner) + { + if (inStream == null || outStream == null) { + throw new Exception("Null Stream"); + } + + try { + using (BZip2InputStream bzipInput = new BZip2InputStream(inStream)) { + bzipInput.IsStreamOwner = isStreamOwner; + Core.StreamUtils.Copy(bzipInput, outStream, new byte[4096]); + } + } finally { + if (isStreamOwner) { + // inStream is closed by the BZip2InputStream if stream owner + outStream.Close(); + } + } + } + + /// + /// Compress the input stream sending + /// result data to output stream + /// + /// The readable stream to compress. + /// The output stream to receive the compressed data. + /// Both streams are closed on completion if true. + /// Block size acts as compression level (1 to 9) with 1 giving + /// the lowest compression and 9 the highest. + public static void Compress(Stream inStream, Stream outStream, bool isStreamOwner, int level) + { + if (inStream == null || outStream == null) { + throw new Exception("Null Stream"); + } + + try { + using (BZip2OutputStream bzipOutput = new BZip2OutputStream(outStream, level)) { + bzipOutput.IsStreamOwner = isStreamOwner; + Core.StreamUtils.Copy(inStream, bzipOutput, new byte[4096]); + } + } finally { + if (isStreamOwner) { + // outStream is closed by the BZip2OutputStream if stream owner + inStream.Close(); + } + } + } + + } +} +#endif diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Constants.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Constants.cs new file mode 100644 index 00000000..ad3f40d7 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Constants.cs @@ -0,0 +1,197 @@ +// BZip2Constants.cs +// Copyright (C) 2001 Mike Krueger +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +namespace ICSharpCode.SharpZipLib.BZip2 +{ + + /// + /// Defines internal values for both compression and decompression + /// + internal sealed class BZip2Constants + { + /// + /// Random numbers used to randomise repetitive blocks + /// + public readonly static int[] RandomNumbers = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 + }; + + /// + /// When multiplied by compression parameter (1-9) gives the block size for compression + /// 9 gives the best compression but uses the most memory. + /// + public const int BaseBlockSize = 100000; + + /// + /// Backend constant + /// + public const int MaximumAlphaSize = 258; + + /// + /// Backend constant + /// + public const int MaximumCodeLength = 23; + + /// + /// Backend constant + /// + public const int RunA = 0; + + /// + /// Backend constant + /// + public const int RunB = 1; + + /// + /// Backend constant + /// + public const int GroupCount = 6; + + /// + /// Backend constant + /// + public const int GroupSize = 50; + + /// + /// Backend constant + /// + public const int NumberOfIterations = 4; + + /// + /// Backend constant + /// + public const int MaximumSelectors = (2 + (900000 / GroupSize)); + + /// + /// Backend constant + /// + public const int OvershootBytes = 20; + + private BZip2Constants() + { + } + } +} + +/* This file was derived from a file containing this license: + * + * This file is a part of bzip2 and/or libbzip2, a program and + * library for lossless, block-sorting data compression. + * + * Copyright (C) 1996-1998 Julian R Seward. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. The origin of this software must not be misrepresented; you must + * not claim that you wrote the original software. If you use this + * software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 3. Altered source versions must be plainly marked as such, and must + * not be misrepresented as being the original software. + * + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Java version ported by Keiron Liddle, Aftex Software 1999-2001 + */ diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Exception.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Exception.cs new file mode 100644 index 00000000..f92c0697 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2Exception.cs @@ -0,0 +1,90 @@ +// BZip2.cs +// +// Copyright 2004 John Reilly +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +using System; + +#if !NETCF_1_0 && !NETCF_2_0 +using System.Runtime.Serialization; +#endif + +namespace ICSharpCode.SharpZipLib.BZip2 +{ + /// + /// BZip2Exception represents exceptions specific to Bzip2 algorithm + /// +#if !NETCF_1_0 && !NETCF_2_0 + [Serializable] +#endif + internal class BZip2Exception : Exception + { + +#if !NETCF_1_0 && !NETCF_2_0 + /// + /// Deserialization constructor + /// + /// for this constructor + /// for this constructor + protected BZip2Exception(SerializationInfo info, StreamingContext context) + : base(info, context) + + { + } +#endif + /// + /// Initialise a new instance of BZip2Exception. + /// + public BZip2Exception() + { + } + + /// + /// Initialise a new instance of BZip2Exception with its message set to message. + /// + /// The message describing the error. + public BZip2Exception(string message) : base(message) + { + } + + /// + /// Initialise an instance of BZip2Exception + /// + /// A message describing the error. + /// The exception that is the cause of the current exception. + public BZip2Exception(string message, Exception exception) + : base(message, exception) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2InputStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2InputStream.cs new file mode 100644 index 00000000..4f57a104 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2InputStream.cs @@ -0,0 +1,1113 @@ +// BZip2InputStream.cs +// +// Copyright (C) 2001 Mike Krueger +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +using System; +using System.IO; + +using UniversalEditor.Checksum; +using UniversalEditor.Checksum.Modules; +using UniversalEditor.Checksum.Modules.StrangeCRC; + +namespace ICSharpCode.SharpZipLib.BZip2 +{ + + /// + /// An input stream that decompresses files in the BZip2 format + /// + internal class BZip2InputStream : Stream + { + #region Constants + const int START_BLOCK_STATE = 1; + const int RAND_PART_A_STATE = 2; + const int RAND_PART_B_STATE = 3; + const int RAND_PART_C_STATE = 4; + const int NO_RAND_PART_A_STATE = 5; + const int NO_RAND_PART_B_STATE = 6; + const int NO_RAND_PART_C_STATE = 7; + #endregion + #region Constructors + /// + /// Construct instance for reading from stream + /// + /// Data source + public BZip2InputStream(Stream stream) + { + // init arrays + for (int i = 0; i < BZip2Constants.GroupCount; ++i) + { + limit[i] = new int[BZip2Constants.MaximumAlphaSize]; + baseArray[i] = new int[BZip2Constants.MaximumAlphaSize]; + perm[i] = new int[BZip2Constants.MaximumAlphaSize]; + } + + BsSetStream(stream); + Initialize(); + InitBlock(); + SetupBlock(); + } + + #endregion + + /// + /// Get/set flag indicating ownership of underlying stream. + /// When the flag is true will close the underlying stream also. + /// + public bool IsStreamOwner + { + get { return isStreamOwner; } + set { isStreamOwner = value; } + } + + + #region Stream Overrides + /// + /// Gets a value indicating if the stream supports reading + /// + public override bool CanRead + { + get + { + return baseStream.CanRead; + } + } + + /// + /// Gets a value indicating whether the current stream supports seeking. + /// + public override bool CanSeek + { + get + { + return baseStream.CanSeek; + } + } + + /// + /// Gets a value indicating whether the current stream supports writing. + /// This property always returns false + /// + public override bool CanWrite + { + get + { + return false; + } + } + + /// + /// Gets the length in bytes of the stream. + /// + public override long Length + { + get + { + return baseStream.Length; + } + } + + /// + /// Gets or sets the streams position. + /// Setting the position is not supported and will throw a NotSupportException + /// + /// Any attempt to set the position + public override long Position + { + get + { + return baseStream.Position; + } + set + { + throw new NotSupportedException("BZip2InputStream position cannot be set"); + } + } + + /// + /// Flushes the stream. + /// + public override void Flush() + { + if (baseStream != null) + { + baseStream.Flush(); + } + } + + /// + /// Set the streams position. This operation is not supported and will throw a NotSupportedException + /// + /// A byte offset relative to the parameter. + /// A value of type indicating the reference point used to obtain the new position. + /// The new position of the stream. + /// Any access + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException("BZip2InputStream Seek not supported"); + } + + /// + /// Sets the length of this stream to the given value. + /// This operation is not supported and will throw a NotSupportedExceptionortedException + /// + /// The new length for the stream. + /// Any access + public override void SetLength(long value) + { + throw new NotSupportedException("BZip2InputStream SetLength not supported"); + } + + /// + /// Writes a block of bytes to this stream using data from a buffer. + /// This operation is not supported and will throw a NotSupportedException + /// + /// The buffer to source data from. + /// The offset to start obtaining data from. + /// The number of bytes of data to write. + /// Any access + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException("BZip2InputStream Write not supported"); + } + + /// + /// Writes a byte to the current position in the file stream. + /// This operation is not supported and will throw a NotSupportedException + /// + /// The value to write. + /// Any access + public override void WriteByte(byte value) + { + throw new NotSupportedException("BZip2InputStream WriteByte not supported"); + } + + /// + /// Read a sequence of bytes and advances the read position by one byte. + /// + /// Array of bytes to store values in + /// Offset in array to begin storing data + /// The maximum number of bytes to read + /// The total number of bytes read into the buffer. This might be less + /// than the number of bytes requested if that number of bytes are not + /// currently available or zero if the end of the stream is reached. + /// + public override int Read(byte[] buffer, int offset, int count) + { + if (buffer == null) + { + throw new ArgumentNullException("buffer"); + } + + for (int i = 0; i < count; ++i) + { + int rb = ReadByte(); + if (rb == -1) + { + return i; + } + buffer[offset + i] = (byte)rb; + } + return count; + } + + /// + /// Closes the stream, releasing any associated resources. + /// + public override void Close() + { + if (IsStreamOwner && (baseStream != null)) + { + baseStream.Close(); + } + } + /// + /// Read a byte from stream advancing position + /// + /// byte read or -1 on end of stream + public override int ReadByte() + { + if (streamEnd) + { + return -1; // ok + } + + int retChar = currentChar; + switch (currentState) + { + case RAND_PART_B_STATE: + SetupRandPartB(); + break; + case RAND_PART_C_STATE: + SetupRandPartC(); + break; + case NO_RAND_PART_B_STATE: + SetupNoRandPartB(); + break; + case NO_RAND_PART_C_STATE: + SetupNoRandPartC(); + break; + case START_BLOCK_STATE: + case NO_RAND_PART_A_STATE: + case RAND_PART_A_STATE: + break; + default: + break; + } + return retChar; + } + + #endregion + + void MakeMaps() + { + nInUse = 0; + for (int i = 0; i < 256; ++i) + { + if (inUse[i]) + { + seqToUnseq[nInUse] = (byte)i; + unseqToSeq[i] = (byte)nInUse; + nInUse++; + } + } + } + + void Initialize() + { + char magic1 = BsGetUChar(); + char magic2 = BsGetUChar(); + + char magic3 = BsGetUChar(); + char magic4 = BsGetUChar(); + + if (magic1 != 'B' || magic2 != 'Z' || magic3 != 'h' || magic4 < '1' || magic4 > '9') + { + streamEnd = true; + return; + } + + SetDecompressStructureSizes(magic4 - '0'); + computedCombinedCRC = 0; + } + + void InitBlock() + { + char magic1 = BsGetUChar(); + char magic2 = BsGetUChar(); + char magic3 = BsGetUChar(); + char magic4 = BsGetUChar(); + char magic5 = BsGetUChar(); + char magic6 = BsGetUChar(); + + if (magic1 == 0x17 && magic2 == 0x72 && magic3 == 0x45 && magic4 == 0x38 && magic5 == 0x50 && magic6 == 0x90) + { + Complete(); + return; + } + + if (magic1 != 0x31 || magic2 != 0x41 || magic3 != 0x59 || magic4 != 0x26 || magic5 != 0x53 || magic6 != 0x59) + { + BadBlockHeader(); + streamEnd = true; + return; + } + + storedBlockCRC = BsGetInt32(); + + blockRandomised = (BsR(1) == 1); + + GetAndMoveToFrontDecode(); + + mCrc.Reset(); + currentState = START_BLOCK_STATE; + } + + void EndBlock() + { + computedBlockCRC = (int)mCrc.Value; + + // -- A bad CRC is considered a fatal error. -- + if (storedBlockCRC != computedBlockCRC) + { + CrcError(); + } + + // 1528150659 + computedCombinedCRC = ((computedCombinedCRC << 1) & 0xFFFFFFFF) | (computedCombinedCRC >> 31); + computedCombinedCRC = computedCombinedCRC ^ (uint)computedBlockCRC; + } + + void Complete() + { + storedCombinedCRC = BsGetInt32(); + if (storedCombinedCRC != (int)computedCombinedCRC) + { + CrcError(); + } + + streamEnd = true; + } + + void BsSetStream(Stream stream) + { + baseStream = stream; + bsLive = 0; + bsBuff = 0; + } + + void FillBuffer() + { + int thech = 0; + + try + { + thech = baseStream.ReadByte(); + } + catch (Exception) + { + CompressedStreamEOF(); + } + + if (thech == -1) + { + CompressedStreamEOF(); + } + + bsBuff = (bsBuff << 8) | (thech & 0xFF); + bsLive += 8; + } + + int BsR(int n) + { + while (bsLive < n) + { + FillBuffer(); + } + + int v = (bsBuff >> (bsLive - n)) & ((1 << n) - 1); + bsLive -= n; + return v; + } + + char BsGetUChar() + { + return (char)BsR(8); + } + + int BsGetIntVS(int numBits) + { + return BsR(numBits); + } + + int BsGetInt32() + { + int result = BsR(8); + result = (result << 8) | BsR(8); + result = (result << 8) | BsR(8); + result = (result << 8) | BsR(8); + return result; + } + + void RecvDecodingTables() + { + char[][] len = new char[BZip2Constants.GroupCount][]; + for (int i = 0; i < BZip2Constants.GroupCount; ++i) + { + len[i] = new char[BZip2Constants.MaximumAlphaSize]; + } + + bool[] inUse16 = new bool[16]; + + //--- Receive the mapping table --- + for (int i = 0; i < 16; i++) + { + inUse16[i] = (BsR(1) == 1); + } + + for (int i = 0; i < 16; i++) + { + if (inUse16[i]) + { + for (int j = 0; j < 16; j++) + { + inUse[i * 16 + j] = (BsR(1) == 1); + } + } + else + { + for (int j = 0; j < 16; j++) + { + inUse[i * 16 + j] = false; + } + } + } + + MakeMaps(); + int alphaSize = nInUse + 2; + + //--- Now the selectors --- + int nGroups = BsR(3); + int nSelectors = BsR(15); + + for (int i = 0; i < nSelectors; i++) + { + int j = 0; + while (BsR(1) == 1) + { + j++; + } + selectorMtf[i] = (byte)j; + } + + //--- Undo the MTF values for the selectors. --- + byte[] pos = new byte[BZip2Constants.GroupCount]; + for (int v = 0; v < nGroups; v++) + { + pos[v] = (byte)v; + } + + for (int i = 0; i < nSelectors; i++) + { + int v = selectorMtf[i]; + byte tmp = pos[v]; + while (v > 0) + { + pos[v] = pos[v - 1]; + v--; + } + pos[0] = tmp; + selector[i] = tmp; + } + + //--- Now the coding tables --- + for (int t = 0; t < nGroups; t++) + { + int curr = BsR(5); + for (int i = 0; i < alphaSize; i++) + { + while (BsR(1) == 1) + { + if (BsR(1) == 0) + { + curr++; + } + else + { + curr--; + } + } + len[t][i] = (char)curr; + } + } + + //--- Create the Huffman decoding tables --- + for (int t = 0; t < nGroups; t++) + { + int minLen = 32; + int maxLen = 0; + for (int i = 0; i < alphaSize; i++) + { + maxLen = Math.Max(maxLen, len[t][i]); + minLen = Math.Min(minLen, len[t][i]); + } + HbCreateDecodeTables(limit[t], baseArray[t], perm[t], len[t], minLen, maxLen, alphaSize); + minLens[t] = minLen; + } + } + + void GetAndMoveToFrontDecode() + { + byte[] yy = new byte[256]; + int nextSym; + + int limitLast = BZip2Constants.BaseBlockSize * blockSize100k; + origPtr = BsGetIntVS(24); + + RecvDecodingTables(); + int EOB = nInUse + 1; + int groupNo = -1; + int groupPos = 0; + + /*-- + Setting up the unzftab entries here is not strictly + necessary, but it does save having to do it later + in a separate pass, and so saves a block's worth of + cache misses. + --*/ + for (int i = 0; i <= 255; i++) + { + unzftab[i] = 0; + } + + for (int i = 0; i <= 255; i++) + { + yy[i] = (byte)i; + } + + last = -1; + + if (groupPos == 0) + { + groupNo++; + groupPos = BZip2Constants.GroupSize; + } + + groupPos--; + int zt = selector[groupNo]; + int zn = minLens[zt]; + int zvec = BsR(zn); + int zj; + + while (zvec > limit[zt][zn]) + { + if (zn > 20) + { // the longest code + throw new BZip2Exception("Bzip data error"); + } + zn++; + while (bsLive < 1) + { + FillBuffer(); + } + zj = (bsBuff >> (bsLive - 1)) & 1; + bsLive--; + zvec = (zvec << 1) | zj; + } + if (zvec - baseArray[zt][zn] < 0 || zvec - baseArray[zt][zn] >= BZip2Constants.MaximumAlphaSize) + { + throw new BZip2Exception("Bzip data error"); + } + nextSym = perm[zt][zvec - baseArray[zt][zn]]; + + while (true) + { + if (nextSym == EOB) + { + break; + } + + if (nextSym == BZip2Constants.RunA || nextSym == BZip2Constants.RunB) + { + int s = -1; + int n = 1; + do + { + if (nextSym == BZip2Constants.RunA) + { + s += (0 + 1) * n; + } + else if (nextSym == BZip2Constants.RunB) + { + s += (1 + 1) * n; + } + + n <<= 1; + + if (groupPos == 0) + { + groupNo++; + groupPos = BZip2Constants.GroupSize; + } + + groupPos--; + + zt = selector[groupNo]; + zn = minLens[zt]; + zvec = BsR(zn); + + while (zvec > limit[zt][zn]) + { + zn++; + while (bsLive < 1) + { + FillBuffer(); + } + zj = (bsBuff >> (bsLive - 1)) & 1; + bsLive--; + zvec = (zvec << 1) | zj; + } + nextSym = perm[zt][zvec - baseArray[zt][zn]]; + } while (nextSym == BZip2Constants.RunA || nextSym == BZip2Constants.RunB); + + s++; + byte ch = seqToUnseq[yy[0]]; + unzftab[ch] += s; + + while (s > 0) + { + last++; + ll8[last] = ch; + s--; + } + + if (last >= limitLast) + { + BlockOverrun(); + } + continue; + } + else + { + last++; + if (last >= limitLast) + { + BlockOverrun(); + } + + byte tmp = yy[nextSym - 1]; + unzftab[seqToUnseq[tmp]]++; + ll8[last] = seqToUnseq[tmp]; + + for (int j = nextSym - 1; j > 0; --j) + { + yy[j] = yy[j - 1]; + } + yy[0] = tmp; + + if (groupPos == 0) + { + groupNo++; + groupPos = BZip2Constants.GroupSize; + } + + groupPos--; + zt = selector[groupNo]; + zn = minLens[zt]; + zvec = BsR(zn); + while (zvec > limit[zt][zn]) + { + zn++; + while (bsLive < 1) + { + FillBuffer(); + } + zj = (bsBuff >> (bsLive - 1)) & 1; + bsLive--; + zvec = (zvec << 1) | zj; + } + nextSym = perm[zt][zvec - baseArray[zt][zn]]; + continue; + } + } + } + + void SetupBlock() + { + int[] cftab = new int[257]; + + cftab[0] = 0; + Array.Copy(unzftab, 0, cftab, 1, 256); + + for (int i = 1; i <= 256; i++) + { + cftab[i] += cftab[i - 1]; + } + + for (int i = 0; i <= last; i++) + { + byte ch = ll8[i]; + tt[cftab[ch]] = i; + cftab[ch]++; + } + + cftab = null; + + tPos = tt[origPtr]; + + count = 0; + i2 = 0; + ch2 = 256; /*-- not a char and not EOF --*/ + + if (blockRandomised) + { + rNToGo = 0; + rTPos = 0; + SetupRandPartA(); + } + else + { + SetupNoRandPartA(); + } + } + + void SetupRandPartA() + { + if (i2 <= last) + { + chPrev = ch2; + ch2 = ll8[tPos]; + tPos = tt[tPos]; + if (rNToGo == 0) + { + rNToGo = BZip2Constants.RandomNumbers[rTPos]; + rTPos++; + if (rTPos == 512) + { + rTPos = 0; + } + } + rNToGo--; + ch2 ^= (int)((rNToGo == 1) ? 1 : 0); + i2++; + + currentChar = ch2; + currentState = RAND_PART_B_STATE; + mCrc.Update(ch2); + } + else + { + EndBlock(); + InitBlock(); + SetupBlock(); + } + } + + void SetupNoRandPartA() + { + if (i2 <= last) + { + chPrev = ch2; + ch2 = ll8[tPos]; + tPos = tt[tPos]; + i2++; + + currentChar = ch2; + currentState = NO_RAND_PART_B_STATE; + mCrc.Update(ch2); + } + else + { + EndBlock(); + InitBlock(); + SetupBlock(); + } + } + + void SetupRandPartB() + { + if (ch2 != chPrev) + { + currentState = RAND_PART_A_STATE; + count = 1; + SetupRandPartA(); + } + else + { + count++; + if (count >= 4) + { + z = ll8[tPos]; + tPos = tt[tPos]; + if (rNToGo == 0) + { + rNToGo = BZip2Constants.RandomNumbers[rTPos]; + rTPos++; + if (rTPos == 512) + { + rTPos = 0; + } + } + rNToGo--; + z ^= (byte)((rNToGo == 1) ? 1 : 0); + j2 = 0; + currentState = RAND_PART_C_STATE; + SetupRandPartC(); + } + else + { + currentState = RAND_PART_A_STATE; + SetupRandPartA(); + } + } + } + + void SetupRandPartC() + { + if (j2 < (int)z) + { + currentChar = ch2; + mCrc.Update(ch2); + j2++; + } + else + { + currentState = RAND_PART_A_STATE; + i2++; + count = 0; + SetupRandPartA(); + } + } + + void SetupNoRandPartB() + { + if (ch2 != chPrev) + { + currentState = NO_RAND_PART_A_STATE; + count = 1; + SetupNoRandPartA(); + } + else + { + count++; + if (count >= 4) + { + z = ll8[tPos]; + tPos = tt[tPos]; + currentState = NO_RAND_PART_C_STATE; + j2 = 0; + SetupNoRandPartC(); + } + else + { + currentState = NO_RAND_PART_A_STATE; + SetupNoRandPartA(); + } + } + } + + void SetupNoRandPartC() + { + if (j2 < (int)z) + { + currentChar = ch2; + mCrc.Update(ch2); + j2++; + } + else + { + currentState = NO_RAND_PART_A_STATE; + i2++; + count = 0; + SetupNoRandPartA(); + } + } + + void SetDecompressStructureSizes(int newSize100k) + { + if (!(0 <= newSize100k && newSize100k <= 9 && 0 <= blockSize100k && blockSize100k <= 9)) + { + throw new BZip2Exception("Invalid block size"); + } + + blockSize100k = newSize100k; + + if (newSize100k == 0) + { + return; + } + + int n = BZip2Constants.BaseBlockSize * newSize100k; + ll8 = new byte[n]; + tt = new int[n]; + } + + static void CompressedStreamEOF() + { + throw new EndOfStreamException("BZip2 input stream end of compressed stream"); + } + + static void BlockOverrun() + { + throw new BZip2Exception("BZip2 input stream block overrun"); + } + + static void BadBlockHeader() + { + throw new BZip2Exception("BZip2 input stream bad block header"); + } + + static void CrcError() + { + throw new BZip2Exception("BZip2 input stream crc error"); + } + + static void HbCreateDecodeTables(int[] limit, int[] baseArray, int[] perm, char[] length, int minLen, int maxLen, int alphaSize) + { + int pp = 0; + + for (int i = minLen; i <= maxLen; ++i) + { + for (int j = 0; j < alphaSize; ++j) + { + if (length[j] == i) + { + perm[pp] = j; + ++pp; + } + } + } + + for (int i = 0; i < BZip2Constants.MaximumCodeLength; i++) + { + baseArray[i] = 0; + } + + for (int i = 0; i < alphaSize; i++) + { + ++baseArray[length[i] + 1]; + } + + for (int i = 1; i < BZip2Constants.MaximumCodeLength; i++) + { + baseArray[i] += baseArray[i - 1]; + } + + for (int i = 0; i < BZip2Constants.MaximumCodeLength; i++) + { + limit[i] = 0; + } + + int vec = 0; + + for (int i = minLen; i <= maxLen; i++) + { + vec += (baseArray[i + 1] - baseArray[i]); + limit[i] = vec - 1; + vec <<= 1; + } + + for (int i = minLen + 1; i <= maxLen; i++) + { + baseArray[i] = ((limit[i - 1] + 1) << 1) - baseArray[i]; + } + } + + #region Instance Fields + /*-- + index of the last char in the block, so + the block size == last + 1. + --*/ + int last; + + /*-- + index in zptr[] of original string after sorting. + --*/ + int origPtr; + + /*-- + always: in the range 0 .. 9. + The current block size is 100000 * this number. + --*/ + int blockSize100k; + + bool blockRandomised; + + int bsBuff; + int bsLive; + ChecksumModule mCrc = new StrangeCRCChecksumModule(); + + bool[] inUse = new bool[256]; + int nInUse; + + byte[] seqToUnseq = new byte[256]; + byte[] unseqToSeq = new byte[256]; + + byte[] selector = new byte[BZip2Constants.MaximumSelectors]; + byte[] selectorMtf = new byte[BZip2Constants.MaximumSelectors]; + + int[] tt; + byte[] ll8; + + /*-- + freq table collected to save a pass over the data + during decompression. + --*/ + int[] unzftab = new int[256]; + + int[][] limit = new int[BZip2Constants.GroupCount][]; + int[][] baseArray = new int[BZip2Constants.GroupCount][]; + int[][] perm = new int[BZip2Constants.GroupCount][]; + int[] minLens = new int[BZip2Constants.GroupCount]; + + Stream baseStream; + bool streamEnd; + + int currentChar = -1; + + int currentState = START_BLOCK_STATE; + + int storedBlockCRC, storedCombinedCRC; + int computedBlockCRC; + uint computedCombinedCRC; + + int count, chPrev, ch2; + int tPos; + int rNToGo; + int rTPos; + int i2, j2; + byte z; + bool isStreamOwner = true; + #endregion + } +} +/* This file was derived from a file containing this license: + * + * This file is a part of bzip2 and/or libbzip2, a program and + * library for lossless, block-sorting data compression. + * + * Copyright (C) 1996-1998 Julian R Seward. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. The origin of this software must not be misrepresented; you must + * not claim that you wrote the original software. If you use this + * software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 3. Altered source versions must be plainly marked as such, and must + * not be misrepresented as being the original software. + * + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Java version ported by Keiron Liddle, Aftex Software 1999-2001 + */ diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2OutputStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2OutputStream.cs new file mode 100644 index 00000000..4683f254 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/BZip2OutputStream.cs @@ -0,0 +1,1918 @@ +// BZip2OutputStream.cs +// +// Copyright (C) 2001 Mike Krueger +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +using System; +using System.IO; + +using UniversalEditor.Checksum; +using UniversalEditor.Checksum.Modules; +using UniversalEditor.Checksum.Modules.StrangeCRC; + +namespace ICSharpCode.SharpZipLib.BZip2 +{ + + // TODO: Update to BZip2 1.0.1, 1.0.2 + + /// + /// An output stream that compresses into the BZip2 format + /// including file header chars into another stream. + /// + internal class BZip2OutputStream : Stream + { + #region Constants + const int SETMASK = (1 << 21); + const int CLEARMASK = (~SETMASK); + const int GREATER_ICOST = 15; + const int LESSER_ICOST = 0; + const int SMALL_THRESH = 20; + const int DEPTH_THRESH = 10; + + /*-- + If you are ever unlucky/improbable enough + to get a stack overflow whilst sorting, + increase the following constant and try + again. In practice I have never seen the + stack go above 27 elems, so the following + limit seems very generous. + --*/ + const int QSORT_STACK_SIZE = 1000; + + /*-- + Knuth's increments seem to work better + than Incerpi-Sedgewick here. Possibly + because the number of elems to sort is + usually small, typically <= 20. + --*/ + readonly int[] increments = new int[] { + 1, 4, 13, 40, 121, 364, 1093, 3280, + 9841, 29524, 88573, 265720, + 797161, 2391484 + }; + #endregion + + #region Constructors + /// + /// Construct a default output stream with maximum block size + /// + /// The stream to write BZip data onto. + public BZip2OutputStream(Stream stream) : this(stream, 9) + { + } + + /// + /// Initialise a new instance of the + /// for the specified stream, using the given blocksize. + /// + /// The stream to write compressed data to. + /// The block size to use. + /// + /// Valid block sizes are in the range 1..9, with 1 giving + /// the lowest compression and 9 the highest. + /// + public BZip2OutputStream(Stream stream, int blockSize) + { + BsSetStream(stream); + + workFactor = 50; + if (blockSize > 9) { + blockSize = 9; + } + + if (blockSize < 1) { + blockSize = 1; + } + blockSize100k = blockSize; + AllocateCompressStructures(); + Initialize(); + InitBlock(); + } + #endregion + + #region Destructor + /// + /// Ensures that resources are freed and other cleanup operations + /// are performed when the garbage collector reclaims the BZip2OutputStream. + /// + ~BZip2OutputStream() + { + Dispose(false); + } + #endregion + + /// + /// Get/set flag indicating ownership of underlying stream. + /// When the flag is true will close the underlying stream also. + /// + public bool IsStreamOwner + { + get { return isStreamOwner; } + set { isStreamOwner = value; } + } + + + #region Stream overrides + /// + /// Gets a value indicating whether the current stream supports reading + /// + public override bool CanRead + { + get { + return false; + } + } + + /// + /// Gets a value indicating whether the current stream supports seeking + /// + public override bool CanSeek { + get { + return false; + } + } + + /// + /// Gets a value indicating whether the current stream supports writing + /// + public override bool CanWrite { + get { + return baseStream.CanWrite; + } + } + + /// + /// Gets the length in bytes of the stream + /// + public override long Length { + get { + return baseStream.Length; + } + } + + /// + /// Gets or sets the current position of this stream. + /// + public override long Position { + get { + return baseStream.Position; + } + set { + throw new NotSupportedException("BZip2OutputStream position cannot be set"); + } + } + + /// + /// Sets the current position of this stream to the given value. + /// + /// The point relative to the offset from which to being seeking. + /// The reference point from which to begin seeking. + /// The new position in the stream. + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException("BZip2OutputStream Seek not supported"); + } + + /// + /// Sets the length of this stream to the given value. + /// + /// The new stream length. + public override void SetLength(long value) + { + throw new NotSupportedException("BZip2OutputStream SetLength not supported"); + } + + /// + /// Read a byte from the stream advancing the position. + /// + /// The byte read cast to an int; -1 if end of stream. + public override int ReadByte() + { + throw new NotSupportedException("BZip2OutputStream ReadByte not supported"); + } + + /// + /// Read a block of bytes + /// + /// The buffer to read into. + /// The offset in the buffer to start storing data at. + /// The maximum number of bytes to read. + /// The total number of bytes read. This might be less than the number of bytes + /// requested if that number of bytes are not currently available, or zero + /// if the end of the stream is reached. + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotSupportedException("BZip2OutputStream Read not supported"); + } + + /// + /// Write a block of bytes to the stream + /// + /// The buffer containing data to write. + /// The offset of the first byte to write. + /// The number of bytes to write. + public override void Write(byte[] buffer, int offset, int count) + { + if ( buffer == null ) { + throw new ArgumentNullException("buffer"); + } + + if ( offset < 0 ) + { + throw new ArgumentOutOfRangeException("offset"); + } + + if ( count < 0 ) + { + throw new ArgumentOutOfRangeException("count"); + } + + if ( buffer.Length - offset < count ) + { + throw new ArgumentException("Offset/count out of range"); + } + + for (int i = 0; i < count; ++i) { + WriteByte(buffer[offset + i]); + } + } + + /// + /// Write a byte to the stream. + /// + /// The byte to write to the stream. + public override void WriteByte(byte value) + { + int b = (256 + value) % 256; + if (currentChar != -1) { + if (currentChar == b) { + runLength++; + if (runLength > 254) { + WriteRun(); + currentChar = -1; + runLength = 0; + } + } else { + WriteRun(); + runLength = 1; + currentChar = b; + } + } else { + currentChar = b; + runLength++; + } + } + + /// + /// End the current block and end compression. + /// Close the stream and free any resources + /// + public override void Close() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + void MakeMaps() + { + nInUse = 0; + for (int i = 0; i < 256; i++) { + if (inUse[i]) { + seqToUnseq[nInUse] = (char)i; + unseqToSeq[i] = (char)nInUse; + nInUse++; + } + } + } + + /// + /// Get the number of bytes written to output. + /// + void WriteRun() + { + if (last < allowableBlockSize) { + inUse[currentChar] = true; + for (int i = 0; i < runLength; i++) { + mCrc.Update(currentChar); + } + + switch (runLength) { + case 1: + last++; + block[last + 1] = (byte)currentChar; + break; + case 2: + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)currentChar; + break; + case 3: + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)currentChar; + break; + default: + inUse[runLength - 4] = true; + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)currentChar; + last++; + block[last + 1] = (byte)(runLength - 4); + break; + } + } else { + EndBlock(); + InitBlock(); + WriteRun(); + } + } + + /// + /// Get the number of bytes written to the output. + /// + public int BytesWritten + { + get { return bytesOut; } + } + + /// + /// Releases the unmanaged resources used by the and optionally releases the managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. +#if NET_1_0 || NET_1_1 || NETCF_1_0 + protected virtual void Dispose(bool disposing) +#else + override protected void Dispose(bool disposing) +#endif + { + try { +#if !NET_1_0 && !NET_1_1 && !NETCF_1_0 + base.Dispose(disposing); +#endif + if( !disposed_ ) { + disposed_=true; + + if( runLength>0 ) { + WriteRun(); + } + + currentChar=-1; + EndBlock(); + EndCompression(); + Flush(); + } + } + finally { + if ( disposing ) { + if ( IsStreamOwner ) { + baseStream.Close(); + } + } + } + } + + /// + /// Flush output buffers + /// + public override void Flush() + { + baseStream.Flush(); + } + + void Initialize() + { + bytesOut = 0; + nBlocksRandomised = 0; + + /*--- Write header `magic' bytes indicating file-format == huffmanised, + followed by a digit indicating blockSize100k. + ---*/ + + BsPutUChar('B'); + BsPutUChar('Z'); + + BsPutUChar('h'); + BsPutUChar('0' + blockSize100k); + + combinedCRC = 0; + } + + void InitBlock() + { + mCrc.Reset(); + last = -1; + + for (int i = 0; i < 256; i++) { + inUse[i] = false; + } + + /*--- 20 is just a paranoia constant ---*/ + allowableBlockSize = BZip2Constants.BaseBlockSize * blockSize100k - 20; + } + + void EndBlock() + { + if (last < 0) { // dont do anything for empty files, (makes empty files compatible with original Bzip) + return; + } + + blockCRC = unchecked((uint)mCrc.Value); + combinedCRC = (combinedCRC << 1) | (combinedCRC >> 31); + combinedCRC ^= blockCRC; + + /*-- sort the block and establish position of original string --*/ + DoReversibleTransformation(); + + /*-- + A 6-byte block header, the value chosen arbitrarily + as 0x314159265359 :-). A 32 bit value does not really + give a strong enough guarantee that the value will not + appear by chance in the compressed datastream. Worst-case + probability of this event, for a 900k block, is about + 2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits. + For a compressed file of size 100Gb -- about 100000 blocks -- + only a 48-bit marker will do. NB: normal compression/ + decompression do *not* rely on these statistical properties. + They are only important when trying to recover blocks from + damaged files. + --*/ + BsPutUChar(0x31); + BsPutUChar(0x41); + BsPutUChar(0x59); + BsPutUChar(0x26); + BsPutUChar(0x53); + BsPutUChar(0x59); + + /*-- Now the block's CRC, so it is in a known place. --*/ + unchecked { + BsPutint((int)blockCRC); + } + + /*-- Now a single bit indicating randomisation. --*/ + if (blockRandomised) { + BsW(1,1); + nBlocksRandomised++; + } else { + BsW(1,0); + } + + /*-- Finally, block's contents proper. --*/ + MoveToFrontCodeAndSend(); + } + + void EndCompression() + { + /*-- + Now another magic 48-bit number, 0x177245385090, to + indicate the end of the last block. (sqrt(pi), if + you want to know. I did want to use e, but it contains + too much repetition -- 27 18 28 18 28 46 -- for me + to feel statistically comfortable. Call me paranoid.) + --*/ + BsPutUChar(0x17); + BsPutUChar(0x72); + BsPutUChar(0x45); + BsPutUChar(0x38); + BsPutUChar(0x50); + BsPutUChar(0x90); + + unchecked { + BsPutint((int)combinedCRC); + } + + BsFinishedWithStream(); + } + + void BsSetStream(Stream stream) + { + baseStream = stream; + bsLive = 0; + bsBuff = 0; + bytesOut = 0; + } + + void BsFinishedWithStream() + { + while (bsLive > 0) + { + int ch = (bsBuff >> 24); + baseStream.WriteByte((byte)ch); // write 8-bit + bsBuff <<= 8; + bsLive -= 8; + bytesOut++; + } + } + + void BsW(int n, int v) + { + while (bsLive >= 8) { + int ch = (bsBuff >> 24); + unchecked{baseStream.WriteByte((byte)ch);} // write 8-bit + bsBuff <<= 8; + bsLive -= 8; + ++bytesOut; + } + bsBuff |= (v << (32 - bsLive - n)); + bsLive += n; + } + + void BsPutUChar(int c) + { + BsW(8, c); + } + + void BsPutint(int u) + { + BsW(8, (u >> 24) & 0xFF); + BsW(8, (u >> 16) & 0xFF); + BsW(8, (u >> 8) & 0xFF); + BsW(8, u & 0xFF); + } + + void BsPutIntVS(int numBits, int c) + { + BsW(numBits, c); + } + + void SendMTFValues() + { + char[][] len = new char[BZip2Constants.GroupCount][]; + for (int i = 0; i < BZip2Constants.GroupCount; ++i) { + len[i] = new char[BZip2Constants.MaximumAlphaSize]; + } + + int gs, ge, totc, bt, bc, iter; + int nSelectors = 0, alphaSize, minLen, maxLen, selCtr; + int nGroups; + + alphaSize = nInUse + 2; + for (int t = 0; t < BZip2Constants.GroupCount; t++) { + for (int v = 0; v < alphaSize; v++) { + len[t][v] = (char)GREATER_ICOST; + } + } + + /*--- Decide how many coding tables to use ---*/ + if (nMTF <= 0) { + Panic(); + } + + if (nMTF < 200) { + nGroups = 2; + } else if (nMTF < 600) { + nGroups = 3; + } else if (nMTF < 1200) { + nGroups = 4; + } else if (nMTF < 2400) { + nGroups = 5; + } else { + nGroups = 6; + } + + /*--- Generate an initial set of coding tables ---*/ + int nPart = nGroups; + int remF = nMTF; + gs = 0; + while (nPart > 0) { + int tFreq = remF / nPart; + int aFreq = 0; + ge = gs - 1; + while (aFreq < tFreq && ge < alphaSize - 1) { + ge++; + aFreq += mtfFreq[ge]; + } + + if (ge > gs && nPart != nGroups && nPart != 1 && ((nGroups - nPart) % 2 == 1)) { + aFreq -= mtfFreq[ge]; + ge--; + } + + for (int v = 0; v < alphaSize; v++) { + if (v >= gs && v <= ge) { + len[nPart - 1][v] = (char)LESSER_ICOST; + } else { + len[nPart - 1][v] = (char)GREATER_ICOST; + } + } + + nPart--; + gs = ge + 1; + remF -= aFreq; + } + + int[][] rfreq = new int[BZip2Constants.GroupCount][]; + for (int i = 0; i < BZip2Constants.GroupCount; ++i) { + rfreq[i] = new int[BZip2Constants.MaximumAlphaSize]; + } + + int[] fave = new int[BZip2Constants.GroupCount]; + short[] cost = new short[BZip2Constants.GroupCount]; + /*--- + Iterate up to N_ITERS times to improve the tables. + ---*/ + for (iter = 0; iter < BZip2Constants.NumberOfIterations; ++iter) { + for (int t = 0; t < nGroups; ++t) { + fave[t] = 0; + } + + for (int t = 0; t < nGroups; ++t) { + for (int v = 0; v < alphaSize; ++v) { + rfreq[t][v] = 0; + } + } + + nSelectors = 0; + totc = 0; + gs = 0; + while (true) { + /*--- Set group start & end marks. --*/ + if (gs >= nMTF) { + break; + } + ge = gs + BZip2Constants.GroupSize - 1; + if (ge >= nMTF) { + ge = nMTF - 1; + } + + /*-- + Calculate the cost of this group as coded + by each of the coding tables. + --*/ + for (int t = 0; t < nGroups; t++) { + cost[t] = 0; + } + + if (nGroups == 6) { + short cost0, cost1, cost2, cost3, cost4, cost5; + cost0 = cost1 = cost2 = cost3 = cost4 = cost5 = 0; + for (int i = gs; i <= ge; ++i) { + short icv = szptr[i]; + cost0 += (short)len[0][icv]; + cost1 += (short)len[1][icv]; + cost2 += (short)len[2][icv]; + cost3 += (short)len[3][icv]; + cost4 += (short)len[4][icv]; + cost5 += (short)len[5][icv]; + } + cost[0] = cost0; + cost[1] = cost1; + cost[2] = cost2; + cost[3] = cost3; + cost[4] = cost4; + cost[5] = cost5; + } else { + for (int i = gs; i <= ge; ++i) { + short icv = szptr[i]; + for (int t = 0; t < nGroups; t++) { + cost[t] += (short)len[t][icv]; + } + } + } + + /*-- + Find the coding table which is best for this group, + and record its identity in the selector table. + --*/ + bc = 999999999; + bt = -1; + for (int t = 0; t < nGroups; ++t) { + if (cost[t] < bc) { + bc = cost[t]; + bt = t; + } + } + totc += bc; + fave[bt]++; + selector[nSelectors] = (char)bt; + nSelectors++; + + /*-- + Increment the symbol frequencies for the selected table. + --*/ + for (int i = gs; i <= ge; ++i) { + ++rfreq[bt][szptr[i]]; + } + + gs = ge+1; + } + + /*-- + Recompute the tables based on the accumulated frequencies. + --*/ + for (int t = 0; t < nGroups; ++t) { + HbMakeCodeLengths(len[t], rfreq[t], alphaSize, 20); + } + } + + rfreq = null; + fave = null; + cost = null; + + if (!(nGroups < 8)) { + Panic(); + } + + if (!(nSelectors < 32768 && nSelectors <= (2 + (900000 / BZip2Constants.GroupSize)))) { + Panic(); + } + + /*--- Compute MTF values for the selectors. ---*/ + char[] pos = new char[BZip2Constants.GroupCount]; + char ll_i, tmp2, tmp; + + for (int i = 0; i < nGroups; i++) { + pos[i] = (char)i; + } + + for (int i = 0; i < nSelectors; i++) { + ll_i = selector[i]; + int j = 0; + tmp = pos[j]; + while (ll_i != tmp) { + j++; + tmp2 = tmp; + tmp = pos[j]; + pos[j] = tmp2; + } + pos[0] = tmp; + selectorMtf[i] = (char)j; + } + + int[][] code = new int[BZip2Constants.GroupCount][]; + + for (int i = 0; i < BZip2Constants.GroupCount; ++i) { + code[i] = new int[BZip2Constants.MaximumAlphaSize]; + } + + /*--- Assign actual codes for the tables. --*/ + for (int t = 0; t < nGroups; t++) { + minLen = 32; + maxLen = 0; + for (int i = 0; i < alphaSize; i++) { + if (len[t][i] > maxLen) { + maxLen = len[t][i]; + } + if (len[t][i] < minLen) { + minLen = len[t][i]; + } + } + if (maxLen > 20) { + Panic(); + } + if (minLen < 1) { + Panic(); + } + HbAssignCodes(code[t], len[t], minLen, maxLen, alphaSize); + } + + /*--- Transmit the mapping table. ---*/ + bool[] inUse16 = new bool[16]; + for (int i = 0; i < 16; ++i) { + inUse16[i] = false; + for (int j = 0; j < 16; ++j) { + if (inUse[i * 16 + j]) { + inUse16[i] = true; + } + } + } + + for (int i = 0; i < 16; ++i) { + if (inUse16[i]) { + BsW(1,1); + } else { + BsW(1,0); + } + } + + for (int i = 0; i < 16; ++i) { + if (inUse16[i]) { + for (int j = 0; j < 16; ++j) { + if (inUse[i * 16 + j]) { + BsW(1,1); + } else { + BsW(1,0); + } + } + } + } + + /*--- Now the selectors. ---*/ + BsW(3, nGroups); + BsW(15, nSelectors); + for (int i = 0; i < nSelectors; ++i) { + for (int j = 0; j < selectorMtf[i]; ++j) { + BsW(1,1); + } + BsW(1,0); + } + + /*--- Now the coding tables. ---*/ + for (int t = 0; t < nGroups; ++t) { + int curr = len[t][0]; + BsW(5, curr); + for (int i = 0; i < alphaSize; ++i) { + while (curr < len[t][i]) { + BsW(2, 2); + curr++; /* 10 */ + } + while (curr > len[t][i]) { + BsW(2, 3); + curr--; /* 11 */ + } + BsW (1, 0); + } + } + + /*--- And finally, the block data proper ---*/ + selCtr = 0; + gs = 0; + while (true) { + if (gs >= nMTF) { + break; + } + ge = gs + BZip2Constants.GroupSize - 1; + if (ge >= nMTF) { + ge = nMTF - 1; + } + + for (int i = gs; i <= ge; i++) { + BsW(len[selector[selCtr]][szptr[i]], code[selector[selCtr]][szptr[i]]); + } + + gs = ge + 1; + ++selCtr; + } + if (!(selCtr == nSelectors)) { + Panic(); + } + } + + void MoveToFrontCodeAndSend () + { + BsPutIntVS(24, origPtr); + GenerateMTFValues(); + SendMTFValues(); + } + + void SimpleSort(int lo, int hi, int d) + { + int i, j, h, bigN, hp; + int v; + + bigN = hi - lo + 1; + if (bigN < 2) { + return; + } + + hp = 0; + while (increments[hp] < bigN) { + hp++; + } + hp--; + + for (; hp >= 0; hp--) { + h = increments[hp]; + + i = lo + h; + while (true) { + /*-- copy 1 --*/ + if (i > hi) + break; + v = zptr[i]; + j = i; + while (FullGtU(zptr[j-h]+d, v+d)) { + zptr[j] = zptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) + break; + } + zptr[j] = v; + i++; + + /*-- copy 2 --*/ + if (i > hi) { + break; + } + v = zptr[i]; + j = i; + while (FullGtU ( zptr[j-h]+d, v+d )) { + zptr[j] = zptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) { + break; + } + } + zptr[j] = v; + i++; + + /*-- copy 3 --*/ + if (i > hi) { + break; + } + v = zptr[i]; + j = i; + while (FullGtU ( zptr[j-h]+d, v+d)) { + zptr[j] = zptr[j-h]; + j = j - h; + if (j <= (lo + h - 1)) { + break; + } + } + zptr[j] = v; + i++; + + if (workDone > workLimit && firstAttempt) { + return; + } + } + } + } + + void Vswap(int p1, int p2, int n ) + { + int temp = 0; + while (n > 0) { + temp = zptr[p1]; + zptr[p1] = zptr[p2]; + zptr[p2] = temp; + p1++; + p2++; + n--; + } + } + + void QSort3(int loSt, int hiSt, int dSt) + { + int unLo, unHi, ltLo, gtHi, med, n, m; + int lo, hi, d; + + StackElement[] stack = new StackElement[QSORT_STACK_SIZE]; + + int sp = 0; + + stack[sp].ll = loSt; + stack[sp].hh = hiSt; + stack[sp].dd = dSt; + sp++; + + while (sp > 0) { + if (sp >= QSORT_STACK_SIZE) { + Panic(); + } + + sp--; + lo = stack[sp].ll; + hi = stack[sp].hh; + d = stack[sp].dd; + + if (hi - lo < SMALL_THRESH || d > DEPTH_THRESH) { + SimpleSort(lo, hi, d); + if (workDone > workLimit && firstAttempt) { + return; + } + continue; + } + + med = Med3(block[zptr[lo] + d + 1], + block[zptr[hi ] + d + 1], + block[zptr[(lo + hi) >> 1] + d + 1]); + + unLo = ltLo = lo; + unHi = gtHi = hi; + + while (true) { + while (true) { + if (unLo > unHi) { + break; + } + n = ((int)block[zptr[unLo]+d + 1]) - med; + if (n == 0) { + int temp = zptr[unLo]; + zptr[unLo] = zptr[ltLo]; + zptr[ltLo] = temp; + ltLo++; + unLo++; + continue; + } + if (n > 0) { + break; + } + unLo++; + } + + while (true) { + if (unLo > unHi) { + break; + } + n = ((int)block[zptr[unHi]+d + 1]) - med; + if (n == 0) { + int temp = zptr[unHi]; + zptr[unHi] = zptr[gtHi]; + zptr[gtHi] = temp; + gtHi--; + unHi--; + continue; + } + if (n < 0) { + break; + } + unHi--; + } + + if (unLo > unHi) { + break; + } + + { + int temp = zptr[unLo]; + zptr[unLo] = zptr[unHi]; + zptr[unHi] = temp; + unLo++; + unHi--; + } + } + + if (gtHi < ltLo) { + stack[sp].ll = lo; + stack[sp].hh = hi; + stack[sp].dd = d+1; + sp++; + continue; + } + + n = ((ltLo-lo) < (unLo-ltLo)) ? (ltLo-lo) : (unLo-ltLo); + Vswap(lo, unLo-n, n); + m = ((hi-gtHi) < (gtHi-unHi)) ? (hi-gtHi) : (gtHi-unHi); + Vswap(unLo, hi-m+1, m); + + n = lo + unLo - ltLo - 1; + m = hi - (gtHi - unHi) + 1; + + stack[sp].ll = lo; + stack[sp].hh = n; + stack[sp].dd = d; + sp++; + + stack[sp].ll = n + 1; + stack[sp].hh = m - 1; + stack[sp].dd = d+1; + sp++; + + stack[sp].ll = m; + stack[sp].hh = hi; + stack[sp].dd = d; + sp++; + } + } + + void MainSort() + { + int i, j, ss, sb; + int[] runningOrder = new int[256]; + int[] copy = new int[256]; + bool[] bigDone = new bool[256]; + int c1, c2; + int numQSorted; + + /*-- + In the various block-sized structures, live data runs + from 0 to last+NUM_OVERSHOOT_BYTES inclusive. First, + set up the overshoot area for block. + --*/ + + // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" ); + for (i = 0; i < BZip2Constants.OvershootBytes; i++) { + block[last + i + 2] = block[(i % (last + 1)) + 1]; + } + for (i = 0; i <= last + BZip2Constants.OvershootBytes; i++) { + quadrant[i] = 0; + } + + block[0] = (byte)(block[last + 1]); + + if (last < 4000) { + /*-- + Use simpleSort(), since the full sorting mechanism + has quite a large constant overhead. + --*/ + for (i = 0; i <= last; i++) { + zptr[i] = i; + } + firstAttempt = false; + workDone = workLimit = 0; + SimpleSort(0, last, 0); + } else { + numQSorted = 0; + for (i = 0; i <= 255; i++) { + bigDone[i] = false; + } + for (i = 0; i <= 65536; i++) { + ftab[i] = 0; + } + + c1 = block[0]; + for (i = 0; i <= last; i++) { + c2 = block[i + 1]; + ftab[(c1 << 8) + c2]++; + c1 = c2; + } + + for (i = 1; i <= 65536; i++) { + ftab[i] += ftab[i - 1]; + } + + c1 = block[1]; + for (i = 0; i < last; i++) { + c2 = block[i + 2]; + j = (c1 << 8) + c2; + c1 = c2; + ftab[j]--; + zptr[ftab[j]] = i; + } + + j = ((block[last + 1]) << 8) + (block[1]); + ftab[j]--; + zptr[ftab[j]] = last; + + /*-- + Now ftab contains the first loc of every small bucket. + Calculate the running order, from smallest to largest + big bucket. + --*/ + + for (i = 0; i <= 255; i++) { + runningOrder[i] = i; + } + + int vv; + int h = 1; + do { + h = 3 * h + 1; + } while (h <= 256); + do { + h = h / 3; + for (i = h; i <= 255; i++) { + vv = runningOrder[i]; + j = i; + while ((ftab[((runningOrder[j-h])+1) << 8] - ftab[(runningOrder[j-h]) << 8]) > (ftab[((vv)+1) << 8] - ftab[(vv) << 8])) { + runningOrder[j] = runningOrder[j-h]; + j = j - h; + if (j <= (h - 1)) { + break; + } + } + runningOrder[j] = vv; + } + } while (h != 1); + + /*-- + The main sorting loop. + --*/ + for (i = 0; i <= 255; i++) { + + /*-- + Process big buckets, starting with the least full. + --*/ + ss = runningOrder[i]; + + /*-- + Complete the big bucket [ss] by quicksorting + any unsorted small buckets [ss, j]. Hopefully + previous pointer-scanning phases have already + completed many of the small buckets [ss, j], so + we don't have to sort them at all. + --*/ + for (j = 0; j <= 255; j++) { + sb = (ss << 8) + j; + if(!((ftab[sb] & SETMASK) == SETMASK)) { + int lo = ftab[sb] & CLEARMASK; + int hi = (ftab[sb+1] & CLEARMASK) - 1; + if (hi > lo) { + QSort3(lo, hi, 2); + numQSorted += (hi - lo + 1); + if (workDone > workLimit && firstAttempt) { + return; + } + } + ftab[sb] |= SETMASK; + } + } + + /*-- + The ss big bucket is now done. Record this fact, + and update the quadrant descriptors. Remember to + update quadrants in the overshoot area too, if + necessary. The "if (i < 255)" test merely skips + this updating for the last bucket processed, since + updating for the last bucket is pointless. + --*/ + bigDone[ss] = true; + + if (i < 255) { + int bbStart = ftab[ss << 8] & CLEARMASK; + int bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; + int shifts = 0; + + while ((bbSize >> shifts) > 65534) { + shifts++; + } + + for (j = 0; j < bbSize; j++) { + int a2update = zptr[bbStart + j]; + int qVal = (j >> shifts); + quadrant[a2update] = qVal; + if (a2update < BZip2Constants.OvershootBytes) { + quadrant[a2update + last + 1] = qVal; + } + } + + if (!(((bbSize-1) >> shifts) <= 65535)) { + Panic(); + } + } + + /*-- + Now scan this big bucket so as to synthesise the + sorted order for small buckets [t, ss] for all t != ss. + --*/ + for (j = 0; j <= 255; j++) { + copy[j] = ftab[(j << 8) + ss] & CLEARMASK; + } + + for (j = ftab[ss << 8] & CLEARMASK; j < (ftab[(ss+1) << 8] & CLEARMASK); j++) { + c1 = block[zptr[j]]; + if (!bigDone[c1]) { + zptr[copy[c1]] = zptr[j] == 0 ? last : zptr[j] - 1; + copy[c1] ++; + } + } + + for (j = 0; j <= 255; j++) { + ftab[(j << 8) + ss] |= SETMASK; + } + } + } + } + + void RandomiseBlock() + { + int i; + int rNToGo = 0; + int rTPos = 0; + for (i = 0; i < 256; i++) { + inUse[i] = false; + } + + for (i = 0; i <= last; i++) { + if (rNToGo == 0) { + rNToGo = (int)BZip2Constants.RandomNumbers[rTPos]; + rTPos++; + if (rTPos == 512) { + rTPos = 0; + } + } + rNToGo--; + block[i + 1] ^= (byte)((rNToGo == 1) ? 1 : 0); + // handle 16 bit signed numbers + block[i + 1] &= 0xFF; + + inUse[block[i + 1]] = true; + } + } + + void DoReversibleTransformation() + { + workLimit = workFactor * last; + workDone = 0; + blockRandomised = false; + firstAttempt = true; + + MainSort(); + + if (workDone > workLimit && firstAttempt) { + RandomiseBlock(); + workLimit = workDone = 0; + blockRandomised = true; + firstAttempt = false; + MainSort(); + } + + origPtr = -1; + for (int i = 0; i <= last; i++) { + if (zptr[i] == 0) { + origPtr = i; + break; + } + } + + if (origPtr == -1) { + Panic(); + } + } + + bool FullGtU(int i1, int i2) + { + int k; + byte c1, c2; + int s1, s2; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + i1++; + i2++; + + k = last + 1; + + do { + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + s1 = quadrant[i1]; + s2 = quadrant[i2]; + if (s1 != s2) { + return s1 > s2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + s1 = quadrant[i1]; + s2 = quadrant[i2]; + if (s1 != s2) { + return s1 > s2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + s1 = quadrant[i1]; + s2 = quadrant[i2]; + if (s1 != s2) { + return s1 > s2; + } + i1++; + i2++; + + c1 = block[i1 + 1]; + c2 = block[i2 + 1]; + if (c1 != c2) { + return c1 > c2; + } + s1 = quadrant[i1]; + s2 = quadrant[i2]; + if (s1 != s2) { + return s1 > s2; + } + i1++; + i2++; + + if (i1 > last) { + i1 -= last; + i1--; + } + if (i2 > last) { + i2 -= last; + i2--; + } + + k -= 4; + ++workDone; + } while (k >= 0); + + return false; + } + + void AllocateCompressStructures() + { + int n = BZip2Constants.BaseBlockSize * blockSize100k; + block = new byte[(n + 1 + BZip2Constants.OvershootBytes)]; + quadrant = new int[(n + BZip2Constants.OvershootBytes)]; + zptr = new int[n]; + ftab = new int[65537]; + + if (block == null || quadrant == null || zptr == null || ftab == null) { + // int totalDraw = (n + 1 + NUM_OVERSHOOT_BYTES) + (n + NUM_OVERSHOOT_BYTES) + n + 65537; + // compressOutOfMemory ( totalDraw, n ); + } + + /* + The back end needs a place to store the MTF values + whilst it calculates the coding tables. We could + put them in the zptr array. However, these values + will fit in a short, so we overlay szptr at the + start of zptr, in the hope of reducing the number + of cache misses induced by the multiple traversals + of the MTF values when calculating coding tables. + Seems to improve compression speed by about 1%. + */ + // szptr = zptr; + + + szptr = new short[2 * n]; + } + + void GenerateMTFValues() + { + char[] yy = new char[256]; + int i, j; + char tmp; + char tmp2; + int zPend; + int wr; + int EOB; + + MakeMaps(); + EOB = nInUse+1; + + for (i = 0; i <= EOB; i++) { + mtfFreq[i] = 0; + } + + wr = 0; + zPend = 0; + for (i = 0; i < nInUse; i++) { + yy[i] = (char) i; + } + + + for (i = 0; i <= last; i++) { + char ll_i; + + ll_i = unseqToSeq[block[zptr[i]]]; + + j = 0; + tmp = yy[j]; + while (ll_i != tmp) { + j++; + tmp2 = tmp; + tmp = yy[j]; + yy[j] = tmp2; + } + yy[0] = tmp; + + if (j == 0) { + zPend++; + } else { + if (zPend > 0) { + zPend--; + while (true) { + switch (zPend % 2) { + case 0: + szptr[wr] = (short)BZip2Constants.RunA; + wr++; + mtfFreq[BZip2Constants.RunA]++; + break; + case 1: + szptr[wr] = (short)BZip2Constants.RunB; + wr++; + mtfFreq[BZip2Constants.RunB]++; + break; + } + if (zPend < 2) { + break; + } + zPend = (zPend - 2) / 2; + } + zPend = 0; + } + szptr[wr] = (short)(j + 1); + wr++; + mtfFreq[j + 1]++; + } + } + + if (zPend > 0) { + zPend--; + while (true) { + switch (zPend % 2) { + case 0: + szptr[wr] = (short)BZip2Constants.RunA; + wr++; + mtfFreq[BZip2Constants.RunA]++; + break; + case 1: + szptr[wr] = (short)BZip2Constants.RunB; + wr++; + mtfFreq[BZip2Constants.RunB]++; + break; + } + if (zPend < 2) { + break; + } + zPend = (zPend - 2) / 2; + } + } + + szptr[wr] = (short)EOB; + wr++; + mtfFreq[EOB]++; + + nMTF = wr; + } + + static void Panic() + { + throw new BZip2Exception("BZip2 output stream panic"); + } + + static void HbMakeCodeLengths(char[] len, int[] freq, int alphaSize, int maxLen) + { + /*-- + Nodes and heap entries run from 1. Entry 0 + for both the heap and nodes is a sentinel. + --*/ + int nNodes, nHeap, n1, n2, j, k; + bool tooLong; + + int[] heap = new int[BZip2Constants.MaximumAlphaSize + 2]; + int[] weight = new int[BZip2Constants.MaximumAlphaSize * 2]; + int[] parent = new int[BZip2Constants.MaximumAlphaSize * 2]; + + for (int i = 0; i < alphaSize; ++i) + { + weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; + } + + while (true) + { + nNodes = alphaSize; + nHeap = 0; + + heap[0] = 0; + weight[0] = 0; + parent[0] = -2; + + for (int i = 1; i <= alphaSize; ++i) + { + parent[i] = -1; + nHeap++; + heap[nHeap] = i; + int zz = nHeap; + int tmp = heap[zz]; + while (weight[tmp] < weight[heap[zz >> 1]]) + { + heap[zz] = heap[zz >> 1]; + zz >>= 1; + } + heap[zz] = tmp; + } + if (!(nHeap < (BZip2Constants.MaximumAlphaSize+2))) + { + Panic(); + } + + while (nHeap > 1) + { + n1 = heap[1]; + heap[1] = heap[nHeap]; + nHeap--; + int zz = 1; + int yy = 0; + int tmp = heap[zz]; + while (true) + { + yy = zz << 1; + if (yy > nHeap) + { + break; + } + if (yy < nHeap && weight[heap[yy+1]] < weight[heap[yy]]) + { + yy++; + } + if (weight[tmp] < weight[heap[yy]]) + { + break; + } + + heap[zz] = heap[yy]; + zz = yy; + } + heap[zz] = tmp; + n2 = heap[1]; + heap[1] = heap[nHeap]; + nHeap--; + + zz = 1; + yy = 0; + tmp = heap[zz]; + while (true) + { + yy = zz << 1; + if (yy > nHeap) + { + break; + } + if (yy < nHeap && weight[heap[yy+1]] < weight[heap[yy]]) + { + yy++; + } + if (weight[tmp] < weight[heap[yy]]) + { + break; + } + heap[zz] = heap[yy]; + zz = yy; + } + heap[zz] = tmp; + nNodes++; + parent[n1] = parent[n2] = nNodes; + + weight[nNodes] = (int)((weight[n1] & 0xffffff00) + (weight[n2] & 0xffffff00)) | + (int)(1 + (((weight[n1] & 0x000000ff) > (weight[n2] & 0x000000ff)) ? (weight[n1] & 0x000000ff) : (weight[n2] & 0x000000ff))); + + parent[nNodes] = -1; + nHeap++; + heap[nHeap] = nNodes; + + zz = nHeap; + tmp = heap[zz]; + while (weight[tmp] < weight[heap[zz >> 1]]) + { + heap[zz] = heap[zz >> 1]; + zz >>= 1; + } + heap[zz] = tmp; + } + if (!(nNodes < (BZip2Constants.MaximumAlphaSize * 2))) + { + Panic(); + } + + tooLong = false; + for (int i = 1; i <= alphaSize; ++i) + { + j = 0; + k = i; + while (parent[k] >= 0) + { + k = parent[k]; + j++; + } + len[i - 1] = (char)j; + if (j > maxLen) + { + tooLong = true; + } + } + + if (!tooLong) + { + break; + } + + for (int i = 1; i < alphaSize; ++i) + { + j = weight[i] >> 8; + j = 1 + (j / 2); + weight[i] = j << 8; + } + } + } + + static void HbAssignCodes (int[] code, char[] length, int minLen, int maxLen, int alphaSize) + { + int vec = 0; + for (int n = minLen; n <= maxLen; ++n) + { + for (int i = 0; i < alphaSize; ++i) + { + if (length[i] == n) + { + code[i] = vec; + ++vec; + } + } + vec <<= 1; + } + } + + static byte Med3(byte a, byte b, byte c ) + { + byte t; + if (a > b) + { + t = a; + a = b; + b = t; + } + if (b > c) + { + t = b; + b = c; + c = t; + } + if (a > b) + { + b = a; + } + return b; + } + + struct StackElement + { + public int ll; + public int hh; + public int dd; + } + + #region Instance Fields + bool isStreamOwner = true; + + /*-- + index of the last char in the block, so + the block size == last + 1. + --*/ + int last; + + /*-- + index in zptr[] of original string after sorting. + --*/ + int origPtr; + + /*-- + always: in the range 0 .. 9. + The current block size is 100000 * this number. + --*/ + int blockSize100k; + + bool blockRandomised; + + int bytesOut; + int bsBuff; + int bsLive; + ChecksumModule mCrc = new StrangeCRCChecksumModule(); + + bool[] inUse = new bool[256]; + int nInUse; + + char[] seqToUnseq = new char[256]; + char[] unseqToSeq = new char[256]; + + char[] selector = new char[BZip2Constants.MaximumSelectors]; + char[] selectorMtf = new char[BZip2Constants.MaximumSelectors]; + + byte[] block; + int[] quadrant; + int[] zptr; + short[] szptr; + int[] ftab; + + int nMTF; + + int[] mtfFreq = new int[BZip2Constants.MaximumAlphaSize]; + + /* + * Used when sorting. If too many long comparisons + * happen, we stop sorting, randomise the block + * slightly, and try again. + */ + int workFactor; + int workDone; + int workLimit; + bool firstAttempt; + int nBlocksRandomised; + + int currentChar = -1; + int runLength; + uint blockCRC, combinedCRC; + int allowableBlockSize; + Stream baseStream; + bool disposed_; + #endregion + } +} + +/* This file was derived from a file containing this license: + * + * This file is a part of bzip2 and/or libbzip2, a program and + * library for lossless, block-sorting data compression. + * + * Copyright (C) 1996-1998 Julian R Seward. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. The origin of this software must not be misrepresented; you must + * not claim that you wrote the original software. If you use this + * software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 3. Altered source versions must be plainly marked as such, and must + * not be misrepresented as being the original software. + * + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Java version ported by Keiron Liddle, Aftex Software 1999-2001 + */ diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/StreamUtils.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/StreamUtils.cs new file mode 100644 index 00000000..76722b9a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Bzip2/Internal/StreamUtils.cs @@ -0,0 +1,247 @@ +// StreamUtils.cs +// +// Copyright 2005 John Reilly +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +using System; +using System.IO; +using UniversalEditor; + +namespace ICSharpCode.SharpZipLib.Core +{ + /// + /// Provides simple " utilities. + /// + public sealed class StreamUtils + { + /// + /// Read from a ensuring all the required data is read. + /// + /// The stream to read. + /// The buffer to fill. + /// + static public void ReadFully(Stream stream, byte[] buffer) + { + ReadFully(stream, buffer, 0, buffer.Length); + } + + /// + /// Read from a " ensuring all the required data is read. + /// + /// The stream to read data from. + /// The buffer to store data in. + /// The offset at which to begin storing data. + /// The number of bytes of data to store. + /// Required parameter is null + /// and or are invalid. + /// End of stream is encountered before all the data has been read. + static public void ReadFully(Stream stream, byte[] buffer, int offset, int count) + { + if ( stream == null ) { + throw new ArgumentNullException("stream"); + } + + if ( buffer == null ) { + throw new ArgumentNullException("buffer"); + } + + // Offset can equal length when buffer and count are 0. + if ( (offset < 0) || (offset > buffer.Length) ) { + throw new ArgumentOutOfRangeException("offset"); + } + + if ( (count < 0) || (offset + count > buffer.Length) ) { + throw new ArgumentOutOfRangeException("count"); + } + + while ( count > 0 ) { + int readCount = stream.Read(buffer, offset, count); + if ( readCount <= 0 ) { + throw new EndOfStreamException(); + } + offset += readCount; + count -= readCount; + } + } + + /// + /// Copy the contents of one to another. + /// + /// The stream to source data from. + /// The stream to write data to. + /// The buffer to use during copying. + static public void Copy(Stream source, Stream destination, byte[] buffer) + { + if (source == null) { + throw new ArgumentNullException("source"); + } + + if (destination == null) { + throw new ArgumentNullException("destination"); + } + + if (buffer == null) { + throw new ArgumentNullException("buffer"); + } + + // Ensure a reasonable size of buffer is used without being prohibitive. + if (buffer.Length < 128) { + throw new ArgumentException("Buffer is too small", "buffer"); + } + + bool copying = true; + + while (copying) { + int bytesRead = source.Read(buffer, 0, buffer.Length); + if (bytesRead > 0) { + destination.Write(buffer, 0, bytesRead); + } + else { + destination.Flush(); + copying = false; + } + } + } + + /// + /// Copy the contents of one to another. + /// + /// The stream to source data from. + /// The stream to write data to. + /// The buffer to use during copying. + /// The progress handler delegate to use. + /// The minimum between progress updates. + /// The source for this event. + /// The name to use with the event. + /// This form is specialised for use within #Zip to support events during archive operations. + static public void Copy(Stream source, Stream destination, + byte[] buffer, ProgressEventHandler progressHandler, TimeSpan updateInterval, object sender, string name) + { + Copy(source, destination, buffer, progressHandler, updateInterval, sender, name, -1); + } + + /// + /// Copy the contents of one to another. + /// + /// The stream to source data from. + /// The stream to write data to. + /// The buffer to use during copying. + /// The progress handler delegate to use. + /// The minimum between progress updates. + /// The source for this event. + /// The name to use with the event. + /// A predetermined fixed target value to use with progress updates. + /// If the value is negative the target is calculated by looking at the stream. + /// This form is specialised for use within #Zip to support events during archive operations. + static public void Copy(Stream source, Stream destination, + byte[] buffer, + ProgressEventHandler progressHandler, TimeSpan updateInterval, + object sender, string name, long fixedTarget) + { + if (source == null) { + throw new ArgumentNullException("source"); + } + + if (destination == null) { + throw new ArgumentNullException("destination"); + } + + if (buffer == null) { + throw new ArgumentNullException("buffer"); + } + + // Ensure a reasonable size of buffer is used without being prohibitive. + if (buffer.Length < 128) { + throw new ArgumentException("Buffer is too small", "buffer"); + } + + if (progressHandler == null) { + throw new ArgumentNullException("progressHandler"); + } + + bool copying = true; + + DateTime marker = DateTime.Now; + long processed = 0; + long target = 0; + + if (fixedTarget >= 0) { + target = fixedTarget; + } + else if (source.CanSeek) { + target = source.Length - source.Position; + } + + // Always fire 0% progress.. + ProgressEventArgs args = new ProgressEventArgs(processed, target, name); + progressHandler(sender, args); + + bool progressFired = true; + + while (copying) { + int bytesRead = source.Read(buffer, 0, buffer.Length); + if (bytesRead > 0) { + processed += bytesRead; + progressFired = false; + destination.Write(buffer, 0, bytesRead); + } + else { + destination.Flush(); + copying = false; + } + + if (DateTime.Now - marker > updateInterval) { + progressFired = true; + marker = DateTime.Now; + args = new ProgressEventArgs(processed, target, name); + progressHandler(sender, args); + + copying = !args.Cancel; + } + } + + if (!progressFired) { + args = new ProgressEventArgs(processed, target, name); + progressHandler(sender, args); + } + } + + /// + /// Initialise an instance of + /// + private StreamUtils() + { + // Do nothing. + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateCompressionModule.cs new file mode 100644 index 00000000..245437fb --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateCompressionModule.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Threading; +using System.Security.Permissions; + +namespace UniversalEditor.Compression.Modules.Deflate +{ + /// + /// UE wrapper around System.IO.Compression.DeflateStream + /// + public class DeflateCompressionModule : CompressionModule + { + public override string Name { get { return "DEFLATE"; } } + + public const int BUFFERSIZE = 4096; + + protected override void CompressInternal(Stream inputStream, Stream outputStream) + { + System.IO.Compression.DeflateStream dst = new System.IO.Compression.DeflateStream(outputStream, System.IO.Compression.CompressionMode.Compress); + int read = 0; + int start = 0; + do + { + byte[] buffer = new byte[BUFFERSIZE]; + read = inputStream.Read(buffer, start, buffer.Length); + dst.Write(buffer, 0, read); + } + while (read == BUFFERSIZE); + } + protected override void DecompressInternal(Stream inputStream, Stream outputStream, int inputLength, int outputLength) + { + System.IO.Compression.DeflateStream dst = new System.IO.Compression.DeflateStream(inputStream, System.IO.Compression.CompressionMode.Decompress); + int read = 0; + int start = 0; + do + { + byte[] buffer = new byte[BUFFERSIZE]; + read = dst.Read(buffer, start, buffer.Length); + outputStream.Write(buffer, 0, read); + } + while (read == BUFFERSIZE); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateStreamAsyncResult.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateStreamAsyncResult.cs new file mode 100644 index 00000000..7f1140dd --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/DeflateStreamAsyncResult.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace UniversalEditor.Compression.Modules.Deflate +{ + public class DeflateStreamAsyncResult : IAsyncResult + { + public byte[] buffer; + public int count; + public bool isWrite; + private AsyncCallback m_AsyncCallback; + private object m_AsyncObject; + private object m_AsyncState; + private int m_Completed; + internal bool m_CompletedSynchronously; + private object m_Event; + private int m_InvokedCallback; + private object m_Result; + public int offset; + public object AsyncState + { + get + { + return this.m_AsyncState; + } + } + public WaitHandle AsyncWaitHandle + { + get + { + int completed = this.m_Completed; + if (this.m_Event == null) + { + Interlocked.CompareExchange(ref this.m_Event, new ManualResetEvent(completed != 0), null); + } + ManualResetEvent event2 = (ManualResetEvent)this.m_Event; + if (completed == 0 && this.m_Completed != 0) + { + event2.Set(); + } + return event2; + } + } + public bool CompletedSynchronously + { + get + { + return this.m_CompletedSynchronously; + } + } + public bool IsCompleted + { + get + { + return this.m_Completed != 0; + } + } + internal object Result + { + get + { + return this.m_Result; + } + } + public DeflateStreamAsyncResult(object asyncObject, object asyncState, AsyncCallback asyncCallback, byte[] buffer, int offset, int count) + { + this.buffer = buffer; + this.offset = offset; + this.count = count; + this.m_CompletedSynchronously = true; + this.m_AsyncObject = asyncObject; + this.m_AsyncState = asyncState; + this.m_AsyncCallback = asyncCallback; + } + internal void Close() + { + if (this.m_Event != null) + { + ((ManualResetEvent)this.m_Event).Close(); + } + } + private void Complete(object result) + { + this.m_Result = result; + Interlocked.Increment(ref this.m_Completed); + if (this.m_Event != null) + { + ((ManualResetEvent)this.m_Event).Set(); + } + if (Interlocked.Increment(ref this.m_InvokedCallback) == 1 && this.m_AsyncCallback != null) + { + this.m_AsyncCallback(this); + } + } + private void Complete(bool completedSynchronously, object result) + { + this.m_CompletedSynchronously = completedSynchronously; + this.Complete(result); + } + internal void InvokeCallback(object result) + { + this.Complete(result); + } + internal void InvokeCallback(bool completedSynchronously, object result) + { + this.Complete(completedSynchronously, result); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/DeflateInput.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/DeflateInput.cs new file mode 100644 index 00000000..a381748b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/DeflateInput.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal class DeflateInput + { + private byte[] buffer; + private int count; + private int startIndex; + internal byte[] Buffer + { + get + { + return this.buffer; + } + set + { + this.buffer = value; + } + } + internal int Count + { + get + { + return this.count; + } + set + { + this.count = value; + } + } + internal int StartIndex + { + get + { + return this.startIndex; + } + set + { + this.startIndex = value; + } + } + internal void ConsumeBytes(int n) + { + this.startIndex += n; + this.count -= n; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Deflater.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Deflater.cs new file mode 100644 index 00000000..129752ce --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Deflater.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal class Deflater + { + private FastEncoder encoder; + public Deflater(bool doGZip) + { + this.encoder = new FastEncoder(doGZip); + } + public int Finish(byte[] output) + { + return this.encoder.Finish(output); + } + public int GetDeflateOutput(byte[] output) + { + return this.encoder.GetCompressedOutput(output); + } + public bool NeedsInput() + { + return this.encoder.NeedsInput(); + } + public void SetInput(byte[] input, int startIndex, int count) + { + this.encoder.SetInput(input, startIndex, count); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoder.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoder.cs new file mode 100644 index 00000000..948a9485 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoder.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Common; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal class FastEncoder + { + internal class Output + { + private uint bitBuf; + private int bitCount; + private static byte[] distLookup; + private byte[] outputBuf; + private int outputPos; + internal int BytesWritten + { + get + { + return this.outputPos; + } + } + internal int FreeBytes + { + get + { + return this.outputBuf.Length - this.outputPos; + } + } + static Output() + { + FastEncoder.Output.distLookup = new byte[512]; + FastEncoder.Output.GenerateSlotTables(); + } + internal void FlushBits() + { + while (this.bitCount >= 8) + { + int CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)this.bitBuf; + this.bitCount -= 8; + this.bitBuf >>= 8; + } + if (this.bitCount > 0) + { + int CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)this.bitBuf; + this.bitCount = 0; + } + } + internal static void GenerateSlotTables() + { + int num = 0; + int index; + for (index = 0; index < 16; index++) + { + for (int i = 0; i < 1 << (int)FastEncoderStatics.ExtraDistanceBits[index]; i++) + { + num++; + FastEncoder.Output.distLookup[num] = (byte)index; + } + } + num >>= 7; + while (index < 30) + { + for (int j = 0; j < 1 << (int)(FastEncoderStatics.ExtraDistanceBits[index] - 7); j++) + { + num++; + FastEncoder.Output.distLookup[256 + num] = (byte)index; + } + index++; + } + } + internal int GetSlot(int pos) + { + return (int)FastEncoder.Output.distLookup[(pos < 256) ? pos : (256 + (pos >> 7))]; + } + internal bool SafeToWriteTo() + { + return this.outputBuf.Length - this.outputPos > 16; + } + internal void UpdateBuffer(byte[] output) + { + this.outputBuf = output; + this.outputPos = 0; + } + internal void WriteBits(int n, uint bits) + { + this.bitBuf |= bits << this.bitCount; + this.bitCount += n; + if (this.bitCount >= 16) + { + int CS_0_ = this.outputPos++; + this.outputBuf[CS_0_] = (byte)this.bitBuf; + CS_0_ = this.outputPos++; + this.outputBuf[CS_0_] = (byte)(this.bitBuf >> 8); + this.bitCount -= 16; + this.bitBuf >>= 16; + } + } + internal void WriteChar(byte b) + { + uint num = FastEncoderStatics.FastEncoderLiteralCodeInfo[(int)b]; + this.WriteBits((int)(num & 31u), num >> 5); + } + internal void WriteGzipFooter(uint gzipCrc32, uint inputStreamSize) + { + int CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(gzipCrc32 & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(gzipCrc32 >> 8 & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(gzipCrc32 >> 16 & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(gzipCrc32 >> 24 & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(inputStreamSize & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(inputStreamSize >> 8 & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(inputStreamSize >> 16 & 255u); + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = (byte)(inputStreamSize >> 24 & 255u); + } + internal void WriteGzipHeader(int compression_level) + { + int CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 31; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 139; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 8; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 0; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 0; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 0; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 0; + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 0; + if (compression_level == 10) + { + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 2; + } + else + { + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 4; + } + CS_0_0 = this.outputPos++; + this.outputBuf[CS_0_0] = 0; + } + internal void WriteMatch(int matchLen, int matchPos) + { + uint num = FastEncoderStatics.FastEncoderLiteralCodeInfo[254 + matchLen]; + int i = (int)(num & 31u); + if (i <= 16) + { + this.WriteBits(i, num >> 5); + } + else + { + this.WriteBits(16, num >> 5 & 65535u); + this.WriteBits(i - 16, num >> 21); + } + num = FastEncoderStatics.FastEncoderDistanceCodeInfo[this.GetSlot(matchPos)]; + this.WriteBits((int)(num & 15u), num >> 8); + int num2 = (int)(num >> 4 & 15u); + if (num2 != 0) + { + this.WriteBits(num2, (uint)(matchPos & (int)FastEncoderStatics.BitMask[num2])); + } + } + internal void WritePreamble() + { + Array.Copy(FastEncoderStatics.FastEncoderTreeStructureData, 0, this.outputBuf, this.outputPos, FastEncoderStatics.FastEncoderTreeStructureData.Length); + this.outputPos += FastEncoderStatics.FastEncoderTreeStructureData.Length; + this.bitCount = 9; + this.bitBuf = 34u; + } + } + private Match currentMatch; + private uint gzipCrc32; + private bool hasBlockHeader; + private bool hasGzipHeader; + private DeflateInput inputBuffer; + private uint inputStreamSize; + private FastEncoderWindow inputWindow; + private bool needsEOB; + private FastEncoder.Output output; + private bool usingGzip; + public FastEncoder(bool doGZip) + { + this.usingGzip = doGZip; + this.inputWindow = new FastEncoderWindow(); + this.inputBuffer = new DeflateInput(); + this.output = new FastEncoder.Output(); + this.currentMatch = new Match(); + } + public int Finish(byte[] outputBuffer) + { + this.output.UpdateBuffer(outputBuffer); + if (this.needsEOB) + { + uint num = FastEncoderStatics.FastEncoderLiteralCodeInfo[256]; + int i = (int)(num & 31u); + this.output.WriteBits(i, num >> 5); + this.output.FlushBits(); + if (this.usingGzip) + { + this.output.WriteGzipFooter(this.gzipCrc32, this.inputStreamSize); + } + } + return this.output.BytesWritten; + } + public int GetCompressedOutput(byte[] outputBuffer) + { + this.output.UpdateBuffer(outputBuffer); + if (this.usingGzip && !this.hasGzipHeader) + { + this.output.WriteGzipHeader(3); + this.hasGzipHeader = true; + } + if (!this.hasBlockHeader) + { + this.hasBlockHeader = true; + this.output.WritePreamble(); + } + while (true) + { + int count = (this.inputBuffer.Count < this.inputWindow.FreeWindowSpace) ? this.inputBuffer.Count : this.inputWindow.FreeWindowSpace; + if (count > 0) + { + this.inputWindow.CopyBytes(this.inputBuffer.Buffer, this.inputBuffer.StartIndex, count); + if (this.usingGzip) + { + this.gzipCrc32 = DecodeHelper.UpdateCrc32(this.gzipCrc32, this.inputBuffer.Buffer, this.inputBuffer.StartIndex, count); + uint num2 = this.inputStreamSize + (uint)count; + if (num2 < this.inputStreamSize) + { + break; + } + this.inputStreamSize = num2; + } + this.inputBuffer.ConsumeBytes(count); + } + while (this.inputWindow.BytesAvailable > 0 && this.output.SafeToWriteTo()) + { + this.inputWindow.GetNextSymbolOrMatch(this.currentMatch); + if (this.currentMatch.State == MatchState.HasSymbol) + { + this.output.WriteChar(this.currentMatch.Symbol); + } + else + { + if (this.currentMatch.State == MatchState.HasMatch) + { + this.output.WriteMatch(this.currentMatch.Length, this.currentMatch.Position); + } + else + { + this.output.WriteChar(this.currentMatch.Symbol); + this.output.WriteMatch(this.currentMatch.Length, this.currentMatch.Position); + } + } + } + if (!this.output.SafeToWriteTo() || this.NeedsInput()) + { + goto Block_13; + } + } + throw new InvalidDataException("StreamSizeOverflow"); + Block_13: + this.needsEOB = true; + return this.output.BytesWritten; + } + public bool NeedsInput() + { + return this.inputBuffer.Count == 0 && this.inputWindow.BytesAvailable == 0; + } + public void SetInput(byte[] input, int startIndex, int count) + { + this.inputBuffer.Buffer = input; + this.inputBuffer.Count = count; + this.inputBuffer.StartIndex = startIndex; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderStatics.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderStatics.cs new file mode 100644 index 00000000..fd11da35 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderStatics.cs @@ -0,0 +1,751 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal static class FastEncoderStatics + { + internal const int NumChars = 256; + internal const int NumDistBaseCodes = 30; + internal const int NumLengthBaseCodes = 29; + internal static readonly uint[] BitMask = new uint[] + { + 0u, + 1u, + 3u, + 7u, + 15u, + 31u, + 63u, + 127u, + 255u, + 511u, + 1023u, + 2047u, + 4095u, + 8191u, + 16383u, + 32767u + }; + internal static readonly byte[] ExtraDistanceBits = new byte[] + { + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 5, + 6, + 6, + 7, + 7, + 8, + 8, + 9, + 9, + 10, + 10, + 11, + 11, + 12, + 12, + 13, + 13, + 0, + 0 + }; + internal static readonly byte[] ExtraLengthBits = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 5, + 5, + 5, + 5, + 0 + }; + internal static readonly uint[] FastEncoderDistanceCodeInfo = new uint[] + { + 3846u, + 130826u, + 261899u, + 524043u, + 65305u, + 16152u, + 48936u, + 32552u, + 7991u, + 24375u, + 3397u, + 12102u, + 84u, + 7509u, + 2148u, + 869u, + 1140u, + 4981u, + 3204u, + 644u, + 2708u, + 1684u, + 3748u, + 420u, + 2484u, + 2997u, + 1476u, + 7109u, + 2005u, + 6101u, + 0u, + 256u + }; + internal static readonly uint[] FastEncoderLiteralCodeInfo = new uint[] + { + 55278u, + 317422u, + 186350u, + 448494u, + 120814u, + 382958u, + 251886u, + 514030u, + 14318u, + 51180u, + 294u, + 276462u, + 145390u, + 407534u, + 79854u, + 341998u, + 210926u, + 473070u, + 47086u, + 309230u, + 178158u, + 440302u, + 112622u, + 374766u, + 243694u, + 505838u, + 30702u, + 292846u, + 161774u, + 423918u, + 6125u, + 96238u, + 1318u, + 358382u, + 9194u, + 116716u, + 227310u, + 489454u, + 137197u, + 25578u, + 2920u, + 3817u, + 23531u, + 5098u, + 1127u, + 7016u, + 3175u, + 12009u, + 1896u, + 5992u, + 3944u, + 7913u, + 8040u, + 16105u, + 21482u, + 489u, + 232u, + 8681u, + 4585u, + 4328u, + 12777u, + 13290u, + 2280u, + 63470u, + 325614u, + 6376u, + 2537u, + 1256u, + 10729u, + 5352u, + 6633u, + 29674u, + 56299u, + 3304u, + 15339u, + 194542u, + 14825u, + 3050u, + 1513u, + 19434u, + 9705u, + 10220u, + 5609u, + 13801u, + 3561u, + 11242u, + 75756u, + 48107u, + 456686u, + 129006u, + 42988u, + 31723u, + 391150u, + 64491u, + 260078u, + 522222u, + 4078u, + 806u, + 615u, + 2663u, + 1639u, + 1830u, + 7400u, + 744u, + 3687u, + 166u, + 108524u, + 11753u, + 1190u, + 359u, + 2407u, + 678u, + 1383u, + 71661u, + 1702u, + 422u, + 1446u, + 3431u, + 4840u, + 2792u, + 7657u, + 6888u, + 2027u, + 202733u, + 26604u, + 38893u, + 169965u, + 266222u, + 135150u, + 397294u, + 69614u, + 331758u, + 200686u, + 462830u, + 36846u, + 298990u, + 167918u, + 430062u, + 102382u, + 364526u, + 233454u, + 495598u, + 20462u, + 282606u, + 151534u, + 413678u, + 85998u, + 348142u, + 217070u, + 479214u, + 53230u, + 315374u, + 184302u, + 446446u, + 118766u, + 380910u, + 249838u, + 511982u, + 12270u, + 274414u, + 143342u, + 405486u, + 77806u, + 339950u, + 208878u, + 471022u, + 45038u, + 307182u, + 176110u, + 438254u, + 110574u, + 372718u, + 241646u, + 503790u, + 28654u, + 290798u, + 159726u, + 421870u, + 94190u, + 356334u, + 225262u, + 487406u, + 61422u, + 323566u, + 192494u, + 454638u, + 126958u, + 389102u, + 258030u, + 520174u, + 8174u, + 270318u, + 139246u, + 401390u, + 73710u, + 335854u, + 204782u, + 466926u, + 40942u, + 303086u, + 172014u, + 434158u, + 106478u, + 368622u, + 237550u, + 499694u, + 24558u, + 286702u, + 155630u, + 417774u, + 90094u, + 352238u, + 221166u, + 483310u, + 57326u, + 319470u, + 188398u, + 450542u, + 122862u, + 385006u, + 253934u, + 516078u, + 16366u, + 278510u, + 147438u, + 409582u, + 81902u, + 344046u, + 212974u, + 475118u, + 49134u, + 311278u, + 180206u, + 442350u, + 114670u, + 376814u, + 245742u, + 507886u, + 32750u, + 294894u, + 163822u, + 425966u, + 98286u, + 104429u, + 235501u, + 22509u, + 360430u, + 153581u, + 229358u, + 88045u, + 491502u, + 219117u, + 65518u, + 327662u, + 196590u, + 458734u, + 131054u, + 132u, + 3u, + 388u, + 68u, + 324u, + 197u, + 709u, + 453u, + 966u, + 1990u, + 38u, + 1062u, + 935u, + 2983u, + 1959u, + 4007u, + 551u, + 1575u, + 2599u, + 3623u, + 104u, + 2152u, + 4200u, + 6248u, + 873u, + 4969u, + 9065u, + 13161u, + 1770u, + 9962u, + 18154u, + 26346u, + 5867u, + 14059u, + 22251u, + 30443u, + 38635u, + 46827u, + 55019u, + 63211u, + 15852u, + 32236u, + 48620u, + 65004u, + 81388u, + 97772u, + 114156u, + 130540u, + 27629u, + 60397u, + 93165u, + 125933u, + 158701u, + 191469u, + 224237u, + 257005u, + 1004u, + 17388u, + 33772u, + 50156u, + 66540u, + 82924u, + 99308u, + 115692u, + 7150u, + 39918u, + 72686u, + 105454u, + 138222u, + 170990u, + 203758u, + 236526u, + 269294u, + 302062u, + 334830u, + 367598u, + 400366u, + 433134u, + 465902u, + 498670u, + 92144u, + 223216u, + 354288u, + 485360u, + 616432u, + 747504u, + 878576u, + 1009648u, + 1140720u, + 1271792u, + 1402864u, + 1533936u, + 1665008u, + 1796080u, + 1927152u, + 2058224u, + 34799u, + 100335u, + 165871u, + 231407u, + 296943u, + 362479u, + 428015u, + 493551u, + 559087u, + 624623u, + 690159u, + 755695u, + 821231u, + 886767u, + 952303u, + 1017839u, + 59376u, + 190448u, + 321520u, + 452592u, + 583664u, + 714736u, + 845808u, + 976880u, + 1107952u, + 1239024u, + 1370096u, + 1501168u, + 1632240u, + 1763312u, + 1894384u, + 2025456u, + 393203u, + 917491u, + 1441779u, + 1966067u, + 2490355u, + 3014643u, + 3538931u, + 4063219u, + 4587507u, + 5111795u, + 5636083u, + 6160371u, + 6684659u, + 7208947u, + 7733235u, + 8257523u, + 8781811u, + 9306099u, + 9830387u, + 10354675u, + 10878963u, + 11403251u, + 11927539u, + 12451827u, + 12976115u, + 13500403u, + 14024691u, + 14548979u, + 15073267u, + 15597555u, + 16121843u, + 16646131u, + 262131u, + 786419u, + 1310707u, + 1834995u, + 2359283u, + 2883571u, + 3407859u, + 3932147u, + 4456435u, + 4980723u, + 5505011u, + 6029299u, + 6553587u, + 7077875u, + 7602163u, + 8126451u, + 8650739u, + 9175027u, + 9699315u, + 10223603u, + 10747891u, + 11272179u, + 11796467u, + 12320755u, + 12845043u, + 13369331u, + 13893619u, + 14417907u, + 14942195u, + 15466483u, + 15990771u, + 16515059u, + 524275u, + 1048563u, + 1572851u, + 2097139u, + 2621427u, + 3145715u, + 3670003u, + 4194291u, + 4718579u, + 5242867u, + 5767155u, + 6291443u, + 6815731u, + 7340019u, + 7864307u, + 8388595u, + 8912883u, + 9437171u, + 9961459u, + 10485747u, + 11010035u, + 11534323u, + 12058611u, + 12582899u, + 13107187u, + 13631475u, + 14155763u, + 14680051u, + 15204339u, + 15728627u, + 16252915u, + 16777203u, + 124913u, + 255985u, + 387057u, + 518129u, + 649201u, + 780273u, + 911345u, + 1042417u, + 1173489u, + 1304561u, + 1435633u, + 1566705u, + 1697777u, + 1828849u, + 1959921u, + 2090993u, + 2222065u, + 2353137u, + 2484209u, + 2615281u, + 2746353u, + 2877425u, + 3008497u, + 3139569u, + 3270641u, + 3401713u, + 3532785u, + 3663857u, + 3794929u, + 3926001u, + 4057073u, + 18411u + }; + internal static readonly byte[] FastEncoderTreeStructureData = new byte[] + { + 237, + 189, + 7, + 96, + 28, + 73, + 150, + 37, + 38, + 47, + 109, + 202, + 123, + 127, + 74, + 245, + 74, + 215, + 224, + 116, + 161, + 8, + 128, + 96, + 19, + 36, + 216, + 144, + 64, + 16, + 236, + 193, + 136, + 205, + 230, + 146, + 236, + 29, + 105, + 71, + 35, + 41, + 171, + 42, + 129, + 202, + 101, + 86, + 101, + 93, + 102, + 22, + 64, + 204, + 237, + 157, + 188, + 247, + 222, + 123, + 239, + 189, + 247, + 222, + 123, + 239, + 189, + 247, + 186, + 59, + 157, + 78, + 39, + 247, + 223, + 255, + 63, + 92, + 102, + 100, + 1, + 108, + 246, + 206, + 74, + 218, + 201, + 158, + 33, + 128, + 170, + 200, + 31, + 63, + 126, + 124, + 31, + 63 + }; + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderWindow.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderWindow.cs new file mode 100644 index 00000000..89544f44 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/FastEncoderWindow.cs @@ -0,0 +1,266 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.Compression.Common; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal class FastEncoderWindow + { + private const int FastEncoderHashMask = 2047; + private const int FastEncoderHashShift = 4; + private const int FastEncoderHashtableSize = 2048; + private const int FastEncoderMatch3DistThreshold = 16384; + private const int FastEncoderWindowMask = 8191; + private const int FastEncoderWindowSize = 8192; + private const int GoodLength = 4; + private const int LazyMatchThreshold = 6; + internal const int MaxMatch = 258; + internal const int MinMatch = 3; + private const int NiceLength = 32; + private const int SearchDepth = 32; + private int bufEnd; + private int bufPos = 8192; + private ushort[] lookup = new ushort[2048]; + private ushort[] prev = new ushort[8450]; + private byte[] window = new byte[16646]; + public int BytesAvailable + { + get + { + return this.bufEnd - this.bufPos; + } + } + public int FreeWindowSpace + { + get + { + return 16384 - this.bufEnd; + } + } + public FastEncoderWindow() + { + this.bufEnd = this.bufPos; + } + public void CopyBytes(byte[] inputBuffer, int startIndex, int count) + { + Array.Copy(inputBuffer, startIndex, this.window, this.bufEnd, count); + this.bufEnd += count; + } + private int FindMatch(int search, out int matchPos, int searchDepth, int niceLength) + { + int num = 0; + int num2 = 0; + int num3 = this.bufPos - 8192; + byte num4 = this.window[this.bufPos]; + while (search > num3) + { + if (this.window[search + num] == num4) + { + int num5; + for (num5 = 0; num5 < 258; num5++) + { + if (this.window[this.bufPos + num5] != this.window[search + num5]) + { + break; + } + } + if (num5 > num) + { + num = num5; + num2 = search; + if (num5 > 32) + { + break; + } + num4 = this.window[this.bufPos + num5]; + } + } + if (--searchDepth == 0) + { + break; + } + search = (int)this.prev[search & 8191]; + } + matchPos = this.bufPos - num2 - 1; + int result; + if (num == 3 && matchPos >= 16384) + { + result = 0; + } + else + { + result = num; + } + return result; + } + internal bool GetNextSymbolOrMatch(Match match) + { + uint hash = this.HashValue(0u, this.window[this.bufPos]); + hash = this.HashValue(hash, this.window[this.bufPos + 1]); + int matchPos = 0; + int num2; + if (this.bufEnd - this.bufPos <= 3) + { + num2 = 0; + } + else + { + int search = (int)this.InsertString(ref hash); + if (search != 0) + { + num2 = this.FindMatch(search, out matchPos, 32, 32); + if (this.bufPos + num2 > this.bufEnd) + { + num2 = this.bufEnd - this.bufPos; + } + } + else + { + num2 = 0; + } + } + if (num2 < 3) + { + match.State = MatchState.HasSymbol; + match.Symbol = this.window[this.bufPos]; + this.bufPos++; + } + else + { + this.bufPos++; + if (num2 <= 6) + { + int num3 = 0; + int num4 = (int)this.InsertString(ref hash); + int num5; + if (num4 != 0) + { + num5 = this.FindMatch(num4, out num3, (num2 < 4) ? 32 : 8, 32); + if (this.bufPos + num5 > this.bufEnd) + { + num5 = this.bufEnd - this.bufPos; + } + } + else + { + num5 = 0; + } + if (num5 > num2) + { + match.State = MatchState.HasSymbolAndMatch; + match.Symbol = this.window[this.bufPos - 1]; + match.Position = num3; + match.Length = num5; + this.bufPos++; + num2 = num5; + this.InsertStrings(ref hash, num2); + } + else + { + match.State = MatchState.HasMatch; + match.Position = matchPos; + match.Length = num2; + num2--; + this.bufPos++; + this.InsertStrings(ref hash, num2); + } + } + else + { + match.State = MatchState.HasMatch; + match.Position = matchPos; + match.Length = num2; + this.InsertStrings(ref hash, num2); + } + } + if (this.bufPos == 16384) + { + this.MoveWindows(); + } + return true; + } + private uint HashValue(uint hash, byte b) + { + return hash << 4 ^ (uint)b; + } + private uint InsertString(ref uint hash) + { + hash = this.HashValue(hash, this.window[this.bufPos + 2]); + uint num = (uint)this.lookup[(int)((UIntPtr)(hash & 2047))]; + this.lookup[(int)((UIntPtr)(hash & 2047))] = (ushort)this.bufPos; + this.prev[this.bufPos & 8191] = (ushort)num; + return num; + } + private void InsertStrings(ref uint hash, int matchLen) + { + if (this.bufEnd - this.bufPos <= matchLen) + { + this.bufPos += matchLen - 1; + } + else + { + while (--matchLen > 0) + { + this.InsertString(ref hash); + this.bufPos++; + } + } + } + public void MoveWindows() + { + Array.Copy(this.window, this.bufPos - 8192, this.window, 0, 8192); + for (int num = 0; num < 2048; num++) + { + int num2 = (int)(this.lookup[num] - 8192); + if (num2 <= 0) + { + this.lookup[num] = 0; + } + else + { + this.lookup[num] = (ushort)num2; + } + } + for (int num = 0; num < 8192; num++) + { + long num3 = (long)((ulong)this.prev[num] - 8192uL); + if (num3 <= 0L) + { + this.prev[num] = 0; + } + else + { + this.prev[num] = (ushort)num3; + } + } + this.bufPos = 8192; + this.bufEnd = this.bufPos; + } + private uint RecalculateHash(int position) + { + return (uint)(((int)this.window[position] << 8 ^ (int)this.window[position + 1] << 4 ^ (int)this.window[position + 2]) & 2047); + } + +#if DEBUG + private void VerifyHashes() + { + for (int i = 0; i < 2048; i++) + { + ushort j = this.lookup[i]; + while (j != 0 && this.bufPos - (int)j < 8192) + { + ushort num3 = this.prev[(int)(j & 8191)]; + if (this.bufPos - (int)num3 >= 8192) + { + break; + } + j = num3; + } + } + } +#endif + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Inflater.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Inflater.cs new file mode 100644 index 00000000..c5c46109 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/Inflater.cs @@ -0,0 +1,784 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.Compression.Common; +using UniversalEditor.Compression.Modules.Gzip.Internal; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal class Inflater + { + private int bfinal; + private int blockLength; + private byte[] blockLengthBuffer = new byte[4]; + private BlockType blockType; + private int codeArraySize; + private int codeLengthCodeCount; + private HuffmanTree codeLengthTree; + private byte[] codeLengthTreeCodeLength; + private byte[] codeList; + private static readonly byte[] codeOrder = new byte[] + { + 16, + 17, + 18, + 0, + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15 + }; + private uint crc32; + private static readonly int[] distanceBasePosition = new int[] + { + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577, + 0, + 0 + }; + private int distanceCode; + private int distanceCodeCount; + private HuffmanTree distanceTree; + private int extraBits; + private static readonly byte[] extraLengthBits = new byte[] + { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 5, + 5, + 5, + 5, + 0 + }; + private GzipDecoder gZipDecoder; + private InputBuffer input; + private int length; + private static readonly int[] lengthBase = new int[] + { + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 17, + 19, + 23, + 27, + 31, + 35, + 43, + 51, + 59, + 67, + 83, + 99, + 115, + 131, + 163, + 195, + 227, + 258 + }; + private int lengthCode; + private int literalLengthCodeCount; + private HuffmanTree literalLengthTree; + private int loopCounter; + private OutputWindow output; + private InflaterState state; + private static readonly byte[] staticDistanceTreeTable = new byte[] + { + 0, + 16, + 8, + 24, + 4, + 20, + 12, + 28, + 2, + 18, + 10, + 26, + 6, + 22, + 14, + 30, + 1, + 17, + 9, + 25, + 5, + 21, + 13, + 29, + 3, + 19, + 11, + 27, + 7, + 23, + 15, + 31 + }; + private uint streamSize; + private bool using_gzip; + public int AvailableOutput + { + get + { + return this.output.AvailableBytes; + } + } + public Inflater(bool doGZip) + { + this.using_gzip = doGZip; + this.output = new OutputWindow(); + this.input = new InputBuffer(); + this.gZipDecoder = new GzipDecoder(this.input); + this.codeList = new byte[320]; + this.codeLengthTreeCodeLength = new byte[19]; + this.Reset(); + } + private bool Decode() + { + bool flag = false; + bool flag2 = false; + bool result; + if (this.Finished()) + { + result = true; + } + else + { + if (this.using_gzip) + { + if (this.state == InflaterState.ReadingGZIPHeader) + { + if (!this.gZipDecoder.ReadGzipHeader()) + { + result = false; + return result; + } + this.state = InflaterState.ReadingBFinal; + } + else + { + if (this.state == InflaterState.StartReadingGZIPFooter || this.state == InflaterState.ReadingGZIPFooter) + { + if (!this.gZipDecoder.ReadGzipFooter()) + { + result = false; + return result; + } + this.state = InflaterState.VerifyingGZIPFooter; + result = true; + return result; + } + } + } + if (this.state == InflaterState.ReadingBFinal) + { + if (!this.input.EnsureBitsAvailable(1)) + { + result = false; + return result; + } + this.bfinal = this.input.GetBits(1); + this.state = InflaterState.ReadingBType; + } + if (this.state == InflaterState.ReadingBType) + { + if (!this.input.EnsureBitsAvailable(2)) + { + this.state = InflaterState.ReadingBType; + result = false; + return result; + } + this.blockType = (BlockType)this.input.GetBits(2); + if (this.blockType != BlockType.Dynamic) + { + if (this.blockType != BlockType.Static) + { + if (this.blockType != BlockType.Uncompressed) + { + throw new System.IO.InvalidDataException("UnknownBlockType"); + } + this.state = InflaterState.UncompressedAligning; + } + else + { + this.literalLengthTree = HuffmanTree.StaticLiteralLengthTree; + this.distanceTree = HuffmanTree.StaticDistanceTree; + this.state = InflaterState.DecodeTop; + } + } + else + { + this.state = InflaterState.ReadingNumLitCodes; + } + } + if (this.blockType == BlockType.Dynamic) + { + if (this.state < InflaterState.DecodeTop) + { + flag2 = this.DecodeDynamicBlockHeader(); + } + else + { + flag2 = this.DecodeBlock(out flag); + } + } + else + { + if (this.blockType == BlockType.Static) + { + flag2 = this.DecodeBlock(out flag); + } + else + { + if (this.blockType != BlockType.Uncompressed) + { + throw new System.IO.InvalidDataException("UnknownBlockType"); + } + flag2 = this.DecodeUncompressedBlock(out flag); + } + } + if (flag && this.bfinal != 0) + { + if (this.using_gzip) + { + this.state = InflaterState.StartReadingGZIPFooter; + result = flag2; + return result; + } + this.state = InflaterState.Done; + } + result = flag2; + } + return result; + } + private bool DecodeBlock(out bool end_of_block_code_seen) + { + end_of_block_code_seen = false; + int freeBytes = this.output.FreeBytes; + bool result; + while (freeBytes > 258) + { + switch (this.state) + { + case InflaterState.DecodeTop: + { + int nextSymbol = this.literalLengthTree.GetNextSymbol(this.input); + if (nextSymbol < 0) + { + result = false; + return result; + } + if (nextSymbol < 256) + { + this.output.Write((byte)nextSymbol); + freeBytes--; + continue; + } + if (nextSymbol == 256) + { + end_of_block_code_seen = true; + this.state = InflaterState.ReadingBFinal; + result = true; + return result; + } + nextSymbol -= 257; + if (nextSymbol < 8) + { + nextSymbol += 3; + this.extraBits = 0; + } + else + { + if (nextSymbol == 28) + { + nextSymbol = 258; + this.extraBits = 0; + } + else + { + if (nextSymbol >= Inflater.extraLengthBits.Length) + { + this.extraBits = 0; + } + else + { + this.extraBits = (int)Inflater.extraLengthBits[nextSymbol]; + } + } + } + this.length = nextSymbol; + goto IL_141; + } + case InflaterState.HaveInitialLength: + { + goto IL_141; + } + case InflaterState.HaveFullLength: + { + goto IL_1A1; + } + case InflaterState.HaveDistCode: + { + break; + } + default: + { + throw new System.IO.InvalidDataException("UnknownState"); + } + } + IL_228: + int num6; + if (this.distanceCode > 3) + { + this.extraBits = this.distanceCode - 2 >> 1; + int num5 = this.input.GetBits(this.extraBits); + if (num5 < 0) + { + result = false; + return result; + } + num6 = Inflater.distanceBasePosition[this.distanceCode] + num5; + } + else + { + num6 = this.distanceCode + 1; + } + this.output.WriteLengthDistance(this.length, num6); + freeBytes -= this.length; + this.state = InflaterState.DecodeTop; + continue; + IL_1A1: + if (this.blockType == BlockType.Dynamic) + { + this.distanceCode = this.distanceTree.GetNextSymbol(this.input); + } + else + { + this.distanceCode = this.input.GetBits(5); + if (this.distanceCode >= 0) + { + this.distanceCode = (int)Inflater.staticDistanceTreeTable[this.distanceCode]; + } + } + if (this.distanceCode < 0) + { + result = false; + return result; + } + this.state = InflaterState.HaveDistCode; + goto IL_228; + IL_141: + if (this.extraBits > 0) + { + this.state = InflaterState.HaveInitialLength; + int bits = this.input.GetBits(this.extraBits); + if (bits < 0) + { + result = false; + return result; + } + this.length = Inflater.lengthBase[this.length] + bits; + } + this.state = InflaterState.HaveFullLength; + goto IL_1A1; + } + result = true; + return result; + } + private bool DecodeDynamicBlockHeader() + { + bool result; + switch (this.state) + { + case InflaterState.ReadingNumLitCodes: + { + this.literalLengthCodeCount = this.input.GetBits(5); + if (this.literalLengthCodeCount < 0) + { + result = false; + return result; + } + this.literalLengthCodeCount += 257; + this.state = InflaterState.ReadingNumDistCodes; + break; + } + case InflaterState.ReadingNumDistCodes: + { + break; + } + case InflaterState.ReadingNumCodeLengthCodes: + { + goto IL_CF; + } + case InflaterState.ReadingCodeLengthCodes: + { + goto IL_118; + } + case InflaterState.ReadingTreeCodesBefore: + case InflaterState.ReadingTreeCodesAfter: + { + goto IL_1D6; + } + default: + { + throw new System.IO.InvalidDataException("UnknownState"); + } + } + this.distanceCodeCount = this.input.GetBits(5); + if (this.distanceCodeCount < 0) + { + result = false; + return result; + } + this.distanceCodeCount++; + this.state = InflaterState.ReadingNumCodeLengthCodes; + IL_CF: + this.codeLengthCodeCount = this.input.GetBits(4); + if (this.codeLengthCodeCount < 0) + { + result = false; + return result; + } + this.codeLengthCodeCount += 4; + this.loopCounter = 0; + this.state = InflaterState.ReadingCodeLengthCodes; + IL_118: + while (this.loopCounter < this.codeLengthCodeCount) + { + int bits = this.input.GetBits(3); + if (bits < 0) + { + result = false; + return result; + } + this.codeLengthTreeCodeLength[(int)Inflater.codeOrder[this.loopCounter]] = (byte)bits; + this.loopCounter++; + } + for (int i = this.codeLengthCodeCount; i < Inflater.codeOrder.Length; i++) + { + this.codeLengthTreeCodeLength[(int)Inflater.codeOrder[i]] = 0; + } + this.codeLengthTree = new HuffmanTree(this.codeLengthTreeCodeLength); + this.codeArraySize = this.literalLengthCodeCount + this.distanceCodeCount; + this.loopCounter = 0; + this.state = InflaterState.ReadingTreeCodesBefore; + IL_1D6: + while (this.loopCounter < this.codeArraySize) + { + if (this.state == InflaterState.ReadingTreeCodesBefore && (this.lengthCode = this.codeLengthTree.GetNextSymbol(this.input)) < 0) + { + result = false; + return result; + } + if (this.lengthCode <= 15) + { + int CS_0_3 = this.loopCounter++; + this.codeList[CS_0_3] = (byte)this.lengthCode; + } + else + { + if (!this.input.EnsureBitsAvailable(7)) + { + this.state = InflaterState.ReadingTreeCodesAfter; + result = false; + return result; + } + if (this.lengthCode == 16) + { + if (this.loopCounter == 0) + { + throw new System.IO.InvalidDataException(); + } + byte num4 = this.codeList[this.loopCounter - 1]; + int num5 = this.input.GetBits(2) + 3; + if (this.loopCounter + num5 > this.codeArraySize) + { + throw new System.IO.InvalidDataException(); + } + for (int j = 0; j < num5; j++) + { + int CS_0_3 = this.loopCounter++; + this.codeList[CS_0_3] = num4; + } + } + else + { + if (this.lengthCode == 17) + { + int num5 = this.input.GetBits(3) + 3; + if (this.loopCounter + num5 > this.codeArraySize) + { + throw new System.IO.InvalidDataException(); + } + for (int k = 0; k < num5; k++) + { + int CS_0_3 = this.loopCounter++; + this.codeList[CS_0_3] = 0; + } + } + else + { + int num5 = this.input.GetBits(7) + 11; + if (this.loopCounter + num5 > this.codeArraySize) + { + throw new System.IO.InvalidDataException(); + } + for (int l = 0; l < num5; l++) + { + int CS_0_3 = this.loopCounter++; + this.codeList[CS_0_3] = 0; + } + } + } + } + this.state = InflaterState.ReadingTreeCodesBefore; + } + byte[] destinationArray = new byte[288]; + byte[] buffer2 = new byte[32]; + Array.Copy(this.codeList, destinationArray, this.literalLengthCodeCount); + Array.Copy(this.codeList, this.literalLengthCodeCount, buffer2, 0, this.distanceCodeCount); + if (destinationArray[256] == 0) + { + throw new System.IO.InvalidDataException(); + } + this.literalLengthTree = new HuffmanTree(destinationArray); + this.distanceTree = new HuffmanTree(buffer2); + this.state = InflaterState.DecodeTop; + result = true; + return result; + } + private bool DecodeUncompressedBlock(out bool end_of_block) + { + end_of_block = false; + while (true) + { + switch (this.state) + { + case InflaterState.UncompressedAligning: + { + this.input.SkipToByteBoundary(); + this.state = InflaterState.UncompressedByte1; + goto IL_09; + } + case InflaterState.UncompressedByte1: + case InflaterState.UncompressedByte2: + case InflaterState.UncompressedByte3: + case InflaterState.UncompressedByte4: + { + goto IL_09; + } + case InflaterState.DecodingUncompressed: + { + goto IL_FD; + } + } + goto Block_4; + IL_09: + int bits = this.input.GetBits(8); + if (bits < 0) + { + break; + } + this.blockLengthBuffer[(int)(this.state - InflaterState.UncompressedByte1)] = (byte)bits; + if (this.state == InflaterState.UncompressedByte4) + { + this.blockLength = (int)this.blockLengthBuffer[0] + (int)this.blockLengthBuffer[1] * 256; + int num2 = (int)this.blockLengthBuffer[2] + (int)this.blockLengthBuffer[3] * 256; + if ((ushort)this.blockLength != (ushort)(~(ushort)num2)) + { + goto Block_3; + } + } + this.state |= (InflaterState)1; + } + bool result = false; + return result; + Block_3: + throw new System.IO.InvalidDataException("InvalidBlockLength"); + Block_4: + throw new System.IO.InvalidDataException("UnknownState"); + IL_FD: + int num3 = this.output.CopyFrom(this.input, this.blockLength); + this.blockLength -= num3; + if (this.blockLength != 0) + { + result = (this.output.FreeBytes == 0); + } + else + { + this.state = InflaterState.ReadingBFinal; + end_of_block = true; + result = true; + } + return result; + } + public bool Finished() + { + return this.state == InflaterState.Done || this.state == InflaterState.VerifyingGZIPFooter; + } + public int Inflate(byte[] bytes, int offset, int length) + { + int num = 0; + while (true) + { + int num2 = this.output.CopyTo(bytes, offset, length); + if (num2 > 0) + { + if (this.using_gzip) + { + this.crc32 = DecodeHelper.UpdateCrc32(this.crc32, bytes, offset, num2); + uint num3 = this.streamSize + (uint)num2; + if (num3 < this.streamSize) + { + break; + } + this.streamSize = num3; + } + offset += num2; + num += num2; + length -= num2; + } + if (length == 0 || this.Finished() || !this.Decode()) + { + goto Block_6; + } + } + throw new System.IO.InvalidDataException("StreamSizeOverflow"); + Block_6: + if (this.state == InflaterState.VerifyingGZIPFooter && this.output.AvailableBytes == 0) + { + if (this.crc32 != this.gZipDecoder.Crc32) + { + throw new System.IO.InvalidDataException("InvalidCRC"); + } + if (this.streamSize != this.gZipDecoder.StreamSize) + { + throw new System.IO.InvalidDataException("InvalidStreamSize"); + } + } + return num; + } + public bool NeedsInput() + { + return this.input.NeedsInput(); + } + public void Reset() + { + if (this.using_gzip) + { + this.gZipDecoder.Reset(); + this.state = InflaterState.ReadingGZIPHeader; + this.streamSize = 0u; + this.crc32 = 0u; + } + else + { + this.state = InflaterState.ReadingBFinal; + } + } + public void SetInput(byte[] inputBytes, int offset, int length) + { + this.input.SetInput(inputBytes, offset, length); + } + } + internal enum InflaterState + { + DecodeTop = 10, + DecodingUncompressed = 20, + Done = 24, + HaveDistCode = 13, + HaveFullLength = 12, + HaveInitialLength = 11, + ReadingBFinal = 2, + ReadingBType, + ReadingCodeLengthCodes = 7, + ReadingGZIPFooter = 22, + ReadingGZIPHeader = 0, + ReadingNumCodeLengthCodes = 6, + ReadingNumDistCodes = 5, + ReadingNumLitCodes = 4, + ReadingTreeCodesAfter = 9, + ReadingTreeCodesBefore = 8, + StartReadingGZIPFooter = 21, + UncompressedAligning = 15, + UncompressedByte1, + UncompressedByte2, + UncompressedByte3, + UncompressedByte4, + VerifyingGZIPFooter = 23 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/OutputWindow.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/OutputWindow.cs new file mode 100644 index 00000000..aa3c950e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Deflate/Internal/OutputWindow.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.Compression.Common; + +namespace UniversalEditor.Compression.Modules.Deflate.Internal +{ + internal class OutputWindow + { + private const int WindowMask = 32767; + private const int WindowSize = 32768; + private int bytesUsed; + private int end; + private byte[] window = new byte[32768]; + public int AvailableBytes + { + get + { + return this.bytesUsed; + } + } + public int FreeBytes + { + get + { + return 32768 - this.bytesUsed; + } + } + public int CopyFrom(InputBuffer input, int length) + { + length = Math.Min(Math.Min(length, 32768 - this.bytesUsed), input.AvailableBytes); + int num2 = 32768 - this.end; + int num3; + if (length > num2) + { + num3 = input.CopyTo(this.window, this.end, num2); + if (num3 == num2) + { + num3 += input.CopyTo(this.window, 0, length - num2); + } + } + else + { + num3 = input.CopyTo(this.window, this.end, length); + } + this.end = (this.end + num3 & 32767); + this.bytesUsed += num3; + return num3; + } + public int CopyTo(byte[] output, int offset, int length) + { + int end; + if (length > this.bytesUsed) + { + end = this.end; + length = this.bytesUsed; + } + else + { + end = (this.end - this.bytesUsed + length & 32767); + } + int num2 = length; + int num3 = length - end; + if (num3 > 0) + { + Array.Copy(this.window, 32768 - num3, output, offset, num3); + offset += num3; + length = end; + } + Array.Copy(this.window, end - length, output, offset, length); + this.bytesUsed -= num2; + return num2; + } + public void Write(byte b) + { + int CS_0_0 = this.end++; + this.window[CS_0_0] = b; + this.end &= 32767; + this.bytesUsed++; + } + public void WriteLengthDistance(int length, int distance) + { + this.bytesUsed += length; + int sourceIndex = this.end - distance & 32767; + int num2 = 32768 - length; + if (sourceIndex > num2 || this.end >= num2) + { + while (true) + { + length--; + if (length <= 0) + { + break; + } + int CS_0_ = this.end++; + sourceIndex++; + if (sourceIndex < this.window.Length) + { + this.window[CS_0_] = this.window[sourceIndex]; + } + else + { + Console.WriteLine("warning: OutputWindow.cs[79] (WriteLengthDistance): sourceIndex not less than window length"); + } + this.end &= 32767; + sourceIndex &= 32767; + } + } + else + { + if (length <= distance) + { + Array.Copy(this.window, sourceIndex, this.window, this.end, length); + this.end += length; + } + else + { + while (true) + { + length--; + if (length <= 0) + { + break; + } + int CS_0_ = this.end++; + sourceIndex++; + this.window[CS_0_] = this.window[sourceIndex]; + } + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/ExplodeCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/ExplodeCompressionModule.cs new file mode 100644 index 00000000..1b8d436c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/ExplodeCompressionModule.cs @@ -0,0 +1,534 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Compression.Modules.Explode.Internal; + +namespace UniversalEditor.Compression.Modules.Explode +{ + public class ExplodeCompressionModule : CompressionModule + { + public override string Name + { + get { return "Explode"; } + } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + throw new NotImplementedException(); + } + + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + Ptr _ptrOut = new Ptr(); + _ptrOut.AutoResize = true; + + this.blast(inputStream, outputStream, _ptrOut, 0); + } + + private uint _explodeInput(object how, ref Ptr buf) + { + return 0; + } + private int _explodeOutput(object how, Ptr buf, uint len) + { + return 0; + } + + + // translated to C# for Universal Editor by Michael Becker + + // modified by Luigi Auriemma because if MAXWIN is the standard 4096 then not all the data is decompressed + + /* blast.c + * Copyright (C) 2003 Mark Adler + * version 1.1, 16 Feb 2003 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the author be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Mark Adler madler@alumni.caltech.edu + * + * blast.c decompresses data compressed by the PKWare Compression Library. + * This function provides functionality similar to the explode() function of + * the PKWare library, hence the name "blast". + * + * This decompressor is based on the excellent format description provided by + * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the + * example Ben provided in the post is incorrect. The distance 110001 should + * instead be 111000. When corrected, the example byte stream becomes: + * + * 00 04 82 24 25 8f 80 7f + * + * which decompresses to "AIAIAIAIAIAIA" (without the quotes). + */ + + /* + * Change history: + * + * 1.0 12 Feb 2003 - First version + * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data + */ + + /// + /// Maximum code length + /// + private const int MAXBITS = 13; + + + /* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ + private static int bits(ExplodeState s, int need) + { + // bit accumulator + int val; + + // load at least need bits into val + val = s.bitbuf; + + while (s.bitcnt < need) + { + if (s.left == 0) + { + readInput(ref s); + } + val |= (int)(s.indata.GetValueThenIncrement() << s.bitcnt); // load eight bits + s.left--; + s.bitcnt += 8; + } + + // drop need bits and update buffer, always zero to seven bits left + s.bitbuf = val >> need; + s.bitcnt -= need; + + // return need bits, zeroing the bits above that + return val & ((1 << need) - 1); + } + + private static void readInput(ref ExplodeState s) + { + byte[] tmpBuffer = new byte[4096]; + s.left = (uint)s.inputStream.Read(tmpBuffer, 0, tmpBuffer.Length); + + byte[] buffer = s.indata.ToArray(); + if (buffer.Length < s.left) + { + + } + + if (s.left == 0) throw new OutOfInputException(); + } + + /* + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. + * + * - The first code for the shortest length is all ones. Subsequent codes of + * the same length are simply integer decrements of the previous code. When + * moving up a length, a one bit is appended to the code. For a complete + * code, the last code of the longest length will be all zeros. To support + * this ordering, the bits pulled during decoding are inverted to apply the + * more "natural" ordering starting with all zeros and incrementing. + */ + /// + /// Decode a code from the stream s using huffman table h. + /// + /// + /// + /// + /// The decoded symbol, or a negative value if there is an error. If all of the lengths are + /// zero (i.e. an empty code), or if the code is incomplete and an invalid code is received, + /// then -9 is returned after reading MAXBITS bits. + /// + private static int decode(ExplodeState s, ref ExplodeHuffman h) + { + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int count_ptr = 0; + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + Ptr next; // next number of codes + + bitbuf = s.bitbuf; + left = s.bitcnt; + code = first = index = 0; + len = 1; + next = h.count + 1; + while (true) + { + while (left-- != 0) + { + code |= (bitbuf & 1) ^ 1; /* invert code */ + bitbuf >>= 1; + count = next.GetValueThenIncrement(); + if (code < first + count) + { + // if length len, return symbol + s.bitbuf = bitbuf; + s.bitcnt = (s.bitcnt - len) & 7; + return h.symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s.left == 0) + { + readInput(ref s); + if (s.left == 0) throw new OutOfInputException(); + } + bitbuf = s.indata.GetValue() + 1; // *(s.in)++; + s.left--; + if (left > 8) left = 8; + } + return -9; /* ran out of codes */ + } + + /// + /// Given a list of repeated code lengths rep[0..n-1], where each byte is a count (high four + /// bits + 1) and a code length (low four bits), generate the list of code lengths. This + /// compaction reduces the size of the object code. Then given the list of code lengths + /// length[0..n-1] representing a canonical Huffman code for n symbols, construct the + /// tables required to decode those codes. Those tables are the number of codes of each + /// length, and the symbols sorted by length, retaining their original order within each + /// length. + /// + /// + /// + /// + /// Zero for a complete code set, negative for an over-subscribed code set, and positive for an incomplete code set. + /// + /// + /// The tables can be used if the return value is zero or positive, but they cannot be used + /// if the return value is negative. If the return value is zero, it is not possible for + /// decode() using that table to return an error--any stream of enough bits will resolve to + /// a symbol. If the return value is positive, then it is possible for decode() using that + /// table to return an error for received codes past the end of the incomplete lengths. + /// + private static int construct(ref ExplodeHuffman h, byte[] rep) + { + int n = rep.Length; + int symbol; // current symbol when stepping through length[] + int len; // current length when stepping through h.count[] + int left; // number of possible codes left of current length + short[] offs = new short[MAXBITS + 1]; // offsets in symbol table for each length + short[] length = new short[256]; // code lengths + + Ptr repP = new Ptr(rep); + + // convert compact repeat counts into symbol bit length list + symbol = 0; + do + { + len = repP.GetValueThenIncrement(); // *rep++ + left = (len >> 4) + 1; + len &= 15; + do + { + length[symbol++] = (short)len; + } + while (--left != 0); + } + while (--n != 0); + n = symbol; + + // count number of codes of each length + for (len = 0; len <= MAXBITS; len++) + h.count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + { + (h.count[length[symbol]])++; // assumes lengths are within bounds + } + if (h.count[0] == n) + { + // no codes! + return 0; // complete, but decode() will fail + } + + // check for an over-subscribed or incomplete set of lengths + left = 1; // one possible code of zero length + for (len = 1; len <= MAXBITS; len++) + { + left <<= 1; // one more bit, double codes left + left -= h.count[len]; // deduct count from possible codes + if (left < 0) return left; // over-subscribed--return negative + } // left > 0 means incomplete + + // generate offsets into symbol table for each length for sorting + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + { + offs[len + 1] = (short)(offs[len] + h.count[len]); // h.count[len] + } + + // put symbols in table sorted by length, by symbol order within each length + for (symbol = 0; symbol < n; symbol++) + { + if (length[symbol] != 0) + { + h.symbol[offs[length[symbol]]++] = (short)symbol; + } + } + + // return zero for complete set, positive for incomplete set + return left; + } + + private static bool virgin = true; // build tables once + private static short[] litcnt = new short[MAXBITS + 1], + litsym = new short[256]; // litcode memory + private static short[] lencnt = new short[MAXBITS + 1], + lensym = new short[16]; // lencode memory + private static short[] distcnt = new short[MAXBITS + 1], + distsym = new short[64]; // distcode memory + + /// + /// Literal code + /// + private static ExplodeHuffman litcode = new ExplodeHuffman() + { + count = new Ptr(litcnt), + symbol = new Ptr(litsym) + }; + /// + /// Length code + /// + private static ExplodeHuffman lencode = new ExplodeHuffman() + { + count = new Ptr(lencnt), + symbol = new Ptr(lensym) + }; + + /// + /// Distance code + /// + private static ExplodeHuffman distcode = new ExplodeHuffman() + { + count = new Ptr(distcnt), + symbol = new Ptr(distsym) + }; + + // bit lengths of literal codes + private static readonly byte[] litlen = new byte[] + { + 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8, + 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5, + 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12, + 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27, + 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45, + 44, 173 + }; + /// + /// Bit lengths of length codes 0..15 + /// + private static readonly byte[] lenlen = new byte[] { 2, 35, 36, 53, 38, 23 }; + /// + /// Bit lengths of distance codes 0..63 + /// + private static readonly byte[] distlen = new byte[] { 2, 20, 53, 230, 247, 151, 248 }; + /// + /// Base for length codes + /// + private static readonly short[] _base = new short[] { 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264 }; + /// + /// Extra bits for length codes + /// + private static readonly byte[] extra = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + + /* + * Format notes: + * + * - First byte is 0 if literals are uncoded or 1 if they are coded. Second + * byte is 4, 5, or 6 for the number of extra bits in the distance code. + * This is the base-2 logarithm of the dictionary size minus six. + * + * - Compressed data is a combination of literals and length/distance pairs + * terminated by an end code. Literals are either Huffman coded or + * uncoded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - A bit preceding a literal or length/distance pair indicates which comes + * next, 0 for literals, 1 for length/distance. + * + * - If literals are uncoded, then the next eight bits are the literal, in the + * normal bit order in th stream, i.e. no bit-reversal is needed. Similarly, + * no bit reversal is needed for either the length extra bits or the distance + * extra bits. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 518 + * simply copies the last byte 518 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. + */ + + private static object virginity = new object(); + + /// + /// Decode PKWare Compression Library stream. + /// + /// + /// + private static int decomp(ref ExplodeState s) + { + int lit; /* true if literals are coded */ + int dict; /* log2(dictionary size) - 6 */ + int symbol; /* decoded symbol, extra bits for distance */ + int len; /* length for copy */ + int dist; /* distance for copy */ + int copy; /* copy counter */ + Ptr from, to; /* copy pointers */ + + // set up decoding tables (once--might not be thread-safe) + lock (virginity) + { + if (virgin) + { + construct(ref litcode, litlen); + construct(ref lencode, lenlen); + construct(ref distcode, distlen); + virgin = false; + } + } + + // read header + lit = bits(s, 8); + if (lit > 1) return -1; + dict = bits(s, 8); + if (dict < 4 || dict > 6) return -2; + + // decode literals and length/distance pairs + do + { + if (bits(s, 1) != 0) + { + // get length + symbol = decode(s, ref lencode); + len = _base[symbol] + bits(s, extra[symbol]); + if (len == 519) break; // end code + + // get distance + symbol = len == 2 ? 2 : dict; + dist = decode(s, ref distcode) << symbol; + dist += bits(s, symbol); + dist++; + if (s.first != 0 && dist > s.next) + { + throw new ArgumentOutOfRangeException("distance too far back"); + } + + // copy length bytes from distance bytes back + do + { + to = s.outdata + s.next; + from = to - dist; + copy = -1; + if (s.next < dist) + { + from += copy; + copy = dist; + } + copy -= s.next; + if (copy > len) copy = len; + len -= copy; + s.next += copy; + do + { + to.SetValueThenIncrement(from.GetValueThenIncrement()); + } + while (--copy != 0); + if (s.next == -1) + { + s.outputStream.Write(s.outdata.ToArray()); + s.next = 0; + s.first = 0; + } + } while (len != 0); + } + else + { + // get literal and write it + symbol = (lit != 0) ? decode(s, ref litcode) : bits(s, 8); + s.outdata.SetValueThenIncrement((byte)symbol); + if (s.next == -1) + { + s.outputStream.Write(s.outdata.ToArray()); + s.next = 0; + s.first = 0; + } + } + } + while (true); + return 0; + } + + void blast(System.IO.Stream inputStream, System.IO.Stream outputStream, Ptr outdata, int outsz) + { + ExplodeState s = new ExplodeState(); // input/output state + + // initialize input state + s.inputStream = inputStream; + s.left = 0; + s.bitbuf = 0; + s.bitcnt = 0; + s.indata = new Ptr(new byte[0]); + + // initialize output state + s.outputStream = outputStream; + s.next = 0; + s.first = 1; + s.outdata = new Ptr(new byte[0]); + + // decompress + decomp(ref s); + + // write any leftover output + if (s.outdata.Size > 0) s.outputStream.Write(s.outdata.ToArray()); + } + + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeDelegates.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeDelegates.cs new file mode 100644 index 00000000..ec704d4c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeDelegates.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Explode.Internal +{ + public delegate uint ExplodeInputFunction(object how, ref Ptr buf); + public delegate int ExplodeOutputFunction(object how, Ptr buf, uint len); +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeHuffman.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeHuffman.cs new file mode 100644 index 00000000..586d88f6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeHuffman.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Explode.Internal +{ + /// + /// Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of each length, + /// which for a canonical code are stepped through in order. symbol[] are the symbol values in + /// canonical order, where the number of entries is the sum of the counts in count[]. + /// + public struct ExplodeHuffman + { + /// + /// Number of symbols of each length + /// + public Ptr count; + + /// + /// Canonically ordered symbols + /// + public Ptr symbol; + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeInfo.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeInfo.cs new file mode 100644 index 00000000..23451a24 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeInfo.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Explode.Internal +{ + public struct ExplodeInfo + { + public Stream instr; + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeState.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeState.cs new file mode 100644 index 00000000..a934a06f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Explode/Internal/ExplodeState.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Explode.Internal +{ + /// + /// Stores information about input and output state. + /// + public struct ExplodeState + { + // input state + /// + /// Input function provided by user + /// + public System.IO.Stream inputStream; + /// + /// + /// + public Ptr indata; + /// + /// Available input at in + /// + public uint left; + /// + /// Bit buffer + /// + public int bitbuf; + /// + /// Number of bits in bit buffer + /// + public int bitcnt; + + // input limit error return state for bits() and decode() + // jmp_buf env; + + /* output state */ + /// + /// Output function provided by user + /// + public System.IO.Stream outputStream; + /// + /// Index of next write location in outdata[] + /// + public int next; + /// + /// True to check distances (for first 4K) + /// + public int first; + /// + /// Output buffer and sliding window + /// + public Ptr outdata; + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipCompressionModule.cs new file mode 100644 index 00000000..adc6d145 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipCompressionModule.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Gzip +{ + public class GzipCompressionModule : CompressionModule + { + public override string Name + { + get { return "gzip"; } + } + + public const int BUFFERSIZE = 4096; + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + System.IO.Compression.GZipStream dst = new System.IO.Compression.GZipStream(outputStream, System.IO.Compression.CompressionMode.Compress); + int read = 0; + int start = 0; + do + { + byte[] buffer = new byte[BUFFERSIZE]; + read = inputStream.Read(buffer, start, buffer.Length); + dst.Write(buffer, 0, read); + } + while (read == BUFFERSIZE); + } + + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + System.IO.Compression.GZipStream dst = new System.IO.Compression.GZipStream(inputStream, System.IO.Compression.CompressionMode.Decompress); + int read = 0; + int start = 0; + do + { + byte[] buffer = new byte[BUFFERSIZE]; + read = dst.Read(buffer, start, buffer.Length); + outputStream.Write(buffer, 0, read); + } + while (read == BUFFERSIZE); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipStream.cs new file mode 100644 index 00000000..08df5eb0 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/GzipStream.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Security.Permissions; + +namespace UniversalEditor.Compression.Modules.Gzip +{ + /// + /// UE wrapper around System.IO.Compression.GZipStream + /// + public class GzipStream + { + public static byte[] Compress(byte[] source) + { + MemoryStream ms = new MemoryStream(); + System.IO.Compression.GZipStream gst = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress); + gst.Write(source, 0, source.Length); + gst.Flush(); + gst.Close(); + return ms.ToArray(); + } + public static byte[] Decompress(byte[] source) + { + return Decompress(source, 0); + } + public static byte[] Decompress(byte[] source, int start) + { + MemoryStream msDest = new MemoryStream(); + MemoryStream ms = new MemoryStream(source); + System.IO.Compression.GZipStream gst = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress); + int read; + do + { + byte[] buffer = new byte[4096]; + read = gst.Read(buffer, start, buffer.Length); + msDest.Write(buffer, 0, read); + } + while (read != 0); + gst.Close(); + return msDest.ToArray(); + } + public static byte[] Decompress(byte[] source, int start, int uncompressedLength) + { + byte[] dest = new byte[uncompressedLength]; + MemoryStream ms = new MemoryStream(source); + System.IO.Compression.GZipStream gst = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress); + int read = gst.Read(dest, start, uncompressedLength); + gst.Flush(); + gst.Close(); + return dest; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipDecoder.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipDecoder.cs new file mode 100644 index 00000000..89fa61c3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipDecoder.cs @@ -0,0 +1,341 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Modules.Deflate.Internal; +using UniversalEditor.Compression.Common; + +namespace UniversalEditor.Compression.Modules.Gzip.Internal +{ + internal class GzipDecoder + { + private const int CommentFlag = 16; + private const int CRCFlag = 2; + private const int ExtraFieldsFlag = 4; + private const int FileNameFlag = 8; + private const int FileText = 1; + private int gzip_header_flag; + private int gzip_header_xlen; + private uint gzipCrc32; + private GzipHeaderState gzipFooterSubstate; + private GzipHeaderState gzipHeaderSubstate; + private uint gzipOutputStreamSize; + private InputBuffer input; + private int loopCounter; + public uint Crc32 + { + get + { + return this.gzipCrc32; + } + } + public uint StreamSize + { + get + { + return this.gzipOutputStreamSize; + } + } + public GzipDecoder(InputBuffer input) + { + this.input = input; + this.Reset(); + } + public bool ReadGzipFooter() + { + this.input.SkipToByteBoundary(); + bool result; + if (this.gzipFooterSubstate == GzipHeaderState.ReadingCRC) + { + while (this.loopCounter < 4) + { + int bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + this.gzipCrc32 |= (uint)((uint)bits << 8 * this.loopCounter); + this.loopCounter++; + } + this.gzipFooterSubstate = GzipHeaderState.ReadingFileSize; + this.loopCounter = 0; + } + if (this.gzipFooterSubstate == GzipHeaderState.ReadingFileSize) + { + if (this.loopCounter == 0) + { + this.gzipOutputStreamSize = 0u; + } + while (this.loopCounter < 4) + { + int num2 = this.input.GetBits(8); + if (num2 < 0) + { + result = false; + return result; + } + this.gzipOutputStreamSize |= (uint)((uint)num2 << 8 * this.loopCounter); + this.loopCounter++; + } + } + result = true; + return result; + } + public bool ReadGzipHeader() + { + int bits; + bool result; + switch (this.gzipHeaderSubstate) + { + case GzipHeaderState.ReadingID1: + { + bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + if (bits != 31) + { + throw new InvalidDataException("CorruptedGZipHeader"); + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingID2; + break; + } + case GzipHeaderState.ReadingID2: + { + break; + } + case GzipHeaderState.ReadingCM: + { + goto IL_114; + } + case GzipHeaderState.ReadingFLG: + { + goto IL_14F; + } + case GzipHeaderState.ReadingMMTime: + { + goto IL_184; + } + case GzipHeaderState.ReadingXFL: + { + goto IL_1D1; + } + case GzipHeaderState.ReadingOS: + { + goto IL_1F6; + } + case GzipHeaderState.ReadingXLen1: + { + goto IL_21B; + } + case GzipHeaderState.ReadingXLen2: + { + goto IL_261; + } + case GzipHeaderState.ReadingXLenData: + { + goto IL_2A0; + } + case GzipHeaderState.ReadingFileName: + { + goto IL_2F3; + } + case GzipHeaderState.ReadingComment: + { + goto IL_348; + } + case GzipHeaderState.ReadingCRC16Part1: + { + goto IL_39B; + } + case GzipHeaderState.ReadingCRC16Part2: + { + goto IL_3DB; + } + case GzipHeaderState.Done: + { + goto IL_3FE; + } + default: + { + throw new InvalidDataException("UnknownState"); + } + } + bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + if (bits != 139) + { + throw new InvalidDataException("CorruptedGZipHeader"); + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingCM; + IL_114: + bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + if (bits != 8) + { + throw new InvalidDataException("UnknownCompressionMode"); + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingFLG; + IL_14F: + bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + this.gzip_header_flag = bits; + this.gzipHeaderSubstate = GzipHeaderState.ReadingMMTime; + this.loopCounter = 0; + IL_184: + while (this.loopCounter < 4) + { + if (this.input.GetBits(8) < 0) + { + result = false; + return result; + } + this.loopCounter++; + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingXFL; + this.loopCounter = 0; + IL_1D1: + if (this.input.GetBits(8) < 0) + { + result = false; + return result; + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingOS; + IL_1F6: + if (this.input.GetBits(8) < 0) + { + result = false; + return result; + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingXLen1; + IL_21B: + if ((this.gzip_header_flag & 4) == 0) + { + goto IL_2F3; + } + bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + this.gzip_header_xlen = bits; + this.gzipHeaderSubstate = GzipHeaderState.ReadingXLen2; + IL_261: + bits = this.input.GetBits(8); + if (bits < 0) + { + result = false; + return result; + } + this.gzip_header_xlen |= bits << 8; + this.gzipHeaderSubstate = GzipHeaderState.ReadingXLenData; + this.loopCounter = 0; + IL_2A0: + while (this.loopCounter < this.gzip_header_xlen) + { + if (this.input.GetBits(8) < 0) + { + result = false; + return result; + } + this.loopCounter++; + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingFileName; + this.loopCounter = 0; + IL_2F3: + if ((this.gzip_header_flag & 8) == 0) + { + this.gzipHeaderSubstate = GzipHeaderState.ReadingComment; + } + else + { + while (true) + { + bits = this.input.GetBits(8); + if (bits < 0) + { + break; + } + if (bits == 0) + { + goto Block_20; + } + } + result = false; + return result; + Block_20: + this.gzipHeaderSubstate = GzipHeaderState.ReadingComment; + } + IL_348: + if ((this.gzip_header_flag & 16) == 0) + { + this.gzipHeaderSubstate = GzipHeaderState.ReadingCRC16Part1; + } + else + { + while (true) + { + bits = this.input.GetBits(8); + if (bits < 0) + { + break; + } + if (bits == 0) + { + goto Block_23; + } + } + result = false; + return result; + Block_23: + this.gzipHeaderSubstate = GzipHeaderState.ReadingCRC16Part1; + } + IL_39B: + if ((this.gzip_header_flag & 2) == 0) + { + this.gzipHeaderSubstate = GzipHeaderState.Done; + goto IL_3FE; + } + if (this.input.GetBits(8) < 0) + { + result = false; + return result; + } + this.gzipHeaderSubstate = GzipHeaderState.ReadingCRC16Part2; + IL_3DB: + if (this.input.GetBits(8) < 0) + { + result = false; + return result; + } + this.gzipHeaderSubstate = GzipHeaderState.Done; + IL_3FE: + result = true; + return result; + } + public void Reset() + { + this.gzipHeaderSubstate = GzipHeaderState.ReadingID1; + this.gzipFooterSubstate = GzipHeaderState.ReadingCRC; + this.gzipCrc32 = 0u; + this.gzipOutputStreamSize = 0u; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipHeaderState.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipHeaderState.cs new file mode 100644 index 00000000..b77a9507 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Gzip/Internal/GzipHeaderState.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Gzip.Internal +{ + internal enum GzipHeaderState + { + ReadingID1, + ReadingID2, + ReadingCM, + ReadingFLG, + ReadingMMTime, + ReadingXFL, + ReadingOS, + ReadingXLen1, + ReadingXLen2, + ReadingXLenData, + ReadingFileName, + ReadingComment, + ReadingCRC16Part1, + ReadingCRC16Part2, + Done, + ReadingCRC, + ReadingFileSize + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZRW1/LZRW1CompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZRW1/LZRW1CompressionModule.cs new file mode 100644 index 00000000..8dc98f59 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZRW1/LZRW1CompressionModule.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.IO; + +namespace UniversalEditor.Compression.Modules.LZRW1 +{ + public class LZRW1CompressionModule : CompressionModule + { + /// + /// Number of bytes used by copy flag + /// + private const byte FLAG_BYTES = 0x04; + + private const byte FLAG_COMPRESS = 0x00; + private const byte FLAG_COPY = 0x01; + + + public override string Name + { + get { return "LZRW1"; } + } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + throw new NotImplementedException(); + } + + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + StreamAccessor sao = new StreamAccessor(outputStream); + StreamAccessor sai = new StreamAccessor(inputStream); + Reader br = new Reader(sai); + Writer bw = new Writer(sao); + + /* + byte *p_src = p_src_first + 4, + *p_dst = p_dst_first, + *p_dst_end = p_dst_first + dst_len; + byte *p_src_post = p_src_first + src_len; + byte *p_src_max16 = p_src_first + src_len - (16 * 2); + */ + + uint control = 1; + + uint flag = br.ReadUInt32(); + if (flag == FLAG_COPY) + { + // entire stream is uncompressed, so read it all + byte[] data = br.ReadToEnd(); + bw.WriteBytes(data); + } + while (!br.EndOfStream) + { + uint unroll; + if (control == 1) + { + control = (uint)(0x10000 | br.ReadByte()); + control |= (uint)(br.ReadByte() << 8); + } + unroll = (uint)((br.Accessor.Position <= (br.Accessor.Length - 32)) ? 16 : 1); + while (unroll-- != 0) + { + if ((control & 1) != 0) + { + byte offsetCalcByte1 = br.ReadByte(); + byte offsetCalcByte2 = br.ReadByte(); + + ushort offset = (ushort)(((offsetCalcByte1 & 0xF0) << 4) | offsetCalcByte2); + ushort len = (ushort)(offsetCalcByte1 & 0xF); + + long oldpos = sao.Position; + sao.Position = sao.Length - offset; + + IO.Reader bro = new Reader(sao); + byte value = bro.ReadByte(); + + sao.Position = oldpos; + + // if((p_dst + offset) > p_dst_end) return(-1); + + + for (int i = 0; i < len + 3; i++) + { + bw.WriteByte(value); + } + + System.IO.File.WriteAllBytes(@"C:\Temp\Test.dat", outputStream.ToByteArray()); + } + else + { + if (br.EndOfStream) return; + bw.WriteByte(br.ReadByte()); + System.IO.File.WriteAllBytes(@"C:\Temp\Test.dat", outputStream.ToByteArray()); + } + control >>= 1; + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/Internal/Constants.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/Internal/Constants.cs new file mode 100644 index 00000000..fecb1476 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/Internal/Constants.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.LZX.Internal +{ + internal class Constants + { + public const ushort MIN_MATCH = 2; + public const ushort MAX_MATCH = 257; + public const ushort NUM_CHARS = 256; + + public enum BLOCKTYPE + { + INVALID = 0, + VERBATIM = 1, + ALIGNED = 2, + UNCOMPRESSED = 3 + } + + public const ushort PRETREE_NUM_ELEMENTS = 20; + public const ushort ALIGNED_NUM_ELEMENTS = 8; + public const ushort NUM_PRIMARY_LENGTHS = 7; + public const ushort NUM_SECONDARY_LENGTHS = 249; + + public const ushort PRETREE_MAXSYMBOLS = PRETREE_NUM_ELEMENTS; + public const ushort PRETREE_TABLEBITS = 6; + public const ushort MAINTREE_MAXSYMBOLS = NUM_CHARS + 50 * 8; + public const ushort MAINTREE_TABLEBITS = 12; + public const ushort LENGTH_MAXSYMBOLS = NUM_SECONDARY_LENGTHS + 1; + public const ushort LENGTH_TABLEBITS = 12; + public const ushort ALIGNED_MAXSYMBOLS = ALIGNED_NUM_ELEMENTS; + public const ushort ALIGNED_TABLEBITS = 7; + + public const ushort LENTABLE_SAFETY = 64; + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/LZXCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/LZXCompressionModule.cs new file mode 100644 index 00000000..5ee187df --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/LZX/LZXCompressionModule.cs @@ -0,0 +1,773 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; + +using UniversalEditor.Compression.Modules.LZX.Internal; + +/* This file was derived from libmspack + * (C) 2003-2004 Stuart Caie. + * (C) 2011 Ali Scissons. + * + * The LZX method was created by Jonathan Forbes and Tomi Poutanen, adapted + * by Microsoft Corporation. + * + * This source file is Dual licensed; meaning the end-user of this source file + * may redistribute/modify it under the LGPL 2.1 or MS-PL licenses. + * + * Adapted into a Universal Editor Compression Module by Michael Becker. + * + * Original source code: + * https://code.google.com/p/monoxna/source/browse/trunk/src/Microsoft.Xna.Framework/HelperCode/LzxDecoder.cs +*/ + +namespace UniversalEditor.Compression.Modules.LZX +{ + public class LZXCompressionModule : CompressionModule + { + public override string Name + { + get { return "LZX"; } + } + + public static uint[] position_base = null; + public static byte[] extra_bits = null; + + private LzxState m_state; + + public LZXCompressionModule() + { + + } + public LZXCompressionModule(int window) + { + mvarWindowSize = window; + } + + private int mvarWindowSize = 18; + public int WindowSize + { + get { return mvarWindowSize; } + set + { + // setup proper exception + if (value < 15 || value > 21) throw new UnsupportedWindowSizeRangeException(); + + mvarWindowSize = value; + } + } + + protected override void InitializeInternal() + { + // setup proper exception + if (mvarWindowSize < 15 || mvarWindowSize > 21) throw new UnsupportedWindowSizeRangeException(); + + uint wndsize = (uint)(1 << mvarWindowSize); + int posn_slots; + + // let's initialise our state + m_state = new LzxState(); + m_state.actual_size = 0; + m_state.window = new byte[wndsize]; + for (int i = 0; i < wndsize; i++) m_state.window[i] = 0xDC; + m_state.actual_size = wndsize; + m_state.window_size = wndsize; + m_state.window_posn = 0; + + /* initialize static tables */ + if (extra_bits == null) + { + extra_bits = new byte[52]; + for (int i = 0, j = 0; i <= 50; i += 2) + { + extra_bits[i] = extra_bits[i + 1] = (byte)j; + if ((i != 0) && (j < 17)) j++; + } + } + if (position_base == null) + { + position_base = new uint[51]; + for (int i = 0, j = 0; i <= 50; i++) + { + position_base[i] = (uint)j; + j += 1 << extra_bits[i]; + } + } + + // calculate required position slots + if (mvarWindowSize == 20) posn_slots = 42; + else if (mvarWindowSize == 21) posn_slots = 50; + else posn_slots = mvarWindowSize << 1; + + m_state.R0 = m_state.R1 = m_state.R2 = 1; + m_state.main_elements = (ushort)(Constants.NUM_CHARS + (posn_slots << 3)); + m_state.header_read = 0; + m_state.frames_read = 0; + m_state.block_remaining = 0; + m_state.block_type = Constants.BLOCKTYPE.INVALID; + m_state.intel_curpos = 0; + m_state.intel_started = 0; + + // yo dawg i herd u liek arrays so we put arrays in ur arrays so u can array while u array + m_state.PRETREE_table = new ushort[(1 << Constants.PRETREE_TABLEBITS) + (Constants.PRETREE_MAXSYMBOLS << 1)]; + m_state.PRETREE_len = new byte[Constants.PRETREE_MAXSYMBOLS + Constants.LENTABLE_SAFETY]; + m_state.MAINTREE_table = new ushort[(1 << Constants.MAINTREE_TABLEBITS) + (Constants.MAINTREE_MAXSYMBOLS << 1)]; + m_state.MAINTREE_len = new byte[Constants.MAINTREE_MAXSYMBOLS + Constants.LENTABLE_SAFETY]; + m_state.LENGTH_table = new ushort[(1 << Constants.LENGTH_TABLEBITS) + (Constants.LENGTH_MAXSYMBOLS << 1)]; + m_state.LENGTH_len = new byte[Constants.LENGTH_MAXSYMBOLS + Constants.LENTABLE_SAFETY]; + m_state.ALIGNED_table = new ushort[(1 << Constants.ALIGNED_TABLEBITS) + (Constants.ALIGNED_MAXSYMBOLS << 1)]; + m_state.ALIGNED_len = new byte[Constants.ALIGNED_MAXSYMBOLS + Constants.LENTABLE_SAFETY]; + /* initialise tables to 0 (because deltas will be applied to them) */ + for (int i = 0; i < Constants.MAINTREE_MAXSYMBOLS; i++) m_state.MAINTREE_len[i] = 0; + for (int i = 0; i < Constants.LENGTH_MAXSYMBOLS; i++) m_state.LENGTH_len[i] = 0; + } + + protected override void CompressInternal(Stream inputStream, Stream outputStream) + { + throw new NotImplementedException(); + } + protected override void DecompressInternal(Stream inputStream, Stream outputStream, int inputLength, int outputLength) + { + BitBuffer bitbuf = new BitBuffer(inputStream); + + long startpos = inputStream.Position; + long endpos = inputStream.Position + inputLength; + + byte[] window = m_state.window; + + uint window_posn = m_state.window_posn; + uint window_size = m_state.window_size; + uint R0 = m_state.R0; + uint R1 = m_state.R1; + uint R2 = m_state.R2; + uint i, j; + + int togo = outputLength, this_run, main_element, match_length, match_offset, length_footer, extra, verbatim_bits; + int rundest, runsrc, copy_length, aligned_bits; + + bitbuf.InitBitStream(); + + // read header if necessary + if (m_state.header_read == 0) + { + uint intel = bitbuf.ReadBits(1); + if (intel != 0) + { + // read the filesize + i = bitbuf.ReadBits(16); j = bitbuf.ReadBits(16); + m_state.intel_filesize = (int)((i << 16) | j); + } + m_state.header_read = 1; + } + + // main decoding loop + while (togo > 0) + { + // last block finished, new block expected + if (m_state.block_remaining == 0) + { + // TODO may screw something up here + if (m_state.block_type == Constants.BLOCKTYPE.UNCOMPRESSED) + { + if ((m_state.block_length & 1) == 1) inputStream.ReadByte(); /* realign bitstream to word */ + bitbuf.InitBitStream(); + } + + m_state.block_type = (Constants.BLOCKTYPE)bitbuf.ReadBits(3); ; + i = bitbuf.ReadBits(16); + j = bitbuf.ReadBits(8); + m_state.block_remaining = m_state.block_length = (uint)((i << 8) | j); + + switch (m_state.block_type) + { + case Constants.BLOCKTYPE.ALIGNED: + { + for (i = 0, j = 0; i < 8; i++) { j = bitbuf.ReadBits(3); m_state.ALIGNED_len[i] = (byte)j; } + MakeDecodeTable(Constants.ALIGNED_MAXSYMBOLS, Constants.ALIGNED_TABLEBITS, + m_state.ALIGNED_len, m_state.ALIGNED_table); + /* rest of aligned header is same as verbatim */ + goto case Constants.BLOCKTYPE.VERBATIM; + } + case Constants.BLOCKTYPE.VERBATIM: + { + ReadLengths(m_state.MAINTREE_len, 0, 256, bitbuf); + ReadLengths(m_state.MAINTREE_len, 256, m_state.main_elements, bitbuf); + MakeDecodeTable(Constants.MAINTREE_MAXSYMBOLS, Constants.MAINTREE_TABLEBITS, + m_state.MAINTREE_len, m_state.MAINTREE_table); + if (m_state.MAINTREE_len[0xE8] != 0) m_state.intel_started = 1; + + ReadLengths(m_state.LENGTH_len, 0, Constants.NUM_SECONDARY_LENGTHS, bitbuf); + MakeDecodeTable(Constants.LENGTH_MAXSYMBOLS, Constants.LENGTH_TABLEBITS, + m_state.LENGTH_len, m_state.LENGTH_table); + break; + } + case Constants.BLOCKTYPE.UNCOMPRESSED: + { + m_state.intel_started = 1; /* because we can't assume otherwise */ + bitbuf.EnsureBits(16); /* get up to 16 pad bits into the buffer */ + if (bitbuf.GetBitsLeft() > 16) inputStream.Seek(-2, SeekOrigin.Current); /* and align the bitstream! */ + byte hi, mh, ml, lo; + lo = (byte)inputStream.ReadByte(); ml = (byte)inputStream.ReadByte(); mh = (byte)inputStream.ReadByte(); hi = (byte)inputStream.ReadByte(); + R0 = (uint)(lo | ml << 8 | mh << 16 | hi << 24); + lo = (byte)inputStream.ReadByte(); ml = (byte)inputStream.ReadByte(); mh = (byte)inputStream.ReadByte(); hi = (byte)inputStream.ReadByte(); + R1 = (uint)(lo | ml << 8 | mh << 16 | hi << 24); + lo = (byte)inputStream.ReadByte(); ml = (byte)inputStream.ReadByte(); mh = (byte)inputStream.ReadByte(); hi = (byte)inputStream.ReadByte(); + R2 = (uint)(lo | ml << 8 | mh << 16 | hi << 24); + break; + } + default: + { + throw new InvalidOperationException("Unknown block type " + m_state.block_type); + } + } + } + + // buffer exhaustion check + if (inputStream.Position > (startpos + inputLength)) + { + // it's possible to have a file where the next run is less than + // 16 bits in size. In this case, the READ_HUFFSYM() macro used + // in building the tables will exhaust the buffer, so we should + // allow for this, but not allow those accidentally read bits to + // be used (so we check that there are at least 16 bits + // remaining - in this boundary case they aren't really part of + // the compressed data) + + if (inputStream.Position > (startpos + inputLength + 2) || bitbuf.GetBitsLeft() < 16) + { + throw new InvalidOperationException("WTF"); + } + } + + while ((this_run = (int)m_state.block_remaining) > 0 && togo > 0) + { + if (this_run > togo) this_run = togo; + togo -= this_run; + m_state.block_remaining -= (uint)this_run; + + /* apply 2^x-1 mask */ + window_posn &= window_size - 1; + /* runs can't straddle the window wraparound */ + if ((window_posn + this_run) > window_size) + { + throw new InvalidOperationException("window_posn + this_run is greater than window_size"); + } + + switch (m_state.block_type) + { + case Constants.BLOCKTYPE.VERBATIM: + { + while (this_run > 0) + { + main_element = (int)ReadHuffSym(m_state.MAINTREE_table, m_state.MAINTREE_len, + Constants.MAINTREE_MAXSYMBOLS, Constants.MAINTREE_TABLEBITS, + bitbuf); + if (main_element < Constants.NUM_CHARS) + { + /* literal: 0 to NUM_CHARS-1 */ + window[window_posn++] = (byte)main_element; + this_run--; + } + else + { + /* match: NUM_CHARS + ((slot<<3) | length_header (3 bits)) */ + main_element -= Constants.NUM_CHARS; + + match_length = main_element & Constants.NUM_PRIMARY_LENGTHS; + if (match_length == Constants.NUM_PRIMARY_LENGTHS) + { + length_footer = (int)ReadHuffSym(m_state.LENGTH_table, m_state.LENGTH_len, + Constants.LENGTH_MAXSYMBOLS, Constants.LENGTH_TABLEBITS, + bitbuf); + match_length += length_footer; + } + match_length += Constants.MIN_MATCH; + + match_offset = main_element >> 3; + + if (match_offset > 2) + { + /* not repeated offset */ + if (match_offset != 3) + { + extra = extra_bits[match_offset]; + verbatim_bits = (int)bitbuf.ReadBits((byte)extra); + match_offset = (int)position_base[match_offset] - 2 + verbatim_bits; + } + else + { + match_offset = 1; + } + + /* update repeated offset LRU queue */ + R2 = R1; R1 = R0; R0 = (uint)match_offset; + } + else if (match_offset == 0) + { + match_offset = (int)R0; + } + else if (match_offset == 1) + { + match_offset = (int)R1; + R1 = R0; R0 = (uint)match_offset; + } + else /* match_offset == 2 */ + { + match_offset = (int)R2; + R2 = R0; R0 = (uint)match_offset; + } + + rundest = (int)window_posn; + this_run -= match_length; + + /* copy any wrapped around source data */ + if (window_posn >= match_offset) + { + /* no wrap */ + runsrc = rundest - match_offset; + } + else + { + runsrc = rundest + ((int)window_size - match_offset); + copy_length = match_offset - (int)window_posn; + if (copy_length < match_length) + { + match_length -= copy_length; + window_posn += (uint)copy_length; + while (copy_length-- > 0) window[rundest++] = window[runsrc++]; + runsrc = 0; + } + } + window_posn += (uint)match_length; + + /* copy match data - no worries about destination wraps */ + while (match_length-- > 0) window[rundest++] = window[runsrc++]; + } + } + break; + } + case Constants.BLOCKTYPE.ALIGNED: + { + while (this_run > 0) + { + main_element = (int)ReadHuffSym(m_state.MAINTREE_table, m_state.MAINTREE_len, + Constants.MAINTREE_MAXSYMBOLS, Constants.MAINTREE_TABLEBITS, + bitbuf); + + if (main_element < Constants.NUM_CHARS) + { + /* literal 0 to NUM_CHARS-1 */ + window[window_posn++] = (byte)main_element; + this_run--; + } + else + { + /* match: NUM_CHARS + ((slot<<3) | length_header (3 bits)) */ + main_element -= Constants.NUM_CHARS; + + match_length = main_element & Constants.NUM_PRIMARY_LENGTHS; + if (match_length == Constants.NUM_PRIMARY_LENGTHS) + { + length_footer = (int)ReadHuffSym(m_state.LENGTH_table, m_state.LENGTH_len, + Constants.LENGTH_MAXSYMBOLS, Constants.LENGTH_TABLEBITS, + bitbuf); + match_length += length_footer; + } + match_length += Constants.MIN_MATCH; + + match_offset = main_element >> 3; + + if (match_offset > 2) + { + /* not repeated offset */ + extra = extra_bits[match_offset]; + match_offset = (int)position_base[match_offset] - 2; + if (extra > 3) + { + /* verbatim and aligned bits */ + extra -= 3; + verbatim_bits = (int)bitbuf.ReadBits((byte)extra); + match_offset += (verbatim_bits << 3); + aligned_bits = (int)ReadHuffSym(m_state.ALIGNED_table, m_state.ALIGNED_len, + Constants.ALIGNED_MAXSYMBOLS, Constants.ALIGNED_TABLEBITS, + bitbuf); + match_offset += aligned_bits; + } + else if (extra == 3) + { + /* aligned bits only */ + aligned_bits = (int)ReadHuffSym(m_state.ALIGNED_table, m_state.ALIGNED_len, + Constants.ALIGNED_MAXSYMBOLS, Constants.ALIGNED_TABLEBITS, + bitbuf); + match_offset += aligned_bits; + } + else if (extra > 0) /* extra==1, extra==2 */ + { + /* verbatim bits only */ + verbatim_bits = (int)bitbuf.ReadBits((byte)extra); + match_offset += verbatim_bits; + } + else /* extra == 0 */ + { + /* ??? */ + match_offset = 1; + } + + /* update repeated offset LRU queue */ + R2 = R1; R1 = R0; R0 = (uint)match_offset; + } + else if (match_offset == 0) + { + match_offset = (int)R0; + } + else if (match_offset == 1) + { + match_offset = (int)R1; + R1 = R0; R0 = (uint)match_offset; + } + else /* match_offset == 2 */ + { + match_offset = (int)R2; + R2 = R0; R0 = (uint)match_offset; + } + + rundest = (int)window_posn; + this_run -= match_length; + + /* copy any wrapped around source data */ + if (window_posn >= match_offset) + { + /* no wrap */ + runsrc = rundest - match_offset; + } + else + { + runsrc = rundest + ((int)window_size - match_offset); + copy_length = match_offset - (int)window_posn; + if (copy_length < match_length) + { + match_length -= copy_length; + window_posn += (uint)copy_length; + while (copy_length-- > 0) window[rundest++] = window[runsrc++]; + runsrc = 0; + } + } + window_posn += (uint)match_length; + + /* copy match data - no worries about destination wraps */ + while (match_length-- > 0) window[rundest++] = window[runsrc++]; + } + } + break; + } + case Constants.BLOCKTYPE.UNCOMPRESSED: + { + if ((inputStream.Position + this_run) > endpos) throw new EndOfStreamException(); + + byte[] temp_buffer = new byte[this_run]; + inputStream.Read(temp_buffer, 0, this_run); + temp_buffer.CopyTo(window, window_posn); + window_posn += (uint)this_run; + break; + } + default: + { + throw new InvalidOperationException("Unknown block type " + m_state.block_type); + } + } + } + } + + if (togo != 0) throw new InvalidOperationException("togo is not equal to 0"); + int start_window_pos = (int)window_posn; + if (start_window_pos == 0) start_window_pos = (int)window_size; + start_window_pos -= outputLength; + outputStream.Write(window, start_window_pos, outputLength); + + m_state.window_posn = window_posn; + m_state.R0 = R0; + m_state.R1 = R1; + m_state.R2 = R2; + + // TODO finish intel E8 decoding + #region intel E8 decoding + if ((m_state.frames_read++ < 32768) && m_state.intel_filesize != 0) + { + if (outputLength <= 6 || m_state.intel_started == 0) + { + m_state.intel_curpos += outputLength; + } + else + { + int dataend = outputLength - 10; + uint curpos = (uint)m_state.intel_curpos; + uint filesize = (uint)m_state.intel_filesize; + uint abs_off, rel_off; + + m_state.intel_curpos = (int)curpos + outputLength; + + while (outputStream.Position < dataend) + { + if (outputStream.ReadByte() != 0xE8) { curpos++; continue; } + //abs_off = + } + } + throw new NotImplementedException("intel e8 decoding not finished"); + } + #endregion + } + + // READ_LENGTHS(table, first, last) + // if(lzx_read_lens(LENTABLE(table), first, last, bitsleft)) + // return ERROR (ILLEGAL_DATA) + // + + // TODO make returns throw exceptions + private int MakeDecodeTable(uint nsyms, uint nbits, byte[] length, ushort[] table) + { + ushort sym; + uint leaf; + byte bit_num = 1; + uint fill; + uint pos = 0; // the current position in the decode table + uint table_mask = (uint)(1 << (int)nbits); + uint bit_mask = table_mask >> 1; // don't do 0 length codes + uint next_symbol = bit_mask; // base of allocation for long codes + + // fill entries for codes short enough for a direct mapping + while (bit_num <= nbits) + { + for (sym = 0; sym < nsyms; sym++) + { + if (length[sym] == bit_num) + { + leaf = pos; + + if ((pos += bit_mask) > table_mask) return 1; /* table overrun */ + + /* fill all possible lookups of this symbol with the symbol itself */ + fill = bit_mask; + while (fill-- > 0) table[leaf++] = sym; + } + } + bit_mask >>= 1; + bit_num++; + } + + // if there are any codes longer than nbits + if (pos != table_mask) + { + // clear the remainder of the table + for (sym = (ushort)pos; sym < table_mask; sym++) table[sym] = 0; + + // give ourselves room for codes to grow by up to 16 more bits + pos <<= 16; + table_mask <<= 16; + bit_mask = 1 << 15; + + while (bit_num <= 16) + { + for (sym = 0; sym < nsyms; sym++) + { + if (length[sym] == bit_num) + { + leaf = pos >> 16; + for (fill = 0; fill < bit_num - nbits; fill++) + { + /* if this path hasn't been taken yet, 'allocate' two entries */ + if (table[leaf] == 0) + { + table[(next_symbol << 1)] = 0; + table[(next_symbol << 1) + 1] = 0; + table[leaf] = (ushort)(next_symbol++); + } + /* follow the path and select either left or right for next bit */ + leaf = (uint)(table[leaf] << 1); + if (((pos >> (int)(15 - fill)) & 1) == 1) leaf++; + } + table[leaf] = sym; + + if ((pos += bit_mask) > table_mask) return 1; + } + } + bit_mask >>= 1; + bit_num++; + } + } + + // full table? + if (pos == table_mask) return 0; + + // either erroneous table, or all elements are 0 - let's find out. + for (sym = 0; sym < nsyms; sym++) if (length[sym] != 0) return 1; + return 0; + } + + // TODO throw exceptions instead of returns + private void ReadLengths(byte[] lens, uint first, uint last, BitBuffer bitbuf) + { + uint x, y; + int z; + + // hufftbl pointer here? + + for (x = 0; x < 20; x++) + { + y = bitbuf.ReadBits(4); + m_state.PRETREE_len[x] = (byte)y; + } + MakeDecodeTable(Constants.PRETREE_MAXSYMBOLS, Constants.PRETREE_TABLEBITS, + m_state.PRETREE_len, m_state.PRETREE_table); + + for (x = first; x < last;) + { + z = (int)ReadHuffSym(m_state.PRETREE_table, m_state.PRETREE_len, + Constants.PRETREE_MAXSYMBOLS, Constants.PRETREE_TABLEBITS, bitbuf); + if (z == 17) + { + y = bitbuf.ReadBits(4); y += 4; + while (y-- != 0) lens[x++] = 0; + } + else if (z == 18) + { + y = bitbuf.ReadBits(5); y += 20; + while (y-- != 0) lens[x++] = 0; + } + else if (z == 19) + { + y = bitbuf.ReadBits(1); y += 4; + z = (int)ReadHuffSym(m_state.PRETREE_table, m_state.PRETREE_len, + Constants.PRETREE_MAXSYMBOLS, Constants.PRETREE_TABLEBITS, bitbuf); + z = lens[x] - z; if (z < 0) z += 17; + while (y-- != 0) lens[x++] = (byte)z; + } + else + { + z = lens[x] - z; if (z < 0) z += 17; + lens[x++] = (byte)z; + } + } + } + + private uint ReadHuffSym(ushort[] table, byte[] lengths, uint nsyms, uint nbits, BitBuffer bitbuf) + { + uint i, j; + bitbuf.EnsureBits(16); + if ((i = table[bitbuf.PeekBits((byte)nbits)]) >= nsyms) + { + j = (uint)(1 << (int)((sizeof(uint) * 8) - nbits)); + do + { + j >>= 1; i <<= 1; i |= (bitbuf.GetBuffer() & j) != 0 ? (uint)1 : 0; + if (j == 0) return 0; // TODO throw proper exception + } while ((i = table[i]) >= nsyms); + } + j = lengths[i]; + bitbuf.RemoveBits((byte)j); + + return i; + } + + #region Our BitBuffer Class + private class BitBuffer + { + uint buffer; + byte bitsleft; + Stream byteStream; + + public BitBuffer(Stream stream) + { + byteStream = stream; + InitBitStream(); + } + + public void InitBitStream() + { + buffer = 0; + bitsleft = 0; + } + + public void EnsureBits(byte bits) + { + while (bitsleft < bits) + { + int lo = (byte)byteStream.ReadByte(); + int hi = (byte)byteStream.ReadByte(); + int amount2shift = sizeof(uint) * 8 - 16 - bitsleft; + buffer |= (uint)(((hi << 8) | lo) << (sizeof(uint) * 8 - 16 - bitsleft)); + bitsleft += 16; + } + } + + public uint PeekBits(byte bits) + { + return (buffer >> ((sizeof(uint) * 8) - bits)); + } + + public void RemoveBits(byte bits) + { + buffer <<= bits; + bitsleft -= bits; + } + + public uint ReadBits(byte bits) + { + uint ret = 0; + + if (bits > 0) + { + EnsureBits(bits); + ret = PeekBits(bits); + RemoveBits(bits); + } + + return ret; + } + + public uint GetBuffer() + { + return buffer; + } + + public byte GetBitsLeft() + { + return bitsleft; + } + } + #endregion + + struct LzxState + { + public uint R0, R1, R2; /* for the LRU offset system */ + public ushort main_elements; /* number of main tree elements */ + public int header_read; /* have we started decoding at all yet? */ + public Constants.BLOCKTYPE block_type; /* type of this block */ + public uint block_length; /* uncompressed length of this block */ + public uint block_remaining; /* uncompressed bytes still left to decode */ + public uint frames_read; /* the number of CFDATA blocks processed */ + public int intel_filesize; /* magic header value used for transform */ + public int intel_curpos; /* current offset in transform space */ + public int intel_started; /* have we seen any translateable data yet? */ + + public ushort[] PRETREE_table; + public byte[] PRETREE_len; + public ushort[] MAINTREE_table; + public byte[] MAINTREE_len; + public ushort[] LENGTH_table; + public byte[] LENGTH_len; + public ushort[] ALIGNED_table; + public byte[] ALIGNED_len; + + // NEEDED MEMBERS + // CAB actualsize + // CAB window + // CAB window_size + // CAB window_posn + public uint actual_size; + public byte[] window; + public uint window_size; + public uint window_posn; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CNX.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CNX.cs new file mode 100644 index 00000000..235d3082 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CNX.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class CNX : CompressionModule + { + public override string Name + { + get { return "CNX"; } + } + + private string mvarOriginalFileNameExtension = String.Empty; + public string OriginalFileNameExtension { get { return mvarOriginalFileNameExtension; } set { mvarOriginalFileNameExtension = value; } } + + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + uint num = inputStream.ReadUInt(8L).SwapEndian() + 16u; + uint num2 = inputStream.ReadUInt(12L).SwapEndian(); + uint num3 = 16u; + byte[] array = inputStream.ReadBytes(0L, num); + + while (num3 < num && outputStream.Position < num2) + { + byte b = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + for (int i = 0; i < 4; i++) + { + switch (b >> i * 2 & 3) + { + case 0: + { + byte b2 = array[(int)((uint)((UIntPtr)num3))]; + num3 += (uint)((b2 & 255) + 1); + i = 3; + break; + } + case 1: + { + outputStream.Write(array[(int)((uint)((UIntPtr)num3))]); + num3 += 1u; + break; + } + case 2: + { + uint num5 = (uint)BitConverter.ToUInt16(array, (int)num3).SwapEndian(); + uint num6 = (num5 >> 5) + 1u; + uint num7 = (num5 & 31u) + 4u; + num3 += 2u; + int num8 = 0; + while ((long)num8 < (long)((ulong)num7)) + { + long pos = outputStream.Position; + outputStream.Position = pos - num6; + byte val = (byte)outputStream.ReadByte(); + outputStream.Position = pos; + outputStream.Write(val); + num8++; + } + break; + } + case 3: + { + byte b3 = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + for (int j = 0; j < (int)b3; j++) + { + outputStream.Write(array[(int)((uint)((UIntPtr)num3))]); + num3 += 1u; + } + break; + } + } + } + } + } + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + uint num = (uint)inputStream.Length; + uint num2 = 2048u; + byte[] array = inputStream.ToByteArray(); + uint num3 = 0u; + uint num4 = 16u; + uint num5 = 16u; + CompressionDictionaries.LzWindowDictionary lzWindowDictionary = new CompressionDictionaries.LzWindowDictionary(); + lzWindowDictionary.SetBlockSize(2048); + lzWindowDictionary.SetMinMatchAmount(4); + lzWindowDictionary.SetMaxMatchAmount(35); + outputStream.Write("CNX\u0002"); + outputStream.Write(mvarOriginalFileNameExtension, 3); + outputStream.WriteByte(16); + outputStream.Write(0u); + outputStream.Write(num.SwapEndian()); + while (num3 < num) + { + while (num5 < num2) + { + byte b = 0; + uint num6 = num4; + outputStream.WriteByte(b); + num4 += 1u; + for (int i = 0; i < 4; i++) + { + List list = new List(); + int[] array2 = new int[2]; + int[] array3; + do + { + array3 = lzWindowDictionary.Search(array, num3, num); + if (array3[1] == 0) + { + list.Add(array[(int)((uint)((UIntPtr)num3))]); + num3 += 1u; + } + } + while (array3[1] == 0 && list.Count < 255); + if (array3[1] > 0) + { + b |= (byte)(2 << i * 2); + outputStream.WriteByte((byte)((array3[1] - 3 & 15) << 4 | (array3[0] - 1 & 4095) >> 8)); + outputStream.WriteByte((byte)(array3[0] - 1 & 255)); + lzWindowDictionary.AddEntryRange(array, (int)num3, array3[1]); + lzWindowDictionary.SlideWindow(array3[1]); + num3 += (uint)array3[1]; + num4 += 2u; + } + else + { + if (list.Count == 1) + { + b |= (byte)(1 << i * 2); + outputStream.WriteByte(list[0]); + } + else + { + b |= (byte)(3 << i * 2); + outputStream.WriteByte((byte)list.Count); + for (int j = 0; j < list.Count; j++) + { + outputStream.WriteByte(list[j]); + } + } + outputStream.WriteByte(array[(int)((uint)((UIntPtr)num3))]); + lzWindowDictionary.AddEntry(array, (int)num3); + lzWindowDictionary.SlideWindow(1); + num3 += 1u; + num4 += 1u; + } + if (num3 >= num) + { + break; + } + } + outputStream.Seek((long)((ulong)num6), SeekOrigin.Begin); + outputStream.WriteByte(b); + outputStream.Seek((long)((ulong)num4), SeekOrigin.Begin); + } + } + } + + public string DecompressFilename(ref Stream data, string filename) + { + string text = data.ReadString(4L, 3); + string result; + if (!(text == string.Empty)) + { + result = Path.GetFileNameWithoutExtension(filename) + '.' + text; + } + else + { + result = filename; + } + return result; + } + public string CompressFilename(ref Stream data, string filename) + { + return Path.GetFileNameWithoutExtension(filename) + (Path.GetExtension(filename).IsAllUpperCase() ? ".CNX" : ".cnx"); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CXLZ.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CXLZ.cs new file mode 100644 index 00000000..9cbaaddd --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CXLZ.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class CXLZ : CompressionModule + { + public override string Name + { + get { return "CXLZ"; } + } + + protected override void DecompressInternal(Stream inputStream, Stream outputStream, int inputLength, int outputLength) + { + uint num = (uint)inputStream.Length; + uint num2 = inputStream.ReadUInt(4L) >> 8; + uint num3 = 8u; + byte[] array = inputStream.ToByteArray(); + while (num3 < num && outputStream.Position < num2) + { + byte b = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + for (int i = 7; i >= 0; i--) + { + if (((int)b & 1 << i) == 0) + { + outputStream.Write(array[(int)((uint)((UIntPtr)num3))]); + num3 += 1u; + } + else + { + int num5 = ((int)(array[(int)((uint)((UIntPtr)num3))] & 15) << 8 | (int)array[(int)((uint)((UIntPtr)(num3 + 1u)))]) + 1; + int num6 = (array[(int)((uint)((UIntPtr)num3))] >> 4) + 3; + num3 += 2u; + for (int j = 0; j < num6; j++) + { + long pos = inputStream.Position; + inputStream.Position = (inputStream.Position - num5 + j); + + outputStream.WriteByte((byte)inputStream.ReadByte()); + + inputStream.Position = pos; + } + } + if (num3 >= num || outputStream.Position >= num2) + { + break; + } + } + } + } + protected override void CompressInternal(Stream inputStream, Stream outputStream) + { + uint num = (uint)inputStream.Length; + if (inputStream.Length > 16777215L) throw new Exception("Input file is too large to compress."); + + byte[] array = inputStream.ToByteArray(); + uint num2 = 0u; + uint num3 = 8u; + LzWindowDictionary lzWindowDictionary = new LzWindowDictionary(); + lzWindowDictionary.SetWindowSize(4096); + lzWindowDictionary.SetMaxMatchAmount(18); + outputStream.Write("CXLZ"); + outputStream.Write(16u | num << 8); + while (num2 < num) + { + byte b = 0; + uint num4 = num3; + outputStream.WriteByte(b); + num3 += 1u; + for (int i = 7; i >= 0; i--) + { + int[] array2 = lzWindowDictionary.Search(array, num2, num); + if (array2[1] > 0) + { + b |= (byte)(1 << i); + outputStream.WriteByte((byte)((array2[1] - 3 & 15) << 4 | (array2[0] - 1 & 4095) >> 8)); + outputStream.WriteByte((byte)(array2[0] - 1 & 255)); + lzWindowDictionary.AddEntryRange(array, (int)num2, array2[1]); + lzWindowDictionary.SlideWindow(array2[1]); + num2 += (uint)array2[1]; + num3 += 2u; + } + else + { + outputStream.WriteByte(array[(int)((uint)((UIntPtr)num2))]); + lzWindowDictionary.AddEntry(array, (int)num2); + lzWindowDictionary.SlideWindow(1); + num2 += 1u; + num3 += 1u; + } + if (num2 >= num) + { + break; + } + } + outputStream.Seek((long)((ulong)num4), SeekOrigin.Begin); + outputStream.WriteByte(b); + outputStream.Seek((long)((ulong)num3), SeekOrigin.Begin); + } + } + public bool Check(Stream data, string filename) + { + bool result; + try + { + result = (data.ReadString(0L, 5) == "CXLZ\u0010"); + } + catch + { + result = false; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Compression.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Compression.cs new file mode 100644 index 00000000..61f29180 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Compression.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.Puyo +{ + public class Compression + { + public PuyoCompressionModule Compressor; + public PuyoCompressionModule Decompressor; + private Stream Data; + private string Filename; + public CompressionFormat Format + { + get; + private set; + } + public string Name + { + get; + private set; + } + public static Dictionary Dictionary + { + get; + private set; + } + public string DecompressFilename + { + get + { + return this.Decompressor.DecompressFilename(ref this.Data, this.Filename); + } + } + public string CompressFilename + { + get + { + return this.Compressor.CompressFilename(ref this.Data, this.Filename); + } + } + public string OutputDirectory + { + get + { + string result; + if (this.Compressor != null) + { + result = (this.Name ?? "File Data") + " Compressed"; + } + else + { + result = (this.Name ?? "File Data") + " Decompressed"; + } + return result; + } + } + public Compression(Stream data, string filename) + { + this.Format = CompressionFormat.NULL; + this.Name = null; + this.Data = data; + this.Filename = filename; + this.InitalizeDecompressor(); + } + public Compression(Stream data, string filename, CompressionFormat format) + { + this.Name = null; + this.Data = data; + this.Filename = filename; + this.Format = format; + this.InitalizeCompressor(); + } + public MemoryStream Decompress() + { + if (this.Decompressor == null) + { + throw new Exception("Could not decompress because no decompressor was initalized."); + } + return this.Decompressor.Decompress(ref this.Data); + } + public MemoryStream Compress() + { + if (this.Compressor == null) + { + throw new Exception("Could not compress because no compressor was initalized."); + } + return this.Compressor.Compress(ref this.Data, Path.GetFileName(this.Filename)); + } + private void InitalizeDecompressor() + { + this.Format = CompressionFormat.NULL; + this.Decompressor = null; + this.Name = null; + foreach (KeyValuePair current in Compression.Dictionary) + { + if (current.Value.Check(ref this.Data, this.Filename)) + { + if (current.Value.CanDecompress) + { + this.Format = current.Key; + this.Decompressor = current.Value; + this.Name = this.Decompressor.Name; + break; + } + break; + } + } + } + private void InitalizeCompressor() + { + if (Compression.Dictionary.ContainsKey(this.Format) && Compression.Dictionary[this.Format].CanCompress) + { + this.Compressor = Compression.Dictionary[this.Format]; + this.Name = this.Compressor.Name; + } + } + static Compression() + { + Compression.Dictionary = new Dictionary(); + // Compression.Dictionary.Add(CompressionFormat.CNX, new Internal.Compressors.CNX()); + // Compression.Dictionary.Add(CompressionFormat.CXLZ, new Internal.Compressors.CXLZ()); + Compression.Dictionary.Add(CompressionFormat.LZ00, new Internal.Compressors.LZ00()); + Compression.Dictionary.Add(CompressionFormat.LZ01, new Internal.Compressors.LZ01()); + Compression.Dictionary.Add(CompressionFormat.LZSS, new Internal.Compressors.LZSS()); + Compression.Dictionary.Add(CompressionFormat.ONZ, new Internal.Compressors.ONZ()); + Compression.Dictionary.Add(CompressionFormat.PRS, new Internal.Compressors.PRS()); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CompressionFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CompressionFormat.cs new file mode 100644 index 00000000..420f848e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/CompressionFormat.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Puyo +{ + public enum CompressionFormat + { + NULL, + CNX, + CXLZ, + LZ00, + LZ01, + LZSS, + ONZ, + PRS + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzBufferDictionary.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzBufferDictionary.cs new file mode 100644 index 00000000..3a11cb42 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzBufferDictionary.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries +{ + internal class LzBufferDictionary : CompressionDictionary + { + private int MinMatchAmount = 3; + private int MaxMatchAmount = 18; + private int BufferSize; + private int BufferStart; + private int BufferPointer; + private byte[] BufferData; + private List[] OffsetList; + public LzBufferDictionary() + { + this.OffsetList = new List[256]; + for (int i = 0; i < this.OffsetList.Length; i++) + { + this.OffsetList[i] = new List(); + } + this.BufferData = new byte[0]; + } + public int[] Search(byte[] DecompressedData, uint offset, uint length) + { + this.RemoveOldEntries(DecompressedData[(int)((uint)((UIntPtr)offset))]); + int[] result; + if ((ulong)offset < (ulong)((long)this.MinMatchAmount) || (ulong)(length - offset) < (ulong)((long)this.MinMatchAmount)) + { + result = new int[2]; + } + else + { + int[] array = new int[2]; + int[] array2 = array; + for (int i = this.OffsetList[(int)DecompressedData[(int)((uint)((UIntPtr)offset))]].Count - 1; i >= 0; i--) + { + int num = this.OffsetList[(int)DecompressedData[(int)((uint)((UIntPtr)offset))]][i]; + int num2 = this.BufferStart + num & this.BufferSize - 1; + int num3 = 1; + while (num3 < this.MaxMatchAmount && num3 < this.BufferSize && (long)(num + num3) < (long)((ulong)offset) && (ulong)offset + (ulong)((long)num3) < (ulong)length && DecompressedData[(int)((IntPtr)((long)((ulong)offset + (ulong)((long)num3))))] == this.BufferData[num2 + num3 & this.BufferSize - 1]) + { + num3++; + } + if (num3 >= this.MinMatchAmount && num3 > array2[1]) + { + array2 = new int[] + { + num2, + num3 + }; + if (num3 == this.MaxMatchAmount) + { + break; + } + } + } + result = array2; + } + return result; + } + private void RemoveOldEntries(byte index) + { + int i = 0; + while (i < this.OffsetList[(int)index].Count) + { + if (this.OffsetList[(int)index][i] >= this.BufferPointer - this.BufferSize) + { + break; + } + this.OffsetList[(int)index].RemoveAt(0); + } + } + public void SetBufferSize(int size) + { + if (this.BufferSize != size) + { + this.BufferSize = size; + this.BufferData = new byte[this.BufferSize]; + for (int i = 0; i < this.BufferSize; i++) + { + this.BufferData[i] = 0; + this.OffsetList[0].Add(i - this.BufferSize); + } + } + } + public void SetBufferStart(int pos) + { + this.BufferStart = pos; + } + public void SetMinMatchAmount(int amount) + { + this.MinMatchAmount = amount; + } + public void SetMaxMatchAmount(int amount) + { + this.MaxMatchAmount = amount; + } + public void AddEntry(byte[] DecompressedData, int offset) + { + this.BufferData[this.BufferStart + this.BufferPointer & this.BufferSize - 1] = DecompressedData[offset]; + this.OffsetList[(int)DecompressedData[offset]].Add(this.BufferPointer); + this.BufferPointer++; + } + public void AddEntryRange(byte[] DecompressedData, int offset, int length) + { + for (int i = 0; i < length; i++) + { + this.AddEntry(DecompressedData, offset + i); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzWindowDictionary.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzWindowDictionary.cs new file mode 100644 index 00000000..f35cbca3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionaries/LzWindowDictionary.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries +{ + internal class LzWindowDictionary : CompressionDictionary + { + private int WindowSize = 4096; + private int WindowStart; + private int WindowLength; + private int MinMatchAmount = 3; + private int MaxMatchAmount = 18; + private int BlockSize; + private List[] OffsetList; + public LzWindowDictionary() + { + this.OffsetList = new List[256]; + for (int i = 0; i < this.OffsetList.Length; i++) + { + this.OffsetList[i] = new List(); + } + } + public int[] Search(byte[] DecompressedData, uint offset, uint length) + { + this.RemoveOldEntries(DecompressedData[(int)((uint)((UIntPtr)offset))]); + int[] result; + if ((ulong)offset < (ulong)((long)this.MinMatchAmount) || (ulong)(length - offset) < (ulong)((long)this.MinMatchAmount)) + { + result = new int[2]; + } + else + { + int[] array = new int[2]; + int[] array2 = array; + for (int i = this.OffsetList[(int)DecompressedData[(int)((uint)((UIntPtr)offset))]].Count - 1; i >= 0; i--) + { + int num = this.OffsetList[(int)DecompressedData[(int)((uint)((UIntPtr)offset))]][i]; + int num2 = 1; + while (num2 < this.MaxMatchAmount && num2 < this.WindowLength && (long)(num + num2) < (long)((ulong)offset) && (ulong)offset + (ulong)((long)num2) < (ulong)length && DecompressedData[(int)((IntPtr)((long)((ulong)offset + (ulong)((long)num2))))] == DecompressedData[num + num2]) + { + num2++; + } + if (num2 >= this.MinMatchAmount && num2 > array2[1]) + { + array2 = new int[] + { + (int)((ulong)offset - (ulong)((long)num)), + num2 + }; + if (num2 == this.MaxMatchAmount) + { + break; + } + } + } + result = array2; + } + return result; + } + public void SlideWindow(int Amount) + { + if (this.WindowLength == this.WindowSize) + { + this.WindowStart += Amount; + } + else + { + if (this.WindowLength + Amount <= this.WindowSize) + { + this.WindowLength += Amount; + } + else + { + Amount -= this.WindowSize - this.WindowLength; + this.WindowLength = this.WindowSize; + this.WindowStart += Amount; + } + } + } + public void SlideBlock() + { + this.WindowStart += this.BlockSize; + } + private void RemoveOldEntries(byte index) + { + int i = 0; + while (i < this.OffsetList[(int)index].Count) + { + if (this.OffsetList[(int)index][i] >= this.WindowStart) + { + break; + } + this.OffsetList[(int)index].RemoveAt(0); + } + } + public void SetWindowSize(int size) + { + this.WindowSize = size; + } + public void SetMinMatchAmount(int amount) + { + this.MinMatchAmount = amount; + } + public void SetMaxMatchAmount(int amount) + { + this.MaxMatchAmount = amount; + } + public void SetBlockSize(int size) + { + this.BlockSize = size; + this.WindowLength = size; + } + public void AddEntry(byte[] DecompressedData, int offset) + { + this.OffsetList[(int)DecompressedData[offset]].Add(offset); + } + public void AddEntryRange(byte[] DecompressedData, int offset, int length) + { + for (int i = 0; i < length; i++) + { + this.AddEntry(DecompressedData, offset + i); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionary.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionary.cs new file mode 100644 index 00000000..47510108 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/Internal/CompressionDictionary.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Compression.Puyo.Internal +{ + internal abstract class CompressionDictionary + { + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ00.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ00.cs new file mode 100644 index 00000000..2307a733 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ00.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class LZ00 : PuyoCompressionModule + { + public LZ00() + { + base.Name = "LZ00"; + base.CanCompress = true; + base.CanDecompress = true; + } + public override MemoryStream Decompress(ref Stream data) + { + MemoryStream result; + try + { + uint num = data.ReadUInt(4L); + uint num2 = data.ReadUInt(48L); + uint xValue = data.ReadUInt(52L); + byte[] array = data.ToByteArray(); + byte[] array2 = new byte[(int)((uint)((UIntPtr)num2))]; + byte[] array3 = new byte[4096]; + uint num3 = 64u; + uint num4 = 0u; + uint num5 = 4078u; + while (num3 < num && num4 < num2) + { + xValue = this.GetNewMagicValue(xValue); + byte b = this.DecryptByte(array[(int)((uint)((UIntPtr)num3))], xValue); + num3 += 1u; + for (int i = 0; i < 8; i++) + { + if (((int)b & 1 << i) > 0) + { + xValue = this.GetNewMagicValue(xValue); + array2[(int)((uint)((UIntPtr)num4))] = this.DecryptByte(array[(int)((uint)((UIntPtr)num3))], xValue); + array3[(int)((uint)((UIntPtr)num5))] = array2[(int)((uint)((UIntPtr)num4))]; + num3 += 1u; + num4 += 1u; + num5 = (num5 + 1u & 4095u); + } + else + { + xValue = this.GetNewMagicValue(xValue); + byte b2 = this.DecryptByte(array[(int)((uint)((UIntPtr)num3))], xValue); + xValue = this.GetNewMagicValue(xValue); + byte b3 = this.DecryptByte(array[(int)((uint)((UIntPtr)(num3 + 1u)))], xValue); + int num6 = (b3 >> 4 & 15) << 8 | (int)b2; + int num7 = (int)((b3 & 15) + 3); + num3 += 2u; + for (int j = 0; j < num7; j++) + { + array2[(int)((IntPtr)((long)((ulong)num4 + (ulong)((long)j))))] = array3[num6 + j & 4095]; + array3[(int)((uint)((UIntPtr)num5))] = array2[(int)((IntPtr)((long)((ulong)num4 + (ulong)((long)j))))]; + num5 = (num5 + 1u & 4095u); + } + num4 += (uint)num7; + } + if (num3 >= num || num4 >= num2) + { + break; + } + } + } + result = new MemoryStream(array2); + } + catch + { + result = null; + } + return result; + } + public override MemoryStream Compress(ref Stream data, string filename) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + MemoryStream memoryStream = new MemoryStream(); + byte[] array = data.ToByteArray(); + uint num2 = 0u; + uint num3 = 64u; + uint num4 = (uint)(DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds; + LzBufferDictionary lzBufferDictionary = new LzBufferDictionary(); + lzBufferDictionary.SetBufferSize(4096); + lzBufferDictionary.SetBufferStart(4078); + lzBufferDictionary.SetMaxMatchAmount(18); + memoryStream.Write("LZ00"); + memoryStream.Write(0u); + memoryStream.Seek(8L, SeekOrigin.Current); + if (Path.GetExtension(filename).ToLower() == ".mrz") + { + filename = Path.GetFileNameWithoutExtension(filename) + ".mrg"; + } + else + { + if (Path.GetExtension(filename).ToLower() == ".tez") + { + filename = Path.GetFileNameWithoutExtension(filename) + ".tex"; + } + } + memoryStream.Write(filename, 31, 32, Encoding.GetEncoding("Shift_JIS")); + memoryStream.Write(num); + memoryStream.Write(num4); + memoryStream.Seek(8L, SeekOrigin.Current); + while (num2 < num) + { + num4 = this.GetNewMagicValue(num4); + byte b = 0; + uint num5 = num3; + uint xValue = num4; + memoryStream.WriteByte(b); + num3 += 1u; + for (int i = 0; i < 8; i++) + { + int[] array2 = lzBufferDictionary.Search(array, num2, num); + if (array2[1] > 0) + { + num4 = this.GetNewMagicValue(num4); + memoryStream.WriteByte(this.EncryptByte((byte)(array2[0] & 255), num4)); + num4 = this.GetNewMagicValue(num4); + memoryStream.WriteByte(this.EncryptByte((byte)((array2[0] & 3840) >> 4 | (array2[1] - 3 & 15)), num4)); + lzBufferDictionary.AddEntryRange(array, (int)num2, array2[1]); + num2 += (uint)array2[1]; + num3 += 2u; + } + else + { + b |= (byte)(1 << i); + num4 = this.GetNewMagicValue(num4); + memoryStream.WriteByte(this.EncryptByte(array[(int)((uint)((UIntPtr)num2))], num4)); + lzBufferDictionary.AddEntry(array, (int)num2); + num2 += 1u; + num3 += 1u; + } + if (num2 >= num) + { + break; + } + } + memoryStream.Seek((long)((ulong)num5), SeekOrigin.Begin); + memoryStream.WriteByte(this.EncryptByte(b, xValue)); + memoryStream.Seek((long)((ulong)num3), SeekOrigin.Begin); + } + memoryStream.Seek(4L, SeekOrigin.Begin); + memoryStream.Write((uint)memoryStream.Length); + memoryStream.Seek(0L, SeekOrigin.End); + result = memoryStream; + } + catch + { + result = null; + } + return result; + } + private uint GetNewMagicValue(uint xValue) + { + uint num = ((((xValue << 1) + xValue << 5) - xValue << 5) + xValue << 7) - xValue; + num = (num << 6) - num; + num = (num << 4) - num; + return (num << 2) - num + 12345u; + } + private byte DecryptByte(byte value, uint xValue) + { + uint num = xValue >> 16 & 32767u; + return (byte)((uint)value ^ (num << 8) - num >> 15); + } + private byte EncryptByte(byte value, uint xValue) + { + uint num = xValue >> 16 & 32767u; + return (byte)((uint)value ^ (num << 8) - num >> 15); + } + public override string DecompressFilename(ref Stream data, string filename) + { + string text = data.ReadString(16L, 32, Encoding.GetEncoding("Shift_JIS")); + string result; + if (!(text == string.Empty)) + { + result = text; + } + else + { + result = filename; + } + return result; + } + public override string CompressFilename(ref Stream data, string filename) + { + string extension; + string result; + if ((extension = Path.GetExtension(filename)) != null) + { + if (extension == ".mrg") + { + result = Path.GetFileNameWithoutExtension(filename) + ".mrz"; + return result; + } + if (extension == ".tex") + { + result = Path.GetFileNameWithoutExtension(filename) + ".tez"; + return result; + } + } + result = filename; + return result; + } + public override bool Check(ref Stream data, string filename) + { + bool result; + try + { + result = (data.ReadString(0L, 4) == "LZ00"); + } + catch + { + result = false; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ01.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ01.cs new file mode 100644 index 00000000..ec73a481 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZ01.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class LZ01 : PuyoCompressionModule + { + public LZ01() + { + base.Name = "LZ01"; + base.CanCompress = true; + base.CanDecompress = true; + } + public override MemoryStream Decompress(ref Stream data) + { + MemoryStream result; + try + { + uint num = data.ReadUInt(4L); + uint num2 = data.ReadUInt(8L); + byte[] array = data.ToByteArray(); + byte[] array2 = new byte[(int)((uint)((UIntPtr)num2))]; + byte[] array3 = new byte[4096]; + uint num3 = 16u; + uint num4 = 0u; + uint num5 = 4078u; + while (num3 < num && num4 < num2) + { + byte b = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + for (int i = 0; i < 8; i++) + { + if (((int)b & 1 << i) > 0) + { + array2[(int)((uint)((UIntPtr)num4))] = array[(int)((uint)((UIntPtr)num3))]; + array3[(int)((uint)((UIntPtr)num5))] = array2[(int)((uint)((UIntPtr)num4))]; + num3 += 1u; + num4 += 1u; + num5 = (num5 + 1u & 4095u); + } + else + { + int num6 = (array[(int)((uint)((UIntPtr)(num3 + 1u)))] >> 4 & 15) << 8 | (int)array[(int)((uint)((UIntPtr)num3))]; + int num7 = (int)((array[(int)((uint)((UIntPtr)(num3 + 1u)))] & 15) + 3); + num3 += 2u; + for (int j = 0; j < num7; j++) + { + array2[(int)((IntPtr)((long)((ulong)num4 + (ulong)((long)j))))] = array3[num6 + j & 4095]; + array3[(int)((uint)((UIntPtr)num5))] = array2[(int)((IntPtr)((long)((ulong)num4 + (ulong)((long)j))))]; + num5 = (num5 + 1u & 4095u); + } + num4 += (uint)num7; + } + if (num3 >= num || num4 >= num2) + { + break; + } + } + } + result = new MemoryStream(array2); + } + catch + { + result = null; + } + return result; + } + public override MemoryStream Compress(ref Stream data, string filename) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + MemoryStream memoryStream = new MemoryStream(); + byte[] array = data.ToByteArray(); + uint num2 = 0u; + uint num3 = 16u; + LzBufferDictionary lzBufferDictionary = new LzBufferDictionary(); + lzBufferDictionary.SetBufferSize(4096); + lzBufferDictionary.SetBufferStart(4078); + lzBufferDictionary.SetMaxMatchAmount(18); + memoryStream.Write("LZ01"); + memoryStream.Write(0u); + memoryStream.Write(num); + memoryStream.Seek(4L, SeekOrigin.Current); + while (num2 < num) + { + byte b = 0; + uint num4 = num3; + memoryStream.WriteByte(b); + num3 += 1u; + for (int i = 0; i < 8; i++) + { + int[] array2 = lzBufferDictionary.Search(array, num2, num); + if (array2[1] > 0) + { + memoryStream.WriteByte((byte)(array2[0] & 255)); + memoryStream.WriteByte((byte)((array2[0] & 3840) >> 4 | (array2[1] - 3 & 15))); + lzBufferDictionary.AddEntryRange(array, (int)num2, array2[1]); + num2 += (uint)array2[1]; + num3 += 2u; + } + else + { + b |= (byte)(1 << i); + memoryStream.WriteByte(array[(int)((uint)((UIntPtr)num2))]); + lzBufferDictionary.AddEntry(array, (int)num2); + num2 += 1u; + num3 += 1u; + } + if (num2 >= num) + { + break; + } + } + memoryStream.Seek((long)((ulong)num4), SeekOrigin.Begin); + memoryStream.WriteByte(b); + memoryStream.Seek((long)((ulong)num3), SeekOrigin.Begin); + } + memoryStream.Seek(4L, SeekOrigin.Begin); + memoryStream.Write((uint)memoryStream.Length); + memoryStream.Seek(0L, SeekOrigin.End); + result = memoryStream; + } + catch + { + result = null; + } + return result; + } + public override bool Check(ref Stream data, string filename) + { + bool result; + try + { + result = (data.ReadString(0L, 4) == "LZ01"); + } + catch + { + result = false; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZSS.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZSS.cs new file mode 100644 index 00000000..9d0ee5aa --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/LZSS.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class LZSS : PuyoCompressionModule + { + public LZSS() + { + base.Name = "LZSS"; + base.CanCompress = true; + base.CanDecompress = true; + } + public override MemoryStream Decompress(ref Stream data) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + uint num2 = data.ReadUInt(0L) >> 8; + uint num3 = 4u; + uint num4 = 0u; + byte[] array = data.ToByteArray(); + byte[] array2 = new byte[(int)((uint)((UIntPtr)num2))]; + while (num3 < num && num4 < num2) + { + byte b = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + for (int i = 7; i >= 0; i--) + { + if (((int)b & 1 << i) == 0) + { + array2[(int)((uint)((UIntPtr)num4))] = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + num4 += 1u; + } + else + { + int num5 = ((int)(array[(int)((uint)((UIntPtr)num3))] & 15) << 8 | (int)array[(int)((uint)((UIntPtr)(num3 + 1u)))]) + 1; + int num6 = (array[(int)((uint)((UIntPtr)num3))] >> 4) + 3; + num3 += 2u; + for (int j = 0; j < num6; j++) + { + array2[(int)((IntPtr)((long)((ulong)num4 + (ulong)((long)j))))] = array2[(int)((IntPtr)((long)((ulong)num4 - (ulong)((long)num5) + (ulong)((long)j))))]; + } + num4 += (uint)num6; + } + if (num3 >= num || num4 >= num2) + { + break; + } + } + } + result = new MemoryStream(array2); + } + catch + { + result = null; + } + return result; + } + public override MemoryStream Compress(ref Stream data, string filename) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + MemoryStream memoryStream = new MemoryStream(); + byte[] array = data.ToByteArray(); + uint num2 = 0u; + uint num3 = 4u; + if (data.Length > 16777215L) + { + throw new Exception("Input file is too large to compress."); + } + LzWindowDictionary lzWindowDictionary = new LzWindowDictionary(); + lzWindowDictionary.SetWindowSize(4096); + lzWindowDictionary.SetMaxMatchAmount(18); + memoryStream.Write(16u | num << 8); + while (num2 < num) + { + byte b = 0; + uint num4 = num3; + memoryStream.WriteByte(b); + num3 += 1u; + for (int i = 7; i >= 0; i--) + { + int[] array2 = lzWindowDictionary.Search(array, num2, num); + if (array2[1] > 0) + { + b |= (byte)(1 << i); + memoryStream.WriteByte((byte)((array2[1] - 3 & 15) << 4 | (array2[0] - 1 & 4095) >> 8)); + memoryStream.WriteByte((byte)(array2[0] - 1 & 255)); + lzWindowDictionary.AddEntryRange(array, (int)num2, array2[1]); + lzWindowDictionary.SlideWindow(array2[1]); + num2 += (uint)array2[1]; + num3 += 2u; + } + else + { + memoryStream.WriteByte(array[(int)((uint)((UIntPtr)num2))]); + lzWindowDictionary.AddEntry(array, (int)num2); + lzWindowDictionary.SlideWindow(1); + num2 += 1u; + num3 += 1u; + } + if (num2 >= num) + { + break; + } + } + memoryStream.Seek((long)((ulong)num4), SeekOrigin.Begin); + memoryStream.WriteByte(b); + memoryStream.Seek((long)((ulong)num3), SeekOrigin.Begin); + } + result = memoryStream; + } + catch + { + result = null; + } + return result; + } + public override bool Check(ref Stream data, string filename) + { + bool result; + try + { + result = (data.ReadString(0L, 1) == "\u0010" && !Compression.Dictionary[CompressionFormat.PRS].Check(ref data, filename)); + } + catch + { + result = false; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/ONZ.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/ONZ.cs new file mode 100644 index 00000000..eb99d3c8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/ONZ.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +using UniversalEditor.Compression.Puyo.Internal.CompressionDictionaries; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class ONZ : PuyoCompressionModule + { + public ONZ() + { + base.Name = "LZ11"; + base.CanCompress = true; + base.CanDecompress = true; + } + public override MemoryStream Decompress(ref Stream data) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + uint num2 = data.ReadUInt(0L) >> 8; + uint num3 = 4u; + uint num4 = 0u; + if (num2 == 0u) + { + num2 = data.ReadUInt(4L); + num3 += 4u; + } + byte[] array = data.ToByteArray(); + byte[] array2 = new byte[(int)((uint)((UIntPtr)num2))]; + while (num3 < num && num4 < num2) + { + byte b = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + for (int i = 7; i >= 0; i--) + { + if (((int)b & 1 << i) == 0) + { + array2[(int)((uint)((UIntPtr)num4))] = array[(int)((uint)((UIntPtr)num3))]; + num3 += 1u; + num4 += 1u; + } + else + { + int num5; + int num6; + switch (array[(int)((uint)((UIntPtr)num3))] >> 4) + { + case 0: + { + num5 = ((int)(array[(int)((uint)((UIntPtr)(num3 + 1u)))] & 15) << 8 | (int)array[(int)((uint)((UIntPtr)(num3 + 2u)))]) + 1; + num6 = ((int)(array[(int)((uint)((UIntPtr)num3))] & 15) << 4 | array[(int)((uint)((UIntPtr)(num3 + 1u)))] >> 4) + 17; + num3 += 3u; + break; + } + case 1: + { + num5 = ((int)(array[(int)((uint)((UIntPtr)(num3 + 2u)))] & 15) << 8 | (int)array[(int)((uint)((UIntPtr)(num3 + 3u)))]) + 1; + num6 = ((int)(array[(int)((uint)((UIntPtr)num3))] & 15) << 12 | (int)array[(int)((uint)((UIntPtr)(num3 + 1u)))] << 4 | array[(int)((uint)((UIntPtr)(num3 + 2u)))] >> 4) + 273; + num3 += 4u; + break; + } + default: + { + num5 = ((int)(array[(int)((uint)((UIntPtr)num3))] & 15) << 8 | (int)array[(int)((uint)((UIntPtr)(num3 + 1u)))]) + 1; + num6 = (array[(int)((uint)((UIntPtr)num3))] >> 4) + 1; + num3 += 2u; + break; + } + } + for (int j = 0; j < num6; j++) + { + array2[(int)((IntPtr)((long)((ulong)num4 + (ulong)((long)j))))] = array2[(int)((IntPtr)((long)((ulong)num4 - (ulong)((long)num5) + (ulong)((long)j))))]; + } + num4 += (uint)num6; + } + if (num3 >= num || num4 >= num2) + { + break; + } + } + } + result = new MemoryStream(array2); + } + catch + { + result = null; + } + return result; + } + public override MemoryStream Compress(ref Stream data, string filename) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + MemoryStream memoryStream = new MemoryStream(); + byte[] array = data.ToByteArray(); + uint num2 = 0u; + uint num3 = 4u; + LzWindowDictionary lzWindowDictionary = new LzWindowDictionary(); + lzWindowDictionary.SetWindowSize(4096); + lzWindowDictionary.SetMaxMatchAmount(65808); + if (data.Length <= 16777215L) + { + memoryStream.Write(17u | num << 8); + } + else + { + memoryStream.Write(17u); + memoryStream.Write(num); + num3 += 4u; + } + while (num2 < num) + { + byte b = 0; + uint num4 = num3; + memoryStream.WriteByte(b); + num3 += 1u; + for (int i = 7; i >= 0; i--) + { + int[] array2 = lzWindowDictionary.Search(array, num2, num); + if (array2[1] > 0) + { + b |= (byte)(1 << i); + if (array2[1] <= 16) + { + memoryStream.WriteByte((byte)((array2[1] - 1 & 15) << 4 | (array2[0] - 1 & 4095) >> 8)); + memoryStream.WriteByte((byte)(array2[0] - 1 & 255)); + num3 += 2u; + } + else + { + if (array2[1] <= 272) + { + memoryStream.WriteByte((byte)((array2[1] - 17 & 255) >> 4)); + memoryStream.WriteByte((byte)((array2[1] - 17 & 15) << 4 | (array2[0] - 1 & 4095) >> 8)); + memoryStream.WriteByte((byte)(array2[0] - 1 & 255)); + num3 += 3u; + } + else + { + memoryStream.WriteByte((byte)(16 | (array2[1] - 273 & 65535) >> 12)); + memoryStream.WriteByte((byte)((array2[1] - 273 & 4095) >> 4)); + memoryStream.WriteByte((byte)((array2[1] - 273 & 15) << 4 | (array2[0] - 1 & 4095) >> 8)); + memoryStream.WriteByte((byte)(array2[0] - 1 & 255)); + num3 += 4u; + } + } + lzWindowDictionary.AddEntryRange(array, (int)num2, array2[1]); + lzWindowDictionary.SlideWindow(array2[1]); + num2 += (uint)array2[1]; + } + else + { + memoryStream.WriteByte(array[(int)((uint)((UIntPtr)num2))]); + lzWindowDictionary.AddEntry(array, (int)num2); + lzWindowDictionary.SlideWindow(1); + num2 += 1u; + num3 += 1u; + } + if (num2 >= num) + { + break; + } + } + memoryStream.Seek((long)((ulong)num4), SeekOrigin.Begin); + memoryStream.WriteByte(b); + memoryStream.Seek((long)((ulong)num3), SeekOrigin.Begin); + } + result = memoryStream; + } + catch + { + result = null; + } + return result; + } + public override string DecompressFilename(ref Stream data, string filename) + { + string result; + if (Path.GetExtension(filename).ToLower() == ".onz") + { + result = Path.GetFileNameWithoutExtension(filename) + (Path.GetExtension(filename).IsAllUpperCase() ? ".ONE" : ".one"); + } + else + { + result = filename; + } + return result; + } + public override string CompressFilename(ref Stream data, string filename) + { + string result; + if (Path.GetExtension(filename).ToLower() == ".one") + { + result = Path.GetFileNameWithoutExtension(filename) + (Path.GetExtension(filename).IsAllUpperCase() ? ".ONZ" : ".onz"); + } + else + { + result = filename; + } + return result; + } + public override bool Check(ref Stream data, string filename) + { + bool result; + try + { + result = (data.ReadString(0L, 1) == "\u0011" && !Compression.Dictionary[CompressionFormat.PRS].Check(ref data, filename)); + } + catch + { + result = false; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PRS.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PRS.cs new file mode 100644 index 00000000..dca2ce76 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PRS.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.Puyo.Internal.Compressors +{ + public class PRS : PuyoCompressionModule + { + public PRS() + { + base.Name = "PRS"; + base.CanCompress = false; + base.CanDecompress = true; + } + public override MemoryStream Decompress(ref Stream data) + { + return this.Decompress(ref data, 0u); + } + public MemoryStream Decompress(ref Stream data, uint decompressedSize) + { + MemoryStream result; + try + { + uint num = (uint)data.Length; + uint num2 = 0u; + uint num3 = 0u; + byte[] array = data.ReadBytes(0L, num); + List list = new List(); + while (num2 < num && (num3 < decompressedSize || decompressedSize == 0u)) + { + byte b = array[(int)((uint)((UIntPtr)num2))]; + num2 += 1u; + for (int i = 0; i < 8; i++) + { + if (((int)b & 1 << i) > 0) + { + list.Add(array[(int)((uint)((UIntPtr)num2))]); + num2 += 1u; + num3 += 1u; + } + else + { + i++; + if (i >= 8) + { + i = 0; + b = array[(int)((uint)((UIntPtr)num2))]; + num2 += 1u; + } + uint num4; + uint num5; + if (((int)b & 1 << i) > 0) + { + byte b2 = array[(int)((uint)((UIntPtr)num2))]; + byte b3 = array[(int)((uint)((UIntPtr)(num2 + 1u)))]; + num2 += 2u; + if (num2 >= num) + { + break; + } + num4 = (uint)(((int)b3 << 8 | (int)b2) >> 3 | -8192); + num5 = (uint)(b2 & 7); + if (num5 == 0u) + { + num5 = (uint)(array[(int)((uint)((UIntPtr)num2))] + 1); + num2 += 1u; + } + else + { + num5 += 2u; + } + } + else + { + num5 = 0u; + for (int j = 0; j < 2; j++) + { + i++; + if (i >= 8) + { + i = 0; + b = array[(int)((uint)((UIntPtr)num2))]; + num2 += 1u; + } + num4 = num5 << 1; + num5 = (num4 | ((((int)b & 1 << i) > 0) ? 1u : 0u)); + } + num4 = ((uint)array[(int)((uint)((UIntPtr)num2))] | 4294967040u); + num5 += 2u; + num2 += 1u; + } + int num6 = 0; + while ((long)num6 < (long)((ulong)num5)) + { + list.Add(list[(int)((ulong)(num3 + num4) + (ulong)((long)num6))]); + num6++; + } + num3 += num5; + } + if (num2 >= num || (num3 >= decompressedSize && decompressedSize != 0u)) + { + break; + } + } + } + result = new MemoryStream(list.ToArray()); + } + catch + { + result = null; + } + return result; + } + public override MemoryStream Compress(ref Stream data, string filename) + { + MemoryStream result; + try + { + result = null; + } + catch + { + result = null; + } + return result; + } + public override bool Check(ref Stream data, string filename) + { + bool result; + try + { + result = (Path.GetExtension(filename) == ".prs"); + } + catch + { + result = false; + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PuyoCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PuyoCompressionModule.cs new file mode 100644 index 00000000..40ff4124 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Puyo/PuyoCompressionModule.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.Puyo +{ + public abstract class PuyoCompressionModule + { + public string Name + { + get; + protected set; + } + public bool CanCompress + { + get; + protected set; + } + public bool CanDecompress + { + get; + protected set; + } + public abstract MemoryStream Decompress(ref Stream data); + public abstract MemoryStream Compress(ref Stream data, string filename); + public abstract bool Check(ref Stream data, string filename); + public virtual string DecompressFilename(ref Stream data, string filename) + { + return filename; + } + public virtual string CompressFilename(ref Stream data, string filename) + { + return filename; + } + public int[] LZsearch(ref byte[] decompressedData, uint pos, uint decompressedSize) + { + int num = 4096; + int num2 = 18; + List list = new List(); + int[] result; + if (pos < 3u || decompressedSize - pos < 3u) + { + result = new int[2]; + } + else + { + if (pos >= decompressedSize) + { + int[] array = new int[2]; + array[0] = -1; + result = array; + } + else + { + int num3 = 1; + while (num3 < num && (long)num3 < (long)((ulong)pos)) + { + if (decompressedData[(int)((IntPtr)((long)((ulong)pos - (ulong)((long)num3) - 1uL)))] == decompressedData[(int)((uint)((UIntPtr)pos))]) + { + list.Add(num3 + 1); + } + num3++; + } + if (list.Count == 0) + { + result = new int[2]; + } + else + { + bool flag = false; + int num4 = 0; + while (num4 < num2 && !flag) + { + num4++; + for (int i = 0; i < list.Count; i++) + { + if ((ulong)pos + (ulong)((long)num4) >= (ulong)decompressedSize) + { + flag = true; + break; + } + if (decompressedData[(int)((IntPtr)((long)((ulong)pos + (ulong)((long)num4))))] != decompressedData[(int)((IntPtr)((long)((ulong)pos - (ulong)((long)list[i]) + (ulong)((long)(num4 % list[i])))))]) + { + if (list.Count <= 1) + { + flag = true; + break; + } + list.RemoveAt(i); + i--; + } + } + } + result = new int[] + { + num4, + list[0] + }; + } + } + } + return result; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/XMemLZX/XMemLZXCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/XMemLZX/XMemLZXCompressionModule.cs new file mode 100644 index 00000000..a85066bb --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/XMemLZX/XMemLZXCompressionModule.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.XMemLZX +{ + public class XMemLZXCompressionModule : CompressionModule + { + public override string Name + { + get { return "XMEMLZX"; } + } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + } + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + + } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Adler32.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Adler32.cs new file mode 100644 index 00000000..0acd9575 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Adler32.cs @@ -0,0 +1,108 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ + +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + internal sealed class Adler32 + { + + // largest prime smaller than 65536 + private const int BASE = 65521; + // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 + private const int NMAX = 5552; + + internal long adler32(long adler, byte[] buf, int index, int len) + { + if (buf == null) + { + return 1L; + } + + long s1 = adler & 0xffff; + long s2 = (adler >> 16) & 0xffff; + int k; + + while (len > 0) + { + k = len < NMAX?len:NMAX; + len -= k; + while (k >= 16) + { + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + s1 += (buf[index++] & 0xff); s2 += s1; + k -= 16; + } + if (k != 0) + { + do + { + s1 += (buf[index++] & 0xff); s2 += s1; + } + while (--k != 0); + } + s1 %= BASE; + s2 %= BASE; + } + return (s2 << 16) | s1; + } + + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Deflate.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Deflate.cs new file mode 100644 index 00000000..ea6a9e59 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Deflate.cs @@ -0,0 +1,1799 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + public sealed class Deflate + { + + private const int MAX_MEM_LEVEL = 9; + + private const int Z_DEFAULT_COMPRESSION = - 1; + + private const int MAX_WBITS = 15; // 32K LZ77 window + private const int DEF_MEM_LEVEL = 8; + + internal class Config + { + internal int good_length; // reduce lazy search above this match length + internal int max_lazy; // do not perform lazy search above this match length + internal int nice_length; // quit search above this match length + internal int max_chain; + internal int func; + internal Config(int good_length, int max_lazy, int nice_length, int max_chain, int func) + { + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; + } + } + + private const int STORED = 0; + private const int FAST = 1; + private const int SLOW = 2; + private static Config[] config_table; + + private static readonly System.String[] z_errmsg = new System.String[]{"need dictionary", "stream end", "", "file error", "stream error", "data error", "insufficient memory", "buffer error", "incompatible version", ""}; + + // block not completed, need more input or more output + private const int NeedMore = 0; + + // block flush performed + private const int BlockDone = 1; + + // finish started, need only more output at next deflate + private const int FinishStarted = 2; + + // finish done, accept no more input or output + private const int FinishDone = 3; + + // preset dictionary flag in zlib header + private const int PRESET_DICT = 0x20; + + private const int Z_FILTERED = 1; + private const int Z_HUFFMAN_ONLY = 2; + private const int Z_DEFAULT_STRATEGY = 0; + + private const int Z_NO_FLUSH = 0; + private const int Z_PARTIAL_FLUSH = 1; + private const int Z_SYNC_FLUSH = 2; + private const int Z_FULL_FLUSH = 3; + private const int Z_FINISH = 4; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + private const int INIT_STATE = 42; + private const int BUSY_STATE = 113; + private const int FINISH_STATE = 666; + + // The deflate compression method + private const int Z_DEFLATED = 8; + + private const int STORED_BLOCK = 0; + private const int STATIC_TREES = 1; + private const int DYN_TREES = 2; + + // The three kinds of block type + private const int Z_BINARY = 0; + private const int Z_ASCII = 1; + private const int Z_UNKNOWN = 2; + + private const int Buf_size = 8 * 2; + + // repeat previous bit length 3-6 times (2 bits of repeat count) + private const int REP_3_6 = 16; + + // repeat a zero length 3-10 times (3 bits of repeat count) + private const int REPZ_3_10 = 17; + + // repeat a zero length 11-138 times (7 bits of repeat count) + private const int REPZ_11_138 = 18; + + private const int MIN_MATCH = 3; + private const int MAX_MATCH = 258; + private static readonly int MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + + private const int MAX_BITS = 15; + private const int D_CODES = 30; + private const int BL_CODES = 19; + private const int LENGTH_CODES = 29; + private const int LITERALS = 256; + private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); + private static readonly int HEAP_SIZE = (2 * L_CODES + 1); + + private const int END_BLOCK = 256; + + internal ZStream strm; // pointer back to this zlib stream + internal int status; // as the name implies + internal byte[] pending_buf; // output still pending + internal int pending_buf_size; // size of pending_buf + internal int pending_out; // next pending byte to output to the stream + internal int pending; // nb of bytes in the pending buffer + internal int noheader; // suppress zlib header and adler32 + internal byte data_type; // UNKNOWN, BINARY or ASCII + internal byte method; // STORED (for zip only) or DEFLATED + internal int last_flush; // value of flush param for previous deflate call + + internal int w_size; // LZ77 window size (32K by default) + internal int w_bits; // log2(w_size) (8..16) + internal int w_mask; // w_size - 1 + + internal byte[] window; + // Sliding window. Input bytes are read into the second half of the window, + // and move to the first half later to keep a dictionary of at least wSize + // bytes. With this organization, matches are limited to a distance of + // wSize-MAX_MATCH bytes, but this ensures that IO is always + // performed with a length multiple of the block size. Also, it limits + // the window size to 64K, which is quite useful on MSDOS. + // To do: use the user input buffer as sliding window. + + internal int window_size; + // Actual size of window: 2*wSize, except when the user input buffer + // is directly used as sliding window. + + internal short[] prev; + // Link to older string with same hash index. To limit the size of this + // array to 64K, this link is maintained only for the last 32K strings. + // An index in this array is thus a window index modulo 32K. + + internal short[] head; // Heads of the hash chains or NIL. + + internal int ins_h; // hash index of string to be inserted + internal int hash_size; // number of elements in hash table + internal int hash_bits; // log2(hash_size) + internal int hash_mask; // hash_size-1 + + // Number of bits by which ins_h must be shifted at each input + // step. It must be such that after MIN_MATCH steps, the oldest + // byte no longer takes part in the hash key, that is: + // hash_shift * MIN_MATCH >= hash_bits + internal int hash_shift; + + // Window position at the beginning of the current output block. Gets + // negative when the window is moved backwards. + + internal int block_start; + + internal int match_length; // length of best match + internal int prev_match; // previous match + internal int match_available; // set if previous match exists + internal int strstart; // start of string to insert + internal int match_start; // start of matching string + internal int lookahead; // number of valid bytes ahead in window + + // Length of the best match at previous step. Matches not greater than this + // are discarded. This is used in the lazy match evaluation. + internal int prev_length; + + // To speed up deflation, hash chains are never searched beyond this + // length. A higher limit improves compression ratio but degrades the speed. + internal int max_chain_length; + + // Attempt to find a better match only when the current match is strictly + // smaller than this value. This mechanism is used only for compression + // levels >= 4. + internal int max_lazy_match; + + // Insert new strings in the hash table only if the match length is not + // greater than this length. This saves time but degrades compression. + // max_insert_length is used only for compression levels <= 3. + + internal int level; // compression level (1..9) + internal int strategy; // favor or force Huffman coding + + // Use a faster search when the previous match is longer than this + internal int good_match; + + // Stop searching when current match exceeds this + internal int nice_match; + + internal short[] dyn_ltree; // literal and length tree + internal short[] dyn_dtree; // distance tree + internal short[] bl_tree; // Huffman tree for bit lengths + + internal Tree l_desc = new Tree(); // desc for literal tree + internal Tree d_desc = new Tree(); // desc for distance tree + internal Tree bl_desc = new Tree(); // desc for bit length tree + + // number of codes at each bit length for an optimal tree + internal short[] bl_count = new short[MAX_BITS + 1]; + + // heap used to build the Huffman trees + internal int[] heap = new int[2 * L_CODES + 1]; + + internal int heap_len; // number of elements in the heap + internal int heap_max; // element of largest frequency + // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + // The same heap array is used to build all trees. + + // Depth of each subtree used as tie breaker for trees of equal frequency + internal byte[] depth = new byte[2 * L_CODES + 1]; + + internal int l_buf; // index for literals or lengths */ + + // Size of match buffer for literals/lengths. There are 4 reasons for + // limiting lit_bufsize to 64K: + // - frequencies can be kept in 16 bit counters + // - if compression is not successful for the first block, all input + // data is still in the window so we can still emit a stored block even + // when input comes from standard input. (This can also be done for + // all blocks if lit_bufsize is not greater than 32K.) + // - if compression is not successful for a file smaller than 64K, we can + // even emit a stored file instead of a stored block (saving 5 bytes). + // This is applicable only for zip (not gzip or zlib). + // - creating new Huffman trees less frequently may not provide fast + // adaptation to changes in the input data statistics. (Take for + // example a binary file with poorly compressible code followed by + // a highly compressible string table.) Smaller buffer sizes give + // fast adaptation but have of course the overhead of transmitting + // trees more frequently. + // - I can't count above 4 + internal int lit_bufsize; + + internal int last_lit; // running index in l_buf + + // Buffer for distances. To simplify the code, d_buf and l_buf have + // the same number of elements. To use different lengths, an extra flag + // array would be necessary. + + internal int d_buf; // index of pendig_buf + + internal int opt_len; // bit length of current block with optimal trees + internal int static_len; // bit length of current block with static trees + internal int matches; // number of string matches in current block + internal int last_eob_len; // bit length of EOB code for last block + + // Output buffer. bits are inserted starting at the bottom (least + // significant bits). + internal short bi_buf; + + // Number of valid bits in bi_buf. All bits above the last valid bit + // are always zero. + internal int bi_valid; + + internal Deflate() + { + dyn_ltree = new short[HEAP_SIZE * 2]; + dyn_dtree = new short[(2 * D_CODES + 1) * 2]; // distance tree + bl_tree = new short[(2 * BL_CODES + 1) * 2]; // Huffman tree for bit lengths + } + + internal void lm_init() + { + window_size = 2 * w_size; + + head[hash_size - 1] = 0; + for (int i = 0; i < hash_size - 1; i++) + { + head[i] = 0; + } + + // Set the default configuration parameters: + max_lazy_match = Deflate.config_table[level].max_lazy; + good_match = Deflate.config_table[level].good_length; + nice_match = Deflate.config_table[level].nice_length; + max_chain_length = Deflate.config_table[level].max_chain; + + strstart = 0; + block_start = 0; + lookahead = 0; + match_length = prev_length = MIN_MATCH - 1; + match_available = 0; + ins_h = 0; + } + + // Initialize the tree data structures for a new zlib stream. + internal void tr_init() + { + + l_desc.dyn_tree = dyn_ltree; + l_desc.stat_desc = StaticTree.static_l_desc; + + d_desc.dyn_tree = dyn_dtree; + d_desc.stat_desc = StaticTree.static_d_desc; + + bl_desc.dyn_tree = bl_tree; + bl_desc.stat_desc = StaticTree.static_bl_desc; + + bi_buf = 0; + bi_valid = 0; + last_eob_len = 8; // enough lookahead for inflate + + // Initialize the first block of the first file: + init_block(); + } + + internal void init_block() + { + // Initialize the trees. + for (int i = 0; i < L_CODES; i++) + dyn_ltree[i * 2] = 0; + for (int i = 0; i < D_CODES; i++) + dyn_dtree[i * 2] = 0; + for (int i = 0; i < BL_CODES; i++) + bl_tree[i * 2] = 0; + + dyn_ltree[END_BLOCK * 2] = 1; + opt_len = static_len = 0; + last_lit = matches = 0; + } + + // Restore the heap property by moving down the tree starting at node k, + // exchanging a node with the smallest of its two sons if necessary, stopping + // when the heap property is re-established (each father smaller than its + // two sons). + internal void pqdownheap(short[] tree, int k) + { + int v = heap[k]; + int j = k << 1; // left son of k + while (j <= heap_len) + { + // Set j to the smallest of the two sons: + if (j < heap_len && smaller(tree, heap[j + 1], heap[j], depth)) + { + j++; + } + // Exit if v is smaller than both sons + if (smaller(tree, v, heap[j], depth)) + break; + + // Exchange v with the smallest son + heap[k] = heap[j]; k = j; + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + heap[k] = v; + } + + internal static bool smaller(short[] tree, int n, int m, byte[] depth) + { + return (tree[n * 2] < tree[m * 2] || (tree[n * 2] == tree[m * 2] && depth[n] <= depth[m])); + } + + // Scan a literal or distance tree to determine the frequencies of the codes + // in the bit length tree. + internal void scan_tree(short[] tree, int max_code) + { + int n; // iterates over all tree elements + int prevlen = - 1; // last emitted length + int curlen; // length of current code + int nextlen = tree[0 * 2 + 1]; // length of next code + int count = 0; // repeat count of the current code + int max_count = 7; // max repeat count + int min_count = 4; // min repeat count + + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + tree[(max_code + 1) * 2 + 1] = (short) SupportClass.Identity(0xffff); // guard + + for (n = 0; n <= max_code; n++) + { + curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; + if (++count < max_count && curlen == nextlen) + { + continue; + } + else if (count < min_count) + { + bl_tree[curlen * 2] = (short) (bl_tree[curlen * 2] + count); + } + else if (curlen != 0) + { + if (curlen != prevlen) + bl_tree[curlen * 2]++; + bl_tree[REP_3_6 * 2]++; + } + else if (count <= 10) + { + bl_tree[REPZ_3_10 * 2]++; + } + else + { + bl_tree[REPZ_11_138 * 2]++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + else if (curlen == nextlen) + { + max_count = 6; min_count = 3; + } + else + { + max_count = 7; min_count = 4; + } + } + } + + // Construct the Huffman tree for the bit lengths and return the index in + // bl_order of the last bit length code to send. + internal int build_bl_tree() + { + int max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + scan_tree(dyn_ltree, l_desc.max_code); + scan_tree(dyn_dtree, d_desc.max_code); + + // Build the bit length tree: + bl_desc.build_tree(this); + // opt_len now includes the length of the tree representations, except + // the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + + // Determine the number of bit length codes to send. The pkzip format + // requires that at least 4 bit length codes be sent. (appnote.txt says + // 3 but the actual value used is 4.) + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) + { + if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] != 0) + break; + } + // Update opt_len to include the bit length tree and counts + opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + + return max_blindex; + } + + + // Send the header for a block using dynamic Huffman trees: the counts, the + // lengths of the bit length codes, the literal tree and the distance tree. + // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + internal void send_all_trees(int lcodes, int dcodes, int blcodes) + { + int rank; // index in bl_order + + send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + send_bits(dcodes - 1, 5); + send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) + { + send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3); + } + send_tree(dyn_ltree, lcodes - 1); // literal tree + send_tree(dyn_dtree, dcodes - 1); // distance tree + } + + // Send a literal or distance tree in compressed form, using the codes in + // bl_tree. + internal void send_tree(short[] tree, int max_code) + { + int n; // iterates over all tree elements + int prevlen = - 1; // last emitted length + int curlen; // length of current code + int nextlen = tree[0 * 2 + 1]; // length of next code + int count = 0; // repeat count of the current code + int max_count = 7; // max repeat count + int min_count = 4; // min repeat count + + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + + for (n = 0; n <= max_code; n++) + { + curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; + if (++count < max_count && curlen == nextlen) + { + continue; + } + else if (count < min_count) + { + do + { + send_code(curlen, bl_tree); + } + while (--count != 0); + } + else if (curlen != 0) + { + if (curlen != prevlen) + { + send_code(curlen, bl_tree); count--; + } + send_code(REP_3_6, bl_tree); + send_bits(count - 3, 2); + } + else if (count <= 10) + { + send_code(REPZ_3_10, bl_tree); + send_bits(count - 3, 3); + } + else + { + send_code(REPZ_11_138, bl_tree); + send_bits(count - 11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + else if (curlen == nextlen) + { + max_count = 6; min_count = 3; + } + else + { + max_count = 7; min_count = 4; + } + } + } + + // Output a byte on the stream. + // IN assertion: there is enough room in pending_buf. + internal void put_byte(byte[] p, int start, int len) + { + Array.Copy(p, start, pending_buf, pending, len); + pending += len; + } + + internal void put_byte(byte c) + { + pending_buf[pending++] = c; + } + internal void put_short(int w) + { + put_byte((byte) (w)); + put_byte((byte) (SupportClass.URShift(w, 8))); + } + internal void putShortMSB(int b) + { + put_byte((byte) (b >> 8)); + put_byte((byte) (b)); + } + + internal void send_code(int c, short[] tree) + { + send_bits((tree[c * 2] & 0xffff), (tree[c * 2 + 1] & 0xffff)); + } + + internal void send_bits(int value_Renamed, int length) + { + int len = length; + if (bi_valid > (int) Buf_size - len) + { + int val = value_Renamed; + // bi_buf |= (val << bi_valid); + bi_buf = (short) ((ushort) bi_buf | (ushort) (((val << bi_valid) & 0xffff))); + put_short(bi_buf); + bi_buf = (short) (SupportClass.URShift(val, (Buf_size - bi_valid))); + bi_valid += len - Buf_size; + } + else + { + // bi_buf |= (value) << bi_valid; + bi_buf = (short)((ushort)bi_buf | (ushort)((((value_Renamed) << bi_valid) & 0xffff))); + bi_valid += len; + } + } + + // Send one empty static block to give enough lookahead for inflate. + // This takes 10 bits, of which 7 may remain in the bit buffer. + // The current inflate code requires 9 bits of lookahead. If the + // last two codes for the previous block (real code plus EOB) were coded + // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + // the last real code. In this case we send two empty static blocks instead + // of one. (There are no problems if the previous block is stored or fixed.) + // To simplify the code, we assume the worst case of last real code encoded + // on one bit only. + internal void _tr_align() + { + send_bits(STATIC_TREES << 1, 3); + send_code(END_BLOCK, StaticTree.static_ltree); + + bi_flush(); + + // Of the 10 bits for the empty block, we have already sent + // (10 - bi_valid) bits. The lookahead for the last real code (before + // the EOB of the previous block) was thus at least one plus the length + // of the EOB plus what we have just sent of the empty static block. + if (1 + last_eob_len + 10 - bi_valid < 9) + { + send_bits(STATIC_TREES << 1, 3); + send_code(END_BLOCK, StaticTree.static_ltree); + bi_flush(); + } + last_eob_len = 7; + } + + + // Save the match info and tally the frequency counts. Return true if + // the current block must be flushed. + internal bool _tr_tally(int dist, int lc) + { + + pending_buf[d_buf + last_lit * 2] = (byte) (SupportClass.URShift(dist, 8)); + pending_buf[d_buf + last_lit * 2 + 1] = (byte) dist; + + pending_buf[l_buf + last_lit] = (byte) lc; last_lit++; + + if (dist == 0) + { + // lc is the unmatched char + dyn_ltree[lc * 2]++; + } + else + { + matches++; + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + dyn_ltree[(Tree._length_code[lc] + LITERALS + 1) * 2]++; + dyn_dtree[Tree.d_code(dist) * 2]++; + } + + if ((last_lit & 0x1fff) == 0 && level > 2) + { + // Compute an upper bound for the compressed length + int out_length = last_lit * 8; + int in_length = strstart - block_start; + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) + { + out_length = (int) (out_length + (int) dyn_dtree[dcode * 2] * (5L + Tree.extra_dbits[dcode])); + } + out_length = SupportClass.URShift(out_length, 3); + if ((matches < (last_lit / 2)) && out_length < in_length / 2) + return true; + } + + return (last_lit == lit_bufsize - 1); + // We avoid equality with lit_bufsize because of wraparound at 64K + // on 16 bit machines and because stored blocks are restricted to + // 64K-1 bytes. + } + + // Send the block data compressed using the given Huffman trees + internal void compress_block(short[] ltree, short[] dtree) + { + int dist; // distance of matched string + int lc; // match length or unmatched char (if dist == 0) + int lx = 0; // running index in l_buf + int code; // the code to send + int extra; // number of extra bits to send + + if (last_lit != 0) + { + do + { + dist = ((pending_buf[d_buf + lx * 2] << 8) & 0xff00) | (pending_buf[d_buf + lx * 2 + 1] & 0xff); + lc = (pending_buf[l_buf + lx]) & 0xff; lx++; + + if (dist == 0) + { + send_code(lc, ltree); // send a literal byte + } + else + { + // Here, lc is the match length - MIN_MATCH + code = Tree._length_code[lc]; + + send_code(code + LITERALS + 1, ltree); // send the length code + extra = Tree.extra_lbits[code]; + if (extra != 0) + { + lc -= Tree.base_length[code]; + send_bits(lc, extra); // send the extra length bits + } + dist--; // dist is now the match distance - 1 + code = Tree.d_code(dist); + + send_code(code, dtree); // send the distance code + extra = Tree.extra_dbits[code]; + if (extra != 0) + { + dist -= Tree.base_dist[code]; + send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + + // Check that the overlay between pending_buf and d_buf+l_buf is ok: + } + while (lx < last_lit); + } + + send_code(END_BLOCK, ltree); + last_eob_len = ltree[END_BLOCK * 2 + 1]; + } + + // Set the data type to ASCII or BINARY, using a crude approximation: + // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. + // IN assertion: the fields freq of dyn_ltree are set and the total of all + // frequencies does not exceed 64K (to fit in an int on 16 bit machines). + internal void set_data_type() + { + int n = 0; + int ascii_freq = 0; + int bin_freq = 0; + while (n < 7) + { + bin_freq += dyn_ltree[n * 2]; n++; + } + while (n < 128) + { + ascii_freq += dyn_ltree[n * 2]; n++; + } + while (n < LITERALS) + { + bin_freq += dyn_ltree[n * 2]; n++; + } + data_type = (byte) (bin_freq > (SupportClass.URShift(ascii_freq, 2))?Z_BINARY:Z_ASCII); + } + + // Flush the bit buffer, keeping at most 7 bits in it. + internal void bi_flush() + { + if (bi_valid == 16) + { + put_short(bi_buf); + bi_buf = 0; + bi_valid = 0; + } + else if (bi_valid >= 8) + { + put_byte((byte) bi_buf); + bi_buf = (short) (SupportClass.URShift(bi_buf, 8)); + bi_valid -= 8; + } + } + + // Flush the bit buffer and align the output on a byte boundary + internal void bi_windup() + { + if (bi_valid > 8) + { + put_short(bi_buf); + } + else if (bi_valid > 0) + { + put_byte((byte) bi_buf); + } + bi_buf = 0; + bi_valid = 0; + } + + // Copy a stored block, storing first the length and its + // one's complement if requested. + internal void copy_block(int buf, int len, bool header) + { + + bi_windup(); // align on byte boundary + last_eob_len = 8; // enough lookahead for inflate + + if (header) + { + put_short((short) len); + put_short((short) ~ len); + } + + // while(len--!=0) { + // put_byte(window[buf+index]); + // index++; + // } + put_byte(window, buf, len); + } + + internal void flush_block_only(bool eof) + { + _tr_flush_block(block_start >= 0?block_start:- 1, strstart - block_start, eof); + block_start = strstart; + strm.flush_pending(); + } + + // Copy without compression as much as possible from the input stream, return + // the current block state. + // This function does not insert new strings in the dictionary since + // uncompressible data is probably not useful. This function is used + // only for the level=0 compression option. + // NOTE: this function should be optimized to avoid extra copying from + // window to pending_buf. + internal int deflate_stored(int flush) + { + // Stored blocks are limited to 0xffff bytes, pending_buf is limited + // to pending_buf_size, and each stored block has a 5 byte header: + + int max_block_size = 0xffff; + int max_start; + + if (max_block_size > pending_buf_size - 5) + { + max_block_size = pending_buf_size - 5; + } + + // Copy as much as possible from input to output: + while (true) + { + // Fill the window as much as possible: + if (lookahead <= 1) + { + fill_window(); + if (lookahead == 0 && flush == Z_NO_FLUSH) + return NeedMore; + if (lookahead == 0) + break; // flush the current block + } + + strstart += lookahead; + lookahead = 0; + + // Emit a stored block if pending_buf will be full: + max_start = block_start + max_block_size; + if (strstart == 0 || strstart >= max_start) + { + // strstart == 0 is possible when wraparound on 16-bit machine + lookahead = (int) (strstart - max_start); + strstart = (int) max_start; + + flush_block_only(false); + if (strm.avail_out == 0) + return NeedMore; + } + + // Flush if we may have to slide, otherwise block_start may become + // negative and the data will be gone: + if (strstart - block_start >= w_size - MIN_LOOKAHEAD) + { + flush_block_only(false); + if (strm.avail_out == 0) + return NeedMore; + } + } + + flush_block_only(flush == Z_FINISH); + if (strm.avail_out == 0) + return (flush == Z_FINISH)?FinishStarted:NeedMore; + + return flush == Z_FINISH?FinishDone:BlockDone; + } + + // Send a stored block + internal void _tr_stored_block(int buf, int stored_len, bool eof) + { + send_bits((STORED_BLOCK << 1) + (eof?1:0), 3); // send block type + copy_block(buf, stored_len, true); // with header + } + + // Determine the best encoding for the current block: dynamic trees, static + // trees or store, and output the encoded block to the zip file. + internal void _tr_flush_block(int buf, int stored_len, bool eof) + { + int opt_lenb, static_lenb; // opt_len and static_len in bytes + int max_blindex = 0; // index of last bit length code of non zero freq + + // Build the Huffman trees unless a stored block is forced + if (level > 0) + { + // Check if the file is ascii or binary + if (data_type == Z_UNKNOWN) + set_data_type(); + + // Construct the literal and distance trees + l_desc.build_tree(this); + + d_desc.build_tree(this); + + // At this point, opt_len and static_len are the total bit lengths of + // the compressed block data, excluding the tree representations. + + // Build the bit length tree for the above two trees, and get the index + // in bl_order of the last bit length code to send. + max_blindex = build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = SupportClass.URShift((opt_len + 3 + 7), 3); + static_lenb = SupportClass.URShift((static_len + 3 + 7), 3); + + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + } + else + { + opt_lenb = static_lenb = stored_len + 5; // force a stored block + } + + if (stored_len + 4 <= opt_lenb && buf != - 1) + { + // 4: two words for the lengths + // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + // Otherwise we can't have processed more than WSIZE input bytes since + // the last block flush, because compression would have been + // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + // transform a block into a stored block. + _tr_stored_block(buf, stored_len, eof); + } + else if (static_lenb == opt_lenb) + { + send_bits((STATIC_TREES << 1) + (eof?1:0), 3); + compress_block(StaticTree.static_ltree, StaticTree.static_dtree); + } + else + { + send_bits((DYN_TREES << 1) + (eof?1:0), 3); + send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1, max_blindex + 1); + compress_block(dyn_ltree, dyn_dtree); + } + + // The above check is made mod 2^32, for files larger than 512 MB + // and uLong implemented on 32 bits. + + init_block(); + + if (eof) + { + bi_windup(); + } + } + + // Fill the window when the lookahead becomes insufficient. + // Updates strstart and lookahead. + // + // IN assertion: lookahead < MIN_LOOKAHEAD + // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + // At least one byte has been read, or avail_in == 0; reads are + // performed for at least two bytes (required for the zip translate_eol + // option -- not supported here). + internal void fill_window() + { + int n, m; + int p; + int more; // Amount of free space at the end of the window. + + do + { + more = (window_size - lookahead - strstart); + + // Deal with !@#$% 64K limit: + if (more == 0 && strstart == 0 && lookahead == 0) + { + more = w_size; + } + else if (more == - 1) + { + // Very unlikely, but possible on 16 bit machine if strstart == 0 + // and lookahead == 1 (input done one byte at time) + more--; + + // If the window is almost full and there is insufficient lookahead, + // move the upper half to the lower one to make room in the upper half. + } + else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) + { + Array.Copy(window, w_size, window, 0, w_size); + match_start -= w_size; + strstart -= w_size; // we now have strstart >= MAX_DIST + block_start -= w_size; + + // Slide the hash table (could be avoided with 32 bit values + // at the expense of memory usage). We slide even when level == 0 + // to keep the hash table consistent if we switch back to level > 0 + // later. (Using level 0 permanently is not an optimal usage of + // zlib, so we don't care about this pathological case.) + + n = hash_size; + p = n; + do + { + m = (head[--p] & 0xffff); + head[p] = (short)(m >= w_size?(m - w_size):0); + //head[p] = (m >= w_size?(short) (m - w_size):0); + } + while (--n != 0); + + n = w_size; + p = n; + do + { + m = (prev[--p] & 0xffff); + prev[p] = (short)(m >= w_size?(m - w_size):0); + //prev[p] = (m >= w_size?(short) (m - w_size):0); + // If n is not on any hash chain, prev[n] is garbage but + // its value will never be used. + } + while (--n != 0); + more += w_size; + } + + if (strm.avail_in == 0) + return ; + + // If there was no sliding: + // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + // more == window_size - lookahead - strstart + // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + // => more >= window_size - 2*WSIZE + 2 + // In the BIG_MEM or MMAP case (not yet supported), + // window_size == input_size + MIN_LOOKAHEAD && + // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + // Otherwise, window_size == 2*WSIZE so more >= 2. + // If there was sliding, more >= WSIZE. So in all cases, more >= 2. + + n = strm.read_buf(window, strstart + lookahead, more); + lookahead += n; + + // Initialize the hash value now that we have some input: + if (lookahead >= MIN_MATCH) + { + ins_h = window[strstart] & 0xff; + ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; + } + // If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + // but this is not important since only literal bytes will be emitted. + } + while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0); + } + + // Compress as much as possible from the input stream, return the current + // block state. + // This function does not perform lazy evaluation of matches and inserts + // new strings in the dictionary only for unmatched strings or for short + // matches. It is used only for the fast compression options. + internal int deflate_fast(int flush) + { + // short hash_head = 0; // head of the hash chain + int hash_head = 0; // head of the hash chain + bool bflush; // set if current block must be flushed + + while (true) + { + // Make sure that we always have enough lookahead, except + // at the end of the input file. We need MAX_MATCH bytes + // for the next match, plus MIN_MATCH bytes to insert the + // string following the next match. + if (lookahead < MIN_LOOKAHEAD) + { + fill_window(); + if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) + { + return NeedMore; + } + if (lookahead == 0) + break; // flush the current block + } + + // Insert the string window[strstart .. strstart+2] in the + // dictionary, and set hash_head to the head of the hash chain: + if (lookahead >= MIN_MATCH) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + + // prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = (short) strstart; + } + + // Find the longest match, discarding those <= prev_length. + // At this point we have always match_length < MIN_MATCH + + if (hash_head != 0L && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) + { + // To simplify the code, we prevent matches with the string + // of window index 0 (in particular we have to avoid a match + // of the string with itself at the start of the input file). + if (strategy != Z_HUFFMAN_ONLY) + { + match_length = longest_match(hash_head); + } + // longest_match() sets match_start + } + if (match_length >= MIN_MATCH) + { + // check_match(strstart, match_start, match_length); + + bflush = _tr_tally(strstart - match_start, match_length - MIN_MATCH); + + lookahead -= match_length; + + // Insert new strings in the hash table only if the match length + // is not too large. This saves time but degrades compression. + if (match_length <= max_lazy_match && lookahead >= MIN_MATCH) + { + match_length--; // string at strstart already in hash table + do + { + strstart++; + + ins_h = ((ins_h << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + // prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = (short) strstart; + + // strstart never exceeds WSIZE-MAX_MATCH, so there are + // always MIN_MATCH bytes ahead. + } + while (--match_length != 0); + strstart++; + } + else + { + strstart += match_length; + match_length = 0; + ins_h = window[strstart] & 0xff; + + ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; + // If lookahead < MIN_MATCH, ins_h is garbage, but it does not + // matter since it will be recomputed at next deflate call. + } + } + else + { + // No match, output a literal byte + + bflush = _tr_tally(0, window[strstart] & 0xff); + lookahead--; + strstart++; + } + if (bflush) + { + + flush_block_only(false); + if (strm.avail_out == 0) + return NeedMore; + } + } + + flush_block_only(flush == Z_FINISH); + if (strm.avail_out == 0) + { + if (flush == Z_FINISH) + return FinishStarted; + else + return NeedMore; + } + return flush == Z_FINISH?FinishDone:BlockDone; + } + + // Same as above, but achieves better compression. We use a lazy + // evaluation for matches: a match is finally adopted only if there is + // no better match at the next window position. + internal int deflate_slow(int flush) + { + // short hash_head = 0; // head of hash chain + int hash_head = 0; // head of hash chain + bool bflush; // set if current block must be flushed + + // Process the input block. + while (true) + { + // Make sure that we always have enough lookahead, except + // at the end of the input file. We need MAX_MATCH bytes + // for the next match, plus MIN_MATCH bytes to insert the + // string following the next match. + + if (lookahead < MIN_LOOKAHEAD) + { + fill_window(); + if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) + { + return NeedMore; + } + if (lookahead == 0) + break; // flush the current block + } + + // Insert the string window[strstart .. strstart+2] in the + // dictionary, and set hash_head to the head of the hash chain: + + if (lookahead >= MIN_MATCH) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + // prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = (short) strstart; + } + + // Find the longest match, discarding those <= prev_length. + prev_length = match_length; prev_match = match_start; + match_length = MIN_MATCH - 1; + + if (hash_head != 0 && prev_length < max_lazy_match && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) + { + // To simplify the code, we prevent matches with the string + // of window index 0 (in particular we have to avoid a match + // of the string with itself at the start of the input file). + + if (strategy != Z_HUFFMAN_ONLY) + { + match_length = longest_match(hash_head); + } + // longest_match() sets match_start + + if (match_length <= 5 && (strategy == Z_FILTERED || (match_length == MIN_MATCH && strstart - match_start > 4096))) + { + + // If prev_match is also MIN_MATCH, match_start is garbage + // but we will ignore the current match anyway. + match_length = MIN_MATCH - 1; + } + } + + // If there was a match at the previous step and the current + // match is not better, output the previous match: + if (prev_length >= MIN_MATCH && match_length <= prev_length) + { + int max_insert = strstart + lookahead - MIN_MATCH; + // Do not insert strings in hash table beyond this. + + // check_match(strstart-1, prev_match, prev_length); + + bflush = _tr_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); + + // Insert in hash table all strings up to the end of the match. + // strstart-1 and strstart are already inserted. If there is not + // enough lookahead, the last two strings are not inserted in + // the hash table. + lookahead -= (prev_length - 1); + prev_length -= 2; + do + { + if (++strstart <= max_insert) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + //prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = (short) strstart; + } + } + while (--prev_length != 0); + match_available = 0; + match_length = MIN_MATCH - 1; + strstart++; + + if (bflush) + { + flush_block_only(false); + if (strm.avail_out == 0) + return NeedMore; + } + } + else if (match_available != 0) + { + + // If there was no match at the previous position, output a + // single literal. If there was a match but the current match + // is longer, truncate the previous match to a single literal. + + bflush = _tr_tally(0, window[strstart - 1] & 0xff); + + if (bflush) + { + flush_block_only(false); + } + strstart++; + lookahead--; + if (strm.avail_out == 0) + return NeedMore; + } + else + { + // There is no previous match to compare with, wait for + // the next step to decide. + + match_available = 1; + strstart++; + lookahead--; + } + } + + if (match_available != 0) + { + bflush = _tr_tally(0, window[strstart - 1] & 0xff); + match_available = 0; + } + flush_block_only(flush == Z_FINISH); + + if (strm.avail_out == 0) + { + if (flush == Z_FINISH) + return FinishStarted; + else + return NeedMore; + } + + return flush == Z_FINISH?FinishDone:BlockDone; + } + + internal int longest_match(int cur_match) + { + int chain_length = max_chain_length; // max hash chain length + int scan = strstart; // current string + int match; // matched string + int len; // length of current match + int best_len = prev_length; // best match length so far + int limit = strstart > (w_size - MIN_LOOKAHEAD)?strstart - (w_size - MIN_LOOKAHEAD):0; + int nice_match = this.nice_match; + + // Stop when cur_match becomes <= limit. To simplify the code, + // we prevent matches with the string of window index 0. + + int wmask = w_mask; + + int strend = strstart + MAX_MATCH; + byte scan_end1 = window[scan + best_len - 1]; + byte scan_end = window[scan + best_len]; + + // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + // It is easy to get rid of this optimization if necessary. + + // Do not waste too much time if we already have a good match: + if (prev_length >= good_match) + { + chain_length >>= 2; + } + + // Do not look for matches beyond the end of the input. This is necessary + // to make deflate deterministic. + if (nice_match > lookahead) + nice_match = lookahead; + + do + { + match = cur_match; + + // Skip to next match if the match length cannot increase + // or if the match length is less than 2: + if (window[match + best_len] != scan_end || window[match + best_len - 1] != scan_end1 || window[match] != window[scan] || window[++match] != window[scan + 1]) + continue; + + // The check at best_len-1 can be removed because it will be made + // again later. (This heuristic is not always a win.) + // It is not necessary to compare scan[2] and match[2] since they + // are always equal when the other bytes match, given that + // the hash keys are equal and that HASH_BITS >= 8. + scan += 2; match++; + + // We check for insufficient lookahead only every 8th comparison; + // the 256th check will be made at strstart+258. + do + { + } + while (window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && scan < strend); + + len = MAX_MATCH - (int) (strend - scan); + scan = strend - MAX_MATCH; + + if (len > best_len) + { + match_start = cur_match; + best_len = len; + if (len >= nice_match) + break; + scan_end1 = window[scan + best_len - 1]; + scan_end = window[scan + best_len]; + } + } + while ((cur_match = (prev[cur_match & wmask] & 0xffff)) > limit && --chain_length != 0); + + if (best_len <= lookahead) + return best_len; + return lookahead; + } + + internal int deflateInit(ZStream strm, int level, int bits) + { + return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); + } + internal int deflateInit(ZStream strm, int level) + { + return deflateInit(strm, level, MAX_WBITS); + } + internal int deflateInit2(ZStream strm, int level, int method, int windowBits, int memLevel, int strategy) + { + int noheader = 0; + // byte[] my_version=ZLIB_VERSION; + + // + // if (version == null || version[0] != my_version[0] + // || stream_size != sizeof(z_stream)) { + // return Z_VERSION_ERROR; + // } + + strm.msg = null; + + if (level == Z_DEFAULT_COMPRESSION) + level = 6; + + if (windowBits < 0) + { + // undocumented feature: suppress zlib header + noheader = 1; + windowBits = - windowBits; + } + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) + { + return Z_STREAM_ERROR; + } + + strm.dstate = (Deflate) this; + + this.noheader = noheader; + w_bits = windowBits; + w_size = 1 << w_bits; + w_mask = w_size - 1; + + hash_bits = memLevel + 7; + hash_size = 1 << hash_bits; + hash_mask = hash_size - 1; + hash_shift = ((hash_bits + MIN_MATCH - 1) / MIN_MATCH); + + window = new byte[w_size * 2]; + prev = new short[w_size]; + head = new short[hash_size]; + + lit_bufsize = 1 << (memLevel + 6); // 16K elements by default + + // We overlay pending_buf and d_buf+l_buf. This works since the average + // output size for (length,distance) codes is <= 24 bits. + pending_buf = new byte[lit_bufsize * 4]; + pending_buf_size = lit_bufsize * 4; + + d_buf = lit_bufsize; + l_buf = (1 + 2) * lit_bufsize; + + this.level = level; + + //System.out.println("level="+level); + + this.strategy = strategy; + this.method = (byte) method; + + return deflateReset(strm); + } + + internal int deflateReset(ZStream strm) + { + strm.total_in = strm.total_out = 0; + strm.msg = null; // + strm.data_type = Z_UNKNOWN; + + pending = 0; + pending_out = 0; + + if (noheader < 0) + { + noheader = 0; // was set to -1 by deflate(..., Z_FINISH); + } + status = (noheader != 0)?BUSY_STATE:INIT_STATE; + strm.adler = strm._adler.adler32(0, null, 0, 0); + + last_flush = Z_NO_FLUSH; + + tr_init(); + lm_init(); + return Z_OK; + } + + internal int deflateEnd() + { + if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) + { + return Z_STREAM_ERROR; + } + // Deallocate in reverse order of allocations: + pending_buf = null; + head = null; + prev = null; + window = null; + // free + // dstate=null; + return status == BUSY_STATE?Z_DATA_ERROR:Z_OK; + } + + internal int deflateParams(ZStream strm, int _level, int _strategy) + { + int err = Z_OK; + + if (_level == Z_DEFAULT_COMPRESSION) + { + _level = 6; + } + if (_level < 0 || _level > 9 || _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) + { + return Z_STREAM_ERROR; + } + + if (config_table[level].func != config_table[_level].func && strm.total_in != 0) + { + // Flush the last buffer: + err = strm.deflate(Z_PARTIAL_FLUSH); + } + + if (level != _level) + { + level = _level; + max_lazy_match = config_table[level].max_lazy; + good_match = config_table[level].good_length; + nice_match = config_table[level].nice_length; + max_chain_length = config_table[level].max_chain; + } + strategy = _strategy; + return err; + } + + internal int deflateSetDictionary(ZStream strm, byte[] dictionary, int dictLength) + { + int length = dictLength; + int index = 0; + + if (dictionary == null || status != INIT_STATE) + return Z_STREAM_ERROR; + + strm.adler = strm._adler.adler32(strm.adler, dictionary, 0, dictLength); + + if (length < MIN_MATCH) + return Z_OK; + if (length > w_size - MIN_LOOKAHEAD) + { + length = w_size - MIN_LOOKAHEAD; + index = dictLength - length; // use the tail of the dictionary + } + Array.Copy(dictionary, index, window, 0, length); + strstart = length; + block_start = length; + + // Insert all strings in the hash table (except for the last two bytes). + // s->lookahead stays null, so s->ins_h will be recomputed at the next + // call of fill_window. + + ins_h = window[0] & 0xff; + ins_h = (((ins_h) << hash_shift) ^ (window[1] & 0xff)) & hash_mask; + + for (int n = 0; n <= length - MIN_MATCH; n++) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(n) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + prev[n & w_mask] = head[ins_h]; + head[ins_h] = (short) n; + } + return Z_OK; + } + + internal int deflate(ZStream strm, int flush) + { + int old_flush; + + if (flush > Z_FINISH || flush < 0) + { + return Z_STREAM_ERROR; + } + + if (strm.next_out == null || (strm.next_in == null && strm.avail_in != 0) || (status == FINISH_STATE && flush != Z_FINISH)) + { + strm.msg = z_errmsg[Z_NEED_DICT - (Z_STREAM_ERROR)]; + return Z_STREAM_ERROR; + } + if (strm.avail_out == 0) + { + strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; + return Z_BUF_ERROR; + } + + this.strm = strm; // just in case + old_flush = last_flush; + last_flush = flush; + + // Write the zlib header + if (status == INIT_STATE) + { + int header = (Z_DEFLATED + ((w_bits - 8) << 4)) << 8; + int level_flags = ((level - 1) & 0xff) >> 1; + + if (level_flags > 3) + level_flags = 3; + header |= (level_flags << 6); + if (strstart != 0) + header |= PRESET_DICT; + header += 31 - (header % 31); + + status = BUSY_STATE; + putShortMSB(header); + + + // Save the adler32 of the preset dictionary: + if (strstart != 0) + { + putShortMSB((int) (SupportClass.URShift(strm.adler, 16))); + putShortMSB((int) (strm.adler & 0xffff)); + } + strm.adler = strm._adler.adler32(0, null, 0, 0); + } + + // Flush as much pending output as possible + if (pending != 0) + { + strm.flush_pending(); + if (strm.avail_out == 0) + { + //System.out.println(" avail_out==0"); + // Since avail_out is 0, deflate will be called again with + // more output space, but possibly with both pending and + // avail_in equal to zero. There won't be anything to do, + // but this is not an error situation so make sure we + // return OK instead of BUF_ERROR at next call of deflate: + last_flush = - 1; + return Z_OK; + } + + // Make sure there is something to do and avoid duplicate consecutive + // flushes. For repeated and useless calls with Z_FINISH, we keep + // returning Z_STREAM_END instead of Z_BUFF_ERROR. + } + else if (strm.avail_in == 0 && flush <= old_flush && flush != Z_FINISH) + { + strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; + return Z_BUF_ERROR; + } + + // User must not provide more input after the first FINISH: + if (status == FINISH_STATE && strm.avail_in != 0) + { + strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; + return Z_BUF_ERROR; + } + + // Start a new block or continue the current one. + if (strm.avail_in != 0 || lookahead != 0 || (flush != Z_NO_FLUSH && status != FINISH_STATE)) + { + int bstate = - 1; + switch (config_table[level].func) + { + + case STORED: + bstate = deflate_stored(flush); + break; + + case FAST: + bstate = deflate_fast(flush); + break; + + case SLOW: + bstate = deflate_slow(flush); + break; + + default: + break; + + } + + if (bstate == FinishStarted || bstate == FinishDone) + { + status = FINISH_STATE; + } + if (bstate == NeedMore || bstate == FinishStarted) + { + if (strm.avail_out == 0) + { + last_flush = - 1; // avoid BUF_ERROR next call, see above + } + return Z_OK; + // If flush != Z_NO_FLUSH && avail_out == 0, the next call + // of deflate should use the same flush parameter to make sure + // that the flush is complete. So we don't have to output an + // empty block here, this will be done at next call. This also + // ensures that for a very small output buffer, we emit at most + // one empty block. + } + + if (bstate == BlockDone) + { + if (flush == Z_PARTIAL_FLUSH) + { + _tr_align(); + } + else + { + // FULL_FLUSH or SYNC_FLUSH + _tr_stored_block(0, 0, false); + // For a full flush, this empty block will be recognized + // as a special marker by inflate_sync(). + if (flush == Z_FULL_FLUSH) + { + //state.head[s.hash_size-1]=0; + for (int i = 0; i < hash_size; i++) + // forget history + head[i] = 0; + } + } + strm.flush_pending(); + if (strm.avail_out == 0) + { + last_flush = - 1; // avoid BUF_ERROR at next call, see above + return Z_OK; + } + } + } + + if (flush != Z_FINISH) + return Z_OK; + if (noheader != 0) + return Z_STREAM_END; + + // Write the zlib trailer (adler32) + putShortMSB((int) (SupportClass.URShift(strm.adler, 16))); + putShortMSB((int) (strm.adler & 0xffff)); + strm.flush_pending(); + + // If avail_out is zero, the application will call deflate again + // to flush the rest. + noheader = - 1; // write the trailer only once! + return pending != 0?Z_OK:Z_STREAM_END; + } + static Deflate() + { + { + config_table = new Config[10]; + // good lazy nice chain + config_table[0] = new Config(0, 0, 0, 0, STORED); + config_table[1] = new Config(4, 4, 8, 4, FAST); + config_table[2] = new Config(4, 5, 16, 8, FAST); + config_table[3] = new Config(4, 6, 32, 32, FAST); + + config_table[4] = new Config(4, 4, 16, 16, SLOW); + config_table[5] = new Config(8, 16, 32, 32, SLOW); + config_table[6] = new Config(8, 16, 128, 128, SLOW); + config_table[7] = new Config(8, 32, 128, 256, SLOW); + config_table[8] = new Config(32, 128, 258, 1024, SLOW); + config_table[9] = new Config(32, 258, 258, 4096, SLOW); + } + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfBlocks.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfBlocks.cs new file mode 100644 index 00000000..3f37b880 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfBlocks.cs @@ -0,0 +1,720 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed class InfBlocks + { + private const int MANY = 1440; + + // And'ing with mask[n] masks the lower n bits + private static readonly int[] inflate_mask = new int[]{0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff}; + + // Table for deflate from PKZIP's appnote.txt. + internal static readonly int[] border = new int[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + private const int TYPE = 0; // get type bits (3, including end bit) + private const int LENS = 1; // get lengths for stored + private const int STORED = 2; // processing stored block + private const int TABLE = 3; // get table lengths + private const int BTREE = 4; // get bit lengths tree for a dynamic block + private const int DTREE = 5; // get length, distance trees for a dynamic block + private const int CODES = 6; // processing fixed or dynamic block + private const int DRY = 7; // output remaining window bytes + private const int DONE = 8; // finished last block, done + private const int BAD = 9; // ot a data error--stuck here + + internal int mode; // current inflate_block mode + + internal int left; // if STORED, bytes left to copy + + internal int table; // table lengths (14 bits) + internal int index; // index into blens (or border) + internal int[] blens; // bit lengths of codes + internal int[] bb = new int[1]; // bit length tree depth + internal int[] tb = new int[1]; // bit length decoding tree + + internal InfCodes codes; // if CODES, current state + + internal int last; // true if this block is the last block + + // mode independent information + internal int bitk; // bits in bit buffer + internal int bitb; // bit buffer + internal int[] hufts; // single malloc for tree space + internal byte[] window; // sliding window + internal int end; // one byte after sliding window + internal int read; // window read pointer + internal int write; // window write pointer + internal System.Object checkfn; // check function + internal long check; // check on output + + internal InfBlocks(ZStream z, System.Object checkfn, int w) + { + hufts = new int[MANY * 3]; + window = new byte[w]; + end = w; + this.checkfn = checkfn; + mode = TYPE; + reset(z, null); + } + + internal void reset(ZStream z, long[] c) + { + if (c != null) + c[0] = check; + if (mode == BTREE || mode == DTREE) + { + blens = null; + } + if (mode == CODES) + { + codes.free(z); + } + mode = TYPE; + bitk = 0; + bitb = 0; + read = write = 0; + + if (checkfn != null) + z.adler = check = z._adler.adler32(0L, null, 0, 0); + } + + internal int proc(ZStream z, int r) + { + int t; // temporary storage + int b; // bit buffer + int k; // bits in bit buffer + int p; // input data pointer + int n; // bytes available there + int q; // output window write pointer + int m; // bytes to end of window or read pointer + + // copy input/output information to locals (UPDATE macro restores) + { + p = z.next_in_index; n = z.avail_in; b = bitb; k = bitk; + } + { + q = write; m = (int) (q < read?read - q - 1:end - q); + } + + // process input based on current state + while (true) + { + switch (mode) + { + + case TYPE: + + while (k < (3)) + { + if (n != 0) + { + r = Z_OK; + } + else + { + bitb = b; bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + ; + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + t = (int) (b & 7); + last = t & 1; + + switch (SupportClass.URShift(t, 1)) + { + + case 0: // stored + { + b = SupportClass.URShift(b, (3)); k -= (3); + } + t = k & 7; // go to byte boundary + + { + b = SupportClass.URShift(b, (t)); k -= (t); + } + mode = LENS; // get length of stored block + break; + + case 1: // fixed + { + int[] bl = new int[1]; + int[] bd = new int[1]; + int[][] tl = new int[1][]; + int[][] td = new int[1][]; + + InfTree.inflate_trees_fixed(bl, bd, tl, td, z); + codes = new InfCodes(bl[0], bd[0], tl[0], td[0], z); + } + + { + b = SupportClass.URShift(b, (3)); k -= (3); + } + + mode = CODES; + break; + + case 2: // dynamic + + { + b = SupportClass.URShift(b, (3)); k -= (3); + } + + mode = TABLE; + break; + + case 3: // illegal + + { + b = SupportClass.URShift(b, (3)); k -= (3); + } + mode = BAD; + z.msg = "invalid block type"; + r = Z_DATA_ERROR; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + break; + + case LENS: + + while (k < (32)) + { + if (n != 0) + { + r = Z_OK; + } + else + { + bitb = b; bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + ; + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + if (((SupportClass.URShift((~ b), 16)) & 0xffff) != (b & 0xffff)) + { + mode = BAD; + z.msg = "invalid stored block lengths"; + r = Z_DATA_ERROR; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + left = (b & 0xffff); + b = k = 0; // dump bits + mode = left != 0?STORED:(last != 0?DRY:TYPE); + break; + + case STORED: + if (n == 0) + { + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + + if (m == 0) + { + if (q == end && read != 0) + { + q = 0; m = (int) (q < read?read - q - 1:end - q); + } + if (m == 0) + { + write = q; + r = inflate_flush(z, r); + q = write; m = (int) (q < read?read - q - 1:end - q); + if (q == end && read != 0) + { + q = 0; m = (int) (q < read?read - q - 1:end - q); + } + if (m == 0) + { + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + } + } + r = Z_OK; + + t = left; + if (t > n) + t = n; + if (t > m) + t = m; + Array.Copy(z.next_in, p, window, q, t); + p += t; n -= t; + q += t; m -= t; + if ((left -= t) != 0) + break; + mode = last != 0?DRY:TYPE; + break; + + case TABLE: + + while (k < (14)) + { + if (n != 0) + { + r = Z_OK; + } + else + { + bitb = b; bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + ; + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + table = t = (b & 0x3fff); + if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) + { + mode = BAD; + z.msg = "too many length or distance symbols"; + r = Z_DATA_ERROR; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); + blens = new int[t]; + + { + b = SupportClass.URShift(b, (14)); k -= (14); + } + + index = 0; + mode = BTREE; + goto case BTREE; + + case BTREE: + while (index < 4 + (SupportClass.URShift(table, 10))) + { + while (k < (3)) + { + if (n != 0) + { + r = Z_OK; + } + else + { + bitb = b; bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + ; + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + blens[border[index++]] = b & 7; + + { + b = SupportClass.URShift(b, (3)); k -= (3); + } + } + + while (index < 19) + { + blens[border[index++]] = 0; + } + + bb[0] = 7; + t = InfTree.inflate_trees_bits(blens, bb, tb, hufts, z); + if (t != Z_OK) + { + r = t; + if (r == Z_DATA_ERROR) + { + blens = null; + mode = BAD; + } + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + + index = 0; + mode = DTREE; + goto case DTREE; + + case DTREE: + while (true) + { + t = table; + if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) + { + break; + } + + + int i, j, c; + + t = bb[0]; + + while (k < (t)) + { + if (n != 0) + { + r = Z_OK; + } + else + { + bitb = b; bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + ; + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + if (tb[0] == - 1) + { + //System.err.println("null..."); + } + + t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; + c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; + + if (c < 16) + { + b = SupportClass.URShift(b, (t)); k -= (t); + blens[index++] = c; + } + else + { + // c == 16..18 + i = c == 18?7:c - 14; + j = c == 18?11:3; + + while (k < (t + i)) + { + if (n != 0) + { + r = Z_OK; + } + else + { + bitb = b; bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + ; + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + b = SupportClass.URShift(b, (t)); k -= (t); + + j += (b & inflate_mask[i]); + + b = SupportClass.URShift(b, (i)); k -= (i); + + i = index; + t = table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) + { + blens = null; + mode = BAD; + z.msg = "invalid bit length repeat"; + r = Z_DATA_ERROR; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + + c = c == 16?blens[i - 1]:0; + do + { + blens[i++] = c; + } + while (--j != 0); + index = i; + } + } + + tb[0] = - 1; + { + int[] bl = new int[1]; + int[] bd = new int[1]; + int[] tl = new int[1]; + int[] td = new int[1]; + + + bl[0] = 9; // must be <= 9 for lookahead assumptions + bd[0] = 6; // must be <= 9 for lookahead assumptions + t = table; + t = InfTree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, z); + if (t != Z_OK) + { + if (t == Z_DATA_ERROR) + { + blens = null; + mode = BAD; + } + r = t; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + + codes = new InfCodes(bl[0], bd[0], hufts, tl[0], hufts, td[0], z); + } + blens = null; + mode = CODES; + goto case CODES; + + case CODES: + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + + if ((r = codes.proc(this, z, r)) != Z_STREAM_END) + { + return inflate_flush(z, r); + } + r = Z_OK; + codes.free(z); + + p = z.next_in_index; n = z.avail_in; b = bitb; k = bitk; + q = write; m = (int) (q < read?read - q - 1:end - q); + + if (last == 0) + { + mode = TYPE; + break; + } + mode = DRY; + goto case DRY; + + case DRY: + write = q; + r = inflate_flush(z, r); + q = write; m = (int) (q < read?read - q - 1:end - q); + if (read != write) + { + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + } + mode = DONE; + goto case DONE; + + case DONE: + r = Z_STREAM_END; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + + case BAD: + r = Z_DATA_ERROR; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + + + default: + r = Z_STREAM_ERROR; + + bitb = b; bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + write = q; + return inflate_flush(z, r); + + } + } + } + + internal void free(ZStream z) + { + reset(z, null); + window = null; + hufts = null; + //ZFREE(z, s); + } + + internal void set_dictionary(byte[] d, int start, int n) + { + Array.Copy(d, start, window, 0, n); + read = write = n; + } + + // Returns true if inflate is currently at the end of a block generated + // by Z_SYNC_FLUSH or Z_FULL_FLUSH. + internal int sync_point() + { + return mode == LENS?1:0; + } + + // copy as much as possible from the sliding window to the output area + internal int inflate_flush(ZStream z, int r) + { + int n; + int p; + int q; + + // local copies of source and destination pointers + p = z.next_out_index; + q = read; + + // compute number of bytes to copy as far as end of window + n = (int) ((q <= write?write:end) - q); + if (n > z.avail_out) + n = z.avail_out; + if (n != 0 && r == Z_BUF_ERROR) + r = Z_OK; + + // update counters + z.avail_out -= n; + z.total_out += n; + + // update check information + if (checkfn != null) + z.adler = check = z._adler.adler32(check, window, q, n); + + // copy as far as end of window + Array.Copy(window, q, z.next_out, p, n); + p += n; + q += n; + + // see if more to copy at beginning of window + if (q == end) + { + // wrap pointers + q = 0; + if (write == end) + write = 0; + + // compute bytes to copy + n = write - q; + if (n > z.avail_out) + n = z.avail_out; + if (n != 0 && r == Z_BUF_ERROR) + r = Z_OK; + + // update counters + z.avail_out -= n; + z.total_out += n; + + // update check information + if (checkfn != null) + z.adler = check = z._adler.adler32(check, window, q, n); + + // copy + Array.Copy(window, q, z.next_out, p, n); + p += n; + q += n; + } + + // update pointers + z.next_out_index = p; + read = q; + + // done + return r; + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfCodes.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfCodes.cs new file mode 100644 index 00000000..75811a46 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfCodes.cs @@ -0,0 +1,716 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed class InfCodes + { + + private static readonly int[] inflate_mask = new int[]{0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff}; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + // waiting for "i:"=input, + // "o:"=output, + // "x:"=nothing + private const int START = 0; // x: set up for LEN + private const int LEN = 1; // i: get length/literal/eob next + private const int LENEXT = 2; // i: getting length extra (have base) + private const int DIST = 3; // i: get distance next + private const int DISTEXT = 4; // i: getting distance extra + private const int COPY = 5; // o: copying bytes in window, waiting for space + private const int LIT = 6; // o: got literal, waiting for output space + private const int WASH = 7; // o: got eob, possibly still output waiting + private const int END = 8; // x: got eob and all data flushed + private const int BADCODE = 9; // x: got error + + internal int mode; // current inflate_codes mode + + // mode dependent information + internal int len; + + internal int[] tree; // pointer into tree + internal int tree_index = 0; + internal int need; // bits needed + + internal int lit; + + // if EXT or COPY, where and how much + internal int get_Renamed; // bits to get for extra + internal int dist; // distance back to copy from + + internal byte lbits; // ltree bits decoded per branch + internal byte dbits; // dtree bits decoder per branch + internal int[] ltree; // literal/length/eob tree + internal int ltree_index; // literal/length/eob tree + internal int[] dtree; // distance tree + internal int dtree_index; // distance tree + + internal InfCodes(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, ZStream z) + { + mode = START; + lbits = (byte) bl; + dbits = (byte) bd; + ltree = tl; + ltree_index = tl_index; + dtree = td; + dtree_index = td_index; + } + + internal InfCodes(int bl, int bd, int[] tl, int[] td, ZStream z) + { + mode = START; + lbits = (byte) bl; + dbits = (byte) bd; + ltree = tl; + ltree_index = 0; + dtree = td; + dtree_index = 0; + } + + internal int proc(InfBlocks s, ZStream z, int r) + { + int j; // temporary storage + //int[] t; // temporary pointer + int tindex; // temporary pointer + int e; // extra bits or operation + int b = 0; // bit buffer + int k = 0; // bits in bit buffer + int p = 0; // input data pointer + int n; // bytes available there + int q; // output window write pointer + int m; // bytes to end of window or read pointer + int f; // pointer to copy strings from + + // copy input/output information to locals (UPDATE macro restores) + p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; + q = s.write; m = q < s.read?s.read - q - 1:s.end - q; + + // process input and output based on current state + while (true) + { + switch (mode) + { + + // waiting for "i:"=input, "o:"=output, "x:"=nothing + case START: // x: set up for LEN + if (m >= 258 && n >= 10) + { + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + r = inflate_fast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, s, z); + + p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; + q = s.write; m = q < s.read?s.read - q - 1:s.end - q; + + if (r != Z_OK) + { + mode = r == Z_STREAM_END?WASH:BADCODE; + break; + } + } + need = lbits; + tree = ltree; + tree_index = ltree_index; + + mode = LEN; + goto case LEN; + + case LEN: // i: get length/literal/eob next + j = need; + + while (k < (j)) + { + if (n != 0) + r = Z_OK; + else + { + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; + b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + tindex = (tree_index + (b & inflate_mask[j])) * 3; + + b = SupportClass.URShift(b, (tree[tindex + 1])); + k -= (tree[tindex + 1]); + + e = tree[tindex]; + + if (e == 0) + { + // literal + lit = tree[tindex + 2]; + mode = LIT; + break; + } + if ((e & 16) != 0) + { + // length + get_Renamed = e & 15; + len = tree[tindex + 2]; + mode = LENEXT; + break; + } + if ((e & 64) == 0) + { + // next table + need = e; + tree_index = tindex / 3 + tree[tindex + 2]; + break; + } + if ((e & 32) != 0) + { + // end of block + mode = WASH; + break; + } + mode = BADCODE; // invalid code + z.msg = "invalid literal/length code"; + r = Z_DATA_ERROR; + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + + case LENEXT: // i: getting length extra (have base) + j = get_Renamed; + + while (k < (j)) + { + if (n != 0) + r = Z_OK; + else + { + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + len += (b & inflate_mask[j]); + + b >>= j; + k -= j; + + need = dbits; + tree = dtree; + tree_index = dtree_index; + mode = DIST; + goto case DIST; + + case DIST: // i: get distance next + j = need; + + while (k < (j)) + { + if (n != 0) + r = Z_OK; + else + { + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + tindex = (tree_index + (b & inflate_mask[j])) * 3; + + b >>= tree[tindex + 1]; + k -= tree[tindex + 1]; + + e = (tree[tindex]); + if ((e & 16) != 0) + { + // distance + get_Renamed = e & 15; + dist = tree[tindex + 2]; + mode = DISTEXT; + break; + } + if ((e & 64) == 0) + { + // next table + need = e; + tree_index = tindex / 3 + tree[tindex + 2]; + break; + } + mode = BADCODE; // invalid code + z.msg = "invalid distance code"; + r = Z_DATA_ERROR; + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + + case DISTEXT: // i: getting distance extra + j = get_Renamed; + + while (k < (j)) + { + if (n != 0) + r = Z_OK; + else + { + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; b |= (z.next_in[p++] & 0xff) << k; + k += 8; + } + + dist += (b & inflate_mask[j]); + + b >>= j; + k -= j; + + mode = COPY; + goto case COPY; + + case COPY: // o: copying bytes in window, waiting for space + f = q - dist; + while (f < 0) + { + // modulo window size-"while" instead + f += s.end; // of "if" handles invalid distances + } + while (len != 0) + { + + if (m == 0) + { + if (q == s.end && s.read != 0) + { + q = 0; m = q < s.read?s.read - q - 1:s.end - q; + } + if (m == 0) + { + s.write = q; r = s.inflate_flush(z, r); + q = s.write; m = q < s.read?s.read - q - 1:s.end - q; + + if (q == s.end && s.read != 0) + { + q = 0; m = q < s.read?s.read - q - 1:s.end - q; + } + + if (m == 0) + { + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + } + } + + s.window[q++] = s.window[f++]; m--; + + if (f == s.end) + f = 0; + len--; + } + mode = START; + break; + + case LIT: // o: got literal, waiting for output space + if (m == 0) + { + if (q == s.end && s.read != 0) + { + q = 0; m = q < s.read?s.read - q - 1:s.end - q; + } + if (m == 0) + { + s.write = q; r = s.inflate_flush(z, r); + q = s.write; m = q < s.read?s.read - q - 1:s.end - q; + + if (q == s.end && s.read != 0) + { + q = 0; m = q < s.read?s.read - q - 1:s.end - q; + } + if (m == 0) + { + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + } + } + r = Z_OK; + + s.window[q++] = (byte) lit; m--; + + mode = START; + break; + + case WASH: // o: got eob, possibly more output + if (k > 7) + { + // return unused byte, if any + k -= 8; + n++; + p--; // can always return one + } + + s.write = q; r = s.inflate_flush(z, r); + q = s.write; m = q < s.read?s.read - q - 1:s.end - q; + + if (s.read != s.write) + { + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + mode = END; + goto case END; + + case END: + r = Z_STREAM_END; + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + + case BADCODE: // x: got error + + r = Z_DATA_ERROR; + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + + default: + r = Z_STREAM_ERROR; + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + } + } + } + + internal void free(ZStream z) + { + // ZFREE(z, c); + } + + // Called with number of bytes left to write in window at least 258 + // (the maximum string length) and number of input bytes available + // at least ten. The ten bytes are six bytes for the longest length/ + // distance pair plus four bytes for overloading the bit buffer. + + internal int inflate_fast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InfBlocks s, ZStream z) + { + int t; // temporary pointer + int[] tp; // temporary pointer + int tp_index; // temporary pointer + int e; // extra bits or operation + int b; // bit buffer + int k; // bits in bit buffer + int p; // input data pointer + int n; // bytes available there + int q; // output window write pointer + int m; // bytes to end of window or read pointer + int ml; // mask for literal/length tree + int md; // mask for distance tree + int c; // bytes to copy + int d; // distance back to copy from + int r; // copy source pointer + + // load input, output, bit values + p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; + q = s.write; m = q < s.read?s.read - q - 1:s.end - q; + + // initialize masks + ml = inflate_mask[bl]; + md = inflate_mask[bd]; + + // do until not enough input or output space for fast loop + do + { + // assume called with m >= 258 && n >= 10 + // get literal/length code + while (k < (20)) + { + // max bits for literal/length code + n--; + b |= (z.next_in[p++] & 0xff) << k; k += 8; + } + + t = b & ml; + tp = tl; + tp_index = tl_index; + if ((e = tp[(tp_index + t) * 3]) == 0) + { + b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); + + s.window[q++] = (byte) tp[(tp_index + t) * 3 + 2]; + m--; + continue; + } + do + { + + b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); + + if ((e & 16) != 0) + { + e &= 15; + c = tp[(tp_index + t) * 3 + 2] + ((int) b & inflate_mask[e]); + + b >>= e; k -= e; + + // decode distance base of block to copy + while (k < (15)) + { + // max bits for distance code + n--; + b |= (z.next_in[p++] & 0xff) << k; k += 8; + } + + t = b & md; + tp = td; + tp_index = td_index; + e = tp[(tp_index + t) * 3]; + + do + { + + b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); + + if ((e & 16) != 0) + { + // get extra bits to add to distance base + e &= 15; + while (k < (e)) + { + // get extra bits (up to 13) + n--; + b |= (z.next_in[p++] & 0xff) << k; k += 8; + } + + d = tp[(tp_index + t) * 3 + 2] + (b & inflate_mask[e]); + + b >>= (e); k -= (e); + + // do the copy + m -= c; + if (q >= d) + { + // offset before dest + // just copy + r = q - d; + if (q - r > 0 && 2 > (q - r)) + { + s.window[q++] = s.window[r++]; c--; // minimum count is three, + s.window[q++] = s.window[r++]; c--; // so unroll loop a little + } + else + { + Array.Copy(s.window, r, s.window, q, 2); + q += 2; r += 2; c -= 2; + } + } + else + { + // else offset after destination + r = q - d; + do + { + r += s.end; // force pointer in window + } + while (r < 0); // covers invalid distances + e = s.end - r; + if (c > e) + { + // if source crosses, + c -= e; // wrapped copy + if (q - r > 0 && e > (q - r)) + { + do + { + s.window[q++] = s.window[r++]; + } + while (--e != 0); + } + else + { + Array.Copy(s.window, r, s.window, q, e); + q += e; r += e; e = 0; + } + r = 0; // copy rest from start of window + } + } + + // copy all or what's left + if (q - r > 0 && c > (q - r)) + { + do + { + s.window[q++] = s.window[r++]; + } + while (--c != 0); + } + else + { + Array.Copy(s.window, r, s.window, q, c); + q += c; r += c; c = 0; + } + break; + } + else if ((e & 64) == 0) + { + t += tp[(tp_index + t) * 3 + 2]; + t += (b & inflate_mask[e]); + e = tp[(tp_index + t) * 3]; + } + else + { + z.msg = "invalid distance code"; + + c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + + return Z_DATA_ERROR; + } + } + while (true); + break; + } + + if ((e & 64) == 0) + { + t += tp[(tp_index + t) * 3 + 2]; + t += (b & inflate_mask[e]); + if ((e = tp[(tp_index + t) * 3]) == 0) + { + + b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); + + s.window[q++] = (byte) tp[(tp_index + t) * 3 + 2]; + m--; + break; + } + } + else if ((e & 32) != 0) + { + + c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + + return Z_STREAM_END; + } + else + { + z.msg = "invalid literal/length code"; + + c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + + return Z_DATA_ERROR; + } + } + while (true); + } + while (m >= 258 && n >= 10); + + // not enough input or output--restore pointers and return + c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; + s.write = q; + + return Z_OK; + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfTree.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfTree.cs new file mode 100644 index 00000000..1b4c6e4e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/InfTree.cs @@ -0,0 +1,377 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed class InfTree + { + + private const int MANY = 1440; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + internal const int fixed_bl = 9; + internal const int fixed_bd = 5; + + + internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, + 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, + 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255}; + + internal static readonly int[] fixed_td = new int[]{80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577}; + + // Tables for deflate from PKZIP's appnote.txt. + internal static readonly int[] cplens = new int[]{3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + + internal static readonly int[] cplext = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; + + internal static readonly int[] cpdist = new int[]{1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + + internal static readonly int[] cpdext = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + + // If BMAX needs to be larger than 16, then h and x[] should be uLong. + internal const int BMAX = 15; // maximum bit length of any code + + internal static int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) + { + // Given a list of code lengths and a maximum table size, make a set of + // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR + // if the given code set is incomplete (the tables are still built in this + // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of + // lengths), or Z_MEM_ERROR if not enough memory. + + int a; // counter for codes of length k + int[] c = new int[BMAX + 1]; // bit length count table + int f; // i repeats in table every f entries + int g; // maximum code length + int h; // table level + int i; // counter, current code + int j; // counter + int k; // number of bits in current code + int l; // bits per table (returned in m) + int mask; // (1 << w) - 1, to avoid cc -O bug on HP + int p; // pointer into c[], b[], or v[] + int q; // points to current table + int[] r = new int[3]; // table entry for structure assignment + int[] u = new int[BMAX]; // table stack + int w; // bits before this table == (l * h) + int[] x = new int[BMAX + 1]; // bit offsets, then code stack + int xp; // pointer into x + int y; // number of dummy codes added + int z; // number of entries in current table + + // Generate counts for each bit length + + p = 0; i = n; + do + { + c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX + } + while (i != 0); + + if (c[0] == n) + { + // null input--all zero length codes + t[0] = - 1; + m[0] = 0; + return Z_OK; + } + + // Find minimum and maximum length, bound *m by those + l = m[0]; + for (j = 1; j <= BMAX; j++) + if (c[j] != 0) + break; + k = j; // minimum code length + if (l < j) + { + l = j; + } + for (i = BMAX; i != 0; i--) + { + if (c[i] != 0) + break; + } + g = i; // maximum code length + if (l > i) + { + l = i; + } + m[0] = l; + + // Adjust last length count to fill out codes, if needed + for (y = 1 << j; j < i; j++, y <<= 1) + { + if ((y -= c[j]) < 0) + { + return Z_DATA_ERROR; + } + } + if ((y -= c[i]) < 0) + { + return Z_DATA_ERROR; + } + c[i] += y; + + // Generate starting offsets into the value table for each length + x[1] = j = 0; + p = 1; xp = 2; + while (--i != 0) + { + // note that i == g from above + x[xp] = (j += c[p]); + xp++; + p++; + } + + // Make a table of values in order of bit lengths + i = 0; p = 0; + do + { + if ((j = b[bindex + p]) != 0) + { + v[x[j]++] = i; + } + p++; + } + while (++i < n); + n = x[g]; // set n to length of v + + // Generate the Huffman codes and for each, make the table entries + x[0] = i = 0; // first Huffman code is zero + p = 0; // grab values in bit order + h = - 1; // no tables yet--level -1 + w = - l; // bits decoded == (l * h) + u[0] = 0; // just to keep compilers happy + q = 0; // ditto + z = 0; // ditto + + // go through the bit lengths (k already is bits in shortest code) + for (; k <= g; k++) + { + a = c[k]; + while (a-- != 0) + { + // here i is the Huffman code of length k bits for value *p + // make tables up to required level + while (k > w + l) + { + h++; + w += l; // previous table always l bits + // compute minimum size table less than or equal to l bits + z = g - w; + z = (z > l)?l:z; // table size upper limit + if ((f = 1 << (j = k - w)) > a + 1) + { + // try a k-w bit table + // too few codes for k-w bit table + f -= (a + 1); // deduct codes from patterns left + xp = k; + if (j < z) + { + while (++j < z) + { + // try smaller tables up to z bits + if ((f <<= 1) <= c[++xp]) + break; // enough codes to use up j bits + f -= c[xp]; // else deduct codes from patterns + } + } + } + z = 1 << j; // table entries for j-bit table + + // allocate new table + if (hn[0] + z > MANY) + // (note: doesn't matter for fixed) + return Z_DATA_ERROR; // overflow of MANY + u[h] = q = hn[0]; // DEBUG + hn[0] += z; + + // connect to last table, if there is one + if (h != 0) + { + x[h] = i; // save pattern for backing up + r[0] = (byte) j; // bits in this table + r[1] = (byte) l; // bits to dump before this table + j = SupportClass.URShift(i, (w - l)); + r[2] = (int) (q - u[h - 1] - j); // offset to this table + Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table + } + else + { + t[0] = q; // first table is returned result + } + } + + // set up table entry in r + r[1] = (byte) (k - w); + if (p >= n) + { + r[0] = 128 + 64; // out of values--invalid code + } + else if (v[p] < s) + { + r[0] = (byte) (v[p] < 256?0:32 + 64); // 256 is end-of-block + r[2] = v[p++]; // simple code is just the value + } + else + { + r[0] = (byte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists + r[2] = d[v[p++] - s]; + } + + // fill code-like entries with r + f = 1 << (k - w); + for (j = SupportClass.URShift(i, w); j < z; j += f) + { + Array.Copy(r, 0, hp, (q + j) * 3, 3); + } + + // backwards increment the k-bit code i + for (j = 1 << (k - 1); (i & j) != 0; j = SupportClass.URShift(j, 1)) + { + i ^= j; + } + i ^= j; + + // backup over finished tables + mask = (1 << w) - 1; // needed on HP, cc -O bug + while ((i & mask) != x[h]) + { + h--; // don't need to update q + w -= l; + mask = (1 << w) - 1; + } + } + } + // Return Z_BUF_ERROR if we were given an incomplete table + return y != 0 && g != 1?Z_BUF_ERROR:Z_OK; + } + + internal static int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZStream z) + { + int r; + int[] hn = new int[1]; // hufts used in space + int[] v = new int[19]; // work area for huft_build + + r = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); + + if (r == Z_DATA_ERROR) + { + z.msg = "oversubscribed dynamic bit lengths tree"; + } + else if (r == Z_BUF_ERROR || bb[0] == 0) + { + z.msg = "incomplete dynamic bit lengths tree"; + r = Z_DATA_ERROR; + } + return r; + } + + internal static int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z) + { + int r; + int[] hn = new int[1]; // hufts used in space + int[] v = new int[288]; // work area for huft_build + + // build literal/length tree + r = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); + if (r != Z_OK || bl[0] == 0) + { + if (r == Z_DATA_ERROR) + { + z.msg = "oversubscribed literal/length tree"; + } + else if (r != Z_MEM_ERROR) + { + z.msg = "incomplete literal/length tree"; + r = Z_DATA_ERROR; + } + return r; + } + + // build distance tree + r = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); + + if (r != Z_OK || (bd[0] == 0 && nl > 257)) + { + if (r == Z_DATA_ERROR) + { + z.msg = "oversubscribed distance tree"; + } + else if (r == Z_BUF_ERROR) + { + z.msg = "incomplete distance tree"; + r = Z_DATA_ERROR; + } + else if (r != Z_MEM_ERROR) + { + z.msg = "empty distance tree with lengths"; + r = Z_DATA_ERROR; + } + return r; + } + + return Z_OK; + } + + internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZStream z) + { + bl[0] = fixed_bl; + bd[0] = fixed_bd; + tl[0] = fixed_tl; + td[0] = fixed_td; + return Z_OK; + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Inflate.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Inflate.cs new file mode 100644 index 00000000..af89455b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Inflate.cs @@ -0,0 +1,450 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed class Inflate + { + + private const int MAX_WBITS = 15; // 32K LZ77 window + + // preset dictionary flag in zlib header + private const int PRESET_DICT = 0x20; + + internal const int Z_NO_FLUSH = 0; + internal const int Z_PARTIAL_FLUSH = 1; + internal const int Z_SYNC_FLUSH = 2; + internal const int Z_FULL_FLUSH = 3; + internal const int Z_FINISH = 4; + + private const int Z_DEFLATED = 8; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + private const int METHOD = 0; // waiting for method byte + private const int FLAG = 1; // waiting for flag byte + private const int DICT4 = 2; // four dictionary check bytes to go + private const int DICT3 = 3; // three dictionary check bytes to go + private const int DICT2 = 4; // two dictionary check bytes to go + private const int DICT1 = 5; // one dictionary check byte to go + private const int DICT0 = 6; // waiting for inflateSetDictionary + private const int BLOCKS = 7; // decompressing blocks + private const int CHECK4 = 8; // four check bytes to go + private const int CHECK3 = 9; // three check bytes to go + private const int CHECK2 = 10; // two check bytes to go + private const int CHECK1 = 11; // one check byte to go + private const int DONE = 12; // finished check, done + private const int BAD = 13; // got an error--stay here + + internal int mode; // current inflate mode + + // mode dependent information + internal int method; // if FLAGS, method byte + + // if CHECK, check values to compare + internal long[] was = new long[1]; // computed check value + internal long need; // stream check value + + // if BAD, inflateSync's marker bytes count + internal int marker; + + // mode independent information + internal int nowrap; // flag for no wrapper + internal int wbits; // log2(window size) (8..15, defaults to 15) + + internal InfBlocks blocks; // current inflate_blocks state + + internal int inflateReset(ZStream z) + { + if (z == null || z.istate == null) + return Z_STREAM_ERROR; + + z.total_in = z.total_out = 0; + z.msg = null; + z.istate.mode = z.istate.nowrap != 0?BLOCKS:METHOD; + z.istate.blocks.reset(z, null); + return Z_OK; + } + + internal int inflateEnd(ZStream z) + { + if (blocks != null) + blocks.free(z); + blocks = null; + // ZFREE(z, z->state); + return Z_OK; + } + + internal int inflateInit(ZStream z, int w) + { + z.msg = null; + blocks = null; + + // handle undocumented nowrap option (no zlib header or check) + nowrap = 0; + if (w < 0) + { + w = - w; + nowrap = 1; + } + + // set window size + if (w < 8 || w > 15) + { + inflateEnd(z); + return Z_STREAM_ERROR; + } + wbits = w; + + z.istate.blocks = new InfBlocks(z, z.istate.nowrap != 0?null:this, 1 << w); + + // reset state + inflateReset(z); + return Z_OK; + } + + internal int inflate(ZStream z, int f) + { + int r; + int b; + + if (z == null || z.istate == null || z.next_in == null) + return Z_STREAM_ERROR; + f = f == Z_FINISH?Z_BUF_ERROR:Z_OK; + r = Z_BUF_ERROR; + while (true) + { + //System.out.println("mode: "+z.istate.mode); + switch (z.istate.mode) + { + + case METHOD: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + if (((z.istate.method = z.next_in[z.next_in_index++]) & 0xf) != Z_DEFLATED) + { + z.istate.mode = BAD; + z.msg = "unknown compression method"; + z.istate.marker = 5; // can't try inflateSync + break; + } + if ((z.istate.method >> 4) + 8 > z.istate.wbits) + { + z.istate.mode = BAD; + z.msg = "invalid window size"; + z.istate.marker = 5; // can't try inflateSync + break; + } + z.istate.mode = FLAG; + goto case FLAG; + + case FLAG: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + b = (z.next_in[z.next_in_index++]) & 0xff; + + if ((((z.istate.method << 8) + b) % 31) != 0) + { + z.istate.mode = BAD; + z.msg = "incorrect header check"; + z.istate.marker = 5; // can't try inflateSync + break; + } + + if ((b & PRESET_DICT) == 0) + { + z.istate.mode = BLOCKS; + break; + } + z.istate.mode = DICT4; + goto case DICT4; + + case DICT4: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need = ((z.next_in[z.next_in_index++] & 0xff) << 24) & unchecked((int) 0xff000000L); + z.istate.mode = DICT3; + goto case DICT3; + + case DICT3: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 16) & 0xff0000L); + z.istate.mode = DICT2; + goto case DICT2; + + case DICT2: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 8) & 0xff00L); + z.istate.mode = DICT1; + goto case DICT1; + + case DICT1: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need += (z.next_in[z.next_in_index++] & 0xffL); + z.adler = z.istate.need; + z.istate.mode = DICT0; + return Z_NEED_DICT; + + case DICT0: + z.istate.mode = BAD; + z.msg = "need dictionary"; + z.istate.marker = 0; // can try inflateSync + return Z_STREAM_ERROR; + + case BLOCKS: + + r = z.istate.blocks.proc(z, r); + if (r == Z_DATA_ERROR) + { + z.istate.mode = BAD; + z.istate.marker = 0; // can try inflateSync + break; + } + if (r == Z_OK) + { + r = f; + } + if (r != Z_STREAM_END) + { + return r; + } + r = f; + z.istate.blocks.reset(z, z.istate.was); + if (z.istate.nowrap != 0) + { + z.istate.mode = DONE; + break; + } + z.istate.mode = CHECK4; + goto case CHECK4; + + case CHECK4: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need = ((z.next_in[z.next_in_index++] & 0xff) << 24) & unchecked((int) 0xff000000L); + z.istate.mode = CHECK3; + goto case CHECK3; + + case CHECK3: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 16) & 0xff0000L); + z.istate.mode = CHECK2; + goto case CHECK2; + + case CHECK2: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 8) & 0xff00L); + z.istate.mode = CHECK1; + goto case CHECK1; + + case CHECK1: + + if (z.avail_in == 0) + return r; r = f; + + z.avail_in--; z.total_in++; + z.istate.need += (z.next_in[z.next_in_index++] & 0xffL); + + if (((int) (z.istate.was[0])) != ((int) (z.istate.need))) + { + z.istate.mode = BAD; + z.msg = "incorrect data check"; + z.istate.marker = 5; // can't try inflateSync + break; + } + + z.istate.mode = DONE; + goto case DONE; + + case DONE: + return Z_STREAM_END; + + case BAD: + return Z_DATA_ERROR; + + default: + return Z_STREAM_ERROR; + + } + } + } + + + internal int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength) + { + int index = 0; + int length = dictLength; + if (z == null || z.istate == null || z.istate.mode != DICT0) + return Z_STREAM_ERROR; + + if (z._adler.adler32(1L, dictionary, 0, dictLength) != z.adler) + { + return Z_DATA_ERROR; + } + + z.adler = z._adler.adler32(0, null, 0, 0); + + if (length >= (1 << z.istate.wbits)) + { + length = (1 << z.istate.wbits) - 1; + index = dictLength - length; + } + z.istate.blocks.set_dictionary(dictionary, index, length); + z.istate.mode = BLOCKS; + return Z_OK; + } + + private static byte[] mark = new byte[]{(byte) 0, (byte) 0, (byte) SupportClass.Identity(0xff), (byte) SupportClass.Identity(0xff)}; + + internal int inflateSync(ZStream z) + { + int n; // number of bytes to look at + int p; // pointer to bytes + int m; // number of marker bytes found in a row + long r, w; // temporaries to save total_in and total_out + + // set up + if (z == null || z.istate == null) + return Z_STREAM_ERROR; + if (z.istate.mode != BAD) + { + z.istate.mode = BAD; + z.istate.marker = 0; + } + if ((n = z.avail_in) == 0) + return Z_BUF_ERROR; + p = z.next_in_index; + m = z.istate.marker; + + // search + while (n != 0 && m < 4) + { + if (z.next_in[p] == mark[m]) + { + m++; + } + else if (z.next_in[p] != 0) + { + m = 0; + } + else + { + m = 4 - m; + } + p++; n--; + } + + // restore + z.total_in += p - z.next_in_index; + z.next_in_index = p; + z.avail_in = n; + z.istate.marker = m; + + // return no joy or set up to restart on a new block + if (m != 4) + { + return Z_DATA_ERROR; + } + r = z.total_in; w = z.total_out; + inflateReset(z); + z.total_in = r; z.total_out = w; + z.istate.mode = BLOCKS; + return Z_OK; + } + + // Returns true if inflate is currently at the end of a block generated + // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH + // but removes the length bytes of the resulting empty stored block. When + // decompressing, PPP checks that at the end of input packet, inflate is + // waiting for these length bytes. + internal int inflateSyncPoint(ZStream z) + { + if (z == null || z.istate == null || z.istate.blocks == null) + return Z_STREAM_ERROR; + return z.istate.blocks.sync_point(); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/StaticTree.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/StaticTree.cs new file mode 100644 index 00000000..b78a8d7f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/StaticTree.cs @@ -0,0 +1,93 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed class StaticTree + { + private const int MAX_BITS = 15; + + private const int BL_CODES = 19; + private const int D_CODES = 30; + private const int LITERALS = 256; + private const int LENGTH_CODES = 29; + private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); + + // Bit length codes must not exceed MAX_BL_BITS bits + internal const int MAX_BL_BITS = 7; + + internal static readonly short[] static_ltree = new short[]{12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, 236, 8, 28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, 252, 8, 2, 8, 130, 8, 66, 8, 194, 8, 34, 8, 162, 8, 98, 8, 226, 8, 18, 8, 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, 114, 8, 242, 8, 10, 8, 138, 8, 74, 8, 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8, 6, 8, 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8, 22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, 246, 8, 14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, 110, 8, 238, 8, 30, 8, 158, 8, 94, 8, 222, 8, 62, 8, 190, 8, 126, 8, 254, 8, 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, 161, 8, 97, 8, 225, 8, 17, 8, 145, 8, 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, 241, 8, 9, 8, 137, 8, 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8, 25, 8, 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8, 5, 8, 133, 8, 69, 8, 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, 117, 8, 245, 8, 13, 8, 141, 8, 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, 237, 8, 29, 8, 157, 8, 93, 8, 221, 8, 61, 8, 189, 8, 125, 8, 253, 8, 19, 9, 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, 211, 9, 467, 9, 51, 9, 307, 9, 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, 9, 43, 9, 299, 9, 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, 491, 9, 27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, 9, 219, 9, 475, 9, 59, 9, 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, 251, 9, 507, 9, 7, 9, 263, 9, 135, 9, 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9, 23, 9, 279, 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9, 55, 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, 503, 9, 15, 9, 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, 207, 9, 463, 9, 47, 9, 303, 9, 175, 9, 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, 351, 9, 223, 9, 479, 9, 63, 9, 319, 9, 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9, 0, 7, 64, 7 + , 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7, 8, 7, 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7, 4, 7, 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8, 99, 8, 227, 8}; + + internal static readonly short[] static_dtree = new short[]{0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, 5, 28, 5, 2, 5, 18, 5, 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, 30, 5, 1, 5, 17, 5, 9, 5, 25, 5, 5, 5, 21, 5, 13, 5, 29, 5, 3, 5, 19, 5, 11, 5, 27, 5, 7, 5, 23, 5}; + + internal static StaticTree static_l_desc; + + internal static StaticTree static_d_desc; + + internal static StaticTree static_bl_desc; + + internal short[] static_tree; // static tree or null + internal int[] extra_bits; // extra bits for each code or null + internal int extra_base; // base index for extra_bits + internal int elems; // max number of elements in the tree + internal int max_length; // max bit length for the codes + + internal StaticTree(short[] static_tree, int[] extra_bits, int extra_base, int elems, int max_length) + { + this.static_tree = static_tree; + this.extra_bits = extra_bits; + this.extra_base = extra_base; + this.elems = elems; + this.max_length = max_length; + } + static StaticTree() + { + static_l_desc = new StaticTree(static_ltree, Tree.extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); + static_d_desc = new StaticTree(static_dtree, Tree.extra_dbits, 0, D_CODES, MAX_BITS); + static_bl_desc = new StaticTree(null, Tree.extra_blbits, 0, BL_CODES, MAX_BL_BITS); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/SupportClass.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/SupportClass.cs new file mode 100644 index 00000000..7fac73a8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/SupportClass.cs @@ -0,0 +1,171 @@ + +using System; + + +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + public class SupportClass + { + /// + /// This method returns the literal value received + /// + /// The literal to return + /// The received value + public static long Identity(long literal) + { + return literal; + } + + /// + /// This method returns the literal value received + /// + /// The literal to return + /// The received value + public static ulong Identity(ulong literal) + { + return literal; + } + + /// + /// This method returns the literal value received + /// + /// The literal to return + /// The received value + public static float Identity(float literal) + { + return literal; + } + + /// + /// This method returns the literal value received + /// + /// The literal to return + /// The received value + public static double Identity(double literal) + { + return literal; + } + + /*******************************/ + /// + /// Performs an unsigned bitwise right shift with the specified number + /// + /// Number to operate on + /// Ammount of bits to shift + /// The resulting number from the shift operation + public static int URShift(int number, int bits) + { + if ( number >= 0) + return number >> bits; + else + return (number >> bits) + (2 << ~bits); + } + + /// + /// Performs an unsigned bitwise right shift with the specified number + /// + /// Number to operate on + /// Ammount of bits to shift + /// The resulting number from the shift operation + public static int URShift(int number, long bits) + { + return URShift(number, (int)bits); + } + + /// + /// Performs an unsigned bitwise right shift with the specified number + /// + /// Number to operate on + /// Ammount of bits to shift + /// The resulting number from the shift operation + public static long URShift(long number, int bits) + { + if ( number >= 0) + return number >> bits; + else + return (number >> bits) + (2L << ~bits); + } + + /// + /// Performs an unsigned bitwise right shift with the specified number + /// + /// Number to operate on + /// Ammount of bits to shift + /// The resulting number from the shift operation + public static long URShift(long number, long bits) + { + return URShift(number, (int)bits); + } + + /*******************************/ + /// Reads a number of characters from the current source Stream and writes the data to the target array at the specified index. + /// The source Stream to read from. + /// Contains the array of characteres read from the source Stream. + /// The starting index of the target array. + /// The maximum number of characters to read from the source Stream. + /// The number of characters read. The number will be less than or equal to count depending on the data available in the source Stream. Returns -1 if the end of the stream is reached. + public static System.Int32 ReadInput(System.IO.Stream sourceStream, byte[] target, int start, int count) + { + // Returns 0 bytes if not enough space in target + if (target.Length == 0) + return 0; + + byte[] receiver = new byte[target.Length]; + int bytesRead = sourceStream.Read(receiver, start, count); + + // Returns -1 if EOF + if (bytesRead == 0) + return -1; + + for(int i = start; i < start + bytesRead; i++) + target[i] = (byte)receiver[i]; + + return bytesRead; + } + + /// Reads a number of characters from the current source TextReader and writes the data to the target array at the specified index. + /// The source TextReader to read from + /// Contains the array of characteres read from the source TextReader. + /// The starting index of the target array. + /// The maximum number of characters to read from the source TextReader. + /// The number of characters read. The number will be less than or equal to count depending on the data available in the source TextReader. Returns -1 if the end of the stream is reached. + public static int ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count) + { + // Returns 0 bytes if not enough space in target + if (target.Length == 0) return 0; + + char[] charArray = new char[target.Length]; + int bytesRead = sourceTextReader.Read(charArray, start, count); + + // Returns -1 if EOF + if (bytesRead == 0) return -1; + + for(int index=start; index + /// Converts a string to an array of bytes + /// + /// The string to be converted + /// The new array of bytes + public static byte[] ToByteArray(System.String sourceString) + { + return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); + } + + /// + /// Converts an array of bytes to an array of chars + /// + /// The array of bytes to convert + /// The new array of chars + public static char[] ToCharArray(byte[] byteArray) + { + return System.Text.UTF8Encoding.UTF8.GetChars(byteArray); + } + + + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Tree.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Tree.cs new file mode 100644 index 00000000..aa4e3e7f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Tree.cs @@ -0,0 +1,349 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed class Tree + { + private const int MAX_BITS = 15; + private const int BL_CODES = 19; + private const int D_CODES = 30; + private const int LITERALS = 256; + private const int LENGTH_CODES = 29; + private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); + private static readonly int HEAP_SIZE = (2 * L_CODES + 1); + + // Bit length codes must not exceed MAX_BL_BITS bits + internal const int MAX_BL_BITS = 7; + + // end of block literal code + internal const int END_BLOCK = 256; + + // repeat previous bit length 3-6 times (2 bits of repeat count) + internal const int REP_3_6 = 16; + + // repeat a zero length 3-10 times (3 bits of repeat count) + internal const int REPZ_3_10 = 17; + + // repeat a zero length 11-138 times (7 bits of repeat count) + internal const int REPZ_11_138 = 18; + + // extra bits for each length code + internal static readonly int[] extra_lbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; + + // extra bits for each distance code + internal static readonly int[] extra_dbits = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + + // extra bits for each bit length code + internal static readonly int[] extra_blbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7}; + + internal static readonly byte[] bl_order = new byte[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + + // The lengths of the bit length codes are sent in order of decreasing + // probability, to avoid transmitting the lengths for unused bit + // length codes. + + internal const int Buf_size = 8 * 2; + + // see definition of array dist_code below + internal const int DIST_CODE_LEN = 512; + + internal static readonly byte[] _dist_code = new byte[]{0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29}; + + internal static readonly byte[] _length_code = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28}; + + internal static readonly int[] base_length = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0}; + + internal static readonly int[] base_dist = new int[]{0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576}; + + // Mapping from a distance to a distance code. dist is the distance - 1 and + // must not have side effects. _dist_code[256] and _dist_code[257] are never + // used. + internal static int d_code(int dist) + { + return ((dist) < 256?_dist_code[dist]:_dist_code[256 + (SupportClass.URShift((dist), 7))]); + } + + internal short[] dyn_tree; // the dynamic tree + internal int max_code; // largest code with non zero frequency + internal StaticTree stat_desc; // the corresponding static tree + + // Compute the optimal bit lengths for a tree and update the total bit length + // for the current block. + // IN assertion: the fields freq and dad are set, heap[heap_max] and + // above are the tree nodes sorted by increasing frequency. + // OUT assertions: the field len is set to the optimal bit length, the + // array bl_count contains the frequencies for each bit length. + // The length opt_len is updated; static_len is also updated if stree is + // not null. + internal void gen_bitlen(Deflate s) + { + short[] tree = dyn_tree; + short[] stree = stat_desc.static_tree; + int[] extra = stat_desc.extra_bits; + int base_Renamed = stat_desc.extra_base; + int max_length = stat_desc.max_length; + int h; // heap index + int n, m; // iterate over the tree elements + int bits; // bit length + int xbits; // extra bits + short f; // frequency + int overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= MAX_BITS; bits++) + s.bl_count[bits] = 0; + + // In a first pass, compute the optimal bit lengths (which may + // overflow in the case of the bit length tree). + tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap + + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) + { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; + if (bits > max_length) + { + bits = max_length; overflow++; + } + tree[n * 2 + 1] = (short) bits; + // We overwrite tree[n*2+1] which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + s.bl_count[bits]++; + xbits = 0; + if (n >= base_Renamed) + xbits = extra[n - base_Renamed]; + f = tree[n * 2]; + s.opt_len += f * (bits + xbits); + if (stree != null) + s.static_len += f * (stree[n * 2 + 1] + xbits); + } + if (overflow == 0) + return ; + + // This happens for example on obj2 and pic of the Calgary corpus + // Find the first bit length which could increase: + do + { + bits = max_length - 1; + while (s.bl_count[bits] == 0) + bits--; + s.bl_count[bits]--; // move one leaf down the tree + s.bl_count[bits + 1] = (short) (s.bl_count[bits + 1] + 2); // move one overflow item as its brother + s.bl_count[max_length]--; + // The brother of the overflow item also moves one step up, + // but this does not affect bl_count[max_length] + overflow -= 2; + } + while (overflow > 0); + + for (bits = max_length; bits != 0; bits--) + { + n = s.bl_count[bits]; + while (n != 0) + { + m = s.heap[--h]; + if (m > max_code) + continue; + if (tree[m * 2 + 1] != bits) + { + s.opt_len = (int) (s.opt_len + ((long) bits - (long) tree[m * 2 + 1]) * (long) tree[m * 2]); + tree[m * 2 + 1] = (short) bits; + } + n--; + } + } + } + + // Construct one Huffman tree and assigns the code bit strings and lengths. + // Update the total bit length for the current block. + // IN assertion: the field freq is set for all tree elements. + // OUT assertions: the fields len and code are set to the optimal bit length + // and corresponding code. The length opt_len is updated; static_len is + // also updated if stree is not null. The field max_code is set. + internal void build_tree(Deflate s) + { + short[] tree = dyn_tree; + short[] stree = stat_desc.static_tree; + int elems = stat_desc.elems; + int n, m; // iterate over heap elements + int max_code = - 1; // largest code with non zero frequency + int node; // new node being created + + // Construct the initial heap, with least frequent element in + // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + // heap[0] is not used. + s.heap_len = 0; + s.heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) + { + if (tree[n * 2] != 0) + { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + } + else + { + tree[n * 2 + 1] = 0; + } + } + + // The pkzip format requires that at least one distance code exists, + // and that at least one bit should be sent even if there is only one + // possible code. So to avoid special checks later on we force at least + // two codes of non zero frequency. + while (s.heap_len < 2) + { + node = s.heap[++s.heap_len] = (max_code < 2?++max_code:0); + tree[node * 2] = 1; + s.depth[node] = 0; + s.opt_len--; + if (stree != null) + s.static_len -= stree[node * 2 + 1]; + // node is 0 or 1 so it does not have extra bits + } + this.max_code = max_code; + + // The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + // establish sub-heaps of increasing lengths: + + for (n = s.heap_len / 2; n >= 1; n--) + s.pqdownheap(tree, n); + + // Construct the Huffman tree by repeatedly combining the least two + // frequent nodes. + + node = elems; // next internal node of the tree + do + { + // n = node of least frequency + n = s.heap[1]; + s.heap[1] = s.heap[s.heap_len--]; + s.pqdownheap(tree, 1); + m = s.heap[1]; // m = node of next least frequency + + s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency + s.heap[--s.heap_max] = m; + + // Create a new node father of n and m + tree[node * 2] = (short) (tree[n * 2] + tree[m * 2]); + s.depth[node] = (byte) (System.Math.Max((byte) s.depth[n], (byte) s.depth[m]) + 1); + tree[n * 2 + 1] = tree[m * 2 + 1] = (short) node; + + // and insert the new node in the heap + s.heap[1] = node++; + s.pqdownheap(tree, 1); + } + while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1]; + + // At this point, the fields freq and dad are set. We can now + // generate the bit lengths. + + gen_bitlen(s); + + // The field len is now set, we can generate the bit codes + gen_codes(tree, max_code, s.bl_count); + } + + // Generate the codes for a given tree and bit counts (which need not be + // optimal). + // IN assertion: the array bl_count contains the bit length statistics for + // the given tree and the field len is set for all tree elements. + // OUT assertion: the field code is set for all tree elements of non + // zero code length. + internal static void gen_codes(short[] tree, int max_code, short[] bl_count) + { + short[] next_code = new short[MAX_BITS + 1]; // next code value for each bit length + short code = 0; // running code value + int bits; // bit index + int n; // code index + + // The distribution counts are first used to generate the code values + // without bit reversal. + for (bits = 1; bits <= MAX_BITS; bits++) + { + next_code[bits] = code = (short) ((code + bl_count[bits - 1]) << 1); + } + + // Check that the bit counts in bl_count are consistent. The last code + // must be all ones. + //Assert (code + bl_count[MAX_BITS]-1 == (1< 0); + return SupportClass.URShift(res, 1); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZInputStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZInputStream.cs new file mode 100644 index 00000000..0c401b9f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZInputStream.cs @@ -0,0 +1,181 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2001 Lapo Luchini. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS +OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + public class ZInputStream : System.IO.BinaryReader + { + internal void InitBlock() + { + flush = zlibConst.Z_NO_FLUSH; + buf = new byte[bufsize]; + } + virtual public int FlushMode + { + get + { + return (flush); + } + + set + { + this.flush = value; + } + + } + /// Returns the total number of bytes input so far. + virtual public long TotalIn + { + get + { + return z.total_in; + } + + } + /// Returns the total number of bytes output so far. + virtual public long TotalOut + { + get + { + return z.total_out; + } + + } + + protected ZStream z = new ZStream(); + protected int bufsize = 512; + protected int flush; + protected byte[] buf, buf1 = new byte[1]; + protected bool compress; + + internal System.IO.Stream in_Renamed = null; + + public ZInputStream(System.IO.Stream in_Renamed):base(in_Renamed) + { + InitBlock(); + this.in_Renamed = in_Renamed; + z.inflateInit(); + compress = false; + z.next_in = buf; + z.next_in_index = 0; + z.avail_in = 0; + } + + public ZInputStream(System.IO.Stream in_Renamed, int level):base(in_Renamed) + { + InitBlock(); + this.in_Renamed = in_Renamed; + z.deflateInit(level); + compress = true; + z.next_in = buf; + z.next_in_index = 0; + z.avail_in = 0; + } + + /*public int available() throws IOException { + return inf.finished() ? 0 : 1; + }*/ + + public override int Read() + { + if (read(buf1, 0, 1) == - 1) + return (- 1); + return (buf1[0] & 0xFF); + } + + internal bool nomoreinput = false; + + public int read(byte[] b, int off, int len) + { + if (len == 0) + return (0); + int err; + z.next_out = b; + z.next_out_index = off; + z.avail_out = len; + do + { + if ((z.avail_in == 0) && (!nomoreinput)) + { + // if buffer is empty and more input is avaiable, refill it + z.next_in_index = 0; + z.avail_in = SupportClass.ReadInput(in_Renamed, buf, 0, bufsize); //(bufsize Returns the total number of bytes input so far. + virtual public long TotalIn + { + get + { + return z.total_in; + } + + } + /// Returns the total number of bytes output so far. + virtual public long TotalOut + { + get + { + return z.total_out; + } + + } + + protected internal ZStream z = new ZStream(); + protected internal int bufsize = 4096; + protected internal int flush_Renamed_Field; + protected internal byte[] buf, buf1 = new byte[1]; + protected internal bool compress; + + private System.IO.Stream out_Renamed; + + public ZOutputStream(System.IO.Stream out_Renamed):base() + { + InitBlock(); + this.out_Renamed = out_Renamed; + z.inflateInit(); + compress = false; + } + + public ZOutputStream(System.IO.Stream out_Renamed, int level):base() + { + InitBlock(); + this.out_Renamed = out_Renamed; + z.deflateInit(level); + compress = true; + } + + public void WriteByte(int b) + { + buf1[0] = (byte) b; + Write(buf1, 0, 1); + } + //UPGRADE_TODO: The differences in the Expected value of parameters for method 'WriteByte' may cause compilation errors. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1092_3"' + public override void WriteByte(byte b) + { + WriteByte((int) b); + } + + public override void Write(System.Byte[] b1, int off, int len) + { + if (len == 0) + return ; + int err; + byte[] b = new byte[b1.Length]; + System.Array.Copy(b1, 0, b, 0, b1.Length); + z.next_in = b; + z.next_in_index = off; + z.avail_in = len; + do + { + z.next_out = buf; + z.next_out_index = 0; + z.avail_out = bufsize; + if (compress) + err = z.deflate(flush_Renamed_Field); + else + err = z.inflate(flush_Renamed_Field); + if (err != zlibConst.Z_OK && err != zlibConst.Z_STREAM_END) + throw new ZStreamException((compress?"de":"in") + "flating: " + z.msg); + out_Renamed.Write(buf, 0, bufsize - z.avail_out); + } + while (z.avail_in > 0 || z.avail_out == 0); + } + + public virtual void finish() + { + int err; + do + { + z.next_out = buf; + z.next_out_index = 0; + z.avail_out = bufsize; + if (compress) + { + err = z.deflate(zlibConst.Z_FINISH); + } + else + { + err = z.inflate(zlibConst.Z_FINISH); + } + if (err != zlibConst.Z_STREAM_END && err != zlibConst.Z_OK) + throw new ZStreamException((compress?"de":"in") + "flating: " + z.msg); + if (bufsize - z.avail_out > 0) + { + out_Renamed.Write(buf, 0, bufsize - z.avail_out); + } + } + while (z.avail_in > 0 || z.avail_out == 0); + try + { + Flush(); + } + catch + { + } + } + public virtual void end() + { + if (compress) + { + z.deflateEnd(); + } + else + { + z.inflateEnd(); + } + z.free(); + z = null; + } + public override void Close() + { + try + { + try + { + finish(); + } + catch + { + } + } + finally + { + end(); + out_Renamed.Close(); + out_Renamed = null; + } + } + + public override void Flush() + { + out_Renamed.Flush(); + } + //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count) + { + return 0; + } + //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override void SetLength(System.Int64 value) + { + } + //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin) + { + return 0; + } + //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Boolean CanRead + { + get + { + return false; + } + + } + //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Boolean CanSeek + { + get + { + return false; + } + + } + //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Boolean CanWrite + { + get + { + return false; + } + + } + //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Int64 Length + { + get + { + return 0; + } + + } + //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' + public override System.Int64 Position + { + get + { + return 0; + } + + set + { + } + + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStream.cs new file mode 100644 index 00000000..a65bceb2 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStream.cs @@ -0,0 +1,233 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed public class ZStream + { + + private const int MAX_WBITS = 15; // 32K LZ77 window + private static readonly int DEF_WBITS = MAX_WBITS; + + private const int Z_NO_FLUSH = 0; + private const int Z_PARTIAL_FLUSH = 1; + private const int Z_SYNC_FLUSH = 2; + private const int Z_FULL_FLUSH = 3; + private const int Z_FINISH = 4; + + private const int MAX_MEM_LEVEL = 9; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + public byte[] next_in; // next input byte + public int next_in_index; + public int avail_in; // number of bytes available at next_in + public long total_in; // total nb of input bytes read so far + + public byte[] next_out; // next output byte should be put there + public int next_out_index; + public int avail_out; // remaining free space at next_out + public long total_out; // total nb of bytes output so far + + public System.String msg; + + internal Deflate dstate; + internal Inflate istate; + + internal int data_type; // best guess about the data type: ascii or binary + + public long adler; + internal Adler32 _adler = new Adler32(); + + public int inflateInit() + { + return inflateInit(DEF_WBITS); + } + public int inflateInit(int w) + { + istate = new Inflate(); + return istate.inflateInit(this, w); + } + + public int inflate(int f) + { + if (istate == null) + return Z_STREAM_ERROR; + return istate.inflate(this, f); + } + public int inflateEnd() + { + if (istate == null) + return Z_STREAM_ERROR; + int ret = istate.inflateEnd(this); + istate = null; + return ret; + } + public int inflateSync() + { + if (istate == null) + return Z_STREAM_ERROR; + return istate.inflateSync(this); + } + public int inflateSetDictionary(byte[] dictionary, int dictLength) + { + if (istate == null) + return Z_STREAM_ERROR; + return istate.inflateSetDictionary(this, dictionary, dictLength); + } + + public int deflateInit(int level) + { + return deflateInit(level, MAX_WBITS); + } + public int deflateInit(int level, int bits) + { + dstate = new Deflate(); + return dstate.deflateInit(this, level, bits); + } + public int deflate(int flush) + { + if (dstate == null) + { + return Z_STREAM_ERROR; + } + return dstate.deflate(this, flush); + } + public int deflateEnd() + { + if (dstate == null) + return Z_STREAM_ERROR; + int ret = dstate.deflateEnd(); + dstate = null; + return ret; + } + public int deflateParams(int level, int strategy) + { + if (dstate == null) + return Z_STREAM_ERROR; + return dstate.deflateParams(this, level, strategy); + } + public int deflateSetDictionary(byte[] dictionary, int dictLength) + { + if (dstate == null) + return Z_STREAM_ERROR; + return dstate.deflateSetDictionary(this, dictionary, dictLength); + } + + // Flush as much pending output as possible. All deflate() output goes + // through this function so some applications may wish to modify it + // to avoid allocating a large strm->next_out buffer and copying into it. + // (See also read_buf()). + internal void flush_pending() + { + int len = dstate.pending; + + if (len > avail_out) + len = avail_out; + if (len == 0) + return ; + + if (dstate.pending_buf.Length <= dstate.pending_out || next_out.Length <= next_out_index || dstate.pending_buf.Length < (dstate.pending_out + len) || next_out.Length < (next_out_index + len)) + { + //System.Console.Out.WriteLine(dstate.pending_buf.Length + ", " + dstate.pending_out + ", " + next_out.Length + ", " + next_out_index + ", " + len); + //System.Console.Out.WriteLine("avail_out=" + avail_out); + } + + Array.Copy(dstate.pending_buf, dstate.pending_out, next_out, next_out_index, len); + + next_out_index += len; + dstate.pending_out += len; + total_out += len; + avail_out -= len; + dstate.pending -= len; + if (dstate.pending == 0) + { + dstate.pending_out = 0; + } + } + + // Read a new buffer from the current input stream, update the adler32 + // and total number of bytes read. All deflate() input goes through + // this function so some applications may wish to modify it to avoid + // allocating a large strm->next_in buffer and copying from it. + // (See also flush_pending()). + internal int read_buf(byte[] buf, int start, int size) + { + int len = avail_in; + + if (len > size) + len = size; + if (len == 0) + return 0; + + avail_in -= len; + + if (dstate.noheader == 0) + { + adler = _adler.adler32(adler, next_in, next_in_index, len); + } + Array.Copy(next_in, next_in_index, buf, start, len); + next_in_index += len; + total_in += len; + return len; + } + + public void free() + { + next_in = null; + next_out = null; + msg = null; + _adler = null; + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStreamException.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStreamException.cs new file mode 100644 index 00000000..6d97d8af --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/ZStreamException.cs @@ -0,0 +1,58 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + + public class ZStreamException:System.IO.IOException + { + public ZStreamException():base() + { + } + public ZStreamException(System.String s):base(s) + { + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Zlib.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Zlib.cs new file mode 100644 index 00000000..8509ddcd --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/Internal/Zlib.cs @@ -0,0 +1,83 @@ +// Copyright (c) 2006, ComponentAce +// http://www.componentace.com +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +// Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +// Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +// Neither the name of ComponentAce nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +3. The names of the authors may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* +* This program is based on zlib-1.1.3, so all credit should go authors +* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +* and contributors of zlib. +*/ +using System; +namespace UniversalEditor.Compression.Modules.Zlib.Internal +{ + + sealed public class zlibConst + { + private const System.String version_Renamed_Field = "1.0.2"; + public static System.String version() + { + return version_Renamed_Field; + } + + // compression levels + public const int Z_NO_COMPRESSION = 0; + public const int Z_BEST_SPEED = 1; + public const int Z_BEST_COMPRESSION = 9; + public const int Z_DEFAULT_COMPRESSION = (- 1); + + // compression strategy + public const int Z_FILTERED = 1; + public const int Z_HUFFMAN_ONLY = 2; + public const int Z_DEFAULT_STRATEGY = 0; + + public const int Z_NO_FLUSH = 0; + public const int Z_PARTIAL_FLUSH = 1; + public const int Z_SYNC_FLUSH = 2; + public const int Z_FULL_FLUSH = 3; + public const int Z_FINISH = 4; + + public const int Z_OK = 0; + public const int Z_STREAM_END = 1; + public const int Z_NEED_DICT = 2; + public const int Z_ERRNO = - 1; + public const int Z_STREAM_ERROR = - 2; + public const int Z_DATA_ERROR = - 3; + public const int Z_MEM_ERROR = - 4; + public const int Z_BUF_ERROR = - 5; + public const int Z_VERSION_ERROR = - 6; + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/ZlibCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/ZlibCompressionModule.cs new file mode 100644 index 00000000..a108cc64 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Modules/Zlib/ZlibCompressionModule.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression.Modules.Zlib +{ + public class ZlibCompressionModule : CompressionModule + { + public override string Name + { + get { return "zlib"; } + } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + Internal.ZOutputStream zout = new Internal.ZOutputStream(outputStream, 5); + + byte[] buffer = new byte[2048]; + while (!inputStream.get_EndOfStream()) + { + inputStream.Read(buffer, 0, buffer.Length); + zout.Write(buffer, 0, buffer.Length); + } + zout.Flush(); + zout.Close(); + } + + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + int data = 0; + int stopByte = -1; + Internal.ZInputStream inZStream = new Internal.ZInputStream(inputStream); + while (stopByte != (data = inZStream.Read())) + { + byte _dataByte = (byte)data; + outputStream.WriteByte(_dataByte); + } + inZStream.Close(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/OutOfInputException.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/OutOfInputException.cs new file mode 100644 index 00000000..32bda2e3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/OutOfInputException.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression +{ + public class OutOfInputException : CompressionFailureException + { + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/PPmD/PPmDStream.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/PPmD/PPmDStream.cs new file mode 100644 index 00000000..a5ffdce9 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/PPmD/PPmDStream.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace UniversalEditor.Compression.PPPmD +{ + public class PPPmDStream : Stream + { + public override long Position + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + public override long Length + { + get + { + throw new NotImplementedException(); + } + } + public override bool CanWrite + { + get + { + throw new NotImplementedException(); + } + } + public override bool CanSeek + { + get + { + throw new NotImplementedException(); + } + } + public override bool CanRead + { + get + { + throw new NotImplementedException(); + } + } + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + public override int Read(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + public override void Flush() + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/Properties/AssemblyInfo.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..5420b1e9 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Compression routines for Universal Editor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2011-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("Licensed under the GNU General Public License, version 3.")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("10fa3cbe-6af8-4080-af29-a54e773a6b24")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/RLEW/RLEWCompressionModule.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/RLEW/RLEWCompressionModule.cs new file mode 100644 index 00000000..693409c1 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/RLEW/RLEWCompressionModule.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; + +namespace UniversalEditor.Compression.RLEW +{ + public class RLEWCompressionModule : CompressionModule + { + public override string Name + { + get { return "RLEW"; } + } + + private short mvarRLEWTag = 0; + public short RLEWTag { get { return mvarRLEWTag; } set { mvarRLEWTag = value; } } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + IO.Reader br = new IO.Reader(new StreamAccessor(inputStream)); + IO.Writer bw = new IO.Writer(new StreamAccessor(outputStream)); + + short lastWord = 0; + short wordCount = 0; + bool hasLastWord = false; + + while (!br.EndOfStream) + { + // to make this work efficiently, we need to have at least four equal words + // (RLEWtag + count + value = 3 words) + + // read the next value in + short word = 0; + if (br.Remaining == 0) + { + break; + } + else if (br.Remaining == 1) + { + word = br.ReadByte(); + } + else if (br.Remaining >= 2) + { + word = br.ReadInt16(); + } + + if (!hasLastWord) + { + lastWord = word; + hasLastWord = true; + wordCount++; + continue; + } + + if (word == lastWord) + { + // it's equal to the last word, so increment our word count + wordCount++; + + if (wordCount == 4) + { + // we have at least four equal words, so push out an RLEWtag... + bw.WriteInt16(mvarRLEWTag); + } + } + else + { + // word is not equal, flush the remaining words... + if (wordCount <= 3) + { + // we do not have at least four equal words, it would be more efficient to + // just store the values as-is, so flush the remaining words + for (ushort i = 0; i < wordCount; i++) + { + bw.WriteInt16(word); + } + + bw.WriteInt16(lastWord); + + lastWord = 0; + wordCount = 0; + } + else + { + bw.WriteInt16(wordCount); + bw.WriteInt16(lastWord); + } + + // ... and clear the word count + lastWord = 0; + wordCount = 0; + + // finally, set the last word to the current word + lastWord = word; + } + } + + + // word is not equal, flush the remaining words... + if (wordCount <= 3) + { + // we do not have at least four equal words, it would be more efficient to + // just store the values as-is, so flush the remaining words + for (ushort i = 0; i < wordCount; i++) + { + bw.WriteInt16(lastWord); + } + + lastWord = 0; + wordCount = 0; + } + else + { + bw.WriteInt16(wordCount); + bw.WriteInt16(lastWord); + } + + bw.Flush(); + } + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + IO.Reader br = new IO.Reader(new StreamAccessor(inputStream)); + IO.Writer bw = new IO.Writer(new StreamAccessor(outputStream)); + + while (!br.EndOfStream) + { + // read one word from compressed block + short word = br.ReadInt16(); + if (word == mvarRLEWTag) + { + // next two words are a compressed run of data, first word is number + // of words to write + short count = br.ReadInt16(); + short value = br.ReadInt16(); + for (short i = 0; i < count; i++) + { + bw.WriteInt16(value); + } + } + else + { + // if word is not equal to RLEWtag, then simply write that word out + bw.WriteInt16(word); + } + } + + bw.Flush(); + bw.Close(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/UniversalEditor.Compression.csproj b/CSharp/V5/Libraries/UniversalEditor.Compression/UniversalEditor.Compression.csproj new file mode 100644 index 00000000..45b1b4c4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/UniversalEditor.Compression.csproj @@ -0,0 +1,140 @@ + + + + + Debug + AnyCPU + {3F664673-7E22-4486-9AD0-FC81861D0B78} + Library + Properties + UniversalEditor.Compression + UniversalEditor.Compression + v4.0 + 512 + 10.0.0 + 2.0 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + + + \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Compression/UnsupportedWindowSizeRangeException.cs b/CSharp/V5/Libraries/UniversalEditor.Compression/UnsupportedWindowSizeRangeException.cs new file mode 100644 index 00000000..1a312da1 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Compression/UnsupportedWindowSizeRangeException.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Compression +{ + public class UnsupportedWindowSizeRangeException : Exception + { + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Accessor.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Accessor.cs new file mode 100644 index 00000000..f606a3fe --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Accessor.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using UniversalEditor.IO; +using System.Diagnostics; + +namespace UniversalEditor +{ + /// + /// Provides the ability to access a -agnostic stream. s for + /// import and export may be used to allow the interactive user to specify -specific + /// parameters. + /// + [DebuggerNonUserCode()] + public abstract class Accessor : References + { + /// + /// Creates or returns an existing object referring to this object. + /// + /// A object that can be used to create additional instances of this object. + public AccessorReference MakeReference() + { + AccessorReference ar = MakeReferenceInternal(); + return ar; + } + protected virtual AccessorReference MakeReferenceInternal() + { + return new AccessorReference(this.GetType()); + } + + /// + /// Creates a new instance of this and initializes the associated + /// and . + /// + public Accessor() + { + mvarReader = new Reader(this); + mvarWriter = new Writer(this); + } + + /// + /// Gets or sets the length of the data being accessed, if possible. + /// + public abstract long Length { get; set; } + + /// + /// Gets the position within the underlying stream, if possible. + /// + /// The position within the underlying stream + protected abstract long GetPosition(); + /// + /// Gets or sets the position within the underlying stream, if possible. + /// + public virtual long Position { get { return GetPosition(); } set { Seek(value, SeekOrigin.Begin); } } + + /// + /// Determines how many bytes are remaining to be read from the underlying stream, if possible. + /// + public long Remaining + { + get + { + long r = Length - Position; + if (r <= 0) return 0; + return r; + } + } + + /// + /// Sets the position within the underlying stream based on the given relative position and origin. + /// + /// The location within the underlying stream relative to the given . + /// The reference point from where to seek. + public void Seek(int offset, SeekOrigin origin) + { + Seek((long)offset, origin); + } + /// + /// Sets the position within the underlying stream based on the given relative position and origin. + /// + /// The location within the underlying stream relative to the given . + /// The reference point from where to seek. + public abstract void Seek(long offset, SeekOrigin origin); + + /// + /// Reads the specified amount of bytes from the underlying stream into the specified buffer starting at the + /// specified offset. + /// + /// The buffer into which to read data. + /// The position in the buffer from which to start copying data. + /// The number of bytes to read from the underlying stream. + /// + /// The number of bytes actually read from the underlying stream. This may differ from the requested amount + /// due to encountering the end of stream or a network connection error. + /// + protected internal abstract int ReadInternal(byte[] buffer, int start, int count); + /// + /// Writes the specified amount of bytes to the underlying stream from the specified buffer starting at the + /// specified offset. + /// + /// The buffer from which to write data. + /// The position in the buffer from which to start copying data. + /// The number of bytes to write to the underlying stream. + /// + /// The number of bytes actually written to the underlying stream. This may differ from the requested amount + /// due to lack of disk space or a network connection error. + /// + protected internal abstract int WriteInternal(byte[] buffer, int start, int count); + + internal virtual void FlushInternal() + { + } + + private bool mvarIsOpen = false; + /// + /// Determines whether this is currently open. + /// + public bool IsOpen { get { return mvarIsOpen; } protected set { mvarIsOpen = value; } } + + /// + /// Opens this . + /// + public void Open() + { + if (mvarIsOpen) return; + + OpenInternal(); + mvarIsOpen = true; + } + /// + /// Closes this , making the underlying stream available to be re-opened by another + /// . + /// + public void Close() + { + if (!mvarIsOpen) return; + + CloseInternal(); + mvarIsOpen = false; + } + + /// + /// The internal implementation of the command. + /// + protected abstract void OpenInternal(); + /// + /// The internal implementation of the command. + /// + protected abstract void CloseInternal(); + + private Encoding mvarDefaultEncoding = Encoding.Default; + /// + /// The default to use when reading and writing strings. + /// + public Encoding DefaultEncoding { get { return mvarDefaultEncoding; } set { mvarDefaultEncoding = value; } } + + private Reader mvarReader = null; + /// + /// A which reads from the underlying stream of this . + /// + public Reader Reader { get { return mvarReader; } } + private Writer mvarWriter = null; + /// + /// A which writes to the underlying stream of this . + /// + public Writer Writer { get { return mvarWriter; } } + + /// + /// The title of this . + /// + public virtual string Title + { + get { return String.Empty; } + } + /// + /// Gets the file name without path information for this , if applicable. + /// + /// A containing the file name without path information for this , if applicable. + public virtual string GetFileTitle() + { + return String.Empty; + } + /// + /// Gets the file name including path information for this , if applicable. + /// + /// A containing the file name including path information for this , if applicable. + public virtual string GetFileName() + { + return String.Empty; + } + + #region Position Saving and Loading + private Stack _positions = new Stack(); + [DebuggerNonUserCode()] + public void SavePosition() + { + _positions.Push(this.Position); + } + [DebuggerNonUserCode()] + public void LoadPosition() + { + if (_positions.Count > 0) this.Position = _positions.Pop(); + } + public void ClearLastPosition() + { + if (_positions.Count > 0) _positions.Pop(); + } + public void ClearAllPositions() + { + if (_positions.Count > 0) _positions.Clear(); + } + #endregion + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/AccessorReference.cs b/CSharp/V5/Libraries/UniversalEditor.Core/AccessorReference.cs new file mode 100644 index 00000000..21003195 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/AccessorReference.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class AccessorReference : ReferencedBy + { + public AccessorReference(Type type) + { + if (!type.IsSubclassOf(typeof(Accessor))) + { + throw new InvalidCastException("Cannot create an accessor reference to a non-Accessor type"); + } + else if (type.IsAbstract) + { + throw new InvalidOperationException("Cannot create an accessor reference to an abstract type"); + } + + mvarAccessorType = type; + mvarAccessorTypeName = mvarAccessorType.FullName; + } + + private Type mvarAccessorType = null; + public Type AccessorType { get { return mvarAccessorType; } set { mvarAccessorType = value; } } + + private string mvarAccessorTypeName = null; + public string AccessorTypeName { get { return mvarAccessorTypeName; } set { mvarAccessorTypeName = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + /// + /// Gets the detail fields that are shown in lists of this object in details view. + /// + /// An array of s that are shown in detail columns of lists of this object. + public string[] GetDetails() + { + return new string[] { mvarTitle }; + } + + private bool mvarVisible = true; + /// + /// Determines whether the is visible in a selection list. Setting this + /// property to false can be useful for accessors that are intended for use in code, but should + /// not be exposed to UniversalEditor user interface components, such as the document properties + /// dialog. + /// + public bool Visible { get { return mvarVisible; } set { mvarVisible = value; } } + + private CustomOption.CustomOptionCollection mvarExportOptions = new CustomOption.CustomOptionCollection(); + /// + /// A collection of s that are applied to the + /// when it is being used to save or export a file. + /// + public CustomOption.CustomOptionCollection ExportOptions { get { return mvarExportOptions; } } + + private CustomOption.CustomOptionCollection mvarImportOptions = new CustomOption.CustomOptionCollection(); + /// + /// A collection of s that are applied to the + /// when it is being used to open or import a file. + /// + public CustomOption.CustomOptionCollection ImportOptions { get { return mvarImportOptions; } } + + /// + /// Creates an instance of an from the described in this . + /// + /// An instance from the described in this . + public Accessor Create() + { + if (mvarAccessorType == null && mvarAccessorTypeName != null) + { + mvarAccessorType = Type.GetType(mvarAccessorTypeName); + } + if (mvarAccessorType != null) + { + return (mvarAccessorType.Assembly.CreateInstance(mvarAccessorType.FullName) as Accessor); + } + return null; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/FileAccessor.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/FileAccessor.cs new file mode 100644 index 00000000..ef29811b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/FileAccessor.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.IO; + +namespace UniversalEditor.Accessors +{ + public class FileAccessor : Accessor + { + private static AccessorReference _ar = null; + protected override AccessorReference MakeReferenceInternal() + { + if (_ar == null) + { + _ar = base.MakeReferenceInternal(); + _ar.Title = "Local file"; + + _ar.ImportOptions.Add(new CustomOptionFile("FileName", "&File name:")); + _ar.ImportOptions.Add(new CustomOptionBoolean("ForceOverwrite", "Force &overwrite if file exists", false, false, false)); + _ar.ImportOptions.Add(new CustomOptionBoolean("AllowWrite", "Open file for &writing", false, false, false)); + + CustomOptionFile cofExportFileName = new CustomOptionFile("FileName", "&File name:"); + cofExportFileName.DialogMode = CustomOptionFileDialogMode.Save; + _ar.ExportOptions.Add(cofExportFileName); + + _ar.ExportOptions.Add(new CustomOptionBoolean("ForceOverwrite", "Force &overwrite if file exists", true, true)); + _ar.ExportOptions.Add(new CustomOptionBoolean("AllowWrite", "Open file for &writing", true, false, false)); + } + return _ar; + } + + public override string GetFileTitle() + { + return System.IO.Path.GetFileName(mvarFileName); + } + public override string GetFileName() + { + return mvarFileName; + } + protected override long GetPosition() + { + return mvarFileStream.Position; + } + public override long Length + { + get { return mvarFileStream.Length; } + set { mvarFileStream.SetLength(value); } + } + + public override void Seek(long length, SeekOrigin origin) + { + mvarFileStream.Seek(length, (System.IO.SeekOrigin)origin); + } + + protected internal override int ReadInternal(byte[] buffer, int offset, int count) + { + int length = mvarFileStream.Read(buffer, offset, count); + return length; + } + + protected internal override int WriteInternal(byte[] buffer, int offset, int count) + { + mvarFileStream.Write(buffer, offset, count); + return count; + } + + internal override void FlushInternal() + { + mvarFileStream.Flush(); + } + + private System.IO.FileStream mvarFileStream = null; + + private bool mvarAllowWrite = false; + public bool AllowWrite { get { return mvarAllowWrite; } set { mvarAllowWrite = value; } } + + private bool mvarForceOverwrite = false; + public bool ForceOverwrite { get { return mvarForceOverwrite; } set { mvarForceOverwrite = value; } } + + private string mvarFileName = String.Empty; + public string FileName { get { return mvarFileName; } set { mvarFileName = value; } } + + public FileAccessor() + { + } + public FileAccessor(string FileName, bool AllowWrite = false, bool ForceOverwrite = false, bool AutoOpen = false) + { + mvarFileName = FileName; + mvarAllowWrite = AllowWrite; + mvarForceOverwrite = ForceOverwrite; + + if (AutoOpen) + { + Open(); + } + } + + public void Open(string FileName) + { + mvarFileName = FileName; + OpenInternal(); + } + protected override void OpenInternal() + { + System.IO.FileShare share = System.IO.FileShare.Read; + System.IO.FileMode mode = System.IO.FileMode.OpenOrCreate; + System.IO.FileAccess access = System.IO.FileAccess.Read; + if (mvarAllowWrite) + { + access = System.IO.FileAccess.ReadWrite; + if (mvarForceOverwrite) + { + mode = System.IO.FileMode.Create; + } + } + mvarFileStream = System.IO.File.Open(mvarFileName, mode, access, share); + } + + protected override void CloseInternal() + { + mvarFileStream.Close(); + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + // sb.Append("file:///"); + sb.Append(mvarFileName); + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/MemoryAccessor.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/MemoryAccessor.cs new file mode 100644 index 00000000..85860d95 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/MemoryAccessor.cs @@ -0,0 +1,127 @@ +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.Accessors +{ + public class MemoryAccessor : Accessor + { + private static AccessorReference _ar = null; + protected override AccessorReference MakeReferenceInternal() + { + if (_ar == null) + { + _ar = base.MakeReferenceInternal(); + _ar.Visible = false; + } + return _ar; + } + + private byte[] _data = new byte[0]; + + private long ptr = 0; + protected override long GetPosition() + { + return ptr; + } + public override long Length + { + get { return _data.Length; } + set + { + // resize the array - coded by hand to compile happily under Cosmos devkit + ResizeArray(ref _data, value); + } + } + + private void ResizeArray(ref byte[] _data, long value) + { + byte[] newdata = new byte[value]; + System.Array.Copy(_data, 0, newdata, 0, System.Math.Min(_data.Length, newdata.Length)); + _data = newdata; + } + + private string mvarFileName = null; + + public MemoryAccessor() + { + } + public MemoryAccessor(byte[] data, string filename = null) + { + _data = data; + mvarFileName = filename; + } + + // [DebuggerNonUserCode()] + public override void Seek(long length, SeekOrigin position) + { + long start = 0; + switch (position) + { + case SeekOrigin.Begin: + { + start = length; + break; + } + case SeekOrigin.Current: + { + start = ptr + length; + break; + } + case SeekOrigin.End: + { + start = _data.LongLength - length; + break; + } + } + if (start >= 0 && start <= _data.Length) + { + ptr = start; + } + else + { + throw new EndOfStreamException(); + } + } + + public byte[] ToArray() + { + byte[] data = new byte[_data.Length]; + System.Array.Copy(_data, 0, data, 0, data.Length); + return data; + } + + protected internal override int ReadInternal(byte[] buffer, int start, int count) + { + System.Array.Copy(_data, Position, buffer, start, count); + Position += count; + return count; + } + protected internal override int WriteInternal(byte[] buffer, int start, int count) + { + ResizeArray(ref _data, _data.Length + count); + System.Array.Copy(buffer, start, _data, _data.Length - count, count); + return count; + } + + protected override void OpenInternal() + { + } + protected override void CloseInternal() + { + } + + public override string GetFileName() + { + if (mvarFileName != null) return mvarFileName; + return base.GetFileName(); + } + public override string GetFileTitle() + { + if (mvarFileName != null) return System.IO.Path.GetFileName(mvarFileName); + return base.GetFileTitle(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StreamAccessor.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StreamAccessor.cs new file mode 100644 index 00000000..2b1925a9 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StreamAccessor.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.Accessors +{ + public class StreamAccessor : Accessor + { + private static AccessorReference _ar = null; + protected override AccessorReference MakeReferenceInternal() + { + if (_ar == null) + { + _ar = base.MakeReferenceInternal(); + _ar.Visible = false; + } + return _ar; + } + + private System.IO.Stream mvarBaseStream = null; + public System.IO.Stream BaseStream { get { return mvarBaseStream; } } + + protected override long GetPosition() + { + return mvarBaseStream.Position; + } + public StreamAccessor() + { + mvarBaseStream = new System.IO.MemoryStream(); + } + public StreamAccessor(System.IO.Stream outputStream) + { + mvarBaseStream = outputStream; + } + + public override long Length + { + get { return mvarBaseStream.Length; } + set { mvarBaseStream.SetLength(value); } + } + + // [DebuggerNonUserCode()] + public override void Seek(long offset, SeekOrigin position) + { + System.IO.SeekOrigin origin = System.IO.SeekOrigin.Begin; + switch (position) + { + case SeekOrigin.Begin: + { + origin = System.IO.SeekOrigin.Begin; + break; + } + case SeekOrigin.Current: + { + origin = System.IO.SeekOrigin.Current; + break; + } + case SeekOrigin.End: + { + origin = System.IO.SeekOrigin.End; + break; + } + } + mvarBaseStream.Seek(offset, origin); + } + + protected internal override int ReadInternal(byte[] buffer, int start, int count) + { + // TODO: will ct ever be != count? should we add ct to Position instead of count?? + int ct = mvarBaseStream.Read(buffer, start, count); + // Position += count; + return count; + } + + protected internal override int WriteInternal(byte[] buffer, int start, int count) + { + mvarBaseStream.Write(buffer, start, count); + // Position += count; + return count; + } + + protected override void OpenInternal() + { + } + protected override void CloseInternal() + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StringAccessor.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StringAccessor.cs new file mode 100644 index 00000000..28fc8a30 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Accessors/StringAccessor.cs @@ -0,0 +1,127 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.Accessors +{ + public class StringAccessor : Accessor + { + private static AccessorReference _ar = null; + protected override AccessorReference MakeReferenceInternal() + { + if (_ar == null) + { + _ar = base.MakeReferenceInternal(); + _ar.Visible = false; + } + return _ar; + } + + private char[] _data = new char[0]; + + private long ptr = 0; + protected override long GetPosition() + { + return ptr; + } + public override long Length + { + get { return _data.Length; } + set + { + // resize the array - coded by hand to compile happily under Cosmos devkit + ResizeArray(ref _data, value); + } + } + + private void ResizeArray(ref char[] _data, long value) + { + char[] newdata = new char[value]; + System.Array.Copy(_data, 0, newdata, 0, System.Math.Min(_data.Length, newdata.Length)); + _data = newdata; + } + + public StringAccessor() + { + } + public StringAccessor(string data) + { + _data = data.ToCharArray(); + } + public StringAccessor(char[] data) + { + _data = data; + } + + public override void Seek(long length, SeekOrigin position) + { + long start = 0; + switch (position) + { + case SeekOrigin.Begin: + { + start = length; + break; + } + case SeekOrigin.Current: + { + start = ptr + length; + break; + } + case SeekOrigin.End: + { + start = _data.LongLength - length; + break; + } + } + if (start >= 0 /* && start < _data.Length */) + { + ptr = start; + } + /* + else + { + throw new EndOfStreamException(); + } + */ + } + + public char[] ToArray() + { + char[] data = new char[_data.Length]; + System.Array.Copy(_data, 0, data, 0, data.Length); + return data; + } + public override string ToString() + { + return new System.String(ToArray()); + } + + protected internal override int ReadInternal(byte[] buffer, int start, int count) + { + byte[] bytes = this.DefaultEncoding.GetBytes(_data, (int)ptr, 1); + System.Array.Copy(bytes, 0, buffer, start, count); + ptr += count; + return count; + } + protected internal override int WriteInternal(byte[] buffer, int start, int count) + { + string value = DefaultEncoding.GetString(buffer); + int j = _data.Length; + ResizeArray(ref _data, _data.Length + value.Length); + for (int i = 0; i < value.Length; i++) + { + _data[j + i] = value[i]; + } + return count; + } + + protected override void OpenInternal() + { + } + protected override void CloseInternal() + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Association.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Association.cs new file mode 100644 index 00000000..441a6453 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Association.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor +{ + /// + /// Associates s, s, and other related Universal Editor objects. + /// + public class Association + { + public class AssociationCollection + : System.Collections.ObjectModel.Collection + { + + } + + private static List _associations = new List(); + + + public static bool Register(Association assoc) + { + if (_associations.Contains(assoc)) return false; + _associations.Add(assoc); + return true; + } + public static bool Unregister(Association assoc) + { + if (!_associations.Contains(assoc)) return false; + _associations.Remove(assoc); + return true; + } + + public static Association[] GetAllAssociations() + { + return _associations.ToArray(); + } + public static Association[] FromObjectModelOrDataFormat(ObjectModelReference objectModel = null, DataFormatReference dataFormat = null) + { + Association[] _associations = Association.GetAllAssociations(); + List associations = new List(); + foreach (Association assoc in _associations) + { + if ((objectModel != null && assoc.ObjectModels.Contains(objectModel)) || (dataFormat != null && assoc.DataFormats.Contains(dataFormat))) + { + associations.Add(assoc); + } + } + return associations.ToArray(); + } + public static Association[] FromAccessor(Accessor accessor = null, string fileNameFilter = null) + { + Association[] _associations = Association.GetAllAssociations(); + List associations = new List(); + Association[] assocs = _associations; + foreach (Association assoc in assocs) + { + foreach (DataFormatFilter filter in assoc.Filters) + { + if (accessor != null) + { + for (int i = 0; i < filter.MagicBytes.Count; i++) + { + byte?[] bytes = filter.MagicBytes[i]; + if ((accessor.Position + bytes.Length) <= accessor.Length) + { + bool ret = true; + byte[] cmp = new byte[bytes.Length]; + long offset = accessor.Position; + if (i < filter.MagicByteOffsets.Length) + { + if (filter.MagicByteOffsets[i] < 0) + { + accessor.Seek(filter.MagicByteOffsets[i], SeekOrigin.End); + } + else + { + accessor.Seek(filter.MagicByteOffsets[i], SeekOrigin.Begin); + } + } + accessor.Reader.Read(cmp, 0, cmp.Length); + accessor.Position = offset; + + for (int j = 0; j < bytes.Length; j++) + { + if (bytes[j] == null) continue; + if (bytes[j] != cmp[j]) + { + ret = false; + break; + } + } + if (ret) + { + associations.Add(assoc); + break; + } + } + } + } + if (fileNameFilter != null) + { + if (filter.FileNameFilters.Contains(fileNameFilter)) + { + associations.Add(assoc); + break; + } + } + } + } + return associations.ToArray(); + } + + private string mvarTitle = String.Empty; + /// + /// The title of this ; for example, "JPEG images". + /// + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private DataFormatFilter.DataFormatFilterCollection mvarFilters = new DataFormatFilter.DataFormatFilterCollection(); + /// + /// The filters that are used to determine which documents can be handled by this . + /// + public DataFormatFilter.DataFormatFilterCollection Filters { get { return mvarFilters; } } + + private string mvarExternalCommandLine = String.Empty; + /// + /// The command line of an external application to launch when a file handled by this association is opened. + /// + public string ExternalCommandLine { get { return mvarExternalCommandLine; } set { mvarExternalCommandLine = value; } } + + private ObjectModelReference.ObjectModelReferenceCollection mvarObjectModels = new ObjectModelReference.ObjectModelReferenceCollection(); + /// + /// The s which refer to s that are included in this . + /// + public ObjectModelReference.ObjectModelReferenceCollection ObjectModels { get { return mvarObjectModels; } } + + private DataFormatReference.DataFormatReferenceCollection mvarDataFormats = new DataFormatReference.DataFormatReferenceCollection(); + /// + /// The s which refer to s that are included in this . + /// + public DataFormatReference.DataFormatReferenceCollection DataFormats { get { return mvarDataFormats; } } + + public static Association[] FromCriteria(AssociationCriteria ac) + { + List associations = new List(); + Association[] _associations = GetAllAssociations(); + foreach (Association assoc in _associations) + { + if (ac.ObjectModel != null) + { + if (assoc.ObjectModels.Contains(ac.ObjectModel)) + { + associations.Add(assoc); + continue; + } + } + if (ac.DataFormat != null) + { + if (assoc.DataFormats.Contains(ac.DataFormat)) + { + associations.Add(assoc); + continue; + } + } + if (ac.Accessor != null) + { + bool found = false; + foreach (DataFormatFilter filter in assoc.Filters) + { + if (filter.Matches(ac.Accessor)) + { + associations.Add(assoc); + found = true; + break; + } + } + if (found) continue; + } + } + return associations.ToArray(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/AssociationCriteria.cs b/CSharp/V5/Libraries/UniversalEditor.Core/AssociationCriteria.cs new file mode 100644 index 00000000..96f76bad --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/AssociationCriteria.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class AssociationCriteria + { + private Accessor mvarAccessor = null; + /// + /// The accessor to use for MagicByteSequence comparisons. + /// + public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; } } + + private DataFormatReference mvarDataFormat = null; + /// + /// The which points to the to search for. + /// + public DataFormatReference DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; } } + + private ObjectModelReference mvarObjectModel = null; + /// + /// The which points to the to search for. + /// + public ObjectModelReference ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; } } + + private string mvarFileName = null; + public string FileName { get { return mvarFileName; } set { mvarFileName = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/ChecksumModule.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/ChecksumModule.cs new file mode 100644 index 00000000..6fb49b96 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/ChecksumModule.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Checksum +{ + /// + /// Provides the minimal functionality required to create a checksum calculation module. + /// + public abstract class ChecksumModule + { + /// + /// The name of this checksum calculation module. + /// + public abstract string Name { get; } + + private long mvarValue = 0; + /// + /// The current value of the checksum being calculated. + /// + public virtual long Value { get { return mvarValue; } protected set { mvarValue = value; } } + + /// + /// Calculates the checksum based on the given input. + /// + /// The array of bytes used as input to the checksum calculation routine. + /// A that represents the checksum of the given input. + public long Calculate(byte[] input) + { + Reset(); + Update(input); + return Value; + } + + /// + /// Resets the checksum as if no update was ever called. + /// + public virtual void Reset() + { + mvarValue = 0; + } + + /// + /// Updates the checksum with the bytes taken from the array. + /// + /// The array of bytes used as input to the checksum calculation routine. + public void Update(byte[] buffer) + { + if (buffer == null) throw new ArgumentNullException("buffer"); + Update(buffer, 0, buffer.Length); + } + + /// + /// Updates the checksum with a count of bytes taken from the array beginning at offset + /// . + /// + /// The array of bytes used as input to the checksum calculation routine. + /// The offset into from which calculation starts. + /// The number of bytes to use in the checksum calculation. + public abstract void Update(byte[] buffer, int offset, int count); + + /// + /// Calculates the checksum based on the given input. + /// + /// The value used as input to the checksum calculation routine. + public abstract void Update(int input); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/Adler32/Adler32ChecksumModule.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/Adler32/Adler32ChecksumModule.cs new file mode 100644 index 00000000..e7e9fbb0 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/Adler32/Adler32ChecksumModule.cs @@ -0,0 +1,217 @@ +// Adler32.cs - Computes Adler32 data checksum of a data stream +// Copyright (C) 2001 Mike Krueger +// +// This file was translated from java, it was part of the GNU Classpath +// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. + +using System; + +namespace UniversalEditor.Checksum.Modules.Adler32 +{ + + /// + /// Computes Adler32 checksum for a stream of data. An Adler32 + /// checksum is not as reliable as a CRC32 checksum, but a lot faster to + /// compute. + /// + /// The specification for Adler32 may be found in RFC 1950. + /// ZLIB Compressed Data Format Specification version 3.3) + /// + /// + /// From that document: + /// + /// "ADLER32 (Adler-32 checksum) + /// This contains a checksum value of the uncompressed data + /// (excluding any dictionary data) computed according to Adler-32 + /// algorithm. This algorithm is a 32-bit extension and improvement + /// of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + /// standard. + /// + /// Adler-32 is composed of two sums accumulated per byte: s1 is + /// the sum of all bytes, s2 is the sum of all s1 values. Both sums + /// are done modulo 65521. s1 is initialized to 1, s2 to zero. The + /// Adler-32 checksum is stored as s2*65536 + s1 in most- + /// significant-byte first (network) order." + /// + /// "8.2. The Adler-32 algorithm + /// + /// The Adler-32 algorithm is much faster than the CRC32 algorithm yet + /// still provides an extremely low probability of undetected errors. + /// + /// The modulo on unsigned long accumulators can be delayed for 5552 + /// bytes, so the modulo operation time is negligible. If the bytes + /// are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + /// and order sensitive, unlike the first sum, which is just a + /// checksum. That 65521 is prime is important to avoid a possible + /// large class of two-byte errors that leave the check unchanged. + /// (The Fletcher checksum uses 255, which is not prime and which also + /// makes the Fletcher check insensitive to single byte changes 0 - + /// 255.) + /// + /// The sum s1 is initialized to 1 instead of zero to make the length + /// of the sequence part of s2, so that the length does not have to be + /// checked separately. (Any sequence of zeroes has a Fletcher + /// checksum of zero.)" + /// + /// + /// + public sealed class Adler32 : ChecksumModule + { + public override string Name + { + get { return "Adler32"; } + } + + /// + /// largest prime smaller than 65536 + /// + const uint BASE = 65521; + + /// + /// Returns the Adler32 data checksum computed so far. + /// + public override long Value + { + get + { + return checksum; + } + } + + /// + /// Creates a new instance of the Adler32 class. + /// The checksum starts off with a value of 1. + /// + public Adler32() + { + Reset(); + } + + /// + /// Resets the Adler32 checksum to the initial value. + /// + public override void Reset() + { + checksum = 1; + } + + /// + /// Updates the checksum with a byte value. + /// + /// + /// The data value to add. The high byte of the int is ignored. + /// + public override void Update(int value) + { + // We could make a length 1 byte array and call update again, but I + // would rather not have that overhead + uint s1 = checksum & 0xFFFF; + uint s2 = checksum >> 16; + + s1 = (s1 + ((uint)value & 0xFF)) % BASE; + s2 = (s1 + s2) % BASE; + + checksum = (s2 << 16) + s1; + } + + /// + /// Updates the checksum with the bytes taken from the array. + /// + /// + /// an array of bytes + /// + /// + /// the start of the data used for this update + /// + /// + /// the number of bytes to use for this update + /// + public override void Update(byte[] buffer, int offset, int count) + { + if (buffer == null) { + throw new ArgumentNullException("buffer"); + } + + if (offset < 0) { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("offset"); +#else + throw new ArgumentOutOfRangeException("offset", "cannot be negative"); +#endif + } + + if ( count < 0 ) + { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("count"); +#else + throw new ArgumentOutOfRangeException("count", "cannot be negative"); +#endif + } + + if (offset >= buffer.Length) + { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("offset"); +#else + throw new ArgumentOutOfRangeException("offset", "not a valid index into buffer"); +#endif + } + + if (offset + count > buffer.Length) + { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("count"); +#else + throw new ArgumentOutOfRangeException("count", "exceeds buffer size"); +#endif + } + + //(By Per Bothner) + uint s1 = checksum & 0xFFFF; + uint s2 = checksum >> 16; + + while (count > 0) { + // We can defer the modulo operation: + // s1 maximally grows from 65521 to 65521 + 255 * 3800 + // s2 maximally grows by 3800 * median(s1) = 2090079800 < 2^31 + int n = 3800; + if (n > count) { + n = count; + } + count -= n; + while (--n >= 0) { + s1 = s1 + (uint)(buffer[offset++] & 0xff); + s2 = s2 + s1; + } + s1 %= BASE; + s2 %= BASE; + } + + checksum = (s2 << 16) | s1; + } + + #region Instance Fields + uint checksum; + #endregion + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/CRC32/CRC32ChecksumModule.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/CRC32/CRC32ChecksumModule.cs new file mode 100644 index 00000000..7fceba7b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/CRC32/CRC32ChecksumModule.cs @@ -0,0 +1,208 @@ +// CRC32.cs - Computes CRC32 data checksum of a data stream +// Copyright (C) 2001 Mike Krueger +// +// This file was translated from java, it was part of the GNU Classpath +// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +using System; + +namespace UniversalEditor.Checksum.Modules.CRC32 +{ + + /// + /// Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: + /// x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + /// + /// Polynomials over GF(2) are represented in binary, one bit per coefficient, + /// with the lowest powers in the most significant bit. Then adding polynomials + /// is just exclusive-or, and multiplying a polynomial by x is a right shift by + /// one. If we call the above polynomial p, and represent a byte as the + /// polynomial q, also with the lowest power in the most significant bit (so the + /// byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + /// where a mod b means the remainder after dividing a by b. + /// + /// This calculation is done using the shift-register method of multiplying and + /// taking the remainder. The register is initialized to zero, and for each + /// incoming bit, x^32 is added mod p to the register if the bit is a one (where + /// x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + /// x (which is shifting right by one and adding x^32 mod p if the bit shifted + /// out is a one). We start with the highest power (least significant bit) of + /// q and repeat for all eight bits of q. + /// + /// The table is simply the CRC of all possible eight bit values. This is all + /// the information needed to generate CRC's on data a byte at a time for all + /// combinations of CRC register values and incoming bytes. + /// + public sealed class CRC32ChecksumModule : ChecksumModule + { + const uint CrcSeed = 0xFFFFFFFF; + + public override string Name + { + get { return "CRC32"; } + } + + readonly static uint[] CrcTable = new uint[] { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, + 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, + 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, + 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, + 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, + 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, + 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, + 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, + 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, + 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, + 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, + 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, + 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, + 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, + 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, + 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, + 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, + 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, + 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, + 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, + 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, + 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, + 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, + 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, + 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, + 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, + 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, + 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, + 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, + 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, + 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, + 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, + 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, + 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, + 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, + 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, + 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, + 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, + 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, + 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, + 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, + 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, + 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, + 0x2D02EF8D + }; + + private static uint ComputeCrc32(uint oldCrc, byte value) + { + return (uint)(CrcTable[(oldCrc ^ value) & 0xFF] ^ (oldCrc >> 8)); + } + + /// + /// The crc data checksum so far. + /// + uint crc; + + /// + /// Returns the CRC32 data checksum computed so far. + /// + public override long Value + { + get + { + return (long)crc; + } + } + + /// + /// Updates the checksum with the int bval. + /// + /// + /// the byte is taken as the lower 8 bits of value + /// + public override void Update(int value) + { + crc ^= CrcSeed; + crc = CrcTable[(crc ^ value) & 0xFF] ^ (crc >> 8); + crc ^= CrcSeed; + } + + /// + /// Adds the byte array to the data checksum. + /// + /// + /// The buffer which contains the data + /// + /// + /// The offset in the buffer where the data starts + /// + /// + /// The number of data bytes to update the CRC with. + /// + public override void Update(byte[] buffer, int offset, int count) + { + if (buffer == null) + { + throw new ArgumentNullException("buffer"); + } + + if (count < 0) + { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("count"); +#else + throw new ArgumentOutOfRangeException("count", "Count cannot be less than zero"); +#endif + } + + if (offset < 0 || offset + count > buffer.Length) + { + throw new ArgumentOutOfRangeException("offset"); + } + + crc ^= CrcSeed; + + while (--count >= 0) + { + crc = CrcTable[(crc ^ buffer[offset++]) & 0xFF] ^ (crc >> 8); + } + + crc ^= CrcSeed; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/StrangeCRC/StrangeCRCChecksumModule.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/StrangeCRC/StrangeCRCChecksumModule.cs new file mode 100644 index 00000000..917ee79b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Checksum/Modules/StrangeCRC/StrangeCRCChecksumModule.cs @@ -0,0 +1,198 @@ +// StrangeCRC.cs - computes a crc used in the bziplib +// +// Copyright (C) 2001 Mike Krueger +// +// This file was translated from java, it was part of the GNU Classpath +// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Linking this library statically or dynamically with other modules is +// making a combined work based on this library. Thus, the terms and +// conditions of the GNU General Public License cover the whole +// combination. +// +// As a special exception, the copyright holders of this library give you +// permission to link this library with independent modules to produce an +// executable, regardless of the license terms of these independent +// modules, and to copy and distribute the resulting executable under +// terms of your choice, provided that you also meet, for each linked +// independent module, the terms and conditions of the license of that +// module. An independent module is a module which is not derived from +// or based on this library. If you modify this library, you may extend +// this exception to your version of the library, but you are not +// obligated to do so. If you do not wish to do so, delete this +// exception statement from your version. + +using System; + +namespace UniversalEditor.Checksum.Modules.StrangeCRC +{ + /// + /// Bzip2 checksum algorithm + /// + public class StrangeCRCChecksumModule : ChecksumModule + { + public override string Name { get { return "StrangeCRC"; } } + + readonly static uint[] crc32Table = + { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, + 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, + 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, + 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, + 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, + 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, + 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, + 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, + 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, + 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, + 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, + 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, + 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, + 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, + 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, + 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, + 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, + 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, + 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, + 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, + 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, + 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, + 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, + 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, + 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, + 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, + 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, + 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, + 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, + 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, + 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, + 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, + 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, + 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, + 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, + 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, + 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, + 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, + 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, + 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, + 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, + 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, + 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 + }; + + int globalCrc; + + /// + /// Initialise a default instance of + /// + public StrangeCRCChecksumModule() + { + Reset(); + } + + /// + /// Reset the state of Crc. + /// + public override void Reset() + { + globalCrc = -1; + } + + /// + /// Get the current Crc value. + /// + public override long Value { + get { + return ~globalCrc; + } + } + + /// + /// Update the Crc value. + /// + /// data update is based on + public override void Update(int value) + { + int temp = (globalCrc >> 24) ^ value; + if (temp < 0) { + temp = 256 + temp; + } + globalCrc = unchecked((int)((globalCrc << 8) ^ crc32Table[temp])); + } + + /// + /// Update Crc based on a portion of a block of data + /// + /// block of data + /// index of first byte to use + /// number of bytes to use + public override void Update(byte[] buffer, int offset, int count) + { + if (buffer == null) { + throw new ArgumentNullException("buffer"); + } + + if ( offset < 0 ) + { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("offset"); +#else + throw new ArgumentOutOfRangeException("offset", "cannot be less than zero"); +#endif + } + + if ( count < 0 ) + { +#if NETCF_1_0 + throw new ArgumentOutOfRangeException("count"); +#else + throw new ArgumentOutOfRangeException("count", "cannot be less than zero"); +#endif + } + + if ( offset + count > buffer.Length ) + { + throw new ArgumentOutOfRangeException("count"); + } + + for (int i = 0; i < count; ++i) { + Update(buffer[offset++]); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Common/Path.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Common/Path.cs new file mode 100644 index 00000000..4caa95f3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Common/Path.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Common +{ + /// + /// Provides common path operations. + /// + public static class Path + { + /// + /// Generates an absolute path from the given relative (or absolute) path and a parent path. + /// + /// The relative (or absolute) path to make absolute. + /// The parent path of the given relative path. + /// A concatenation of the source path and the parent path if the source path is relative; otherwise, + /// just the source path. + public static string MakeAbsolutePath(string sourcePath, string parentPath = null) + { + string result; + if (String.IsNullOrEmpty(parentPath)) + { + parentPath = Environment.CurrentDirectory; + } + if ((sourcePath.StartsWith("/") && (Environment.OSVersion.Platform == PlatformID.MacOSX || Environment.OSVersion.Platform == PlatformID.Unix)) || (sourcePath.Length > 1 && sourcePath[1] == ':')) + { + result = sourcePath; + } + else + { + result = parentPath + System.IO.Path.DirectorySeparatorChar.ToString() + sourcePath; + } + + result = result.Replace(System.IO.Path.AltDirectorySeparatorChar, System.IO.Path.DirectorySeparatorChar); + return result; + } + + /// + /// Generates a relative path from the specified absolute (or relative) path and parent directory name. + /// + /// The absolute (or relative) path to make relative. + /// The parent path for the relative path. + /// A substring of the relative path minus the parent path if the absolute path starts with the + /// parent path; otherwise, the relative (or absolute) path. + public static string MakeRelativePath(string FileName, string DirectoryName) + { + // This only goes "down" the folder hierarchy (e.g. C:/path/to/parent with C:/path as the parent becomes + // to/parent). Should we bother implementing "up" the hierarchy (will take some psychic powers) to allow + // us to use dot-dot paths (../../some/other/folder)? + if (FileName.StartsWith(DirectoryName)) + { + return FileName.Substring(DirectoryName.Length); + } + return FileName; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Common/Strings.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Common/Strings.cs new file mode 100644 index 00000000..2a7778f3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Common/Strings.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +namespace UniversalEditor.Common +{ + public static class Strings + { + /// + /// Replaces a collection of named variables in a given string. + /// + /// The string in which to replace variables. + /// A containing name-value pairs of variables to replace. + /// + /// A with all instances of variables with the given name in $(VariableName) replaced + /// with the associated value. + /// + public static string ReplaceVariables(this string value, Dictionary variables) + { + string retval = value; + foreach (string key in variables.Keys) + { + retval = retval.Replace("$(" + key + ")", variables[key].ToString()); + } + return retval; + } + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs new file mode 100644 index 00000000..c47031f3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormat.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; + +namespace UniversalEditor +{ + public class CustomDataFormat : DataFormat + { + protected override void LoadInternal(ref ObjectModel objectModel) + { + CustomDataFormatReference cdfr = (base.Reference as CustomDataFormatReference); + if (cdfr == null) return; + + Dictionary localVariables = new Dictionary(); + + IO.Reader br = base.Accessor.Reader; + foreach (CustomDataFormatItem cdfi in cdfr.Items) + { + if (cdfi is CustomDataFormatItemField) + { + CustomDataFormatItemField fld = (cdfi as CustomDataFormatItemField); + object value = null; + switch (fld.DataType) + { + case "Boolean": + { + value = br.ReadBoolean(); + break; + } + case "Byte": + { + value = br.ReadByte(); + break; + } + case "Char": + { + value = br.ReadChar(); + break; + } + case "DateTime": + { + value = br.ReadDateTime(); + break; + } + case "Decimal": + { + value = br.ReadDecimal(); + break; + } + case "Double": + { + value = br.ReadDouble(); + break; + } + case "Guid": + { + value = br.ReadGuid(); + break; + } + case "Int16": + { + value = br.ReadInt16(); + break; + } + case "Int32": + { + value = br.ReadInt32(); + break; + } + case "Int64": + { + value = br.ReadInt64(); + break; + } + case "SByte": + { + value = br.ReadSByte(); + break; + } + case "Single": + { + value = br.ReadSingle(); + break; + } + case "String": + { + value = br.ReadLengthPrefixedString(); + break; + } + case "UInt16": + { + value = br.ReadUInt16(); + break; + } + case "UInt32": + { + value = br.ReadUInt32(); + break; + } + case "UInt64": + { + value = br.ReadUInt64(); + break; + } + case "TerminatedString": + { + IO.Encoding encoding = IO.Encoding.Default; + if (fld.Encoding != null) encoding = fld.Encoding; + + if (fld.Length.HasValue) + { + value = br.ReadNullTerminatedString(fld.Length.Value, encoding); + } + else + { + value = br.ReadNullTerminatedString(encoding); + } + break; + } + case "FixedString": + { + IO.Encoding encoding = IO.Encoding.Default; + if (fld.Encoding != null) encoding = fld.Encoding; + + if (!fld.Length.HasValue) + { + throw new InvalidOperationException(); + } + value = br.ReadFixedLengthString(fld.Length.Value, encoding); + break; + } + } + + if (fld.Name != null) + { + string fldName = ReplaceVariables(fld.Name, localVariables); + if (localVariables.ContainsKey(fldName)) + { + localVariables[fldName] = value; + } + else + { + localVariables.Add(fldName, value); + } + } + if (fld.ExportTarget != null) + { + } + } + } + } + + private string ReplaceVariables(string p, Dictionary localVariables) + { + string retval = p; + foreach (string key in localVariables.Keys) + { + retval = retval.Replace("$(" + key + ")", localVariables[key].ToString()); + } + return retval; + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } + public class CustomDataFormatReference : DataFormatReference + { + public CustomDataFormatReference() : base(typeof(CustomDataFormat)) + { + } + + private CustomDataFormatItem.CustomDataFormatItemCollection mvarItems = new CustomDataFormatItem.CustomDataFormatItemCollection(); + public CustomDataFormatItem.CustomDataFormatItemCollection Items + { + get { return mvarItems; } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormatItem.cs b/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormatItem.cs new file mode 100644 index 00000000..4d20f2c6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/CustomDataFormatItem.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor +{ + public abstract class CustomDataFormatItem + { + public class CustomDataFormatItemCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarName = null; + public string Name { get { return mvarName; } set { mvarName = value; } } + } + public class CustomDataFormatItemField : CustomDataFormatItem + { + private string mvarExportTarget = null; + public string ExportTarget { get { return mvarExportTarget; } set { mvarExportTarget = value; } } + + private string mvarDataType = String.Empty; + public string DataType { get { return mvarDataType; } set { mvarDataType = value; } } + + private int? mvarLength = null; + public int? Length { get { return mvarLength; } set { mvarLength = value; } } + + private IO.Encoding mvarEncoding = null; + public IO.Encoding Encoding { get { return mvarEncoding; } set { mvarEncoding = value; } } + } + public class CustomDataFormatItemArray : CustomDataFormatItem + { + private string mvarDataType = String.Empty; + public string DataType { get { return mvarDataType; } set { mvarDataType = value; } } + + private int mvarLength = 0; + public int Length { get { return mvarLength; } set { mvarLength = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/CustomOption.cs b/CSharp/V5/Libraries/UniversalEditor.Core/CustomOption.cs new file mode 100644 index 00000000..02a666b4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/CustomOption.cs @@ -0,0 +1,352 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class CustomOptionBoolean : CustomOption + { + public CustomOptionBoolean(string propertyName, string title, bool defaultValue = false, bool enabled = true, bool visible = true) + : base(propertyName, title, enabled, visible) + { + mvarDefaultValue = defaultValue; + } + + private bool mvarDefaultValue = false; + public bool DefaultValue { get { return mvarDefaultValue; } set { mvarDefaultValue = value; } } + + private bool mvarValue = false; + public bool Value { get { return mvarValue; } set { mvarValue = value; } } + + public override object GetValue() + { + return mvarValue; + } + } + public class CustomOptionGroup : CustomOption + { + public class CustomOptionGroupCollection + : System.Collections.ObjectModel.Collection + { + } + + public CustomOptionGroup(string propertyName, string title = null, bool enabled = true, bool visible = true) + : base(propertyName, title, enabled, visible) + { + if (title == null) base.Title = propertyName; + } + + private CustomOption.CustomOptionCollection mvarOptions = new CustomOption.CustomOptionCollection(); + public CustomOption.CustomOptionCollection Options { get { return mvarOptions; } } + + public override object GetValue() + { + return null; + } + } + + public class CustomOptionFieldChoice + { + public class CustomOptionFieldChoiceCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private object mvarValue = null; + public object Value { get { return mvarValue; } set { mvarValue = value; } } + + private bool mvarIsDefault = false; + public bool IsDefault { get { return mvarIsDefault; } set { mvarIsDefault = value; } } + + public CustomOptionFieldChoice(string title) : this(title, title, false) + { + } + public CustomOptionFieldChoice(object value) + { + if (value != null) + { + mvarTitle = value.ToString(); + } + mvarValue = value; + } + public CustomOptionFieldChoice(object value, bool isDefault) + { + if (value != null) + { + mvarTitle = value.ToString(); + } + mvarValue = value; + mvarIsDefault = isDefault; + } + public CustomOptionFieldChoice(string title, object value) : this(title, value, false) + { + } + public CustomOptionFieldChoice(string title, object value, bool isDefault) + { + mvarTitle = title; + mvarValue = value; + mvarIsDefault = isDefault; + } + + public override string ToString() + { + return mvarTitle; + } + } + + /// + /// Defines how a custom option will appear on the options dialog + /// when a file is saved or exported using a compatible + /// implementation of UniversalEditor.UserInterface. + /// + public abstract class CustomOption + { + public class CustomOptionCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarPropertyName = String.Empty; + public string PropertyName { get { return mvarPropertyName; } set { mvarPropertyName = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private bool mvarEnabled = true; + public bool Enabled { get { return mvarEnabled; } set { mvarEnabled = value; } } + + private bool mvarVisible = true; + public bool Visible { get { return mvarVisible; } set { mvarVisible = value; } } + + public CustomOption(string propertyName, string title, bool enabled = true, bool visible = true) + { + mvarPropertyName = propertyName; + mvarTitle = title; + mvarEnabled = enabled; + mvarVisible = visible; + } + + public abstract object GetValue(); + } + + public class CustomOptionText : CustomOption + { + /// + /// Creates a custom option as a text box. + /// + /// The title of the export option. + public CustomOptionText(string propertyName, string title, string defaultValue = "", int? maximumLength = null, bool enabled = true, bool visible = true) + : base(propertyName, title, enabled, visible) + { + mvarDefaultValue = defaultValue; + mvarMaximumLength = maximumLength; + } + + private int? mvarMaximumLength = null; + public int? MaximumLength { get { return mvarMaximumLength; } set { mvarMaximumLength = value; } } + + private string mvarDefaultValue = String.Empty; + public string DefaultValue { get { return mvarDefaultValue; } set { mvarDefaultValue = value; } } + + private string mvarValue = String.Empty; + public string Value { get { return mvarValue; } set { mvarValue = value; } } + + public override object GetValue() + { + return mvarValue; + } + } + public class CustomOptionChoice : CustomOption + { + /// + /// Creates a custom option as a drop-down list with the specified options. + /// + /// The title of the export option. + /// + /// + public CustomOptionChoice(string propertyName, string title, bool requireChoice = false, params CustomOptionFieldChoice[] choices) + : base(propertyName, title) + { + mvarIsRadioButton = false; + mvarRequireChoice = requireChoice; + foreach (CustomOptionFieldChoice choice in choices) + { + mvarChoices.Add(choice); + } + } + public CustomOptionChoice(string propertyName, string title, bool requireChoice = false, bool enabled = true, bool visible = true, params CustomOptionFieldChoice[] choices) + : base(propertyName, title, enabled, visible) + { + mvarIsRadioButton = false; + mvarRequireChoice = requireChoice; + foreach (CustomOptionFieldChoice choice in choices) + { + mvarChoices.Add(choice); + } + } + + /* + /// + /// Creates a custom option as a radio button list with the specified options. + /// + /// The title of the export option. + /// + /// + public CustomOptionChoice(string propertyName, string title, params CustomOptionFieldChoice[] choices) + : base(propertyName, title) + { + mvarIsRadioButton = true; + foreach (CustomOptionFieldChoice choice in choices) + { + mvarChoices.Add(choice); + } + } + */ + + private bool mvarIsRadioButton = false; + public bool IsRadioButton { get { return mvarIsRadioButton; } set { mvarIsRadioButton = value; } } + + private bool mvarRequireChoice = false; + public bool RequireChoice { get { return mvarRequireChoice; } set { mvarRequireChoice = value; } } + + private CustomOptionFieldChoice.CustomOptionFieldChoiceCollection mvarChoices = new CustomOptionFieldChoice.CustomOptionFieldChoiceCollection(); + public CustomOptionFieldChoice.CustomOptionFieldChoiceCollection Choices { get { return mvarChoices; } } + + private CustomOptionFieldChoice mvarDefaultValue = null; + public CustomOptionFieldChoice DefaultValue { get { return mvarDefaultValue; } set { mvarDefaultValue = value; } } + + private CustomOptionFieldChoice mvarValue = null; + public CustomOptionFieldChoice Value { get { return mvarValue; } set { mvarValue = value; } } + + public override object GetValue() + { + if (mvarValue == null) return null; + return mvarValue.Value; + } + } + + public class DataFormatOptionNumberSuggestedValue + { + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private decimal mvarValue = 0; + public decimal Value { get { return mvarValue; } set { mvarValue = value; } } + + public class DataFormatOptionNumberSuggestedValueCollection + : System.Collections.ObjectModel.Collection + { + public DataFormatOptionNumberSuggestedValue Add(decimal value, string title = null) + { + if (title == null) title = value.ToString(); + + DataFormatOptionNumberSuggestedValue item = new DataFormatOptionNumberSuggestedValue(); + item.Title = title; + item.Value = value; + Add(item); + return item; + } + } + } + + public class CustomOptionNumber : CustomOption + { + private DataFormatOptionNumberSuggestedValue.DataFormatOptionNumberSuggestedValueCollection mvarSuggestedValues = new DataFormatOptionNumberSuggestedValue.DataFormatOptionNumberSuggestedValueCollection(); + public DataFormatOptionNumberSuggestedValue.DataFormatOptionNumberSuggestedValueCollection SuggestedValues { get { return mvarSuggestedValues; } } + + private decimal? mvarMinimumValue = null; + public decimal? MinimumValue { get { return mvarMinimumValue; } set { mvarMinimumValue = value; } } + + private decimal? mvarMaximumValue = null; + public decimal? MaximumValue { get { return mvarMaximumValue; } set { mvarMaximumValue = value; } } + + private decimal mvarDefaultValue = 0; + public decimal DefaultValue { get { return mvarDefaultValue; } set { mvarDefaultValue = value; } } + + private decimal mvarValue = 0; + public decimal Value { get { return mvarValue; } set { mvarValue = value; } } + + public CustomOptionNumber(string propertyName, string title, decimal defaultValue = 0, decimal? minimumValue = null, decimal? maximumValue = null, bool enabled = true, bool visible = true) + : base(propertyName, title, enabled, visible) + { + mvarMinimumValue = minimumValue; + mvarMaximumValue = maximumValue; + mvarDefaultValue = defaultValue; + } + + public override object GetValue() + { + return mvarValue; + } + } + public class CustomOptionMultipleChoice : CustomOption + { + public CustomOptionMultipleChoice(string propertyName, string title, params CustomOptionFieldChoice[] choices) + : base(propertyName, title) + { + + } + public CustomOptionMultipleChoice(string propertyName, string title, bool enabled = true, bool visible = true, params CustomOptionFieldChoice[] choices) + : base(propertyName, title, enabled, visible) + { + + } + + public override object GetValue() + { + return null; + } + } + + public enum CustomOptionFileDialogMode + { + Open, + Save + } + public class CustomOptionFile : CustomOption + { + private string mvarDefaultValue = String.Empty; + public string DefaultValue { get { return mvarDefaultValue; } set { mvarDefaultValue = value; } } + + private string mvarFilter = String.Empty; + public string Filter { get { return mvarFilter; } set { mvarFilter = value; } } + + private string mvarValue = String.Empty; + public string Value { get { return mvarValue; } set { mvarValue = value; } } + + public CustomOptionFile(string propertyName, string title, string defaultValue = "", string filter = "*.*", bool enabled = true, bool visible = true) + : base(propertyName, title, enabled, visible) + { + mvarDefaultValue = defaultValue; + mvarFilter = filter; + } + + private CustomOptionFileDialogMode mvarDialogMode = CustomOptionFileDialogMode.Open; + public CustomOptionFileDialogMode DialogMode { get { return mvarDialogMode; } set { mvarDialogMode = value; } } + + public override object GetValue() + { + return mvarValue; + } + } + public class CustomOptionVersion : CustomOption + { + private Version mvarValue = null; + public Version Value { get { return mvarValue; } set { mvarValue = value; } } + + public CustomOptionVersion(string propertyName, string title, Version value = null, bool enabled = true, bool visible = true) + : base(propertyName, title, enabled, visible) + { + mvarValue = value; + } + + public override object GetValue() + { + return mvarValue; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataCorruptedException.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataCorruptedException.cs new file mode 100644 index 00000000..097e544a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataCorruptedException.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class DataCorruptedException : Exception + { + public DataCorruptedException() : base(Localization.StringTable.ErrorDataCorrupted) { } + public DataCorruptedException(string message) : base(message) { } + public DataCorruptedException(string message, Exception innerException) : base(message, innerException) { } + public DataCorruptedException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormat.cs new file mode 100644 index 00000000..9218048c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormat.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.IO; + +namespace UniversalEditor +{ + public abstract class DataFormat : References + { + public class DataFormatCollection + : System.Collections.ObjectModel.Collection + { + + } + + internal DataFormatReference mvarReference = null; + /// + /// The DataFormatReference used to create this DataFormat. + /// + public DataFormatReference Reference + { + get { return mvarReference; } + } + + public DataFormatReference MakeReference() + { + DataFormatReference dfr = MakeReferenceInternal(); + DataFormatReference.Register(dfr); + return dfr; + } + protected virtual DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = new DataFormatReference(GetType()); + return dfr; + } + + private Accessor mvarAccessor = null; + protected internal Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; } } + + /// + /// Continues loading the file into the specified with a different + /// . + /// + /// The in which to continue loading the document. + /// The used to parse the document. + protected void ContinueLoading(ref ObjectModel objectModel, DataFormat otherDataFormat) + { + otherDataFormat.Accessor = mvarAccessor; + otherDataFormat.Load(ref objectModel); + } + + protected virtual bool IsObjectModelSupported(ObjectModel objectModel) + { + DataFormatReference dfr = MakeReferenceInternal(); + ObjectModelReference omr = objectModel.MakeReference(); + return dfr.Capabilities.Contains(omr.Type) || dfr.Capabilities.Contains(omr.ID); + } + + public void Load(ref ObjectModel objectModel) + { + if (objectModel == null) throw new ArgumentNullException("objectModel", "objectModel cannot be null"); + + Stack stack = new Stack(); + stack.Push(objectModel); + BeforeLoadInternal(stack); + + ObjectModel omb = stack.Pop(); + LoadInternal(ref omb); + stack.Push(omb); + /* + if (!IsObjectModelSupported(omb)) + { + throw new NotSupportedException("Object model not supported"); + } + */ + AfterLoadInternal(stack); + } + public void Save(ObjectModel objectModel) + { + if (objectModel == null) throw new ArgumentNullException("objectModel", "objectModel cannot be null"); + + Stack stack = new Stack(); + stack.Push(objectModel); + BeforeSaveInternal(stack); + + ObjectModel omb = stack.Pop(); + SaveInternal(omb); + stack.Push(omb); + + AfterSaveInternal(stack); + } + + protected abstract void LoadInternal(ref ObjectModel objectModel); + protected abstract void SaveInternal(ObjectModel objectModel); + + protected virtual void BeforeLoadInternal(Stack objectModels) + { + } + protected virtual void AfterLoadInternal(Stack objectModels) + { + } + protected virtual void BeforeSaveInternal(Stack objectModels) + { + } + protected virtual void AfterSaveInternal(Stack objectModels) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatCapabilities.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatCapabilities.cs new file mode 100644 index 00000000..11eaea2c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatCapabilities.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public enum DataFormatCapabilities + { + None = 0, + Load = 1, + Save = 2, + Bootstrap = 4, + All = Load | Save | Bootstrap + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatException.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatException.cs new file mode 100644 index 00000000..f8ef1059 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor +{ + public class DataFormatException : Exception + { + public DataFormatException() : base() { } + public DataFormatException(string message) : base(message) { } + public DataFormatException(string message, Exception innerException) : base(message, innerException) { } + public DataFormatException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatFilter.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatFilter.cs new file mode 100644 index 00000000..cdc80466 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatFilter.cs @@ -0,0 +1,297 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor +{ + public class DataFormatFilter + { + public class DataFormatFilterCollection + : System.Collections.ObjectModel.Collection + { + public DataFormatFilter Add(string Title, string[] FileNameFilters) + { + DataFormatFilter dff = new DataFormatFilter(); + dff.Title = Title; + foreach (string FileNameFilter in FileNameFilters) + { + dff.FileNameFilters.Add(FileNameFilter); + } + dff.HintComparison = DataFormatHintComparison.FilterOnly; + base.Add(dff); + return dff; + } + public DataFormatFilter Add(string Title, string[] FileNameFilters, byte?[][] MagicBytes) + { + DataFormatFilter dff = new DataFormatFilter(); + dff.Title = Title; + foreach (string FileNameFilter in FileNameFilters) + { + dff.FileNameFilters.Add(FileNameFilter); + } + foreach (byte?[] magicBytes in MagicBytes) + { + dff.MagicBytes.Add(magicBytes); + } + dff.HintComparison = DataFormatHintComparison.FilterThenMagic; + base.Add(dff); + return dff; + } + public DataFormatFilter Add(string Title, byte?[][] MagicBytes, string[] FileNameFilters) + { + DataFormatFilter dff = new DataFormatFilter(); + dff.Title = Title; + foreach (string FileNameFilter in FileNameFilters) + { + dff.FileNameFilters.Add(FileNameFilter); + } + foreach (byte?[] magicBytes in MagicBytes) + { + dff.MagicBytes.Add(magicBytes); + } + dff.HintComparison = DataFormatHintComparison.MagicThenFilter; + base.Add(dff); + return dff; + } + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private DataFormatHintComparison mvarHintComparison = DataFormatHintComparison.Unspecified; + public DataFormatHintComparison HintComparison { get { return mvarHintComparison; } set { mvarHintComparison = value; } } + + private System.Collections.Specialized.StringCollection mvarFileNameFilters = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection FileNameFilters { get { return mvarFileNameFilters; } } + + private List mvarMagicBytes = new List(); + public List MagicBytes { get { return mvarMagicBytes; } } + + /// + /// Determines if this matches the content of the specified + /// . Depending on the value of , this will look at the + /// data in the as well as the file name provided by the + /// method. + /// + /// The to examine for a match. + /// True if the filter applies to the given ; false otherwise. + public bool Matches(Accessor accessor) + { + switch (mvarHintComparison) + { + case DataFormatHintComparison.Always: return true; + case DataFormatHintComparison.Never: return false; + } + + bool basedOnFilter = false; + bool basedOnMagic = false; + + // first determine if our file name matches any of the filters + string fileName = accessor.GetFileName(); + + bool caseSensitiveOS = true; + // extremely hacky + switch (Environment.OSVersion.Platform) + { + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + case PlatformID.WinCE: + { + caseSensitiveOS = false; + break; + } + } + + if (!caseSensitiveOS) fileName = fileName.ToLower(); + for (int i = 0; i < mvarFileNameFilters.Count; i++) + { + string filter = mvarFileNameFilters[i]; + if (!caseSensitiveOS) filter = filter.ToLower(); + + if (fileName.Match(mvarFileNameFilters[i])) + { + basedOnFilter = true; + break; + } + } + + bool requiresOpen = false; + if (!accessor.IsOpen) requiresOpen = true; + + if (requiresOpen) + { + try + { + accessor.Open(); + } + catch (Exception ex) + { + basedOnMagic = false; + requiresOpen = false; + } + } + + if (accessor.IsOpen) + { + // then determine if the magic bytes match + for (int i = 0; i < mvarMagicBytes.Count; i++) + { + byte?[] bytes = mvarMagicBytes[i]; + if ((accessor.Position + bytes.Length) <= accessor.Length) + { + bool ret = true; + byte[] cmp = new byte[bytes.Length]; + + long offset = accessor.Position; + if (i < mvarMagicByteOffsets.Length) + { + if (mvarMagicByteOffsets[i] < 0) + { + accessor.Seek(mvarMagicByteOffsets[i], SeekOrigin.End); + } + else + { + accessor.Seek(mvarMagicByteOffsets[i], SeekOrigin.Begin); + } + } + accessor.Reader.Read(cmp, 0, cmp.Length); + accessor.Position = offset; + + for (int j = 0; j < bytes.Length; j++) + { + if (bytes[j] == null) continue; + if (bytes[j] != cmp[j]) + { + ret = false; + break; + } + } + if (ret) + { + basedOnMagic = true; + break; + } + } + } + } + + if (requiresOpen) + { + accessor.Close(); + requiresOpen = false; + } + + switch (mvarHintComparison) + { + case DataFormatHintComparison.Always: return true; + case DataFormatHintComparison.Never: return false; + case DataFormatHintComparison.FilterOnly: + { + return basedOnFilter; + } + case DataFormatHintComparison.FilterThenMagic: + { + if (!basedOnFilter) return basedOnMagic; + return basedOnFilter; + } + case DataFormatHintComparison.MagicOnly: + { + return basedOnMagic; + } + case DataFormatHintComparison.Unspecified: + case DataFormatHintComparison.MagicThenFilter: + { + if (!basedOnMagic) return basedOnFilter; + return basedOnMagic; + } + } + return false; + } + + private int[] mvarMagicByteOffsets = new int[0]; + public int[] MagicByteOffsets { get { return mvarMagicByteOffsets; } set { mvarMagicByteOffsets = value; } } + } + public class DataFormatCapabilityCollection + { + private System.Collections.Generic.Dictionary mvarCapabilities = new Dictionary(); + private System.Collections.Generic.Dictionary mvarCapabilities2 = new Dictionary(); + + public void Add(Type objectModelType, DataFormatCapabilities capabilities) + { + if (objectModelType == null) return; + if (!objectModelType.IsSubclassOf(typeof(ObjectModel))) throw new InvalidOperationException("objectModelType is not an object model"); + if (mvarCapabilities.ContainsKey(objectModelType)) + { + mvarCapabilities[objectModelType] = capabilities; + } + else + { + mvarCapabilities.Add(objectModelType, capabilities); + } + } + + public void Add(Guid objectModelID, DataFormatCapabilities capabilities) + { + if (mvarCapabilities2.ContainsKey(objectModelID)) + { + mvarCapabilities2[objectModelID] = capabilities; + } + else + { + mvarCapabilities2.Add(objectModelID, capabilities); + } + } + + public void Remove(Type objectModelType) + { + if (!objectModelType.IsSubclassOf(typeof(ObjectModel))) throw new InvalidOperationException("objectModelType is not an object model"); + if (mvarCapabilities.ContainsKey(objectModelType)) + { + mvarCapabilities.Remove(objectModelType); + } + } + public void Remove(Guid objectModelID) + { + if (mvarCapabilities2.ContainsKey(objectModelID)) + { + mvarCapabilities2.Remove(objectModelID); + } + } + + public void Clear() + { + mvarCapabilities.Clear(); + mvarCapabilities2.Clear(); + } + + public DataFormatCapabilities this[Type objectModelType] + { + get + { + if (!objectModelType.IsSubclassOf(typeof(ObjectModel))) return DataFormatCapabilities.None; + if (!mvarCapabilities.ContainsKey(objectModelType)) return DataFormatCapabilities.None; + return mvarCapabilities[objectModelType]; + } + } + public DataFormatCapabilities this[Guid objectModelID] + { + get + { + if (!mvarCapabilities2.ContainsKey(objectModelID)) return DataFormatCapabilities.None; + return mvarCapabilities2[objectModelID]; + } + } + + public bool Contains(Type objectModelType) + { + return mvarCapabilities.ContainsKey(objectModelType); + } + public bool Contains(Guid objectModelID) + { + return mvarCapabilities2.ContainsKey(objectModelID); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatHintComparison.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatHintComparison.cs new file mode 100644 index 00000000..9e279c0b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatHintComparison.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public enum DataFormatHintComparison + { + Unspecified = -1, + Never = 0, + FilterOnly = 1, + MagicOnly = 2, + FilterThenMagic = 3, + MagicThenFilter = 4, + Always = 5 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatReference.cs b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatReference.cs new file mode 100644 index 00000000..80e18cdc --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/DataFormatReference.cs @@ -0,0 +1,236 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class DataFormatReference : ReferencedBy, IComparable + { + public class DataFormatReferenceCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarTitle = null; + public string Title + { + get + { + if (mvarTitle == null) + { + // if (mvarFilters.Count > 0) return mvarFilters[0].Title; + } + return mvarTitle; + } + set { mvarTitle = value; } + } + + private Type mvarType = null; + public Type Type { get { return mvarType; } } + + private string mvarTypeName = null; + public string TypeName { get { return mvarTypeName; } set { mvarTypeName = value; } } + + private string DataFormatFilterCollectionToString(DataFormatFilter.DataFormatFilterCollection collection) + { + StringBuilder sb = new StringBuilder(); + foreach (DataFormatFilter filter in collection) + { + sb.Append(StringArrayToString(filter.FileNameFilters)); + if (collection.IndexOf(filter) < collection.Count - 1) + { + sb.Append("; "); + } + } + return sb.ToString(); + } + private string StringArrayToString(System.Collections.Specialized.StringCollection collection) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in collection) + { + sb.Append(s); + if (collection.IndexOf(s) < collection.Count - 1) + { + sb.Append(", "); + } + } + return sb.ToString(); + } + + public string[] GetDetails() + { + string title = mvarTitle; + Association[] assocs = Association.FromCriteria(new AssociationCriteria() { DataFormat = this }); + if (String.IsNullOrEmpty(mvarTitle) && assocs.Length > 0 && assocs[0].Filters.Count > 0) + { + title = assocs[0].Filters[0].Title; + } + + StringBuilder sb = new StringBuilder(); + foreach (Association assoc in assocs) + { + foreach (DataFormatFilter filter in assoc.Filters) + { + foreach (string s in filter.FileNameFilters) + { + sb.Append(s); + if (filter.FileNameFilters.IndexOf(s) < filter.FileNameFilters.Count - 1) sb.Append("; "); + } + if (assoc.Filters.IndexOf(filter) < assoc.Filters.Count - 1) sb.Append("; "); + } + if (Array.IndexOf(assocs, assoc) < assocs.Length - 1) sb.Append("; "); + } + + return new string[] { title, sb.ToString() }; + } + + public DataFormatReference(Guid id) + { + mvarID = id; + } + public DataFormatReference(string dataFormatTypeName) + { + mvarTypeName = dataFormatTypeName; + } + public DataFormatReference(Type dataFormatType) + { + if (!dataFormatType.IsSubclassOf(typeof(DataFormat))) + { + throw new InvalidCastException("Cannot create a data format reference to a non-DataFormat type"); + } + else if (dataFormatType.IsAbstract) + { + throw new InvalidOperationException("Cannot create a data format reference to an abstract type"); + } + + mvarType = dataFormatType; + } + + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private DataFormatCapabilityCollection mvarCapabilities = new DataFormatCapabilityCollection(); + public DataFormatCapabilityCollection Capabilities { get { return mvarCapabilities; } } + + private System.Collections.Specialized.StringCollection mvarContentTypes = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection ContentTypes { get { return mvarContentTypes; } } + + private System.Collections.Specialized.StringCollection mvarSources = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection Sources { get { return mvarSources; } } + + private CustomOption.CustomOptionCollection mvarImportOptions = new CustomOption.CustomOptionCollection(); + public CustomOption.CustomOptionCollection ImportOptions { get { return mvarImportOptions; } } + + private CustomOption.CustomOptionCollection mvarExportOptions = new CustomOption.CustomOptionCollection(); + public CustomOption.CustomOptionCollection ExportOptions { get { return mvarExportOptions; } } + + public virtual DataFormat Create() + { + DataFormat df = (mvarType.Assembly.CreateInstance(mvarType.FullName) as DataFormat); + df.mvarReference = this; + return df; + } + + public void Clear() + { + mvarCapabilities.Clear(); + mvarContentTypes.Clear(); + mvarSources.Clear(); + mvarTitle = null; + } + + public override string ToString() + { + if (!String.IsNullOrEmpty(mvarTitle)) + { + return mvarTitle; + } + else if (mvarType != null) + { + return mvarType.FullName; + } + return GetType().FullName; + } + + private int mvarPriority = 0; + public int Priority { get { return mvarPriority; } set { mvarPriority = value; } } + + private static Dictionary _referencesByGUID = new Dictionary(); + private static Dictionary _referencesByTypeName = new Dictionary(); + + public static bool Register(DataFormatReference dfr) + { + bool retval = false; + if (dfr.Type != null) + { + dfr.TypeName = dfr.Type.FullName; + } + if (dfr.ID != Guid.Empty) + { + _referencesByGUID[dfr.ID] = dfr; + retval = true; + } + if (dfr.TypeName != null) + { + _referencesByTypeName[dfr.TypeName] = dfr; + retval = true; + } + return retval; + } + public static bool Unregister(DataFormatReference dfr) + { + bool retval = false; + if (dfr.ID != Guid.Empty && _referencesByGUID.ContainsKey(dfr.ID)) + { + _referencesByGUID.Remove(dfr.ID); + retval = true; + } + if (dfr.TypeName != null && _referencesByTypeName.ContainsKey(dfr.TypeName)) + { + _referencesByTypeName.Remove(dfr.TypeName); + retval = true; + } + return retval; + } + + public static DataFormatReference FromTypeName(string typeName) + { + if (_referencesByTypeName.ContainsKey(typeName)) return _referencesByTypeName[typeName]; + return null; + } + public static DataFormatReference FromGUID(Guid guid) + { + if (_referencesByGUID.ContainsKey(guid)) return _referencesByGUID[guid]; + return null; + } + public override bool Equals(object obj) + { + DataFormatReference omr = (obj as DataFormatReference); + if (omr == null) return false; + if (mvarID == Guid.Empty) + { + // do not compare ID + if (mvarTypeName == null) return false; + return mvarTypeName.Equals(omr.TypeName); + } + return mvarID.Equals(omr.ID); + } + public int CompareTo(DataFormatReference other) + { + if (mvarID == Guid.Empty) + { + // do not compare ID + if (mvarTypeName == null) + { + if (other.ID == Guid.Empty && other.TypeName == null) return 0; + return -1; + } + return mvarTypeName.CompareTo(other.TypeName); + } + return mvarID.CompareTo(other.ID); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Document.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Document.cs new file mode 100644 index 00000000..29654329 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Document.cs @@ -0,0 +1,219 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + /// + /// Represents a combination of , , and + /// that allows you to easily manipulate documents. The Accessor determines WHERE the data is read from and written + /// to, the DataFormat determines HOW the data is written, and the ObjectModel contains the actual data in a format- + /// agnostic representation. + /// + public class Document + { + private Accessor mvarInputAccessor = null; + /// + /// The which determines where the data is read from. + /// + public Accessor InputAccessor { get { return mvarInputAccessor; } set { mvarInputAccessor = value; } } + + private Accessor mvarOutputAccessor = null; + /// + /// The , which determines where the data is written to. + /// + public Accessor OutputAccessor { get { return mvarOutputAccessor; } set { mvarOutputAccessor = value; } } + + private DataFormat mvarInputDataFormat = null; + /// + /// The which determines how the data is read from the accessor. + /// + public DataFormat InputDataFormat { get { return mvarInputDataFormat; } set { mvarInputDataFormat = value; } } + + private DataFormat mvarOutputDataFormat = null; + /// + /// The which determines how the data is written to the accessor. + /// + public DataFormat OutputDataFormat { get { return mvarOutputDataFormat; } set { mvarOutputDataFormat = value; } } + + private ObjectModel mvarObjectModel = null; + /// + /// The , which stores the actual data in a format-agnostic representation. + /// + public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; } } + + /// + /// Reads data into the current from the using the + /// current . + /// + public void Load() + { + mvarInputDataFormat.Accessor = mvarInputAccessor; + mvarObjectModel.Accessor = mvarInputAccessor; + mvarInputDataFormat.Load(ref mvarObjectModel); + mvarLastUsedAccessor = LastUsedAccessor.Input; + } + /// + /// Writes the data contained in the to the using the + /// current . + /// + public void Save() + { + mvarOutputDataFormat.Accessor = mvarOutputAccessor; + mvarObjectModel.Accessor = mvarOutputAccessor; + mvarOutputDataFormat.Save(mvarObjectModel); + mvarLastUsedAccessor = LastUsedAccessor.Output; + } + + public Document(ObjectModel objectModel, DataFormat dataFormat) : this(objectModel, dataFormat, null) + { + } + public Document(ObjectModel objectModel, DataFormat dataFormat, Accessor accessor) : this(objectModel, dataFormat, dataFormat, accessor) + { + } + public Document(ObjectModel objectModel, DataFormat inputDataFormat, DataFormat outputDataFormat, Accessor accessor) : this(objectModel, inputDataFormat, outputDataFormat, accessor, accessor) + { + } + public Document(ObjectModel objectModel, DataFormat inputDataFormat, DataFormat outputDataFormat, Accessor inputAccessor, Accessor outputAccessor) + { + mvarObjectModel = objectModel; + mvarInputDataFormat = inputDataFormat; + mvarOutputDataFormat = outputDataFormat; + mvarInputAccessor = inputAccessor; + mvarOutputAccessor = outputAccessor; + } + + public static Document Load(ObjectModel objectModel, DataFormat dataFormat, Accessor accessor, bool autoClose = true, bool append = false) + { + if (!append) objectModel.Clear(); + + Document document = new Document(objectModel, dataFormat, accessor); + objectModel.Accessor = document.InputAccessor; + document.InputAccessor.Open(); + document.Load(); + if (autoClose) document.InputAccessor.Close(); + return document; + } + public static Document Save(ObjectModel objectModel, DataFormat dataFormat, Accessor accessor, bool autoClose = true) + { + Document document = new Document(objectModel, dataFormat, accessor); + objectModel.Accessor = document.OutputAccessor; + document.OutputAccessor.Open(); + document.Save(); + if (autoClose) document.OutputAccessor.Close(); + return document; + } + public static Document Convert(ObjectModel objectModel, DataFormat inputDataFormat, DataFormat outputDataFormat, Accessor inputAccessor, Accessor outputAccessor) + { + Document document = new Document(objectModel, inputDataFormat, outputDataFormat, inputAccessor, outputAccessor); + document.InputAccessor.Open(); + document.Load(); + document.InputAccessor.Close(); + + document.OutputAccessor.Open(); + document.Save(); + document.OutputAccessor.Close(); + return document; + } + + private bool mvarIsSaved = false; + /// + /// Determines whether the document has been saved or not. + /// + public bool IsSaved { get { return mvarIsSaved; } set { mvarIsSaved = value; } } + + public void Close() + { + if (mvarInputAccessor != null) + { + if (mvarInputAccessor.IsOpen) + { + mvarInputAccessor.Close(); + mvarTitle = mvarOutputAccessor.Title; + } + } + if (mvarOutputAccessor != null) + { + if (mvarOutputAccessor.IsOpen) + { + mvarOutputAccessor.Close(); + mvarTitle = mvarOutputAccessor.Title; + } + } + } + + private LastUsedAccessor mvarLastUsedAccessor = LastUsedAccessor.Input; + private String mvarTitle = String.Empty; + /// + /// The title of this . + /// + public string Title + { + get + { + if (mvarLastUsedAccessor == LastUsedAccessor.Input && mvarInputAccessor != null) + { + return mvarInputAccessor.Title; + } + else if (mvarLastUsedAccessor == LastUsedAccessor.Output && mvarOutputAccessor != null) + { + return mvarOutputAccessor.Title; + } + return mvarTitle; + } + } + + /// + /// Determines whether the content of this has changed. + /// + public bool IsChanged { get; set; } + /// + /// The last-used associated with this . + /// + public Accessor Accessor + { + get + { + switch (mvarLastUsedAccessor) + { + case LastUsedAccessor.Input: + { + return mvarInputAccessor; + } + case LastUsedAccessor.Output: + { + return mvarOutputAccessor; + } + } + return null; + } + } + /// + /// The associated with this . + /// + public DataFormat DataFormat + { + get + { + switch (mvarLastUsedAccessor) + { + case LastUsedAccessor.Input: + { + return mvarInputDataFormat; + } + case LastUsedAccessor.Output: + { + return mvarOutputDataFormat; + } + } + return null; + } + set + { + mvarInputDataFormat = value; + mvarOutputDataFormat = value; + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Endpoint.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Endpoint.cs new file mode 100644 index 00000000..40532514 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Endpoint.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + /// + /// Represents an endpoint (/ pair) that + /// defines how and where data is transferred. + /// + public class Endpoint + { + public class EndpointCollection + : System.Collections.ObjectModel.Collection + { + } + + private Accessor mvarAccessor = null; + public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; } } + + private DataFormat mvarDataFormat = null; + public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/ExtensionMethods.cs b/CSharp/V5/Libraries/UniversalEditor.Core/ExtensionMethods.cs new file mode 100644 index 00000000..384a419a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/ExtensionMethods.cs @@ -0,0 +1,799 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor +{ + public static class ExtensionMethods + { + public static bool get_EndOfStream(this System.IO.Stream stream) + { + return (stream.Position == stream.Length); + } + + /// + /// Gets an int value representing the subset of bits from a single Byte. + /// + /// The Byte used to get the subset of bits from. + /// The offset of bits starting from the right. + /// The number of bits to read. + /// + /// An int value representing the subset of bits. + /// + /// + /// Given -> b = 00110101 + /// A call to GetBits(b, 2, 4) + /// GetBits looks at the following bits in the byte -> 00{1101}00 + /// Returns 1101 as an int (13) + /// + public static int GetBits(this byte value, int offset, int count) + { + return (value >> offset) & ((1 << count) - 1); + } + public static int GetBits(this short value, int offset, int count) + { + return (value >> offset) & ((1 << count) - 1); + } + public static int GetBits(this int value, int offset, int count) + { + return (value >> offset) & ((1 << count) - 1); + } + public static int GetBits(this ushort value, int offset, int count) + { + return (value >> offset) & ((1 << count) - 1); + } + + public static void AddRange(this System.Collections.Specialized.StringCollection coll, params string[] values) + { + coll.AddRange(values); + } + + public static bool Match(this Array array1, Array array2) + { + if (array1.Length != array2.Length) + { + return false; + } + + System.Collections.IEnumerator en1 = array1.GetEnumerator(); + System.Collections.IEnumerator en2 = array2.GetEnumerator(); + + en1.MoveNext(); + en2.MoveNext(); + + try + { + while (en1.Current != null) + { + if (en2.Current == null) return false; + if (!en1.Current.Equals(en2.Current)) return false; + + en1.MoveNext(); + en2.MoveNext(); + } + } + catch (InvalidOperationException) + { + } + return true; + } + + public static bool ContainsAny(this string value, params string[] anyOf) + { + bool result; + for (int i = 0; i < anyOf.Length; i++) + { + string any = anyOf[i]; + if (value.Contains(any)) + { + result = true; + return result; + } + } + result = false; + return result; + } + public static bool ContainsAny(this string value, params char[] anyOf) + { + bool result; + for (int i = 0; i < anyOf.Length; i++) + { + char any = anyOf[i]; + if (value.Contains(any.ToString())) + { + result = true; + return result; + } + } + result = false; + return result; + } + + public static int IndexOfAny(this string value, params string[] anyOf) + { + int result; + for (int i = 0; i < anyOf.Length; i++) + { + string any = anyOf[i]; + int index = value.IndexOf(any); + if (index > -1) + { + result = index; + return result; + } + } + result = -1; + return result; + } + public static string Capitalize(this string value) + { + string result; + if (string.IsNullOrEmpty(value)) + { + result = value; + } + else + { + if (value.Length == 1) + { + result = value.ToUpper(); + } + else + { + result = value.Substring(0, 1).ToUpper() + value.Substring(1); + } + } + return result; + } + + #region Splitting + public static T[] Split(this string value, params char[] separator) + { + return value.Split(separator, -1, StringSplitOptions.None); + } + public static T[] Split(this string value, char[] separator, int count) + { + return value.Split(separator, count, StringSplitOptions.None); + } + public static T[] Split(this string value, char[] separator, int count, StringSplitOptions options) + { + string[] separators = new string[separator.Length]; + for (int i = 0; i < separator.Length; i++) + { + separators[i] = separator[i].ToString(); + } + return value.Split(separators, count, options); + } + public static T[] Split(this string value, params string[] separator) + { + return value.Split(separator, -1, StringSplitOptions.None); + } + public static T[] Split(this string value, string[] separator, int count) + { + return value.Split(separator, count, StringSplitOptions.None); + } + public static T[] Split(this string value, string[] separator, int count, StringSplitOptions options) + { + string[] splitt = null; + if (count < 0) + { + splitt = value.Split(separator, options); + } + else + { + splitt = value.Split(separator, count, options); + } + T[] values = new T[splitt.Length]; + for (int i = 0; i < splitt.Length; i++) + { + if (!string.IsNullOrEmpty(splitt[i])) + { + values[i] = (T)Convert.ChangeType(splitt[i], typeof(T)); + } + } + return values; + } + public static string[] Split(this string value, string separator) + { + return value.Split(new string[] { separator }); + } + public static string[] Split(this string value, string[] separator) + { + return value.Split(separator, StringSplitOptions.None); + } + public static string[] Split(this string value, string[] separator, string ignore) + { + return value.Split(separator, ignore, ignore); + } + public static string[] Split(this string value, string[] separator, string ignoreBegin, string ignoreEnd) + { + return value.Split(separator, ignoreBegin, ignoreEnd, StringSplitOptions.None, -1); + } + public static string[] Split(this string value, string[] separator, StringSplitOptions options, int count, string ignore) + { + return value.Split(separator, ignore, ignore, options, count); + } + public static string[] Split(this string value, char[] separator, string ignore) + { + return value.Split(separator, ignore, ignore); + } + public static string[] Split(this string value, char[] separator, string ignoreBegin, string ignoreEnd) + { + return value.Split(separator, ignoreBegin, ignoreEnd, StringSplitOptions.None, -1); + } + public static string[] Split(this string value, char[] separator, string ignore, StringSplitOptions options, int count) + { + return value.Split(separator, ignore, ignore, options, count); + } + public static string[] Split(this string value, char[] separator, string ignoreBegin, string ignoreEnd, StringSplitOptions options, int count) + { + List entries = new List(); + for (int i = 0; i < separator.Length; i++) + { + char sep = separator[i]; + entries.Add(sep.ToString()); + } + return value.Split(entries.ToArray(), ignoreBegin, ignoreEnd, options, count); + } + public static string[] Split(this string value, string[] separator, string ignoreBegin, string ignoreEnd, StringSplitOptions options, int count) + { + return value.Split(separator, ignoreBegin, ignoreEnd, options, count, true); + } + public static string[] Split(this string value, string[] separator, string ignoreBegin, string ignoreEnd, StringSplitOptions options, int count, bool discardIgnoreString) + { + List entries = new List(); + bool ignoring = false; + bool continueOutside = false; + string next = string.Empty; + int i = 0; + while (i < value.Length) + { + if (i + ignoreBegin.Length > value.Length) + { + goto IL_70; + } + if (ignoring || !(value.Substring(i, ignoreBegin.Length) == ignoreBegin)) + { + goto IL_70; + } + ignoring = true; + if (!discardIgnoreString) + { + next += ignoreBegin; + } + IL_16F: + i++; + continue; + IL_70: + if (i + ignoreEnd.Length <= value.Length) + { + if (ignoring && value.Substring(i, ignoreEnd.Length) == ignoreEnd) + { + ignoring = false; + if (!discardIgnoreString) + { + next += ignoreEnd; + } + goto IL_16F; + } + } + if (!ignoring) + { + int j = 0; + while (j < separator.Length) + { + if (i + separator[j].Length <= value.Length) + { + if (value.Substring(i, separator[j].Length) == separator[j]) + { + if (count > -1 && (entries.Count >= count - 1)) + { + next = value.Substring(i - next.Length); + entries.Add(next); + i = value.Length - 1; + break; + } + else + { + entries.Add(next); + next = string.Empty; + i += separator[j].Length - 1; + continueOutside = true; + } + } + } + + j++; + continue; + } + } + if (continueOutside) + { + continueOutside = false; + goto IL_16F; + } + next += value[i]; + goto IL_16F; + } + if (!string.IsNullOrEmpty(next)) + { + entries.Add(next); + next = null; + } + return entries.ToArray(); + } + #endregion + + #region Endianness + public static ushort SwapEndian(this ushort x) + { + return (ushort)(x >> 8 | (int)x << 8); + } + public static ushort SwapEndian(this short x) + { + return ((ushort)x).SwapEndian(); + } + public static uint SwapEndian(this uint x) + { + return x >> 24 | (x << 8 & 16711680u) | (x >> 8 & 65280u) | x << 24; + } + public static uint SwapEndian(this int x) + { + return ((uint)x).SwapEndian(); + } + public static ushort Swap(short x) + { + return x.SwapEndian(); + } + public static ushort Swap(ushort x) + { + return x.SwapEndian(); + } + public static uint Swap(int x) + { + return x.SwapEndian(); + } + public static uint Swap(uint x) + { + return x.SwapEndian(); + } + #endregion + #region Number + public static uint RoundUp(this uint number, int multiple) + { + uint result; + if ((ulong)number % (ulong)((long)multiple) == 0uL) + { + result = number; + } + else + { + result = (uint)((ulong)number + (ulong)((long)multiple - (long)((ulong)number % (ulong)((long)multiple)))); + } + return result; + } + public static int RoundUp(this int number, int multiple) + { + int result; + if (number % multiple == 0) + { + result = number; + } + else + { + result = number + (multiple - number % multiple); + } + return result; + } + public static int Digits(this int number) + { + return number.ToString().Length; + } + public static int Digits(this long number) + { + return number.ToString().Length; + } + + public static short UpperWord(this short number) + { + return (short)(number >> 16); + } + public static short LowerWord(this short number) + { + return (short)(number & 0xFFFF); + } + public static ushort UpperWord(this ushort number) + { + return (ushort)(number >> 16); + } + public static ushort LowerWord(this ushort number) + { + return (ushort)(number & 0xFFFF); + } + public static int UpperWord(this int number) + { + return (int)(number >> 16); + } + public static int LowerWord(this int number) + { + return (int)(number & 0xFFFF); + } + public static uint UpperWord(this uint number) + { + return (uint)(number >> 16); + } + public static uint LowerWord(this uint number) + { + return (uint)(number & 0xFFFF); + } + public static long UpperWord(this long number) + { + return (long)(number >> 16); + } + public static long LowerWord(this long number) + { + return (long)(number & 0xFFFF); + } + public static ulong UpperWord(this ulong number) + { + return (ulong)(number >> 16); + } + public static ulong LowerWord(this ulong number) + { + return (ulong)(number & 0xFFFF); + } + #endregion + #region StreamReader Extensions + + public static byte ReadByte(this System.IO.Stream stream, long offset) + { + stream.Position = offset; + return (byte)stream.ReadByte(); + } + public static byte[] ReadBytes(this System.IO.Stream stream, long offset, int length) + { + byte[] array = new byte[length]; + stream.Position = offset; + stream.Read(array, 0, length); + return array; + } + public static byte[] ReadBytes(this System.IO.Stream stream, long offset, uint length) + { + return stream.ReadBytes(offset, (int)length); + } + public static short ReadShort(this System.IO.Stream stream, long offset) + { + byte[] array = new byte[2]; + stream.Position = offset; + stream.Read(array, 0, 2); + return BitConverter.ToInt16(array, 0); + } + public static ushort ReadUShort(this System.IO.Stream stream, long offset) + { + byte[] array = new byte[2]; + stream.Position = offset; + stream.Read(array, 0, 2); + return BitConverter.ToUInt16(array, 0); + } + public static int ReadInt(this System.IO.Stream stream, long offset) + { + byte[] array = new byte[4]; + stream.Position = offset; + stream.Read(array, 0, 4); + return BitConverter.ToInt32(array, 0); + } + public static uint ReadUInt(this System.IO.Stream stream, long offset) + { + byte[] array = new byte[4]; + stream.Position = offset; + stream.Read(array, 0, 4); + return BitConverter.ToUInt32(array, 0); + } + public static string ReadString(this System.IO.Stream stream, long offset, int maxLength, bool nullTerminator) + { + string text = string.Empty; + stream.Position = offset; + for (int i = 0; i < maxLength; i++) + { + char c = (char)stream.ReadByte(); + if (c == '\0' && nullTerminator) + { + break; + } + text += c; + } + return text; + } + public static string ReadString(this System.IO.Stream stream, long offset, int maxLength) + { + return stream.ReadString(offset, maxLength, true); + } + public static string ReadString(this System.IO.Stream stream, long offset, int maxLength, Encoding encoding, bool nullTerminator) + { + stream.Position = offset; + byte[] array = new byte[maxLength]; + stream.Read(array, 0, maxLength); + string text = encoding.GetString(array); + if (nullTerminator) + { + string arg_2D_0 = text; + char[] trimChars = new char[1]; + text = arg_2D_0.TrimEnd(trimChars); + } + return text; + } + public static string ReadString(this System.IO.Stream stream, long offset, int maxLength, Encoding encoding) + { + return stream.ReadString(offset, maxLength, encoding, true); + } + public static byte[] ToByteArray(this System.IO.Stream stream) + { + long oldpos = stream.Position; + + byte[] array = new byte[(int)((IntPtr)stream.Length)]; + stream.Position = 0L; + stream.Read(array, 0, array.Length); + + stream.Position = oldpos; + return array; + } + #endregion + #region StreamWriter Extensions + + public static void Write(this System.IO.Stream stream, byte value) + { + stream.WriteByte(value); + } + public static void Write(this System.IO.Stream stream, short value) + { + stream.Write(BitConverter.GetBytes(value), 0, 2); + } + public static void Write(this System.IO.Stream stream, ushort value) + { + stream.Write(BitConverter.GetBytes(value), 0, 2); + } + public static void Write(this System.IO.Stream stream, int value) + { + stream.Write(BitConverter.GetBytes(value), 0, 4); + } + public static void Write(this System.IO.Stream stream, uint value) + { + stream.Write(BitConverter.GetBytes(value), 0, 4); + } + public static void Write(this System.IO.Stream stream, byte[] values) + { + stream.Write(values, 0, values.Length); + } + public static void Write(this System.IO.Stream stream, string value) + { + for (int i = 0; i < value.Length; i++) + { + stream.WriteByte((byte)value[i]); + } + } + public static void Write(this System.IO.Stream stream, string value, int length) + { + for (int i = 0; i < length; i++) + { + if (i < value.Length) + { + stream.WriteByte((byte)value[i]); + } + else + { + stream.WriteByte(0); + } + } + } + public static void Write(this System.IO.Stream stream, string value, int strLength, int length) + { + for (int i = 0; i < length; i++) + { + if (i < value.Length && i < strLength) + { + stream.WriteByte((byte)value[i]); + } + else + { + stream.WriteByte(0); + } + } + } + public static void Write(this System.IO.Stream stream, string value, int strLength, int length, Encoding encoding) + { + byte[] bytes = encoding.GetBytes(value); + int num = 0; + while (bytes.Length > strLength) + { + num++; + bytes = encoding.GetBytes(value.Substring(0, value.Length - num)); + } + for (int i = 0; i < length; i++) + { + if (i < bytes.Length && i < strLength) + { + stream.WriteByte(bytes[i]); + } + else + { + stream.WriteByte(0); + } + } + } + public static void Write(this System.IO.Stream output, System.IO.Stream input) + { + byte[] array = new byte[4096]; + input.Position = 0L; + int count; + while ((count = input.Read(array, 0, array.Length)) > 0) + { + output.Write(array, 0, count); + } + } + public static void Write(this System.IO.Stream output, System.IO.MemoryStream input) + { + input.Position = 0L; + input.WriteTo(output); + } + public static void Write(this System.IO.Stream output, System.IO.Stream input, long offset, long length) + { + byte[] array = new byte[4096]; + input.Position = offset; + int count; + while ((count = input.Read(array, 0, (input.Position + (long)array.Length > offset + length) ? ((int)(offset + length - input.Position)) : ((int)((long)array.Length)))) > 0) + { + output.Write(array, 0, count); + } + } + public static System.IO.MemoryStream Copy(this System.IO.Stream input) + { + System.IO.MemoryStream memoryStream = new System.IO.MemoryStream((int)input.Length); + byte[] array = new byte[4096]; + input.Position = 0L; + int count; + while ((count = input.Read(array, 0, array.Length)) > 0) + { + memoryStream.Write(array, 0, count); + } + return memoryStream; + } + public static System.IO.MemoryStream Copy(this System.IO.Stream input, long offset, int length) + { + System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(length); + byte[] array = new byte[4096]; + input.Position = offset; + int count; + while ((count = input.Read(array, 0, (input.Position + (long)array.Length > offset + (long)length) ? ((int)(offset + (long)length - input.Position)) : ((int)((long)array.Length)))) > 0) + { + memoryStream.Write(array, 0, count); + } + return memoryStream; + } + public static System.IO.MemoryStream Copy(this System.IO.Stream input, long offset, uint length) + { + System.IO.MemoryStream memoryStream = new System.IO.MemoryStream((int)length); + byte[] array = new byte[4096]; + input.Position = offset; + int count; + while ((count = input.Read(array, 0, (input.Position + (long)array.Length > offset + (long)((ulong)length)) ? ((int)(offset + (long)((ulong)length) - input.Position)) : ((int)((long)array.Length)))) > 0) + { + memoryStream.Write(array, 0, count); + } + return memoryStream; + } + #endregion + #region Strings + public static bool IsAllUpperCase(this string str) + { + return (!(new System.Text.RegularExpressions.Regex("[a-z]")).IsMatch(str)); + } + public static string UrlEncode(this string value) + { + return value; + } + public static string UrlDecode(this string input) + { + StringBuilder output = new StringBuilder(); + for (int i = 0; i < input.Length; i++) + { + if (input[i] == '%') + { + char c = input[i + 1]; + string arg_45_0 = c.ToString(); + c = input[i + 2]; + string numeric = arg_45_0 + c.ToString(); + int hexcode = int.Parse(numeric, System.Globalization.NumberStyles.HexNumber); + i += 2; + output.Append((char)hexcode); + } + else + { + output.Append(input[i]); + } + } + return output.ToString(); + } + public static bool Match(this string input, params string[] filters) + { + foreach (string filter in filters) + { + if (input.Match(filter)) return true; + } + return false; + } + public static bool Match(this string input, string filter) + { + string wildcardToRegex = "^" + System.Text.RegularExpressions.Regex.Escape(filter).Replace("\\*", ".*").Replace("\\?", ".") + "$"; + return new System.Text.RegularExpressions.Regex(wildcardToRegex).IsMatch(input); + } + public static string TrimNull(this string value) + { + int i = value.IndexOf('\0'); + if (i > -1) return value.Substring(0, i); + return value; + } + public static string Format(this string input, Dictionary formatWhat) + { + return Format(input, formatWhat, "$(", ")"); + } + public static string Format(this string input, Dictionary formatWhat, string formatBegin, string formatEnd) + { + string val = input; + foreach (KeyValuePair kvp in formatWhat) + { + val = val.Replace(formatBegin + kvp.Key + formatEnd, kvp.Value); + } + return val; + } + /// + /// Inserts the specified value "count" times, with "spacing" characters between. + /// + /// The number of times to insert value. + /// The amount of characters to leave between insertions. + /// The value to insert. + /// + public static string Insert(this string input, int count, int spacing, string value) + { + int j = 0; + string retval = String.Empty; + for (int i = 0; i < count; i++) + { + retval += input.Substring(j, spacing) + value; + j += spacing; + } + retval += input.Substring(j); + return retval; + } + #endregion + + #region Dictionary + public static KeyValuePair[] ToArray(this Dictionary dictionary) + { + System.Collections.Generic.List> list = new List>(); + foreach (KeyValuePair kvp in dictionary) + { + list.Add(kvp); + } + return list.ToArray(); + } + public static TValue GetValueOrDefault(this Dictionary dictionary, TKey key, TValue value = default(TValue)) + { + if (dictionary.ContainsKey(key)) + { + return dictionary[key]; + } + return value; + } + #endregion + + #region Arrays + public static void Fill(this T[] data, T value) + { + for (int i = 0; i < data.Length; i++) + { + data[i] = value; + } + } + #endregion + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/Array.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Array.cs new file mode 100644 index 00000000..4bb54493 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Array.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.IO +{ + public class Array + { + public static void Resize(ref byte[] array, int newSize) + { + byte[] newArray = new byte[newSize]; + Array.Copy(array, 0, newArray, 0, Math.Min(array.Length, newArray.Length)); + array = newArray; + } + public static void Copy(System.Array sourceArray, long sourceIndex, System.Array destinationArray, long destinationIndex, long length) + { + System.Array.Copy(sourceArray, 0, destinationArray, 0, length); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/Encoding.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Encoding.cs new file mode 100644 index 00000000..bcb47d25 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Encoding.cs @@ -0,0 +1,334 @@ +// Universal Editor input/output module for reading binary data +// Copyright (C) 2011 Mike Becker +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +namespace UniversalEditor.IO +{ + public abstract class Encoding + { + private static Encoding _Default = new DefaultEncoding(); + public static Encoding Default { get { return _Default; } } + private static Encoding _ASCII = new ASCIIEncoding(); + public static Encoding ASCII { get { return _ASCII; } } + + private static Encoding _UTF7 = new UTF7Encoding(); + public static Encoding UTF7 { get { return _UTF7; } } + private static Encoding _UTF8 = new UTF8Encoding(); + public static Encoding UTF8 { get { return _UTF8; } } + private static Encoding _UTF16LittleEndian = new UTF16LittleEndianEncoding(); + public static Encoding UTF16LittleEndian { get { return _UTF16LittleEndian; } } + private static Encoding _UTF16BigEndian = new UTF16BigEndianEncoding(); + public static Encoding UTF16BigEndian { get { return _UTF16BigEndian; } } + private static Encoding _UTF32 = new UTF32Encoding(); + public static Encoding UTF32 { get { return _UTF32; } } + + private static Encoding _ShiftJIS = new ShiftJISEncoding(); + public static Encoding ShiftJIS { get { return _ShiftJIS; } } + + private static Encoding _Windows1252 = new CodePageEncoding(1252); + public static Encoding Windows1252 { get { return _Windows1252; } } + + public byte[] GetBytes(string value) + { + return GetBytes(value.ToCharArray()); + } + public byte[] GetBytes(char[] chars) + { + return GetBytes(chars, 0, chars.Length); + } + public abstract byte[] GetBytes(char[] chars, int index, int count); + + public string GetString(byte[] bytes) + { + return GetString(bytes, 0, bytes.Length); + } + public string GetString(byte[] bytes, int index, int count) + { + char[] chars = GetChars(bytes, index, count); + string retval = new string(chars); + return retval; + } + + public char[] GetChars(byte[] bytes) + { + return GetChars(bytes, 0, bytes.Length); + } + public abstract char[] GetChars(byte[] bytes, int index, int count); + + public virtual int GetMaxByteCount(int count) + { + return count; + } + public virtual int GetMaxCharCount(int count) + { + return count; + } + public virtual int GetByteCount(char[] chars, int index, int count) + { + return 1; + } + public int GetByteCount(char value) + { + return GetByteCount(new char[] { value }, 0, 1); + } + public int GetByteCount(char[] chars) + { + return GetByteCount(chars, 0, chars.Length); + } + public int GetByteCount(string value) + { + char[] chars = value.ToCharArray(); + return GetByteCount(chars, 0, chars.Length); + } + + public static Encoding GetEncoding(int codepage) + { + return new CodePageEncoding(codepage); + } + } + public class DefaultEncoding : Encoding + { + public override byte[] GetBytes(char[] chars, int index, int count) + { + byte[] bytes = new byte[count]; + + int min = System.Math.Min(chars.Length, count); + for (int i = index; i < min + index; i++) + { + bytes[i - index] = (byte)(chars[i]); + } + return bytes; + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + char[] retval = new char[count]; + for (int i = 0; i < count; i++) + { + retval[i] = (char)bytes[i]; + } + return retval; + } + } + public class CodePageEncoding : Encoding + { + private System.Text.Encoding _encoding = null; + public CodePageEncoding(int codepage) + { + _encoding = System.Text.Encoding.GetEncoding(codepage); + } + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class ASCIIEncoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.ASCII; + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class UTF16BigEndianEncoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.BigEndianUnicode; + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class UTF16LittleEndianEncoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.Unicode; + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class UTF32Encoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.UTF32; + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class UTF7Encoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.UTF7; + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class UTF8Encoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.UTF8; + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + int maxCharCt = _encoding.GetMaxCharCount(bytes.Length); + char[] chars = new char[maxCharCt]; + int reallen = _encoding.GetDecoder().GetChars(bytes, index, count, chars, 0); + char[] realchars = new char[reallen]; + System.Array.Copy(chars, 0, realchars, 0, realchars.Length); + return realchars; + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } + public class ShiftJISEncoding : Encoding + { + private System.Text.Encoding _encoding = System.Text.Encoding.GetEncoding("shift_jis"); + + public override byte[] GetBytes(char[] chars, int index, int count) + { + return _encoding.GetBytes(chars, index, count); + } + public override char[] GetChars(byte[] bytes, int index, int count) + { + return _encoding.GetChars(bytes, index, count); + } + public override int GetMaxByteCount(int count) + { + return _encoding.GetMaxByteCount(count); + } + public override int GetMaxCharCount(int count) + { + return _encoding.GetMaxCharCount(count); + } + public override int GetByteCount(char[] chars, int index, int count) + { + return _encoding.GetByteCount(chars, index, count); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/EndOfStreamException.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/EndOfStreamException.cs new file mode 100644 index 00000000..4bbd7680 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/EndOfStreamException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.IO +{ + /// + /// The exception that is thrown when reading is attempted past the end of a stream. + /// + public class EndOfStreamException : Exception + { + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/Endianness.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Endianness.cs new file mode 100644 index 00000000..aa42ded5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Endianness.cs @@ -0,0 +1,44 @@ +// Universal Editor input/output module shared code - endianness +// Copyright (C) 2011 Mike Becker +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +namespace UniversalEditor.IO +{ + using System; + + /// + /// Represents the order of bytes in a multi-byte value (for example, , , + /// and ). + /// + public enum Endianness + { + /// + /// The bytes are stored with the least-significant byte at the lowest address, while the following bytes are + /// stored in increasing order of significance. (0x0A0B0C0D = { 0x0D, 0x0C, 0x0B, 0x0A }) + /// + LittleEndian, + /// + /// The bytes are stored with the most-significant byte at the lowest address, while the following bytes are + /// stored in decreasing order of significance. (0x0A0B0C0D = { 0x0A, 0x0B, 0x0C, 0x0D }) + /// + BigEndian, + /// + /// Little-endian except for bytes in 32-bit values which are stored with the 16-bit halves swapped. + /// + PDPEndian + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/NewLineSequence.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/NewLineSequence.cs new file mode 100644 index 00000000..49ed9920 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/NewLineSequence.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.IO +{ + public enum NewLineSequence + { + /// + /// Determines the new line sequence based on the system default (CR on Mac OS up to version 9, LF on Linux, + /// CRLF on Windows). + /// + Default = -1, + /// + /// Uses the carriage return ('\r', ^M, 0x0D) as the new line sequence. + /// + CarriageReturn = 1, + /// + /// Uses the line feed ('\n', ^J, 0x0A) as the new line sequence. + /// + LineFeed = 2, + /// + /// Uses a combination of carriage return and line feed ("\r\n", ^M^J, {0x0D, 0x0A}) as the new line sequence. + /// + CarriageReturnLineFeed = 3, + /// + /// Uses a combination of line feed and carriage return ("\n\r", ^J^M, {0x0A, 0x0D}) as the new line sequence. + /// + LineFeedCarriageReturn = 4 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/Reader.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Reader.cs new file mode 100644 index 00000000..7a5bf67e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Reader.cs @@ -0,0 +1,1464 @@ +// Universal Editor input/output module for reading binary data +// Copyright (C) 2011 Mike Becker +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace UniversalEditor.IO +{ + // [DebuggerNonUserCode()] + public class Reader : ReaderWriterBase + { + public Reader(Accessor input) + : base(input) + { + } + + public void Read(byte[] buffer, int start, int length) + { + base.Accessor.ReadInternal(buffer, start, length); + } + + public bool ReadBoolean() + { + return (ReadBytes(1)[0] != 0); + } + + public byte ReadByte() + { + return ReadBytes(1)[0]; + } + + string charBuffer = null; + int charBufferIndex = 0; + + public char ReadChar() + { + charBuffer = null; + if (charBuffer == null) + { + int maxByteCount = base.Accessor.DefaultEncoding.GetMaxByteCount(1); + byte[] bytes = PeekBytes(maxByteCount); + charBuffer = base.Accessor.DefaultEncoding.GetString(bytes); + charBufferIndex = 0; + } + + char c = charBuffer[charBufferIndex]; + charBufferIndex++; + + int ct = base.Accessor.DefaultEncoding.GetByteCount(c); + Seek(ct, SeekOrigin.Current); + + if (charBufferIndex + 1 > charBuffer.Length) + { + charBuffer = null; + } + return c; + } + public byte PeekByte() + { + byte b = ReadByte(); + base.Accessor.Seek(-1, SeekOrigin.Current); + return b; + } + public byte[] PeekBytes(int length) + { + byte[] buffer = new byte[length]; + int len = base.Accessor.ReadInternal(buffer, 0, length); + base.Accessor.Seek(-len, SeekOrigin.Current); + return buffer; + } + public char PeekChar() + { + return (char)PeekByte(); + } + public sbyte ReadSByte() + { + return (sbyte)(ReadBytes(1)[0]); + } + public byte[] ReadBytes (uint length) + { + byte[] buf = new byte[length]; + uint lastct = 0; + while (lastct < length) + { + int ct = (int)length; + byte[] buf2 = new byte[ct]; + Read(buf2, 0, ct); + + Array.Copy (buf2, 0, buf, lastct, buf2.Length); + lastct += (uint)ct; + } + return buf; + } + + public byte[] ReadBytes(ulong length) + { + byte[] buf = new byte[length]; + for (ulong i = 0L; i < length; i += (ulong) 1L) + { + buf[(int)i] = ReadByte(); + } + return buf; + } + + [DebuggerNonUserCode()] + public byte[] ReadBytes(long length) + { + byte[] buffer = new byte[length]; + base.Accessor.ReadInternal(buffer, 0, (int)length); + return buffer; + } + + public int ReadCompactInt32() + { + int multiplier = 1; + byte b1 = this.ReadByte(); + if ((b1 & 0x80) == 1) + { + multiplier = -1; + } + if ((b1 & 0x40) == 1) + { + byte b2 = this.ReadByte(); + if ((b2 & 0x80) == 1) + { + byte b3 = this.ReadByte(); + if ((b2 & 0x80) == 1) + { + byte b4 = this.ReadByte(); + return (multiplier * (((b1 | (b2 << 8)) | (b3 << 0x10)) | (b4 << 0x18))); + } + return (multiplier * ((b1 | (b2 << 8)) | (b3 << 0x10))); + } + return (multiplier * (b1 | (b2 << 8))); + } + return (multiplier * b1); + } + + public DateTime ReadISO9660DateTime () + { + string year = ReadFixedLengthString (4); + int nYear = int.Parse (year); + + string month = ReadFixedLengthString (2); + int nMonth = int.Parse (month); + + string day = ReadFixedLengthString (2); + int nDay = int.Parse (day); + + string hour = ReadFixedLengthString (2); + int nHour = int.Parse (hour); + + string minute = ReadFixedLengthString (2); + int nMinute = int.Parse (minute); + + string second = ReadFixedLengthString (2); + int nSecond = int.Parse (second); + + string secondHundredths = ReadFixedLengthString (2); + int nSecondHundredths = int.Parse (secondHundredths); + + // offset from Greenwich Mean Time, in 15-minute intervals, + // as a twos complement signed number, positive for time + // zones east of Greenwich, and negative for time zones + // west of Greenwich + sbyte gmtOffset = ReadSByte (); + + return new DateTime (nYear, nMonth, nDay, nHour + gmtOffset, nMinute, nSecond, nSecondHundredths, DateTimeKind.Utc); + } + + protected internal int Read7BitEncodedInt() + { + int num = 0; + int num2 = 0; + while (num2 != 35) + { + byte b = ReadByte(); + num |= (int)(b & 127) << num2; + num2 += 7; + if ((b & 128) == 0) + { + return num; + } + } + throw new ArgumentOutOfRangeException("Invalid 7-bit encoded Int32"); + } + + public string ReadLengthPrefixedString() + { + int num = 0; + int num2 = Read7BitEncodedInt(); + if (num2 < 0) throw new ArgumentOutOfRangeException("invalid string length"); + if (num2 == 0) return String.Empty; + + int count = (num2 - num > 128) ? 128 : (num2 - num); + return ReadFixedLengthString(count); + } + + public string ReadFixedLengthString(byte length) + { + return this.ReadFixedLengthString(length, base.Accessor.DefaultEncoding); + } + + public string ReadFixedLengthString(int length) + { + return ReadFixedLengthString(length, base.Accessor.DefaultEncoding); + } + + public string ReadFixedLengthString(uint length) + { + return this.ReadFixedLengthString(length, base.Accessor.DefaultEncoding); + } + + public string ReadFixedLengthString(byte length, Encoding encoding) + { + return this.ReadFixedLengthString((int) length, encoding); + } + + public string ReadFixedLengthString(int length, Encoding encoding) + { + byte[] id = ReadBytes(length); + return encoding.GetString(id); + } + + public string ReadFixedLengthString(uint length, Encoding encoding) + { + int l1 = (int) length; + int l2 = ((int)(length - l1)); + byte[] id = ReadBytes(l1); + if (l2 > 0) + { + Array.Resize(ref id, id.Length + l2); + Array.Copy(ReadBytes(l2), 0, id, id.Length - l2, l2); + } + return encoding.GetString(id); + } + public string ReadFixedLengthString(long length) + { + return ReadFixedLengthString(length, base.Accessor.DefaultEncoding); + } + public string ReadFixedLengthString(long length, Encoding encoding) + { + return encoding.GetString(ReadBytes((ulong)length)); + } + + /// + /// Reads a 16-byte (128-bit) GUID value from the stream. + /// + /// + public Guid ReadGuid() + { + uint a = 0; + ushort b = 0; + ushort c = 0; + byte d = 0; + byte e = 0; + byte f = 0; + byte g = 0; + byte h = 0; + byte i = 0; + byte j = 0; + byte k = 0; + if (!this.Reverse) + { + a = ReadUInt32(); + b = ReadUInt16(); + c = ReadUInt16(); + d = ReadByte(); + e = ReadByte(); + f = ReadByte(); + g = ReadByte(); + h = ReadByte(); + i = ReadByte(); + j = ReadByte(); + k = ReadByte(); + } + else + { + k = ReadByte(); + j = ReadByte(); + i = ReadByte(); + h = ReadByte(); + g = ReadByte(); + f = ReadByte(); + e = ReadByte(); + d = ReadByte(); + c = ReadUInt16(); + b = ReadUInt16(); + a = ReadUInt32(); + } + return new Guid(a, b, c, d, e, f, g, h, i, j, k); + } + public Guid[] ReadGuidArray(int count) + { + Guid[] retval = new Guid[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadGuid(); + } + return retval; + } + + public short ReadInt16() + { + byte[] buffer = ReadBytes((uint)2); + byte[] _buffer = new byte[2]; + if (base.Endianness == Endianness.LittleEndian) + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + } + else if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[1]; + _buffer[1] = buffer[0]; + } + return BitConverter.ToInt16(_buffer, 0); + } + public short[] ReadInt16Array(int count) + { + short[] retval = new short[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadInt16(); + } + return retval; + } + + public int ReadInt24() + { + byte[] buffer = ReadBytes((uint)3); + byte[] _buffer = new byte[3]; + if (base.Endianness == Endianness.LittleEndian) + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = 0; + } + else if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = 0; + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + } + return BitConverter.ToInt32(_buffer, 0); + } + public int[] ReadInt24Array(int count) + { + int[] retval = new int[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadInt24(); + } + return retval; + } + + public int ReadInt32() + { + byte[] buffer = ReadBytes((uint)4); + byte[] _buffer = new byte[4]; + if (base.Endianness == Endianness.LittleEndian) + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[3]; + } + else if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[3]; + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + } + return BitConverter.ToInt32(_buffer, 0); + } + public int[] ReadInt32Array(int count) + { + int[] retval = new int[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadInt32(); + } + return retval; + } + + public long ReadInt64() + { + byte[] buffer = ReadBytes((uint)8); + byte[] _buffer = new byte[8]; + if (base.Endianness == Endianness.LittleEndian) + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[3]; + _buffer[4] = buffer[4]; + _buffer[5] = buffer[5]; + _buffer[6] = buffer[6]; + _buffer[7] = buffer[7]; + } + else if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[7]; + _buffer[1] = buffer[6]; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + } + return BitConverter.ToInt64(_buffer, 0); + } + public long[] ReadInt64Array(int count) + { + long[] retval = new long[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadInt64(); + } + return retval; + } + + public float ReadSingle() + { + byte[] buffer = ReadBytes((uint)4); + byte[] _buffer = new byte[4]; + if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[3]; + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + } + else + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[3]; + } + return BitConverter.ToSingle(_buffer, 0); + } + public float[] ReadSingleArray(int count) + { + float[] retval = new float[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadSingle(); + } + return retval; + } + + public double ReadDouble() + { + byte[] buffer = ReadBytes((uint)8); + byte[] _buffer = new byte[8]; + if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[7]; + _buffer[1] = buffer[6]; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + } + else + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[3]; + _buffer[4] = buffer[4]; + _buffer[5] = buffer[5]; + _buffer[6] = buffer[6]; + _buffer[7] = buffer[7]; + } + return BitConverter.ToDouble(_buffer, 0); + } + public double[] ReadDoubleArray(int count) + { + double[] retval = new double[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadDouble(); + } + return retval; + } + + public ushort ReadUInt16 () + { + byte[] buffer = ReadBytes(2); + if (base.Endianness == Endianness.LittleEndian) + { + return (ushort)(buffer[0] | (buffer[1] << 8)); + } + return (ushort)(buffer[1] | (buffer[0] << 8)); + } + public ushort[] ReadUInt16Array(int count) + { + ushort[] retval = new ushort[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadUInt16(); + } + return retval; + } + + public uint ReadUInt24() + { + // TODO: Test this out! + byte[] buffer = ReadBytes(3); + if (base.Endianness == Endianness.LittleEndian) + { + return (uint)((buffer[2] << 16) | (buffer[1] << 8) | (buffer[0])); + } + return (uint)((buffer[2]) | (buffer[1] << 8) | (buffer[0] << 16)); + } + public uint[] ReadUInt24Array(int count) + { + uint[] retval = new uint[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadUInt24(); + } + return retval; + } + + public uint ReadUInt32() + { + byte[] buffer = ReadBytes((uint)4); + if (base.Endianness == Endianness.LittleEndian) + { + return (uint)(((buffer[0] | (buffer[1] << 8)) | (buffer[2] << 0x10)) | (buffer[3] << 0x18)); + } + return (uint)(((buffer[3] | (buffer[2] << 8)) | (buffer[1] << 0x10)) | (buffer[0] << 0x18)); + } + public uint[] ReadUInt32Array(int count) + { + uint[] retval = new uint[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadUInt32(); + } + return retval; + } + public uint PeekUInt32() + { + uint value = ReadUInt32(); + Seek(-4, SeekOrigin.Current); + return value; + } + + public int ReadVariableLengthInt32() + { + int value = ReadByte(); + byte c = 0; + + if ((value & 0x80) == 0x80) + { + value &= 0x7F; + do + { + value = (value << 7) + ((c = ReadByte()) & 0x7F); + } + while ((c & 0x80) == 0x80); + } + + return value; + } + public int[] ReadVariableLengthInt32Array(int count) + { + int[] retval = new int[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadVariableLengthInt32(); + } + return retval; + } + + public ulong ReadUInt48() + { + byte[] buffer = ReadBytes((uint)6); + if (base.Endianness == Endianness.LittleEndian) + { + uint num = (uint)(((buffer[0] << 0x10)) | (buffer[1] << 0x18)); + uint num2 = (uint)(((buffer[2] | (buffer[3] << 8)) | (buffer[4] << 0x10)) | (buffer[5] << 0x18)); + return (ulong)(num | num2 << 0x20); + } + else + { + uint num = (uint)(((buffer[5] << 0x10)) | (buffer[4] << 0x18)); + uint num2 = (uint)(((buffer[3] | (buffer[2] << 8)) | (buffer[1] << 0x10)) | (buffer[0] << 0x18)); + return (ulong)(num << 0x20 | num2); + } + } + public ulong[] ReadUInt48Array(int count) + { + ulong[] retval = new ulong[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadUInt48(); + } + return retval; + } + + public ulong ReadUInt64() + { + byte[] buffer = ReadBytes((uint)8); + if (base.Endianness == Endianness.LittleEndian) + { + uint num = (uint)(((buffer[0] | (buffer[1] << 8)) | (buffer[2] << 0x10)) | (buffer[3] << 0x18)); + uint num2 = (uint)(((buffer[4] | (buffer[5] << 8)) | (buffer[6] << 0x10)) | (buffer[7] << 0x18)); + return (ulong)(num << 0x20 | num2); + } + else if (base.Endianness == Endianness.BigEndian) + { + uint num = (uint)(((buffer[7] | (buffer[6] << 8)) | (buffer[5] << 0x10)) | (buffer[4] << 0x18)); + uint num2 = (uint)(((buffer[3] | (buffer[2] << 8)) | (buffer[1] << 0x10)) | (buffer[0] << 0x18)); + return (ulong)(num << 0x20 | num2); + } + throw new InvalidOperationException(); + } + public ulong[] ReadUInt64Array(int count) + { + ulong[] retval = new ulong[count]; + for (int i = 0; i < count; i++) + { + retval[i] = ReadUInt64(); + } + return retval; + } + + public string ReadNullTerminatedString() + { + return this.ReadNullTerminatedString(base.Accessor.DefaultEncoding); + } + + public string ReadNullTerminatedString(int maxLength) + { + return this.ReadNullTerminatedString(maxLength, base.Accessor.DefaultEncoding); + } + + public string ReadNullTerminatedString(Encoding encoding) + { + List r = new List(); + while (true) + { + byte nextChar = ReadByte(); + if (nextChar == 0) + { + string result = encoding.GetString(r.ToArray()); + return result; + } + r.Add(nextChar); + } + } + + public string ReadNullTerminatedString(int maxLength, Encoding encoding) + { + string ret = this.ReadNullTerminatedString(encoding); + if (ret.Length > maxLength) + { + return ret.Substring(0, maxLength); + } + if (ret.Length < maxLength) + { + ReadBytes((maxLength - ret.Length) - 1); + } + return ret; + } + + /// + /// Reads a length-prefixed string that is prefixed with a short (2-byte) length, rather than an int (4-byte) length. + /// + /// + public string ReadInt16String() + { + short length = ReadInt16(); + return this.ReadFixedLengthString((int)length); + } + + public string ReadUInt16String() + { + ushort length = ReadUInt16(); + return this.ReadFixedLengthString((uint)length); + } + + public byte[] ReadToEnd() + { + return ReadBytes(base.Accessor.Remaining); + } + public string ReadStringToEnd(Encoding encoding = null) + { + if (encoding == null) encoding = Encoding.Default; + byte[] data = ReadToEnd(); + return encoding.GetString(data); + } + + public byte[] ReadUntil(byte[] sequence) + { + return ReadUntil(sequence, false); + } + public byte[] ReadUntil(byte[] sequence, bool includeSequence) + { + byte[] w = new byte[0]; + while (!EndOfStream) + { + Array.Resize(ref w, w.Length + 1); + w[w.Length - 1] = ReadByte(); + + bool matches = true; + for (int i = 0; i < sequence.Length; i++) + { + if (w.Length < sequence.Length) + { + matches = false; + break; + } + if (w[w.Length - (sequence.Length - i)] != sequence[i]) + { + matches = false; + break; + } + } + + if (matches) + { + if (!includeSequence) + { + Array.Resize(ref w, w.Length - sequence.Length); + Seek(-sequence.Length, SeekOrigin.Current); + } + return w; + } + } + return w; + } + public string ReadUntil(string sequence) + { + return ReadUntil(sequence, base.Accessor.DefaultEncoding); + } + public byte[] ReadUntil(string sequence, bool includeSequence) + { + return ReadUntil(sequence, base.Accessor.DefaultEncoding, includeSequence); + } + public string ReadUntil(string sequence, Encoding encoding) + { + return encoding.GetString(ReadUntil(sequence.ToCharArray(), encoding)); + } + public byte[] ReadUntil(string sequence, Encoding encoding, bool includeSequence) + { + return ReadUntil(sequence.ToCharArray(), encoding, includeSequence); + } + public byte[] ReadUntil(char[] sequence) + { + return this.ReadUntil(sequence, base.Accessor.DefaultEncoding); + } + public byte[] ReadUntil(char[] sequence, bool includeSequence) + { + return this.ReadUntil(sequence, base.Accessor.DefaultEncoding, includeSequence); + } + public byte[] ReadUntil(char[] sequence, Encoding encoding) + { + return this.ReadUntil(encoding.GetBytes(sequence)); + } + public byte[] ReadUntil(char[] sequence, Encoding encoding, bool includeSequence) + { + return this.ReadUntil(encoding.GetBytes(sequence), includeSequence); + } + public string ReadStringUntil(string sequence) + { + return ReadStringUntil(sequence, base.Accessor.DefaultEncoding, base.Accessor.DefaultEncoding); + } + public string ReadStringUntil(string sequence, bool includeSequence) + { + return ReadStringUntil(sequence, base.Accessor.DefaultEncoding, base.Accessor.DefaultEncoding, includeSequence); + } + public string ReadStringUntil(string sequence, Encoding inputEncoding, Encoding outputEncoding) + { + return ReadStringUntil(sequence.ToCharArray(), inputEncoding, outputEncoding); + } + public string ReadStringUntil(string sequence, Encoding inputEncoding, Encoding outputEncoding, bool includeSequence) + { + return ReadStringUntil(sequence.ToCharArray(), inputEncoding, outputEncoding, includeSequence); + } + public string ReadStringUntil(char[] sequence) + { + return ReadStringUntil(sequence, base.Accessor.DefaultEncoding, base.Accessor.DefaultEncoding); + } + public string ReadStringUntil(char[] sequence, bool includeSequence) + { + return ReadStringUntil(sequence, base.Accessor.DefaultEncoding, base.Accessor.DefaultEncoding, includeSequence); + } + public string ReadStringUntil(char[] sequence, Encoding inputEncoding, Encoding outputEncoding) + { + byte[] bytes = ReadUntil(inputEncoding.GetBytes(sequence)); + return outputEncoding.GetString(bytes); + } + public string ReadStringUntil(char[] sequence, Encoding inputEncoding, Encoding outputEncoding, bool includeSequence) + { + return outputEncoding.GetString(ReadUntil(inputEncoding.GetBytes(sequence), includeSequence)); + } + + public void SeekUntilFirstNonNull() + { + while (PeekByte() == 0) + { + ReadChar(); + } + } + + public string[] ReadNullTerminatedStringArray(int stringTableSize) + { + System.Collections.Generic.List list = new System.Collections.Generic.List(); + while (base.Accessor.Remaining < stringTableSize) + { + list.Add(ReadNullTerminatedString()); + } + return list.ToArray(); + } + + public DateTime ReadDateTime() + { + return ReadDateTime64(); + } + public DateTime ReadDateTime64() + { + long l = ReadInt64 (); + return DateTime.FromBinary(l); + } + public DateTime ReadDateTime32() + { + int l = ReadInt32(); + return DateTime.FromBinary(l); + } + + // TODO: TEST THIS!! + public decimal ReadDecimal() + { + byte[] buffer = ReadBytes(16); + int num = (int)buffer[0] | (int)buffer[1] << 8 | (int)buffer[2] << 16 | (int)buffer[3] << 24; + int num2 = (int)buffer[4] | (int)buffer[5] << 8 | (int)buffer[6] << 16 | (int)buffer[7] << 24; + int num3 = (int)buffer[8] | (int)buffer[9] << 8 | (int)buffer[10] << 16 | (int)buffer[11] << 24; + int flags = (int)buffer[12] | (int)buffer[13] << 8 | (int)buffer[14] << 16 | (int)buffer[15] << 24; + + bool isNegative = ((flags & -2147483648) == -2147483648); + byte scale = (byte)(flags >> 16); + + if ((flags & 2130771967) == 0 && (flags & 16711680) <= 1835008) + { + return new Decimal(num, num2, num3, isNegative, scale); + } + throw new ArgumentOutOfRangeException("Invalid decimal"); + } + + public string ReadByteSizedString() + { + byte len = ReadByte(); + return ReadFixedLengthString(len); + } + + public short ReadDoubleEndianInt16() + { + short value1 = ReadInt16(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + short value2 = ReadInt16(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + + if (value2 != value1) + { + throw new InvalidOperationException("Big-endian value does not match little-endian value"); + } + return value1; + } + public ushort ReadDoubleEndianUInt16() + { + ushort value1 = ReadUInt16(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + ushort value2 = ReadUInt16(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + + if (value2 != value1) + { + throw new InvalidOperationException("Big-endian value does not match little-endian value"); + } + return value1; + } + public int ReadDoubleEndianInt32() + { + int value1 = ReadInt32(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + int value2 = ReadInt32(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + + if (value2 != value1) + { + throw new InvalidOperationException("Big-endian value does not match little-endian value"); + } + return value1; + } + public uint ReadDoubleEndianUInt32() + { + uint value1 = ReadUInt32(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + uint value2 = ReadUInt32(); + if (base.Endianness == Endianness.LittleEndian) + { + base.Endianness = Endianness.BigEndian; + } + else + { + base.Endianness = Endianness.LittleEndian; + } + + if (value2 != value1) + { + throw new InvalidOperationException("Big-endian value does not match little-endian value"); + } + return value1; + } + + private int ToInt32(byte[] buffer) + { + int ret = 0; + int mode = 0; + for (int i = 0; i < Math.Min(4, buffer.Length); i++) + { + ret |= (buffer[i] << mode); + mode += 8; + } + return ret; + } + + public int ReadCompactInt32New() + { + byte[] buffer = new byte[2]; + int start = 0; + int length = buffer.Length; + while (true) + { + Read(buffer, start, length); + if (buffer[buffer.Length - 1] == 0 || (buffer.Length > 4)) + { + return ToInt32(buffer); + } + else + { + start = buffer.Length; + length = 1; + Array.Resize(ref buffer, buffer.Length + 1); + } + } + } + + public object ReadBEncodedObject() + { + char w = (char)PeekChar(); + switch (w) + { + case 'd': + { + // Read the starting 'd' + w = ReadChar(); + + Dictionary dict = new Dictionary(); + while (w != 'e') + { + string key = (string)ReadBEncodedObject(); + object value = ReadBEncodedObject(); + w = (char)PeekChar(); + dict.Add(key, value); + } + + // Read the final 'e' + w = ReadChar(); + + return dict; + } + case 'l': + { + // Read the starting 'l' + w = ReadChar(); + + List list = new List(); + while (w != 'e') + { + object item = ReadBEncodedObject(); + w = (char)PeekChar(); + + list.Add(item); + } + + // Read the final 'e' + w = ReadChar(); + return list; + } + case 'i': + { + // Read the starting 'i' + w = ReadChar(); + string num = String.Empty; + while (w != 'e') + { + w = ReadChar(); + if (w != 'e') + { + num += w; + } + } + // Already read the final 'e' + + return Int32.Parse(num); + } + default: + { + // Assume a string + w = (char)PeekChar(); + string num = String.Empty; + string val = String.Empty; + while (w != ':') + { + w = ReadChar(); + if (w != ':') + { + num += w; + } + } + + uint nnum = UInt32.Parse(num); + val = ReadFixedLengthString(nnum); + + return val; + } + } + } + /// + /// Reads a 32-bit integer length-prefixed string using the system default encoding. + /// + /// + /// + public string ReadInt32String() + { + return ReadInt32String(base.Accessor.DefaultEncoding); + } + /// + /// Reads a 32-bit integer length-prefixed string using the specified encoding. + /// + /// + /// + public string ReadInt32String(Encoding encoding) + { + int length = ReadInt32(); + return ReadFixedLengthString(length); + } + + public Version ReadVersion() + { + byte parts = ReadByte(); + switch (parts) + { + case 1: + { + int vmaj = ReadInt32(); + return new Version(vmaj, 0); + } + case 2: + { + int vmaj = ReadInt32(); + int vmin = ReadInt32(); + return new Version(vmaj, vmin); + } + case 3: + { + int vmaj = ReadInt32(); + int vmin = ReadInt32(); + int vbld = ReadInt32(); + return new Version(vmaj, vmin, vbld); + } + case 4: + { + int vmaj = ReadInt32(); + int vmin = ReadInt32(); + int vbld = ReadInt32(); + int vrev = ReadInt32(); + + if (vbld > -1) + { + if (vrev > -1) + { + return new Version(vmaj, vmin, vbld, vrev); + } + else + { + return new Version(vmaj, vmin, vbld); + } + } + else + { + return new Version(vmaj, vmin); + } + } + } + return new Version(); + } + + public void SeekUntil(string find) + { + SeekUntil(find, base.Accessor.DefaultEncoding); + } + public void SeekUntil(string find, Encoding encoding) + { + byte[] data = encoding.GetBytes(find); + byte[] dataCmp = new byte[data.Length]; + while (base.Accessor.Position <= (base.Accessor.Length - data.Length)) + { + long rest = base.Accessor.Remaining; + + base.Accessor.ReadInternal(dataCmp, 0, dataCmp.Length); + base.Accessor.Seek(-(dataCmp.Length - 1), SeekOrigin.Current); + + bool bad = false; + for (int i = 0; i < data.Length; i++) + { + if (dataCmp[i] != data[i]) + { + bad = true; + break; + } + } + if (!bad) + { + base.Accessor.Seek(-1, SeekOrigin.Current); + break; + } + } + } + + private short[] ReadInt16ArrayWTF(int count) + { + byte[] buffer = new byte[count * 2]; + Read(buffer, 0, buffer.Length); + + short[] buffer2 = new short[count]; + for (int i = 0; i < buffer.Length; i += 2) + { + byte b1 = buffer[i]; + byte b2 = buffer[i + 1]; + int index = (int)(i / 2); + + if (base.Endianness == Endianness.LittleEndian) + { + buffer2[index] = (short)(b1 | (b2 << 8)); + } + else if (base.Endianness == Endianness.BigEndian) + { + buffer2[index] = (short)(b2 | (b1 << 8)); + } + } + return buffer2; + } + + /// + /// Aligns the to the specified number of bytes. If the current + /// position of the is not a multiple of the specified number of bytes, + /// the position will be increased by the amount of bytes necessary to bring it to the + /// aligned position. + /// + /// The number of bytes on which to align the . + /// Any additional padding bytes that should be included after aligning to the specified boundary. + public void Align(int alignTo, int extraPadding = 0) + { + long paddingCount = ((alignTo - (base.Accessor.Position % alignTo)) % alignTo); + paddingCount += extraPadding; + base.Accessor.Position += paddingCount; + } + + public string PeekFixedLengthString(int count) + { + return PeekFixedLengthString(count, base.Accessor.DefaultEncoding); + } + public string PeekFixedLengthString(int count, Encoding encoding) + { + byte[] data = PeekBytes(count); + return encoding.GetString(data); + } + + /// + /// Reads a half (2 bytes/half instead of 4 bytes/single) as a floating-point value. + /// + /// + public float ReadHalf() + { + byte[] buffer = ReadBytes(2); + byte[] buffer2 = new byte[4]; + if (base.Endianness == Endianness.LittleEndian) + { + buffer2[0] = 0; + buffer2[1] = 0; + buffer2[2] = buffer[0]; + buffer2[3] = buffer[1]; + } + else + { + buffer2[0] = buffer[0]; + buffer2[1] = buffer[1]; + buffer2[2] = 0; + buffer2[3] = 0; + } + return BitConverter.ToSingle(buffer2, 0); + } + + public int ReadAtMostBytes(byte[] buffer, int count) + { + if (base.Accessor.Remaining == 0) return 0; + + if (count < base.Accessor.Remaining) + { + Read(buffer, 0, count); + return count; + } + else + { + Read(buffer, 0, (int)base.Accessor.Remaining); + return (int)base.Accessor.Remaining; + } + } + + private byte[] read_buf = new byte[4096]; + private int getbit_buf = 0; + private int getbit_len = 0; + private int getbit_count = 0; + private int getbit_mask = 0; + + public int ReadBitsAsInt32(int count) + { + int i, x = 0; + + for (i = 0 ; i < count; i++) + { + if ( getbit_mask == 0 ) + { + if (getbit_len == getbit_count) + { + getbit_len = ReadAtMostBytes(read_buf, 4096); + if (getbit_len == 0) throw new EndOfStreamException(); + getbit_count = 0; + } + + getbit_buf = read_buf[getbit_count++]; + getbit_mask = 128; + } + x <<= 1; + if ((getbit_buf & getbit_mask) != 0) x |= 1; + getbit_mask >>= 1; + } + return x; + } + + public bool EndOfStream { get { return base.Accessor.Remaining == 0; } } + + public string ReadInt64String() + { + long length = ReadInt64(); + string value = ReadFixedLengthString(length); + return value; + } + + public string ReadUntil(string[] until) + { + return ReadUntil(until, null, null); + } + public string ReadUntil(string until, string ignoreBegin, string ignoreEnd) + { + return ReadUntil(new string[] { until }, ignoreBegin, ignoreEnd); + } + public string ReadUntil(string[] until, string ignoreBegin, string ignoreEnd) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + + while (!EndOfStream) + { + sb.Append(ReadChar()); + + foreach (string s in until) + { + if (sb.ToString().EndsWith(s)) + { + string w = sb.ToString(); + return w.Substring(0, w.Length - 1); + } + } + + /* + char[] buffer = new char[until.Length * 2]; + ReadBlock(buffer, 0, until.Length * 2); + + string w = new string(buffer); + if (w.Contains(until)) + { + string ww = w.Substring(0, w.IndexOf(until)); + sb.Append(ww); + + // back up the stream reader + int indexOfUntil = (w.IndexOf(until) + until.Length); + int lengthToBackUp = w.Length - indexOfUntil; + BaseStream.Seek(-1 * lengthToBackUp, SeekOrigin.Current); + break; + } + sb.Append(w); + */ + } + return sb.ToString(); + } + + public string ReadBetween(string start, string end, bool discard) + { + string nextstr = String.Empty; + bool inside = false; + // 0000000-3842-17774-}ehaomfd + while (!EndOfStream) + { + nextstr += ReadChar(); + if (!inside) + { + if (nextstr.EndsWith(start)) + { + inside = true; + nextstr = String.Empty; + if (!discard) nextstr += start; + } + } + else + { + if (nextstr.EndsWith(end)) + { + if (discard) + { + nextstr = nextstr.Substring(0, nextstr.Length - end.Length); + } + return nextstr; + } + } + } + return String.Empty; + } + + public string ReadLine() + { + string line = ReadUntil(GetNewLineSequence()); + ReadBytes(GetNewLineSequence().Length); + return line; + } + + public void Seek(int length, SeekOrigin origin) + { + base.Accessor.Seek(length, origin); + } + public void Seek(long length, SeekOrigin origin) + { + base.Accessor.Seek(length, origin); + } + + public void Close() + { + base.Accessor.Close(); + } + + public long Remaining { get { return base.Accessor.Remaining; } } + + public string ReadStringUntilAny(char[] anyOf) + { + StringBuilder sb = new StringBuilder(); + while (!EndOfStream) + { + char c = ReadChar(); + bool found = false; + for (int i = 0; i < anyOf.Length; i++) + { + if (c == anyOf[i]) + { + found = true; + break; + } + } + if (found) break; + sb.Append(c); + } + Seek(-1, SeekOrigin.Current); + return sb.ToString(); + } + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/ReaderWriterBase.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/ReaderWriterBase.cs new file mode 100644 index 00000000..12c1e341 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/ReaderWriterBase.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.IO +{ + public abstract class ReaderWriterBase + { + private Endianness mvarEndianness = Endianness.LittleEndian; + public Endianness Endianness { get { return mvarEndianness; } set { mvarEndianness = value; } } + + public void SwapEndianness() + { + if (mvarEndianness == Endianness.LittleEndian) + { + mvarEndianness = Endianness.BigEndian; + } + else + { + mvarEndianness = Endianness.LittleEndian; + } + } + + private bool mvarReverse = false; + public bool Reverse { get { return mvarReverse; } } + + private Accessor mvarAccessor = null; + public Accessor Accessor { get { return mvarAccessor; } } + + private NewLineSequence mvarNewLineSequence = NewLineSequence.Default; + public NewLineSequence NewLineSequence { get { return mvarNewLineSequence; } set { mvarNewLineSequence = value; } } + public string GetNewLineSequence() + { + string newline = System.Environment.NewLine; + switch (mvarNewLineSequence) + { + case IO.NewLineSequence.CarriageReturn: + { + newline = "\r"; + break; + } + case IO.NewLineSequence.LineFeed: + { + newline = "\n"; + break; + } + case IO.NewLineSequence.CarriageReturnLineFeed: + { + newline = "\r\n"; + break; + } + case IO.NewLineSequence.LineFeedCarriageReturn: + { + newline = "\n\r"; + break; + } + } + return newline; + } + + public ReaderWriterBase(Accessor accessor) + { + this.mvarAccessor = accessor; + this.mvarEndianness = Endianness.LittleEndian; + this.mvarReverse = false; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/SeekOrigin.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/SeekOrigin.cs new file mode 100644 index 00000000..ec9e8da5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/SeekOrigin.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.IO +{ + /// + /// Provides various options for determining where seeking within a stream should start. + /// + public enum SeekOrigin + { + /// + /// Indicates that seeking should start from the beginning of a stream. + /// + Begin = 0, + /// + /// Indicates that seeking should start from the current position within a stream. + /// + Current = 1, + /// + /// Indicates that seeking should start from the end of a stream. This usually necessiates that the amount + /// be specified as a negative value. + /// + End = 2 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/IO/Writer.cs b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Writer.cs new file mode 100644 index 00000000..07ff2e07 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/IO/Writer.cs @@ -0,0 +1,712 @@ +// Universal Editor input/output module for writing binary data +// Copyright (C) 2011 Mike Becker +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +using System; + +namespace UniversalEditor.IO +{ + public class Writer : ReaderWriterBase + { + + public Writer(Accessor accessor) + : base(accessor) + { + } + + public void Write(byte[] buffer, int start, int count) + { + base.Accessor.WriteInternal(buffer, start, count); + } + + public void WriteBoolean(bool value) + { + WriteByte(value ? (byte)1 : (byte)0); + } + public void WriteByte(byte value) + { + WriteBytes(new byte[] { value }); + } + public void WriteSByte(sbyte value) + { + WriteBytes(new byte[] { (byte)value }); + } + public void WriteBytes(byte[] data) + { + if (data == null) return; + Write(data, 0, data.Length); + } + + public void WriteFixedLengthBytes(byte[] data, int count) + { + byte[] realdata = new byte[count]; + Array.Copy(data, 0, realdata, 0, Math.Min(realdata.Length, count)); + WriteBytes(realdata); + } + + public void WriteChar(char value) + { + WriteChar(value, base.Accessor.DefaultEncoding); + } + public void WriteChar(char value, Encoding encoding) + { + byte[] data = encoding.GetBytes(new char[] { value }); + WriteBytes(data); + } + + public void Write(char value) + { + Write(value.ToString()); + } + public void Write(string value) + { + WriteFixedLengthString(value); + } + public void WriteLine() + { + WriteLine(String.Empty); + } + public void WriteLine(char value) + { + WriteLine(value.ToString()); + } + public void WriteLine(string value) + { + WriteFixedLengthString(value + GetNewLineSequence()); + } + + public void WriteGuid(Guid guid) + { + WriteBytes(guid.ToByteArray()); + } + public void WriteFixedLengthString(string value) + { + WriteFixedLengthString(value, base.Accessor.DefaultEncoding); + } + public void WriteFixedLengthString(string value, int length) + { + WriteFixedLengthString(value, base.Accessor.DefaultEncoding, length); + } + public void WriteFixedLengthString(string value, uint length) + { + WriteFixedLengthString(value, base.Accessor.DefaultEncoding, length); + } + public void WriteFixedLengthString(string value, Encoding encoding) + { + byte[] data = encoding.GetBytes(value); + WriteBytes(data); + } + public void WriteFixedLengthString(string value, int length, char paddingChar) + { + WriteFixedLengthString(value, base.Accessor.DefaultEncoding, length, paddingChar); + } + public void WriteFixedLengthString(string value, uint length, char paddingChar) + { + this.WriteFixedLengthString(value, base.Accessor.DefaultEncoding, length, paddingChar); + } + public void WriteFixedLengthString(string value, Encoding encoding, int length) + { + this.WriteFixedLengthString(value, encoding, length, '\0'); + } + public void WriteFixedLengthString(string value, Encoding encoding, uint length) + { + WriteFixedLengthString(value, encoding, length, '\0'); + } + public void WriteFixedLengthString(string value, Encoding encoding, int length, char paddingChar) + { + WriteFixedLengthString(value, encoding, (uint)length, paddingChar); + } + public void WriteFixedLengthString(string value, Encoding encoding, uint length, char paddingChar) + { + string v = value; + if (v == null) v = String.Empty; + byte[] data = encoding.GetBytes(v); + byte[] realData = new byte[length]; + + uint realLength = length; + if (data.Length < realLength) + { + realLength = (uint)data.Length; + } + Array.Copy(data, 0, realData, 0, realLength); + + for (int i = data.Length; i < realData.Length; i++) + { + realData[i] = (byte)paddingChar; + } + WriteBytes(realData); + } + + public void WriteLengthPrefixedString(string value) + { + WriteLengthPrefixedString(value, base.Accessor.DefaultEncoding); + } + public void WriteLengthPrefixedString(string value, Encoding encoding) + { + throw new NotImplementedException(); + } + + public void WriteNullTerminatedString(string sz) + { + if (sz != null) + { + for (int i = 0; i < sz.Length; i++) + { + WriteChar(sz[i]); + } + } + WriteChar('\0'); + } + public void WriteNullTerminatedString(string sz, Encoding encoding) + { + byte[] values = encoding.GetBytes(sz); + + WriteBytes(values); + WriteInt16(0); + } + public void WriteNullTerminatedString(string sz, int length) + { + this.WriteFixedLengthString(sz, length); + } + + public void WriteInt16(short value) + { + byte[] _buffer = BitConverter.GetBytes(value); + byte[] buffer = new byte[2]; + if (base.Endianness == Endianness.BigEndian) + { + buffer[1] = _buffer[0]; + buffer[0] = _buffer[1]; + } + else + { + buffer[0] = _buffer[0]; + buffer[1] = _buffer[1]; + } + WriteBytes(buffer); + } + public void WriteUInt16(ushort value) + { + byte[] _buffer = BitConverter.GetBytes(value); + byte[] buffer = new byte[2]; + if (base.Endianness == Endianness.BigEndian) + { + buffer[1] = _buffer[0]; + buffer[0] = _buffer[1]; + } + else + { + buffer[0] = _buffer[0]; + buffer[1] = _buffer[1]; + } + WriteBytes(buffer); + } + public void WriteInt24 (int value) + { + byte[] buffer = new byte[3]; + if (base.Endianness == Endianness.BigEndian) + { + buffer[2] = (byte)value; + buffer[1] = (byte)(value >> 8); + buffer[0] = (byte)(value >> 16); + } + else + { + buffer[0] = (byte)value; + buffer[1] = (byte)(value >> 8); + buffer[2] = (byte)(value >> 16); + } + WriteBytes(buffer); + } + public void WriteUInt24(uint value) + { + byte[] buffer = new byte[3]; + if (base.Endianness == Endianness.BigEndian) + { + buffer[2] = (byte)value; + buffer[1] = (byte)(value >> 8); + buffer[0] = (byte)(value >> 16); + } + else + { + buffer[0] = (byte)value; + buffer[1] = (byte)(value >> 8); + buffer[2] = (byte)(value >> 16); + } + WriteBytes(buffer); + } + public void WriteInt32(int value) + { + byte[] _buffer = BitConverter.GetBytes(value); + byte[] buffer = new byte[4]; + if (base.Endianness == Endianness.BigEndian) + { + buffer[3] = _buffer[0]; + buffer[2] = _buffer[1]; + buffer[1] = _buffer[2]; + buffer[0] = _buffer[3]; + } + else + { + buffer[0] = _buffer[0]; + buffer[1] = _buffer[1]; + buffer[2] = _buffer[2]; + buffer[3] = _buffer[3]; + } + WriteBytes(buffer); + } + public void WriteInt32Array(int[] values) + { + for (int i = 0; i < values.Length; i++) + { + WriteInt32(values[i]); + } + } + public void WriteUInt32(uint value) + { + byte[] _buffer = BitConverter.GetBytes(value); + byte[] buffer = new byte[4]; + if (base.Endianness == Endianness.BigEndian) + { + buffer[3] = _buffer[0]; + buffer[2] = _buffer[1]; + buffer[1] = _buffer[2]; + buffer[0] = _buffer[3]; + } + else + { + buffer[0] = _buffer[0]; + buffer[1] = _buffer[1]; + buffer[2] = _buffer[2]; + buffer[3] = _buffer[3]; + } + WriteBytes(buffer); + } + public void WriteInt64(long value) + { + byte[] _buffer = new byte[8]; + if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = (byte)(value >> 56); + _buffer[1] = (byte)(value >> 48); + _buffer[2] = (byte)(value >> 40); + _buffer[3] = (byte)(value >> 32); + _buffer[4] = (byte)(value >> 24); + _buffer[5] = (byte)(value >> 16); + _buffer[6] = (byte)(value >> 8); + _buffer[7] = (byte)value; + } + else + { + _buffer[0] = (byte)value; + _buffer[1] = (byte)(value >> 8); + _buffer[2] = (byte)(value >> 16); + _buffer[3] = (byte)(value >> 24); + _buffer[4] = (byte)(value >> 32); + _buffer[5] = (byte)(value >> 40); + _buffer[6] = (byte)(value >> 48); + _buffer[7] = (byte)(value >> 56); + } + WriteBytes(_buffer); + } + public void WriteUInt64(ulong value) + { + byte[] _buffer = new byte[8]; + if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = (byte)(value >> 56); + _buffer[1] = (byte)(value >> 48); + _buffer[2] = (byte)(value >> 40); + _buffer[3] = (byte)(value >> 32); + _buffer[4] = (byte)(value >> 24); + _buffer[5] = (byte)(value >> 16); + _buffer[6] = (byte)(value >> 8); + _buffer[7] = (byte)value; + } + else + { + _buffer[0] = (byte)value; + _buffer[1] = (byte)(value >> 8); + _buffer[2] = (byte)(value >> 16); + _buffer[3] = (byte)(value >> 24); + _buffer[4] = (byte)(value >> 32); + _buffer[5] = (byte)(value >> 40); + _buffer[6] = (byte)(value >> 48); + _buffer[7] = (byte)(value >> 56); + } + WriteBytes(_buffer); + } + + public void WriteObject (object value) + { + Type objectType = value.GetType (); + + if (objectType == typeof(Byte)) + { + WriteByte((byte)value); + return; + } + else if (objectType == typeof(Byte[])) + { + WriteBytes((byte[])value); + return; + } + else if (objectType == typeof(SByte)) + { + WriteSByte((sbyte)value); + return; + } + else if (objectType == typeof(String)) + { + WriteLengthPrefixedString((string)value); + return; + } + else if (objectType == typeof(Char)) + { + WriteChar((char)value); + return; + } + else if (objectType == typeof(Char[])) + { + // WriteCharArray((char[])value); + return; + } + else if (objectType == typeof(Single)) + { + WriteSingle((float)value); + return; + } + else if (objectType == typeof(Double)) + { + WriteDouble((double)value); + return; + } + else if (objectType == typeof(Int16)) + { + WriteInt16((short)value); + return; + } + else if (objectType == typeof(Int32)) + { + WriteInt32((int)value); + return; + } + else if (objectType == typeof(Int64)) + { + WriteInt64((long)value); + return; + } + else if (objectType == typeof(UInt16)) + { + WriteUInt16((ushort)value); + return; + } + else if (objectType == typeof(UInt32)) + { + WriteUInt32((uint)value); + return; + } + else if (objectType == typeof(UInt64)) + { + WriteUInt64((ulong)value); + return; + } + else if (objectType == typeof(DateTime)) + { + WriteDateTime((DateTime)value); + return; + } + + System.Reflection.FieldInfo[] fis = (objectType.GetFields (System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)); + foreach (System.Reflection.FieldInfo fi in fis) + { + // Type fieldType = fi.FieldType; + WriteObject (fi.GetValue (value)); + } + } + + public void WriteDateTime(DateTime value) + { + WriteInt64(value.ToBinary()); + } + + public void WriteDecimal(decimal value) + { + int[] bits = decimal.GetBits(value); + int lo = bits[0], mid = bits[1], hi = bits[2], flags = bits[3]; + + byte[] buffer = new byte[16]; + if (base.Endianness == Endianness.LittleEndian) + { + buffer[0] = (byte)lo; + buffer[1] = (byte)(lo >> 8); + buffer[2] = (byte)(lo >> 16); + buffer[3] = (byte)(lo >> 24); + buffer[4] = (byte)mid; + buffer[5] = (byte)(mid >> 8); + buffer[6] = (byte)(mid >> 16); + buffer[7] = (byte)(mid >> 24); + buffer[8] = (byte)hi; + buffer[9] = (byte)(hi >> 8); + buffer[10] = (byte)(hi >> 16); + buffer[11] = (byte)(hi >> 24); + buffer[12] = (byte)flags; + buffer[13] = (byte)(flags >> 8); + buffer[14] = (byte)(flags >> 16); + buffer[15] = (byte)(flags >> 24); + } + else + { + buffer[15] = (byte)lo; + buffer[14] = (byte)(lo >> 8); + buffer[13] = (byte)(lo >> 16); + buffer[12] = (byte)(lo >> 24); + buffer[11] = (byte)mid; + buffer[10] = (byte)(mid >> 8); + buffer[9] = (byte)(mid >> 16); + buffer[9] = (byte)(mid >> 24); + buffer[7] = (byte)hi; + buffer[6] = (byte)(hi >> 8); + buffer[5] = (byte)(hi >> 16); + buffer[4] = (byte)(hi >> 24); + buffer[3] = (byte)flags; + buffer[2] = (byte)(flags >> 8); + buffer[1] = (byte)(flags >> 16); + buffer[0] = (byte)(flags >> 24); + } + WriteBytes(buffer); + } + + public void WriteVersion(Version version) + { + WriteVersion(version, 4); + } + public void WriteVersion(Version version, int count) + { + switch (count) + { + case 1: + { + WriteByte(1); + WriteInt32(version.Major); + break; + } + case 2: + { + WriteByte(2); + WriteInt32(version.Major); + WriteInt32(version.Minor); + break; + } + case 3: + { + WriteByte(3); + WriteInt32(version.Major); + WriteInt32(version.Minor); + WriteInt32(version.Build); + break; + } + case 4: + { + WriteByte(4); + WriteInt32(version.Major); + WriteInt32(version.Minor); + WriteInt32(version.Build); + WriteInt32(version.Revision); + break; + } + } + } + + public long CountAlignment(int paddingCount) + { + return CountAlignment(paddingCount, 0); + } + public long CountAlignment(int paddingCount, int dataCount) + { + long position = (base.Accessor.Position + dataCount); + int num = (int)(position % paddingCount); + return num; + } + + /// + /// Aligns the to the specified number of bytes. If the current + /// position of the is not a multiple of the specified number of bytes, + /// the position will be increased by the amount of bytes necessary to bring it to the + /// aligned position. + /// + /// The number of bytes on which to align the . + /// Any additional padding bytes that should be included after aligning to the specified boundary. + public void Align(int alignTo, int extraPadding = 0) + { + long paddingCount = ((alignTo - (base.Accessor.Position % alignTo)) % alignTo); + paddingCount += extraPadding; + base.Accessor.Position += paddingCount; + } + + + public void WriteSingle(float value) + { + byte[] buffer = BitConverter.GetBytes(value); + byte[] _buffer = new byte[4]; + if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[3]; + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + } + else + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[3]; + } + WriteBytes(_buffer); + } + public void WriteDouble(double value) + { + byte[] buffer = BitConverter.GetBytes(value); + byte[] _buffer = new byte[8]; + if (base.Endianness == Endianness.BigEndian) + { + _buffer[0] = buffer[7]; + _buffer[1] = buffer[6]; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + } + else + { + _buffer[0] = buffer[0]; + _buffer[1] = buffer[1]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[3]; + _buffer[4] = buffer[4]; + _buffer[5] = buffer[5]; + _buffer[6] = buffer[6]; + _buffer[7] = buffer[7]; + } + WriteBytes(_buffer); + } + + public void WriteDoubleEndianInt16(short value) + { + WriteInt16(value); + SwapEndianness(); + WriteInt16(value); + SwapEndianness(); + } + public void WriteDoubleEndianInt32(int value) + { + WriteInt32(value); + SwapEndianness(); + WriteInt32(value); + SwapEndianness(); + } + public void WriteDoubleEndianInt64(long value) + { + WriteInt64(value); + SwapEndianness(); + WriteInt64(value); + SwapEndianness(); + } + public void WriteDoubleEndianUInt16(ushort value) + { + WriteUInt16(value); + SwapEndianness(); + WriteUInt16(value); + SwapEndianness(); + } + public void WriteDoubleEndianUInt32(uint value) + { + WriteUInt32(value); + SwapEndianness(); + WriteUInt32(value); + SwapEndianness(); + } + public void WriteDoubleEndianUInt64(ulong value) + { + WriteUInt64(value); + SwapEndianness(); + WriteUInt64(value); + SwapEndianness(); + } + + public void WriteUInt16String(string value) + { + WriteUInt16String(value, base.Accessor.DefaultEncoding); + } + public void WriteUInt16String(string value, Encoding encoding) + { + ushort length = (ushort)value.Length; + byte[] input = encoding.GetBytes(value); + byte[] output = new byte[length]; + Array.Copy(input, 0, output, 0, output.Length); + WriteUInt16(length); + WriteBytes(output); + } + + public void WriteUInt16SizedString(string value) + { + WriteUInt16SizedString(value, base.Accessor.DefaultEncoding); + } + public void WriteUInt16SizedString(string value, Encoding encoding) + { + ushort length = (ushort)value.Length; + byte[] input = encoding.GetBytes(value); + byte[] output = new byte[length]; + Array.Copy(input, 0, output, 0, output.Length); + WriteBytes(output); + } + + public void WriteInt64String(string value) + { + WriteInt64(value.Length); + WriteFixedLengthString(value); + } + + public void Flush() + { + base.Accessor.FlushInternal(); + } + public void Close() + { + base.Accessor.Close(); + } + + public void WriteUInt16Array(ushort[] values) + { + for (int i = 0; i < values.Length; i++) + { + WriteUInt16(values[i]); + } + } + + public void WriteCharArray(char[] values) + { + for (int i = 0; i < values.Length; i++) + { + WriteChar(values[i]); + } + } + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/InvalidDataFormatException.cs b/CSharp/V5/Libraries/UniversalEditor.Core/InvalidDataFormatException.cs new file mode 100644 index 00000000..d8d62c8d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/InvalidDataFormatException.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + /// + /// The exception that is thrown when a cannot process a file because the file is + /// corrupted or unreadable or the file format is not supported by the given . + /// + public class InvalidDataFormatException : DataFormatException + { + /// + /// Creates a new instance of a with the default message. + /// + public InvalidDataFormatException() : base("The data format is invalid") { } + /// + /// Creates a new instance of a with the specified message. + /// + /// The message to display in the exception window. + public InvalidDataFormatException(string message) : base(message) { } + /// + /// Creates a new instance of a with the specified message and + /// inner exception. + /// + /// The message to display in the exception window. + /// The that is the cause of this . + public InvalidDataFormatException(string message, Exception innerException) : base(message, innerException) { } + public InvalidDataFormatException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/LastUsedAccessor.cs b/CSharp/V5/Libraries/UniversalEditor.Core/LastUsedAccessor.cs new file mode 100644 index 00000000..037ab663 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/LastUsedAccessor.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + /// + /// The last-used accessor, either the InputAccessor or the OutputAccessor. + /// + public enum LastUsedAccessor + { + None, + Input, + Output + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Localization/StringTable.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Localization/StringTable.cs new file mode 100644 index 00000000..4f7ade2c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Localization/StringTable.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Localization +{ + public static class StringTable + { + private static string mvarApplicationName = "Universal Editor"; + public static string ApplicationName { get { return mvarApplicationName; } } + + private static string mvarErrorDataFormatNotOpen = "The data format is not open."; + public static string ErrorDataFormatNotOpen { get { return mvarErrorDataFormatNotOpen; } } + + private static string mvarErrorDataCorrupted = "The file is corrupted."; + public static string ErrorDataCorrupted { get { return mvarErrorDataCorrupted; } } + + private static string mvarErrorFileNotFound = "The file could not be found."; + public static string ErrorFileNotFound { get { return mvarErrorFileNotFound; } } + private static string mvarErrorNotAnObjectModel = "The specified type is not an object model."; + public static string ErrorNotAnObjectModel { get { return mvarErrorNotAnObjectModel; } } + + private static string mvarErrorObjectModelNull = "The object model must not be null."; + public static string ErrorObjectModelNull { get { return mvarErrorObjectModelNull; } set { mvarErrorObjectModelNull = value; } } + + private static string mvarErrorDataFormatInvalid = "The data format is invalid."; + public static string ErrorDataFormatInvalid { get { return mvarErrorDataFormatInvalid; } set { mvarErrorDataFormatInvalid = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModel.cs new file mode 100644 index 00000000..386deb60 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModel.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor +{ + public abstract class ObjectModel : ICloneable, References + { + public class ObjectModelCollection + : System.Collections.ObjectModel.Collection + { + + } + + public ObjectModelReference MakeReference() + { + ObjectModelReference omr = MakeReferenceInternal(); + ObjectModelReference.Register(omr); + return omr; + } + protected virtual ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = new ObjectModelReference(GetType()); + return omr; + } + + private Accessor mvarAccessor = null; + public Accessor Accessor { get { return mvarAccessor; } internal set { mvarAccessor = value; } } + + public abstract void Clear(); + public abstract void CopyTo(ObjectModel where); + public void CopyTo(ObjectModel where, bool append) + { + if (!append) where.Clear(); + CopyTo(where); + } + public void CopyFrom(ObjectModel where) + { + where.CopyTo(this); + } + public void CopyFrom(ObjectModel where, bool append) + { + if (!append) Clear(); + CopyFrom(where); + } + public object Clone() + { + Type type = this.GetType(); + ObjectModel clone = (type.Assembly.CreateInstance(type.FullName) as ObjectModel); + CopyTo(clone); + return clone; + } + + public virtual void Replace(string FindWhat, string ReplaceWith) + { + Type type = GetType(); + System.Reflection.PropertyInfo[] pis = type.GetProperties(System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + foreach (System.Reflection.PropertyInfo pi in pis) + { + object obj = pi.GetValue(this, null); + if (obj is string) + { + string str = (obj as string); + pi.SetValue(this, str.Replace(FindWhat, ReplaceWith), null); + } + } + } + + private ObjectModelCustomProperty.ObjectModelCustomPropertyCollection mvarCustomProperties = new ObjectModelCustomProperty.ObjectModelCustomPropertyCollection(); + public ObjectModelCustomProperty.ObjectModelCustomPropertyCollection CustomProperties { get { return mvarCustomProperties; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelCustomProperty.cs b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelCustomProperty.cs new file mode 100644 index 00000000..97c2ce87 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelCustomProperty.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class ObjectModelCustomProperty + { + public class ObjectModelCustomPropertyCollection + { + private Dictionary> _internalCollection = new Dictionary>(); + + public ObjectModelCustomProperty Add(DataFormatReference dataFormat, string name, object value) + { + ObjectModelCustomProperty item = new ObjectModelCustomProperty(); + item.DataFormat = dataFormat; + item.Name = name; + item.Value = value; + + Dictionary values = null; + if (!_internalCollection.ContainsKey(dataFormat)) + { + values = new Dictionary(); + _internalCollection.Add(dataFormat, values); + } + else + { + values = _internalCollection[dataFormat]; + } + values[name] = item; + return item; + } + public ObjectModelCustomProperty[] this[DataFormatReference dataFormat] + { + get + { + List list = new List(); + if (_internalCollection.ContainsKey(dataFormat)) + { + foreach (KeyValuePair kvp in _internalCollection[dataFormat]) + { + list.Add(kvp.Value); + } + } + return list.ToArray(); + } + } + public ObjectModelCustomProperty this[DataFormatReference dataFormat, string name] + { + get + { + if (!_internalCollection.ContainsKey(dataFormat)) return null; + if (!_internalCollection[dataFormat].ContainsKey(name)) return null; + return _internalCollection[dataFormat][name]; + } + set + { + if (!_internalCollection.ContainsKey(dataFormat)) _internalCollection.Add(dataFormat, new Dictionary()); + if (!_internalCollection[dataFormat].ContainsKey(name)) _internalCollection[dataFormat].Add(name, value); + _internalCollection[dataFormat][name] = value; + } + } + } + + private DataFormatReference mvarDataFormat = null; + public DataFormatReference DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; } } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private object mvarValue = null; + public object Value { get { return mvarValue; } set { mvarValue = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelNotSupportedException.cs b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelNotSupportedException.cs new file mode 100644 index 00000000..5c331cec --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelNotSupportedException.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class ObjectModelNotSupportedException : NotSupportedException + { + public ObjectModelNotSupportedException() + : base("Object model not supported") + { + } + public ObjectModelNotSupportedException(Exception innerException) + : base("Object model not supported", innerException) + { + } + public ObjectModelNotSupportedException(string message) + : base(message) + { + } + public ObjectModelNotSupportedException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelReference.cs b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelReference.cs new file mode 100644 index 00000000..f6d0f4e8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/ObjectModelReference.cs @@ -0,0 +1,293 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class ObjectModelReference : ReferencedBy, IComparable + { + public class ObjectModelReferenceCollection + : System.Collections.ObjectModel.Collection + { + private Dictionary refsByID = new Dictionary(); + private Dictionary refsByType = new Dictionary(); + + /// + /// Associates a new with the specified ID and returns it. + /// + /// The of the for which to create an . + /// The newly-created . + public ObjectModelReference Add(Guid ID) + { + if (refsByID.ContainsKey(ID)) return refsByID[ID]; + + ObjectModelReference omr = new ObjectModelReference(ID); + refsByID.Add(ID, omr); + Add(omr); + return omr; + } + /// + /// Associates a new with the specified and returns it. + /// + /// The of the for which to create an . + /// The newly-created . + public ObjectModelReference Add(Type type) + { + if (refsByType.ContainsKey(type)) return refsByType[type]; + + ObjectModelReference omr = new ObjectModelReference(type); + refsByType.Add(type, omr); + Add(omr); + return omr; + } + + /// + /// Gets the associated with the specified ID. + /// + /// The to search for. + /// The associated with the specified ID, or null if no is associated with the specified ID. + public ObjectModelReference this[Guid ID] + { + get + { + if (refsByID.ContainsKey(ID)) return refsByID[ID]; + return null; + } + } + + /// + /// Gets the associated with the specified . + /// + /// The to search for. + /// The associated with the specified , or null if no is associated with the specified . + public ObjectModelReference this[Type type] + { + get + { + if (refsByType.ContainsKey(type)) return refsByType[type]; + return null; + } + } + /// + /// Determines if a with the specified ID exists in the collection. + /// + /// The of the to search for. + /// True if an with the specified ID exists in the collection; false otherwise. + public bool Contains(Guid ID) + { + return (refsByID.ContainsKey(ID)); + } + /// + /// Determines if a associated with the specified exists in the collection. + /// + /// The of the to search for. + /// True if an associated with the specified exists in the collection; false otherwise. + public bool Contains(Type type) + { + if (refsByType.Count == 0) + { + foreach (ObjectModelReference omr in this) + { + if (omr.Type != null) + { + refsByType.Add(omr.Type, omr); + } + } + } + return (refsByType.ContainsKey(type)); + } + } + + private string mvarTypeName = null; + public string TypeName + { + get + { + if (mvarTypeName != null) + { + return mvarTypeName; + } + else if (mvarType != null) + { + return mvarType.FullName; + } + return null; + } + set { mvarTypeName = value; } + } + + public string[] GetDetails() + { + return new string[] { mvarTitle, mvarDescription }; + } + + private Type mvarType = null; + public Type Type { get { return mvarType; } } + + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } } + + private string mvarTitle = null; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + public string GetTitle() + { + if (mvarTitle != null) return mvarTitle; + if (mvarType != null) return mvarType.FullName; + return mvarID.ToString("B"); + } + + private string[] mvarPath = null; + public string[] Path + { + get + { + if (mvarPath == null && mvarType != null) + { + string[] sz = mvarType.FullName.Split(new char[] { '.' }); + if (mvarTitle != null) + { + sz[sz.Length - 1] = mvarTitle; + } + return sz; + } + return mvarPath; + } + set { mvarPath = value; } + } + + public ObjectModelReference(Guid ID) + { + mvarID = ID; + } + public ObjectModelReference(string TypeName) + { + mvarTypeName = TypeName; + } + public ObjectModelReference(Type type) + { + if (!type.IsSubclassOf(typeof(ObjectModel))) + { + throw new InvalidCastException("Cannot create an object model reference to a non-ObjectModel type"); + } + else if (type.IsAbstract) + { + throw new InvalidOperationException("Cannot create an object model reference to an abstract type"); + } + + mvarType = type; + mvarTypeName = mvarType.FullName; + } + public ObjectModelReference(Type type, Guid ID) + { + if (!type.IsSubclassOf(typeof(ObjectModel))) + { + throw new InvalidCastException("Cannot create an object model reference to a non-ObjectModel type"); + } + else if (type.IsAbstract) + { + throw new InvalidOperationException("Cannot create an object model reference to an abstract type"); + } + + mvarType = type; + mvarTypeName = mvarType.FullName; + mvarID = ID; + } + + public ObjectModel Create() + { + if (mvarType == null && mvarTypeName != null) + { + mvarType = Type.GetType(mvarTypeName); + } + if (mvarType != null) + { + return (mvarType.Assembly.CreateInstance(mvarType.FullName) as ObjectModel); + } + return null; + } + + private string mvarDescription = String.Empty; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + + private bool mvarVisible = true; + public bool Visible { get { return mvarVisible; } set { mvarVisible = value; } } + + + private static Dictionary _referencesByGUID = new Dictionary(); + private static Dictionary _referencesByTypeName = new Dictionary(); + + public static bool Register(ObjectModelReference dfr) + { + bool retval = false; + if (dfr.Type != null) + { + dfr.TypeName = dfr.Type.FullName; + } + if (dfr.ID != Guid.Empty) + { + _referencesByGUID[dfr.ID] = dfr; + retval = true; + } + if (dfr.TypeName != null) + { + _referencesByTypeName[dfr.TypeName] = dfr; + retval = true; + } + return retval; + } + public static bool Unregister(ObjectModelReference dfr) + { + bool retval = false; + if (dfr.ID != Guid.Empty && _referencesByGUID.ContainsKey(dfr.ID)) + { + _referencesByGUID.Remove(dfr.ID); + retval = true; + } + if (dfr.TypeName != null && _referencesByTypeName.ContainsKey(dfr.TypeName)) + { + _referencesByTypeName.Remove(dfr.TypeName); + retval = true; + } + return retval; + } + + public static ObjectModelReference FromTypeName(string typeName) + { + if (_referencesByTypeName.ContainsKey(typeName)) return _referencesByTypeName[typeName]; + return null; + } + public static ObjectModelReference FromGUID(Guid guid) + { + if (_referencesByGUID.ContainsKey(guid)) return _referencesByGUID[guid]; + return null; + } + public override bool Equals(object obj) + { + ObjectModelReference omr = (obj as ObjectModelReference); + if (omr == null) return false; + if (mvarID == Guid.Empty) + { + // do not compare ID + if (mvarTypeName == null) return false; + return mvarTypeName.Equals(omr.TypeName); + } + return mvarID.Equals(omr.ID); + } + public int CompareTo(ObjectModelReference other) + { + if (mvarID == Guid.Empty) + { + // do not compare ID + if (mvarTypeName == null) + { + if (other.ID == Guid.Empty && other.TypeName == null) return 0; + return -1; + } + return mvarTypeName.CompareTo(other.TypeName); + } + return mvarID.CompareTo(other.ID); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/ProgressEvent.cs b/CSharp/V5/Libraries/UniversalEditor.Core/ProgressEvent.cs new file mode 100644 index 00000000..3a1a19d2 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/ProgressEvent.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + /// + /// A delegate for the event that is raised when progress is made during an asynchronous operation. + /// + /// The control firing this event. + /// A that contains additional information about this event. + public delegate void ProgressEventHandler(object sender, ProgressEventArgs e); + /// + /// Event arguments for the event that is raised when progress is made during an asynchronous operation. + /// + public class ProgressEventArgs : CancelEventArgs + { + private long mvarTotal = 0; + /// + /// The total possible amount of progress represented by this progress event. + /// + public long Total { get { return mvarTotal; } } + + private long mvarCurrent = 0; + /// + /// The current amount of progress completed. + /// + public long Current { get { return mvarCurrent; } } + + /// + /// The amount of progress remaining. + /// + public long Remaining { get { return mvarTotal - mvarCurrent; } } + + private string mvarMessage = String.Empty; + /// + /// The progress message + /// + public string Message { get { return mvarMessage; } } + + /// + /// Creates a new instance of the event arguments for the event that is + /// raised when progress is made during an asynchronous operation. + /// + /// The current amount of progress completed. + /// The total possible amount of progress represented by this progress event. + /// The progress message + public ProgressEventArgs(long current, long total, string message = "") + { + mvarCurrent = current; + mvarTotal = total; + mvarMessage = message; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Properties/AssemblyInfo.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..5acf53e8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor Compact Core")] +[assembly: AssemblyDescription("The bare minimum required to use Universal Editor.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2011-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("Licensed under the GNU Lesser General Public License.")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5a9bfd07-f739-4d91-a130-200a21c2eb96")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/Ptr.cs b/CSharp/V5/Libraries/UniversalEditor.Core/Ptr.cs new file mode 100644 index 00000000..3406c32f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/Ptr.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + [DebuggerNonUserCode()] + public struct Ptr + { + private T[] value; + private int index; + private int length; + + /// + /// Gets the capacity of the underlying array. + /// + public int Capacity + { + get { return value.Length; } + } + /// + /// Gets the size of the . + /// + public int Size + { + get { return length; } + } + + public Ptr(T[] value, int index = -1) + { + this.value = value; + this.length = value.Length; + this.mvarAutoResize = false; + if (index < -1 || index > value.Length - 1) throw new IndexOutOfRangeException(); + + this.index = index; + } + + public static Ptr operator + (Ptr value, int addend) + { + return new Ptr(value.value, value.index + 1); + } + public static Ptr operator - (Ptr value, int addend) + { + return new Ptr(value.value, value.index - 1); + } + + /// + /// Increments the index, then sets the value stored at that position to the given value. + /// + /// The value to set. + public void IncrementThenSetValue(T value) + { + this.Increment(); + SetValue(value); + } + /// + /// Decrements the index, then sets the value stored at that position to the given value. + /// + /// The value to set. + public void DecrementThenSetValue(T value) + { + Decrement(); + SetValue(value); + } + + /// + /// Sets the value at the current position to the given value, then increments the index. + /// + /// The value to set. + public void SetValueThenIncrement(T value) + { + SetValue(value); + Increment(); + } + /// + /// Sets the value at the current position to the given value, then decrements the index. + /// + /// The value to set. + public void SetValueThenDecrement(T value) + { + SetValue(value); + Decrement(); + } + + public void Increment() + { + this.index++; + AutoResizeIfNeeded(this.index); + } + public void Decrement() + { + if (this.index - 1 < 0) throw new IndexOutOfRangeException(); + this.index--; + } + + /// + /// Increments the index, then gets the value stored at that position. + /// + /// The value stored at the position after the index has been incremented. + public T IncrementThenGetValue() + { + this.index++; + T value = this.value[this.index]; + return value; + } + /// + /// Decrements the index, then gets the value stored at that position. + /// + /// The value stored at the position after the index has been decremented. + public T DecrementThenGetValue() + { + this.index--; + T value = this.value[this.index]; + return value; + } + + /// + /// Gets the value stored at the current position, then increments the index. + /// + /// The value stored at the position before the index has been incremented. + public T GetValueThenIncrement() + { + T value = this.value[this.index]; + this.index++; + return value; + } + /// + /// Gets the value stored at the current position, then decrements the index. + /// + /// The value stored at the position before the index has been decremented. + public T GetValueThenDecrement() + { + T value = this.value[this.index]; + this.index--; + return value; + } + + /// + /// Retrieves all elements of this as an array. + /// + /// An array of all items in this . + public T[] ToArray() + { + return (T[])this.value.Clone(); + } + + /// + /// Sets the value at the specified index to the given value. + /// + /// The value to set. + /// The index in the underlying array of the value to set, or -1 to set the current value. + public void SetValue(T value, int index = -1) + { + if (index == -1) index = this.index; + + AutoResizeIfNeeded(index); + + if (index < 0 || index > this.value.Length - 1) throw new IndexOutOfRangeException(); + this.value[index] = value; + } + + /// + /// Determines whether an auto-resize is needed. + /// + /// + /// -1 if auto-resize is disabled, 0 if no resize was needed, or the number of elements added to the underlying array. + private int AutoResizeIfNeeded(int index) + { + if (mvarAutoResize) return -1; + if (index > this.length - 1 && mvarAutoResize) + { + if (this.length + 1 > this.value.Length - 1) + { + Array.Resize(ref this.value, this.value.Length * 2); + this.length++; + } + } + return 0; + } + + /// + /// Retrieves the value at the specified index. + /// + /// The index in the underlying array of the value to retrieve, or -1 to retrieve the current value. + /// + public T GetValue(int index = -1) + { + if (index == -1) index = this.index; + return this.value[index]; + } + + public T this[int index] + { + get + { + return this.value[index]; + } + set + { + this.value[index] = value; + } + } + + private bool mvarAutoResize; + /// + /// Determines if the underlying array will automatically resize when an attempt is made to address memory outside of the array boundaries. + /// + public bool AutoResize { get { return mvarAutoResize; } set { mvarAutoResize = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/References.cs b/CSharp/V5/Libraries/UniversalEditor.Core/References.cs new file mode 100644 index 00000000..6feb84ac --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/References.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + /// + /// Defines an object that references a object. + /// + /// The object referenced by this object. + public interface References + { + /// + /// Creates or returns an existing object referring to this object. + /// + /// A object that can be used to create additional instances of this object. + TRef MakeReference(); + } + /// + /// Defines an object that is referenced by the given object. + /// + /// The object which references this object. + public interface ReferencedBy + { + /// + /// Creates an instance of this object from the described in the associated object. + /// + /// An instance of this object created from the described in the associated object. + TObj Create(); + + /// + /// Gets the detail fields that are shown in lists of this object in details view. + /// + /// An array of s that are shown in detail columns of lists of this object. + string[] GetDetails(); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Core/UniversalEditor.Core.csproj b/CSharp/V5/Libraries/UniversalEditor.Core/UniversalEditor.Core.csproj new file mode 100644 index 00000000..f4eee824 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Core/UniversalEditor.Core.csproj @@ -0,0 +1,100 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + Library + Properties + UniversalEditor + UniversalEditor.Core + v4.0 + 512 + + + + full + false + ..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + true + ..\..\Output\Debug\UniversalEditor.Core.xml + + + pdbonly + true + ..\..\Output\Release\ + TRACE + prompt + 4 + ..\..\Output\Release\UniversalEditor.Core.xml + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/AutoDictionary.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/AutoDictionary.cs new file mode 100644 index 00000000..5bef6898 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/AutoDictionary.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Collections.Generic +{ + /// + /// Provides a that automatically adds or updates a key or value when + /// it is requested. + /// + /// The type of the key part of the dictionary. + /// The type of the value part of the dictionary. + public class AutoDictionary : Dictionary + { + /// + /// Retrieves or updates an item with the specified key. If the item does not exist on update, + /// it will be created. If the item does not exist on retrieval, the value specified for + /// will be returned. + /// + /// The key of the item to retrieve or update. + /// The value returned on retrieval when the item with the specified key does not exist. + /// The item with the specified key if it exists in this collection; otherwise, defaultValue. + public TValue this[TKey key, TValue defaultValue = default(TValue)] + { + get + { + if (ContainsKey(key)) + { + // we already contain an item with this key, so return the value accordingly + return base[key]; + } + else + { + // we do not already contain an item with this key, so create a new value set to the + // specified default value and return that + base.Add(key, defaultValue); + return defaultValue; + } + } + set + { + // the .NET Framework Dictionary`2 implementation handles the "add or update" case + // automatically if a non-existent key is specified + this[key] = value; + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/BidirectionalDictionary.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/BidirectionalDictionary.cs new file mode 100644 index 00000000..c1b498ed --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/BidirectionalDictionary.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.Collections.Generic +{ + /// + /// Provides a collection that can be keyed either forward (T1=>T2) or backward (T2=>T1). + /// + /// The type of the value on which to forward-key the collection. + /// The type of the value on which to backward-key the collection. + public class BidirectionalDictionary : System.Collections.IEnumerable + { + private Dictionary mvarForwardDictionary = new Dictionary(); + private Dictionary mvarBackwardDictionary = new Dictionary(); + + /// + /// Adds the specified first and second value to the collection. + /// + /// The first value to add. + /// The second value to add. + public void Add(T1 value1, T2 value2) + { + mvarForwardDictionary.Add(value1, value2); + mvarBackwardDictionary.Add(value2, value1); + } + + /// + /// Removes the first and second value associated with the specified first value. + /// + /// The first value of the first-second value pair to remove. + public void RemoveByValue1(T1 value1) + { + T2 value2 = mvarForwardDictionary[value1]; + mvarForwardDictionary.Remove(value1); + mvarBackwardDictionary.Remove(value2); + } + /// + /// Removes the first and second value associated with the specified second value. + /// + /// The second value of the first-second value pair to remove. + public void RemoveByValue2(T2 value2) + { + T1 value1 = mvarBackwardDictionary[value2]; + mvarForwardDictionary.Remove(value1); + mvarBackwardDictionary.Remove(value2); + } + + /// + /// Gets the first value associated with the specified second value. + /// + /// The second value of the first-second value pair to search for. + /// The first value associated with the specified second value. + public T1 GetValue1(T2 value2) + { + return mvarBackwardDictionary[value2]; + } + /// + /// Gets the second value associated with the specified first value. + /// + /// The first value of the first-second value pair to search for. + /// The second value associated with the specified first value. + public T2 GetValue2(T1 value1) + { + return mvarForwardDictionary[value1]; + } + + /// + /// Determines if the specified first value is contained in this collection. + /// + /// The value to search for. + /// True if the value exists in the first value dictionary; otherwise, false. + public bool ContainsValue1(T1 value) + { + return mvarForwardDictionary.ContainsKey(value); + } + /// + /// Determines if the specified second value is contained in this collection. + /// + /// The value to search for. + /// True if the value exists in the second value dictionary; otherwise, false. + public bool ContainsValue2(T2 value) + { + return mvarBackwardDictionary.ContainsKey(value); + } + + /// + /// Gets a that can be used to iterate over this collection. + /// + /// A that can be used to iterate over this collection. + public IEnumerator> GetEnumerator() + { + return mvarForwardDictionary.GetEnumerator(); + } + /// + /// Gets a that can be used to iterate over this collection. + /// + /// A that can be used to iterate over this collection. + IEnumerator IEnumerable.GetEnumerator() + { + return mvarForwardDictionary.GetEnumerator(); + } + + /// + /// Returns the number of items in this collection. + /// + public int Count + { + get + { + if (mvarForwardDictionary.Count != mvarBackwardDictionary.Count) + { + // this should never happen + throw new InvalidOperationException("Count mismatch"); + } + + // they should be equal, so choose one at random to return and hardcode it ;) + return mvarBackwardDictionary.Count; + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/KeyValuePairList.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/KeyValuePairList.cs new file mode 100644 index 00000000..e6ebac75 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Collections/Generic/KeyValuePairList.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace UniversalEditor.Collections.Generic +{ + public class KeyValuePairList : List> + { + private Dictionary> valuesByKey = new Dictionary>(); + + public KeyValuePair Add(TKey key, TValue value) + { + KeyValuePair item = new KeyValuePair(key, value); + base.Add(item); + valuesByKey.Add(key, item); + return item; + } + public KeyValuePair this[TKey key] + { + get { return valuesByKey[key]; } + } + public bool Contains(TKey key) + { + return valuesByKey.ContainsKey(key); + } + public bool Remove(TKey key) + { + if (!Contains(key)) + { + return false; + } + Remove(this[key]); + return true; + } + public new void Remove(System.Collections.Generic.KeyValuePair item) + { + valuesByKey.Remove(item.Key); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Common/Reflection.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Common/Reflection.cs new file mode 100644 index 00000000..2d21bdf5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Common/Reflection.cs @@ -0,0 +1,686 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Solution; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.DataFormats.PropertyList.XML; +using UniversalEditor.ObjectModels.Project; +using UniversalEditor.ObjectModels.UEPackage; +using UniversalEditor.DataFormats.UEPackage; + +namespace UniversalEditor.Common +{ + public static class Reflection + { + private static int _ObjectModelReferenceComparer(ObjectModelReference a, ObjectModelReference b) + { + if (a.Type.BaseType == typeof(ObjectModel) && b.Type.BaseType != typeof(ObjectModel)) + { + return 1; + } + else if (a.Type.BaseType != typeof(ObjectModel) && b.Type.BaseType == typeof(ObjectModel)) + { + return -1; + } + return a.Type.FullName.CompareTo(b.Type.FullName); + } + + private static Type[] mvarAvailableTypes = null; + public static Type[] GetAvailableTypes() + { + if (mvarAvailableTypes == null) + { + Assembly[] asms = GetAvailableAssemblies(); + Type[] types = new Type[0]; + foreach (Assembly asm in asms) + { + Type[] types1 = null; + try + { + types1 = asm.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types1 = ex.Types; + } + + if (types1 == null) continue; + + Array.Resize(ref types, types.Length + types1.Length); + Array.Copy(types1, 0, types, types.Length - types1.Length, types1.Length); + } + mvarAvailableTypes = types; + } + return mvarAvailableTypes; + } + + #region Initialization + private static bool mvarInitialized = false; + private static void Initialize() + { + if (mvarInitialized) return; + + Type[] types = GetAvailableTypes(); + + #region Initializing Object Models + List listAccessors = new List(); + List listObjectModels = new List(); + List listDataFormats = new List(); + List listDocumentTemplates = new List(); + List listProjectTemplates = new List(); + List listConverters = new List(); + List listProjectTypes = new List(); + { + foreach (Type type in types) + { + if (type == null) continue; + if (mvarAvailableObjectModels == null && (type.IsSubclassOf(typeof(ObjectModel)) && !type.IsAbstract)) + { + ObjectModel tmp = null; + + try + { + tmp = (type.Assembly.CreateInstance(type.FullName) as ObjectModel); + } + catch (TargetInvocationException) + { + continue; + } + + ObjectModelReference omr = tmp.MakeReference(); + + listObjectModels.Add(omr); + } + else if (mvarAvailableAccessors == null && (type.IsSubclassOf(typeof(Accessor)) && !type.IsAbstract)) + { + try + { + Accessor a = (type.Assembly.CreateInstance(type.FullName) as Accessor); + AccessorReference ar = a.MakeReference(); + if (ar != null) + { + listAccessors.Add(ar); + } + } + catch + { + } + } + else if (mvarAvailableDataFormats == null && (type.IsSubclassOf(typeof(DataFormat)) && !type.IsAbstract)) + { + try + { + DataFormat df = (type.Assembly.CreateInstance(type.FullName) as DataFormat); + DataFormatReference dfr = df.MakeReference(); + if (dfr != null) + { + listDataFormats.Add(dfr); + } + } + catch + { + } + } + else if (mvarAvailableDocumentTemplates == null && (type.IsSubclassOf(typeof(DocumentTemplate)) && !type.IsAbstract)) + { + DocumentTemplate template = (type.Assembly.CreateInstance(type.FullName) as DocumentTemplate); + if (template != null) + { + listDocumentTemplates.Add(template); + } + } + else if (mvarAvailableConverters == null && (type.IsSubclassOf(typeof(Converter)) && !type.IsAbstract)) + { + Converter item = (type.Assembly.CreateInstance(type.FullName) as Converter); + if (item != null) + { + ConverterReference cr = item.MakeReference(); + listConverters.Add(cr); + } + } + } + } + listObjectModels.Sort(new Comparison(_ObjectModelReferenceComparer)); + listDataFormats.Sort(new Comparison(_DataFormatReferenceComparer)); + #endregion + + InitializeFromXML(ref listObjectModels, ref listDataFormats, ref listProjectTypes, ref listDocumentTemplates, ref listProjectTemplates); + mvarInitialized = true; + + if (mvarAvailableObjectModels == null) mvarAvailableObjectModels = listObjectModels.ToArray(); + if (mvarAvailableDataFormats == null) mvarAvailableDataFormats = listDataFormats.ToArray(); + if (mvarAvailableProjectTypes == null) mvarAvailableProjectTypes = listProjectTypes.ToArray(); + if (mvarAvailableConverters == null) mvarAvailableConverters = listConverters.ToArray(); + + if (mvarAvailableDocumentTemplates == null) mvarAvailableDocumentTemplates = listDocumentTemplates.ToArray(); + if (mvarAvailableProjectTemplates == null) mvarAvailableProjectTemplates = listProjectTemplates.ToArray(); + if (mvarAvailableAccessors == null) mvarAvailableAccessors = listAccessors.ToArray(); + } + + private static int _DataFormatReferenceComparer(DataFormatReference dfr1, DataFormatReference dfr2) + { + if (dfr1.Type.IsAbstract) + { + return 1; + } + if (dfr2.Type.IsAbstract) + { + return -1; + } + return dfr2.Priority.CompareTo(dfr1.Priority); + } + + private static void InitializeFromXML(ref List listObjectModels, ref List listDataFormats, ref List listProjectTypes, ref List listDocumentTemplates, ref List listProjectTemplates) + { + System.Collections.Specialized.StringCollection paths = new System.Collections.Specialized.StringCollection(); + paths.Add(System.Environment.CurrentDirectory); + + foreach (string path in paths) + { + string[] XMLFileNames = null; + XMLFileNames = System.IO.Directory.GetFiles(path, "*.xml", System.IO.SearchOption.AllDirectories); + foreach (string fileName in XMLFileNames) + { + try + { + string basePath = System.IO.Path.GetDirectoryName(fileName); + + UEPackageObjectModel mom = new UEPackageObjectModel(); + UEPackageXMLDataFormat xdf = new UEPackageXMLDataFormat(); + xdf.IncludeTemplates = false; + ObjectModel om = mom; + + Document.Load(om, xdf, new FileAccessor(fileName, false, false, false), true); + + foreach (ProjectType projtype in mom.ProjectTypes) + { + listProjectTypes.Add(projtype); + } + } + catch + { + } + } + + // ensure project types are loaded before running the next pass + mvarAvailableProjectTypes = listProjectTypes.ToArray(); + + foreach (string fileName in XMLFileNames) + { + try + { + string basePath = System.IO.Path.GetDirectoryName(fileName); + + UEPackageObjectModel mom = new UEPackageObjectModel(); + UEPackageXMLDataFormat xdf = new UEPackageXMLDataFormat(); + xdf.IncludeProjectTypes = false; + ObjectModel om = mom; + + Document.Load(om, xdf, new FileAccessor(fileName, false, false, false), true); + + foreach (DocumentTemplate template in mom.DocumentTemplates) + { + listDocumentTemplates.Add(template); + } + foreach (ProjectTemplate template in mom.ProjectTemplates) + { + listProjectTemplates.Add(template); + } + + foreach (Association assoc in mom.Associations) + { + Association.Register(assoc); + } + } + catch + { + } + } + } + } + #endregion + + #region Object Models + private static ObjectModelReference[] mvarAvailableObjectModels = null; + public static ObjectModelReference[] GetAvailableObjectModels() + { + if (mvarAvailableObjectModels == null) Initialize(); + return mvarAvailableObjectModels; + } + + public static T GetAvailableObjectModel(string filename) where T : ObjectModel + { + return GetAvailableObjectModel(new FileAccessor(filename)); + } + public static T GetAvailableObjectModel(Accessor accessor) where T : ObjectModel + { + ObjectModelReference[] omrs = GetAvailableObjectModels(accessor); + if (omrs.Length == 0) + { + // we failed to find an object model from the accessor, so let's try and + // force the loading of the object model we're told to load in the first place + + Type type = typeof(T); + ObjectModel om = (ObjectModel)type.Assembly.CreateInstance(type.FullName); + ObjectModelReference omr = om.MakeReference(); + + DataFormatReference[] dfrs = GetAvailableDataFormats(omr); + + foreach (DataFormatReference dfr in dfrs) + { + try + { + DataFormat df = dfr.Create(); + Document.Load(om, df, accessor); + } + catch + { + accessor.Close(); + continue; + } + } + return (T)om; + } + foreach (ObjectModelReference omr in omrs) + { + if (omr.Type == typeof(T)) + { + ObjectModel om = (T)omr.Create(); + + DataFormatReference[] dfrs = GetAvailableDataFormats(accessor, omr); + foreach (DataFormatReference dfr in dfrs) + { + DataFormat df = dfr.Create(); + Document doc = new Document(om, df, accessor); + try + { + doc.InputAccessor.Open(); + doc.Load(); + doc.InputAccessor.Close(); + break; + } + catch (InvalidDataFormatException ex) + { + if (!(Array.IndexOf(dfrs, df) < dfrs.Length - 1)) + { + throw ex; + } + doc.InputAccessor.Close(); + } + } + return (T)om; + } + } + return null; + } + public static bool GetAvailableObjectModel(string filename, ref T objectToFill) where T : ObjectModel + { + return GetAvailableObjectModel(new FileAccessor(filename), ref objectToFill); + } + public static bool GetAvailableObjectModel(Accessor accessor, ref T objectToFill) where T : ObjectModel + { + ObjectModel om = (T)objectToFill; + DataFormatReference[] dfrs = GetAvailableDataFormats(accessor); + if (dfrs.Length == 0) + { + return false; + } + + for (int i = 0; i < dfrs.Length; i++) + { + DataFormat df = dfrs[i].Create(); + Document doc = new Document(om, df, accessor); + try + { + doc.InputAccessor.Open(); + doc.Load(); + doc.InputAccessor.Close(); + + return true; + } + catch (DataFormatException) + { + doc.InputAccessor.Close(); + } + catch (NotSupportedException) + { + doc.InputAccessor.Close(); + } + } + return true; + } + + public static ObjectModelReference[] GetAvailableObjectModels(DataFormatReference dfr) + { + return GetAvailableObjectModels(dfr, DataFormatCapabilities.All); + } + public static ObjectModelReference[] GetAvailableObjectModels(DataFormatReference dfr, DataFormatCapabilities capabilities) + { + ObjectModelReference[] array = GetAvailableObjectModels(); + List list = new List(); + + foreach (ObjectModelReference om in array) + { + if ((dfr.Capabilities[om.Type] & capabilities) == capabilities) + { + list.Add(om); + } + } + return list.ToArray(); + } + public static ObjectModelReference[] GetAvailableObjectModels(Accessor accessor, DataFormatCapabilities capabilities = DataFormatCapabilities.All) + { + ObjectModelReference[] array = GetAvailableObjectModels(); + DataFormatReference[] dfs = GetAvailableDataFormats(accessor); + List list = new List(); + if (dfs.Length == 0) return list.ToArray(); + + foreach (ObjectModelReference om in array) + { + if (om == null) continue; + + foreach (DataFormatReference df in dfs) + { + if (df == null) continue; + if ((df.Capabilities[om.Type] & capabilities) == capabilities) + { + list.Add(om); + } + } + } + return list.ToArray(); + } + public static ObjectModelReference GetAvailableObjectModelByTypeName(string TypeName) + { + ObjectModelReference[] omrs = GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + if (omr.Type.FullName == TypeName) + { + return omr; + } + } + return null; + } + public static ObjectModelReference GetAvailableObjectModelByID(Guid ID) + { + ObjectModelReference[] omrs = GetAvailableObjectModels(); + foreach (ObjectModelReference omr in omrs) + { + if (omr.ID == ID) + { + return omr; + } + } + return null; + } + #endregion + #region Converters + private static ConverterReference[] mvarAvailableConverters = null; + public static ConverterReference[] GetAvailableConverters() + { + if (mvarAvailableConverters == null) Initialize(); + return mvarAvailableConverters; + } + public static ConverterReference[] GetAvailableConverters(Type from, Type to) + { + ConverterReference[] crs = GetAvailableConverters(); + List list = new List(); + foreach (ConverterReference cr in crs) + { + if (cr.Capabilities.Contains(from, to)) list.Add(cr); + } + return list.ToArray(); + } + #endregion + #region Accessors + private static AccessorReference[] mvarAvailableAccessors = null; + public static AccessorReference[] GetAvailableAccessors() + { + if (mvarAvailableAccessors == null) Initialize(); + return mvarAvailableAccessors; + } + #endregion + #region Data Formats + private static DataFormatReference[] mvarAvailableDataFormats = null; + public static DataFormatReference[] GetAvailableDataFormats() + { + if (mvarAvailableDataFormats == null) Initialize(); + return mvarAvailableDataFormats; + } + + public static DataFormatReference[] GetAvailableDataFormats(string filename) + { + Association[] associations = Association.FromCriteria(new AssociationCriteria() { FileName = filename }); + List list = new List(); + foreach (Association association in associations) + { + for (int i = 0; i < association.DataFormats.Count; i++) + { + list.Add(association.DataFormats[i]); + } + } + list.Sort(new Comparison(_DataFormatReferenceComparer)); + return list.ToArray(); + } + public static DataFormatReference[] GetAvailableDataFormats(Accessor accessor) + { + bool needsOpen = false; + if (!accessor.IsOpen) + { + // we need to open the accessor before we can sniff the file + needsOpen = true; + accessor.Open(); + } + + Association[] associations = Association.FromCriteria(new AssociationCriteria() { Accessor = accessor }); + List list = new List(); + foreach (Association association in associations) + { + for (int i = 0; i < association.DataFormats.Count; i++) + { + list.Add(association.DataFormats[i]); + } + } + list.Sort(new Comparison(_DataFormatReferenceComparer)); + + if (needsOpen) + { + // close the accessor since we're done with it + accessor.Close(); + } + return list.ToArray(); + } + + public static DataFormatReference[] GetAvailableDataFormats(ObjectModelReference objectModelReference) + { + List list = new List(); + DataFormatReference[] dfs = GetAvailableDataFormats(); + foreach (DataFormatReference df in dfs) + { + if (df.Capabilities[objectModelReference.Type] != DataFormatCapabilities.None) + { + list.Add(df); + } + } + return list.ToArray(); + } + public static DataFormatReference[] GetAvailableDataFormats(Accessor accessor, ObjectModelReference omr) + { + AssociationCriteria ac = new AssociationCriteria() { Accessor = accessor, ObjectModel = omr }; + Association[] associations = Association.FromCriteria(ac); + List dfrs = new List(); + foreach (Association assocs in associations) + { + for (int i = 0; i < assocs.DataFormats.Count; i++) + { + dfrs.Add(assocs.DataFormats[i]); + } + } + return dfrs.ToArray(); + } + public static DataFormatReference GetDataFormatByTypeName(string TypeName) + { + DataFormatReference[] dfrs = GetAvailableDataFormats(); + foreach (DataFormatReference dfr in dfrs) + { + if (dfr.Type.FullName == TypeName) + { + return dfr; + } + } + return null; + } + #endregion + #region Assemblies + private static Assembly[] mvarAvailableAssemblies = null; + public static Assembly[] GetAvailableAssemblies() + { + if (mvarAvailableAssemblies == null) + { + List list = new List(); + + List asmdirs = new List(); + string dir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + asmdirs.Add(dir); + asmdirs.Add(dir + System.IO.Path.DirectorySeparatorChar.ToString() + "Plugins"); + + foreach (string asmdir in asmdirs) + { + if (!System.IO.Directory.Exists(asmdir)) continue; + + string[] FileNamesEXE = System.IO.Directory.GetFiles(asmdir, "*.exe", System.IO.SearchOption.TopDirectoryOnly); + string[] FileNamesDLL = System.IO.Directory.GetFiles(asmdir, "*.dll", System.IO.SearchOption.TopDirectoryOnly); + + string[] FileNames = new string[FileNamesEXE.Length + FileNamesDLL.Length]; + Array.Copy(FileNamesEXE, 0, FileNames, 0, FileNamesEXE.Length); + Array.Copy(FileNamesDLL, 0, FileNames, FileNamesEXE.Length, FileNamesDLL.Length); + + foreach (string FileName in FileNames) + { + try + { + Assembly asm = Assembly.LoadFile(FileName); + list.Add(asm); + } + catch + { + } + } + } + + mvarAvailableAssemblies = list.ToArray(); + } + return mvarAvailableAssemblies; + } + #endregion + + private static DocumentTemplate[] mvarAvailableDocumentTemplates = null; + public static DocumentTemplate[] GetAvailableDocumentTemplates() + { + if (mvarAvailableDocumentTemplates == null) Initialize(); + return mvarAvailableDocumentTemplates; + } + public static DocumentTemplate[] GetAvailableDocumentTemplates(ObjectModelReference omr) + { + DocumentTemplate[] templates = GetAvailableDocumentTemplates(); + List retval = new List(); + foreach (DocumentTemplate template in templates) + { + if (template.ObjectModelReference != null) + { + if (omr == null || (template.ObjectModelReference.TypeName == omr.TypeName || (template.ObjectModelReference.ID != Guid.Empty && template.ObjectModelReference.ID == omr.ID))) + { + retval.Add(template); + } + } + } + return retval.ToArray(); + } + + private static ProjectTemplate[] mvarAvailableProjectTemplates = null; + public static ProjectTemplate[] GetAvailableProjectTemplates() + { + if (mvarAvailableProjectTemplates == null) Initialize(); + return mvarAvailableProjectTemplates; + } + + private static ProjectType[] mvarAvailableProjectTypes = null; + public static ProjectType GetProjectTypeByTypeID(Guid guid) + { + if (mvarAvailableProjectTypes == null) Initialize(); + foreach (ProjectType type in mvarAvailableProjectTypes) + { + if (type.ID == guid) return type; + } + return null; + } + +#if HANDLER + private static HandlerReference[] mvarAvailableHandlers = null; + public static HandlerReference[] GetAvailableHandlers() + { + if (mvarAvailableHandlers == null) Initialize(); + return mvarAvailableHandlers; + } + public static HandlerReference[] GetAvailableHandlers(string FileName) + { + if (mvarAvailableHandlers == null) Initialize(); + List handlers = new List(); + foreach (HandlerReference hr in mvarAvailableHandlers) + { + if (hr is FileHandlerReference) + { + FileHandlerReference fh = (hr as FileHandlerReference); + if (!fh.Supports(FileName)) continue; + + handlers.Add(fh); + } + } + return handlers.ToArray(); + } +#endif + + public static ObjectModel GetAvailableObjectModel(byte[] data, string filename, string ObjectModelTypeName) + { + return GetAvailableObjectModel(new MemoryAccessor(data, filename), ObjectModelTypeName); + } + public static ObjectModel GetAvailableObjectModel(Accessor accessor, string ObjectModelTypeName) + { + long resetpos = accessor.Position; + + DataFormatReference[] dfrs = GetAvailableDataFormats(accessor); + foreach (DataFormatReference dfr in dfrs) + { + ObjectModelReference[] omrs = GetAvailableObjectModels(dfr); + foreach (ObjectModelReference omr in omrs) + { + if (omr.Type.FullName == ObjectModelTypeName) + { + ObjectModel om = omr.Create(); + if (om == null) return null; + + DataFormat df = dfr.Create(); + try + { + Document.Load(om, df, accessor); + } + catch (InvalidDataFormatException) + { + accessor.Position = resetpos; + break; + } + + return om; + } + } + } + return null; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Condition.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Condition.cs new file mode 100644 index 00000000..4d834fa5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Condition.cs @@ -0,0 +1,379 @@ +using System; + +namespace UniversalEditor +{ + /// + /// The type of comparison to use with the conditional statement. + /// + [Flags()] + public enum ConditionComparison + { + /// + /// Returns true if the two values are equal by value. + /// + Equal = 1, + /// + /// Returns true if the two values are equal by reference (or by value if they are value types). + /// + ReferenceEqual = 2, + /// + /// Returns true if the first value is greater than the second value. + /// + GreaterThan = 4, + /// + /// Returns true if the first value is less than the second value. + /// + LessThan = 8, + /// + /// Negates the conditional comparison. + /// + Not = 16 + } + + /// + /// The type of combination applied to a series of conditional statements. + /// + public enum ConditionCombination + { + /// + /// Returns true if all of the conditional statements in this group are true. + /// + And, + /// + /// Returns true if at least one of the conditional statements in this group are true. + /// + Or, + Xor + } + + /// + /// Defines the minimum functionality required to implement a conditional statement (either a + /// itself or a of multiple + /// s. + /// + public interface IConditionalStatement + { + /// + /// Evaluates the conditional statement based on the given criteria. + /// + /// The set of values against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + bool Test(params System.Collections.Generic.KeyValuePair[] propertyValues); + /// + /// Evaluates the conditional statement based on the given criteria. + /// + /// The set of values against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + bool Test(System.Collections.Generic.Dictionary propertyValues); + /// + /// Evaluates the conditional statement based on the given criterion. + /// + /// The value against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + bool Test (object value); + } + + /// + /// A collection of s + /// + public class ConditionalStatementCollection + : System.Collections.ObjectModel.Collection + { + + } + + /// + /// A group of s joined by a . + /// + public class ConditionGroup : IConditionalStatement + { + /// + /// Creates a new with no conditional statements specified and a + /// default of . + /// + public ConditionGroup() + { + // I know it's initialized to this but I'm doing it here for clarity's sake (and because + // it's documented here... if you change it, make sure to update the documentation! don't + // rely on the field initializer) + mvarCombination = ConditionCombination.And; + } + /// + /// Creates a new with the specified + /// and s. + /// + /// The used to join s when testing this . + /// The s and s that are part of this . + public ConditionGroup(ConditionCombination combination, params IConditionalStatement[] statements) + { + mvarCombination = combination; + for (int i = 0; i < statements.Length; i++) + { + mvarConditions.Add (statements[i]); + } + } + + private ConditionalStatementCollection mvarConditions = new ConditionalStatementCollection(); + /// + /// Gets all s in this . + /// + public ConditionalStatementCollection Conditions + { + get { return mvarConditions; } + } + + private ConditionCombination mvarCombination = ConditionCombination.And; + /// + /// The type of combination used to join the s in this + /// . + /// + public ConditionCombination Combination + { + get { return mvarCombination; } + set { mvarCombination = value; } + } + + /// + /// Evaluates the conditional statement based on the given criteria. + /// + /// The set of values against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + public bool Test (params System.Collections.Generic.KeyValuePair[] propertyValues) + { + bool retval = false; + if (mvarCombination == ConditionCombination.And) + { + retval = true; + } + for (int i = 0; i < mvarConditions.Count; i++) + { + switch (mvarCombination) + { + case ConditionCombination.And: + retval &= mvarConditions[i].Test (propertyValues); + break; + case ConditionCombination.Or: + retval |= mvarConditions[i].Test (propertyValues); + break; + case ConditionCombination.Xor: + retval ^= mvarConditions[i].Test (propertyValues); + break; + } + } + return retval; + } + /// + /// Evaluates the conditional statement based on the given criteria. + /// + /// The set of values against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + public bool Test(System.Collections.Generic.Dictionary propertyValues) + { + bool retval = false; + if (mvarCombination == ConditionCombination.And) + { + retval = true; + } + for (int i = 0; i < mvarConditions.Count; i++) + { + switch (mvarCombination) + { + case ConditionCombination.And: + retval &= mvarConditions[i].Test(propertyValues); + break; + case ConditionCombination.Or: + retval |= mvarConditions[i].Test(propertyValues); + break; + case ConditionCombination.Xor: + retval ^= mvarConditions[i].Test(propertyValues); + break; + } + } + return retval; + } + + /// + /// Evaluates the conditional statement based on the given criterion. + /// + /// The value against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + public bool Test (object value) + { + bool retval = true; + + for (int i = 0; i < mvarConditions.Count; i++) + { + switch (mvarCombination) + { + case ConditionCombination.And: + retval &= mvarConditions[i].Test (value); + break; + case ConditionCombination.Or: + retval |= mvarConditions[i].Test (value); + break; + case ConditionCombination.Xor: + retval ^= mvarConditions[i].Test (value); + break; + } + } + return retval; + } + } + public class Condition : IConditionalStatement + { + private string mvarPropertyName = String.Empty; + /// + /// The name of the property against which to test when the method is called + /// passing in a property reference. + /// + public string PropertyName + { + get { return mvarPropertyName; } + set { mvarPropertyName = value; } + } + + private ConditionComparison mvarComparison = ConditionComparison.Equal; + /// + /// The type of comparison to use when testing this . + /// + public ConditionComparison Comparison + { + get { return mvarComparison; } + set { mvarComparison = value; } + } + + private object mvarValue = null; + /// + /// The value against which to test when the method is called. + /// + public object Value + { + get { return mvarValue; } + set { mvarValue = value; } + } + + /// + /// Creates a with the specified property name, comparison, and value. + /// + /// The name of the property against which to test when the method is called passing in a property reference. + /// The type of comparison to use. + /// The value against which to test when the method is called. + public Condition(string propertyName, ConditionComparison comparison, object value) + { + mvarPropertyName = propertyName; + mvarComparison = comparison; + mvarValue = value; + } + + /// + /// Evaluates the conditional statement based on the given criteria. + /// + /// The set of values against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + public bool Test(params System.Collections.Generic.KeyValuePair[] propertyValues) + { + bool retval = true; + foreach (System.Collections.Generic.KeyValuePair propertyValue in propertyValues) + { + if (propertyValue.Key == mvarPropertyName) + { + retval &= Test(propertyValue.Value); + } + } + return retval; + } + /// + /// Evaluates the conditional statement based on the given criteria. + /// + /// The set of values against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + public bool Test(System.Collections.Generic.Dictionary propertyValues) + { + bool retval = true; + foreach (System.Collections.Generic.KeyValuePair propertyValue in propertyValues) + { + if (propertyValue.Key == mvarPropertyName) + { + retval &= Test(propertyValue.Value); + } + } + return retval; + } + /// + /// Evaluates the conditional statement based on the given criterion. + /// + /// The value against which to evaluate the conditional statement. + /// True if the conditions are satisfied; false otherwise. + public bool Test (object propertyValue) + { + // would you like meatballs with your spaghetti code? + bool returnValue = false; + + if ((mvarComparison & ConditionComparison.Equal) == ConditionComparison.Equal) + { + if (propertyValue == null) + { + // our comparison object is null, so we can't .Equals it + // just do regular == with the constant null in that case + returnValue |= (mvarValue == null); + } + else + { + returnValue |= (propertyValue.Equals(mvarValue)); + } + } + if ((mvarComparison & ConditionComparison.ReferenceEqual) == ConditionComparison.ReferenceEqual) + { + if (propertyValue == null) + { + // our comparison object is null, so we can't .Equals it + // just do regular == with the constant null in that case + returnValue |= (mvarValue == null); + } + else + { + returnValue |= (propertyValue == mvarValue); + } + } + if (((mvarComparison & ConditionComparison.GreaterThan) == ConditionComparison.GreaterThan) && (propertyValue is IComparable)) + { + if (propertyValue == null) + { + // can ANYTHING ever be greater than or less than null? + returnValue |= false; + } + else + { + // we need to directly invoke IComparable.CompareTo here since we can't (usually) + // do > or < on objects... not sure what to do if the object doesn't implement + // IComparable though + returnValue |= ((propertyValue as IComparable).CompareTo(mvarValue) > 0); + } + } + if (((mvarComparison & ConditionComparison.LessThan) == ConditionComparison.LessThan) && (propertyValue is IComparable)) + { + if (propertyValue == null) + { + // can ANYTHING ever be greater than or less than null? + returnValue |= false; + } + else + { + // we need to directly invoke IComparable.CompareTo here since we can't (usually) + // do > or < on objects... not sure what to do if the object doesn't implement + // IComparable though + returnValue |= ((propertyValue as IComparable).CompareTo(mvarValue) < 0); + } + } + if ((mvarComparison & ConditionComparison.Not) == ConditionComparison.Not) + { + // we have a Not in there, so negate our return value + returnValue = !returnValue; + } + + // did you have as much fun reading this as I did writing it? + bool from_hell = returnValue; + return from_hell; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Converter.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Converter.cs new file mode 100644 index 00000000..1d8192ff --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Converter.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public struct ConverterCapability + { + public Type from; + public Type to; + public ConverterCapability(Type from, Type to) + { + this.from = from; + this.to = to; + } + } + public class ConverterCapabilityCollection + { + private List caps = new List(); + + public void Add(Type from, Type to) + { + ConverterCapability cap = new ConverterCapability(from, to); + caps.Add(cap); + } + public bool Contains(Type from, Type to) + { + ConverterCapability cap = new ConverterCapability(from, to); + return caps.Contains(cap); + } + public bool Remove(Type from, Type to) + { + ConverterCapability cap = new ConverterCapability(from, to); + if (caps.Contains(cap)) + { + caps.Remove(cap); + return true; + } + return false; + } + } + public class ConverterReference : ReferencedBy + { + private Type mvarType = null; + public Type Type { get { return mvarType; } set { mvarType = value; } } + + private ConverterCapabilityCollection mvarCapabilities = new ConverterCapabilityCollection(); + public ConverterCapabilityCollection Capabilities { get { return mvarCapabilities; } } + + public ConverterReference(Type type) + { + if (!type.IsSubclassOf(typeof(Converter))) + { + throw new InvalidCastException("Cannot create a converter reference to a non-Converter type"); + } + else if (type.IsAbstract) + { + throw new InvalidOperationException("Cannot create a converter reference to an abstract type"); + } + + mvarType = type; + } + + public Converter Create() + { + if (mvarType != null) return (Converter)mvarType.Assembly.CreateInstance(mvarType.FullName); + return null; + } + + public string[] GetDetails() + { + throw new NotImplementedException(); + } + + public bool ShouldFilterObject(string filter) + { + throw new NotImplementedException(); + } + } + public abstract class Converter : References + { + public abstract void Convert(ObjectModel from, ObjectModel to); + + public ConverterReference MakeReference() + { + return MakeReferenceInternal(); + } + protected virtual ConverterReference MakeReferenceInternal() + { + ConverterReference _cr = new ConverterReference(this.GetType()); + return _cr; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/AbstractSyntax/DER/DERDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/AbstractSyntax/DER/DERDataFormat.cs new file mode 100644 index 00000000..d79dfb75 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/AbstractSyntax/DER/DERDataFormat.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.AbstractSyntax; + +namespace UniversalEditor.DataFormats.AbstractSyntax.DER +{ + public class DERDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(AbstractSyntaxObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + AbstractSyntaxObjectModel asn = (objectModel as AbstractSyntaxObjectModel); + if (asn == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + while (!reader.EndOfStream) + { + byte identifier = reader.ReadByte(); + byte tagClass = (byte)identifier.GetBits(7, 2); + byte primitiveOrConstructed = (byte)identifier.GetBits(6, 1); + byte tagNumber = (byte)identifier.GetBits(0, 5); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/REV/REVDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/REV/REVDataFormat.cs new file mode 100644 index 00000000..43863f9d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/REV/REVDataFormat.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Chunked; + +namespace UniversalEditor.DataFormats.Chunked.REV +{ + public class REVDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(ChunkedObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/RIFF/RIFFDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/RIFF/RIFFDataFormat.cs new file mode 100644 index 00000000..e31701e1 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Chunked/RIFF/RIFFDataFormat.cs @@ -0,0 +1,272 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Chunked; + +namespace UniversalEditor.DataFormats.Chunked.RIFF +{ + public class RIFFDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + + dfr.Capabilities.Add(typeof(ChunkedObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private string[] mvarRIFFtagsLittleEndian = new string[] + { + "RIFF", + "RIFX" + }; + public virtual string[] RIFFTagsLittleEndian + { + get + { + return this.mvarRIFFtagsLittleEndian; + } + } + + private string[] mvarRIFFtagsBigEndian = new string[] + { + "FORM", + "LIST", + "CAT " + }; + public virtual string[] RIFFTagsBigEndian + { + get + { + return this.mvarRIFFtagsBigEndian; + } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + ChunkedObjectModel riff = objectModel as ChunkedObjectModel; + if (riff == null) return; + + Reader br = base.Accessor.Reader; + string tagRIFF = br.ReadFixedLengthString(4); + + bool found = false; + for (int i = 0; i < RIFFTagsLittleEndian.Length; i++) + { + string w = RIFFTagsLittleEndian[i]; + if (w == tagRIFF) + { + found = true; + break; + } + } + if (!found) + { + for (int i = 0; i < RIFFTagsBigEndian.Length; i++) + { + if (RIFFTagsBigEndian[i] == tagRIFF) + { + br.Endianness = Endianness.BigEndian; + found = true; + break; + } + } + } + + if (!found) + { + throw new InvalidDataFormatException("File does not begin with one of the chunked tags for this data format"); + } + + Accessor.Seek(-4, SeekOrigin.Current); + + RIFFChunk chunk = null; + int l = 0; + while (!br.EndOfStream) + { + chunk = ReadChunk(br, out l); + if (chunk != null) riff.Chunks.Add(chunk); + } + } + + private RIFFChunk ReadChunk(IO.Reader br, out int length) + { + try + { + string typeID = br.ReadFixedLengthString(4); + switch (typeID) + { + case "RIFF": + case "RIFX": + case "CAT ": + case "FORM": + case "LIST": + { + RIFFGroupChunk chunk = new RIFFGroupChunk(); + chunk.TypeID = typeID; + + length = br.ReadInt32(); + + string id = br.ReadFixedLengthString(4); + chunk.ID = id; + + long chunkPos = 0; + while (chunkPos < length) + { + int l = 0; + RIFFChunk chunkChild = ReadChunk(br, out l); + chunkPos += l; + chunk.Chunks.Add(chunkChild); + + if (br.EndOfStream) return chunk; + } + + return chunk; + } + default: + { + RIFFDataChunk chunk = new RIFFDataChunk(); + length = br.ReadInt32(); + + byte[] data = br.ReadBytes(length); + chunk.ID = typeID; + chunk.Data = data; + return chunk; + } + } + } + catch (System.IO.EndOfStreamException) + { + length = 0; + return null; + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + ChunkedObjectModel riff = (objectModel as ChunkedObjectModel); + if (riff == null) return; + + Writer bw = base.Accessor.Writer; + + foreach (RIFFChunk chunk in riff.Chunks) + { + this.WriteChunk(chunk, bw); + } + bw.Flush(); + } + private void WriteChunk(RIFFChunk chunk, IO.Writer bw) + { + if (chunk is RIFFGroupChunk) + { + RIFFGroupChunk gchunk = (chunk as RIFFGroupChunk); + bw.WriteFixedLengthString(gchunk.TypeID.PadRight(4, ' ')); + bw.WriteInt32(gchunk.Size); + bw.WriteFixedLengthString(gchunk.ID.PadRight(4, ' ')); + foreach (RIFFChunk subChunk in gchunk.Chunks) + { + WriteChunk(subChunk, bw); + } + } + else if (chunk is RIFFDataChunk) + { + RIFFDataChunk dchunk = (chunk as RIFFDataChunk); + bw.WriteFixedLengthString(dchunk.ID.PadRight(4, ' ')); + bw.WriteInt32(dchunk.Size); + if (dchunk.Data != null) + { + bw.WriteBytes(dchunk.Data); + } + } + } + + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + /* + RIFFObjectModel riff = (objectModels.Pop() as RIFFObjectModel); + if (riff.Chunks.Count > 0 && riff.Information.Count > 0) + { + RIFFGroupChunk chunkInfo = new RIFFGroupChunk(); + chunkInfo.TypeID = "LIST"; + chunkInfo.ID = "INFO"; + foreach (RIFFMetadataItem item in riff.Information) + { + RIFFDataChunk chunkData = new RIFFDataChunk(); + chunkData.ID = item.Name; + if (item.Value != null) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(); + Writer bw = new Writer(ms); + if (item.Value is string) + { + bw.WriteFixedLengthString((string)item.Value, System.Text.Encoding.UTF8); + } + else if (item.Value is bool) + { + bw.Write((bool)item.Value); + } + else if (item.Value is byte) + { + bw.Write((byte)item.Value); + } + else if (item.Value is byte[]) + { + bw.Write((byte[])item.Value); + } + else if (item.Value is short) + { + bw.Write((short)item.Value); + } + else if (item.Value is int) + { + bw.Write((int)item.Value); + } + else if (item.Value is long) + { + bw.Write((long)item.Value); + } + else if (item.Value is ushort) + { + bw.Write((ushort)item.Value); + } + else if (item.Value is uint) + { + bw.Write((uint)item.Value); + } + else if (item.Value is ulong) + { + bw.Write((ulong)item.Value); + } + else if (item.Value is float) + { + bw.Write((float)item.Value); + } + else if (item.Value is double) + { + bw.Write((double)item.Value); + } + else if (item.Value is Guid) + { + bw.Write((Guid)item.Value); + } + else if (item.Value is DateTime) + { + bw.Write((DateTime)item.Value); + } + bw.Close(); + chunkData.Data = ms.ToArray(); + chunkInfo.Chunks.Add(chunkData); + } + } + riff.Chunks.Add(chunkInfo); + } + objectModels.Push(riff); + */ + } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/CoreObject/CoreObjectDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/CoreObject/CoreObjectDataFormat.cs new file mode 100644 index 00000000..3d406ae5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/CoreObject/CoreObjectDataFormat.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.CoreObject; + +namespace UniversalEditor.DataFormats.CoreObject +{ + public class CoreObjectDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(CoreObjectObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + CoreObjectObjectModel core = (objectModel as CoreObjectObjectModel); + if (core == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + + CoreObjectGroup currentGroup = null; + + string lastLine = null; + reader.Seek(0, SeekOrigin.Begin); + + while (!reader.EndOfStream) + { + string line = reader.ReadLine(); + if (line.StartsWith(" ")) + { + if (lastLine == null) + { + throw new InvalidDataFormatException("Cannot continue a property that hasn't been declared"); + } + line = line.Substring(1); + line = line.Replace("\\,", ","); + lastLine += line; + continue; + } + else + { + if (lastLine != null) + { + // parse the last line + if (lastLine.Contains(":")) + { + string[] splits = lastLine.Split(new char[] { ':' }, 2, StringSplitOptions.None); + if (splits[0].ToUpper() == "BEGIN") + { + if (currentGroup != null) + { + currentGroup = currentGroup.Groups.Add(splits[1]); + } + else + { + currentGroup = core.Groups.Add(splits[1]); + } + } + else if (splits[0].ToUpper() == "END") + { + currentGroup = currentGroup.ParentGroup; + } + else + { + if (splits.Length > 0) + { + CoreObjectProperty prop = new CoreObjectProperty(); + + string name = null; + if (splits[0].Contains(";")) + { + string[] attrs = splits[0].Split(new char[] { ';' }); + name = attrs[0]; + + for (int i = 1; i < attrs.Length; i++) + { + string[] attrValues = attrs[i].Split(new char[] { '=' }); + if (attrValues.Length > 0) + { + CoreObjectAttribute att = new CoreObjectAttribute(); + att.Name = attrValues[0]; + if (attrValues.Length > 1) + { + string[] values = attrValues[1].Split(new char[] { ',' }, "\""); + for (int j = 0; j < values.Length; j++) + { + att.Values.Add(values[j]); + } + } + prop.Attributes.Add(att); + } + } + } + else + { + name = splits[0]; + } + + prop.Name = name; + if (splits.Length > 1) + { + string[] values = splits[1].Split(new char[] { ';' }); + foreach (string value in values) + { + prop.Values.Add(value); + } + } + + if (currentGroup != null) + { + currentGroup.Properties.Add(prop); + } + else + { + core.Properties.Add(prop); + } + } + } + } + lastLine = line; + } + else + { + lastLine = line; + } + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + CoreObjectObjectModel plom = (objectModel as CoreObjectObjectModel); + if (plom == null) throw new ObjectModelNotSupportedException(); + + Writer writer = base.Accessor.Writer; + foreach (CoreObjectProperty property in plom.Properties) + { + WriteProperty(writer, property); + } + foreach (CoreObjectGroup group in plom.Groups) + { + WriteGroup(writer, group); + } + writer.Flush(); + } + + private void WriteGroup(Writer writer, CoreObjectGroup group, int indent = 0) + { + writer.WriteLine("BEGIN:" + group.Name); + foreach (CoreObjectProperty property in group.Properties) + { + WriteProperty(writer, property, indent + 1); + } + foreach (CoreObjectGroup group1 in group.Groups) + { + WriteGroup(writer, group1); + } + writer.WriteLine("END:" + group.Name); + } + + private void WriteProperty(Writer writer, CoreObjectProperty property, int indent = 0) + { + writer.Write(property.Name); + foreach (CoreObjectAttribute att in property.Attributes) + { + writer.Write(';'); + writer.Write(att.Name); + if (att.Values.Count > 0) + { + writer.Write('='); + for (int i = 0; i < att.Values.Count; i++) + { + writer.Write(att.Values[i]); + if (i < att.Values.Count - 1) writer.Write(','); + } + } + } + writer.Write(':'); + for (int i = 0; i < property.Values.Count; i++) + { + writer.Write(property.Values[i]); + if (i < property.Values.Count - 1) writer.Write(';'); + } + writer.WriteLine(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/FileSystem/UXT/UXTDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/FileSystem/UXT/UXTDataFormat.cs new file mode 100644 index 00000000..02ae512b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/FileSystem/UXT/UXTDataFormat.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.FileSystem.FileSources; + +namespace UniversalEditor.DataFormats.FileSystem.UXT +{ + public class UXTDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + _dfr.ExportOptions.Add(new CustomOptionText("Comment", "Comment: ")); + } + return _dfr; + } + + public const int MAX_VERSION = 1; + + + + private int mvarVersion = MAX_VERSION; + public int Version { get { return mvarVersion; } set { mvarVersion = value; } } + + private string mvarComment = String.Empty; + public string Comment { get { return mvarComment; } set { mvarComment = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) throw new ObjectModelNotSupportedException(); + + Reader br = base.Accessor.Reader; + + string signature = br.ReadFixedLengthString(4); + if (signature != "UXt!") throw new InvalidDataFormatException("File does not begin with \"UxT!\""); + + mvarVersion = br.ReadInt32(); + if (mvarVersion > MAX_VERSION) throw new InvalidDataFormatException("Cannot read version (" + mvarVersion.ToString() + ", expected <= " + MAX_VERSION.ToString() + ")"); + + mvarComment = br.ReadNullTerminatedString(); + + long entryCount = br.ReadInt64(); + for (long i = 0; i < entryCount; i++) + { + string filename = br.ReadFixedLengthString(240); + filename = filename.TrimNull(); + long offset = br.ReadInt64(); + ulong length = br.ReadUInt64(); + + File file = new File(); + file.Name = filename; + file.Size = (long)length; + file.Source = new EmbeddedFileSource(br, offset, (long)length); + fsom.Files.Add(file); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + if (fsom == null) return; + + Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("UXt!"); + bw.WriteInt32(mvarVersion); + bw.WriteNullTerminatedString(mvarComment); + bw.WriteInt64(fsom.Files.LongCount()); + + long offset = bw.Accessor.Position + (256 * fsom.Files.Count); + foreach (File file in fsom.Files) + { + bw.WriteFixedLengthString(file.Name, 240); + bw.WriteInt64(offset); + bw.WriteUInt64((ulong)file.Size); + offset += (long)file.Size; + } + foreach (File file in fsom.Files) + { + file.WriteTo(bw); + } + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/EBML/EBMLDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/EBML/EBMLDataFormat.cs new file mode 100644 index 00000000..9519815a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/EBML/EBMLDataFormat.cs @@ -0,0 +1,322 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor.DataFormats.Markup.EBML +{ + public class EBMLDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.All); + _dfr.Sources.Add("http://ebml.sourceforge.net/specs/"); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + MarkupObjectModel mom = (objectModel as MarkupObjectModel); + if (mom == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + reader.Accessor.Seek(0, SeekOrigin.Begin); + + while (!reader.EndOfStream) + { + MarkupElement el = ReadEBMLElement(reader); + mom.Elements.Add(el); + } + } + + protected virtual bool HasChildren(long elementID) + { + return false; + } + + private MarkupElement ReadEBMLElement(Reader reader) + { + long elementID = ReadEBMLCompressedInteger(reader); + long dataSize = ReadEBMLCompressedInteger(reader); + byte[] data = reader.ReadBytes(dataSize); + + MarkupTagElement tag = new MarkupTagElement(); + tag.FullName = elementID.ToString(); + + if (elementID == 0x0A45DFA3) + { + Reader rdr = new Reader(new MemoryAccessor(data)); + while (!rdr.EndOfStream) + { + MarkupElement el = ReadEBMLElement(rdr); + tag.Elements.Add(el); + } + reader.Close(); + } + else + { + if (HasChildren(elementID)) + { + Reader rdr = new Reader(new MemoryAccessor(data)); + while (!rdr.EndOfStream) + { + MarkupElement el = ReadEBMLElement(rdr); + tag.Elements.Add(el); + } + reader.Close(); + } + else + { + MarkupStringElement mse = new MarkupStringElement(); + mse.FullName = "CDATA"; + mse.Value = Convert.ToBase64String(data); + tag.Elements.Add(mse); + } + } + return tag; + } + + private long ReadEBMLCompressedInteger(Reader reader) + { + byte[] buffer = reader.ReadBytes(8); + reader.Seek(-8, SeekOrigin.Current); + + if ((buffer[0] & 0x80) == 0x80) + { + // one byte + buffer[0] = (byte)(buffer[0] & ~0x80); + reader.Seek(1, SeekOrigin.Current); + return (long)buffer[0]; + } + else if ((buffer[0] & 0x40) == 0x40) + { + // two bytes + buffer[0] = (byte)(buffer[0] & ~0x40); + reader.Seek(2, SeekOrigin.Current); + + byte[] _buffer = new byte[2]; + _buffer[0] = buffer[1]; + _buffer[1] = buffer[0]; + return (long)BitConverter.ToInt16(_buffer, 0); + } + else if ((buffer[0] & 0x20) == 0x20) + { + // three bytes + buffer[0] = (byte)(buffer[0] & ~0x20); + reader.Seek(3, SeekOrigin.Current); + + byte[] _buffer = new byte[4]; + _buffer[0] = 0; + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + return (long)BitConverter.ToInt32(_buffer, 0); + } + else if ((buffer[0] & 0x10) == 0x10) + { + // four bytes + buffer[0] = (byte)(buffer[0] & ~0x10); + reader.Seek(4, SeekOrigin.Current); + + byte[] _buffer = new byte[4]; + _buffer[0] = buffer[3]; + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + return (long)BitConverter.ToInt32(_buffer, 0); + } + else if ((buffer[0] & 0x08) == 0x08) + { + // five bytes + buffer[0] = (byte)(buffer[0] & ~0x08); + reader.Seek(5, SeekOrigin.Current); + + byte[] _buffer = new byte[8]; + _buffer[0] = 0; + _buffer[1] = 0; + _buffer[2] = 0; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + return (long)BitConverter.ToInt64(_buffer, 0); + } + else if ((buffer[0] & 0x04) == 0x04) + { + // six bytes + buffer[0] = (byte)(buffer[0] & ~0x04); + reader.Seek(6, SeekOrigin.Current); + + byte[] _buffer = new byte[8]; + _buffer[0] = 0; + _buffer[1] = 0; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + return (long)BitConverter.ToInt64(_buffer, 0); + } + else if ((buffer[0] & 0x02) == 0x02) + { + // seven bytes + buffer[0] = (byte)(buffer[0] & ~0x02); + reader.Seek(7, SeekOrigin.Current); + + byte[] _buffer = new byte[8]; + _buffer[0] = 0; + _buffer[1] = buffer[6]; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + return (long)BitConverter.ToInt64(_buffer, 0); + } + else if ((buffer[0] & 0x01) == 0x01) + { + // eight bytes + buffer[0] = (byte)(buffer[0] & ~0x01); + reader.Seek(8, SeekOrigin.Current); + + byte[] _buffer = new byte[8]; + _buffer[0] = buffer[7]; + _buffer[1] = buffer[6]; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + return (long)BitConverter.ToInt64(_buffer, 0); + } + + // Since modern computers do not easily deal with data coded in sizes greater than 64 bits, + // any larger Element Sizes are left undefined at the moment. Currently, the Element Size + // coding allows for an Element to grow to 72000 To, i.e. 7x10^16 octets or 72000 terabytes, + // which will be sufficient for the time being. + throw new NotImplementedException("Unknown Element Size coding: 0x" + buffer[0].ToString("X")); + } + private void WriteEBMLCompressedInteger(Writer writer, long value) + { + if (value <= 0x7F) + { + writer.WriteByte((byte)(value & 0x80)); + return; + } + else if (value <= 0x7FFF) + { + // two bytes + byte[] _buffer = new byte[2]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[1] | 0x40); + _buffer[1] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + else if (value <= 0x7FFFFF) + { + // three bytes + byte[] _buffer = new byte[3]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[2] | 0x20); + _buffer[1] = buffer[1]; + _buffer[2] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + else if (value <= 0x7FFFFFFF) + { + // four bytes + byte[] _buffer = new byte[4]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[3] | 0x10); + _buffer[1] = buffer[2]; + _buffer[2] = buffer[1]; + _buffer[3] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + else if (value <= 0x7FFFFFFFFF) + { + // five bytes + byte[] _buffer = new byte[5]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[4] | 0x08); + _buffer[1] = buffer[3]; + _buffer[2] = buffer[2]; + _buffer[3] = buffer[1]; + _buffer[4] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + else if (value <= 0x7FFFFFFFFFFF) + { + // six bytes + byte[] _buffer = new byte[6]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[5] | 0x04); + _buffer[1] = buffer[4]; + _buffer[2] = buffer[3]; + _buffer[3] = buffer[2]; + _buffer[4] = buffer[1]; + _buffer[5] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + else if (value <= 0x7FFFFFFFFFFFFF) + { + // seven bytes + byte[] _buffer = new byte[7]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[6] | 0x02); + _buffer[1] = buffer[5]; + _buffer[2] = buffer[4]; + _buffer[3] = buffer[3]; + _buffer[4] = buffer[2]; + _buffer[5] = buffer[1]; + _buffer[6] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + else if (value <= 0x7FFFFFFFFFFFFFFF) + { + // eight bytes + byte[] _buffer = new byte[8]; + byte[] buffer = BitConverter.GetBytes(value); + _buffer[0] = (byte)(buffer[7] | 0x01); + _buffer[1] = buffer[6]; + _buffer[2] = buffer[5]; + _buffer[3] = buffer[4]; + _buffer[4] = buffer[3]; + _buffer[5] = buffer[2]; + _buffer[6] = buffer[1]; + _buffer[7] = buffer[0]; + writer.WriteBytes(_buffer); + return; + } + + // Since modern computers do not easily deal with data coded in sizes greater than 64 bits, + // any larger Element Sizes are left undefined at the moment. Currently, the Element Size + // coding allows for an Element to grow to 72000 To, i.e. 7x10^16 octets or 72000 terabytes, + // which will be sufficient for the time being. + throw new NotImplementedException("Value cannot be represented as an EBML compressed integer: " + value.ToString()); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormat.cs new file mode 100644 index 00000000..f1491864 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormat.cs @@ -0,0 +1,1580 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections.Specialized; + +using UniversalEditor.Collections.Generic; +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.ObjectModels.PropertyList; + +//TODO: Fix attribute parsing in XML. Got fucked up somehow. + + +namespace UniversalEditor.DataFormats.Markup.XML +{ + public class XMLDataFormat : DataFormat + { + public XMLDataFormat() + { + // Settings.AutoCloseTagNames.Add("hr"); + // Settings.AutoCloseTagNames.Add("br"); + // Settings.AutoCloseTagNames.Add("img"); + Settings.Entities.Add("amp", "&"); + Settings.Entities.Add("quot", "\""); + Settings.Entities.Add("copy", "©"); + Settings.Entities.Add("apos", "'"); + } + + private XMLDataFormatSettings mvarSettings = new XMLDataFormatSettings(); + public XMLDataFormatSettings Settings { get { return mvarSettings; } } + + private string mvarCompensateTopLevelTagName = null; + /// + /// The name of the top-level tag to insert if there exists more than one top-level element in the document. If this value is null, no compensation will be performed. + /// + public string CompensateTopLevelTagName { get { return mvarCompensateTopLevelTagName; } set { mvarCompensateTopLevelTagName = value; } } + + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Title = "eXtensible Markup Language"; + + dfr.Capabilities.Clear(); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.All); + return dfr; + } + public void WriteElement(MarkupElement element) + { + this.WriteElement(element, 0); + } + public void WriteElement(MarkupElement element, int indentLevel) + { + IO.Writer tw = base.Accessor.Writer; + + string indent = String.Empty; + if (mvarSettings.PrettyPrint) indent = new string(' ', indentLevel * 4); + + if (element is MarkupLiteralElement) + { + tw.Write(ReplaceEntitiesOutput(element.Value)); + } + else + { + if (element is MarkupStringElement) + { + tw.Write(Settings.TagBeginChar.ToString() + Settings.TagSpecialDeclarationStartChar.ToString() + "[" + element.Name + "[" + element.Value + "]]" + Settings.TagEndChar); + } + else + { + if (element is MarkupPreprocessorElement) + { + if (element.Value.Contains(Environment.NewLine)) + { + tw.Write(Settings.TagBeginChar.ToString() + Settings.PreprocessorChar.ToString() + element.Name + " "); + + if (mvarSettings.PrettyPrint) tw.WriteLine(); + tw.Write(element.Value); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + + tw.Write(Settings.PreprocessorChar.ToString() + Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + else + { + tw.Write(indent + Settings.TagBeginChar.ToString() + Settings.PreprocessorChar.ToString() + element.Name + " "); + tw.Write(element.Value + " "); + tw.Write(Settings.PreprocessorChar.ToString() + Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + } + else + { + if (element is MarkupTagElement) + { + MarkupTagElement tag = element as MarkupTagElement; + tw.Write(indent + Settings.TagBeginChar.ToString() + element.FullName); + if (tag.Attributes.Count > 0) + { + tw.Write(" "); + } + foreach (MarkupAttribute att in tag.Attributes) + { + tw.Write(att.FullName + "=\"" + this.ReplaceEntitiesOutput(att.Value) + "\""); + if (tag.Attributes.IndexOf(att) < tag.Attributes.Count - 1) + { + tw.Write(" "); + } + } + if (tag.Elements.Count == 0) + { + if (String.IsNullOrEmpty(element.Value)) + { + tw.Write(" " + Settings.TagCloseChar.ToString() + Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + else + { + tw.Write(Settings.TagEndChar.ToString()); + tw.Write(ReplaceEntitiesOutput(element.Value) + Settings.TagBeginChar.ToString() + Settings.TagCloseChar.ToString() + element.FullName + Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + } + else + { + tw.Write(Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + } + else + { + if (element is MarkupCommentElement) + { + tw.Write(Settings.TagBeginChar); + tw.Write(Settings.TagSpecialDeclarationStartChar.ToString()); + tw.Write(Settings.TagSpecialDeclarationCommentStart); + bool containsNewline = element.Value.ContainsAny(new string[] + { + "\r", + "\n" + }); + if (containsNewline) + { + tw.WriteLine(); + } + else + { + tw.Write(' '); + } + tw.Write(element.Value.Trim()); + if (containsNewline) + { + tw.WriteLine(); + } + else + { + tw.Write(' '); + } + tw.Write(Settings.TagSpecialDeclarationCommentStart); + tw.Write(Settings.TagEndChar); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + } + } + } + } + if (element is MarkupContainerElement) + { + MarkupContainerElement ce = element as MarkupContainerElement; + for (int i = 0; i < ce.Elements.Count; i++) + { + WriteElement(ce.Elements[i], indentLevel + 1); + } + if (ce.Elements.Count > 0) + { + tw.Write(indent + Settings.TagBeginChar.ToString() + Settings.TagCloseChar.ToString() + element.FullName + Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + } + } + public void WriteStartDocument() + { + this.WriteStartPreprocessor("xml"); + this.WriteAttribute("version", "1.0"); + this.WriteAttribute("encoding", "UTF-8"); + if (Settings.IsStandalone) + { + this.WriteAttribute("standalone", "yes"); + } + this.WriteEndPreprocessor(); + } + public void WriteStartPreprocessor(string name) + { + IO.Writer tw = base.Accessor.Writer; + tw.Write(this.Settings.TagBeginChar); + tw.Write(this.Settings.PreprocessorChar); + tw.Write(name + " "); + } + public void Write(string content) + { + this.Write(content, 0); + } + public void Write(string content, int indentLevel) + { + IO.Writer tw = base.Accessor.Writer; + string indent = new string(' ', indentLevel * 4); + tw.Write(indent + content); + } + public void WriteEndPreprocessor() + { + IO.Writer tw = base.Accessor.Writer; + tw.Write(" " + this.Settings.PreprocessorChar + this.Settings.TagEndChar); + } + public void WritePreprocessor(string name, string content) + { + this.WriteStartPreprocessor(name); + this.Write(content); + this.WriteEndPreprocessor(); + } + public void WriteStartTag(string tag) + { + this.WriteStartTag(null, tag); + } + public void WriteStartTag(string nameSpace, string tag) + { + IO.Writer tw = base.Accessor.Writer; + tw.Write(this.Settings.TagBeginChar); + if (nameSpace != null) + { + tw.Write(nameSpace); + tw.Write(this.Settings.TagNamespaceSeparatorChar); + } + tw.Write(tag); + tw.Write(this.Settings.TagEndChar); + } + public void WriteEndTag(string tag) + { + this.WriteEndTag(null, tag); + } + public void WriteEndTag(string nameSpace, string tag) + { + IO.Writer tw = base.Accessor.Writer; + tw.Write(Settings.TagBeginChar); + tw.Write(Settings.TagCloseChar); + if (nameSpace != null) + { + tw.Write(nameSpace); + tw.Write(Settings.TagNamespaceSeparatorChar); + } + tw.Write(tag); + tw.Write(Settings.TagEndChar); + } + public void WriteTag(string tag) + { + this.WriteTag(tag, null); + } + public void WriteTag(string tag, string value) + { + this.WriteTag(null, tag, value); + } + public void WriteTag(string nameSpace, string tag, string value) + { + IO.Writer tw = base.Accessor.Writer; + tw.Write(this.Settings.TagBeginChar); + if (nameSpace != null) + { + tw.Write(nameSpace); + tw.Write(this.Settings.TagNamespaceSeparatorChar); + } + tw.Write(tag); + if (value == null) + { + tw.Write(" " + this.Settings.TagCloseChar); + } + tw.Write(this.Settings.TagEndChar); + if (value != null) + { + tw.Write(value); + tw.Write(this.Settings.TagBeginChar); + tw.Write(this.Settings.TagCloseChar); + if (nameSpace != null) + { + tw.Write(nameSpace); + tw.Write(this.Settings.TagNamespaceSeparatorChar); + } + tw.Write(tag); + tw.Write(this.Settings.TagEndChar); + } + } + public void WriteAttribute(string name, string value) + { + this.WriteAttribute(null, name, value); + } + public void WriteAttribute(string nameSpace, string name, string value) + { + IO.Writer tw = base.Accessor.Writer; + if (nameSpace != null) + { + tw.Write(nameSpace + this.Settings.TagNamespaceSeparatorChar); + } + tw.Write(name); + tw.Write(this.Settings.AttributeNameValueSeparatorChar); + tw.Write(value); + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader tr = base.Accessor.Reader; + MarkupObjectModel mom = new MarkupObjectModel(); + bool insideTagDecl = false; + int insideString = 0; + bool closingCurrentElement = false; + string currentString = string.Empty; + MarkupElement currentElement = null; + bool insidePreprocessor = false; + bool insideAttributeArea = false; + bool insideSpecialDeclaration = false; + bool insideTagValue = false; + char prevChar = '\0'; + string nextAttributeName = null; + bool loaded = false; + + char c = tr.ReadChar(); + int times = 0, maxtimes = 5; + while (c != '<') + { + // clear out junk + c = tr.ReadChar(); + times++; + if (times == maxtimes) break; + } + tr.Accessor.Seek(-1, IO.SeekOrigin.Current); + + bool seenBeginChar = false; + + while (!tr.EndOfStream) + { + c = tr.ReadChar(); + if (!loaded && (c != '<')) + { + return; + } + else + { + loaded = true; + } + + if (c == this.Settings.TagEndChar && !seenBeginChar) + { + currentString += c; + continue; + } + else if (c == this.Settings.TagEndChar && seenBeginChar) + { + seenBeginChar = false; + } + + if (c == this.Settings.TagBeginChar) + { + if (insideString == 0 && !insidePreprocessor) + { + insideTagDecl = true; + insideTagValue = false; + if (!string.IsNullOrEmpty(currentString) && currentElement != null) + { + MarkupElement expr_8F = currentElement; + expr_8F.Value += currentString; + currentElement.Value = this.ReplaceEntitiesInput(currentElement.Value.Trim()); + currentString = string.Empty; + } + } + else + { + currentString += c; + } + seenBeginChar = true; + } + else + { + if (c == this.Settings.TagSpecialDeclarationStartChar) + { + if (insideString == 0 && !insidePreprocessor && !insideTagValue && !insideAttributeArea && prevChar == this.Settings.TagBeginChar) + { + insideSpecialDeclaration = true; + continue; + } + currentString += c; + } + else + { + if (c == this.Settings.TagEndChar) + { + if (insideString == 0 && ((insidePreprocessor && prevChar == this.Settings.PreprocessorChar) || prevChar != this.Settings.PreprocessorChar)) + { + insideTagDecl = false; + if (currentString.EndsWith(this.Settings.TagSpecialDeclarationCommentStart)) + { + currentString = currentString.Substring(0, currentString.Length - this.Settings.TagSpecialDeclarationCommentStart.Length); + currentElement.Value = this.ReplaceEntitiesInput(currentString); + currentString = string.Empty; + currentElement = currentElement.Parent; + continue; + } + if (insidePreprocessor && prevChar == this.Settings.PreprocessorChar) + { + MarkupElement prevElement = currentElement; + currentElement = new MarkupPreprocessorElement(); + string name = string.Empty; + string content = currentString; + if (currentString.Contains(" ")) + { + name = currentString.Substring(0, currentString.IndexOf(' ')); + content = currentString.Substring(name.Length + 1); + } + currentElement.Name = name.Trim(); + currentElement.Value = content.Trim(); + if (prevElement != null && prevElement is MarkupContainerElement) + { + (prevElement as MarkupContainerElement).Elements.Add(currentElement); + } + else + { + mom.Elements.Add(currentElement); + } + currentElement = prevElement; + insidePreprocessor = false; + } + else + { + if (closingCurrentElement) + { + if (currentElement != null) + { + if (currentElement.FullName == currentString || prevChar == this.Settings.TagCloseChar) + { + currentElement = currentElement.Parent; + } + else + { + if (Settings.AutoCloseTagNames.Contains(currentElement.Name)) + { + currentElement = currentElement.Parent; + if (currentElement != null) + { + currentElement = currentElement.Parent; + } + } + else + { + Console.WriteLine("uds: XMLDataFormat: attempted to close element '" + currentElement.Name + "'; invalid XML?"); + } + } + } + else + { + Console.WriteLine("FIXME: UniversalDataStorage/FileFormats/Markup/XMLFileFormat.cs:144 currentElement is null"); + } + closingCurrentElement = false; + } + else + { + if (insideSpecialDeclaration) + { + insideSpecialDeclaration = false; + } + else + { + insideTagValue = true; + if (insideAttributeArea) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(currentString)); + nextAttributeName = null; + insideAttributeArea = false; + } + else + { + MarkupElement prevElement = currentElement; + currentElement = new MarkupTagElement(); + currentElement.FullName = currentString.Trim(); + if (prevElement != null && prevElement is MarkupContainerElement) + { + (prevElement as MarkupContainerElement).Elements.Add(currentElement); + } + else + { + mom.Elements.Add(currentElement); + } + if (Settings.AutoCloseTagNames.Contains(currentElement.Name)) + { + currentElement = currentElement.Parent; + } + } + } + } + } + currentString = string.Empty; + insideAttributeArea = false; + } + else + { + currentString += c; + } + } + else + { + if (c == this.Settings.TagCloseChar) + { + if (insideString == 0 && !insidePreprocessor && insideTagDecl) + { + if (currentElement == null) + { + goto IL_4CC; + } + IL_4CC: + if (insideAttributeArea && currentElement is MarkupTagElement && nextAttributeName != null) + { + if (nextAttributeName != null) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(currentString)); + nextAttributeName = null; + currentString = string.Empty; + } + } + else + { + if (!insideAttributeArea) + { + if (currentElement != null) + { + if (currentElement is MarkupTagElement && !string.IsNullOrEmpty(currentString)) + { + MarkupTagElement e = new MarkupTagElement(); + e.Name = currentString; + (currentElement as MarkupTagElement).Elements.Add(e); + currentElement = e; + } + } + else + { + Console.WriteLine("FIXME: UniversalDataStorage/FileFormats/Markup/XMLFileFormat.cs:199 currentElement is null"); + } + } + } + currentString = string.Empty; + closingCurrentElement = true; + } + else + { + currentString += c; + } + } + else + { + if (c == this.Settings.AttributeNameValueSeparatorChar) + { + if (insideString == 0 && !insidePreprocessor && !insideTagValue) + { + if (insideAttributeArea) + { + nextAttributeName = currentString; + currentString = string.Empty; + char ccq = tr.PeekChar(); + if (ccq != '"' && ccq != '\'') + { + char cc = '\0'; + string nnn = string.Empty; + while (cc != this.Settings.TagEndChar) + { + cc = tr.PeekChar(); + if (cc == this.Settings.TagEndChar) + { + break; + } + nnn += tr.ReadChar(); + if (tr.EndOfStream) + { + break; + } + } + string value = nnn; + string arg_6A8_0 = nnn; + char c2 = this.Settings.AttributeNameValueSeparatorChar; + if (arg_6A8_0.Contains(c2.ToString())) + { + int l = nnn.IndexOf(' '); + value = nnn.Substring(0, l); + string nnnn = nnn.Substring(value.Length).Trim(); + string nnnnAttributeName = string.Empty; + string nnnnAttributeValue = string.Empty; + bool nnnnLookForValue = false; + int nnnnIsInsideString = 0; + for (int i = 0; i < nnnn.Length; i++) + { + char r = nnnn[i]; + if (r == this.Settings.AttributeNameValueSeparatorChar) + { + if (nnnnIsInsideString == 0) + { + nnnnLookForValue = true; + } + } + else + { + if (r == '\'' || r == '"') + { + if ((r == '\'' && nnnnIsInsideString == 2) || (r == '"' && nnnnIsInsideString == 1)) + { + nnnnIsInsideString = 0; + } + else + { + if (r == '"') + { + nnnnIsInsideString = 1; + } + else + { + if (r == '\'') + { + nnnnIsInsideString = 2; + } + } + } + } + else + { + if (r == ' ' && nnnnIsInsideString == 0) + { + if (currentElement != null) + { + if (currentElement is MarkupTagElement) + { + (currentElement as MarkupTagElement).Attributes.Add(nnnnAttributeName, this.ReplaceEntitiesInput(nnnnAttributeValue)); + nnnnAttributeName = string.Empty; + nnnnAttributeValue = string.Empty; + nnnnLookForValue = false; + } + } + } + else + { + if (nnnnLookForValue) + { + nnnnAttributeValue += r; + } + else + { + nnnnAttributeName += r; + } + } + } + } + } + if (!string.IsNullOrEmpty(nnnnAttributeName)) + { + (currentElement as MarkupTagElement).Attributes.Add(nnnnAttributeName, this.ReplaceEntitiesInput(nnnnAttributeValue)); + nnnnAttributeName = string.Empty; + nnnnAttributeValue = string.Empty; + } + } + if (currentElement != null) + { + if (currentElement is MarkupTagElement) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(value)); + nextAttributeName = null; + } + } + currentString = string.Empty; + continue; + } + } + } + else + { + currentString += c; + } + } + else + { + if (c == '"' || c == '\'') + { + if (!insidePreprocessor) + { + if (!insideTagDecl) + { + currentString += c; + continue; + } + int cur = 0; + if (c == '"') + { + cur = 1; + } + if (c == '\'') + { + cur = 2; + } + if (insideString == 0) + { + insideString = cur; + } + else + { + if (insideString == cur) + { + insideString = 0; + } + else + { + currentString += c; + } + } + } + else + { + currentString += c; + } + } + else + { + if (char.IsWhiteSpace(c)) + { + if (insideString == 0 && !insidePreprocessor) + { + if (char.IsWhiteSpace(prevChar)) + { + continue; + } + if (insideTagDecl) + { + if (insideSpecialDeclaration) + { + if (currentString.Trim() == "DOCTYPE") + { + char c2 = this.mvarSettings.TagEndChar; + string doctype = tr.ReadUntil(c2.ToString(), "\"", "\""); + doctype = doctype.Substring(0, doctype.Length - 1); + string[] doctypeParts = doctype.Split(new string[] + { + " " + }, "\"", "\""); + insideTagDecl = false; + insideSpecialDeclaration = false; + } + } + else + { + if (!insideAttributeArea) + { + MarkupElement prevElement = currentElement; + currentElement = new MarkupTagElement(); + currentElement.Name = currentString.Trim(); + if (prevElement == null) + { + mom.Elements.Add(currentElement); + } + else + { + if (!(prevElement is MarkupContainerElement)) + { + throw new InvalidOperationException("Cannot add element to non-container object"); + } + (prevElement as MarkupContainerElement).Elements.Add(currentElement); + } + insideAttributeArea = true; + } + else + { + if (nextAttributeName != null) + { + if (currentElement != null && currentElement is MarkupTagElement) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(currentString)); + nextAttributeName = null; + } + } + } + } + currentString = string.Empty; + } + else + { + if (currentString.Length == 0 || !char.IsWhiteSpace(currentString[currentString.Length - 1])) + { + currentString += ' '; + } + } + } + else + { + if (insidePreprocessor || currentString.Length == 0 || !char.IsWhiteSpace(currentString[currentString.Length - 1])) + { + currentString += c; + } + } + } + else + { + if (c == this.Settings.PreprocessorChar && insideString == 0 && insideTagDecl) + { + if (prevChar == this.Settings.TagBeginChar) + { + insidePreprocessor = true; + } + } + else if (insideSpecialDeclaration && c == this.Settings.CDataBeginChar) + { + string specialSectionName = tr.ReadUntil(this.Settings.CDataBeginChar.ToString()); + specialSectionName = specialSectionName.Substring(0, specialSectionName.Length); + tr.Accessor.Seek(1, IO.SeekOrigin.Current); + + string specialSectionContent = tr.ReadUntil(this.Settings.CDataEndChar.ToString()); + if (specialSectionContent.Length > 0) + { + specialSectionContent = specialSectionContent.Substring(0, specialSectionContent.Length); + } + + MarkupStringElement tag = new MarkupStringElement(); + tag.FullName = specialSectionName; + tag.Value = specialSectionContent; + + if (currentElement != null && (currentElement is MarkupContainerElement)) + { + (currentElement as MarkupContainerElement).Elements.Add(tag); + } + else + { + mom.Elements.Add(tag); + } + + char padNext = tr.ReadChar(); + padNext = tr.ReadChar(); + + // insideSpecialDeclaration = false; + continue; + } + else + { + currentString += c; + if (insideSpecialDeclaration) + { + if (currentString.Trim().Equals(this.Settings.TagSpecialDeclarationCommentStart)) + { + currentString = string.Empty; + MarkupCommentElement comment = new MarkupCommentElement(); + string commentContent = tr.ReadUntil(this.Settings.TagSpecialDeclarationCommentStart + this.Settings.TagEndChar, "", ""); + comment.Value = commentContent; + if (currentElement == null) + { + mom.Elements.Add(comment); + } + else + { + if (!(currentElement is MarkupContainerElement)) + { + throw new InvalidOperationException("Cannot add element to non-container object"); + } + (currentElement as MarkupContainerElement).Elements.Add(comment); + } + insideSpecialDeclaration = false; + insideTagDecl = false; + } + } + else + { + if (insideString != 0 || !char.IsWhiteSpace(c)) + { + } + } + } + } + } + } + } + } + } + } + prevChar = c; + } + + if (objectModel is MarkupObjectModel) + { + mom.CopyTo(objectModel); + } + } + + private string ReplaceEntitiesInput(string value) + { + string result; + if (string.IsNullOrEmpty(value)) + { + result = value; + } + else + { + string old = value; + foreach (KeyValuePair kvp in Settings.Entities) + { + string arg_6C_0 = old; + char c = this.mvarSettings.EntityBeginChar; + string arg_60_0 = c.ToString(); + string arg_60_1 = kvp.Key; + c = this.mvarSettings.EntityEndChar; + old = arg_6C_0.Replace(arg_60_0 + arg_60_1 + c.ToString(), kvp.Value); + } + result = old; + } + return result; + } + private string ReplaceEntitiesOutput(string value) + { + string result; + if (string.IsNullOrEmpty(value)) + { + result = value; + } + else + { + string old = value; + foreach (KeyValuePair kvp in Settings.Entities) + { + string arg_6C_0 = old; + string arg_6C_1 = kvp.Value; + char c = this.mvarSettings.EntityBeginChar; + string arg_67_0 = c.ToString(); + string arg_67_1 = kvp.Key; + c = this.mvarSettings.EntityEndChar; + old = arg_6C_0.Replace(arg_6C_1, arg_67_0 + arg_67_1 + c.ToString()); + } + result = old; + } + return result; + } + protected override void SaveInternal(ObjectModel objectModel) + { + IO.Writer tw = base.Accessor.Writer; + if (objectModel is MarkupObjectModel) + { + MarkupObjectModel mom = objectModel as MarkupObjectModel; + + if (mom.Elements.Count > 1 && (mvarCompensateTopLevelTagName != null)) + { + WriteStartTag(mvarCompensateTopLevelTagName); + } + + foreach (MarkupElement element in mom.Elements) + { + WriteElement(element, 0); + } + + if (mom.Elements.Count > 1 && (mvarCompensateTopLevelTagName != null)) + { + WriteEndTag(mvarCompensateTopLevelTagName); + } + } + else + { + if (objectModel is PropertyListObjectModel) + { + PropertyListObjectModel plom = objectModel as PropertyListObjectModel; + tw.Write(this.Settings.TagBeginChar.ToString()); + tw.Write(this.Settings.PreprocessorChar.ToString()); + tw.Write("xml version=\"1.0\" encoding=\"UTF-8\" "); + tw.Write(this.Settings.PreprocessorChar.ToString()); + tw.Write(this.Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + + tw.Write(this.Settings.TagBeginChar.ToString()); + tw.Write("document"); + tw.Write(this.Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + + foreach (Group g in plom.Groups) + { + this.WriteXMLPropertyGroup(tw, g, 1); + } + foreach (Property p in plom.Properties) + { + this.WriteXMLProperty(tw, p, 1); + } + + tw.Write(this.Settings.TagBeginChar.ToString()); + tw.Write(this.Settings.TagCloseChar.ToString()); + tw.Write("document"); + tw.Write(this.Settings.TagEndChar.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + } + tw.Flush(); + } + private void WriteXMLPropertyGroup(IO.Writer tw, Group g, int indentLevel) + { + string indent = new string('\t', indentLevel); + char c = this.Settings.TagBeginChar; + string arg_37_0 = c.ToString(); + string arg_37_1 = g.Name; + c = this.Settings.TagEndChar; + tw.Write(arg_37_0 + arg_37_1 + c.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + + foreach (Group g2 in g.Groups) + { + this.WriteXMLPropertyGroup(tw, g2, indentLevel + 1); + } + foreach (Property p in g.Properties) + { + this.WriteXMLProperty(tw, p, indentLevel + 1); + } + c = this.Settings.TagBeginChar; + string arg_116_0 = c.ToString(); + c = this.Settings.TagCloseChar; + string arg_116_1 = c.ToString(); + string arg_116_2 = g.Name; + c = this.Settings.TagEndChar; + tw.Write(arg_116_0 + arg_116_1 + arg_116_2 + c.ToString()); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + private void WriteXMLProperty(IO.Writer tw, Property p, int indentLevel) + { + string indent = new string('\t', indentLevel); + string[] array = new string[8]; + string[] arg_27_0 = array; + int arg_27_1 = 0; + char c = this.Settings.TagBeginChar; + arg_27_0[arg_27_1] = c.ToString(); + array[1] = p.Name; + string[] arg_46_0 = array; + int arg_46_1 = 2; + c = this.Settings.TagEndChar; + arg_46_0[arg_46_1] = c.ToString(); + array[3] = this.ReplaceEntitiesOutput(p.Value.ToString()); + string[] arg_70_0 = array; + int arg_70_1 = 4; + c = this.Settings.TagBeginChar; + arg_70_0[arg_70_1] = c.ToString(); + string[] arg_86_0 = array; + int arg_86_1 = 5; + c = this.Settings.TagCloseChar; + arg_86_0[arg_86_1] = c.ToString(); + array[6] = p.Name; + string[] arg_A5_0 = array; + int arg_A5_1 = 7; + c = this.Settings.TagEndChar; + arg_A5_0[arg_A5_1] = c.ToString(); + tw.Write(string.Concat(array)); + if (mvarSettings.PrettyPrint) tw.WriteLine(); + } + + public MarkupElement ReadElement() + { + // Read the next element from the XML stream + IO.Reader tr = base.Accessor.Reader; + + #region This code is blatantly copied from LoadInternal() - is there a better way to do this? + bool insideTagDecl = false; + int insideString = 0; + bool closingCurrentElement = false; + string currentString = string.Empty; + MarkupElement currentElement = null; + bool insidePreprocessor = false; + bool insideAttributeArea = false; + bool insideSpecialDeclaration = false; + bool insideTagValue = false; + char prevChar = '\0'; + string nextAttributeName = null; + bool loaded = false; + while (!tr.EndOfStream) + { + char c = (char)tr.ReadChar(); + if (!loaded && (c != '<')) + { + return null; + } + else + { + loaded = true; + } + if (c == this.Settings.TagBeginChar) + { + if (insideString == 0 && !insidePreprocessor) + { + insideTagDecl = true; + insideTagValue = false; + if (!string.IsNullOrEmpty(currentString) && currentElement != null) + { + currentElement.Value += currentString; + currentElement.Value = this.ReplaceEntitiesInput(currentElement.Value.Trim()); + currentString = string.Empty; + } + } + else + { + currentString += c; + } + } + else + { + if (c == this.Settings.TagSpecialDeclarationStartChar) + { + if (insideString == 0 && !insidePreprocessor && !insideTagValue && !insideAttributeArea) + { + insideSpecialDeclaration = true; + continue; + } + if (insideTagValue || insideAttributeArea) + { + currentString += c; + } + } + else + { + if (c == this.Settings.TagEndChar) + { + if (insideString == 0 && ((insidePreprocessor && prevChar == this.Settings.PreprocessorChar) || prevChar != this.Settings.PreprocessorChar)) + { + insideTagDecl = false; + if (currentString.EndsWith(this.Settings.TagSpecialDeclarationCommentStart)) + { + currentString = currentString.Substring(0, currentString.Length - this.Settings.TagSpecialDeclarationCommentStart.Length); + currentElement.Value = this.ReplaceEntitiesInput(currentString); + currentString = string.Empty; + currentElement = currentElement.Parent; + continue; + } + if (insidePreprocessor && prevChar == this.Settings.PreprocessorChar) + { + MarkupElement prevElement = currentElement; + currentElement = new MarkupPreprocessorElement(); + string name = string.Empty; + string content = currentString; + if (currentString.Contains(" ")) + { + name = currentString.Substring(0, currentString.IndexOf(' ')); + content = currentString.Substring(name.Length + 1); + } + currentElement.Name = name.Trim(); + currentElement.Value = content.Trim(); + if (prevElement != null && prevElement is MarkupContainerElement) + { + (prevElement as MarkupContainerElement).Elements.Add(currentElement); + } + else + { + return currentElement; + } + currentElement = prevElement; + insidePreprocessor = false; + } + else + { + if (closingCurrentElement) + { + if (currentElement != null) + { + if (currentElement.FullName == currentString || prevChar == this.Settings.TagCloseChar) + { + currentElement = currentElement.Parent; + } + else + { + if (Settings.AutoCloseTagNames.Contains(currentElement.Name)) + { + currentElement = currentElement.Parent; + if (currentElement != null) + { + currentElement = currentElement.Parent; + } + } + else + { + Console.WriteLine("uds: XMLDataFormat: attempted to close element '" + currentElement.Name + "'; invalid XML?"); + } + } + } + else + { + Console.WriteLine("FIXME: UniversalDataStorage/FileFormats/Markup/XMLFileFormat.cs:144 currentElement is null"); + } + closingCurrentElement = false; + } + else + { + insideTagValue = true; + if (insideAttributeArea) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(currentString)); + nextAttributeName = null; + insideAttributeArea = false; + } + else + { + MarkupElement prevElement = currentElement; + currentElement = new MarkupTagElement(); + currentElement.FullName = currentString.Trim(); + if (prevElement != null && prevElement is MarkupContainerElement) + { + (prevElement as MarkupContainerElement).Elements.Add(currentElement); + } + else + { + return currentElement; + } + if (Settings.AutoCloseTagNames.Contains(currentElement.Name)) + { + currentElement = currentElement.Parent; + } + } + } + } + currentString = string.Empty; + insideAttributeArea = false; + } + else + { + currentString += c; + } + } + else + { + if (c == this.Settings.TagCloseChar) + { + if (insideString == 0 && !insidePreprocessor && insideTagDecl) + { + if (currentElement == null) + { + goto IL_4CC; + } + IL_4CC: + if (insideAttributeArea && currentElement is MarkupTagElement && nextAttributeName != null) + { + if (nextAttributeName != null) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(currentString)); + nextAttributeName = null; + currentString = string.Empty; + } + } + else + { + if (!insideAttributeArea) + { + if (currentElement != null) + { + if (currentElement is MarkupTagElement && !string.IsNullOrEmpty(currentString)) + { + MarkupTagElement e = new MarkupTagElement(); + e.Name = currentString; + (currentElement as MarkupTagElement).Elements.Add(e); + currentElement = e; + } + } + else + { + Console.WriteLine("FIXME: UniversalDataStorage/FileFormats/Markup/XMLFileFormat.cs:199 currentElement is null"); + } + } + } + currentString = string.Empty; + closingCurrentElement = true; + } + else + { + currentString += c; + } + } + else + { + if (c == this.Settings.AttributeNameValueSeparatorChar) + { + if (insideString == 0 && !insidePreprocessor && !insideTagValue) + { + if (insideAttributeArea) + { + nextAttributeName = currentString; + currentString = string.Empty; + char ccq = tr.PeekChar(); + if (ccq != '"' && ccq != '\'') + { + char cc = '\0'; + string nnn = string.Empty; + while (cc != this.Settings.TagEndChar) + { + cc = tr.PeekChar(); + if (cc == this.Settings.TagEndChar) + { + break; + } + nnn += tr.ReadChar(); + if (tr.EndOfStream) + { + break; + } + } + string value = nnn; + string arg_6A8_0 = nnn; + char c2 = this.Settings.AttributeNameValueSeparatorChar; + if (arg_6A8_0.Contains(c2.ToString())) + { + int l = nnn.IndexOf(' '); + value = nnn.Substring(0, l); + string nnnn = nnn.Substring(value.Length).Trim(); + string nnnnAttributeName = string.Empty; + string nnnnAttributeValue = string.Empty; + bool nnnnLookForValue = false; + int nnnnIsInsideString = 0; + for (int i = 0; i < nnnn.Length; i++) + { + char r = nnnn[i]; + if (r == this.Settings.AttributeNameValueSeparatorChar) + { + if (nnnnIsInsideString == 0) + { + nnnnLookForValue = true; + } + } + else + { + if (r == '\'' || r == '"') + { + if ((r == '\'' && nnnnIsInsideString == 2) || (r == '"' && nnnnIsInsideString == 1)) + { + nnnnIsInsideString = 0; + } + else + { + if (r == '"') + { + nnnnIsInsideString = 1; + } + else + { + if (r == '\'') + { + nnnnIsInsideString = 2; + } + } + } + } + else + { + if (r == ' ' && nnnnIsInsideString == 0) + { + if (currentElement != null) + { + if (currentElement is MarkupTagElement) + { + (currentElement as MarkupTagElement).Attributes.Add(nnnnAttributeName, this.ReplaceEntitiesInput(nnnnAttributeValue)); + nnnnAttributeName = string.Empty; + nnnnAttributeValue = string.Empty; + nnnnLookForValue = false; + } + } + } + else + { + if (nnnnLookForValue) + { + nnnnAttributeValue += r; + } + else + { + nnnnAttributeName += r; + } + } + } + } + } + if (!string.IsNullOrEmpty(nnnnAttributeName)) + { + (currentElement as MarkupTagElement).Attributes.Add(nnnnAttributeName, this.ReplaceEntitiesInput(nnnnAttributeValue)); + nnnnAttributeName = string.Empty; + nnnnAttributeValue = string.Empty; + } + } + if (currentElement != null) + { + if (currentElement is MarkupTagElement) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(value)); + nextAttributeName = null; + } + } + currentString = string.Empty; + continue; + } + } + } + else + { + currentString += c; + } + } + else + { + if (c == '"' || c == '\'') + { + if (!insidePreprocessor) + { + if (!insideTagDecl) + { + currentString += c; + continue; + } + int cur = 0; + if (c == '"') + { + cur = 1; + } + if (c == '\'') + { + cur = 2; + } + if (insideString == 0) + { + insideString = cur; + } + else + { + if (insideString == cur) + { + insideString = 0; + } + else + { + currentString += c; + } + } + } + else + { + currentString += c; + } + } + else + { + if (char.IsWhiteSpace(c)) + { + if (insideString == 0 && !insidePreprocessor) + { + if (char.IsWhiteSpace(prevChar)) + { + continue; + } + if (insideTagDecl) + { + if (insideSpecialDeclaration) + { + if (currentString.Trim() == "DOCTYPE") + { + char c2 = this.mvarSettings.TagEndChar; + string doctype = tr.ReadUntil(c2.ToString(), "\"", "\""); + doctype = doctype.Substring(0, doctype.Length - 1); + string[] doctypeParts = doctype.Split(new string[] + { + " " + }, "\"", "\""); + insideTagDecl = false; + insideSpecialDeclaration = false; + } + } + else + { + if (!insideAttributeArea) + { + MarkupElement prevElement = currentElement; + currentElement = new MarkupTagElement(); + currentElement.Name = currentString.Trim(); + if (prevElement == null) + { + return currentElement; + } + else + { + if (!(prevElement is MarkupContainerElement)) + { + throw new InvalidOperationException("Cannot add element to non-container object"); + } + (prevElement as MarkupContainerElement).Elements.Add(currentElement); + } + insideAttributeArea = true; + } + else + { + if (nextAttributeName != null) + { + if (currentElement != null && currentElement is MarkupTagElement) + { + (currentElement as MarkupTagElement).Attributes.Add(nextAttributeName, this.ReplaceEntitiesInput(currentString)); + nextAttributeName = null; + } + } + } + } + currentString = string.Empty; + } + else + { + if (currentString.Length == 0 || !char.IsWhiteSpace(currentString[currentString.Length - 1])) + { + currentString += ' '; + } + } + } + else + { + if (insidePreprocessor || currentString.Length == 0 || !char.IsWhiteSpace(currentString[currentString.Length - 1])) + { + currentString += c; + } + } + } + else + { + if (c == this.Settings.PreprocessorChar && insideString == 0 && insideTagDecl) + { + if (prevChar == this.Settings.TagBeginChar) + { + insidePreprocessor = true; + } + } + else + { + currentString += c; + if (insideSpecialDeclaration) + { + if (currentString.Trim().Equals(this.Settings.TagSpecialDeclarationCommentStart)) + { + currentString = string.Empty; + MarkupCommentElement comment = new MarkupCommentElement(); + string commentContent = tr.ReadUntil(this.Settings.TagSpecialDeclarationCommentStart + this.Settings.TagEndChar, "", ""); + comment.Value = commentContent; + if (currentElement == null) + { + return comment; + } + else + { + if (!(currentElement is MarkupContainerElement)) + { + throw new InvalidOperationException("Cannot add element to non-container object"); + } + (currentElement as MarkupContainerElement).Elements.Add(comment); + } + insideSpecialDeclaration = false; + insideTagDecl = false; + } + } + else + { + if (insideString != 0 || !char.IsWhiteSpace(c)) + { + } + } + } + } + } + } + } + } + } + } + prevChar = c; + } + #endregion + + return null; + } + + public static string GetXSDTypeFromNativeType(Type type) + { + if (type == typeof(String)) + { + return "xsd:string"; + } + else if (type == typeof(Int16) || type == typeof(Int32) || type == typeof(Int64) || type == typeof(UInt16) || type == typeof(UInt32) || type == typeof(UInt64)) + { + return "xsd:integer"; + } + return String.Empty; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormatSettings.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormatSettings.cs new file mode 100644 index 00000000..640d3801 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Markup/XML/XMLDataFormatSettings.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.DataFormats.Markup.XML +{ + public class XMLDataFormatSettings + { + private char mvarTagBeginChar = '<'; + private char mvarTagSpecialDeclarationStartChar = '!'; + private string mvarTagSpecialDeclarationCommentStart = "--"; + private char mvarTagEndChar = '>'; + private char mvarTagCloseChar = '/'; + private char mvarPreprocessorChar = '?'; + private char mvarTagNamespaceSeparatorChar = ':'; + private char mvarAttributeNameValueSeparatorChar = '='; + private char mvarEntityBeginChar = '&'; + private char mvarEntityEndChar = ';'; + public char TagBeginChar + { + get + { + return this.mvarTagBeginChar; + } + set + { + this.mvarTagBeginChar = value; + } + } + public char TagSpecialDeclarationStartChar + { + get + { + return this.mvarTagSpecialDeclarationStartChar; + } + set + { + this.mvarTagSpecialDeclarationStartChar = value; + } + } + public string TagSpecialDeclarationCommentStart + { + get + { + return this.mvarTagSpecialDeclarationCommentStart; + } + set + { + this.mvarTagSpecialDeclarationCommentStart = value; + } + } + public char TagEndChar + { + get + { + return this.mvarTagEndChar; + } + set + { + this.mvarTagEndChar = value; + } + } + public char TagCloseChar + { + get + { + return this.mvarTagCloseChar; + } + set + { + this.mvarTagCloseChar = value; + } + } + public char PreprocessorChar + { + get + { + return this.mvarPreprocessorChar; + } + set + { + this.mvarPreprocessorChar = value; + } + } + public char TagNamespaceSeparatorChar + { + get + { + return this.mvarTagNamespaceSeparatorChar; + } + set + { + this.mvarTagNamespaceSeparatorChar = value; + } + } + public char AttributeNameValueSeparatorChar + { + get + { + return this.mvarAttributeNameValueSeparatorChar; + } + set + { + this.mvarAttributeNameValueSeparatorChar = value; + } + } + public char EntityBeginChar + { + get + { + return this.mvarEntityBeginChar; + } + set + { + this.mvarEntityBeginChar = value; + } + } + public char EntityEndChar + { + get + { + return this.mvarEntityEndChar; + } + set + { + this.mvarEntityEndChar = value; + } + } + + private bool mvarIsStandalone = false; + public bool IsStandalone { get { return mvarIsStandalone; } set { mvarIsStandalone = value; } } + + private System.Collections.Specialized.StringCollection mvarAutoCloseTagNames = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection AutoCloseTagNames { get { return mvarAutoCloseTagNames; } } + + private Collections.Generic.BidirectionalDictionary mvarEntities = new Collections.Generic.BidirectionalDictionary(); + public Collections.Generic.BidirectionalDictionary Entities { get { return mvarEntities; } } + + private char mvarCDataBeginChar = '['; + public char CDataBeginChar { get { return mvarCDataBeginChar; } set { mvarCDataBeginChar = value; } } + private char mvarCDataEndChar = ']'; + public char CDataEndChar { get { return mvarCDataEndChar; } set { mvarCDataEndChar = value; } } + + private bool mvarPrettyPrint = true; + /// + /// Determines whether to insert tabs and spaces to "pretty-print" the output XML. + /// + public bool PrettyPrint { get { return mvarPrettyPrint; } set { mvarPrettyPrint = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs new file mode 100644 index 00000000..b4e3861c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationDataFormat.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.IO; + +namespace UniversalEditor.DataFormats.PropertyList.ExtensibleConfiguration +{ + public class ExtensibleConfigurationDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private int mvarIndentLength = 4; + public int IndentLength { get { return this.mvarIndentLength; } set { this.mvarIndentLength = value; } } + + private ExtensibleConfigurationSettings mvarSettings = new ExtensibleConfigurationSettings(); + protected ExtensibleConfigurationSettings Settings { get { return mvarSettings; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PropertyListObjectModel plom = objectModel as PropertyListObjectModel; + Reader tr = base.Accessor.Reader; + string nextString = string.Empty; + string nextPropertyName = string.Empty; + bool insideQuotedString = false; + bool escaping = false; + Group nextGroup = null; + + // true if a real char (non-whitespace) was found; false otherwise + bool foundRealChar = false; + + while (!tr.EndOfStream) + { + if (nextString.StartsWith(mvarSettings.SingleLineCommentStart)) + { + string comment = tr.ReadLine(); + } + if (nextString.StartsWith(mvarSettings.MultiLineCommentStart)) + { + string comment = tr.ReadUntil(mvarSettings.MultiLineCommentEnd); + string cmntend = tr.ReadFixedLengthString(mvarSettings.MultiLineCommentEnd.Length); + nextString = String.Empty; + continue; + } + + char nextChar = tr.ReadChar(); + if (!foundRealChar) + { + if (!Char.IsWhiteSpace(nextChar)) + { + foundRealChar = true; + } + else + { + continue; + } + } + + if (insideQuotedString) + { + if (nextChar == '"') + { + if (!escaping) + { + insideQuotedString = false; + continue; + } + } + else + { + if (nextChar == '\\') + { + if (!escaping) + { + escaping = true; + continue; + } + } + } + nextString += nextChar; + escaping = false; + } + else + { + char c = nextChar; + string cw = c.ToString(); + if (c == '"') + { + insideQuotedString = !insideQuotedString; + continue; + } + else if (cw == mvarSettings.PropertyNameValueSeparator && (mvarSettings.AllowTopLevelProperties || nextGroup != null)) + { + nextPropertyName = nextString; + nextString = string.Empty; + foundRealChar = false; + } + else if (cw == mvarSettings.PropertySeparator && (mvarSettings.AllowTopLevelProperties || nextGroup != null)) + { + if (nextPropertyName != null) + { + nextPropertyName = nextPropertyName.Trim(); + nextString = nextString.Trim(); + + if (nextGroup != null) + { + nextGroup.Properties.Add(nextPropertyName, nextString); + } + else + { + plom.Properties.Add(nextPropertyName, nextString); + } + } + nextPropertyName = string.Empty; + nextString = string.Empty; + foundRealChar = false; + } + else if (cw == mvarSettings.GroupStart) + { + Group group = new Group(); + group.Name = nextString.Trim(); + nextString = string.Empty; + if (nextGroup != null) + { + nextGroup.Groups.Add(group); + } + else + { + plom.Groups.Add(group); + } + nextGroup = group; + } + else if (cw == mvarSettings.GroupEnd) + { + if (nextGroup != null) + { + nextGroup = nextGroup.Parent; + } + } + else + { + nextString += nextChar; + continue; + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PropertyListObjectModel plom = objectModel as PropertyListObjectModel; + Writer tw = base.Accessor.Writer; + foreach (Property p in plom.Properties) + { + tw.Write(mvarSettings.PropertyNamePrefix); + tw.Write(p.Name); + tw.Write(mvarSettings.PropertyNameSuffix); + tw.Write(mvarSettings.PropertyNameValueSeparator); + tw.Write(mvarSettings.PropertyValuePrefix); + tw.WriteFixedLengthString(p.Value.ToString()); + tw.Write(mvarSettings.PropertyValueSuffix); + } + foreach (Group g in plom.Groups) + { + this.WriteGroup(tw, g, 0); + } + tw.Flush(); + tw.Close(); + } + private void WriteGroup(Writer tw, Group group, int indent) + { + string indents = new string(' ', indent * this.mvarIndentLength); + tw.Write(indents + group.Name); + if (mvarSettings.InlineGroupStart) + { + tw.Write(' '); + tw.Write(mvarSettings.GroupStart); + tw.WriteLine(); + } + else + { + tw.WriteLine(); + tw.WriteLine(indents + mvarSettings.GroupStart); + } + foreach (Property p in group.Properties) + { + tw.WriteLine(string.Concat(new object[] + { + indents, + new string(' ', this.mvarIndentLength), + p.Name, + mvarSettings.PropertyNameValueSeparator, + mvarSettings.PropertyValuePrefix, + p.Value, + mvarSettings.PropertyValueSuffix, + mvarSettings.PropertySeparator + })); + } + foreach (Group g in group.Groups) + { + this.WriteGroup(tw, g, indent + 1); + } + tw.WriteLine(indents + mvarSettings.GroupEnd); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs new file mode 100644 index 00000000..7312d1fc --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/ExtensibleConfiguration/ExtensibleConfigurationSettings.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.PropertyList.ExtensibleConfiguration +{ + public class ExtensibleConfigurationSettings + { + private string mvarPropertyNamePrefix = String.Empty; + public string PropertyNamePrefix { get { return mvarPropertyNamePrefix; } set { mvarPropertyNamePrefix = value; } } + + private string mvarPropertyNameSuffix = String.Empty; + public string PropertyNameSuffix { get { return mvarPropertyNameSuffix; } set { mvarPropertyNameSuffix = value; } } + + private string mvarPropertyNameValueSeparator = "="; + public string PropertyNameValueSeparator { get { return mvarPropertyNameValueSeparator; } set { mvarPropertyNameValueSeparator = value; } } + + private string mvarPropertyValuePrefix = "\""; + public string PropertyValuePrefix { get { return mvarPropertyValuePrefix; } set { mvarPropertyValuePrefix = value; } } + + private string mvarPropertyValueSuffix = "\""; + public string PropertyValueSuffix { get { return mvarPropertyValueSuffix; } set { mvarPropertyValueSuffix = value; } } + + private string mvarPropertySeparator = ";"; + public string PropertySeparator { get { return mvarPropertySeparator; } set { mvarPropertySeparator = value; } } + + private string mvarMultiLineCommentStart = "/*"; + public string MultiLineCommentStart { get { return mvarMultiLineCommentStart; } set { mvarMultiLineCommentStart = value; } } + + private string mvarMultiLineCommentEnd = "*/"; + public string MultiLineCommentEnd { get { return mvarMultiLineCommentEnd; } set { mvarMultiLineCommentEnd = value; } } + + private string mvarSingleLineCommentStart = "//"; + public string SingleLineCommentStart { get { return mvarSingleLineCommentStart; } set { mvarSingleLineCommentStart = value; } } + + private string mvarGroupStart = "{"; + public string GroupStart { get { return mvarGroupStart; } set { mvarGroupStart = value; } } + + private string mvarGroupEnd = "}"; + public string GroupEnd { get { return mvarGroupEnd; } set { mvarGroupEnd = value; } } + + private bool mvarInlineGroupStart = true; + /// + /// Determines whether the group start character (default '{') should be placed on the same line as the group name. + /// + public bool InlineGroupStart { get { return mvarInlineGroupStart; } set { mvarInlineGroupStart = value; } } + + private bool mvarAllowTopLevelProperties = true; + /// + /// Determines whether top-level properties (i.e., those outside of a group definition) are allowed. + /// + public bool AllowTopLevelProperties { get { return mvarAllowTopLevelProperties; } set { mvarAllowTopLevelProperties = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListDataFormat.cs new file mode 100644 index 00000000..749fe47c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListDataFormat.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.DataFormats.PropertyList.Text +{ + public class TextPropertyListDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.All); + _dfr.ExportOptions.Add(new CustomOptionText("Title", "&Title: ", "Text Property List")); + } + return _dfr; + } + + private TextPropertyListSettings mvarSettings = new TextPropertyListSettings(); + public TextPropertyListSettings Settings { get { return mvarSettings; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PropertyListObjectModel plom = (objectModel as PropertyListObjectModel); + if (plom == null) throw new ObjectModelNotSupportedException(); + + base.Accessor.DefaultEncoding = IO.Encoding.UTF8; + IO.Reader tr = new IO.Reader(base.Accessor); + string signature = tr.ReadLine(); + if (!signature.StartsWith("#TPL-1.0")) throw new InvalidDataFormatException(); + + Group parentGroup = null; + + plom.Title = signature.Substring(8); + + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + line = line.Trim(); + line = TrimComments(line); + if (String.IsNullOrEmpty(line)) continue; + + if (line.StartsWith("Begin ")) + { + string blockName = line.Substring(6); + Group group = new Group(); + group.Name = blockName; + if (parentGroup != null) + { + parentGroup.Groups.Add(group); + } + else + { + plom.Groups.Add(group); + } + parentGroup = group; + } + else if (line.StartsWith("End ")) + { + string blockName = line.Substring(4); + if (parentGroup != null && parentGroup.Name == blockName) + { + parentGroup = parentGroup.Parent; + } + else if (parentGroup != null) + { + throw new InvalidDataFormatException("End block name \"" + blockName + "\" does not match start block name \"" + parentGroup.Name + "\""); + } + else + { + throw new InvalidDataFormatException("End block name \"" + blockName + "\" encountered when block was not started"); + } + } + else + { + string[] splits = line.Split(Settings.PropertyNameValueSeparators, mvarSettings.IgnoreBegin, mvarSettings.IgnoreEnd, StringSplitOptions.RemoveEmptyEntries, 2, true); + string name = splits[0].Trim(); + string value = null; + if (splits.Length > 1) value = splits[1]; + + Property property = new Property(name, value); + if (parentGroup != null) + { + parentGroup.Properties.Add(property); + } + else + { + plom.Properties.Add(property); + } + } + } + } + + private string TrimComments(string line) + { + string line2 = (line.Clone() as string); + foreach (string comment in mvarSettings.CommentSignals) + { + int indexof = line2.IndexOf(comment); + if (indexof > -1) + { + line2 = line2.Substring(0, indexof); + } + } + return line2; + } + + protected override void SaveInternal(ObjectModel objectModel) + { + PropertyListObjectModel plom = (objectModel as PropertyListObjectModel); + if (plom == null) throw new ObjectModelNotSupportedException(); + + base.Accessor.DefaultEncoding = UniversalEditor.IO.Encoding.UTF8; + IO.Writer tw = new IO.Writer(base.Accessor); + tw.WriteLine("#TPL-1.0 " + plom.Title); + + foreach (Group group in plom.Groups) + { + WriteGroup(tw, group); + } + foreach (Property property in plom.Properties) + { + WriteProperty(tw, property); + } + + tw.Flush(); + } + + private void WriteGroup(IO.Writer tw, Group group, int indent = 0) + { + string indentStr = new string('\t', indent); + tw.WriteLine(indentStr + "Begin " + group.Name); + foreach (Group group1 in group.Groups) + { + WriteGroup(tw, group1, indent + 1); + } + foreach (Property property in group.Properties) + { + WriteProperty(tw, property, indent); + } + tw.WriteLine(indentStr + "End " + group.Name); + } + + private void WriteProperty(IO.Writer tw, Property property, int indent = 0) + { + string indentStr = new string('\t', indent); + tw.WriteLine(indentStr + property.Name + "\t" + property.Value); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListSettings.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListSettings.cs new file mode 100644 index 00000000..68e794ee --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/Text/TextPropertyListSettings.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.PropertyList.Text +{ + public class TextPropertyListSettings + { + private string[] mvarCommentSignals = new string[] { ";" }; + public string[] CommentSignals { get { return mvarCommentSignals; } set { mvarCommentSignals = value; } } + + private string[] mvarPropertyNameValueSeparators = new string[] { " ", "\t" }; + public string[] PropertyNameValueSeparators { get { return mvarPropertyNameValueSeparators; } set { mvarPropertyNameValueSeparators = value; } } + + private string mvarIgnoreBegin = "\""; + public string IgnoreBegin { get { return mvarIgnoreBegin; } set { mvarIgnoreBegin = value; } } + + private string mvarIgnoreEnd = "\""; + public string IgnoreEnd { get { return mvarIgnoreEnd; } set { mvarIgnoreEnd = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/UniversalPropertyListDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/UniversalPropertyListDataFormat.cs new file mode 100644 index 00000000..8722658a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/UniversalPropertyListDataFormat.cs @@ -0,0 +1,416 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.DataFormats.PropertyList.UniversalPropertyList +{ + public class UniversalPropertyListDataFormat : DataFormat + { + private const int HEADER_SIZE = 20; + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.All); + _dfr.ExportOptions.Add(new CustomOptionChoice("FormatVersion", "Format version:", true, new CustomOptionFieldChoice("1.0", 1.0f))); + } + return _dfr; + } + + private float mvarFormatVersion = 1.0f; + public float FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PropertyListObjectModel plom = (objectModel as PropertyListObjectModel); + if (plom == null) return; + + Reader br = base.Accessor.Reader; + string UPLF = br.ReadFixedLengthString(4); + if (UPLF != "UPLF") throw new InvalidDataFormatException(); + + mvarFormatVersion = br.ReadSingle(); + + int filesize = br.ReadInt32(); + plom.Title = br.ReadNullTerminatedString(); + + int propertyCount = br.ReadInt32(); + int groupCount = br.ReadInt32(); + + for (int i = 0; i < propertyCount; i++) + { + Property property = ReadProperty(br); + plom.Properties.Add(property); + } + for (int i = 0; i < groupCount; i++) + { + Group group = ReadGroup(br); + plom.Groups.Add(group); + } + } + + private Property ReadProperty(Reader br) + { + Property p = new Property(); + + VariantType propertyType = (VariantType)br.ReadByte(); + p.Name = br.ReadNullTerminatedString(); + p.Value = ReadVariant(br, propertyType); + return p; + } + + private object ReadVariant(Reader br, VariantType variantType) + { + switch (variantType) + { + case VariantType.Array: return ReadVariantArray(br); + case VariantType.Boolean: return br.ReadBoolean(); + case VariantType.Byte: return br.ReadByte(); + case VariantType.Char: return br.ReadChar(); + case VariantType.DateTime: return br.ReadDateTime(); + case VariantType.Decimal: return br.ReadDecimal(); + case VariantType.Double: return br.ReadDouble(); + case VariantType.Guid: return br.ReadGuid(); + case VariantType.Int16: return br.ReadInt16(); + case VariantType.Int32: return br.ReadInt32(); + case VariantType.Int64: return br.ReadInt64(); + case VariantType.Object: throw new NotImplementedException(); + case VariantType.SByte: return br.ReadSByte(); + case VariantType.Single: return br.ReadSingle(); + case VariantType.String: return br.ReadNullTerminatedString(); + case VariantType.UInt16: return br.ReadUInt16(); + case VariantType.UInt32: return br.ReadUInt32(); + case VariantType.UInt64: return br.ReadUInt64(); + } + return null; + } + private object ReadVariantArray(Reader br) + { + VariantType arrayItemType = (VariantType)br.ReadByte(); + int arrayItemCount = br.ReadInt32(); + + switch (arrayItemType) + { + case VariantType.Array: + { + object[] items = new object[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = ReadVariantArray(br); + return items; + } + case VariantType.Boolean: + { + bool[] items = new bool[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadBoolean(); + return items; + } + case VariantType.Byte: + { + byte[] items = new byte[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadByte(); + return items; + } + case VariantType.Char: + { + char[] items = new char[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadChar(); + return items; + } + case VariantType.DateTime: + { + DateTime[] items = new DateTime[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadDateTime(); + return items; + } + case VariantType.Decimal: + { + decimal[] items = new decimal[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadDecimal(); + return items; + } + case VariantType.Double: + { + double[] items = new double[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadDouble(); + return items; + } + case VariantType.Guid: + { + Guid[] items = new Guid[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadGuid(); + return items; + } + case VariantType.Int16: + { + short[] items = new short[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadInt16(); + return items; + } + case VariantType.Int32: + { + int[] items = new int[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadInt32(); + return items; + } + case VariantType.Int64: + { + long[] items = new long[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadInt64(); + return items; + } + case VariantType.Object: + { + throw new NotImplementedException(); + } + case VariantType.SByte: + { + sbyte[] items = new sbyte[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadSByte(); + return items; + } + case VariantType.Single: + { + float[] items = new float[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadSingle(); + return items; + } + case VariantType.UInt16: + { + ushort[] items = new ushort[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadUInt16(); + return items; + } + case VariantType.UInt32: + { + uint[] items = new uint[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadUInt32(); + return items; + } + case VariantType.UInt64: + { + ulong[] items = new ulong[arrayItemCount]; + for (int i = 0; i < arrayItemCount; i++) items[i] = br.ReadUInt64(); + return items; + } + } + return null; + } + + private Group ReadGroup(Reader br) + { + Group group = new Group(); + group.Name = br.ReadNullTerminatedString(); + + int propertyCount = br.ReadInt32(); + int groupCount = br.ReadInt32(); + + for (int i = 0; i < propertyCount; i++) + { + Property p = ReadProperty(br); + group.Properties.Add(p); + } + for (int i = 0; i < groupCount; i++) + { + Group g = ReadGroup(br); + group.Groups.Add(g); + } + return group; + } + + protected override void SaveInternal(ObjectModel objectModel) + { + PropertyListObjectModel plom = (objectModel as PropertyListObjectModel); + if (plom == null) return; + + Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("UPLF"); + bw.WriteSingle(mvarFormatVersion); + + int filesize = 0; + filesize += HEADER_SIZE; + filesize += (plom.Title.Length + 1); + foreach (Property p in plom.Properties) + { + filesize += GetPropertySize(p); + } + foreach (Group g in plom.Groups) + { + filesize += GetGroupSize(g); + } + + bw.WriteInt32(filesize); + bw.WriteNullTerminatedString(plom.Title); + + bw.WriteInt32(plom.Properties.Count); + bw.WriteInt32(plom.Groups.Count); + + foreach (Property p in plom.Properties) + { + WriteProperty(bw, p); + } + foreach (Group g in plom.Groups) + { + WriteGroup(bw, g); + } + } + + private int GetPropertySize(Property p) + { + int filesize = 0; + filesize += (1 + p.Name.Length + 1); + filesize += GetVariantSize(p.Value); + return filesize; + } + private int GetGroupSize(Group g) + { + int groupsize = 0; + groupsize += (g.Name.Length + 1) + 8; + foreach (Property p1 in g.Properties) groupsize += GetPropertySize(p1); + foreach (Group g1 in g.Groups) groupsize += GetGroupSize(g1); + return groupsize; + } + + private int GetVariantSize(object value) + { + int filesize = 0; + switch (GetVariantType(value)) + { + case VariantType.Array: + { + Array array = (value as Array); + filesize += 5; + for (int i = 0; i < array.Length; i++) + { + filesize += GetVariantSize(array.GetValue(i)); + } + break; + } + case VariantType.Boolean: + case VariantType.Byte: + case VariantType.Char: + case VariantType.SByte: + { + filesize += 1; + break; + } + case VariantType.Int16: + case VariantType.UInt16: + { + filesize += 2; + break; + } + case VariantType.DateTime: + case VariantType.Int32: + case VariantType.Single: + case VariantType.UInt32: + { + filesize += 4; + break; + } + case VariantType.Int64: + case VariantType.UInt64: + case VariantType.Double: + { + filesize += 8; + break; + } + case VariantType.String: + { + filesize += (value as string).Length + 1; + break; + } + } + return filesize; + } + + private void WriteProperty(Writer bw, Property p) + { + VariantType propertyType = GetVariantType(p.Value); + bw.WriteByte((byte)propertyType); + bw.WriteNullTerminatedString(p.Name); + WriteVariant(bw, propertyType, p.Value); + } + + private void WriteGroup(Writer bw, Group g) + { + bw.WriteNullTerminatedString(g.Name); + bw.WriteInt32(g.Properties.Count); + bw.WriteInt32(g.Groups.Count); + + foreach (Property p1 in g.Properties) + { + WriteProperty(bw, p1); + } + foreach (Group g1 in g.Groups) + { + WriteGroup(bw, g1); + } + } + + private void WriteVariant(Writer bw, VariantType variantType, object p) + { + switch (variantType) + { + case VariantType.Array: WriteVariantArray(bw, GetVariantType(p), p); break; + case VariantType.Boolean: bw.WriteBoolean((bool)p); break; + case VariantType.Byte: bw.WriteByte((byte)p); break; + case VariantType.Char: bw.WriteChar((char)p); break; + case VariantType.DateTime: bw.WriteDateTime((DateTime)p); break; + case VariantType.Decimal: bw.WriteDecimal((decimal)p); break; + case VariantType.Double: bw.WriteDouble((double)p); break; + case VariantType.Guid: bw.WriteGuid((Guid)p); break; + case VariantType.Int16: bw.WriteInt16((short)p); break; + case VariantType.Int32: bw.WriteInt32((int)p); break; + case VariantType.Int64: bw.WriteInt64((long)p); break; + case VariantType.Object: throw new NotImplementedException(); + case VariantType.SByte: bw.WriteSByte((sbyte)p); break; + case VariantType.Single: bw.WriteSingle((float)p); break; + case VariantType.String: bw.WriteNullTerminatedString((string)p); break; + case VariantType.UInt16: bw.WriteUInt16((ushort)p); break; + case VariantType.UInt32: bw.WriteUInt32((uint)p); break; + case VariantType.UInt64: bw.WriteUInt64((ulong)p); break; + } + } + + private void WriteVariantArray(Writer bw, VariantType arrayItemType, object p) + { + Array pa = (p as Array); + bw.WriteByte((byte)arrayItemType); + bw.WriteInt32(pa.Length); + for (int i = 0; i < pa.Length; i++) + { + WriteVariant(bw, arrayItemType, pa.GetValue(i)); + } + } + + private VariantType GetVariantType(object p) + { + if (p == null) return VariantType.Null; + if (p is Array) return VariantType.Array; + + if (p.GetType() == typeof(Boolean)) return VariantType.Boolean; + if (p.GetType() == typeof(Byte)) return VariantType.Byte; + if (p.GetType() == typeof(Char)) return VariantType.Char; + if (p.GetType() == typeof(DateTime)) return VariantType.DateTime; + if (p.GetType() == typeof(Decimal)) return VariantType.Decimal; + if (p.GetType() == typeof(Double)) return VariantType.Double; + if (p.GetType() == typeof(Guid)) return VariantType.Guid; + if (p.GetType() == typeof(Int16)) return VariantType.Int16; + if (p.GetType() == typeof(Int32)) return VariantType.Int32; + if (p.GetType() == typeof(Int64)) return VariantType.Int64; + if (p.GetType() == typeof(SByte)) return VariantType.SByte; + if (p.GetType() == typeof(Single)) return VariantType.Single; + if (p.GetType() == typeof(String)) return VariantType.String; + if (p.GetType() == typeof(UInt16)) return VariantType.UInt16; + if (p.GetType() == typeof(UInt32)) return VariantType.UInt32; + if (p.GetType() == typeof(UInt64)) return VariantType.UInt64; + + return VariantType.Object; + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/VariantType.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/VariantType.cs new file mode 100644 index 00000000..16ca3d2e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/UniversalPropertyList/VariantType.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.PropertyList.UniversalPropertyList +{ + public enum VariantType : byte + { + Null = 0, + Array = 1, + Boolean = 2, + Byte = 3, + Char = 4, + DateTime = 5, + Decimal = 6, + Double = 7, + Guid = 8, + Int16 = 9, + Int32 = 10, + Int64 = 11, + Object = 12, + SByte = 13, + Single = 14, + String = 15, + UInt16 = 16, + UInt32 = 17, + UInt64 = 18 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/WindowsConfigurationDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/WindowsConfigurationDataFormat.cs new file mode 100644 index 00000000..ac431fea --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/WindowsConfigurationDataFormat.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.IO; + +namespace UniversalEditor.DataFormats.PropertyList +{ + public class WindowsConfigurationDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private string[] mvarCommentSignals = new string[] { ";", "#" }; + public string[] CommentSignals { get { return mvarCommentSignals; } set { mvarCommentSignals = value; } } + + private string mvarPropertyValuePrefix = "\""; + public string PropertyValuePrefix { get { return mvarPropertyValuePrefix; } set { mvarPropertyValuePrefix = value; } } + + private string mvarPropertyValueSuffix = "\""; + public string PropertyValueSuffix { get { return mvarPropertyValueSuffix; } set { mvarPropertyValueSuffix = value; } } + + private string mvarPropertyNameValueSeparator = "="; + public string PropertyNameValueSeparator { get { return mvarPropertyNameValueSeparator; } set { mvarPropertyNameValueSeparator = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PropertyListObjectModel plom = (objectModel as PropertyListObjectModel); + if (plom == null) throw new ObjectModelNotSupportedException(); + + Reader tr = base.Accessor.Reader; + Group CurrentGroup = null; + + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + if (String.IsNullOrEmpty(line)) continue; + + if (!line.StartsWith(";") && !line.StartsWith("#")) + { + if (line.StartsWith("[") && line.EndsWith("]")) + { + string groupName = line.Substring(1, line.Length - 2); + CurrentGroup = plom.Groups.Add(groupName); + } + else + { + if (line.Contains(mvarPropertyNameValueSeparator)) + { + string[] nvp = line.Split(new string[] + { + mvarPropertyNameValueSeparator + }, 2, StringSplitOptions.None); + string propertyName = nvp[0].Trim(); + string propertyValue = string.Empty; + if (nvp.Length == 2) + { + propertyValue = nvp[1].Trim(); + } + if (propertyValue.StartsWith(this.mvarPropertyValuePrefix) && propertyValue.EndsWith(this.mvarPropertyValueSuffix)) + { + propertyValue = propertyValue.Substring(this.mvarPropertyValuePrefix.Length, propertyValue.Length - this.mvarPropertyValuePrefix.Length - this.mvarPropertyValueSuffix.Length); + } + else + { + if (propertyValue.ContainsAny(this.mvarCommentSignals)) + { + propertyValue = propertyValue.Substring(0, propertyValue.IndexOfAny(this.mvarCommentSignals)); + } + } + if (CurrentGroup != null) + { + CurrentGroup.Properties.Add(propertyName, propertyValue); + } + else + { + plom.Properties.Add(propertyName, propertyValue); + } + } + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + Writer tw = base.Accessor.Writer; + // tw.BaseStream.SetLength(0L); // why is this here?? + if (objectModel is PropertyListObjectModel) + { + PropertyListObjectModel objm = objectModel as PropertyListObjectModel; + foreach (Property p in objm.Properties) + { + tw.Write(p.Name + "="); + tw.Write(this.mvarPropertyValuePrefix); + if (p.Value != null) + { + tw.Write(p.Value.ToString()); + } + tw.Write(this.mvarPropertyValueSuffix); + if (objm.Properties.IndexOf(p) < objm.Properties.Count - 1) + { + tw.WriteLine(); + } + } + if (objm.Groups.Count > 0 && objm.Properties.Count > 0) + { + tw.WriteLine(); + } + foreach (Group g in objm.Groups) + { + tw.WriteLine("[" + g.Name + "]"); + foreach (Property p in g.Properties) + { + tw.Write(p.Name + "="); + tw.Write(this.mvarPropertyValuePrefix); + if (p.Value != null) + { + tw.Write(p.Value.ToString()); + } + tw.Write(this.mvarPropertyValueSuffix); + if (g.Properties.IndexOf(p) < g.Properties.Count - 1) + { + tw.WriteLine(); + } + } + if (objm.Groups.IndexOf(g) < objm.Groups.Count - 1) + { + tw.WriteLine(); + } + } + } + tw.Flush(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/XML/XMLPropertyListDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/XML/XMLPropertyListDataFormat.cs new file mode 100644 index 00000000..a6bfe693 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/XML/XMLPropertyListDataFormat.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.DataFormats.PropertyList.XML +{ + public class XMLPropertyListDataFormat : XMLDataFormat + { + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + MarkupObjectModel mom = (objectModels.Pop() as MarkupObjectModel); + PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel); + + MarkupTagElement tagConfiguration = (mom.Elements["Configuration"] as MarkupTagElement); + if (tagConfiguration == null) throw new InvalidDataFormatException(); + + LoadMarkup(tagConfiguration, ref plom); + } + + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel); + MarkupObjectModel mom = new MarkupObjectModel(); + + MarkupTagElement tagConfiguration = new MarkupTagElement(); + tagConfiguration.FullName = "Configuration"; + + SaveMarkup(ref tagConfiguration, plom); + + mom.Elements.Add(new MarkupPreprocessorElement("xml", "version=\"1.0\" encoding=\"UTF-8\"")); + mom.Elements.Add(tagConfiguration); + objectModels.Push(mom); + } + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + private static Version mvarFormatVersion = new Version(2, 0); + public static Version FormatVersion { get { return mvarFormatVersion; } } + + public static void LoadMarkup(MarkupTagElement tagConfiguration, ref PropertyListObjectModel plom) + { + MarkupTagElement tagProperties = (tagConfiguration.Elements["Properties"] as MarkupTagElement); + if (tagProperties != null) + { + foreach (MarkupElement el in tagProperties.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName != "Property") continue; + + Property p = LoadPropertyListProperty(tag); + if (p != null) plom.Properties.Add(p); + } + } + MarkupTagElement tagGroups = (tagConfiguration.Elements["Groups"] as MarkupTagElement); + if (tagGroups != null) + { + foreach (MarkupElement el in tagGroups.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName != "Group") continue; + + Group g = LoadPropertyListGroup(tag); + if (g != null) plom.Groups.Add(g); + } + } + } + + private static Property LoadPropertyListProperty(MarkupTagElement tag) + { + MarkupAttribute attID = tag.Attributes["ID"]; + MarkupAttribute attValue = tag.Attributes["Value"]; + if (attID == null) return null; + + Property property = new Property(); + property.Name = attID.Value; + + if (attValue != null) + { + property.Value = ParseObject(attValue.Value); + } + else if (tag.Elements.Count > 0) + { + List items = new List(); + foreach (MarkupElement el in tag.Elements) + { + MarkupTagElement tag1 = (el as MarkupTagElement); + if (tag1.FullName != "Value") continue; + + MarkupAttribute attItemDataType = tag1.Attributes["DataType"]; + if (attItemDataType != null) + { + + } + + items.Add(ParseObject(tag1.Value)); + } + property.Value = items.ToArray(); + } + return property; + } + + private static object ParseObject(string p) + { + #region Byte + { + byte result = 0; + if (Byte.TryParse(p, out result)) return result; + } + #endregion + #region SByte + { + sbyte result = 0; + if (SByte.TryParse(p, out result)) return result; + } + #endregion + #region Boolean + { + bool result = false; + if (Boolean.TryParse(p, out result)) return result; + } + #endregion + #region Char + { + char result = '\0'; + if (Char.TryParse(p, out result)) return result; + } + #endregion + #region UInt16 + { + ushort result = 0; + if (UInt16.TryParse(p, out result)) return result; + } + #endregion + #region UInt32 + { + uint result = 0; + if (UInt32.TryParse(p, out result)) return result; + } + #endregion + #region UInt64 + { + ulong result = 0; + if (UInt64.TryParse(p, out result)) return result; + } + #endregion + #region Int16 + { + short result = 0; + if (Int16.TryParse(p, out result)) return result; + } + #endregion + #region Int32 + { + int result = 0; + if (Int32.TryParse(p, out result)) return result; + } + #endregion + #region Int64 + { + long result = 0; + if (Int64.TryParse(p, out result)) return result; + } + #endregion + #region Single + { + float result = 0.0f; + if (Single.TryParse(p, out result)) return result; + } + #endregion + #region Double + { + double result = 0.0D; + if (Double.TryParse(p, out result)) return result; + } + #endregion + #region Decimal + { + decimal result = 0.0M; + if (Decimal.TryParse(p, out result)) return result; + } + #endregion + #region TimeSpan + { + TimeSpan result = TimeSpan.Zero; + if (TimeSpan.TryParse(p, out result)) return result; + } + #endregion + #region DateTime + { + DateTime result = DateTime.Now; + if (DateTime.TryParse(p, out result)) return result; + } + #endregion + #region GUID + { + Guid result = Guid.Empty; + try + { + return new Guid(p); + } + catch + { + } + } + #endregion + + return p; + } + + private static Group LoadPropertyListGroup(MarkupTagElement tag) + { + MarkupAttribute attID = tag.Attributes["ID"]; + if (attID == null) return null; + + Group group = new Group(); + group.Name = attID.Value; + + MarkupTagElement tagProperties = (tag.Elements["Properties"] as MarkupTagElement); + if (tagProperties != null) + { + foreach (MarkupElement el1 in tagProperties.Elements) + { + MarkupTagElement tag1 = (el1 as MarkupTagElement); + if (tag1 == null) continue; + if (tag1.Name != "Property") continue; + + Property p = LoadPropertyListProperty(tag1); + if (p != null) group.Properties.Add(p); + } + } + + MarkupTagElement tagGroups = (tag.Elements["Groups"] as MarkupTagElement); + if (tagGroups != null) + { + foreach (MarkupElement el1 in tagGroups.Elements) + { + MarkupTagElement tag1 = (el1 as MarkupTagElement); + if (tag1 == null) continue; + if (tag1.Name != "Group") continue; + + Group g = LoadPropertyListGroup(tag1); + if (g != null) group.Groups.Add(g); + } + } + + return group; + } + + + public static void SaveMarkup(ref MarkupTagElement tagConfiguration, PropertyListObjectModel plom) + { + tagConfiguration.FullName = "Configuration"; + tagConfiguration.Attributes.Add("Version", mvarFormatVersion.ToString(2)); + if (plom.Properties.Count > 0) + { + MarkupTagElement tagProperties = new MarkupTagElement(); + tagProperties.FullName = "Properties"; + foreach (Property property in plom.Properties) + { + RecursiveSaveObject(property, tagProperties); + } + tagConfiguration.Elements.Add(tagProperties); + } + if (plom.Groups.Count > 0) + { + MarkupTagElement tagGroups = new MarkupTagElement(); + tagGroups.FullName = "Groups"; + foreach (Group group in plom.Groups) + { + RecursiveSaveObject(group, tagGroups); + } + tagConfiguration.Elements.Add(tagGroups); + } + } + + private static void RecursiveSaveObject(Property item, MarkupTagElement tagParent) + { + MarkupTagElement tagProperty = new MarkupTagElement(); + tagProperty.FullName = "Property"; + tagProperty.Attributes.Add("ID", item.Name); + if (item.Value is Array) + { + Array ary = (item.Value as Array); + for (long i = 0; i < ary.LongLength; i++) + { + object obj = ary.GetValue(i); + + MarkupTagElement tagValue = new MarkupTagElement(); + tagValue.Attributes.Add("DataType", obj.GetType().FullName); + tagValue.FullName = "Value"; + tagValue.Value = obj.ToString(); + tagProperty.Elements.Add(tagValue); + } + } + else + { + tagProperty.Attributes.Add("Value", item.Value.ToString()); + } + tagParent.Elements.Add(tagProperty); + } + private static void RecursiveSaveObject(Group item, MarkupTagElement tagParent) + { + MarkupTagElement tagGroup = new MarkupTagElement(); + tagGroup.FullName = "Group"; + tagGroup.Attributes.Add("ID", item.Name); + if (item.Properties.Count > 0) + { + MarkupTagElement tagProperties = new MarkupTagElement(); + tagProperties.FullName = "Properties"; + foreach (Property property in item.Properties) + { + RecursiveSaveObject(property, tagProperties); + } + tagGroup.Elements.Add(tagProperties); + } + if (item.Groups.Count > 0) + { + MarkupTagElement tagGroups = new MarkupTagElement(); + tagGroups.FullName = "Groups"; + foreach (Group group in item.Groups) + { + RecursiveSaveObject(group, tagGroups); + } + tagGroup.Elements.Add(tagGroups); + } + tagParent.Elements.Add(tagGroup); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLDataFormat.cs new file mode 100644 index 00000000..17fcecea --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLDataFormat.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +using UniversalEditor.ObjectModels.RichTextMarkup; + +namespace UniversalEditor.DataFormats.RichTextMarkup.RTML +{ + /// + /// Data format for expressing Rich Text Format files as MarkupObjectModel. + /// + public class RTMLDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(RichTextMarkupObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + public RTMLDataFormat() + { + mvarSettings.GroupBeginChar = '{'; + mvarSettings.GroupEndChar = '}'; + mvarSettings.TagBeginChar = '\\'; + } + + private RTMLSettings mvarSettings = new RTMLSettings(); + public RTMLSettings Settings { get { return mvarSettings; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader reader = base.Accessor.Reader; + + RichTextMarkupObjectModel rtml = (objectModel as RichTextMarkupObjectModel); + if (rtml == null) throw new ObjectModelNotSupportedException(); + + RichTextMarkupItemGroup currentGroup = null; + StringBuilder sbnext = new StringBuilder(); + + while (!reader.EndOfStream) + { + char c = reader.ReadChar(); + if (c == ' ') + { + string content = reader.ReadStringUntilAny(new char[] { mvarSettings.TagBeginChar, mvarSettings.GroupBeginChar, mvarSettings.GroupEndChar }); + rtml.Items.Add(new RichTextMarkupItemLiteral(content)); + } + else if (c == mvarSettings.GroupBeginChar) + { + if (currentGroup == null) + { + RichTextMarkupItemGroup group = new RichTextMarkupItemGroup(); + rtml.Items.Add(group); + currentGroup = group; + } + else + { + RichTextMarkupItemGroup group = new RichTextMarkupItemGroup(); + currentGroup.Items.Add(group); + currentGroup = group; + } + } + else if (c == mvarSettings.GroupEndChar) + { + if (currentGroup == null) throw new InvalidDataFormatException("Attempted to close RTML group when none was opened"); + + currentGroup = currentGroup.Parent; + } + else if (c == mvarSettings.TagBeginChar) + { + string name = reader.ReadStringUntilAny(new char[] { mvarSettings.TagBeginChar, ' ', mvarSettings.GroupBeginChar, mvarSettings.GroupEndChar }); + if (currentGroup == null) + { + rtml.Items.Add(new RichTextMarkupItemTag(name)); + } + else + { + currentGroup.Items.Add(new RichTextMarkupItemTag(name)); + } + } + else + { + sbnext.Append(c); + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + Writer writer = base.Accessor.Writer; + + RichTextMarkupObjectModel rtml = (objectModel as RichTextMarkupObjectModel); + if (rtml == null) throw new ObjectModelNotSupportedException(); + + foreach (RichTextMarkupItem item in rtml.Items) + { + RenderItem(writer, item); + } + } + + private RichTextMarkupItem lastItemRendered = null; + + private void RenderItem(Writer writer, RichTextMarkupItem item) + { + if (item is RichTextMarkupItemGroup) + { + RichTextMarkupItemGroup itm = (item as RichTextMarkupItemGroup); + writer.Write("{"); + foreach (RichTextMarkupItem item1 in itm.Items) + { + RenderItem(writer, item1); + } + writer.Write("}"); + } + else if (item is RichTextMarkupItemTag) + { + RichTextMarkupItemTag itm = (item as RichTextMarkupItemTag); + writer.Write("\\"); + writer.Write(itm.Name); + } + else if (item is RichTextMarkupItemLiteral) + { + RichTextMarkupItemLiteral itm = (item as RichTextMarkupItemLiteral); + if (!(lastItemRendered is RichTextMarkupItemLiteral)) writer.Write(" "); + writer.Write(itm.Content); + } + lastItemRendered = item; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLSettings.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLSettings.cs new file mode 100644 index 00000000..7236719a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/RichTextMarkup/RTML/RTMLSettings.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.RichTextMarkup.RTML +{ + /// + /// Specifies settings for the RTML parser. + /// + public class RTMLSettings + { + /// + /// The character that defines the beginning of an RTML group. + /// + public char GroupBeginChar { get; set; } + /// + /// The character that defines the end of an RTML group. + /// + public char GroupEndChar { get; set; } + /// + /// The character that defines the beginning of an RTML tag. + /// + public char TagBeginChar { get; set; } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Certificate/DER/DERCertificateDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Certificate/DER/DERCertificateDataFormat.cs new file mode 100644 index 00000000..98211d67 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Certificate/DER/DERCertificateDataFormat.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.AbstractSyntax; +using UniversalEditor.DataFormats.AbstractSyntax.DER; + +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Security.Certificate; + +namespace UniversalEditor.DataFormats.Security.Certificate.DER +{ + public class DERCertificateDataFormat : DERDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(CertificateObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new AbstractSyntaxObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + AbstractSyntaxObjectModel asn = (objectModels.Pop() as AbstractSyntaxObjectModel); + CertificateObjectModel cer = (objectModels.Pop() as CertificateObjectModel); + } + + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + CertificateObjectModel cer = (objectModels.Pop() as CertificateObjectModel); + AbstractSyntaxObjectModel asn = new AbstractSyntaxObjectModel(); + + objectModels.Push(asn); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyAlgorithm.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyAlgorithm.cs new file mode 100644 index 00000000..e2e23953 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyAlgorithm.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Security.Key.RSA +{ + public enum RSAKeyAlgorithm : uint + { + KeyX = 0x0000A400, + Sign = 0x00002400 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyDataFormat.cs new file mode 100644 index 00000000..a7e23fde --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyDataFormat.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Security.Key.RSA; + +namespace UniversalEditor.DataFormats.Security.Key.RSA +{ + public class RSAKeyDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(RSAKeyObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + private byte mvarFormatVersion = 0x02; + public byte FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + RSAKeyObjectModel key = (objectModel as RSAKeyObjectModel); + if (key == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + + // ---- read the BLOBHEADER struct ------ + bool dotnetkey = false; + RSAKeyType btype = (RSAKeyType)reader.ReadByte(); + if (btype != RSAKeyType.PublicKeyBlob && btype != RSAKeyType.PrivateKeyBlob) + { + // possibly a .NET publickey + reader.Accessor.Seek(11, SeekOrigin.Current); // advance past 3 int headers, minus 1 byte read + btype = (RSAKeyType)reader.ReadByte(); + if (btype != RSAKeyType.PublicKeyBlob && btype != RSAKeyType.PrivateKeyBlob) + { + throw new InvalidDataFormatException("Key is neither a PublicKeyBlob nor a PrivateKeyBlob"); + } + dotnetkey = true; + } + + byte version = reader.ReadByte(); + if (version != mvarFormatVersion) + { + throw new InvalidDataFormatException("Invalid version for format " + version.ToString()); + } + + ushort reserved = reader.ReadUInt16(); + RSAKeyAlgorithm algorithm = (RSAKeyAlgorithm)reader.ReadUInt32(); + if (algorithm != RSAKeyAlgorithm.KeyX && algorithm != RSAKeyAlgorithm.Sign) + { + throw new InvalidDataFormatException("Unknown algorithm " + algorithm.ToString()); + } + + //---- read the RSAPUBKEY struct -------- + string magic = reader.ReadFixedLengthString(4); + if (magic != "RSA1" && magic != "RSA2") + { + throw new InvalidDataFormatException("File does not begin with 'RSA1' or 'RSA2'"); + } + int bitlen = reader.ReadInt32(); //get RSA bit length + key.BitLength = bitlen; + + //---- read RSA public exponent ------ + reader.Endianness = Endianness.BigEndian; + uint pubexp = reader.ReadUInt32(); //get public exponent + key.PublicExponent = pubexp; + + //---- read RSA modulus ----------- + //Reverse byte array for little-endian to big-endian conversion + byte[] RSAmodulus = reader.ReadBytes(bitlen / 8); + Array.Reverse(RSAmodulus); + key.Modulus = RSAmodulus; + + //-- if this is a valid unencrypted PRIVATEKEYBLOB, read RSA private key properties + if (btype == RSAKeyType.PrivateKeyBlob) + { + int bitlen16 = bitlen / 16; + byte[] P = reader.ReadBytes(bitlen16); + Array.Reverse(P); + if (P.Length != bitlen16) + throw new InvalidDataFormatException("Invalid bit length for P"); + key.P = P; + + byte[] Q = reader.ReadBytes(bitlen16); + Array.Reverse(Q); + if (Q.Length != bitlen16) + throw new InvalidDataFormatException("Invalid bit length for Q"); + key.Q = Q; + + byte[] DP = reader.ReadBytes(bitlen16); + Array.Reverse(DP); + if (DP.Length != bitlen16) + throw new InvalidDataFormatException("Invalid bit length for DP"); + key.DP = DP; + + byte[] DQ = reader.ReadBytes(bitlen16); + Array.Reverse(DQ); + if (DQ.Length != bitlen16) + throw new InvalidDataFormatException("Invalid bit length for DQ"); + key.DQ = DQ; + + byte[] IQ = reader.ReadBytes(bitlen16); + Array.Reverse(IQ); + if (IQ.Length != bitlen16) + throw new InvalidDataFormatException("Invalid bit length for IQ"); + key.IQ = IQ; + + byte[] D = reader.ReadBytes(bitlen / 8); + Array.Reverse(D); + if (D.Length != bitlen / 8) + throw new InvalidDataFormatException("Invalid bit length for D"); + key.D = D; + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyType.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyType.cs new file mode 100644 index 00000000..83ec9f09 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Security/Key/RSA/RSAKeyType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Security.Key.RSA +{ + public enum RSAKeyType : byte + { + Simple = 0x01, + PublicKeyBlob = 0x06, + PrivateKeyBlob = 0x07, + PlainTextKeyBlob = 0x08, + OpaqueKeyBlob = 0x09, + PublicKeyBlobEx = 0x0A, + SymmetricWrapKeyBlob = 0x0B + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs new file mode 100644 index 00000000..343302fe --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutAction.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop +{ + public class DesktopShortcutAction + { + public class DesktopShortcutActionCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private string mvarTitle = String.Empty; + /// + /// Label that will be shown to the user. Since actions are always shown in the context of + /// a specific application (that is, as a submenu of a launcher), this only needs to be + /// unambiguous within one application and should not include the application name. + /// + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarIconFileName = String.Empty; + /// + /// Icon to be shown togheter with the action. If the name is an absolute path, the given + /// file will be used. If the name is not an absolute path, the algorithm described in the + /// Icon Theme Specification will be used to locate the icon. Implementations may choose + /// to ignore it. + /// + public string IconFileName { get { return mvarIconFileName; } set { mvarIconFileName = value; } } + + private string mvarExecutableFileName = String.Empty; + /// + /// Program to execute for this action. See the Exec key for details on how this key + /// works. The Exec key is required if DBusActivatable is not set to true in the main + /// desktop entry group. Even if DBusActivatable is true, Exec should be specified for + /// compatibility with implementations that do not understand DBusActivatable. + /// + public string ExecutableFileName { get { return mvarExecutableFileName; } set { mvarExecutableFileName = value; } } + + private System.Collections.Specialized.StringCollection mvarExecutableArguments = new System.Collections.Specialized.StringCollection(); + /// + /// Arguments passed into the associated program when it is executed. + /// + public System.Collections.Specialized.StringCollection ExecutableArguments { get { return mvarExecutableArguments; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs new file mode 100644 index 00000000..c9f2f061 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutDataFormat.cs @@ -0,0 +1,417 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.DataFormats.PropertyList; +using UniversalEditor.ObjectModels.Shortcut; + +namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop +{ + public class DesktopShortcutDataFormat : WindowsConfigurationDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(ShortcutObjectModel), DataFormatCapabilities.All); + _dfr.ExportOptions.Add(new CustomOptionText("ApplicationTitle", "&Application title: ")); + _dfr.ExportOptions.Add(new CustomOptionText("GenericTitle", "&Generic title: ")); + _dfr.ExportOptions.Add(new CustomOptionBoolean("HideFromMenus", "&Do not display this entry in menus")); + _dfr.ExportOptions.Add(new CustomOptionBoolean("Deleted", "&Mark this shortcut as being deleted by the user")); + _dfr.ExportOptions.Add(new CustomOptionBoolean("DBusActivatable", "&Enable DBus activation")); + _dfr.Sources.Add("http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html"); + } + return _dfr; + } + + private string mvarApplicationTitle = String.Empty; + /// + /// Specific name of the application, for example "Mozilla". + /// + public string ApplicationTitle { get { return mvarApplicationTitle; } set { mvarApplicationTitle = value; } } + + private string mvarGenericTitle = String.Empty; + /// + /// Generic name of the application, for example "Web Browser". + /// + public string GenericTitle { get { return mvarGenericTitle; } set { mvarGenericTitle = value; } } + + private DesktopShortcutType mvarType = DesktopShortcutType.Application; + public DesktopShortcutType Type { get { return mvarType; } set { mvarType = value; } } + + private bool mvarHideFromMenus = false; + /// + /// NoDisplay means "this application exists, but don't display it in the menus". This + /// can be useful to e.g. associate this application with MIME types, so that it gets + /// launched from a file manager (or other apps), without having a menu entry for it + /// (there are tons of good reasons for this, including e.g. the netscape -remote, or + /// kfmclient openURL kind of stuff). + /// + public bool HideFromMenus { get { return mvarHideFromMenus; } set { mvarHideFromMenus = value; } } + + private bool mvarDeleted = false; + /// + /// Hidden should have been called Deleted. It means the user deleted (at his level) + /// something that was present (at an upper level, e.g. in the system dirs). It's strictly + /// equivalent to the .desktop file not existing at all, as far as that user is concerned. + /// This can also be used to "uninstall" existing files (e.g. due to a renaming) - by + /// letting make install install a file with Hidden=true in it. + /// + public bool Deleted { get { return mvarDeleted; } set { mvarDeleted = value; } } + + private System.Collections.Specialized.StringCollection mvarRestrictedEnvironments = new System.Collections.Specialized.StringCollection(); + /// + /// + /// A list of strings identifying the desktop environments that should display/not + /// display a given desktop entry. + /// + /// + /// By default, a desktop file should be shown, unless an + /// OnlyShowIn key is present, in which case, the default is for the file not to be + /// shown. + /// + /// + /// If $XDG_CURRENT_DIRECTORY is set then it contains a colon-separated list of strings. + /// In order, each string is considered. If a matching entry is found in OnlyShowIn then + /// the desktop file is shown. If an entry is found in NotShowIn then the desktop file is + /// not shown. If none of the strings match then the default action is taken (as above). + /// + /// + /// The same desktop name may not appear in both OnlyShowIn and NotShowIn of a group. + /// + /// + public System.Collections.Specialized.StringCollection RestrictedEnvironments { get { return mvarRestrictedEnvironments; } } + + private System.Collections.Specialized.StringCollection mvarExcludedEnvironments = new System.Collections.Specialized.StringCollection(); + /// + /// + /// A list of strings identifying the desktop environments that should display/not + /// display a given desktop entry. + /// + /// + /// By default, a desktop file should be shown, unless an + /// OnlyShowIn key is present, in which case, the default is for the file not to be + /// shown. + /// + /// + /// If $XDG_CURRENT_DIRECTORY is set then it contains a colon-separated list of strings. + /// In order, each string is considered. If a matching entry is found in OnlyShowIn then + /// the desktop file is shown. If an entry is found in NotShowIn then the desktop file is + /// not shown. If none of the strings match then the default action is taken (as above). + /// + /// + /// The same desktop name may not appear in both OnlyShowIn and NotShowIn of a group. + /// + /// + public System.Collections.Specialized.StringCollection ExcludedEnvironments { get { return mvarExcludedEnvironments; } } + + private bool mvarDBusActivatable = false; + /// + /// A boolean value specifying if D-Bus activation is supported for this application. If + /// this key is missing, the default value is false. If the value is true then + /// implementations should ignore the Exec key and send a D-Bus message to launch the + /// application. See D-Bus Activation for more information on how this works. + /// Applications should still include Exec= lines in their desktop files for + /// compatibility with implementations that do not understand the DBusActivatable key. + /// + public bool DBusActivatable { get { return mvarDBusActivatable; } set { mvarDBusActivatable = value; } } + + private string mvarTryExec = String.Empty; + /// + /// Path to an executable file on disk used to determine if the program is actually + /// installed. If the path is not an absolute path, the file is looked up in the $PATH + /// environment variable. If the file is not present or if it is not executable, the entry + /// may be ignored (not be used in menus, for example). + /// + public string TryExec { get { return mvarTryExec; } set { mvarTryExec = value; } } + + private DesktopShortcutAction.DesktopShortcutActionCollection mvarActions = new DesktopShortcutAction.DesktopShortcutActionCollection(); + /// + /// Identifiers for application actions. This can be used to tell the application to make + /// a specific action, different from the default behavior. The Application actions + /// section describes how actions work. + /// + public DesktopShortcutAction.DesktopShortcutActionCollection Actions { get { return mvarActions; } } + + private System.Collections.Specialized.StringCollection mvarSupportedMimeTypes = new System.Collections.Specialized.StringCollection(); + /// + /// The MIME type(s) supported by this application. + /// + public System.Collections.Specialized.StringCollection SupportedMimeTypes { get { return mvarSupportedMimeTypes; } } + + private System.Collections.Specialized.StringCollection mvarCategories = new System.Collections.Specialized.StringCollection(); + /// + /// Categories in which the entry should be shown in a menu (for possible values see the Desktop Menu Specification). + /// + public System.Collections.Specialized.StringCollection Categories { get { return mvarCategories; } } + + private System.Collections.Specialized.StringCollection mvarKeywords = new System.Collections.Specialized.StringCollection(); + /// + /// A list of strings which may be used in addition to other metadata to describe this + /// entry. This can be useful e.g. to facilitate searching through entries. The values + /// are not meant for display, and should not be redundant with the values of Name or + /// GenericName. + /// + public System.Collections.Specialized.StringCollection Keywords { get { return mvarKeywords; } } + + private DesktopShortcutStartupNotifyBehavior mvarStartupNotify = DesktopShortcutStartupNotifyBehavior.Disabled; + /// + /// If set to , it is KNOWN + /// that the application will send a "remove" message when started with the + /// DESKTOP_STARTUP_ID environment variable set. If set to + /// , it is KNOWN that the + /// application does not work with startup notification at all (does not shown any window, + /// breaks even when using StartupWMClass, etc.). If set to + /// , a reasonable handling is + /// up to implementations (assuming false, using StartupWMClass, etc.). (See the Startup + /// Notification Protocol Specification for more details). + /// + public DesktopShortcutStartupNotifyBehavior StartupNotify { get { return mvarStartupNotify; } set { mvarStartupNotify = value; } } + + private string mvarStartupWindowClass = String.Empty; + /// + /// If specified, it is known that the application will map at least one window with the + /// given string as its WM class or WM name hint (see the Startup Notification Protocol + /// Specification for more details). + /// + public string StartupWindowClass { get { return mvarStartupWindowClass; } set { mvarStartupWindowClass = value; } } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel); + ShortcutObjectModel shortcut = (objectModels.Pop() as ShortcutObjectModel); + + + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + ShortcutObjectModel shortcut = (objectModels.Pop() as ShortcutObjectModel); + PropertyListObjectModel plom = new PropertyListObjectModel(); + + #region Desktop Entry + { + Group group = new Group("Desktop Entry"); + + // Version of the Desktop Entry Specification that the desktop entry conforms + // with. Entries that confirm with this version of the specification should use + // 1.0. Note that the version field is not required to be present. + group.Properties.Add("Version", "1.0"); + + if (!String.IsNullOrEmpty(mvarApplicationTitle)) + { + group.Properties.Add("Name", mvarApplicationTitle); + } + if (!String.IsNullOrEmpty(mvarGenericTitle)) + { + group.Properties.Add("GenericName", mvarGenericTitle); + } + if (mvarHideFromMenus) + { + group.Properties.Add("NoDisplay", "true"); + } + if (!String.IsNullOrEmpty(shortcut.Comment)) + { + group.Properties.Add("Comment", shortcut.Comment); + } + if (!String.IsNullOrEmpty(shortcut.IconFileName)) + { + // Icon to display in file manager, menus, etc. If the name is an absolute + // path, the given file will be used. If the name is not an absolute path, the + // algorithm described in the Icon Theme Specification will be used to locate + // the icon. + group.Properties.Add("Icon", shortcut.IconFileName); + } + if (mvarDeleted) + { + group.Properties.Add("Hidden", true); + } + if (mvarRestrictedEnvironments.Count > 0) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in mvarRestrictedEnvironments) + { + sb.Append(s); + if (mvarRestrictedEnvironments.IndexOf(s) < mvarRestrictedEnvironments.Count - 1) + { + sb.Append(":"); + } + } + group.Properties.Add("OnlyShowIn", sb.ToString()); + } + if (mvarExcludedEnvironments.Count > 0) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in mvarExcludedEnvironments) + { + sb.Append(s); + if (mvarExcludedEnvironments.IndexOf(s) < mvarExcludedEnvironments.Count - 1) + { + sb.Append(":"); + } + } + group.Properties.Add("NotShowIn", sb.ToString()); + } + + if (mvarDBusActivatable) + { + group.Properties.Add("DBusActivatable", true); + } + + if (!String.IsNullOrEmpty(mvarTryExec)) + { + group.Properties.Add("TryExec", mvarTryExec); + } + if (!String.IsNullOrEmpty(shortcut.ExecutableFileName)) + { + // Program to execute, possibly with arguments. See the Exec key for details + // on how this key works. The Exec key is required if DBusActivatable is not + // set to true. Even if DBusActivatable is true, Exec should be specified for + // compatibility with implementations that do not understand DBusActivatable. + + StringBuilder sb = new StringBuilder(); + sb.Append(shortcut.ExecutableFileName); + foreach (string arg in shortcut.ExecutableArguments) + { + sb.Append(" "); + sb.Append(arg); + } + group.Properties.Add("Exec", sb.ToString()); + } + if (!String.IsNullOrEmpty(shortcut.WorkingDirectory)) + { + // If entry is of type Application, the working directory in which to run the + // program. + group.Properties.Add("Path", shortcut.WorkingDirectory); + } + if (shortcut.RunInTerminal) + { + // Whether the program runs in a terminal window. + group.Properties.Add("Terminal", true); + } + #region Desktop Actions + { + // Identifiers for application actions. This can be used to tell the + // application to make a specific action, different from the default + // behavior. The Application actions section describes how actions work. + StringBuilder sb = new StringBuilder(); + foreach (DesktopShortcutAction action in mvarActions) + { + sb.Append(action.Name); + sb.Append(";"); + } + group.Properties.Add("Actions", sb.ToString()); + } + #endregion + + if (mvarSupportedMimeTypes.Count > 0) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in mvarSupportedMimeTypes) + { + sb.Append(s); + sb.Append(";"); + } + group.Properties.Add("MimeType", sb.ToString()); + } + if (mvarCategories.Count > 0) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in mvarCategories) + { + sb.Append(s); + sb.Append(";"); + } + group.Properties.Add("Categories", sb.ToString()); + } + if (mvarKeywords.Count > 0) + { + StringBuilder sb = new StringBuilder(); + foreach (string s in mvarKeywords) + { + sb.Append(s); + sb.Append(";"); + } + group.Properties.Add("Keywords", sb.ToString()); + } + + switch (mvarStartupNotify) + { + case DesktopShortcutStartupNotifyBehavior.Disabled: + { + break; + } + case DesktopShortcutStartupNotifyBehavior.Supported: + { + group.Properties.Add("StartupNotify", true); + break; + } + case DesktopShortcutStartupNotifyBehavior.Unsupported: + { + group.Properties.Add("StartupNotify", false); + break; + } + } + + if (!String.IsNullOrEmpty(mvarStartupWindowClass)) + { + group.Properties.Add("StartupWMClass", mvarStartupWindowClass); + } + + if (mvarType == DesktopShortcutType.InternetLink) + { + group.Properties.Add("URL", shortcut.ExecutableFileName); + } + + + // This specification defines 3 types of desktop entries: Application (type 1), + // Link (type 2) and Directory (type 3). To allow the addition of new types in the + // future, implementations should ignore desktop entries with an unknown type. + // group.Properties.Add("Type"); + + plom.Groups.Add(group); + + + #region Desktop Actions + { + // Identifiers for application actions. This can be used to tell the + // application to make a specific action, different from the default + // behavior. The Application actions section describes how actions work. + foreach (DesktopShortcutAction action in mvarActions) + { + Group group1 = new Group("Desktop Action " + action.Name); + + StringBuilder sb = new StringBuilder(); + sb.Append(action.ExecutableFileName); + foreach (string s in action.ExecutableArguments) + { + sb.Append(" "); + sb.Append(s); + } + group1.Properties.Add("Exec", sb.ToString()); + + group1.Properties.Add("Name", action.Title); + group1.Properties.Add("Icon", action.IconFileName); + + plom.Groups.Add(group1); + } + } + #endregion + } + #endregion + + objectModels.Push(plom); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs new file mode 100644 index 00000000..8c4fc8d1 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutStartupNotifyBehavior.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop +{ + public enum DesktopShortcutStartupNotifyBehavior + { + Disabled = 0, + Supported = 1, + Unsupported = 2 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs new file mode 100644 index 00000000..36ab3d7b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Shortcut/FreeDesktop/DesktopShortcutType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Shortcut.FreeDesktop +{ + public enum DesktopShortcutType + { + Application, + InternetLink, + Directory + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFCharacterSet.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFCharacterSet.cs new file mode 100644 index 00000000..7fdd1311 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFCharacterSet.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Text.Formatted.RichText +{ + public enum RTFCharacterSet + { + /// + /// ANSI (ansi) + /// + ANSI, + /// + /// Apple Macintosh (mac) + /// + AppleMacintosh, + /// + /// IBM PC code page 437 (pc) + /// + IBMPC437, + /// + /// IBM PC code page 850, used by IBM Personal System/2 (not implemented in version 1 of + /// Microsoft Word for OS/2) (pca) + /// + IBMPC850 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFDataFormat.cs new file mode 100644 index 00000000..e51644fe --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFDataFormat.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Text.Formatted; +using UniversalEditor.ObjectModels.Text.Formatted.Items; + +using UniversalEditor.ObjectModels.RichTextMarkup; +using UniversalEditor.DataFormats.RichTextMarkup.RTML; + +namespace UniversalEditor.DataFormats.Text.Formatted.RichText +{ + public class RTFDataFormat : RTMLDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(FormattedTextObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + private RTFCharacterSet mvarCharacterSet = RTFCharacterSet.ANSI; + /// + /// The character set used in this document. + /// + public RTFCharacterSet CharacterSet { get { return mvarCharacterSet; } set { mvarCharacterSet = value; } } + + private int mvarCodePage = 1252; + /// + /// The ANSI code page which is used to perform the Unicode to ANSI conversion when writing + /// RTF text. + /// + public int CodePage { get { return mvarCodePage; } set { mvarCodePage = value; } } + + private string mvarGenerator = String.Empty; + /// + /// The application which generated this RTF document. See + /// for known values. + /// + public string Generator { get { return mvarGenerator; } set { mvarGenerator = value; } } + + private void LoadItem(RichTextMarkupItem item, IFormattedTextItemParent ftom) + { + if (item is RichTextMarkupItemLiteral) + { + RichTextMarkupItemLiteral itm = (item as RichTextMarkupItemLiteral); + FormattedTextItemLiteral literal = new FormattedTextItemLiteral(itm.Content); + ftom.Items.Add(literal); + } + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new RichTextMarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + RichTextMarkupObjectModel mom = (objectModels.Pop() as RichTextMarkupObjectModel); + FormattedTextObjectModel ftom = (objectModels.Pop() as FormattedTextObjectModel); + + foreach (RichTextMarkupItem item in mom.Items) + { + LoadItem(item, ftom); + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + FormattedTextObjectModel ftom = (objectModels.Pop() as FormattedTextObjectModel); + RichTextMarkupObjectModel rtml = new RichTextMarkupObjectModel(); + + RichTextMarkupItemGroup grpRTF1 = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("rtf1")); + switch (mvarCharacterSet) + { + case RTFCharacterSet.ANSI: + { + grpRTF1.Items.Add(new RichTextMarkupItemTag("ansi")); + break; + } + case RTFCharacterSet.AppleMacintosh: + { + grpRTF1.Items.Add(new RichTextMarkupItemTag("mac")); + break; + } + case RTFCharacterSet.IBMPC437: + { + grpRTF1.Items.Add(new RichTextMarkupItemTag("pc")); + break; + } + case RTFCharacterSet.IBMPC850: + { + grpRTF1.Items.Add(new RichTextMarkupItemTag("pca")); + break; + } + } + grpRTF1.Items.Add(new RichTextMarkupItemTag("ansicpg" + mvarCodePage.ToString())); + + if (ftom.DefaultFont != null && ftom.Fonts.Contains(ftom.DefaultFont)) + { + RichTextMarkupItemTag tagDEFF = new RichTextMarkupItemTag("deff" + ftom.Fonts.IndexOf(ftom.DefaultFont)); + grpRTF1.Items.Add(tagDEFF); + } + // writer.Write("\\deflang1033\\uc1"); + + if (ftom.Fonts.Count > 0) + { + RichTextMarkupItemGroup grpFontTbl = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("fonttbl")); + foreach (FormattedTextFont font in ftom.Fonts) + { + RichTextMarkupItemGroup grpFont = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("f" + ftom.Fonts.IndexOf(font).ToString())); + switch (font.Family) + { + case FormattedTextFontFamily.Bidi: grpFont.Items.Add(new RichTextMarkupItemTag("fbidi")); break; + case FormattedTextFontFamily.Decor: grpFont.Items.Add(new RichTextMarkupItemTag("fdecor")); break; + case FormattedTextFontFamily.Modern: grpFont.Items.Add(new RichTextMarkupItemTag("fmodern")); break; + case FormattedTextFontFamily.Roman: grpFont.Items.Add(new RichTextMarkupItemTag("froman")); break; + case FormattedTextFontFamily.Script: grpFont.Items.Add(new RichTextMarkupItemTag("fscript")); break; + case FormattedTextFontFamily.Swiss: grpFont.Items.Add(new RichTextMarkupItemTag("fswiss")); break; + case FormattedTextFontFamily.Tech: grpFont.Items.Add(new RichTextMarkupItemTag("ftech")); break; + } + grpFont.Items.Add(new RichTextMarkupItemLiteral(font.Name + ";")); + grpFontTbl.Items.Add(grpFont); + } + grpRTF1.Items.Add(grpFontTbl); + } + if (!String.IsNullOrEmpty(mvarGenerator)) + { + RichTextMarkupItemGroup grpGenerator = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("*"), new RichTextMarkupItemTag("generator"), new RichTextMarkupItemLiteral(mvarGenerator + ";")); + grpRTF1.Items.Add(grpGenerator); + } + foreach (FormattedTextItem item in ftom.Items) + { + RenderItem(grpRTF1, item); + } + + rtml.Items.Add(grpRTF1); + objectModels.Push(rtml); + } + + private void RenderItem(RichTextMarkupItemGroup parent, FormattedTextItem item) + { + if (item is FormattedTextItemHyperlink) + { + FormattedTextItemHyperlink itm = (item as FormattedTextItemHyperlink); + + RichTextMarkupItemGroup grpField = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("field")); + RichTextMarkupItemGroup grpAsterisk = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("*"), new RichTextMarkupItemTag("fldinst")); + grpAsterisk.Items.Add(new RichTextMarkupItemGroup(new RichTextMarkupItemLiteral("HYPERLINK \"" + itm.TargetURL + "\""))); + grpField.Items.Add(grpAsterisk); + + RichTextMarkupItemGroup group = new RichTextMarkupItemGroup(); + foreach (FormattedTextItem itm1 in itm.Items) + { + RenderItem(group, itm1); + } + grpField.Items.Add(new RichTextMarkupItemGroup(new RichTextMarkupItemTag("fldrslt"), group)); + parent.Items.Add(grpField); + } + else if (item is FormattedTextItemBold) + { + RichTextMarkupItemGroup group = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("b")); + FormattedTextItemBold itm = (item as FormattedTextItemBold); + foreach (FormattedTextItem itm1 in itm.Items) + { + RenderItem(group, itm1); + } + parent.Items.Add(group); + } + else if (item is FormattedTextItemLiteral) + { + parent.Items.Add(new RichTextMarkupItemLiteral((item as FormattedTextItemLiteral).Text)); + } + else if (item is FormattedTextItemParagraph) + { + RichTextMarkupItemGroup group = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("pard")); + FormattedTextItemParagraph itm = (item as FormattedTextItemParagraph); + foreach (FormattedTextItem item1 in itm.Items) + { + RenderItem(group, item1); + } + group.Items.Add(new RichTextMarkupItemTag("par")); + parent.Items.Add(group); + } + else if (item is FormattedTextItemFontSize) + { + FormattedTextItemFontSize itm = (item as FormattedTextItemFontSize); + RichTextMarkupItemGroup group = new RichTextMarkupItemGroup(new RichTextMarkupItemTag("fs" + (itm.Value * 2).ToString())); + foreach (FormattedTextItem item1 in itm.Items) + { + RenderItem(group, item1); + } + parent.Items.Add(group); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFGenerator.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFGenerator.cs new file mode 100644 index 00000000..3e662409 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/Text/Formatted/RichText/RTFGenerator.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Text.Formatted.RichText +{ + public static class RTFGenerator + { + private static string mvarWordPadWindows7 = "Msftedit 5.41.21.2509"; + /// + /// Gets the RTF generator tag value for Microsoft WordPad on Windows 7. + /// + public static string WordPadWindows7 { get { return mvarWordPadWindows7; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs new file mode 100644 index 00000000..d429d7f4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs @@ -0,0 +1,1168 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.DataFormats.PropertyList.XML; +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.ObjectModels.Project; +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.ObjectModels.UEPackage; + +namespace UniversalEditor.DataFormats.UEPackage +{ + public class UEPackageXMLDataFormat : XMLDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(UEPackageObjectModel), DataFormatCapabilities.All); + _dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + } + return _dfr; + } + + private static void LoadProjectFile(MarkupTagElement tag, ProjectFile.ProjectFileCollection coll) + { + ProjectFile file = new ProjectFile(); + MarkupAttribute attSourceFileName = tag.Attributes["SourceFileName"]; + if (attSourceFileName != null) + { + file.SourceFileName = attSourceFileName.Value; + } + MarkupAttribute attDestinationFileName = tag.Attributes["DestinationFileName"]; + if (attDestinationFileName != null) + { + file.DestinationFileName = attDestinationFileName.Value; + } + + MarkupTagElement tagContent = (tag.Elements["Content"] as MarkupTagElement); + if (tagContent != null && tagContent.Elements.Count == 1) + { + MarkupAttribute attObjectModelType = tagContent.Attributes["ObjectModelType"]; + if (attObjectModelType != null) + { + + } + + MarkupStringElement cdata = (tagContent.Elements[0] as MarkupStringElement); + file.Content = System.Text.Encoding.Default.GetBytes(cdata.Value); + } + else + { + return; + } + coll.Add(file); + } + + private bool mvarIncludeProjectTypes = true; + public bool IncludeProjectTypes { get { return mvarIncludeProjectTypes; } set { mvarIncludeProjectTypes = value; } } + private bool mvarIncludeTemplates = true; + public bool IncludeTemplates { get { return mvarIncludeTemplates; } set { mvarIncludeTemplates = value; } } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + MarkupObjectModel mom = (objectModels.Pop() as MarkupObjectModel); + UEPackageObjectModel package = (objectModels.Pop() as UEPackageObjectModel); + + MarkupTagElement tagUniversalEditor = (mom.Elements["UniversalEditor"] as MarkupTagElement); + if (tagUniversalEditor == null) throw new InvalidDataFormatException("Top-level tag 'UniversalEditor' not found"); + + #region Data Formats + { + MarkupTagElement tagDataFormats = (tagUniversalEditor.Elements["DataFormats"] as MarkupTagElement); + if (tagDataFormats != null) + { + foreach (MarkupElement elDataFormat in tagDataFormats.Elements) + { + MarkupTagElement tagDataFormat = (elDataFormat as MarkupTagElement); + if (tagDataFormat == null) continue; + + MarkupTagElement tagInformation = (tagDataFormat.Elements["Information"] as MarkupTagElement); + + MarkupTagElement tagFilters = (tagDataFormat.Elements["Filters"] as MarkupTagElement); + if (tagFilters == null) continue; + + MarkupTagElement tagCapabilities = (tagDataFormat.Elements["Capabilities"] as MarkupTagElement); + if (tagCapabilities == null) continue; + + MarkupTagElement tagFormat = (tagDataFormat.Elements["Format"] as MarkupTagElement); + if (tagFormat == null) continue; + + CustomDataFormatReference dfr = new CustomDataFormatReference(); + + Dictionary localVariables = new Dictionary(); + + #region Information + { + if (tagInformation != null) + { + if (tagInformation.Elements["Title"] != null) + { + dfr.Title = tagInformation.Elements["Title"].Value; + } + } + } + #endregion + #region Capabilities + { + foreach (MarkupElement elCapability in tagCapabilities.Elements) + { + MarkupTagElement tagCapability = (elCapability as MarkupTagElement); + if (tagCapability == null) continue; + if (tagCapability.Name != "Capability") continue; + if (tagCapability.Attributes["Value"] == null) continue; + + string capability = tagCapability.Attributes["Value"].Value; + DataFormatCapabilities caps = DataFormatCapabilities.None; + try + { + caps = (DataFormatCapabilities)Enum.Parse(typeof(DataFormatCapabilities), capability); + } + catch + { + } + + if (tagCapability.Attributes["ObjectModelType"] != null) + { + string nam = tagCapability.Attributes["ObjectModelType"].Value; + Type objectModelType = Type.GetType(nam); + if (objectModelType == null) + { + continue; + } + + if (objectModelType.IsSubclassOf(typeof(ObjectModel))) + { + dfr.Capabilities.Add(objectModelType, caps); + } + } + else if (tagCapability.Attributes["ObjectModelID"] != null) + { + dfr.Capabilities.Add(new Guid(tagCapability.Attributes["ObjectModelID"].Value), caps); + } + + } + } + #endregion + #region Filters + { + foreach (MarkupElement elFilter in tagFilters.Elements) + { + MarkupTagElement tagFilter = (elFilter as MarkupTagElement); + if (tagFilter.Name != "Filter") continue; + + + DataFormatFilter filter = new DataFormatFilter(); + MarkupAttribute attHintComparison = tagFilter.Attributes["HintComparison"]; + if (attHintComparison != null) + { + switch (attHintComparison.Value.ToLower()) + { + case "always": + { + filter.HintComparison = DataFormatHintComparison.Always; + break; + } + case "filteronly": + { + filter.HintComparison = DataFormatHintComparison.FilterOnly; + break; + } + case "filterthenmagic": + { + filter.HintComparison = DataFormatHintComparison.FilterThenMagic; + break; + } + case "magiconly": + { + filter.HintComparison = DataFormatHintComparison.MagicOnly; + break; + } + case "magicthenfilter": + { + filter.HintComparison = DataFormatHintComparison.MagicThenFilter; + break; + } + default: + { + filter.HintComparison = DataFormatHintComparison.Never; + break; + } + } + } + + MarkupTagElement tagFilterTitle = (tagFilter.Elements["Title"] as MarkupTagElement); + if (tagFilterTitle != null) filter.Title = tagFilterTitle.Value; + + #region File Name Filters + { + MarkupTagElement tagFilterFileNames = (tagFilter.Elements["FileNameFilters"] as MarkupTagElement); + if (tagFilterFileNames != null) + { + foreach (MarkupElement elFilterFileName in tagFilterFileNames.Elements) + { + MarkupTagElement tagFilterFileName = (elFilterFileName as MarkupTagElement); + if (tagFilterFileName.Name != "FileNameFilter") continue; + filter.FileNameFilters.Add(tagFilterFileName.Value); + } + } + } + #endregion + #region Magic Bytes + { + MarkupTagElement tagMagicBytes = (tagFilter.Elements["MagicBytes"] as MarkupTagElement); + if (tagMagicBytes != null) + { + foreach (MarkupElement elMagicByteCollection in tagMagicBytes.Elements) + { + MarkupTagElement tagMagicByteCollection = (elMagicByteCollection as MarkupTagElement); + if (tagMagicByteCollection == null) continue; + if (tagMagicByteCollection.Name != "MagicByteCollection") continue; + + List array = new List(); + foreach (MarkupElement elMagicByte in tagMagicByteCollection.Elements) + { + MarkupTagElement tagMagicByte = (elMagicByte as MarkupTagElement); + if (tagMagicByte == null) continue; + if (tagMagicByte.Name != "MagicByte") continue; + + byte? value = null; + byte tryValue = 0; + char tryChar = '\0'; + + if (Byte.TryParse(tagMagicByte.Value, out tryValue)) + { + value = tryValue; + } + else if (tagMagicByte.Value.StartsWith("0x")) + { + if (Byte.TryParse(tagMagicByte.Value.Substring(2), System.Globalization.NumberStyles.HexNumber, null, out tryValue)) + { + value = tryValue; + } + } + else if (tagMagicByte.Value.Length > 1) + { + for (int i = 0; i < tagMagicByte.Value.Length; i++) + { + array.Add((byte)(tagMagicByte.Value[i])); + } + continue; + } + else if (Char.TryParse(tagMagicByte.Value, out tryChar)) + { + value = (byte)tryChar; + } + array.Add(value); + } + filter.MagicBytes.Add(array.ToArray()); + } + } + } + #endregion + + Console.WriteLine("WARNING: this method of adding filters is deprecated; please use Associations instead!"); + // dfr.Filters.Add(filter); + } + } + #endregion + #region Format + { + foreach (MarkupElement elField in tagFormat.Elements) + { + MarkupTagElement tagField = (elField as MarkupTagElement); + if (tagField == null) continue; + + switch (tagField.Name) + { + case "Field": + { + if (tagField.Attributes["DataType"] == null) continue; + + CustomDataFormatItemField cdfif = new CustomDataFormatItemField(); + cdfif.DataType = tagField.Attributes["DataType"].Value; + + if (tagField.Attributes["ID"] != null) + { + cdfif.Name = tagField.Attributes["ID"].Value; + } + dfr.Items.Add(cdfif); + break; + } + case "Array": + { + if (tagField.Attributes["DataType"] == null) continue; + + CustomDataFormatItemArray cdfif = new CustomDataFormatItemArray(); + cdfif.DataType = tagField.Attributes["DataType"].Value; + + if (tagField.Attributes["ID"] != null) + { + cdfif.Name = tagField.Attributes["ID"].Value; + } + if (tagField.Attributes["Length"] != null) + { + string value = tagField.Attributes["Length"].Value; + value = UniversalEditor.Common.Strings.ReplaceVariables(value, localVariables); + int length = 0; + Int32.TryParse(value, out length); + + cdfif.Length = length; + } + dfr.Items.Add(cdfif); + break; + } + } + } + } + #endregion + + package.DataFormats.Add(dfr); + } + } + } + #endregion + #region Project Types + { + if (mvarIncludeProjectTypes) + { + MarkupTagElement tagProjectTypes = (tagUniversalEditor.Elements["ProjectTypes"] as MarkupTagElement); + if (tagProjectTypes != null) + { + foreach (MarkupElement elProjectType in tagProjectTypes.Elements) + { + MarkupTagElement tagProjectType = (elProjectType as MarkupTagElement); + if (tagProjectType == null) continue; + if (tagProjectType.FullName != "ProjectType") continue; + + MarkupAttribute attID = tagProjectType.Attributes["ID"]; + if (attID == null) continue; + + ProjectType projtype = new ProjectType(); + projtype.ID = new Guid(attID.Value); + + MarkupTagElement tagInformation = (tagProjectType.Elements["Information"] as MarkupTagElement); + if (tagInformation != null) + { + MarkupTagElement tagTitle = (tagInformation.Elements["Title"] as MarkupTagElement); + if (tagTitle != null) projtype.Title = tagTitle.Value; + MarkupTagElement tagIconPath = (tagInformation.Elements["IconPath"] as MarkupTagElement); + if (tagIconPath != null) + { + MarkupAttribute attFileName = tagIconPath.Attributes["FileName"]; + if (attFileName != null) + { + string FileName = attFileName.Value; + if (System.IO.File.Exists(FileName)) projtype.LargeIconImageFileName = FileName; + if (System.IO.File.Exists(FileName)) projtype.SmallIconImageFileName = FileName; + } + MarkupAttribute attLargeFileName = tagIconPath.Attributes["LargeFileName"]; + if (attLargeFileName != null) + { + string FileName = attLargeFileName.Value; + if (System.IO.File.Exists(FileName)) projtype.LargeIconImageFileName = FileName; + } + MarkupAttribute attSmallFileName = tagIconPath.Attributes["SmallFileName"]; + if (attSmallFileName != null) + { + string FileName = attSmallFileName.Value; + if (System.IO.File.Exists(FileName)) projtype.SmallIconImageFileName = FileName; + } + } + } + #region ItemShortcuts + { + MarkupTagElement tagItemShortcuts = (tagProjectType.Elements["ItemShortcuts"] as MarkupTagElement); + if (tagItemShortcuts != null) + { + foreach (MarkupElement el in tagItemShortcuts.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName != "ItemShortcut") continue; + + ProjectTypeItemShortcut z = new ProjectTypeItemShortcut(); + z.Title = tag.Attributes["Title"].Value; + + string objectModelTypeName = tag.Attributes["ObjectModelTypeName"].Value; + z.ObjectModelReference = Common.Reflection.GetAvailableObjectModelByTypeName(objectModelTypeName); + + projtype.ItemShortcuts.Add(z); + } + } + } + #endregion + #region Tasks + { + MarkupTagElement tagTasks = (tagProjectType.Elements["Tasks"] as MarkupTagElement); + if (tagTasks != null) + { + foreach (MarkupElement el in tagTasks.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName != "Task") continue; + + ProjectTask task = new ProjectTask(); + task.Title = tag.Attributes["Title"].Value; + + MarkupTagElement tagActions = (tag.Elements["Actions"] as MarkupTagElement); + if (tagActions != null) + { + foreach (MarkupElement elAction in tagActions.Elements) + { + MarkupTagElement tagAction = (elAction as MarkupTagElement); + if (tagAction == null) continue; + if (tagAction.FullName != "Action") continue; + + MarkupAttribute attTypeID = tagAction.Attributes["TypeID"]; + if (attTypeID != null) + { + Guid id = new Guid(attTypeID.Value); + + ProjectTaskActionReference ptar = ProjectTaskActionReference.GetByTypeID(id); + ProjectTaskAction pta = ptar.Create(); + pta.LoadFromMarkup(tagAction); + task.Actions.Add(pta); + } + } + } + + projtype.Tasks.Add(task); + } + } + } + #endregion + #region Variables + { + MarkupTagElement tagVariables = (tagProjectType.Elements["Variables"] as MarkupTagElement); + if (tagVariables != null) + { + foreach (MarkupElement el in tagVariables.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName != "Variable") continue; + + ProjectTypeVariable varr = new ProjectTypeVariable(); + varr.Name = (tag.Attributes["Name"] == null ? String.Empty : tag.Attributes["Name"].Value); + varr.Title = (tag.Attributes["Title"] == null ? String.Empty : tag.Attributes["Title"].Value); + + MarkupAttribute attType = tag.Attributes["Type"]; + if (attType != null) + { + switch (attType.Value.ToLower()) + { + case "choice": + { + varr.Type = ProjectTypeVariableType.Choice; + break; + } + case "fileopen": + { + varr.Type = ProjectTypeVariableType.FileOpen; + break; + } + case "filesave": + { + varr.Type = ProjectTypeVariableType.FileSave; + break; + } + default: + { + varr.Type = ProjectTypeVariableType.Text; + break; + } + } + } + + MarkupTagElement tagValidValues = (tag.Elements["ValidValues"] as MarkupTagElement); + if (tagValidValues != null) + { + foreach (MarkupElement elValidValue in tagValidValues.Elements) + { + MarkupTagElement tagValidValue = (elValidValue as MarkupTagElement); + if (tagValidValue == null) continue; + if (tagValidValue.FullName != "ValidValue") continue; + + string value = (tagValidValue.Attributes["Value"] == null ? String.Empty : tagValidValue.Attributes["Value"].Value); + string title = (tagValidValue.Attributes["Title"] == null ? value : tagValidValue.Attributes["Title"].Value); + + varr.ValidValues.Add(title, value); + } + } + projtype.Variables.Add(varr); + } + } + } + #endregion + + package.ProjectTypes.Add(projtype); + } + } + } + } + #endregion + #region Templates + { + if (mvarIncludeTemplates) + { + #region Document Templates + { + MarkupTagElement tagTemplates = (tagUniversalEditor.Elements["DocumentTemplates"] as MarkupTagElement); + if (tagTemplates != null) + { + foreach (MarkupElement elTemplate in tagTemplates.Elements) + { + MarkupTagElement tagTemplate = (elTemplate as MarkupTagElement); + if (tagTemplate == null) continue; + + if (tagTemplate.FullName != "DocumentTemplate") continue; + + DocumentTemplate template = new DocumentTemplate(); + + MarkupAttribute attID = tagTemplate.Attributes["ID"]; + if (attID != null) + { + template.ID = new Guid(attID.Value); + } + + MarkupTagElement tagInformation = (tagTemplate.Elements["Information"] as MarkupTagElement); + + #region Information + { + if (tagInformation != null) + { + if (tagInformation.Elements["Title"] != null) + { + template.Title = tagInformation.Elements["Title"].Value; + } + if (tagInformation.Elements["Description"] != null) + { + template.Description = tagInformation.Elements["Description"].Value; + } + + MarkupTagElement tagIconPath = (tagInformation.Elements["IconPath"] as MarkupTagElement); + if (tagIconPath != null) + { + MarkupAttribute attFileName = tagIconPath.Attributes["FileName"]; + if (attFileName != null) + { + string ImageFileName = attFileName.Value; + template.LargeIconImageFileName = ImageFileName; + template.SmallIconImageFileName = ImageFileName; + } + MarkupAttribute attLargeFileName = tagIconPath.Attributes["LargeFileName"]; + if (attLargeFileName != null) + { + string ImageFileName = attLargeFileName.Value; + template.LargeIconImageFileName = ImageFileName; + } + MarkupAttribute attSmallFileName = tagIconPath.Attributes["SmallFileName"]; + if (attSmallFileName != null) + { + string ImageFileName = attSmallFileName.Value; + template.SmallIconImageFileName = ImageFileName; + } + } + } + } + #endregion + #region Variables + { + MarkupTagElement tagVariables = (tagTemplate.Elements["Variables"] as MarkupTagElement); + if (tagVariables != null) + { + foreach (MarkupElement elVariable in tagVariables.Elements) + { + MarkupTagElement tagVariable = (elVariable as MarkupTagElement); + if (tagVariable == null) continue; + if (tagVariable.FullName != "Variable") continue; + + TemplateVariable varr = new TemplateVariable(); + + MarkupAttribute attDataType = tagVariable.Attributes["DataType"]; + if (attDataType != null) + { + varr.DataType = attDataType.Value; + } + else + { + varr.DataType = "String"; + } + + MarkupAttribute attName = tagVariable.Attributes["Name"]; + if (attName != null) + { + varr.Name = attName.Value; + } + + MarkupAttribute attValue = tagVariable.Attributes["Value"]; + if (attValue != null) + { + varr.Value = attValue.Value; + } + + MarkupAttribute attLabel = tagVariable.Attributes["Label"]; + if (attLabel != null) + { + varr.Label = attLabel.Value; + } + + MarkupTagElement tagChoices = (tagVariable.Elements["Choices"] as MarkupTagElement); + if (tagChoices != null) + { + foreach (MarkupElement elChoice in tagChoices.Elements) + { + MarkupTagElement tagChoice = (elChoice as MarkupTagElement); + if (tagChoice == null) continue; + if (tagChoice.FullName != "Choice") continue; + + MarkupAttribute attChoiceValue = tagChoice.Attributes["Value"]; + if (attChoiceValue == null) continue; + + MarkupAttribute attChoiceName = tagChoice.Attributes["Name"]; + if (attChoiceName != null) + { + varr.Choices.Add(attChoiceName.Value, attChoiceValue.Value); + } + else + { + varr.Choices.Add(attChoiceValue.Value, attChoiceValue.Value); + } + } + } + + template.Variables.Add(varr); + } + } + } + #endregion + #region Content + { + MarkupTagElement tagContent = (tagTemplate.Elements["Content"] as MarkupTagElement); + if (tagContent != null) + { + if (tagContent.Attributes["ObjectModelID"] != null) + { + template.ObjectModelReference = new ObjectModelReference(new Guid(tagContent.Attributes["ObjectModelID"].Value)); + } + else if (tagContent.Attributes["ObjectModelType"] != null) + { + template.ObjectModelReference = new ObjectModelReference(tagContent.Attributes["ObjectModelType"].Value); + } + template.TemplateContent.Elements.Add(tagContent); + } + } + #endregion + + package.DocumentTemplates.Add(template); + } + } + } + #endregion + #region Project Templates + { + MarkupTagElement tagTemplates = (tagUniversalEditor.Elements["ProjectTemplates"] as MarkupTagElement); + if (tagTemplates != null) + { + foreach (MarkupElement elTemplate in tagTemplates.Elements) + { + MarkupTagElement tagTemplate = (elTemplate as MarkupTagElement); + if (tagTemplate == null) continue; + + if (tagTemplate.FullName != "ProjectTemplate") continue; + + ProjectTemplate template = new ProjectTemplate(); + + MarkupAttribute attTypeID = tagTemplate.Attributes["TypeID"]; + if (attTypeID != null) + { + try + { + template.ProjectType = Common.Reflection.GetProjectTypeByTypeID(new Guid(attTypeID.Value)); + } + catch + { + } + } + + #region Information + MarkupTagElement tagInformation = (tagTemplate.Elements["Information"] as MarkupTagElement); + if (tagInformation != null) + { + MarkupTagElement tagTitle = (tagInformation.Elements["Title"] as MarkupTagElement); + if (tagTitle != null) template.Title = tagTitle.Value; + + MarkupTagElement tagDescription = (tagInformation.Elements["Description"] as MarkupTagElement); + if (tagDescription != null) template.Description = tagDescription.Value; + + if (tagInformation.Elements["ProjectNamePrefix"] != null) + { + template.ProjectNamePrefix = tagInformation.Elements["ProjectNamePrefix"].Value; + } + + MarkupTagElement tagPath = (tagInformation.Elements["Path"] as MarkupTagElement); + if (tagPath != null) + { + List pathParts = new List(); + foreach (MarkupElement elPart in tagPath.Elements) + { + MarkupTagElement tagPart = (elPart as MarkupTagElement); + if (tagPart == null) continue; + if (tagPart.FullName != "Part") continue; + pathParts.Add(tagPart.Value); + } + template.Path = pathParts.ToArray(); + } + + MarkupTagElement tagIconPath = (tagInformation.Elements["IconPath"] as MarkupTagElement); + if (tagIconPath != null) + { + #region All Icons + { + MarkupAttribute attFileName = tagIconPath.Attributes["FileName"]; + if (attFileName != null) + { + string FileName = attFileName.Value; + if (System.IO.File.Exists(FileName)) template.LargeIconImageFileName = FileName; + if (System.IO.File.Exists(FileName)) template.SmallIconImageFileName = FileName; + } + } + #endregion + #region Large Icon + { + MarkupAttribute attLargeFileName = tagIconPath.Attributes["LargeFileName"]; + if (attLargeFileName != null) + { + string FileName = attLargeFileName.Value; + if (System.IO.File.Exists(FileName)) template.LargeIconImageFileName = FileName; + } + } + #endregion + #region Small Icon + { + MarkupAttribute attSmallFileName = tagIconPath.Attributes["SmallFileName"]; + if (attSmallFileName != null) + { + string FileName = attSmallFileName.Value; + if (System.IO.File.Exists(FileName)) template.SmallIconImageFileName = FileName; + } + } + #endregion + } + } + #endregion + #region FileSystem + { + MarkupTagElement tagFileSystem = (tagTemplate.Elements["FileSystem"] as MarkupTagElement); + if (tagFileSystem != null) + { + MarkupTagElement tagFiles = (tagFileSystem.Elements["Files"] as MarkupTagElement); + if (tagFiles != null) + { + foreach (MarkupElement elFile in tagFiles.Elements) + { + MarkupTagElement tagFile = (elFile as MarkupTagElement); + if (tagFile == null) continue; + if (tagFile.FullName != "File") continue; + + LoadProjectFile(tagFile, template.FileSystem.Files); + } + } + } + } + #endregion + #region Configuration + { + MarkupTagElement tagConfiguration = (tagTemplate.Elements["Configuration"] as MarkupTagElement); + if (tagConfiguration != null) + { + PropertyListObjectModel plom = template.Configuration; + XMLPropertyListDataFormat xmlplist = new XMLPropertyListDataFormat(); + XMLPropertyListDataFormat.LoadMarkup(tagConfiguration, ref plom); + } + } + #endregion + + package.ProjectTemplates.Add(template); + } + } + } + } + #endregion + } + #endregion + #region Associations + { + MarkupTagElement tagAssociations = (tagUniversalEditor.Elements["Associations"] as MarkupTagElement); + if (tagAssociations != null) + { + foreach (MarkupElement elAssociation in tagAssociations.Elements) + { + MarkupTagElement tagAssociation = (elAssociation as MarkupTagElement); + if (tagAssociation == null) continue; + if (tagAssociation.FullName != "Association") continue; + + Association association = new Association(); + + MarkupTagElement tagObjectModels = (tagAssociation.Elements["ObjectModels"] as MarkupTagElement); + if (tagObjectModels != null) + { + foreach (MarkupElement elObjectModel in tagObjectModels.Elements) + { + MarkupTagElement tagObjectModel = (elObjectModel as MarkupTagElement); + if (tagObjectModel == null) continue; + if (tagObjectModel.FullName != "ObjectModel") continue; + + MarkupAttribute attTypeName = tagObjectModel.Attributes["TypeName"]; + MarkupAttribute attID = tagObjectModel.Attributes["ID"]; + + ObjectModelReference omr = null; + if (attTypeName != null) + { + omr = ObjectModelReference.FromTypeName(attTypeName.Value); + } + else if (attID != null) + { + omr = ObjectModelReference.FromGUID(new Guid(attID.Value)); + } + + if (omr != null) + { + association.ObjectModels.Add(omr); + } + } + } + + MarkupTagElement tagDataFormats = (tagAssociation.Elements["DataFormats"] as MarkupTagElement); + if (tagDataFormats != null) + { + foreach (MarkupElement elDataFormat in tagDataFormats.Elements) + { + MarkupTagElement tagDataFormat = (elDataFormat as MarkupTagElement); + if (tagDataFormat == null) continue; + if (tagDataFormat.FullName != "DataFormat") continue; + + MarkupAttribute attTypeName = tagDataFormat.Attributes["TypeName"]; + MarkupAttribute attID = tagDataFormat.Attributes["ID"]; + + DataFormatReference dfr = null; + if (attTypeName != null) + { + dfr = DataFormatReference.FromTypeName(attTypeName.Value); + } + else if (attID != null) + { + dfr = DataFormatReference.FromGUID(new Guid(attID.Value)); + } + + if (dfr != null) + { + association.DataFormats.Add(dfr); + } + } + } + + MarkupTagElement tagFilters = (tagAssociation.Elements["Filters"] as MarkupTagElement); + if (tagFilters != null) + { + foreach (MarkupElement elFilter in tagFilters.Elements) + { + MarkupTagElement tagFilter = (elFilter as MarkupTagElement); + if (tagFilter == null) continue; + if (tagFilter.FullName != "Filter") continue; + + DataFormatFilter filter = new DataFormatFilter(); + MarkupAttribute attTitle = tagFilter.Attributes["Title"]; + if (attTitle != null) + { + filter.Title = attTitle.Value; + } + + MarkupAttribute attHintComparison = tagFilter.Attributes["HintComparison"]; + if (attHintComparison != null) + { + switch (attHintComparison.Value.ToLower()) + { + case "always": + { + filter.HintComparison = DataFormatHintComparison.Always; + break; + } + case "filteronly": + { + filter.HintComparison = DataFormatHintComparison.FilterOnly; + break; + } + case "filterthenmagic": + { + filter.HintComparison = DataFormatHintComparison.FilterThenMagic; + break; + } + case "magiconly": + { + filter.HintComparison = DataFormatHintComparison.MagicOnly; + break; + } + case "magicthenfilter": + { + filter.HintComparison = DataFormatHintComparison.MagicThenFilter; + break; + } + case "never": + { + filter.HintComparison = DataFormatHintComparison.Never; + break; + } + default: + { + filter.HintComparison = DataFormatHintComparison.Unspecified; + break; + } + } + } + + MarkupTagElement tagFileNameFilters = (tagFilter.Elements["FileNameFilters"] as MarkupTagElement); + if (tagFileNameFilters != null) + { + foreach (MarkupElement elFileNameFilter in tagFileNameFilters.Elements) + { + MarkupTagElement tagFileNameFilter = (elFileNameFilter as MarkupTagElement); + if (tagFileNameFilter == null) continue; + if (tagFileNameFilter.FullName != "FileNameFilter") continue; + + filter.FileNameFilters.Add(tagFileNameFilter.Value); + } + } + + MarkupTagElement tagMagicByteSequences = (tagFilter.Elements["MagicByteSequences"] as MarkupTagElement); + if (tagMagicByteSequences != null) + { + foreach (MarkupElement elMagicByteSequence in tagMagicByteSequences.Elements) + { + MarkupTagElement tagMagicByteSequence = (elMagicByteSequence as MarkupTagElement); + if (tagMagicByteSequence == null) continue; + if (tagMagicByteSequence.FullName != "MagicByteSequence") continue; + + List magicByteSequence = new List(); + + foreach (MarkupElement elMagicByte in tagMagicByteSequence.Elements) + { + MarkupTagElement tagMagicByte = (elMagicByte as MarkupTagElement); + if (tagMagicByte == null) continue; + if (tagMagicByte.FullName != "MagicByte") continue; + + MarkupAttribute attType = tagMagicByte.Attributes["Type"]; + if (attType == null) continue; + + switch (attType.Value.ToLower()) + { + case "blank": + { + MarkupAttribute attLength = tagMagicByte.Attributes["Length"]; + if (attLength == null) continue; + + int iLength = 0; + if (!Int32.TryParse(attLength.Value, out iLength)) continue; + + for (int i = 0; i < iLength; i++) + { + magicByteSequence.Add(null); + } + break; + } + case "string": + { + string value = tagMagicByte.Value; + for (int i = 0; i < value.Length; i++) + { + magicByteSequence.Add((byte)value[i]); + } + break; + } + case "byte": + { + string value = tagMagicByte.Value.ToLower(); + byte realvalue = 0; + if (value.StartsWith("0x") || value.StartsWith("&h")) + { + value = value.Substring(2); + realvalue = Byte.Parse(value, System.Globalization.NumberStyles.HexNumber); + } + else + { + realvalue = Byte.Parse(value); + } + for (int i = 0; i < value.Length; i++) + { + magicByteSequence.Add(realvalue); + } + break; + } + case "hexstring": + { + string value = tagMagicByte.Value.ToLower(); + byte realvalue = 0; + for (int i = 0; i < value.Length; i += 2) + { + string val = value.Substring(i, 2); + realvalue = Byte.Parse(value, System.Globalization.NumberStyles.HexNumber); + magicByteSequence.Add(realvalue); + } + break; + } + } + } + + filter.MagicBytes.Add(magicByteSequence.ToArray()); + } + } + + association.Filters.Add(filter); + } + } + + package.Associations.Add(association); + } + } + } + #endregion + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + UEPackageObjectModel package = (objectModels.Pop() as UEPackageObjectModel); + MarkupObjectModel mom = new MarkupObjectModel(); + + MarkupTagElement tagUniversalEditor = new MarkupTagElement(); + tagUniversalEditor.FullName = "UniversalEditor"; + tagUniversalEditor.Attributes.Add("Version", "4.0"); + + #region Project Types + { + if (mvarIncludeProjectTypes) + { + if (package.ProjectTypes.Count > 0) + { + MarkupTagElement tagProjectTypes = new MarkupTagElement(); + tagProjectTypes.FullName = "ProjectTypes"; + foreach (ProjectType projtype in package.ProjectTypes) + { + MarkupTagElement tagProjectType = new MarkupTagElement(); + tagProjectType.FullName = "ProjectType"; + tagProjectType.Attributes.Add("ID", projtype.ID.ToString("B")); + + #region Information + { + MarkupTagElement tagInformation = new MarkupTagElement(); + tagInformation.FullName = "Information"; + + MarkupTagElement tagTitle = new MarkupTagElement(); + tagTitle.FullName = "Title"; + tagTitle.Value = projtype.Title; + tagInformation.Elements.Add(tagTitle); + + tagProjectType.Elements.Add(tagInformation); + } + #endregion + #region Tasks + { + if (projtype.Tasks.Count > 0) + { + MarkupTagElement tagTasks = new MarkupTagElement(); + tagTasks.FullName = "Tasks"; + + foreach (ProjectTask task in projtype.Tasks) + { + MarkupTagElement tagTask = new MarkupTagElement(); + tagTask.FullName = "Task"; + tagTask.Attributes.Add("Title", task.Title); + + if (task.Actions.Count > 0) + { + MarkupTagElement tagActions = new MarkupTagElement(); + tagActions.FullName = "Actions"; + foreach (ProjectTaskAction action in task.Actions) + { + MarkupTagElement tagAction = new MarkupTagElement(); + tagAction.FullName = "Action"; + + // TODO: load the action + + tagActions.Elements.Add(tagAction); + } + tagTask.Elements.Add(tagActions); + } + + tagTasks.Elements.Add(tagTask); + } + + tagProjectType.Elements.Add(tagTasks); + } + } + #endregion + #region ItemShortcuts + { + if (projtype.ItemShortcuts.Count > 0) + { + MarkupTagElement tagItemShortcuts = new MarkupTagElement(); + tagItemShortcuts.FullName = "ItemShortcuts"; + foreach (ProjectTypeItemShortcut shortcut in projtype.ItemShortcuts) + { + MarkupTagElement tagItemShortcut = new MarkupTagElement(); + tagItemShortcut.FullName = "ItemShortcut"; + tagItemShortcut.Attributes.Add("Title", shortcut.Title); + if (shortcut.ObjectModelReference.TypeName != null) + { + tagItemShortcut.Attributes.Add("ObjectModelTypeName", shortcut.ObjectModelReference.TypeName); + } + if (shortcut.ObjectModelReference.ID != Guid.Empty) + { + tagItemShortcut.Attributes.Add("ObjectModelID", shortcut.ObjectModelReference.ID.ToString("B")); + } + tagItemShortcut.Attributes.Add("DocumentTemplateID", shortcut.DocumentTemplate.ID.ToString("B")); + tagItemShortcuts.Elements.Add(tagItemShortcut); + } + tagProjectType.Elements.Add(tagItemShortcuts); + } + } + #endregion + #region Variables + { + if (projtype.Variables.Count > 0) + { + MarkupTagElement tagVariables = new MarkupTagElement(); + tagVariables.FullName = "Variables"; + + tagProjectType.Elements.Add(tagVariables); + } + } + #endregion + + tagProjectTypes.Elements.Add(tagProjectType); + } + tagUniversalEditor.Elements.Add(tagProjectTypes); + } + } + } + #endregion + + mom.Elements.Add(tagUniversalEditor); + + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ExpandedString.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ExpandedString.cs new file mode 100644 index 00000000..af313d9f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ExpandedString.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor +{ + public class ExpandedStringVariableStore + { + + private ExpandedStringVariable.ExpandedStringVariableCollection mvarConstants = new ExpandedStringVariable.ExpandedStringVariableCollection(); + public ExpandedStringVariable.ExpandedStringVariableCollection Constants { get { return mvarConstants; } } + private ExpandedStringVariable.ExpandedStringVariableCollection mvarVariables = new ExpandedStringVariable.ExpandedStringVariableCollection(); + public ExpandedStringVariable.ExpandedStringVariableCollection Variables { get { return mvarVariables; } } + } + public class ExpandedStringVariable + { + private string mvarID = String.Empty; + public string ID { get { return mvarID; } set { mvarID = value; } } + + private object mvarValue = null; + public object Value { get { return mvarValue; } set { mvarValue = value; } } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(mvarID); + sb.Append("="); + if (mvarValue == null) + { + sb.Append("(null)"); + } + else + { + sb.Append("\""); + sb.Append(mvarValue.ToString()); + sb.Append("\""); + } + return sb.ToString(); + } + + public class ExpandedStringVariableCollection + { + private Dictionary> variables = new Dictionary>(); + public ExpandedStringVariable this[ExpandedStringSegmentVariableScope scope, string id] + { + get + { + if (!variables.ContainsKey(scope)) variables.Add(scope, new Dictionary()); + if (!variables[scope].ContainsKey(id)) return null; + return variables[scope][id]; + } + set + { + if (!variables.ContainsKey(scope)) variables.Add(scope, new Dictionary()); + variables[scope][id] = value; + } + } + } + } + public class ExpandedString + { + public static readonly ExpandedString Empty = new ExpandedString(); + + public ExpandedString() + { + + } + public ExpandedString(params ExpandedStringSegment[] segments) + { + foreach (ExpandedStringSegment segment in segments) + { + mvarSegments.Add(segment); + } + } + + private ExpandedStringSegment.ExpandedStringSegmentCollection mvarSegments = new ExpandedStringSegment.ExpandedStringSegmentCollection(); + public ExpandedStringSegment.ExpandedStringSegmentCollection Segments { get { return mvarSegments; } } + + public override string ToString() + { + return mvarSegments.Count.ToString() + " segments"; + } + public string ToString(ExpandedStringVariableStore variables) + { + StringBuilder sb = new StringBuilder(); + foreach (ExpandedStringSegment segment in mvarSegments) + { + sb.Append(segment.ToString(variables)); + } + return sb.ToString(); + } + + public static ExpandedString FromMarkup(MarkupTagElement markup) + { + ExpandedString value = new ExpandedString(); + foreach (MarkupElement el in markup.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + switch (tag.FullName) + { + case "VariableReference": + case "ConstantReference": + { + MarkupAttribute attScope = tag.Attributes["Scope"]; + ExpandedStringSegmentVariableScope scope = ExpandedStringSegmentVariableScope.None; + if (attScope != null) + { + switch (attScope.Value.ToLower()) + { + case "file": scope = ExpandedStringSegmentVariableScope.File; break; + case "project": scope = ExpandedStringSegmentVariableScope.Project; break; + case "solution": scope = ExpandedStringSegmentVariableScope.Solution; break; + case "global": scope = ExpandedStringSegmentVariableScope.Global; break; + } + } + + MarkupAttribute attID = tag.Attributes["ID"]; + if (attID == null) continue; + + string separator = ";"; + MarkupAttribute attSeparator = tag.Attributes["Separator"]; + if (attSeparator != null) + { + separator = attSeparator.Value; + } + + if (tag.FullName == "VariableReference") + { + value.Segments.Add(new ExpandedStringSegmentVariable(attID.Value, scope, separator)); + } + else if (tag.FullName == "ConstantReference") + { + value.Segments.Add(new ExpandedStringSegmentConstant(attID.Value, scope, separator)); + } + break; + } + case "Literal": + { + MarkupAttribute attValue = tag.Attributes["Value"]; + if (attValue == null) continue; + + value.Segments.Add(new ExpandedStringSegmentLiteral(attValue.Value)); + break; + } + } + } + return value; + } + } + public abstract class ExpandedStringSegment + { + public class ExpandedStringSegmentCollection + : System.Collections.ObjectModel.Collection + { + + } + + private static readonly ExpandedStringVariableStore _empty = new ExpandedStringVariableStore(); + + public abstract string ToString(ExpandedStringVariableStore variables); + public override string ToString() + { + return ToString(_empty); + } + } + public class ExpandedStringSegmentLiteral : ExpandedStringSegment + { + public ExpandedStringSegmentLiteral() + { + mvarValue = String.Empty; + } + public ExpandedStringSegmentLiteral(string value) + { + mvarValue = value; + } + + private string mvarValue = String.Empty; + public string Value { get { return mvarValue; } set { mvarValue = value; } } + + public override string ToString(ExpandedStringVariableStore variables) + { + return mvarValue; + } + } + + /// + /// The scope of an . + /// + public enum ExpandedStringSegmentVariableScope + { + /// + /// No scope is defined for this variable. Automatically searches for the variable in this scope order: first + /// file scope, then project scope, then solution scope, and finally global scope. + /// + None = 0, + /// + /// The variable is defined at the file level. + /// + File = 1, + /// + /// The variable is defined at the project level. + /// + Project = 2, + /// + /// The variable is defined at the solution level. + /// + Solution = 3, + /// + /// The variable is defined at the global level. + /// + Global = 4 + } + /// + /// Represents a string segment whose value is populated by a variable. + /// + public class ExpandedStringSegmentVariable : ExpandedStringSegment + { + private string mvarVariableName = String.Empty; + /// + /// The name of the variable in the variables dictionary from which to retrieve the value for this . + /// + public string VariableName { get { return mvarVariableName; } set { mvarVariableName = value; } } + + private ExpandedStringSegmentVariableScope mvarScope = ExpandedStringSegmentVariableScope.None; + /// + /// The scope of the variable to search for, or to + /// search all scopes in the order of file, project, solution, global. + /// + public ExpandedStringSegmentVariableScope Scope { get { return mvarScope; } set { mvarScope = value; } } + + private string mvarSeparator = String.Empty; + /// + /// The array separator to use when the value of the variable is an array. + /// + public string Separator { get { return mvarSeparator; } set { mvarSeparator = value; } } + + /// + /// Creates a new instance of with the given variable name. + /// + /// + /// The name of the variable in the variables dictionary from which to retrieve the value for this + /// . + /// + /// + /// The scope of the variable to search for, or to + /// search all scopes in the order of file, project, solution, global. + /// + /// The array separator to use when the value of the variable is an array. + public ExpandedStringSegmentVariable(string variableName, ExpandedStringSegmentVariableScope scope = ExpandedStringSegmentVariableScope.None, string separator = null) + { + mvarVariableName = variableName; + mvarScope = scope; + mvarSeparator = separator; + } + + /// + /// Returns the value of this with the given variables. + /// + /// The variables to pass into the . + /// A that contains the value of this . + public override string ToString(ExpandedStringVariableStore variables) + { + ExpandedStringVariable varr = variables.Variables[mvarScope, mvarVariableName]; + if (varr != null && varr.Value != null) return varr.Value.ToString(); + return String.Empty; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Variable: \""); + sb.Append(mvarVariableName); + sb.Append("\" ("); + sb.Append(mvarScope.ToString()); + sb.Append(" scope)"); + + if (!String.IsNullOrEmpty(mvarSeparator)) + { + sb.Append(" (Array; separator=\""); + sb.Append(mvarSeparator); + sb.Append("\")"); + } + return sb.ToString(); + } + } + public class ExpandedStringSegmentConstant : ExpandedStringSegmentVariable + { + /// + /// Creates a new instance of with the given variable name. + /// + /// + /// The name of the variable in the variables dictionary from which to retrieve the value for this + /// . + /// + /// + /// The scope of the variable to search for, or to + /// search all scopes in the order of file, project, solution, global. + /// + /// The array separator to use when the value of the variable is an array. + public ExpandedStringSegmentConstant(string variableName, ExpandedStringSegmentVariableScope scope = ExpandedStringSegmentVariableScope.None, string separator = null) + : base(variableName, scope, separator) + { + } + public override string ToString(ExpandedStringVariableStore variables) + { + ExpandedStringVariable varr = variables.Constants[Scope, VariableName]; + if (varr != null && varr.Value != null) return varr.Value.ToString(); + return String.Empty; + } + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Constant: \""); + sb.Append(VariableName); + sb.Append("\" ("); + sb.Append(Scope.ToString()); + sb.Append(" scope)"); + + if (!String.IsNullOrEmpty(Separator)) + { + sb.Append(" (Array; separator=\""); + sb.Append(Separator); + sb.Append("\")"); + } + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePair.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePair.cs new file mode 100644 index 00000000..edf68955 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePair.cs @@ -0,0 +1,120 @@ +namespace UniversalEditor +{ + using System; + + public class NameValuePair : NameValuePair + { + public NameValuePair(string Name) : base(Name) + { + } + + public NameValuePair(string Name, string Value) : base(Name, Value) + { + } + } + public class NameValuePair : ICloneable + { + private string mvarName; + private T mvarValue; + + public NameValuePair(string Name) + { + this.mvarName = ""; + this.mvarValue = default(T); + this.mvarName = Name; + this.mvarValue = default(T); + } + + public NameValuePair(string Name, T Value) + { + this.mvarName = ""; + this.mvarValue = default(T); + this.mvarName = Name; + this.mvarValue = Value; + } + + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + + public T Value + { + get + { + return this.mvarValue; + } + set + { + this.mvarValue = value; + } + } + + public class NameValuePairCollection : System.Collections.ObjectModel.Collection> + { + public NameValuePair Add(string Name) + { + return this.Add(Name, default(T)); + } + + public NameValuePair Add(string Name, T Value) + { + NameValuePair p = new NameValuePair(Name, Value); + base.Add(p); + return p; + } + + public bool Contains(string Name) + { + return (this[Name] != null); + } + + public bool Remove(string Name) + { + NameValuePair p = this[Name]; + if (p != null) + { + base.Remove(p); + return true; + } + return false; + } + + public NameValuePair this[string Name] + { + get + { + foreach (NameValuePair p in this) + { + if (p.Name == Name) + { + return p; + } + } + return null; + } + } + } + + public object Clone() + { + NameValuePair clone = new NameValuePair(mvarName.Clone() as string); + if (mvarValue is ICloneable) + { + clone.Value = (T)((mvarValue as ICloneable).Clone()); + } + else + { + clone.Value = mvarValue; + } + return clone; + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePairGroup.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePairGroup.cs new file mode 100644 index 00000000..b2b2e48a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/NameValuePairGroup.cs @@ -0,0 +1,202 @@ +namespace UniversalEditor +{ + using System; + + public class NameValuePairGroup + { + private NameValuePairGroupCollection mvarGroups; + private NameValuePair.NameValuePairCollection mvarItems; + private string mvarName; + private string mvarPathSeparator; + + public NameValuePairGroup(string Name) + { + mvarGroups = new NameValuePairGroupCollection(); + mvarItems = new NameValuePair.NameValuePairCollection(); + mvarPathSeparator = ""; + mvarName = Name; + } + + public NameValuePairGroup GetGroup(string GroupName) + { + string[] path = GroupName.Split(new string[] { this.mvarPathSeparator }, StringSplitOptions.None); + if (path.Length == 1) + { + return this.mvarGroups[path[0]]; + } + NameValuePairGroup pgParent = this.mvarGroups[path[0]]; + int i = 1; + while (pgParent != null) + { + if (pgParent.Groups[path[i]] != null) + { + pgParent = pgParent.Groups[path[i]]; + i++; + } + else + { + break; + } + } + return pgParent.Groups[path[path.Length - 1]]; + } + + public NameValuePair GetItem(string PropertyName) + { + string[] path = PropertyName.Split(new string[] { this.mvarPathSeparator }, StringSplitOptions.None); + if (path.Length == 1) + { + return mvarItems[path[0]]; + } + NameValuePairGroup pgParent = mvarGroups[path[0]]; + int i = 1; + while (pgParent != null) + { + if (pgParent.Groups[path[i]] != null) + { + pgParent = pgParent.Groups[path[i]]; + i++; + } + else + { + break; + } + } + return pgParent.Items[path[path.Length - 1]]; + } + + public bool GetItemValueAsBoolean(string ValueName) + { + return this.GetItemValueAsBoolean(ValueName, false); + } + + public bool GetItemValueAsBoolean(string ValueName, bool DefaultValue) + { + string val = this.GetItemValueAsString(ValueName); + if ((((val.ToLower() == "1") || (val.ToLower() == "true")) || (val.ToLower() == "yes")) || (val.ToLower() == "on")) + { + return true; + } + if ((((val.ToLower() == "0") || (val.ToLower() == "false")) || (val.ToLower() == "no")) || (val.ToLower() == "off")) + { + return false; + } + return DefaultValue; + } + + public int GetItemValueAsInteger(string ValueName) + { + return this.GetItemValueAsInteger(ValueName, -1); + } + + public int GetItemValueAsInteger(string ValueName, int DefaultValue) + { + try + { + return int.Parse(this.GetItemValueAsString(ValueName, DefaultValue.ToString())); + } + catch + { + return DefaultValue; + } + } + + public string GetItemValueAsString(string ValueName) + { + return this.GetItemValueAsString(ValueName, ""); + } + + public string GetItemValueAsString(string ValueName, string DefaultValue) + { + try + { + return this.GetItem(ValueName).Value.ToString(); + } + catch + { + return DefaultValue; + } + } + + public NameValuePairGroupCollection Groups + { + get + { + return this.mvarGroups; + } + } + + public NameValuePair.NameValuePairCollection Items + { + get + { + return this.mvarItems; + } + } + + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + + public string PathSeparator + { + get + { + return this.mvarPathSeparator; + } + set + { + this.mvarPathSeparator = value; + } + } + + public class NameValuePairGroupCollection : System.Collections.ObjectModel.Collection> + { + public NameValuePairGroup Add(string Name) + { + NameValuePairGroup pg = new NameValuePairGroup(Name); + base.Add(pg); + return pg; + } + + public bool Contains(string Name) + { + return (this[Name] != null); + } + + public bool Remove(string Name) + { + NameValuePairGroup pg = this[Name]; + if (pg != null) + { + base.Remove(pg); + return true; + } + return false; + } + + public NameValuePairGroup this[string Name] + { + get + { + foreach (NameValuePairGroup pg in this) + { + if (pg.Name == Name) + { + return pg; + } + } + return null; + } + } + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/AbstractSyntax/AbstractSyntaxObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/AbstractSyntax/AbstractSyntaxObjectModel.cs new file mode 100644 index 00000000..2dd8eba0 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/AbstractSyntax/AbstractSyntaxObjectModel.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.AbstractSyntax +{ + public class AbstractSyntaxObjectModel : ObjectModel + { + public override void Clear() + { + throw new NotImplementedException(); + } + + public override void CopyTo(ObjectModel where) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/ChunkedObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/ChunkedObjectModel.cs new file mode 100644 index 00000000..f3aba7b6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/ChunkedObjectModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Chunked +{ + public class ChunkedObjectModel : ObjectModel + { + private ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Resource Interchange File Format (RIFF)"; + _omr.Path = new string[] { "Software Development", "Resource Interchange File Format (RIFF)" }; + } + return _omr; + } + +#if UE_CHUNKED_RIFF_INCLUDE_METADATA + + private RIFFMetadataItem.RIFFMetadataItemCollection mvarInformation = new RIFFMetadataItem.RIFFMetadataItemCollection(); + public RIFFMetadataItem.RIFFMetadataItemCollection Information { get { return mvarInformation; } } + +#endif + + private RIFFChunk.RIFFChunkCollection mvarChunks = new RIFFChunk.RIFFChunkCollection(); + public RIFFChunk.RIFFChunkCollection Chunks { get { return mvarChunks; } } + + public override void Clear() + { + mvarChunks.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + ChunkedObjectModel clone = where as ChunkedObjectModel; + foreach (RIFFChunk chunk in mvarChunks) + { + clone.Chunks.Add(chunk.Clone() as RIFFChunk); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFChunk.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFChunk.cs new file mode 100644 index 00000000..980a183d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFChunk.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Chunked +{ + public abstract class RIFFChunk : ICloneable + { + public class RIFFChunkCollection : System.Collections.ObjectModel.Collection + { + public RIFFChunk this[string Name] + { + get + { + RIFFChunk result; + foreach (RIFFChunk chunk in this) + { + if (chunk.ID == Name) + { + result = chunk; + return result; + } + } + result = null; + return result; + } + } + public RIFFChunk Add(byte[] Data) + { + return this.Add("", Data); + } + public RIFFChunk Add(string Name, byte[] Data) + { + RIFFDataChunk chunk = new RIFFDataChunk(); + chunk.ID = Name; + chunk.Data = Data; + base.Add(chunk); + return chunk; + } + } + + private string mvarID = String.Empty; + public string ID { get { return mvarID; } set { mvarID = value; } } + + public abstract object Clone(); + + public virtual int Size + { + get { return 4; } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFDataChunk.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFDataChunk.cs new file mode 100644 index 00000000..15b1a43e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFDataChunk.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Chunked +{ + public class RIFFDataChunk : RIFFChunk + { + private byte[] mvarData = new byte[0]; + public byte[] Data + { + get { return mvarData; } + set { mvarData = value; } + } + public override int Size + { + get + { + int result; + if (this.mvarData == null) + { + result = 0; + } + else + { + result = this.mvarData.Length; + } + return result; + } + } + public void Extract(string FileName) + { + System.IO.File.WriteAllBytes(FileName, mvarData); + } + + public override object Clone() + { + RIFFDataChunk clone = new RIFFDataChunk(); + clone.Data = mvarData; + clone.ID = base.ID; + return clone; + } + + public override string ToString() + { + return base.ID + " [" + mvarData.Length.ToString() + "]"; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFGroupChunk.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFGroupChunk.cs new file mode 100644 index 00000000..a4ccc1cf --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFGroupChunk.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Chunked +{ + public class RIFFGroupChunk : RIFFChunk + { + private RIFFChunkCollection mvarChunks = new RIFFChunkCollection(); + public RIFFChunkCollection Chunks { get { return mvarChunks; } } + + public override object Clone() + { + RIFFGroupChunk clone = new RIFFGroupChunk(); + clone.ID = base.ID; + foreach (RIFFChunk chunk in mvarChunks) + { + clone.Chunks.Add(chunk.Clone() as RIFFChunk); + } + return clone; + } + + public override int Size + { + get + { + int size = base.Size; + foreach (RIFFChunk chunk in mvarChunks) + { + size += chunk.Size; + } + return size; + } + } + + private string mvarTypeID = String.Empty; + public string TypeID { get { return mvarTypeID; } set { mvarTypeID = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFMetadata.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFMetadata.cs new file mode 100644 index 00000000..aa39f723 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Chunked/RIFFMetadata.cs @@ -0,0 +1,246 @@ +#if UE_CHUNKED_RIFF_INCLUDE_METADATA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Chunked +{ + public class RIFFMetadataItem + { + public class RIFFMetadataItemCollection + : System.Collections.ObjectModel.Collection + { + public RIFFMetadataItem Add(CommonMetadataType Type, object Value) + { + RIFFMetadataItem item = new RIFFMetadataItem(); + item.Type = Type; + item.Value = Value; + base.Items.Add(item); + return item; + } + public RIFFMetadataItem Add(string Name, object Value) + { + RIFFMetadataItem item = new RIFFMetadataItem(); + item.Name = Name; + item.Value = Value; + base.Items.Add(item); + return item; + } + } + + public CommonMetadataType Type + { + get + { + switch (mvarName) + { + case "AGES": return CommonMetadataType.RatingAGES; + case "CMNT": return CommonMetadataType.CommentCMNT; + case "CODE": return CommonMetadataType.EncodedByCODE; + case "COMM": return CommonMetadataType.Comments; + case "DIRC": return CommonMetadataType.Directory; + case "DISP": return CommonMetadataType.SoundSchemeTitle; + case "DTIM": return CommonMetadataType.DateTimeOriginal; + case "GENR": return CommonMetadataType.GenreGENR; + case "IARL": return CommonMetadataType.ArchivalLocation; + case "IART": return CommonMetadataType.Artist; + case "IAS1": return CommonMetadataType.FirstLanguage; + case "IAS2": return CommonMetadataType.SecondLanguage; + case "IAS3": return CommonMetadataType.ThirdLanguage; + case "IAS4": return CommonMetadataType.FourthLanguage; + case "IAS5": return CommonMetadataType.FifthLanguage; + case "IAS6": return CommonMetadataType.SixthLanguage; + case "IAS7": return CommonMetadataType.SeventhLanguage; + case "IAS8": return CommonMetadataType.EighthLanguage; + case "IAS9": return CommonMetadataType.NinthLanguage; + case "IBSU": return CommonMetadataType.BaseURL; + case "ICAS": return CommonMetadataType.DefaultAudioStream; + case "ICDS": return CommonMetadataType.CostumeDesigner; + case "ICMS": return CommonMetadataType.Commissioned; + case "ICMT": return CommonMetadataType.CommentICMT; + case "ICNM": return CommonMetadataType.Cinematographer; + case "ICNT": return CommonMetadataType.Country; + case "ICOP": return CommonMetadataType.Copyright; + case "ICRD": return CommonMetadataType.DateCreated; + case "ICRP": return CommonMetadataType.Cropped; + case "IDIM": return CommonMetadataType.Dimensions; + case "IDPI": return CommonMetadataType.DotsPerInch; + case "IDST": return CommonMetadataType.DistributedBy; + case "IEDT": return CommonMetadataType.EditedBy; + case "IENC": return CommonMetadataType.EncodedByIENC; + case "IENG": return CommonMetadataType.Engineer; + case "IGNR": return CommonMetadataType.GenreIGNR; + case "IKEY": return CommonMetadataType.Keywords; + case "ILGT": return CommonMetadataType.Lightness; + case "ILGU": return CommonMetadataType.LogoURL; + case "ILIU": return CommonMetadataType.LogoIconURL; + case "ILNG": return CommonMetadataType.LanguageILNG; + case "IMBI": return CommonMetadataType.MoreInfoBannerImage; + case "IMBU": return CommonMetadataType.MoreInfoBannerURL; + case "IMED": return CommonMetadataType.Medium; + case "IMIT": return CommonMetadataType.MoreInfoText; + case "IMIU": return CommonMetadataType.MoreInfoURL; + case "IMUS": return CommonMetadataType.MusicBy; + case "INAM": return CommonMetadataType.TitleINAM; + case "IPDS": return CommonMetadataType.ProductionDesigner; + case "IPLT": return CommonMetadataType.NumColors; + case "IPRD": return CommonMetadataType.Product; + case "IPRO": return CommonMetadataType.ProducedBy; + case "IRIP": return CommonMetadataType.RippedBy; + case "IRTD": return CommonMetadataType.RatingIRTD; + case "ISBJ": return CommonMetadataType.Subject; + case "ISFT": return CommonMetadataType.Software; + case "ISGN": return CommonMetadataType.SecondaryGenre; + case "ISHP": return CommonMetadataType.Sharpness; + case "ISRC": return CommonMetadataType.Source; + case "ISRF": return CommonMetadataType.SourceForm; + case "ISTD": return CommonMetadataType.ProductionStudio; + case "ISTR": return CommonMetadataType.StarringISTR; + case "ITCH": return CommonMetadataType.Technician; + case "IWMU": return CommonMetadataType.WatermarkURL; + case "IWRI": return CommonMetadataType.WrittenBy; + case "LANG": return CommonMetadataType.LanguageLANG; + case "LOCA": return CommonMetadataType.Location; + case "PRT1": return CommonMetadataType.Part; + case "PRT2": return CommonMetadataType.NumberOfParts; + case "RATE": return CommonMetadataType.Rate; + case "STAR": return CommonMetadataType.StarringSTAR; + case "STAT": return CommonMetadataType.Statistics; + case "TAPE": return CommonMetadataType.TapeName; + case "TCDO": return CommonMetadataType.EndTimecode; + case "TCOD": return CommonMetadataType.StartTimecode; + case "TITL": return CommonMetadataType.TitleTITL; + case "TLEN": return CommonMetadataType.Length; + case "TORG": return CommonMetadataType.Organization; + case "TRCK": return CommonMetadataType.TrackNumber; + case "TURL": return CommonMetadataType.URL; + case "TVER": return CommonMetadataType.Version; + case "VMAJ": return CommonMetadataType.VegasVersionMajor; + case "VMIN": return CommonMetadataType.VegasVersionMinor; + case "YEAR": return CommonMetadataType.Year; + #region Exif 2.3 specification + case "ecor": return CommonMetadataType.ExifMake; + case "emdl": return CommonMetadataType.ExifModel; + case "emnt": return CommonMetadataType.ExifMakerNotes; + case "erel": return CommonMetadataType.ExifRelatedImageFile; + case "etim": return CommonMetadataType.ExifTimeCreated; + case "eucm": return CommonMetadataType.ExifUserComment; + case "ever": return CommonMetadataType.ExifVersion; + #endregion + } + return CommonMetadataType.Unknown; + } + set + { + switch (value) + { + case CommonMetadataType.RatingAGES: mvarName = "AGES"; break; + case CommonMetadataType.CommentCMNT: mvarName = "CMNT"; break; + case CommonMetadataType.EncodedByCODE: mvarName = "CODE"; break; + case CommonMetadataType.Comments: mvarName = "COMM"; break; + case CommonMetadataType.Directory: mvarName = "DIRC"; break; + case CommonMetadataType.SoundSchemeTitle: mvarName = "DISP"; break; + case CommonMetadataType.DateTimeOriginal: mvarName = "DTIM"; break; + case CommonMetadataType.GenreGENR: mvarName = "GENR"; break; + case CommonMetadataType.ArchivalLocation: mvarName = "IARL"; break; + case CommonMetadataType.Artist: mvarName = "IART"; break; + case CommonMetadataType.FirstLanguage: mvarName = "IAS1"; break; + case CommonMetadataType.SecondLanguage: mvarName = "IAS2"; break; + case CommonMetadataType.ThirdLanguage: mvarName = "IAS3"; break; + case CommonMetadataType.FourthLanguage: mvarName = "IAS4"; break; + case CommonMetadataType.FifthLanguage: mvarName = "IAS5"; break; + case CommonMetadataType.SixthLanguage: mvarName = "IAS6"; break; + case CommonMetadataType.SeventhLanguage: mvarName = "IAS7"; break; + case CommonMetadataType.EighthLanguage: mvarName = "IAS8"; break; + case CommonMetadataType.NinthLanguage: mvarName = "IAS9"; break; + case CommonMetadataType.BaseURL: mvarName = "IBSU"; break; + case CommonMetadataType.DefaultAudioStream: mvarName = "ICAS"; break; + case CommonMetadataType.CostumeDesigner: mvarName = "ICDS"; break; + case CommonMetadataType.Commissioned: mvarName = "ICMS"; break; + case CommonMetadataType.CommentICMT: mvarName = "ICMT"; break; + case CommonMetadataType.Cinematographer: mvarName = "ICNM"; break; + case CommonMetadataType.Country: mvarName = "ICNT"; break; + case CommonMetadataType.Copyright: mvarName = "ICOP"; break; + case CommonMetadataType.DateCreated: mvarName = "ICRD"; break; + case CommonMetadataType.Cropped: mvarName = "ICRP"; break; + case CommonMetadataType.Dimensions: mvarName = "IDIM"; break; + case CommonMetadataType.DotsPerInch: mvarName = "IDPI"; break; + case CommonMetadataType.DistributedBy: mvarName = "IDST"; break; + case CommonMetadataType.EditedBy: mvarName = "IEDT"; break; + case CommonMetadataType.EncodedByIENC: mvarName = "IENC"; break; + case CommonMetadataType.Engineer: mvarName = "IENG"; break; + case CommonMetadataType.GenreIGNR: mvarName = "IGNR"; break; + case CommonMetadataType.Keywords: mvarName = "IKEY"; break; + case CommonMetadataType.Lightness: mvarName = "ILGT"; break; + case CommonMetadataType.LogoURL: mvarName = "ILGU"; break; + case CommonMetadataType.LogoIconURL: mvarName = "ILIU"; break; + case CommonMetadataType.LanguageILNG: mvarName = "ILNG"; break; + case CommonMetadataType.MoreInfoBannerImage: mvarName = "IMBI"; break; + case CommonMetadataType.MoreInfoBannerURL: mvarName = "IMBU"; break; + case CommonMetadataType.Medium: mvarName = "IMED"; break; + case CommonMetadataType.MoreInfoText: mvarName = "IMIT"; break; + case CommonMetadataType.MoreInfoURL: mvarName = "IMIU"; break; + case CommonMetadataType.MusicBy: mvarName = "IMUS"; break; + case CommonMetadataType.TitleINAM: mvarName = "INAM"; break; + case CommonMetadataType.ProductionDesigner: mvarName = "IPDS"; break; + case CommonMetadataType.NumColors: mvarName = "IPLT"; break; + case CommonMetadataType.Product: mvarName = "IPRD"; break; + case CommonMetadataType.ProducedBy: mvarName = "IPRO"; break; + case CommonMetadataType.RippedBy: mvarName = "IRIP"; break; + case CommonMetadataType.RatingIRTD: mvarName = "IRTD"; break; + case CommonMetadataType.Subject: mvarName = "ISBJ"; break; + case CommonMetadataType.Software: mvarName = "ISFT"; break; + case CommonMetadataType.SecondaryGenre: mvarName = "ISGN"; break; + case CommonMetadataType.Sharpness: mvarName = "ISHP"; break; + case CommonMetadataType.Source: mvarName = "ISRC"; break; + case CommonMetadataType.SourceForm: mvarName = "ISRF"; break; + case CommonMetadataType.ProductionStudio: mvarName = "ISTD"; break; + case CommonMetadataType.StarringISTR: mvarName = "ISTR"; break; + case CommonMetadataType.Technician: mvarName = "ITCH"; break; + case CommonMetadataType.WatermarkURL: mvarName = "IWMU"; break; + case CommonMetadataType.WrittenBy: mvarName = "IWRI"; break; + case CommonMetadataType.LanguageLANG: mvarName = "LANG"; break; + case CommonMetadataType.Location: mvarName = "LOCA"; break; + case CommonMetadataType.Part: mvarName = "PRT1"; break; + case CommonMetadataType.NumberOfParts: mvarName = "PRT2"; break; + case CommonMetadataType.Rate: mvarName = "RATE"; break; + case CommonMetadataType.StarringSTAR: mvarName = "STAR"; break; + case CommonMetadataType.Statistics: mvarName = "STAT"; break; + case CommonMetadataType.TapeName: mvarName = "TAPE"; break; + case CommonMetadataType.EndTimecode: mvarName = "TCDO"; break; + case CommonMetadataType.StartTimecode: mvarName = "TCOD"; break; + case CommonMetadataType.TitleTITL: mvarName = "TITL"; break; + case CommonMetadataType.Length: mvarName = "TLEN"; break; + case CommonMetadataType.Organization: mvarName = "TORG"; break; + case CommonMetadataType.TrackNumber: mvarName = "TRCK"; break; + case CommonMetadataType.URL: mvarName = "TURL"; break; + case CommonMetadataType.Version: mvarName = "TVER"; break; + case CommonMetadataType.VegasVersionMajor: mvarName = "VMAJ"; break; + case CommonMetadataType.VegasVersionMinor: mvarName = "VMIN"; break; + case CommonMetadataType.Year: mvarName = "YEAR"; break; + #region Exif 2.3 specification + case CommonMetadataType.ExifMake: mvarName = "ecor"; break; + case CommonMetadataType.ExifModel: mvarName = "emdl"; break; + case CommonMetadataType.ExifMakerNotes: mvarName = "emnt"; break; + case CommonMetadataType.ExifRelatedImageFile: mvarName = "erel"; break; + case CommonMetadataType.ExifTimeCreated: mvarName = "etim"; break; + case CommonMetadataType.ExifUserComment: mvarName = "eucm"; break; + case CommonMetadataType.ExifVersion: mvarName = "ever"; break; + #endregion + default: throw new NotImplementedException(); + } + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private object mvarValue = null; + public object Value { get { return mvarValue; } set { mvarValue = value; } } + + } +} + +#endif \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectAttribute.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectAttribute.cs new file mode 100644 index 00000000..0a319f98 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectAttribute.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.CoreObject +{ + public class CoreObjectAttribute : ICloneable + { + public class CoreObjectAttributeCollection + : System.Collections.ObjectModel.Collection + { + public CoreObjectAttribute Add(string name, string value = null) + { + CoreObjectAttribute item = new CoreObjectAttribute(name, value); + Add(item); + return item; + } + + public CoreObjectAttribute this[string name] + { + get + { + foreach (CoreObjectAttribute item in this) + { + if (item.Name == name) return item; + } + return null; + } + } + } + + public CoreObjectAttribute() + { + mvarName = String.Empty; + } + public CoreObjectAttribute(string name, params string[] values) + { + mvarName = name; + foreach (string value in values) + { + mvarValues.Add(value); + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private System.Collections.Specialized.StringCollection mvarValues = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection Values { get { return mvarValues; } } + + public object Clone() + { + CoreObjectAttribute clone = new CoreObjectAttribute(); + clone.Name = (mvarName.Clone() as string); + foreach (string value in mvarValues) + { + clone.Values.Add(value.Clone() as string); + } + return clone; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(mvarName); + if (mvarValues.Count > 0) + { + sb.Append("="); + for (int i = 0; i < mvarValues.Count; i++) + { + sb.Append(mvarValues[i]); + if (i < mvarValues.Count - 1) sb.Append(","); + } + } + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectGroup.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectGroup.cs new file mode 100644 index 00000000..85997a15 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectGroup.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.CoreObject +{ + public class CoreObjectGroup : ICloneable + { + public class CoreObjectGroupCollection + : System.Collections.ObjectModel.Collection + { + private CoreObjectGroup _parent = null; + public CoreObjectGroupCollection(CoreObjectGroup parent = null) + { + _parent = parent; + } + + public CoreObjectGroup Add(string name) + { + CoreObjectGroup item = new CoreObjectGroup(); + item.Name = name; + Add(item); + return item; + } + + private Dictionary _itemsByName = new Dictionary(); + + public CoreObjectGroup this[string name] + { + get + { + if (_itemsByName.ContainsKey(name)) return _itemsByName[name]; + return null; + } + } + + protected override void InsertItem(int index, CoreObjectGroup item) + { + base.InsertItem(index, item); + item.ParentGroup = _parent; + _itemsByName.Add(item.Name, item); + } + protected override void RemoveItem(int index) + { + this[index].ParentGroup = null; + _itemsByName.Remove(this[index].Name); + base.RemoveItem(index); + } + protected override void SetItem(int index, CoreObjectGroup item) + { + if (index > -1 && index < this.Count - 1) + { + this[index].ParentGroup = null; + _itemsByName.Remove(this[index].Name); + } + base.SetItem(index, item); + _itemsByName.Add(item.Name, item); + item.ParentGroup = _parent; + } + protected override void ClearItems() + { + foreach (CoreObjectGroup item in this) + { + item.ParentGroup = null; + } + _itemsByName.Clear(); + base.ClearItems(); + } + + } + + public CoreObjectGroup() + { + mvarGroups = new CoreObjectGroupCollection(this); + mvarProperties = new CoreObjectProperty.CoreObjectPropertyCollection(this); + } + + private CoreObjectGroup mvarParentGroup = null; + public CoreObjectGroup ParentGroup + { + get { return mvarParentGroup; } + internal set + { + mvarParentGroup = value; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private CoreObjectGroup.CoreObjectGroupCollection mvarGroups = null; + public CoreObjectGroup.CoreObjectGroupCollection Groups { get { return mvarGroups; } } + + private CoreObjectProperty.CoreObjectPropertyCollection mvarProperties = new CoreObjectProperty.CoreObjectPropertyCollection(); + public CoreObjectProperty.CoreObjectPropertyCollection Properties { get { return mvarProperties; } } + + public object Clone() + { + CoreObjectGroup clone = new CoreObjectGroup(); + clone.Name = (mvarName.Clone() as string); + foreach (CoreObjectGroup item in mvarGroups) + { + clone.Groups.Add(item.Clone() as CoreObjectGroup); + } + foreach (CoreObjectProperty item in mvarProperties) + { + clone.Properties.Add(item.Clone() as CoreObjectProperty); + } + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectObjectModel.cs new file mode 100644 index 00000000..36bdbf99 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectObjectModel.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.CoreObject +{ + public class CoreObjectObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Core Object"; + } + return _omr; + } + + private CoreObjectGroup.CoreObjectGroupCollection mvarGroups = new CoreObjectGroup.CoreObjectGroupCollection(); + public CoreObjectGroup.CoreObjectGroupCollection Groups { get { return mvarGroups; } } + + private CoreObjectProperty.CoreObjectPropertyCollection mvarProperties = new CoreObjectProperty.CoreObjectPropertyCollection(); + public CoreObjectProperty.CoreObjectPropertyCollection Properties { get { return mvarProperties; } } + + public override void Clear() + { + mvarGroups.Clear(); + mvarProperties.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + CoreObjectObjectModel clone = (where as CoreObjectObjectModel); + if (clone == null) throw new ObjectModelNotSupportedException(); + + foreach (CoreObjectGroup item in mvarGroups) + { + clone.Groups.Add(item.Clone() as CoreObjectGroup); + } + foreach (CoreObjectProperty item in mvarProperties) + { + clone.Properties.Add(item.Clone() as CoreObjectProperty); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectProperty.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectProperty.cs new file mode 100644 index 00000000..e311cbe5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/CoreObject/CoreObjectProperty.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.CoreObject +{ + public class CoreObjectProperty : ICloneable + { + public class CoreObjectPropertyCollection + : System.Collections.ObjectModel.Collection + { + private CoreObjectGroup _parent = null; + public CoreObjectPropertyCollection(CoreObjectGroup parent = null) + { + _parent = parent; + } + + public CoreObjectProperty Add(string name, string[] values = null, CoreObjectAttribute[] attributes = null) + { + CoreObjectProperty item = new CoreObjectProperty(); + item.Name = name; + if (values != null) + { + foreach (string value in values) + { + item.Values.Add(value); + } + } + if (attributes != null) + { + foreach (CoreObjectAttribute att in attributes) + { + item.Attributes.Add(att); + } + } + Add(item); + return item; + } + + public CoreObjectProperty this[string name] + { + get + { + foreach (CoreObjectProperty item in this) + { + if (item.Name == name) return item; + } + return null; + } + } + + protected override void InsertItem(int index, CoreObjectProperty item) + { + base.InsertItem(index, item); + item.ParentGroup = _parent; + } + protected override void RemoveItem(int index) + { + this[index].ParentGroup = null; + base.RemoveItem(index); + } + protected override void SetItem(int index, CoreObjectProperty item) + { + if (index > -1 && index < this.Count - 1) + { + this[index].ParentGroup = null; + } + base.SetItem(index, item); + item.ParentGroup = _parent; + } + protected override void ClearItems() + { + foreach (CoreObjectProperty item in this) + { + item.ParentGroup = null; + } + base.ClearItems(); + } + + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private CoreObjectGroup mvarParentGroup = null; + public CoreObjectGroup ParentGroup + { + get { return mvarParentGroup; } + internal set + { + mvarParentGroup = value; + } + } + + private CoreObjectAttribute.CoreObjectAttributeCollection mvarAttributes = new CoreObjectAttribute.CoreObjectAttributeCollection(); + public CoreObjectAttribute.CoreObjectAttributeCollection Attributes { get { return mvarAttributes; } } + + private System.Collections.Specialized.StringCollection mvarValues = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection Values { get { return mvarValues; } } + + public object Clone() + { + CoreObjectProperty clone = new CoreObjectProperty(); + clone.Name = (mvarName.Clone() as string); + foreach (CoreObjectAttribute item in mvarAttributes) + { + clone.Attributes.Add(item.Clone() as CoreObjectAttribute); + } + foreach (string item in mvarValues) + { + clone.Values.Add(item); + } + return clone; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(mvarName); + if (mvarAttributes.Count > 0) + { + sb.Append(";"); + for (int i = 0; i < mvarAttributes.Count; i++) + { + CoreObjectAttribute att = mvarAttributes[i]; + sb.Append(att.Name); + if (att.Values.Count > 0) + { + sb.Append("="); + for (int j = 0; j < att.Values.Count; j++) + { + sb.Append(att.Values[j]); + if (j < att.Values.Count - 1) sb.Append(','); + } + } + if (i < mvarAttributes.Count - 1) sb.Append(";"); + } + if (mvarValues.Count > 0) + { + sb.Append(":"); + for (int i = 0; i < mvarValues.Count; i++) + { + sb.Append(mvarValues[i]); + if (i < mvarValues.Count - 1) sb.Append(";"); + } + } + } + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/DataLink/DataLinkObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/DataLink/DataLinkObjectModel.cs new file mode 100644 index 00000000..0c405c21 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/DataLink/DataLinkObjectModel.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.DataLink +{ + public class DataLinkObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Data Link"; + } + return _omr; + } + + public override void Clear() + { + throw new NotImplementedException(); + } + + public override void CopyTo(ObjectModel where) + { + throw new NotImplementedException(); + } + + private string mvarProviderName = String.Empty; + /// + /// The name of the OLEDB provider to use in this data link. If no Provider is specified, + /// the OLE DB Provider for ODBC (MSDASQL) is the default value. This provides backward + /// compatibility with ODBC connection strings. + /// + public string ProviderName { get { return mvarProviderName; } set { mvarProviderName = value; } } + + private string mvarProviderVersion = null; + /// + /// The version number of the OLEDB provider to use. If unspecified, will use the version- + /// independent OLEDB provider. + /// + public string ProviderVersion { get { return mvarProviderVersion; } set { mvarProviderVersion = value; } } + + private bool mvarPersistSecurityInformation = false; + public bool PersistSecurityInformation { get { return mvarPersistSecurityInformation; } set { mvarPersistSecurityInformation = value; } } + + private string mvarDataSourceName = String.Empty; + /// + /// The name of the data source or host name of the server from which to retrieve data. + /// + public string DataSourceName { get { return mvarDataSourceName; } set { mvarDataSourceName = value; } } + + private string mvarInitialCatalog = String.Empty; + /// + /// The initial catalog or name of the database from which to retrieve data. + /// + public string InitialCatalog { get { return mvarInitialCatalog; } set { mvarInitialCatalog = value; } } + + private bool mvarUseIntegratedSecurity = false; + /// + /// Determines whether integrated security (e.g. Windows authentication) is to be used. + /// + public bool UseIntegratedSecurity { get { return mvarUseIntegratedSecurity; } set { mvarUseIntegratedSecurity = value; } } + + private PropertyList.Property.PropertyCollection mvarProperties = new PropertyList.Property.PropertyCollection(); + /// + /// Additional properties to pass into the connection string. + /// + public PropertyList.Property.PropertyCollection Properties { get { return mvarProperties; } } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/CompressedFile.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/CompressedFile.cs new file mode 100644 index 00000000..c1d3df06 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/CompressedFile.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ +#if Compression_Supported + public class CompressedFile : File + { + private Compression.CompressionMethod mvarCompressionMethod = Compression.CompressionMethod.None; + public Compression.CompressionMethod CompressionMethod { get { return mvarCompressionMethod; } set { mvarCompressionMethod = value; } } + } +#endif +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs new file mode 100644 index 00000000..dfd4ba97 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/DataRequestEvent.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public delegate void DataRequestEventHandler(object sender, DataRequestEventArgs e); + public class DataRequestEventArgs : EventArgs + { + + private byte[] mvarData = null; + [Obsolete("Please use FileSources instead of DataRequests")] + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs new file mode 100644 index 00000000..20617a28 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs @@ -0,0 +1,282 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.Accessors; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem.FileSources; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public class File : IFileSystemObject + { + public class FileCollection + : System.Collections.ObjectModel.Collection + { + public File Add(string FileName) + { + File file = new File(); + file.Name = FileName; + base.Add(file); + return file; + } + public File Add(string FileName, byte[] FileData) + { + File file = new File(); + file.Name = FileName; + file.SetData(FileData); + base.Add(file); + return file; + } + public File Add(string FileName, string SourceFileName) + { + File file = new File(); + file.Name = FileName; + file.SetData(System.IO.File.ReadAllBytes(SourceFileName)); + base.Add(file); + return file; + } + +#if ENABLE_FILESYSTEM_INHERENT_COMPRESSION + public CompressedFile Add(string FileName, byte[] FileData, Compression.CompressionMethod CompressionMethod) + { + CompressedFile file = new CompressedFile(); + file.Name = FileName; + file.SetDataAsByteArray(FileData); + file.CompressionMethod = CompressionMethod; + base.Add(file); + return file; + } + public CompressedFile Add(string FileName, string SourceFileName, Compression.CompressionMethod CompressionMethod) + { + CompressedFile file = new CompressedFile(); + file.Name = FileName; + file.SetDataAsByteArray(System.IO.File.ReadAllBytes(SourceFileName)); + file.CompressionMethod = CompressionMethod; + base.Add(file); + return file; + } +#endif + + public File this[string Name] + { + get + { + foreach (File file in this) + { + if (file.Name == Name) + { + return file; + } + } + return null; + } + } + + public bool Contains(string Name) + { + return (this[Name] != null); + } + } + + private FileAttributes mvarAttributes = FileAttributes.None; + public FileAttributes Attributes { get { return mvarAttributes; } set { mvarAttributes = value; } } + + private string mvarName = String.Empty; + /// + /// The name of this file. + /// + public string Name { get { return mvarName; } set { mvarName = value; } } + + public void SetData(byte[] data) + { + mvarSource = new MemoryFileSource(data); + } + + public byte[] GetData() + { + if (mvarSource != null) return mvarSource.GetData(); + if (DataRequest != null) + { + DataRequestEventArgs e = new DataRequestEventArgs(); + DataRequest(this, e); + return e.Data; + } + + Console.WriteLine("DataRequest: " + mvarName + ": No source associated with this file"); + return null; + } + public byte[] GetData(long offset, long length) + { + if (mvarSource != null) return mvarSource.GetData(offset, length); + + Console.WriteLine("DataRequest: " + mvarName + ": No source associated with this file"); + return null; + } + + private System.IO.Stream mvarStream = null; + public System.IO.Stream GetDataAsStream() + { + if (mvarStream == null) throw new InvalidOperationException("Data is not represented as a stream"); + return mvarStream; + } + public void SetData(System.IO.Stream stream) + { + mvarSource = new AccessorFileSource(new StreamAccessor(stream)); + } + + public void SetData(string value) + { + SetData(value, Encoding.Default); + } + public void SetData(string value, Encoding encoding) + { + SetData(encoding.GetBytes(value)); + } + + public object Clone() + { + File clone = new File(); + clone.Name = mvarName; + clone.Source = mvarSource; + foreach (KeyValuePair kvp in mvarProperties) + { + clone.Properties.Add(kvp.Key, kvp.Value); + } + return clone; + } + + public override string ToString() + { + string strSize = "*"; + try + { + byte[] data = this.GetData(); + if (data != null) + { + strSize = data.Length.ToString(); + } + } + catch + { + strSize = "?"; + } + return mvarName + " [" + strSize + "]"; + } + + public void Save() + { + Save(Name); + } + public void Save(string FileName) + { + string FileDirectory = System.IO.Path.GetDirectoryName(FileName); + if (!System.IO.Directory.Exists(FileDirectory)) + { + System.IO.Directory.CreateDirectory(FileDirectory); + } + + FileSource source = mvarSource; + long blockSize = (System.Environment.WorkingSet / 8); + long blockCount = (blockSize / source.GetLength()); + long offset = 0; + + FileAccessor fa = new FileAccessor(FileName, true, true); + fa.Open(); + for (long i = 0; i < blockCount; i++) + { + byte[] blockData = GetData(offset, blockSize); + offset += blockSize; + + fa.Writer.WriteBytes(blockData); + } + fa.Writer.Flush(); + fa.Close(); + } + + private long? mvarSize = null; + public long Size + { + get + { + if (mvarSize != null) + { + return mvarSize.Value; + } + else + { + if (mvarSource != null) + { + return mvarSource.GetLength(); + } + return 0; + } + } + set + { + mvarSize = value; + } + } + + public void ResetSize() + { + mvarSize = null; + } + + #region Metadata + private string mvarTitle = null; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDescription = null; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + #endregion + + public event DataRequestEventHandler DataRequest; + + private Dictionary mvarProperties = new Dictionary(); + public Dictionary Properties { get { return mvarProperties; } } + + private DateTime mvarModificationTimestamp = DateTime.Now; + public DateTime ModificationTimestamp { get { return mvarModificationTimestamp; } set { mvarModificationTimestamp = value; } } + + private FileSource mvarSource = null; + /// + /// Determines where this gets its data from. + /// + public FileSource Source { get { return mvarSource; } set { mvarSource = value; } } + + // The amount of working set to allocate to each block. + public const int BLOCK_FRACTION = 4; + + /// + /// Writes the entire contents of this , in blocks, to a . + /// + /// + /// The s that are applied to the output data. + /// The number of bytes written to the . + public long WriteTo(Writer bw, FileSourceTransformation[] transformations = null) + { + long count = 0; + long blockSize = (System.Environment.WorkingSet / BLOCK_FRACTION); + + long offset = 0; + double dbl = ((double)mvarSource.GetLength() / (double)blockSize); + long blockCount = (long)Math.Ceiling(dbl); + + if (transformations != null) + { + + } + + for (long i = 0; i < blockCount; i++) + { + byte[] data = mvarSource.GetData(offset, blockSize); + offset += blockSize; + + bw.WriteBytes(data); + count += data.Length; + } + bw.Flush(); + return count; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs.bak b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs.bak new file mode 100644 index 00000000..3b942479 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/File.cs.bak @@ -0,0 +1,275 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public class File : IFileSystemObject + { + public class FileCollection + : System.Collections.ObjectModel.Collection + { + public File Add(string FileName) + { + File file = new File(); + file.Name = FileName; + base.Add(file); + return file; + } + public File Add(string FileName, byte[] FileData) + { + File file = new File(); + file.Name = FileName; + file.SetDataAsByteArray(FileData); + base.Add(file); + return file; + } + public File Add(string FileName, string SourceFileName) + { + File file = new File(); + file.Name = FileName; + file.SetDataAsByteArray(System.IO.File.ReadAllBytes(SourceFileName)); + base.Add(file); + return file; + } + +#if ENABLE_FILESYSTEM_INHERENT_COMPRESSION + public CompressedFile Add(string FileName, byte[] FileData, Compression.CompressionMethod CompressionMethod) + { + CompressedFile file = new CompressedFile(); + file.Name = FileName; + file.SetDataAsByteArray(FileData); + file.CompressionMethod = CompressionMethod; + base.Add(file); + return file; + } + public CompressedFile Add(string FileName, string SourceFileName, Compression.CompressionMethod CompressionMethod) + { + CompressedFile file = new CompressedFile(); + file.Name = FileName; + file.SetDataAsByteArray(System.IO.File.ReadAllBytes(SourceFileName)); + file.CompressionMethod = CompressionMethod; + base.Add(file); + return file; + } +#endif + + public File this[string Name] + { + get + { + foreach (File file in this) + { + if (file.Name == Name) + { + return file; + } + } + return null; + } + } + + public bool Contains(string Name) + { + return (this[Name] != null); + } + } + + public event DataRequestEventHandler DataRequest; + + private FileAttributes mvarAttributes = FileAttributes.None; + public FileAttributes Attributes { get { return mvarAttributes; } set { mvarAttributes = value; } } + + private string mvarName = String.Empty; + /// + /// The name of this file. + /// + public string Name { get { return mvarName; } set { mvarName = value; } } + + private byte[] mvarData = null; + public byte[] GetDataAsByteArray() + { + if (mvarData == null && DataRequest == null) + { + // throw new InvalidOperationException("Data is not represented as a byte array and data request is not handled"); + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array and data request is not handled"); + return mvarData; + } + else if (mvarData == null && DataRequest != null) + { + DataRequestEventArgs e = new DataRequestEventArgs(); + DataRequest(this, e); + if (e.Data == null && e.Reader == null) + { + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array or Reader"); + } + else if (e.Data != null) + { + mvarData = e.Data; + } + else + { + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array; please use GetData() method"); + } + } + return mvarData; + } + public void SetDataAsByteArray(byte[] data) + { + mvarStream = null; + mvarData = data; + } + + public byte[] GetData(long offset, long length) + { + DataRequestEventArgs e = new DataRequestEventArgs(); + DataRequest(this, e); + if (e.Data != null) + { + long realLength = Math.Min(length, e.Data.Length); + byte[] data = new byte[realLength]; + Array.Copy(e.Data, 0, data, 0, realLength); + return data; + } + else if (e.Reader != null) + { + long realLength = Math.Min(length, e.Length); + e.Reader.Seek(e.Offset + offset, IO.SeekOrigin.Begin); + byte[] data = e.Reader.ReadBytes(length); + return data; + } + + Console.WriteLine("DataRequest: " + mvarName + ": Data is not represented as a byte array or Reader"); + return null; + } + + private System.IO.Stream mvarStream = null; + public System.IO.Stream GetDataAsStream() + { + if (mvarStream == null) throw new InvalidOperationException("Data is not represented as a stream"); + return mvarStream; + } + public void SetDataAsStream(System.IO.Stream stream) + { + mvarStream = stream; + mvarData = null; + } + + public string GetDataAsString() + { + return GetDataAsString(Encoding.Default); + } + public string GetDataAsString(Encoding encoding) + { + if (mvarData == null) throw new InvalidOperationException("Data is not represented as a byte array"); + return encoding.GetString(mvarData); + } + public void SetDataAsString(string value) + { + SetDataAsString(value, Encoding.Default); + } + public void SetDataAsString(string value, Encoding encoding) + { + SetDataAsByteArray(encoding.GetBytes(value)); + } + + public object Clone() + { + File clone = new File(); + clone.Name = mvarName; + clone.DataRequest = DataRequest; + if (mvarData == null && mvarStream != null) + { + clone.SetDataAsStream(mvarStream); + } + else if (mvarData != null && mvarStream == null) + { + clone.SetDataAsByteArray(GetDataAsByteArray()); + } + foreach (KeyValuePair kvp in mvarProperties) + { + clone.Properties.Add(kvp.Key, kvp.Value); + } + return clone; + } + + public override string ToString() + { + string strSize = "*"; + try + { + byte[] data = this.GetDataAsByteArray(); + if (data != null) + { + strSize = data.Length.ToString(); + } + } + catch + { + strSize = "?"; + } + return mvarName + " [" + strSize + "]"; + } + + public void Save() + { + Save(Name); + } + public void Save(string FileName) + { + string FileDirectory = System.IO.Path.GetDirectoryName(FileName); + if (!System.IO.Directory.Exists(FileDirectory)) + { + System.IO.Directory.CreateDirectory(FileDirectory); + } + System.IO.File.WriteAllBytes(FileName, GetDataAsByteArray()); + } + + private long? mvarSize = null; + public long Size + { + get + { + if (mvarSize != null) + { + return mvarSize.Value; + } + else + { + if (mvarData != null) + { + return mvarData.Length; + } + else if (mvarStream != null) + { + return mvarStream.Length; + } + return 0; + } + } + set + { + mvarSize = value; + } + } + + public void ResetSize() + { + mvarSize = null; + } + + #region Metadata + private string mvarTitle = null; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDescription = null; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + #endregion + + private Dictionary mvarProperties = new Dictionary(); + public Dictionary Properties { get { return mvarProperties; } } + + private DateTime mvarModificationTimestamp = DateTime.Now; + public DateTime ModificationTimestamp { get { return mvarModificationTimestamp; } set { mvarModificationTimestamp = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileAttributes.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileAttributes.cs new file mode 100644 index 00000000..afbca4c5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileAttributes.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + [Flags()] + public enum FileAttributes + { + None = 0, + ReadOnly = 1, + Hidden = 2, + System = 4, + Archive = 8, + Compressed = 16, + Encrypted = 32, + Deleted = 64, + Indexed = 128 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs new file mode 100644 index 00000000..75a9590c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSource.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public abstract class FileSource + { + + private FileSourceTransformation.FileSourceTransformationCollection mvarTransformations = new FileSourceTransformation.FileSourceTransformationCollection(); + public FileSourceTransformation.FileSourceTransformationCollection Transformations { get { return mvarTransformations; } } + + public byte[] GetData() { return GetData(0, GetLength()); } + + public abstract byte[] GetData(long offset, long length); + public abstract long GetLength(); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSourceTransformation.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSourceTransformation.cs new file mode 100644 index 00000000..a866526a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSourceTransformation.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public delegate void FileSourceTransformationFunction(System.IO.Stream inputStream, System.IO.Stream outputStream); + public enum FileSourceTransformationType + { + None = 0, + Input = 1, + Output = 2, + InputAndOutput = 3 + } + public class FileSourceTransformation + { + public class FileSourceTransformationCollection + : System.Collections.ObjectModel.Collection + { + + } + + private FileSourceTransformationType mvarType = FileSourceTransformationType.None; + public FileSourceTransformationType Type { get { return mvarType; } set { mvarType = value; } } + + private FileSourceTransformationFunction mvarFunction = null; + public FileSourceTransformationFunction Function { get { return mvarFunction; } set { mvarFunction = value; } } + + public FileSourceTransformation(FileSourceTransformationType type, FileSourceTransformationFunction func) + { + mvarType = type; + mvarFunction = func; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/AccessorFileSource.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/AccessorFileSource.cs new file mode 100644 index 00000000..b7362070 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/AccessorFileSource.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; + +namespace UniversalEditor.ObjectModels.FileSystem.FileSources +{ + public class AccessorFileSource : FileSource + { + private Accessor mvarAccessor = null; + public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; } } + + public AccessorFileSource(Accessor accessor) + { + mvarAccessor = accessor; + } + + public override byte[] GetData(long offset, long length) + { + mvarAccessor.Seek(offset, IO.SeekOrigin.Begin); + byte[] data = mvarAccessor.Reader.ReadBytes(length); + return data; + } + + public override long GetLength() + { + return mvarAccessor.Length; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/EmbeddedFileSource.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/EmbeddedFileSource.cs new file mode 100644 index 00000000..71bd71d1 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/EmbeddedFileSource.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.ObjectModels.FileSystem.FileSources +{ + public class EmbeddedFileSource : FileSource + { + private Reader mvarReader = null; + public Reader Reader { get { return mvarReader; } set { mvarReader = value; } } + + private long mvarOffset = 0; + public long Offset { get { return mvarOffset; } set { mvarOffset = value; } } + + private long mvarLength = 0; + public long Length { get { return mvarLength; } set { mvarLength = value; } } + + public override byte[] GetData(long offset, long length) + { + mvarReader.Seek(mvarOffset, SeekOrigin.Begin); + byte[] sourceData = mvarReader.ReadBytes(mvarLength); + + long realLength = Math.Min(length, sourceData.Length); + byte[] data = new byte[realLength]; + Array.Copy(sourceData, 0, data, 0, realLength); + return data; + } + + public override long GetLength() + { + return mvarLength; + } + + public EmbeddedFileSource(Reader reader, long offset, long length, FileSourceTransformation[] transformations = null) + { + mvarReader = reader; + mvarOffset = offset; + mvarLength = length; + + if (transformations != null) + { + foreach (FileSourceTransformation transformation in transformations) + { + base.Transformations.Add(transformation); + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs new file mode 100644 index 00000000..3af73154 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/MemoryFileSource.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem.FileSources +{ + public class MemoryFileSource : FileSource + { + private byte[] mvarData = null; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + public MemoryFileSource(byte[] data) + { + mvarData = data; + } + + public override byte[] GetData(long offset, long length) + { + long realLength = Math.Min(length, mvarData.Length); + byte[] data = new byte[realLength]; + Array.Copy(mvarData, offset, data, 0, realLength); + return data; + } + + public override long GetLength() + { + return mvarData.Length; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/PhysicalFileSource.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/PhysicalFileSource.cs new file mode 100644 index 00000000..116a6dfb --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSources/PhysicalFileSource.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem.FileSources +{ + public class PhysicalFileSource : FileSource + { + private string mvarFileName = String.Empty; + public string FileName { get { return mvarFileName; } set { mvarFileName = value; } } + + public override byte[] GetData(long offset, long length) + { + byte[] sourceData = System.IO.File.ReadAllBytes(mvarFileName); + long realLength = Math.Min(length, sourceData.Length); + byte[] data = new byte[realLength]; + Array.Copy(sourceData, offset, data, 0, realLength); + return data; + } + + public override long GetLength() + { + return (new System.IO.FileInfo(mvarFileName)).Length; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs new file mode 100644 index 00000000..5da7821c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs @@ -0,0 +1,437 @@ +using System; +using System.Collections.Generic; +using System.Text; +using UniversalEditor.Accessors; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public class FileSystemObjectModel : ObjectModel, IFileSystemContainer + { + private ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = new ObjectModelReference(GetType(), new Guid("{A23026E9-DFE1-4090-AF35-8B916D3F1FCD}")); + _omr.Title = "File system/archive"; + _omr.Path = new string[] { "General", "File system/archive" }; + } + return _omr; + } + public override void Clear() + { + mvarFiles.Clear(); + mvarFolders.Clear(); + mvarID = Guid.Empty; + mvarTitle = String.Empty; + mvarPathSeparators = new string[] { System.IO.Path.DirectorySeparatorChar.ToString(), System.IO.Path.AltDirectorySeparatorChar.ToString() }; + } + public override void CopyTo(ObjectModel where) + { + FileSystemObjectModel clone = (where as FileSystemObjectModel); + clone.ID = mvarID; + for (int i = 0; i < mvarFiles.Count; i++) + { + File file = mvarFiles[i]; + clone.Files.Add(file.Clone() as File); + } + for (int i = 0; i < mvarFolders.Count; i++) + { + Folder folder = mvarFolders[i]; + clone.Folders.Add(folder.Clone() as Folder); + } + } + + public static FileSystemObjectModel FromFiles(string[] fileNames) + { + // TODO: This doesn't work because GetAvailableObjectModel returns an + // ObjectModel but automatically closes the file after reading... deferred + // FileSystemObjectModels associated files need to remain open in order to + // read the file data. Consider using a Document-based approach which provides + // more control over closing files as needed? + + FileSystemObjectModel fsom = new FileSystemObjectModel(); + + foreach (string fileName in fileNames) + { + FileAccessor accessor = new FileAccessor(fileName); + FileSystemObjectModel fsom1 = UniversalEditor.Common.Reflection.GetAvailableObjectModel(accessor); + if (fsom1 == null) continue; + + fsom1.CopyTo(fsom); + } + return fsom; + } + public static FileSystemObjectModel FromDirectory(string path, string searchPattern = "*.*", System.IO.SearchOption searchOption = System.IO.SearchOption.TopDirectoryOnly) + { + string[] folders = System.IO.Directory.GetDirectories(path); + string[] files = System.IO.Directory.GetFiles(path); + + FileSystemObjectModel fsom = new FileSystemObjectModel(); + foreach (string folder in folders) + { + string title = System.IO.Path.GetFileName(folder); + fsom.Folders.Add(title); + } + foreach (string fileName in files) + { + string title = System.IO.Path.GetFileName(fileName); + fsom.Files.Add(title, fileName); + } + return fsom; + + // string[] files = System.IO.Directory.GetFiles(path, searchPattern, searchOption); + // return FromFiles(files); + } + + private File.FileCollection mvarFiles = new File.FileCollection(); + public File.FileCollection Files { get { return mvarFiles; } } + private Folder.FolderCollection mvarFolders = new Folder.FolderCollection(); + public Folder.FolderCollection Folders { get { return mvarFolders; } } + + private Guid mvarID = Guid.Empty; + /// + /// The unique ID associated with this file system. Not supported by all data formats. + /// + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + /// + /// The title associated with this file system. Not supported by all data formats. + /// + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string[] mvarPathSeparators = new string[] { System.IO.Path.DirectorySeparatorChar.ToString(), System.IO.Path.AltDirectorySeparatorChar.ToString() }; + public string[] PathSeparators { get { return mvarPathSeparators; } set { mvarPathSeparators = value; } } + + public bool ContainsFile(string path) + { + return (FindFile(path) != null); + } + + public File FindFile(string path) + { + string[] pathParts = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar }); + if (pathParts.Length == 1) + { + File file = mvarFiles[pathParts[0]]; + if (file != null) return file; + } + else + { + Folder parentFolder = mvarFolders[pathParts[0]]; + if (parentFolder == null) return null; + + for (int i = 1; i < pathParts.Length; i++) + { + if (i < pathParts.Length - 1) + { + parentFolder = parentFolder.Folders[pathParts[i]]; + if (parentFolder == null) return null; + } + else + { + return parentFolder.Files[pathParts[i]]; + } + } + } + return null; + } + + public Folder FindFolder(string name) + { + string[] path = name.Split(new char[] { '/' }); + Folder parent = null; + for (int i = 0; i < path.Length - 1; i++) + { + if (parent == null) + { + parent = mvarFolders[path[i]]; + } + else + { + parent = parent.Folders[path[i]]; + } + } + + if (parent == null) + { + return mvarFolders[path[path.Length - 1]]; + } + else + { + return parent.Folders[path[path.Length - 1]]; + } + } + + public object FindObject(string name) + { + string[] path = name.Split(new char[] { '/' }); + Folder parent = null; + for (int i = 0; i < path.Length - 1; i++) + { + if (parent == null) + { + parent = mvarFolders[path[i]]; + } + else + { + parent = parent.Folders[path[i]]; + } + } + + if (parent == null) + { + File file = mvarFiles[path[path.Length - 1]]; + Folder folder = mvarFolders[path[path.Length - 1]]; + if (folder == null) return file; + return folder; + } + else + { + File file = parent.Files[path[path.Length - 1]]; + Folder folder = parent.Folders[path[path.Length - 1]]; + if (folder == null) return file; + return folder; + } + } + + public Folder AddFolder(string name) + { + string[] path = name.Split(mvarPathSeparators, StringSplitOptions.None); + Folder parent = null; + for (int i = 0; i < path.Length - 1; i++) + { + if (parent == null) + { + parent = mvarFolders[path[i]]; + } + else + { + parent = parent.Folders[path[i]]; + } + if (parent == null) throw new System.IO.DirectoryNotFoundException(); + } + if (parent == null) + { + return mvarFolders.Add(path[path.Length - 1]); + } + return parent.Folders.Add(path[path.Length - 1]); + } + + /// + /// Adds a to this , building the parent directory hierarchy as appropriate. + /// + /// The full path of the to create, including any parent directories. + /// + /// + public File AddFile(string name, byte[] fileData = null) + { + string[] path = name.Split(mvarPathSeparators, StringSplitOptions.None); + Folder parent = null; + for (int i = 0; i < path.Length - 1; i++) + { + if (parent == null) + { + if (mvarFolders.Contains(path[i])) + { + parent = mvarFolders[path[i]]; + } + else + { + parent = mvarFolders.Add(path[i]); + } + } + else + { + if (parent.Folders.Contains(path[i])) + { + parent = parent.Folders[path[i]]; + } + else + { + parent = parent.Folders.Add(path[i]); + } + } + + if (parent == null) + { + throw new System.IO.DirectoryNotFoundException(); + } + } + + File file = new File(); + file.Name = path[path.Length - 1]; + if (fileData != null) + { + file.SetData(fileData); + } + if (parent == null) + { + mvarFiles.Add(file); + } + else + { + parent.Files.Add(file); + } + return file; + } + + /// + /// Gets all files in all folders of the with file names that + /// match the , and assigns the file names separated by the + /// . + /// + /// The string by which to filter the retrieved file names. + /// The string by which to separate directory and file names. + /// + public File[] GetFiles(string searchPattern = null, string pathSeparator = null) + { + if (pathSeparator == null) pathSeparator = "/"; + + List files = new List(); + for (int i = 0; i < mvarFiles.Count; i++) + { + File file = mvarFiles[i]; + if (searchPattern != null && !file.Name.Match(searchPattern)) continue; + + files.Add(file); + } + for (int i = 0; i < mvarFolders.Count; i++) + { + Folder folder = mvarFolders[i]; + GetAllFilesRecursively(folder, ref files, folder.Name, pathSeparator, searchPattern); + } + return files.ToArray(); + } + + /// + /// Gets all files in all folders of the , and assigns the file names + /// separated by the default path separator. + /// + /// + public File[] GetAllFiles(string pathSeparator = null) + { + if (pathSeparator == null) pathSeparator = "/"; + + List files = new List(); + for (int i = 0; i < mvarFiles.Count; i++) + { + File file = mvarFiles[i]; + files.Add(file); + } + for (int i = 0; i < mvarFolders.Count; i++ ) + { + Folder folder = mvarFolders[i]; + GetAllFilesRecursively(folder, ref files, folder.Name, pathSeparator); + } + return files.ToArray(); + } + + private void GetAllFilesRecursively(Folder folder, ref List files, string parentPath, string pathSeparator, string searchPattern = null) + { + for (int i = 0; i < folder.Files.Count; i++) + { + File file = folder.Files[i]; + if (searchPattern != null && !file.Name.Match(searchPattern)) continue; + + File file2 = (file.Clone() as File); + file2.Name = parentPath + pathSeparator + file.Name; + files.Add(file2); + } + for (int i = 0; i < folder.Folders.Count; i++) + { + Folder folder1 = folder.Folders[i]; + GetAllFilesRecursively(folder1, ref files, parentPath + pathSeparator + folder1.Name, pathSeparator, searchPattern); + } + } + + public IFileSystemObject[] GetAllObjects(string pathSeparator = null, System.IO.SearchOption option = System.IO.SearchOption.AllDirectories, IFileSystemObjectType objectTypes = IFileSystemObjectType.All) + { + if (pathSeparator == null) pathSeparator = "/"; + + List files = new List(); + if ((objectTypes & IFileSystemObjectType.File) == IFileSystemObjectType.File) + { + for (int i = 0; i < mvarFiles.Count; i++) + { + File file = mvarFiles[i]; + files.Add(file); + } + } + for (int i = 0; i < mvarFolders.Count; i++) + { + Folder folder = mvarFolders[i]; + if ((objectTypes & IFileSystemObjectType.Folder) == IFileSystemObjectType.Folder) + { + files.Add(folder); + } + if (option == System.IO.SearchOption.AllDirectories) GetAllObjectsRecursively(folder, ref files, folder.Name, pathSeparator, null, objectTypes); + } + return files.ToArray(); + } + + private void GetAllObjectsRecursively(Folder folder, ref List files, string parentPath, string pathSeparator, string searchPattern = null, IFileSystemObjectType objectTypes = IFileSystemObjectType.All) + { + if ((objectTypes & IFileSystemObjectType.File) == IFileSystemObjectType.File) + { + for (int i = 0; i < folder.Files.Count; i++) + { + File file = folder.Files[i]; + if (searchPattern != null && !file.Name.Match(searchPattern)) continue; + + File file2 = (file.Clone() as File); + file2.Name = parentPath + pathSeparator + file.Name; + files.Add(file2); + } + } + for (int i = 0; i < folder.Folders.Count; i++) + { + Folder folder1 = folder.Folders[i]; + if ((objectTypes & IFileSystemObjectType.Folder) == IFileSystemObjectType.Folder) + { + files.Add(folder1); + } + GetAllObjectsRecursively(folder1, ref files, parentPath + pathSeparator + folder1.Name, pathSeparator, searchPattern); + } + } + + /// + /// Gets the next available "New Folder" name for the given . + /// + /// A string "New Folder" if there are no other "New Folder"s in the given ; otherwise, a string "New Folder (n)" where N is the number of "New Folder"s in the given plus one. + public static string GetNewFolderName(IFileSystemContainer container) + { + int count = 0; + + foreach (Folder f in container.Folders) + { + if (f.Name.StartsWith("New Folder (") && f.Name.EndsWith(")")) + { + string strIntPart = f.Name.Substring("New Folder (".Length, f.Name.Length - "New Folder (".Length - 1); + int intPart = 0; + if (Int32.TryParse(strIntPart, out intPart)) + { + if (intPart > count) count = intPart; + } + } + else if (f.Name == "New Folder") + { + count++; + } + } + + if (count == 0) return "New Folder"; + return "New Folder (" + (count + 1).ToString() + ")"; + } + + /// + /// Gets the next available "New Folder" name for this . + /// + /// A string "New Folder" if there are no other "New Folder"s in this ; otherwise, a string "New Folder (n)" where N is the number of "New Folder"s in this plus one. + public string GetNewFolderName() + { + return FileSystemObjectModel.GetNewFolderName(this); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/Folder.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/Folder.cs new file mode 100644 index 00000000..a55d7579 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/Folder.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public class Folder : IFileSystemObject, IFileSystemContainer + { + public class FolderCollection + : System.Collections.ObjectModel.Collection + { + private Folder mvarParent = null; + public FolderCollection(Folder parent = null) + { + mvarParent = parent; + } + + public Folder Add(string Name) + { + Folder folder = new Folder(); + folder.Name = Name; + Add(folder); + return folder; + } + + public Folder this[string Name] + { + get + { + for (int i = 0; i < Count; i++) + { + if (this[i].Name.Equals(Name)) return this[i]; + } + return null; + } + } + + public bool Contains(string Name) + { + for (int i = 0; i < Count; i++) + { + if (this[i].Name.Equals(Name)) return true; + } + return false; + } + + public bool Remove(string Name) + { + for (int i = 0; i < Count; i++) + { + if (this[i].Name.Equals(Name)) + { + Remove(this[i]); + return true; + } + } + return false; + } + + protected override void InsertItem(int index, Folder item) + { + base.InsertItem(index, item); + item.Parent = mvarParent; + } + protected override void RemoveItem(int index) + { + this[index].Parent = null; + base.RemoveItem(index); + } + protected override void SetItem(int index, Folder item) + { + item.Parent = mvarParent; + base.SetItem(index, item); + } + } + + public Folder() + { + mvarFolders = new FolderCollection(this); + } + + private FolderCollection _parentCollection = null; + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private Folder mvarParent = null; + public Folder Parent { get { return mvarParent; } private set { mvarParent = value; } } + + private FolderCollection mvarFolders = null; + public FolderCollection Folders { get { return mvarFolders; } } + + private File.FileCollection mvarFiles = new File.FileCollection(); + public File.FileCollection Files { get { return mvarFiles; } } + + /// + /// Gets the next available "New Folder" name for this folder. + /// + /// A string "New Folder" if there are no other "New Folder"s in this folder; otherwise, a string "New Folder (n)" where N is the number of "New Folder"s in this folder plus one. + public string GetNewFolderName() + { + return FileSystemObjectModel.GetNewFolderName(this); + } + + public object Clone() + { + Folder clone = new Folder(); + for (int i = 0; i < mvarFiles.Count; i++) + { + File file = mvarFiles[i]; + clone.Files.Add(file.Clone() as File); + } + for (int i = 0; i < mvarFolders.Count; i++) + { + Folder folder = mvarFolders[i]; + clone.Folders.Add(folder.Clone() as Folder); + } + clone.Name = mvarName; + return clone; + } + + /// + /// Recursively gets the size of this and all the contained files. + /// + /// + public long GetSize() + { + long size = 0; + foreach (File file in mvarFiles) + { + size += file.Size; + } + foreach (Folder folder in mvarFolders) + { + size += folder.GetSize(); + } + return size; + } + + public File AddFile(string fileName, byte[] fileData) + { + string[] path = fileName.Split(new string[] { System.IO.Path.DirectorySeparatorChar.ToString(), System.IO.Path.AltDirectorySeparatorChar.ToString() }, StringSplitOptions.None); + Folder parent = null; + for (int i = 0; i < path.Length - 1; i++) + { + if (parent == null) + { + if (mvarFolders.Contains(path[i])) + { + parent = mvarFolders[path[i]]; + } + else + { + parent = mvarFolders.Add(path[i]); + } + } + else + { + if (parent.Folders.Contains(path[i])) + { + parent = parent.Folders[path[i]]; + } + else + { + parent = parent.Folders.Add(path[i]); + } + } + + if (parent == null) + { + throw new System.IO.DirectoryNotFoundException(); + } + } + + File file = new File(); + file.Name = path[path.Length - 1]; + if (fileData != null) file.SetData(fileData); + if (parent == null) + { + mvarFiles.Add(file); + } + else + { + parent.Files.Add(file); + } + return file; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemContainer.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemContainer.cs new file mode 100644 index 00000000..f839e674 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemContainer.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public interface IFileSystemContainer + { + File.FileCollection Files { get; } + Folder.FolderCollection Folders { get; } + string GetNewFolderName(); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObject.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObject.cs new file mode 100644 index 00000000..84a164a4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObject.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public interface IFileSystemObject + { + string Name { get; set; } + } + public class IFileSystemObjectCollection + : System.Collections.ObjectModel.Collection + { + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObjectType.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObjectType.cs new file mode 100644 index 00000000..51020029 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/IFileSystemObjectType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.FileSystem +{ + public enum IFileSystemObjectType + { + None = 0, + Folder = 1, + File = 2, + All = Folder | File + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupAttribute.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupAttribute.cs new file mode 100644 index 00000000..66b0677c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupAttribute.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupAttribute + { + public class MarkupAttributeCollection + : System.Collections.ObjectModel.Collection + { + public MarkupAttribute this[string fullName] + { + get + { + MarkupAttribute result; + foreach (MarkupAttribute att in this) + { + if (att.FullName == fullName) + { + result = att; + return result; + } + } + result = null; + return result; + } + } + public MarkupAttribute Add(string fullName) + { + return this.Add(fullName, string.Empty); + } + public MarkupAttribute Add(string fullName, string value) + { + MarkupAttribute att = new MarkupAttribute(); + att.FullName = fullName; + att.Value = value; + base.Add(att); + return att; + } + public MarkupAttribute Add(string nameSpace, string name, string value) + { + MarkupAttribute att = new MarkupAttribute(); + att.Namespace = nameSpace; + att.Name = name; + att.Value = value; + base.Add(att); + return att; + } + public bool Contains(string fullName) + { + return this[fullName] != null; + } + public bool Remove(string fullName) + { + MarkupAttribute att = this[fullName]; + bool result; + if (att != null) + { + base.Remove(att); + result = true; + } + else + { + result = false; + } + return result; + } + } + private string mvarNamespace = null; + private string mvarName = string.Empty; + private string mvarValue = string.Empty; + public string Namespace + { + get + { + return this.mvarNamespace; + } + set + { + this.mvarNamespace = value; + } + } + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public string Value + { + get + { + return this.mvarValue; + } + set + { + this.mvarValue = value; + } + } + public string FullName + { + get + { + StringBuilder sb = new StringBuilder(); + if (this.mvarNamespace != null) + { + sb.Append(this.mvarNamespace); + sb.Append(':'); + } + sb.Append(this.mvarName); + return sb.ToString(); + } + set + { + if (!string.IsNullOrEmpty(value)) + { + string[] nameParts = value.Split(new char[] + { + ':' + }, 2); + if (nameParts.Length == 1) + { + this.mvarName = nameParts[0]; + } + else + { + if (nameParts.Length == 2) + { + this.mvarNamespace = nameParts[0]; + this.mvarName = nameParts[1]; + } + } + } + } + } + public object Clone() + { + return new MarkupAttribute + { + Name = this.mvarName, + Namespace = this.mvarNamespace, + Value = this.mvarValue + }; + } + public override string ToString() + { + return this.FullName + "=\"" + this.Value + "\""; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupCommentElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupCommentElement.cs new file mode 100644 index 00000000..453dc7b8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupCommentElement.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupCommentElement : MarkupElement + { + public MarkupCommentElement() + { + } + public MarkupCommentElement(string value) + { + base.Value = value; + } + public override object Clone() + { + return new MarkupCommentElement + { + Name = base.Name, + Namespace = base.Namespace, + Value = base.Value + }; + } + public override string ToString() + { + return ""; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupContainerElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupContainerElement.cs new file mode 100644 index 00000000..fb309a0f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupContainerElement.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public abstract class MarkupContainerElement : MarkupElement + { + private MarkupElement.MarkupElementCollection mvarElements = null; + public MarkupElement.MarkupElementCollection Elements + { + get + { + return this.mvarElements; + } + } + public MarkupContainerElement() + { + this.mvarElements = new MarkupElement.MarkupElementCollection(this); + } + public MarkupElement FindElement(params string[] fullNames) + { + MarkupElement result; + if (fullNames.Length == 0) + { + result = null; + } + else + { + MarkupElement e = this.mvarElements[fullNames[0]]; + for (int i = 1; i < fullNames.Length; i++) + { + if (e != null && e is MarkupContainerElement) + { + e = (e as MarkupContainerElement).Elements[fullNames[i]]; + } + } + result = e; + } + return result; + } + public MarkupTagElement CreateElement(params string[] elementNames) + { + MarkupTagElement basetag = null; + MarkupTagElement tag = null; + for (int i = elementNames.Length - 1; i > -1; i--) + { + if (tag == null) + { + tag = new MarkupTagElement(); + tag.Name = elementNames[i]; + basetag = tag; + this.Elements.Add(tag); + } + else + { + MarkupTagElement newtag = new MarkupTagElement(); + newtag.Name = elementNames[i]; + tag.Elements.Add(newtag); + tag = newtag; + } + } + return basetag; + } + + public override void Combine(MarkupElement el) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) throw new InvalidOperationException("Cannot combine MarkupTagElement with " + el.GetType().Name); + + foreach (MarkupElement el1 in tag.Elements) + { + string id = null; + MarkupTagElement tag1 = (el1 as MarkupTagElement); + if (tag1 != null) + { + MarkupAttribute attID = tag1.Attributes["ID"]; + if (attID != null) id = attID.Value; + } + + if (Elements.Contains(el1.FullName, id)) + { + Elements[el1.FullName].Combine(el1); + } + else + { + Elements.Add(el1); + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupElement.cs new file mode 100644 index 00000000..cde3ec6d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupElement.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public abstract class MarkupElement : ICloneable + { + public class MarkupElementCollection + : System.Collections.ObjectModel.Collection + { + private MarkupContainerElement _parent = null; + public MarkupElement this[string nameSpace, string name] + { + get + { + return this[nameSpace + ":" + name]; + } + } + public MarkupElement this[string fullName] + { + get + { + MarkupElement result; + foreach (MarkupElement e in this) + { + if (e.FullName == fullName) + { + result = e; + return result; + } + } + result = null; + return result; + } + } + public MarkupElement this[string fullName, int index] + { + get + { + int i = 0; + MarkupElement result; + foreach (MarkupElement e in this) + { + if (e.FullName == fullName) + { + if (i == index) + { + result = e; + return result; + } + i++; + } + } + result = null; + return result; + } + } + public MarkupElementCollection() + : this(null) + { + } + public MarkupElementCollection(MarkupContainerElement parent) + { + this._parent = parent; + } + public new void Add(MarkupElement item) + { + item.mvarParent = this._parent; + base.Add(item); + } + public bool Contains(string fullName, string id = null) + { + MarkupElement el = this[fullName]; + MarkupTagElement tag = (el as MarkupTagElement); + bool retval = el != null; + if (id != null && tag != null) + { + MarkupAttribute attID = tag.Attributes["ID"]; + if (attID != null) retval &= (id == attID.Value); + } + return retval; + } + public bool Contains(string fullName, Type elementType) + { + if ((elementType == typeof(MarkupElement)) || (elementType.IsSubclassOf(typeof(MarkupElement)))) + { + return ((this[fullName] != null) && (this[fullName].GetType() == elementType)); + } + return false; + } + } + private string mvarName = string.Empty; + private string mvarValue = string.Empty; + private string mvarNamespace = string.Empty; + private MarkupContainerElement mvarParent = null; + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public string Value + { + get + { + return this.mvarValue; + } + set + { + this.mvarValue = value; + } + } + public string Namespace + { + get + { + return this.mvarNamespace; + } + set + { + this.mvarNamespace = value; + } + } + public string FullName + { + get + { + StringBuilder sb = new StringBuilder(); + if (!string.IsNullOrEmpty(this.mvarNamespace)) + { + sb.Append(this.mvarNamespace); + sb.Append(':'); + } + sb.Append(this.mvarName); + return sb.ToString(); + } + set + { + if (!string.IsNullOrEmpty(value)) + { + string[] nameParts = value.Split(new char[] + { + ':' + }, 2); + if (nameParts.Length == 1) + { + this.mvarName = nameParts[0]; + } + else + { + if (nameParts.Length == 2) + { + this.mvarNamespace = nameParts[0]; + this.mvarName = nameParts[1]; + } + } + } + } + } + public MarkupContainerElement Parent + { + get + { + return this.mvarParent; + } + } + + public override string ToString() + { + string result; + if (string.IsNullOrEmpty(this.mvarValue)) + { + result = "<" + this.FullName + " />"; + } + else + { + result = string.Concat(new string[] + { + "<", + this.FullName, + ">", + this.mvarValue, + "" + }); + } + return result; + } + + public abstract object Clone(); + + public virtual void Combine(MarkupElement el) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupLiteralElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupLiteralElement.cs new file mode 100644 index 00000000..457d6ee3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupLiteralElement.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupLiteralElement : MarkupElement + { + public override object Clone() + { + return new MarkupLiteralElement + { + Name = base.Name, + Namespace = base.Namespace, + Value = base.Value + }; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupObjectModel.cs new file mode 100644 index 00000000..da6c4c8b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupObjectModel.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupObjectModel : ObjectModel + { + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Markup"; + omr.Path = new string[] { "General", "Markup" }; + return omr; + } + public override void Clear() + { + this.mvarElements.Clear(); + } + + private MarkupElement.MarkupElementCollection mvarElements = new MarkupElement.MarkupElementCollection(); + public MarkupElement.MarkupElementCollection Elements + { + get + { + return this.mvarElements; + } + } + public override void CopyTo(ObjectModel destination) + { + MarkupObjectModel dest = destination as MarkupObjectModel; + if (dest != null) + { + foreach (MarkupElement el in this.mvarElements) + { + if (dest.Elements.Contains(el.FullName, el.GetType())) + { + dest.Elements[el.FullName].Combine(el); + } + else + { + dest.Elements.Add(el.Clone() as MarkupElement); + } + } + } + } + public MarkupElement FindElement(params string[] fullNames) + { + MarkupElement result; + if (fullNames.Length == 0) + { + result = null; + } + else + { + MarkupElement e = this.mvarElements[fullNames[0]]; + for (int i = 1; i < fullNames.Length; i++) + { + if (e != null && e is MarkupContainerElement) + { + e = (e as MarkupContainerElement).Elements[fullNames[i]]; + } + } + result = e; + } + return result; + } + public MarkupTagElement CreateElement(params string[] elementNames) + { + MarkupTagElement basetag = null; + MarkupTagElement tag = null; + for (int i = elementNames.Length - 1; i > -1; i--) + { + if (tag == null) + { + tag = new MarkupTagElement(); + tag.Name = elementNames[i]; + basetag = tag; + this.Elements.Add(tag); + } + else + { + MarkupTagElement newtag = new MarkupTagElement(); + newtag.Name = elementNames[i]; + tag.Elements.Add(newtag); + tag = newtag; + } + } + return basetag; + } + + public MarkupTagElement FindElementByPath(string xpath) + { + string[] XPATHParts = xpath.Split(new char[] { '/' }); + MarkupTagElement tagParent = null; + foreach (string part in XPATHParts) + { + if (String.IsNullOrEmpty(part)) continue; + string tagName = part; + int index = -1; + if (part.Contains("[") && part.EndsWith("]")) + { + string indexStr = part.Substring(part.IndexOf("[") + 1, part.Length - part.IndexOf("]")); + index = Int32.Parse(indexStr) - 1; + tagName = part.Substring(0, part.IndexOf("[")); + } + if (index > -1) + { + if (tagParent == null) + { + tagParent = (mvarElements[tagName, index] as MarkupTagElement); + if (tagParent == null) return null; + } + else + { + tagParent = (tagParent.Elements[tagName, index] as MarkupTagElement); + if (tagParent == null) return null; + } + } + else + { + if (tagParent == null) + { + tagParent = (mvarElements[part] as MarkupTagElement); + if (tagParent == null) return null; + } + else + { + tagParent = (tagParent.Elements[part] as MarkupTagElement); + if (tagParent == null) return null; + } + } + } + return tagParent; + } + + public string GetElementValue(string[] path, string defaultValue = null) + { + MarkupTagElement tag = (FindElement(path) as MarkupTagElement); + if (tag == null) return defaultValue; + return tag.Value; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupPreprocessorElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupPreprocessorElement.cs new file mode 100644 index 00000000..51f29587 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupPreprocessorElement.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupPreprocessorElement : MarkupElement + { + public MarkupPreprocessorElement() + { + } + public MarkupPreprocessorElement(string fullName, string value) + { + base.FullName = fullName; + base.Value = value; + } + public override object Clone() + { + return new MarkupPreprocessorElement + { + Name = base.Name, + Namespace = base.Namespace, + Value = base.Value + }; + } + public override string ToString() + { + return string.Concat(new string[] + { + "" + }); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupStringElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupStringElement.cs new file mode 100644 index 00000000..ced19bda --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupStringElement.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupStringElement : MarkupElement + { + public override object Clone() + { + return new MarkupStringElement + { + Name = base.Name, + Namespace = base.Namespace, + Value = base.Value + }; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupTagElement.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupTagElement.cs new file mode 100644 index 00000000..8c7ffd8f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Markup/MarkupTagElement.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Markup +{ + public class MarkupTagElement : MarkupContainerElement + { + private MarkupAttribute.MarkupAttributeCollection mvarAttributes = new MarkupAttribute.MarkupAttributeCollection(); + public MarkupAttribute.MarkupAttributeCollection Attributes + { + get + { + return this.mvarAttributes; + } + } + public override object Clone() + { + MarkupTagElement clone = new MarkupTagElement(); + foreach (MarkupElement el in base.Elements) + { + clone.Elements.Add(el.Clone() as MarkupElement); + } + foreach (MarkupAttribute att in mvarAttributes) + { + clone.Attributes.Add(att.Clone() as MarkupAttribute); + } + clone.Name = base.Name; + clone.Namespace = base.Namespace; + clone.Value = base.Value; + return clone; + } + + public MarkupAttribute FindAttribute(string Name) + { + return FindAttribute(Name, (MarkupAttribute)null); + } + public string FindAttribute(string Name, string DefaultValue) + { + MarkupAttribute att = FindAttribute(Name); + if (att == null) return DefaultValue; + return att.Value; + } + public MarkupAttribute FindAttribute(string Name, MarkupAttribute defaultValue) + { + MarkupAttribute att = mvarAttributes[Name]; + if (att == null) return defaultValue; + return att; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFile.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFile.cs new file mode 100644 index 00000000..424efef0 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFile.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.ObjectModels.Project +{ + public class ProjectFile : ICloneable + { + public class ProjectFileCollection + : System.Collections.ObjectModel.Collection + { + private ProjectFolder _parent = null; + public ProjectFileCollection(ProjectFolder parent = null) + { + _parent = parent; + } + + public ProjectFile Add(string DestinationFileName) + { + return Add(String.Empty, DestinationFileName); + } + public ProjectFile Add(string SourceFileName, string DestinationFileName) + { + ProjectFile file = new ProjectFile(); + file.SourceFileName = SourceFileName; + file.DestinationFileName = DestinationFileName; + Add(file); + return file; + } + + protected override void InsertItem(int index, ProjectFile item) + { + base.InsertItem(index, item); + item.Parent = _parent; + } + protected override void RemoveItem(int index) + { + this[index].Parent = null; + base.RemoveItem(index); + } + protected override void ClearItems() + { + foreach (ProjectFile file in this) + { + file.Parent = null; + } + base.ClearItems(); + } + } + + private string mvarSourceFileName = String.Empty; + /// + /// The file name of the project file on disk. + /// + public string SourceFileName { get { return mvarSourceFileName; } set { mvarSourceFileName = value; } } + + private string mvarDestinationFileName = String.Empty; + /// + /// The name of the project file in the project itself, which can be different from the file name of the file on disk. + /// + public string DestinationFileName { get { return mvarDestinationFileName; } set { mvarDestinationFileName = value; } } + + private PropertyListObjectModel mvarConfiguration = new PropertyListObjectModel(); + /// + /// The per-file configuration for this project file. + /// + public PropertyListObjectModel Configuration { get { return mvarConfiguration; } set { mvarConfiguration = value; } } + + private ProjectFolder mvarParent = null; + public ProjectFolder Parent { get { return mvarParent; } private set { mvarParent = value; } } + + public object Clone() + { + ProjectFile clone = new ProjectFile(); + clone.DestinationFileName = (mvarDestinationFileName.Clone() as string); + clone.SourceFileName = (mvarSourceFileName.Clone() as string); + clone.Configuration = (mvarConfiguration.Clone() as PropertyListObjectModel); + return clone; + } + + private byte[] mvarContent = new byte[0]; + public byte[] Content { get { return mvarContent; } set { mvarContent = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFileSystem.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFileSystem.cs new file mode 100644 index 00000000..ef6d34f6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFileSystem.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Project +{ + public class ProjectFileSystem + { + private ProjectFolder.ProjectFolderCollection mvarFolders = new ProjectFolder.ProjectFolderCollection(); + /// + /// The collection of folders in this project. + /// + public ProjectFolder.ProjectFolderCollection Folders { get { return mvarFolders; } } + + private ProjectFile.ProjectFileCollection mvarFiles = new ProjectFile.ProjectFileCollection(); + /// + /// The collection of files in this project. + /// + public ProjectFile.ProjectFileCollection Files { get { return mvarFiles; } } + + public void Clear() + { + mvarFolders.Clear(); + mvarFiles.Clear(); + } + public void CopyTo(ProjectFileSystem clone) + { + foreach (ProjectFile file in mvarFiles) + { + clone.Files.Add(file.Clone() as ProjectFile); + } + foreach (ProjectFolder folder in mvarFolders) + { + clone.Folders.Add(folder.Clone() as ProjectFolder); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFolder.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFolder.cs new file mode 100644 index 00000000..05164ec8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectFolder.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Project +{ + public class ProjectFolder : ICloneable + { + public class ProjectFolderCollection + : System.Collections.ObjectModel.Collection + { + private ProjectFolder _parent = null; + public ProjectFolderCollection(ProjectFolder parent = null) + { + _parent = parent; + } + + public ProjectFolder Add(string Name) + { + ProjectFolder folder = new ProjectFolder(); + folder.Name = Name; + Add(folder); + return folder; + } + + protected override void InsertItem(int index, ProjectFolder item) + { + base.InsertItem(index, item); + item.Parent = _parent; + } + protected override void RemoveItem(int index) + { + this[index].Parent = null; + base.RemoveItem(index); + } + protected override void ClearItems() + { + foreach (ProjectFolder folder in this) + { + folder.Parent = null; + } + base.ClearItems(); + } + } + + public ProjectFolder() + { + mvarFolders = new ProjectFolder.ProjectFolderCollection(this); + mvarFiles = new ProjectFile.ProjectFileCollection(this); + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private ProjectFolder mvarParent = null; + public ProjectFolder Parent { get { return mvarParent; } private set { mvarParent = value; } } + + private ProjectFolder.ProjectFolderCollection mvarFolders = null; + public ProjectFolder.ProjectFolderCollection Folders { get { return mvarFolders; } } + + private ProjectFile.ProjectFileCollection mvarFiles = null; + public ProjectFile.ProjectFileCollection Files { get { return mvarFiles; } } + + public object Clone() + { + ProjectFolder clone = new ProjectFolder(); + foreach (ProjectFile file in mvarFiles) + { + clone.Files.Add(file.Clone() as ProjectFile); + } + foreach (ProjectFolder folder in mvarFolders) + { + clone.Folders.Add(folder.Clone() as ProjectFolder); + } + clone.Name = (mvarName.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectObjectModel.cs new file mode 100644 index 00000000..998d6e80 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/ProjectObjectModel.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.ObjectModels.Project +{ + public class ProjectObjectModel : ObjectModel + { + public class ProjectObjectModelCollection + : System.Collections.ObjectModel.Collection + { + } + + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Project"; + _omr.Description = "Stores a set of related files and folders with an accompanying configuration."; + } + return _omr; + } + + public override void Clear() + { + mvarConfiguration.Clear(); + mvarFileSystem.Clear(); + mvarID = Guid.Empty; + mvarProjectType = null; + mvarReferences.Clear(); + mvarRelativeFileName = String.Empty; + mvarTitle = String.Empty; + } + + public override void CopyTo(ObjectModel where) + { + ProjectObjectModel clone = (where as ProjectObjectModel); + mvarConfiguration.CopyTo(clone.Configuration); + mvarFileSystem.CopyTo(clone.FileSystem); + clone.ID = mvarID; + clone.ProjectType = mvarProjectType; + foreach (Reference _ref in mvarReferences) + { + clone.References.Add(_ref); + } + clone.RelativeFileName = (mvarRelativeFileName.Clone() as string); + clone.Title = (mvarTitle.Clone() as string); + } + + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private PropertyListObjectModel mvarConfiguration = new PropertyListObjectModel(); + public PropertyListObjectModel Configuration { get { return mvarConfiguration; } } + + private Reference.ReferenceCollection mvarReferences = new Reference.ReferenceCollection(); + public Reference.ReferenceCollection References { get { return mvarReferences; } } + + private ProjectFileSystem mvarFileSystem = new ProjectFileSystem(); + public ProjectFileSystem FileSystem { get { return mvarFileSystem; } } + + private ProjectType mvarProjectType = null; + public ProjectType ProjectType { get { return mvarProjectType; } set { mvarProjectType = value; } } + + private string mvarRelativeFileName = String.Empty; + public string RelativeFileName { get { return mvarRelativeFileName; } set { mvarRelativeFileName = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/Reference.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/Reference.cs new file mode 100644 index 00000000..9438bbbb --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Project/Reference.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Project +{ + public class Reference + { + public class ReferenceCollection + : System.Collections.ObjectModel.Collection + { + public Reference Add(string title, string fileName, Version version, Guid id) + { + Reference refer = new Reference(); + refer.Title = title; + refer.FileName = fileName; + refer.Version = version; + refer.ID = id; + base.Add(refer); + return refer; + } + } + + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarFileName = String.Empty; + public string FileName { get { return mvarFileName; } set { mvarFileName = value; } } + + private Version mvarVersion = new Version(); + public Version Version { get { return mvarVersion; } set { mvarVersion = value; } } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append(mvarTitle); + sb.Append(", "); + sb.Append(mvarVersion.ToString()); + sb.Append(", "); + sb.Append(mvarID.ToString("B")); + sb.Append(", "); + sb.Append(mvarFileName); + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Group.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Group.cs new file mode 100644 index 00000000..79132301 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Group.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.PropertyList +{ + public class Group : ICloneable + { + public class GroupCollection : System.Collections.ObjectModel.Collection + { + private Group mvarParent = null; + public Group this[string Name] + { + get + { + Group result; + foreach (Group g in this) + { + if (g.Name == Name) + { + result = g; + return result; + } + } + result = null; + return result; + } + } + public GroupCollection() + { + this.mvarParent = null; + } + public GroupCollection(Group parent) + { + this.mvarParent = parent; + } + public Group Add(string Name) + { + Group g = new Group(); + g.Name = Name; + g.mvarParent = this.mvarParent; + base.Add(g); + return g; + } + public bool Contains(string Name) + { + return this[Name] != null; + } + public bool Remove(string Name) + { + Group g = this[Name]; + bool result; + if (g != null) + { + base.Remove(g); + result = true; + } + else + { + result = false; + } + return result; + } + + public void Append(Group grp) + { + Group parent = this[grp.Name]; + if (parent == null) + { + base.Add(grp); + } + else + { + foreach (Group grp2 in grp.Groups) + { + if (parent.Groups.Contains(grp2.Name)) + { + parent.Groups.Append(grp2); + } + else + { + parent.Groups.Add(grp2); + } + } + foreach (Property prp in grp.Properties) + { + if (parent.Properties.Contains(prp.Name)) + { + parent.Properties[prp.Name].Value = prp.Value; + } + else + { + parent.Properties.Add(prp.Name, prp.Value); + } + } + } + } + + /// + /// If a with the specified name exists within this collection, + /// returns that group. Otherwise, creates a new group with that name and returns it. + /// + /// The name of the to search for in this collection. + /// The with the given name in this collection, or if no such group exists, an empty group with the given name. + public Group AddOrRetrieve(string Name) + { + Group result; + if (this.Contains(Name)) + { + result = this[Name]; + } + else + { + result = this.Add(Name); + } + return result; + } + } + + private string mvarName = string.Empty; + /// + /// The name of this . + /// + public string Name { get { return mvarName; } set { mvarName = value; } } + + private Group mvarParent = null; + /// + /// The that contains this group as a child. + /// + public Group Parent { get { return mvarParent; } } + + private Group.GroupCollection mvarGroups = new Group.GroupCollection(); + /// + /// The children s that are contained within this group. + /// + public Group.GroupCollection Groups { get { return mvarGroups; } } + + private Property.PropertyCollection mvarProperties = null; + /// + /// The children s that are contained within this group. + /// + public Property.PropertyCollection Properties { get { return mvarProperties; } } + + public Group() : this(null, String.Empty) + { + } + public Group(Group parent) : this(parent, String.Empty) + { + } + public Group(string Name) : this(null, Name) + { + } + public Group(Group parent, string Name) + { + mvarName = Name; + mvarParent = parent; + mvarProperties = new Property.PropertyCollection(this); + mvarGroups = new Group.GroupCollection(this); + } + + public object Clone() + { + Group clone = new Group(); + foreach (Group g in this.mvarGroups) + { + clone.Groups.Add(g.Clone() as Group); + } + foreach (Property p in this.mvarProperties) + { + clone.Properties.Add(p.Clone() as Property); + } + clone.IsDefined = mvarIsDefined; + clone.CommentBefore = (mvarCommentBefore.Clone() as string); + clone.CommentAfter = (mvarCommentAfter.Clone() as string); + clone.Name = (mvarName.Clone() as string); + return clone; + } + + private bool? mvarIsEmpty = null; + public bool IsEmpty + { + get + { + if (mvarIsEmpty != null) return mvarIsEmpty.Value; + return (!(mvarGroups.Count > 0 || mvarProperties.Count > 0)); + } + set { mvarIsEmpty = value; } + } + + public void Clear() + { + mvarGroups.Clear(); + mvarProperties.Clear(); + mvarIsDefined = true; + mvarCommentBefore = String.Empty; + mvarCommentAfter = String.Empty; + mvarName = String.Empty; + ResetEmpty(); + } + public void ResetEmpty() + { + mvarIsEmpty = null; + } + + private bool mvarIsDefined = true; + public bool IsDefined { get { return mvarIsDefined; } set { mvarIsDefined = value; } } + + private string mvarCommentBefore = String.Empty; + /// + /// The comment(s) to display before the group header. + /// + public string CommentBefore { get { return mvarCommentBefore; } set { mvarCommentBefore = value; } } + + private string mvarCommentAfter = String.Empty; + /// + /// The comment(s) to display after the group header but before the first property (or + /// subgroup) within the group. + /// + public string CommentAfter { get { return mvarCommentAfter; } set { mvarCommentAfter = value; } } + + public override string ToString() + { + return mvarName + " [" + mvarGroups.Count.ToString() + " groups, " + mvarProperties.Count.ToString() + " properties]"; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Property.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Property.cs new file mode 100644 index 00000000..61fa49f4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/Property.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.PropertyList +{ + public class Property : ICloneable + { + public class PropertyCollection : System.Collections.ObjectModel.Collection + { + private Group mvarParent = null; + public Property this[string Name] + { + get + { + Property result; + foreach (Property g in this) + { + if (g.Name == Name) + { + result = g; + return result; + } + } + result = null; + return result; + } + } + public PropertyCollection() + { + this.mvarParent = null; + } + public PropertyCollection(Group parent) + { + this.mvarParent = parent; + } + public Property Add(string name) + { + return this.Add(name, null); + } + public Property Add(string name, object value) + { + return Add(name, value, PropertyValueType.Unknown); + } + public Property Add(string name, object value, PropertyValueType type) + { + Property p = new Property(); + p.Name = name; + p.Value = value; + p.mvarParent = this.mvarParent; + p.Type = type; + base.Add(p); + return p; + } + public bool Contains(string Name) + { + return this[Name] != null; + } + public bool Remove(string Name) + { + Property g = this[Name]; + bool result; + if (g != null) + { + base.Remove(g); + result = true; + } + else + { + result = false; + } + return result; + } + public void AddOrReplace(string Name, object Value) + { + if (this.Contains(Name)) + { + this[Name].Value = Value; + } + else + { + this.Add(Name, Value); + } + } + } + private string mvarName = ""; + private object mvarValue = null; + private Group mvarParent = null; + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public object Value + { + get + { + return this.mvarValue; + } + set + { + this.mvarValue = value; + } + } + public Group Parent + { + get + { + return this.mvarParent; + } + } + public object Clone() + { + return new Property + { + Name = this.mvarName, + Value = this.mvarValue + }; + } + public override string ToString() + { + return mvarName + " = \"" + mvarValue.ToString() + "\""; + } + + public Property() + { + } + public Property(string name, object value = null) + { + mvarName = name; + mvarValue = value; + } + + private PropertyValueType mvarType = PropertyValueType.Unknown; + public PropertyValueType Type { get { return mvarType; } set { mvarType = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyListObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyListObjectModel.cs new file mode 100644 index 00000000..b9f01c5c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyListObjectModel.cs @@ -0,0 +1,290 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; + +namespace UniversalEditor.ObjectModels.PropertyList +{ + public class PropertyListObjectModel : ObjectModel + { + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Property List"; + omr.Path = new string[] { "General", "Property List" }; + + return omr; + } + + private Group.GroupCollection mvarGroups = new Group.GroupCollection(); + private Property.PropertyCollection mvarProperties = new Property.PropertyCollection(); + public Group.GroupCollection Groups + { + get + { + return this.mvarGroups; + } + } + public Property.PropertyCollection Properties + { + get + { + return this.mvarProperties; + } + } + public int Count + { + get + { + return this.mvarProperties.Count + this.mvarGroups.Count; + } + } + public override void Clear() + { + this.mvarGroups.Clear(); + this.mvarProperties.Clear(); + } + public override void CopyTo(ObjectModel objectModel) + { + PropertyListObjectModel omb = objectModel as PropertyListObjectModel; + if (omb != null) + { + foreach (Group grp in mvarGroups) + { + if (omb.Groups.Contains(grp.Name)) + { + omb.Groups.Append(grp); + } + else + { + omb.Groups.Add(grp); + } + } + foreach (Property prp in mvarProperties) + { + if (omb.Properties.Contains(prp.Name)) + { + omb.Properties[prp.Name].Value = prp.Value; + } + else + { + omb.Properties.Add(prp.Name, prp.Value); + } + } + } + } + public T GetValue(string propertyName) + { + return this.GetValue(new string[] + { + propertyName + }); + } + public T GetValue(string propertyPath, char propertyPathSeparator) + { + return this.GetValue(propertyPath, new char[] + { + propertyPathSeparator + }); + } + public T GetValue(string propertyPath, char[] propertyPathSeparator) + { + return this.GetValue(propertyPath.Split(propertyPathSeparator)); + } + public T GetValue(string[] propertyPath) + { + return this.GetValue(propertyPath, default(T)); + } + public T GetValue(string propertyName, T defaultValue) + { + return this.GetValue(new string[] + { + propertyName + }, defaultValue); + } + public T GetValue(string propertyPath, char propertyPathSeparator, T defaultValue) + { + return this.GetValue(propertyPath, new char[] + { + propertyPathSeparator + }, defaultValue); + } + public T GetValue(string propertyPath, char[] propertyPathSeparator, T defaultValue) + { + return this.GetValue(propertyPath.Split(propertyPathSeparator), defaultValue); + } + public T GetValue(string[] propertyPath, T defaultValue) + { + T result; + if (propertyPath.Length == 0) + { + result = defaultValue; + } + else + { + if (propertyPath.Length == 1) + { + Property p = mvarProperties[propertyPath[0]]; + if (p != null) + { + result = (T)p.Value; + } + else + { + result = defaultValue; + } + } + else + { + Group parent = this.mvarGroups[propertyPath[0]]; + for (int i = 1; i < propertyPath.Length - 1; i++) + { + if (parent == null) + { + result = defaultValue; + return result; + } + parent = parent.Groups[propertyPath[i]]; + } + if (parent == null) + { + result = defaultValue; + } + else + { + Property p = parent.Properties[propertyPath[propertyPath.Length - 1]]; + if (p == null || p.Value == null) + { + result = defaultValue; + } + else if (p.Value.GetType() != typeof(T) && p.Value.GetType() == typeof(String)) + { + Type t = typeof(T); + MethodInfo miParse = t.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public, null, new Type[] + { + typeof(string) + }, null); + object retvalobj = miParse.Invoke(null, new object[] + { + parent.Properties[propertyPath[propertyPath.Length - 1]].Value + }); + result = (T)retvalobj; + } + else + { + try + { + result = (T)parent.Properties[propertyPath[propertyPath.Length - 1]].Value; + } + catch (NullReferenceException) + { + result = defaultValue; + } + catch (InvalidCastException) + { + Type t = typeof(T); + MethodInfo miParse = t.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public, null, new Type[] + { + typeof(string) + }, null); + object retvalobj = miParse.Invoke(null, new object[] + { + parent.Properties[propertyPath[propertyPath.Length - 1]].Value + }); + result = (T)retvalobj; + } + } + } + } + } + return result; + } + + /// + /// Finds the property with the specified name. If more than one string is specified, + /// searches for groups in hierarchy with the property name being the last in the list. + /// + /// + /// + public Property FindProperty(params string[] names) + { + Group group = null; + for (int i = 0; i < names.Length - 1; i++) + { + if (group == null) + { + group = mvarGroups[names[i]]; + } + else + { + group = group.Groups[names[i]]; + } + } + + if (group == null) + { + return mvarProperties[names[names.Length - 1]]; + } + else + { + return group.Properties[names[names.Length - 1]]; + } + } + + /// + /// Finds the property with the specified name. If more than one string is specified, + /// searches for groups in hierarchy with the property name being the last in the list. + /// If the property does not exist, it is created. + /// + /// + /// + public Property FindOrCreateProperty(string[] propertyName, T defaultValue) + { + Group group = null; + for (int i = 0; i < propertyName.Length - 1; i++) + { + if (group == null) + { + Group newgroup = mvarGroups[propertyName[i]]; + if (newgroup == null) newgroup = mvarGroups.Add(propertyName[i]); + group = newgroup; + } + else + { + Group newgroup = group.Groups[propertyName[i]]; + if (newgroup == null) newgroup = group.Groups.Add(propertyName[i]); + group = newgroup; + } + } + + if (group == null) + { + string propName = propertyName[propertyName.Length - 1]; + Property prop = mvarProperties[propName]; + if (prop == null) prop = mvarProperties.Add(propName, defaultValue); + return prop; + } + else + { + string propName = propertyName[propertyName.Length - 1]; + Property prop = group.Properties[propName]; + if (prop == null) prop = group.Properties.Add(propName, defaultValue); + return prop; + } + } + + public bool HasValue(string[] propertyName) + { + return (FindProperty(propertyName) != null); + } + + public void SetValue(string[] p, T value) + { + Property prop = FindOrCreateProperty(p, value); + prop.Value = value; + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyValueType.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyValueType.cs new file mode 100644 index 00000000..c43d3e28 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/PropertyList/PropertyValueType.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.PropertyList +{ + public enum PropertyValueType + { + Unknown = -1, + None = 0, + Binary, + Link, + String, + StringList, + ExpandedString, + DoubleWord, + QuadWord + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItem.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItem.cs new file mode 100644 index 00000000..d43743e4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItem.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.RichTextMarkup +{ + public abstract class RichTextMarkupItem : ICloneable + { + public class RichTextMarkupItemCollection + : System.Collections.ObjectModel.Collection + { + private RichTextMarkupItemGroup mvarParent = null; + public RichTextMarkupItemCollection(RichTextMarkupItemGroup parent = null) + { + mvarParent = parent; + } + + protected override void InsertItem(int index, RichTextMarkupItem item) + { + base.InsertItem(index, item); + item.Parent = mvarParent; + } + protected override void RemoveItem(int index) + { + this[index].Parent = null; + base.RemoveItem(index); + } + protected override void SetItem(int index, RichTextMarkupItem item) + { + this[index].Parent = null; + base.SetItem(index, item); + item.Parent = mvarParent; + } + protected override void ClearItems() + { + foreach (RichTextMarkupItem item in this) + { + item.Parent = null; + } + base.ClearItems(); + } + } + + public abstract object Clone(); + + public RichTextMarkupItemGroup Parent { get; set; } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemGroup.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemGroup.cs new file mode 100644 index 00000000..27a3d1a8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemGroup.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.RichTextMarkup +{ + public class RichTextMarkupItemGroup : RichTextMarkupItem + { + private RichTextMarkupItem.RichTextMarkupItemCollection mvarItems = null; + public RichTextMarkupItem.RichTextMarkupItemCollection Items { get { return mvarItems; } } + + public RichTextMarkupItemGroup(params RichTextMarkupItem[] items) + { + mvarItems = new RichTextMarkupItemCollection(this); + foreach (RichTextMarkupItem item in items) + { + mvarItems.Add(item); + } + } + + public override object Clone() + { + RichTextMarkupItemGroup clone = new RichTextMarkupItemGroup(); + foreach (RichTextMarkupItem item in mvarItems) + { + clone.Items.Add(item.Clone() as RichTextMarkupItem); + } + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemLiteral.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemLiteral.cs new file mode 100644 index 00000000..17a1efbc --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemLiteral.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.RichTextMarkup +{ + public class RichTextMarkupItemLiteral : RichTextMarkupItem + { + private string mvarContent = String.Empty; + public string Content { get { return mvarContent; } set { mvarContent = value; } } + + public RichTextMarkupItemLiteral(string content = "") + { + mvarContent = content; + } + + public override object Clone() + { + RichTextMarkupItemLiteral clone = new RichTextMarkupItemLiteral(mvarContent.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemTag.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemTag.cs new file mode 100644 index 00000000..0d44d546 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupItemTag.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.RichTextMarkup +{ + public class RichTextMarkupItemTag : RichTextMarkupItem + { + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + public RichTextMarkupItemTag(string name) + { + mvarName = name; + } + + public override object Clone() + { + RichTextMarkupItemTag clone = new RichTextMarkupItemTag(mvarName.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupObjectModel.cs new file mode 100644 index 00000000..0a1c1d25 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/RichTextMarkup/RichTextMarkupObjectModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.RichTextMarkup +{ + public class RichTextMarkupObjectModel : ObjectModel + { + private RichTextMarkupItem.RichTextMarkupItemCollection mvarItems = new RichTextMarkupItem.RichTextMarkupItemCollection(); + public RichTextMarkupItem.RichTextMarkupItemCollection Items { get { return mvarItems; } } + + public override void Clear() + { + mvarItems.Clear(); + } + public override void CopyTo(ObjectModel where) + { + RichTextMarkupObjectModel clone = (where as RichTextMarkupObjectModel); + foreach (RichTextMarkupItem item in mvarItems) + { + clone.Items.Add(item.Clone() as RichTextMarkupItem); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Certificate/CertificateObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Certificate/CertificateObjectModel.cs new file mode 100644 index 00000000..76a5fd29 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Certificate/CertificateObjectModel.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Security.Certificate +{ + public class CertificateObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Security certificate"; + _omr.Path = new string[] { "Security", "Certificate" }; + } + return _omr; + } + public override void Clear() + { + } + public override void CopyTo(ObjectModel where) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Key/RSA/RSAKeyObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Key/RSA/RSAKeyObjectModel.cs new file mode 100644 index 00000000..9c328c85 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Security/Key/RSA/RSAKeyObjectModel.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Security.Key.RSA +{ + public class RSAKeyObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "RSA cryptography key"; + _omr.Path = new string[] { "Security", "Key" }; + } + return _omr; + } + + private byte[] mvarP = new byte[0]; + public byte[] P { get { return mvarP; } set { mvarP = value; } } + private byte[] mvarQ = new byte[0]; + public byte[] Q { get { return mvarQ; } set { mvarQ = value; } } + private byte[] mvarDP = new byte[0]; + public byte[] DP { get { return mvarDP; } set { mvarDP = value; } } + private byte[] mvarDQ = new byte[0]; + public byte[] DQ { get { return mvarDQ; } set { mvarDQ = value; } } + private byte[] mvarIQ = new byte[0]; + public byte[] IQ { get { return mvarIQ; } set { mvarIQ = value; } } + private byte[] mvarD = new byte[0]; + public byte[] D { get { return mvarD; } set { mvarD = value; } } + + private int mvarBitLength = 0; + /// + /// The bit length of the private key components. + /// + public int BitLength { get { return mvarBitLength; } set { mvarBitLength = value; } } + + private uint mvarPublicExponent = 0; + /// + /// The exponent of the public key. + /// + public uint PublicExponent { get { return mvarPublicExponent; } set { mvarPublicExponent = value; } } + + private byte[] mvarModulus = new byte[0]; + /// + /// The RSA modulus. + /// + public byte[] Modulus { get { return mvarModulus; } set { mvarModulus = value; } } + + public override void Clear() + { + mvarBitLength = 0; + mvarD = new byte[0]; + mvarDP = new byte[0]; + mvarDQ = new byte[0]; + mvarIQ = new byte[0]; + mvarModulus = new byte[0]; + mvarP = new byte[0]; + mvarPublicExponent = 0; + mvarQ = new byte[0]; + } + + public override void CopyTo(ObjectModel where) + { + RSAKeyObjectModel clone = (where as RSAKeyObjectModel); + if (clone == null) throw new ObjectModelNotSupportedException(); + + clone.BitLength = mvarBitLength; + clone.D = mvarD; + clone.DP = mvarDP; + clone.DQ = mvarDQ; + clone.IQ = mvarIQ; + clone.Modulus = mvarModulus; + clone.P = mvarP; + clone.PublicExponent = mvarPublicExponent; + clone.Q = mvarQ; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs new file mode 100644 index 00000000..99cef246 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Shortcut/ShortcutObjectModel.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Shortcut +{ + public class ShortcutObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Shortcut"; + _omr.Description = "Allows the user to find a file or resource located in a different directory or folder from the place where the shortcut is located."; + _omr.Path = new string[] { "General", "Shortcut" }; + } + return _omr; + } + + public override void Clear() + { + mvarComment = String.Empty; + mvarExecutableArguments.Clear(); + mvarExecutableFileName = String.Empty; + mvarIconFileName = String.Empty; + mvarRunInTerminal = false; + mvarWorkingDirectory = String.Empty; + } + + public override void CopyTo(ObjectModel where) + { + ShortcutObjectModel shortcut = (where as ShortcutObjectModel); + shortcut.Comment = (mvarComment.Clone() as string); + foreach (string s in mvarExecutableArguments) + { + shortcut.ExecutableArguments.Add(s.Clone() as string); + } + shortcut.ExecutableFileName = (mvarExecutableFileName.Clone() as string); + shortcut.IconFileName = (mvarIconFileName.Clone() as string); + shortcut.RunInTerminal = mvarRunInTerminal; + shortcut.WorkingDirectory = (mvarWorkingDirectory.Clone() as string); + } + + private string mvarComment = String.Empty; + /// + /// Tooltip for the entry, for example "View sites on the Internet". The value should not + /// be redundant with the shortcut title. + /// + public string Comment { get { return mvarComment; } set { mvarComment = value; } } + + private string mvarIconFileName = String.Empty; + /// + /// File name or known icon name of the icon to display in the file manager, menus, etc. + /// + public string IconFileName { get { return mvarIconFileName; } set { mvarIconFileName = value; } } + + private string mvarExecutableFileName = String.Empty; + public string ExecutableFileName { get { return mvarExecutableFileName; } set { mvarExecutableFileName = value; } } + + private System.Collections.Specialized.StringCollection mvarExecutableArguments = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection ExecutableArguments { get { return mvarExecutableArguments; } } + + private string mvarWorkingDirectory = String.Empty; + /// + /// The directory in which to run the program, if different than the program's location. + /// + public string WorkingDirectory { get { return mvarWorkingDirectory; } set { mvarWorkingDirectory = value; } } + + private bool mvarRunInTerminal = false; + /// + /// Whether the program runs in a terminal window. + /// + public bool RunInTerminal { get { return mvarRunInTerminal; } set { mvarRunInTerminal = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Solution/SolutionObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Solution/SolutionObjectModel.cs new file mode 100644 index 00000000..e960d16b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Solution/SolutionObjectModel.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Project; + +namespace UniversalEditor.ObjectModels.Solution +{ + public class SolutionObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Solution"; + } + return _omr; + } + + public override void Clear() + { + mvarConfiguration.Clear(); + mvarProjects.Clear(); + mvarTitle = String.Empty; + } + + public override void CopyTo(ObjectModel where) + { + SolutionObjectModel solution = (where as SolutionObjectModel); + solution.Title = (mvarTitle.Clone() as string); + foreach (ProjectObjectModel project in mvarProjects) + { + solution.Projects.Add(project); + } + mvarConfiguration.CopyTo(solution.Configuration); + } + + private ProjectObjectModel.ProjectObjectModelCollection mvarProjects = new ProjectObjectModel.ProjectObjectModelCollection(); + public ProjectObjectModel.ProjectObjectModelCollection Projects { get { return mvarProjects; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private PropertyList.PropertyListObjectModel mvarConfiguration = new PropertyList.PropertyListObjectModel(); + public PropertyList.PropertyListObjectModel Configuration { get { return mvarConfiguration; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFont.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFont.cs new file mode 100644 index 00000000..125f7bd5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFont.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public class FormattedTextFont : ICloneable + { + public class FormattedTextFontCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private FormattedTextFontFamily mvarFamily = FormattedTextFontFamily.None; + public FormattedTextFontFamily Family { get { return mvarFamily; } set { mvarFamily = value; } } + + public object Clone() + { + FormattedTextFont clone = new FormattedTextFont(); + clone.Name = (mvarName.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFontFamily.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFontFamily.cs new file mode 100644 index 00000000..d11cdb46 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextFontFamily.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public enum FormattedTextFontFamily + { + /// + /// Unknown or default fonts + /// + None = 0, + /// + /// Roman, proportionally spaced serif fonts (e.g. Times New Roman, Palatino) + /// + Roman = 1, + /// + /// Swiss, proportionally spaced sans serif fonts (e.g. Arial) + /// + Swiss = 2, + /// + /// Fixed-pitch serif and sans serif fonts (e.g. Courier New, Pica) + /// + Modern = 3, + /// + /// Script fonts (e.g. Cursive) + /// + Script = 4, + /// + /// Decorative fonts (e.g. Old English, ITC Zapf Chancery) + /// + Decor = 5, + /// + /// Technical, symbol, and mathematical fonts (e.g. Symbol) + /// + Tech = 6, + /// + /// Arabic, Hebrew, or other bidirectional font (e.g. Miriam) + /// + Bidi = 7 + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextItem.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextItem.cs new file mode 100644 index 00000000..5257f573 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextItem.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public abstract class FormattedTextItem : ICloneable + { + public class FormattedTextItemCollection + : System.Collections.ObjectModel.Collection + { + + } + + private FormattedTextStyleGroup mvarBaseStyleGroup = null; + public FormattedTextStyleGroup BaseStyleGroup { get { return mvarBaseStyleGroup; } set { mvarBaseStyleGroup = value; } } + + private FormattedTextStyle.TextStyleCollection mvarStyles = new FormattedTextStyle.TextStyleCollection(); + public FormattedTextStyle.TextStyleCollection Styles { get { return mvarStyles; } } + + private string mvarText = String.Empty; + public string Text { get { return mvarText; } set { mvarText = value; } } + + public abstract object Clone(); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextObjectModel.cs new file mode 100644 index 00000000..1c459594 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextObjectModel.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public class FormattedTextObjectModel : ObjectModel, IFormattedTextItemParent + { + private ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Formatted Text Document"; + _omr.Path = new string[] { "General", "Text", "Formatted" }; + } + return _omr; + } + + private FormattedTextFont mvarDefaultFont = null; + public FormattedTextFont DefaultFont { get { return mvarDefaultFont; } set { mvarDefaultFont = value; } } + + private FormattedTextFont.FormattedTextFontCollection mvarFonts = new FormattedTextFont.FormattedTextFontCollection(); + public FormattedTextFont.FormattedTextFontCollection Fonts { get { return mvarFonts; } } + + private FormattedTextItem.FormattedTextItemCollection mvarItems = new FormattedTextItem.FormattedTextItemCollection(); + public FormattedTextItem.FormattedTextItemCollection Items { get { return mvarItems; } } + + public override void Clear() + { + mvarFonts.Clear(); + mvarItems.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + FormattedTextObjectModel clone = (where as FormattedTextObjectModel); + foreach (FormattedTextFont font in mvarFonts) + { + clone.Fonts.Add(font.Clone() as FormattedTextFont); + } + foreach (FormattedTextItem item in mvarItems) + { + clone.Items.Add(item.Clone() as FormattedTextItem); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyle.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyle.cs new file mode 100644 index 00000000..7b157e9e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyle.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public class FormattedTextStyle + { + public class TextStyleCollection + : System.Collections.ObjectModel.Collection + { + + } + + public object Clone() + { + FormattedTextStyle clone = new FormattedTextStyle(); + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyleGroup.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyleGroup.cs new file mode 100644 index 00000000..606efa1c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/FormattedTextStyleGroup.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public class FormattedTextStyleGroup + { + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private FormattedTextStyle.TextStyleCollection mvarStyles = new FormattedTextStyle.TextStyleCollection(); + public FormattedTextStyle.TextStyleCollection Styles { get { return mvarStyles; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/IFormattedTextItemParent.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/IFormattedTextItemParent.cs new file mode 100644 index 00000000..6377ca01 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/IFormattedTextItemParent.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted +{ + public interface IFormattedTextItemParent + { + FormattedTextItem.FormattedTextItemCollection Items { get; } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemBold.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemBold.cs new file mode 100644 index 00000000..fe32dbf5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemBold.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted.Items +{ + public class FormattedTextItemBold : FormattedTextItemContainer + { + public override object Clone() + { + FormattedTextItemBold clone = new FormattedTextItemBold(); + foreach (FormattedTextItem item in Items) + { + clone.Items.Add(item.Clone() as FormattedTextItem); + } + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemContainer.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemContainer.cs new file mode 100644 index 00000000..1860cf55 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemContainer.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted.Items +{ + public abstract class FormattedTextItemContainer : FormattedTextItem, IFormattedTextItemParent + { + private FormattedTextItem.FormattedTextItemCollection mvarItems = new FormattedTextItemCollection(); + public FormattedTextItem.FormattedTextItemCollection Items { get { return mvarItems; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemFontSize.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemFontSize.cs new file mode 100644 index 00000000..66d17556 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemFontSize.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted.Items +{ + public class FormattedTextItemFontSize : FormattedTextItemContainer + { + private int mvarValue = 0; + public int Value { get { return mvarValue; } set { mvarValue = value; } } + + public FormattedTextItemFontSize(int value = 0, params FormattedTextItem[] items) + { + mvarValue = value; + foreach (FormattedTextItem item in items) + { + base.Items.Add(item); + } + } + + public override object Clone() + { + FormattedTextItemFontSize clone = new FormattedTextItemFontSize(); + clone.Value = mvarValue; + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemHyperlink.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemHyperlink.cs new file mode 100644 index 00000000..a0fb2cec --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemHyperlink.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted.Items +{ + public class FormattedTextItemHyperlink : FormattedTextItemContainer + { + private string mvarTargetURL = String.Empty; + public string TargetURL { get { return mvarTargetURL; } set { mvarTargetURL = value; } } + + public FormattedTextItemHyperlink(string targetURL = "", string title = "") + { + mvarTargetURL = targetURL; + base.Items.Add(new FormattedTextItemLiteral(title)); + } + + public override object Clone() + { + FormattedTextItemHyperlink clone = new FormattedTextItemHyperlink(); + clone.TargetURL = (mvarTargetURL.Clone() as string); + foreach (FormattedTextItem item in Items) + { + clone.Items.Add(item.Clone() as FormattedTextItem); + } + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemLiteral.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemLiteral.cs new file mode 100644 index 00000000..35202b7e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemLiteral.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted.Items +{ + public class FormattedTextItemLiteral : FormattedTextItem + { + private string mvarText = String.Empty; + public string Text { get { return mvarText; } set { mvarText = value; } } + + public FormattedTextItemLiteral() + { + } + public FormattedTextItemLiteral(string text) + { + mvarText = text; + } + + public override object Clone() + { + FormattedTextItemLiteral clone = new FormattedTextItemLiteral(); + clone.Text = (mvarText.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemParagraph.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemParagraph.cs new file mode 100644 index 00000000..9b1704ac --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Formatted/Items/FormattedTextItemParagraph.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Formatted.Items +{ + public class FormattedTextItemParagraph : FormattedTextItemContainer + { + public override object Clone() + { + FormattedTextItemParagraph clone = new FormattedTextItemParagraph(); + foreach (FormattedTextItem item in Items) + { + clone.Items.Add(item.Clone() as FormattedTextItem); + } + return clone; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs new file mode 100644 index 00000000..61ad463f --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.ObjectModels.Text.Plain +{ + public class PlainTextObjectModel : ObjectModel + { + private ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Text Document"; + _omr.Path = new string[] { "General", "Text", "Plain" }; + } + return _omr; + } + + public override void Clear() + { + mvarText = String.Empty; + mvarLines.Clear(); + } + public override void CopyTo(ObjectModel where) + { + if (where is PlainTextObjectModel) + { + (where as PlainTextObjectModel).Text = mvarText; + return; + } + throw new InvalidCastException(); + } + + private System.Collections.Specialized.StringCollection mvarLines = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection Lines { get { return mvarLines; } } + + private string mvarText = String.Empty; + public string Text { get { return mvarText; } set { mvarText = value; RebuildLines(); } } + + private string mvarLineTerminator = System.Environment.NewLine; + public string LineTerminator { get { return mvarLineTerminator; } set { mvarLineTerminator = value; RebuildLines(); } } + + private void RebuildLines() + { + mvarLines.Clear(); + string[] splittt = mvarText.Split(new string[] { mvarLineTerminator }, StringSplitOptions.None); + foreach (string splitt in splittt) + { + mvarLines.Add(splitt); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/UEPackage/UEPackageObjectModel.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/UEPackage/UEPackageObjectModel.cs new file mode 100644 index 00000000..c45e4ec6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ObjectModels/UEPackage/UEPackageObjectModel.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UEPackage +{ + public class UEPackageObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Universal Editor Package"; + _omr.Path = new string[] { "Extensibility" }; + } + return _omr; + } + + private Association.AssociationCollection mvarAssociations = new Association.AssociationCollection(); + /// + /// The s provided by this package. + /// + public Association.AssociationCollection Associations { get { return mvarAssociations; } } + + private ObjectModelReference.ObjectModelReferenceCollection mvarObjectModels = new ObjectModelReference.ObjectModelReferenceCollection(); + /// + /// The s provided by this package. + /// + public ObjectModelReference.ObjectModelReferenceCollection ObjectModels { get { return mvarObjectModels; } } + + private DataFormatReference.DataFormatReferenceCollection mvarDataFormats = new DataFormatReference.DataFormatReferenceCollection(); + /// + /// The s provided by this package. + /// + public DataFormatReference.DataFormatReferenceCollection DataFormats { get { return mvarDataFormats; } } + + private ProjectType.ProjectTypeCollection mvarProjectTypes = new ProjectType.ProjectTypeCollection(); + /// + /// The s provided by this package. + /// + public ProjectType.ProjectTypeCollection ProjectTypes { get { return mvarProjectTypes; } } + + private DocumentTemplate.DocumentTemplateCollection mvarDocumentTemplates = new DocumentTemplate.DocumentTemplateCollection(); + public DocumentTemplate.DocumentTemplateCollection DocumentTemplates { get { return mvarDocumentTemplates; } } + + private ProjectTemplate.ProjectTemplateCollection mvarProjectTemplates = new ProjectTemplate.ProjectTemplateCollection(); + public ProjectTemplate.ProjectTemplateCollection ProjectTemplates { get { return mvarProjectTemplates; } } + + public override void Clear() + { + mvarAssociations.Clear(); + mvarDataFormats.Clear(); + mvarObjectModels.Clear(); + mvarProjectTypes.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTask.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTask.cs new file mode 100644 index 00000000..4d8e82f9 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTask.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor +{ + public class ProjectTask + { + public class ProjectTaskCollection + : System.Collections.ObjectModel.Collection + { + + } + + public event EventHandler TaskStarted; + public event ProjectTaskEventHandler TaskCompleted; + public event ProjectTaskEventHandler TaskFailed; + public event ProgressEventHandler TaskProgress; + + protected virtual void OnTaskStarted(EventArgs e) + { + if (TaskStarted != null) TaskStarted(this, e); + } + protected virtual void OnTaskCompleted(ProjectTaskEventArgs e) + { + if (TaskCompleted != null) TaskCompleted(this, e); + } + protected virtual void OnTaskFailed(ProjectTaskEventArgs e) + { + if (TaskFailed != null) TaskFailed(this, e); + } + protected virtual void OnTaskProgress(ProgressEventArgs e) + { + if (TaskProgress != null) TaskProgress(this, e); + } + + private ProjectTaskAction.ProjectTaskActionCollection mvarActions = new ProjectTaskAction.ProjectTaskActionCollection(); + public ProjectTaskAction.ProjectTaskActionCollection Actions { get { return mvarActions; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + public void Execute() + { + OnTaskStarted(EventArgs.Empty); + + ExpandedStringVariableStore variables = new ExpandedStringVariableStore(); + ExpandedStringVariable varr = new ExpandedStringVariable(); + varr.ID = "CompilerExecutablePath"; + varr.Value = @"C:\Applications\MinGW\bin\gcc.exe"; + variables.Variables[ExpandedStringSegmentVariableScope.Global, "CompilerExecutablePath"] = varr; + + varr = new ExpandedStringVariable(); + varr.ID = "OutputFileName"; + varr.Value = @"C:\Temp\ProjectOutput.exe"; + variables.Variables[ExpandedStringSegmentVariableScope.Project, "OutputFileName"] = varr; + + for (int i = 0; i < mvarActions.Count; i++) + { + try + { + mvarActions[i].Execute(variables); + } + catch (Exception ex) + { + OnTaskFailed(new ProjectTaskEventArgs(ex.Message)); + return; + } + + OnTaskProgress(new ProgressEventArgs(i, mvarActions.Count, mvarActions[i].Title)); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskAction.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskAction.cs new file mode 100644 index 00000000..a21703c2 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskAction.cs @@ -0,0 +1,102 @@ + using System; +using System.Collections.Generic; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor +{ + public abstract class ProjectTaskAction : References + { + public abstract string Title { get; } + protected abstract void ExecuteInternal(ExpandedStringVariableStore variables); + + public void Execute(ExpandedStringVariableStore variables) + { + ExecuteInternal(variables); + } + + public class ProjectTaskActionCollection + : System.Collections.ObjectModel.Collection + { + + } + + public ProjectTaskActionReference MakeReference() + { + return MakeReferenceInternal(); + } + protected virtual ProjectTaskActionReference MakeReferenceInternal() + { + return new ProjectTaskActionReference(GetType()); + } + + public void LoadFromMarkup(MarkupTagElement tag) + { + if (tag == null) return; + if (tag.FullName != "Action") return; + LoadFromMarkupInternal(tag); + } + protected abstract void LoadFromMarkupInternal(MarkupTagElement tag); + } + public class ProjectTaskActionReference : ReferencedBy + { + private Guid mvarProjectTaskActionTypeID = Guid.Empty; + public Guid ProjectTaskActionTypeID { get { return mvarProjectTaskActionTypeID; } set { mvarProjectTaskActionTypeID = value; } } + + private string mvarProjectTaskActionTypeName = String.Empty; + public string ProjectTaskActionTypeName { get { return mvarProjectTaskActionTypeName; } set { mvarProjectTaskActionTypeName = value; } } + + private Type mvarProjectTaskActionType = null; + public ProjectTaskActionReference(Type type) + { + mvarProjectTaskActionType = type; + mvarProjectTaskActionTypeName = type.FullName; + } + public ProjectTaskActionReference(Guid id) + { + mvarProjectTaskActionTypeID = id; + } + public ProjectTaskActionReference(string typeName) + { + mvarProjectTaskActionTypeName = typeName; + } + public ProjectTaskAction Create() + { + if (mvarProjectTaskActionType != null) + { + return (ProjectTaskAction)mvarProjectTaskActionType.Assembly.CreateInstance(mvarProjectTaskActionType.FullName); + } + return null; + } + + public string[] GetDetails() + { + throw new NotImplementedException(); + } + + public bool ShouldFilterObject(string filter) + { + throw new NotImplementedException(); + } + + private static Dictionary _dict = null; + + public static ProjectTaskActionReference GetByTypeID(Guid id) + { + if (_dict == null) + { + _dict = new Dictionary(); + Type[] types = Common.Reflection.GetAvailableTypes(); + foreach (Type type in types) + { + if (!type.IsAbstract && type.IsSubclassOf(typeof(ProjectTaskAction))) + { + ProjectTaskAction action = (ProjectTaskAction)type.Assembly.CreateInstance(type.FullName); + ProjectTaskActionReference actionref = action.MakeReference(); + _dict[actionref.ProjectTaskActionTypeID] = actionref; + } + } + } + return _dict[id]; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionConvert.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionConvert.cs new file mode 100644 index 00000000..2f484619 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionConvert.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.ObjectModels.Project; + +namespace UniversalEditor.ProjectTaskActions +{ + /// + /// Converts an from an input to an + /// output . + /// + public class ProjectTaskActionConvert : ProjectTaskAction + { + private DataFormatReference mvarInputDataFormatReference = null; + /// + /// The that specifies a + /// compatible with the of the specified + /// . + /// + public DataFormatReference InputDataFormatReference { get { return mvarInputDataFormatReference; } set { mvarInputDataFormatReference = value; } } + + private DataFormatReference mvarOutputDataFormatReference = null; + /// + /// The that specifies a + /// compatible with the of the specified + /// . + /// + public DataFormatReference OutputDataFormatReference { get { return mvarOutputDataFormatReference; } set { mvarOutputDataFormatReference = value; } } + + private ProjectFile mvarProjectFile = null; + /// + /// The to be converted upon project build. + /// + public ProjectFile ProjectFile { get { return mvarProjectFile; } set { mvarProjectFile = value; } } + + private static ProjectTaskActionReference _ptar = null; + protected override ProjectTaskActionReference MakeReferenceInternal() + { + if (_ptar == null) + { + _ptar = base.MakeReferenceInternal(); + _ptar.ProjectTaskActionTypeID = new Guid("{0EB3C0A9-804A-433F-BDD8-888D0CA8C760}"); + _ptar.ProjectTaskActionTypeName = "UniversalEditor.ProjectTaskActionConvert"; + } + return _ptar; + } + + public override string Title + { + get { return "Convert: "; } + } + protected override void ExecuteInternal(ExpandedStringVariableStore variables) + { + } + protected override void LoadFromMarkupInternal(MarkupTagElement tag) + { + MarkupTagElement tagInputDataFormatReference = (tag.Elements["InputDataFormatReference"] as MarkupTagElement); + if (tagInputDataFormatReference != null) + { + MarkupAttribute attTypeName = tagInputDataFormatReference.Attributes["TypeName"]; + MarkupAttribute attTypeID = tagInputDataFormatReference.Attributes["TypeID"]; + if (attTypeName == null && attTypeID == null) throw new ArgumentNullException("Must specify at least one of 'TypeName' or 'TypeID'"); + + + } + MarkupTagElement tagOutputDataFormatReference = (tag.Elements["OutputDataFormatReference"] as MarkupTagElement); + if (tagOutputDataFormatReference != null) + { + MarkupAttribute attTypeName = tagOutputDataFormatReference.Attributes["TypeName"]; + MarkupAttribute attTypeID = tagOutputDataFormatReference.Attributes["TypeID"]; + if (attTypeName == null && attTypeID == null) throw new ArgumentNullException("Must specify at least one of 'TypeName' or 'TypeID'"); + + + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionExecute.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionExecute.cs new file mode 100644 index 00000000..934e7b21 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionExecute.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor.ProjectTaskActions +{ + public class ProjectTaskActionExecute : ProjectTaskAction + { + public override string Title + { + get { return "Execute: " + mvarCommandLine.ToString(); } + } + + private static ProjectTaskActionReference _ptar = null; + protected override ProjectTaskActionReference MakeReferenceInternal() + { + if (_ptar == null) + { + _ptar = base.MakeReferenceInternal(); + _ptar.ProjectTaskActionTypeID = new Guid("{EE505E05-F125-4718-BA0A-879C72B5125A}"); + _ptar.ProjectTaskActionTypeName = "UniversalEditor.ProjectTaskActionExecute"; + } + return _ptar; + } + + private ExpandedString mvarCommandLine = ExpandedString.Empty; + public ExpandedString CommandLine + { + get { return mvarCommandLine; } + set + { + if (value == null) + { + mvarCommandLine = ExpandedString.Empty; + return; + } + mvarCommandLine = value; + } + } + + protected override void ExecuteInternal(ExpandedStringVariableStore variables) + { + string fileNameWithArguments = mvarCommandLine.ToString(variables); + if (String.IsNullOrEmpty(fileNameWithArguments)) return; + + string[] fileNameArgumentsSplit = fileNameWithArguments.Split(new char[] { ' ' }, "\"", StringSplitOptions.None, 2); + string fileName = fileNameArgumentsSplit[0]; + string arguments = fileNameArgumentsSplit[1]; + + if (!System.IO.File.Exists(fileName)) throw new System.IO.FileNotFoundException(fileName); + + System.Diagnostics.Process p = new System.Diagnostics.Process(); + p.StartInfo = new System.Diagnostics.ProcessStartInfo(fileName, arguments); + p.StartInfo.UseShellExecute = false; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.RedirectStandardError = true; + p.StartInfo.RedirectStandardOutput = true; + p.Start(); + p.WaitForExit(); + + string error = p.StandardError.ReadToEnd(); + string output = p.StandardOutput.ReadToEnd(); + + if (!String.IsNullOrEmpty(error)) + { + throw new Exception(error); + } + } + + protected override void LoadFromMarkupInternal(MarkupTagElement tag) + { + MarkupTagElement tagCommandLine = (tag.Elements["CommandLine"] as MarkupTagElement); + if (tagCommandLine != null) + { + mvarCommandLine = ExpandedString.FromMarkup(tagCommandLine); + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionPackage.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionPackage.cs new file mode 100644 index 00000000..f740d1f5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskActions/ProjectTaskActionPackage.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor.ProjectTaskActions +{ + public class ProjectTaskActionPackage : ProjectTaskAction + { + private DataFormatReference mvarDataFormatReference = null; + /// + /// The that specifies a compatible with the + /// in which to package the + /// project files. + /// + public DataFormatReference DataFormatReference { get { return mvarDataFormatReference; } } + + private static ProjectTaskActionReference _ptar = null; + protected override ProjectTaskActionReference MakeReferenceInternal() + { + if (_ptar == null) + { + _ptar = base.MakeReferenceInternal(); + _ptar.ProjectTaskActionTypeID = new Guid("{527B7B07-FB0E-46F2-9EA8-0E93E3B21A14}"); + _ptar.ProjectTaskActionTypeName = "UniversalEditor.ProjectTaskActionPackage"; + } + return _ptar; + } + + private ExpandedString mvarOutputFileName = null; + public ExpandedString OutputFileName { get { return mvarOutputFileName; } set { mvarOutputFileName = value; } } + + public override string Title + { + get { return "Package: "; } + } + protected override void ExecuteInternal(ExpandedStringVariableStore variables) + { + DataFormat df = mvarDataFormatReference.Create(); + + string outputFileName = String.Empty; + if (mvarOutputFileName != null) outputFileName = mvarOutputFileName.ToString(variables); + } + protected override void LoadFromMarkupInternal(MarkupTagElement tag) + { + MarkupTagElement tagDataFormatReference = (tag.Elements["DataFormatReference"] as MarkupTagElement); + if (tagDataFormatReference != null) + { + MarkupAttribute attTypeName = tagDataFormatReference.Attributes["TypeName"]; + MarkupAttribute attTypeID = tagDataFormatReference.Attributes["TypeID"]; + if (attTypeName == null && attTypeID == null) throw new ArgumentNullException("Must specify at least one of 'TypeName' or 'TypeID'"); + + + } + + MarkupTagElement tagOutputFileName = (tag.Elements["OutputFileName"] as MarkupTagElement); + if (tagOutputFileName != null) mvarOutputFileName = ExpandedString.FromMarkup(tagOutputFileName); + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskEvent.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskEvent.cs new file mode 100644 index 00000000..48ee8b66 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTaskEvent.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public delegate void ProjectTaskEventHandler(object sender, ProjectTaskEventArgs e); + public class ProjectTaskEventArgs : EventArgs + { + private string mvarMessage = String.Empty; + public string Message { get { return mvarMessage; } set { mvarMessage = value; } } + + public ProjectTaskEventArgs(string message) + { + mvarMessage = message; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectType.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectType.cs new file mode 100644 index 00000000..f0479599 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectType.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public class ProjectType + { + public class ProjectTypeCollection + : System.Collections.ObjectModel.Collection + { + + } + + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarLargeIconImageFileName = null; + public string LargeIconImageFileName { get { return mvarLargeIconImageFileName; } set { mvarLargeIconImageFileName = value; } } + + private string mvarSmallIconImageFileName = null; + public string SmallIconImageFileName { get { return mvarSmallIconImageFileName; } set { mvarSmallIconImageFileName = value; } } + + private ProjectTask.ProjectTaskCollection mvarTasks = new ProjectTask.ProjectTaskCollection(); + /// + /// Gets the s that are made available by this . + /// + public ProjectTask.ProjectTaskCollection Tasks { get { return mvarTasks; } } + + private ProjectTypeItemShortcut.ProjectTypeItemShortcutCollection mvarItemShortcuts = new ProjectTypeItemShortcut.ProjectTypeItemShortcutCollection(); + public ProjectTypeItemShortcut.ProjectTypeItemShortcutCollection ItemShortcuts { get { return mvarItemShortcuts; } } + + private ProjectTypeVariable.ProjectTypeVariableCollection mvarVariables = new ProjectTypeVariable.ProjectTypeVariableCollection(); + public ProjectTypeVariable.ProjectTypeVariableCollection Variables { get { return mvarVariables; } } + } + /// + /// A shortcut placed in the "Add New Item" menu when the project is selected. When + /// activated, these shortcuts create a new Document with the ObjectModel specified in the + /// ObjectModelReference and add the resulting Document to the selected project. The + /// Document may optionally be preloaded with content from the DocumentTemplate, if + /// specified. + /// + public class ProjectTypeItemShortcut + { + public class ProjectTypeItemShortcutCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private ObjectModelReference mvarObjectModelReference = null; + public ObjectModelReference ObjectModelReference { get { return mvarObjectModelReference; } set { mvarObjectModelReference = value; } } + + private DocumentTemplate mvarDocumentTemplate = null; + /// + /// The from which to load the document content for the + /// shortcut. + /// + public DocumentTemplate DocumentTemplate { get { return mvarDocumentTemplate; } set { mvarDocumentTemplate = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTypeVariable.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTypeVariable.cs new file mode 100644 index 00000000..07d7c994 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/ProjectTypeVariable.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public enum ProjectTypeVariableType + { + Text, + Choice, + FileOpen, + FileSave + } + public class ProjectTypeVariable + { + + public class ProjectTypeVariableCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private ProjectTypeVariableType mvarType = ProjectTypeVariableType.Text; + public ProjectTypeVariableType Type { get { return mvarType; } set { mvarType = value; } } + + private object mvarDefaultValue = null; + public object DefaultValue { get { return mvarDefaultValue; } set { mvarDefaultValue = value; } } + + private Dictionary mvarValidValues = new Dictionary(); + public Dictionary ValidValues { get { return mvarValidValues; } } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Properties/AssemblyInfo.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..43b70af8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor Essentials")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2011-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fdad04ec-a51d-4496-8a9d-f9712a32bbb1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/Template.cs b/CSharp/V5/Libraries/UniversalEditor.Essential/Template.cs new file mode 100644 index 00000000..6a20a21d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/Template.cs @@ -0,0 +1,238 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.ObjectModels.Solution; +using UniversalEditor.ObjectModels.Project; + +namespace UniversalEditor +{ + public class TemplateVariable + { + public class TemplateVariableCollection + : System.Collections.ObjectModel.Collection + { + public TemplateVariable this[string name] + { + get + { + foreach (TemplateVariable varr in this) + { + if (varr.Name == name) return varr; + } + return null; + } + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private string mvarDataType = String.Empty; + public string DataType { get { return mvarDataType; } set { mvarDataType = value; } } + + private string mvarLabel = String.Empty; + public string Label { get { return mvarLabel; } set { mvarLabel = value; } } + + private string mvarValue = String.Empty; + public string Value { get { return mvarValue; } set { mvarValue = value; } } + + private Dictionary mvarChoices = new Dictionary(); + public Dictionary Choices { get { return mvarChoices; } } + + } + public abstract class Template + { + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + /// + /// The title of the document template. + /// + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDescription = String.Empty; + /// + /// A short summary of the purpose and content of the document template. + /// + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + + private TemplateVariable.TemplateVariableCollection mvarVariables = new TemplateVariable.TemplateVariableCollection(); + /// + /// Variables that affect the content of this template. + /// + public TemplateVariable.TemplateVariableCollection Variables { get { return mvarVariables; } } + + private string mvarLargeIconImageFileName = null; + public string LargeIconImageFileName { get { return mvarLargeIconImageFileName; } set { mvarLargeIconImageFileName = value; } } + + private string mvarSmallIconImageFileName = null; + public string SmallIconImageFileName { get { return mvarSmallIconImageFileName; } set { mvarSmallIconImageFileName = value; } } + + private string mvarPreviewImageFileName = null; + public string PreviewImageFileName { get { return mvarPreviewImageFileName; } set { mvarPreviewImageFileName = value; } } + } + public class DocumentTemplate : Template + { + public class DocumentTemplateCollection + : System.Collections.ObjectModel.Collection + { + + } + + private ObjectModel mvarObjectModel = null; + /// + /// The complete object model that is used as the basis for the content provided by the template. + /// + public ObjectModel ObjectModel + { + get + { + if (mvarObjectModel == null) Create(); + return mvarObjectModel; + } + } + + private ObjectModelReference mvarObjectModelReference = null; + /// + /// A reference to the object model that is used to create the completed object model upon a call to . + /// + public ObjectModelReference ObjectModelReference { get { return mvarObjectModelReference; } set { mvarObjectModelReference = value; } } + + private MarkupObjectModel mvarTemplateContent = new MarkupObjectModel(); + /// + /// A that provides the content for this template. + /// + public MarkupObjectModel TemplateContent { get { return mvarTemplateContent; } } + + private string[] mvarPath = null; + /// + /// + /// + public string[] Path { get { return mvarPath; } set { mvarPath = value; } } + + /// + /// Initializes the template's ObjectModel with the content specified in . + /// + public void Create() + { + mvarObjectModel = mvarObjectModelReference.Create(); + object om = mvarObjectModel; + + MarkupTagElement tagContent = (mvarTemplateContent.Elements["Content"] as MarkupTagElement); + if (tagContent == null) return; + + Type type = mvarObjectModel.GetType(); + + foreach (MarkupElement el in tagContent.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + RecursiveLoadTag(tag, ref om); + } + } + + private void RecursiveLoadTag(MarkupTagElement tag, ref object applyTo) + { + Type type = applyTo.GetType(); + + System.Reflection.PropertyInfo pi = type.GetProperty(tag.Name); + object piVal = pi.GetValue(applyTo, null); + + if (pi.PropertyType.GetInterface("System.Collections.IList") != null) + { + // This is a list. Iterate through the child elements in the XML + foreach (MarkupElement el1 in tag.Elements) + { + MarkupTagElement tag1 = (el1 as MarkupTagElement); + if (tag1 == null) continue; + + // create the instance of the object to add + Type[] args = pi.PropertyType.BaseType.GetGenericArguments(); + object whatToAdd = RecursiveCreateObjectFromTag(tag1, args[0]); + + System.Reflection.MethodInfo[] mis = pi.PropertyType.GetMethods(); + + System.Reflection.MethodInfo miAdd = pi.PropertyType.GetMethod("Add", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public, null, new Type[] { whatToAdd.GetType() }, null); + miAdd.Invoke(piVal, new object[] { whatToAdd }); + } + } + else + { + // could this be text? + if (tag.Elements.Count > 0 && tag.Elements[0] is MarkupStringElement) + { + MarkupStringElement strText = (tag.Elements[0] as MarkupStringElement); + pi.SetValue(applyTo, strText.Value, null); + } + } + } + private object RecursiveCreateObjectFromTag(MarkupTagElement tag, Type objectType) + { + object obj = objectType.Assembly.CreateInstance(objectType.FullName); + + // create an instance of the object defined in type + foreach (MarkupAttribute att in tag.Attributes) + { + System.Reflection.PropertyInfo pi = objectType.GetProperty(att.Name); + if (pi == null) continue; + + pi.SetValue(obj, att.Value, null); + } + foreach (MarkupElement el1 in tag.Elements) + { + MarkupTagElement tag1 = (el1 as MarkupTagElement); + if (tag1 == null) continue; + + RecursiveLoadTag(tag1, ref obj); + } + + return obj; + } + } + public class ProjectTemplate : Template + { + public class ProjectTemplateCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string[] mvarPath = null; + /// + /// + /// + public string[] Path { get { return mvarPath; } set { mvarPath = value; } } + + private ProjectType mvarProjectType = null; + public ProjectType ProjectType { get { return mvarProjectType; } set { mvarProjectType = value; } } + + private string mvarProjectNamePrefix = String.Empty; + public string ProjectNamePrefix { get { return mvarProjectNamePrefix; } set { mvarProjectNamePrefix = value; } } + + private ProjectFileSystem mvarFileSystem = new ProjectFileSystem(); + public ProjectFileSystem FileSystem { get { return mvarFileSystem; } } + + private PropertyListObjectModel mvarConfiguration = new PropertyListObjectModel(); + public PropertyListObjectModel Configuration { get { return mvarConfiguration; } } + + /// + /// Creates a project from this project template. + /// + /// + public ProjectObjectModel Create() + { + ProjectObjectModel p = new ProjectObjectModel(); + p.ProjectType = mvarProjectType; + mvarFileSystem.CopyTo(p.FileSystem); + mvarConfiguration.CopyTo(p.Configuration); + + return p; + } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj b/CSharp/V5/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj new file mode 100644 index 00000000..8f72da22 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj @@ -0,0 +1,177 @@ + + + + + Debug + AnyCPU + {30467E5C-05BC-4856-AADC-13906EF4CADD} + Library + Properties + UniversalEditor + UniversalEditor.Essential + v4.0 + 512 + 10.0.0 + 2.0 + + + + true + full + false + ..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + ..\..\Output\Debug\UniversalEditor.Essential.xml + + + pdbonly + true + ..\..\Output\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + + + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/BookmarksManager.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/BookmarksManager.cs new file mode 100644 index 00000000..ec1f3011 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/BookmarksManager.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Accessors; +using UniversalEditor; + +namespace UniversalEditor.UserInterface +{ + public class BookmarksManager + { + private System.Collections.Specialized.StringCollection mvarFileNames = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection FileNames { get { return mvarFileNames; } } + + private string mvarDataFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "Mike Becker's Software", + "Universal Editor", + "Bookmarks.xml" + }); + public string DataFileName { get { return mvarDataFileName; } set { mvarDataFileName = value; } } + + private Version mvarFormatVersion = new Version(1, 0); + + public void Load() + { + MarkupObjectModel mom = new MarkupObjectModel(); + XMLDataFormat xml = new XMLDataFormat(); + + if (!System.IO.File.Exists(mvarDataFileName)) return; + + Document.Load(mom, xml, new FileAccessor(mvarDataFileName), true); + + MarkupTagElement tagBookmarks = (mom.Elements["Bookmarks"] as MarkupTagElement); + if (tagBookmarks == null) return; + + MarkupAttribute attVersion = tagBookmarks.Attributes["Version"]; + if (attVersion != null) + { + mvarFormatVersion = new Version(attVersion.Value); + } + + foreach (MarkupElement elDocument in tagBookmarks.Elements) + { + MarkupTagElement tagBookmark = (elDocument as MarkupTagElement); + if (tagBookmark == null) continue; + if (tagBookmark.FullName != "Bookmark") continue; + + MarkupAttribute attFileName = tagBookmark.Attributes["FileName"]; + if (attFileName == null) continue; + + mvarFileNames.Add(attFileName.Value); + } + } + public void Save() + { + MarkupObjectModel mom = new MarkupObjectModel(); + XMLDataFormat xml = new XMLDataFormat(); + + MarkupPreprocessorElement xmlp = new MarkupPreprocessorElement(); + xmlp.FullName = "xml"; + xmlp.Value = "version=\"1.0\" encoding=\"UTF-8\""; + mom.Elements.Add(xmlp); + + MarkupTagElement tagBookmarks = new MarkupTagElement(); + tagBookmarks.FullName = "Bookmarks"; + tagBookmarks.Attributes.Add("Version", mvarFormatVersion.ToString()); + + mom.Elements.Add(tagBookmarks); + + if (mvarFileNames.Count > 0) + { + foreach (string fileName in mvarFileNames) + { + MarkupTagElement tagBookmark = new MarkupTagElement(); + tagBookmark.FullName = "Bookmark"; + tagBookmark.Attributes.Add("FileName", fileName); + tagBookmarks.Elements.Add(tagBookmark); + } + } + + string dir = System.IO.Path.GetDirectoryName (mvarDataFileName); + if (!System.IO.Directory.Exists (dir)) + { + System.IO.Directory.CreateDirectory (dir); + } + + Document.Save(mom, xml, new FileAccessor(mvarDataFileName, true, true), true); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Command.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Command.cs new file mode 100644 index 00000000..1c4aaafb --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Command.cs @@ -0,0 +1,83 @@ +using System; + +namespace UniversalEditor.UserInterface +{ + public class Command + { + public class CommandCollection + : System.Collections.ObjectModel.Collection + { + public Command this[string ID] + { + get + { + foreach (Command command in this) + { + if (command.ID == ID) return command; + } + return null; + } + } + } + + private bool mvarEnableTearoff = false; + public bool EnableTearoff { get { return mvarEnableTearoff; } set { mvarEnableTearoff = value; } } + + private bool mvarChecked = false; + /// + /// Determines whether this command displays as checked. + /// + public bool Checked { get { return mvarChecked; } set { mvarChecked = value; } } + + private string mvarID = String.Empty; + /// + /// The ID of the command, used to reference it in . + /// + public string ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + /// + /// The title of the command (including mnemonic prefix, if applicable). + /// + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDefaultCommandID = String.Empty; + public string DefaultCommandID { get { return mvarDefaultCommandID; } set { mvarDefaultCommandID = value; } } + + private CommandShortcutKey mvarShortcutKey = new CommandShortcutKey(); + public CommandShortcutKey ShortcutKey { get { return mvarShortcutKey; } set { mvarShortcutKey = value; } } + + private StockCommandType mvarStockCommandType = StockCommandType.None; + /// + /// A that represents a predefined, platform-themed command. + /// + public StockCommandType StockCommandType { get { return mvarStockCommandType; } set { mvarStockCommandType = value; } } + + private string mvarImageFileName = String.Empty; + /// + /// The file name of the image to be displayed on the command. + /// + public string ImageFileName { get { return mvarImageFileName; } set { mvarImageFileName = value; } } + + + private CommandItem.CommandItemCollection mvarItems = new CommandItem.CommandItemCollection(); + /// + /// The child s that are contained within this . + /// + public CommandItem.CommandItemCollection Items { get { return mvarItems; } } + + /// + /// The event that is fired when the command is executed. + /// + public event EventHandler Executed; + + /// + /// Executes this . + /// + public void Execute() + { + if (Executed != null) Executed(this, EventArgs.Empty); + } + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandBar.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandBar.cs new file mode 100644 index 00000000..8dad56ee --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandBar.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class CommandBar + { + public class CommandBarCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarID = String.Empty; + public string ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private CommandItem.CommandItemCollection mvarItems = new CommandItem.CommandItemCollection(); + public CommandItem.CommandItemCollection Items { get { return mvarItems; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandDisplayStyle.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandDisplayStyle.cs new file mode 100644 index 00000000..54f96dab --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandDisplayStyle.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public enum CommandDisplayStyle + { + None = 0, + ImageOnly, + ImageAndText, + TextOnly + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandItem.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandItem.cs new file mode 100644 index 00000000..e0775aa5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandItem.cs @@ -0,0 +1,25 @@ +using System; +namespace UniversalEditor.UserInterface +{ + public abstract class CommandItem + { + public class CommandItemCollection + : System.Collections.ObjectModel.Collection + { + } + } + public class CommandReferenceCommandItem : CommandItem + { + private string mvarCommandID = String.Empty; + public string CommandID { get { return mvarCommandID; } set { mvarCommandID = value; } } + + public CommandReferenceCommandItem(string commandID) + { + mvarCommandID = commandID; + } + } + public class SeparatorCommandItem : CommandItem + { + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandShortcutKey.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandShortcutKey.cs new file mode 100644 index 00000000..554124c5 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CommandShortcutKey.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + [Flags()] + public enum CommandShortcutKeyModifiers + { + None = 0, + Control = 1, + Shift = 2, + Alt = 4, + Meta = 8, + Super = 16, + Hyper = 32 + } + public enum CommandShortcutKeyValue + { + None = 0, + + // + // Summary: + // The SPACEBAR key. + Space = 32, + // + // Summary: + // The PAGE UP key. + Prior = 33, + // + // Summary: + // The PAGE UP key. + PageUp = 33, + // + // Summary: + // The PAGE DOWN key. + Next = 34, + // + // Summary: + // The PAGE DOWN key. + PageDown = 34, + // + // Summary: + // The END key. + End = 35, + // + // Summary: + // The HOME key. + Home = 36, + // + // Summary: + // The LEFT ARROW key. + Left = 37, + // + // Summary: + // The UP ARROW key. + Up = 38, + // + // Summary: + // The RIGHT ARROW key. + Right = 39, + // + // Summary: + // The DOWN ARROW key. + Down = 40, + // + // Summary: + // The SELECT key. + Select = 41, + // + // Summary: + // The PRINT key. + Print = 42, + // + // Summary: + // The EXECUTE key. + Execute = 43, + // + // Summary: + // The PRINT SCREEN key. + PrintScreen = 44, + // + // Summary: + // The INS key. + Insert = 45, + // + // Summary: + // The DEL key. + Delete = 46, + // + // Summary: + // The HELP key. + Help = 47, + + TopRow0 = 48, + TopRow1, + TopRow2, + TopRow3, + TopRow4, + TopRow5, + TopRow6, + TopRow7, + TopRow8, + TopRow9, + + A = 65, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + + NumPad0 = 96, + NumPad1, + NumPad2, + NumPad3, + NumPad4, + NumPad5, + NumPad6, + NumPad7, + NumPad8, + NumPad9, + + F1 = 112, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12 + } + public class CommandShortcutKey + { + private CommandShortcutKeyModifiers mvarModifiers = CommandShortcutKeyModifiers.None; + public CommandShortcutKeyModifiers Modifiers { get { return mvarModifiers; } set { mvarModifiers = value; } } + + private CommandShortcutKeyValue mvarValue = CommandShortcutKeyValue.None; + public CommandShortcutKeyValue Value { get { return mvarValue; } set { mvarValue = value; } } + + public CommandShortcutKey() + : this(CommandShortcutKeyValue.None, CommandShortcutKeyModifiers.None) + { + } + public CommandShortcutKey(CommandShortcutKeyValue value, CommandShortcutKeyModifiers modifiers = CommandShortcutKeyModifiers.None) + { + mvarValue = value; + mvarModifiers = modifiers; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Common/Reflection.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Common/Reflection.cs new file mode 100644 index 00000000..d03d03b4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Common/Reflection.cs @@ -0,0 +1,229 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; + +namespace UniversalEditor.UserInterface.Common +{ + public static class Reflection + { + + #region Option Panels + private static IOptionPanelImplementation[] mvarAvailableOptionPanels = null; + public static IOptionPanelImplementation[] GetAvailableOptionPanels() + { + if (mvarAvailableOptionPanels == null) Initialize(); + return mvarAvailableOptionPanels; + } + #endregion + + private static void Initialize() + { + System.Reflection.Assembly[] asms = UniversalEditor.Common.Reflection.GetAvailableAssemblies(); + + List listEditors = new List(); + List listOptionPanels = new List(); + if (mvarAvailableEditors == null || mvarAvailableOptionPanels == null) + { + foreach (System.Reflection.Assembly asm in asms) + { + Type[] types = null; + try + { + types = asm.GetTypes(); + } + catch (System.Reflection.ReflectionTypeLoadException ex) + { + types = ex.Types; + } + + foreach (Type type in types) + { + if (type == null) continue; + Type[] interfaces = type.GetInterfaces(); + foreach (Type typeInt in interfaces) + { + #region Initializing Editors + if (typeInt == typeof(IEditorImplementation)) + { + Console.Write("loading editor '" + type.FullName + "'... "); + + try + { + IEditorImplementation editor = (type.Assembly.CreateInstance(type.FullName) as IEditorImplementation); + listEditors.Add(editor.MakeReference()); + + Console.WriteLine("SUCCESS!"); + } + catch (System.Reflection.TargetInvocationException ex) + { + Console.WriteLine("FAILURE!"); + + Console.WriteLine("binding error: " + ex.InnerException.Message); + } + catch (Exception ex) + { + Console.WriteLine("FAILURE!"); + + Console.WriteLine("error while loading editor '" + type.FullName + "': " + ex.Message); + } + break; + } + #endregion + #region Initializing Option Panels + else if (typeInt == typeof(IOptionPanelImplementation)) + { + try + { + IOptionPanelImplementation editor = (type.Assembly.CreateInstance(type.FullName) as IOptionPanelImplementation); + listOptionPanels.Add(editor); + } + catch (System.Reflection.TargetInvocationException ex) + { + Console.WriteLine("binding error: " + ex.InnerException.Message); + } + catch (Exception ex) + { + Console.WriteLine("error while loading editor '" + type.FullName + "': " + ex.Message); + } + break; + } + #endregion + } + } + } + } + #region Initializing Option Panels + { + if (mvarAvailableOptionPanels == null) + { + + } + } + #endregion + + if (mvarAvailableEditors == null) mvarAvailableEditors = listEditors.ToArray(); + if (mvarAvailableOptionPanels == null) mvarAvailableOptionPanels = listOptionPanels.ToArray(); + } + + private static Dictionary TypesByName = new Dictionary(); + private static Type FindType(string TypeName) + { + if (!TypesByName.ContainsKey(TypeName)) + { + System.Reflection.Assembly[] asms = GetAvailableAssemblies(); + bool found = false; + foreach (System.Reflection.Assembly asm in asms) + { + Type[] types = null; + try + { + types = asm.GetTypes(); + } + catch (System.Reflection.ReflectionTypeLoadException ex) + { + types = ex.Types; + } + foreach (Type type in types) + { + if (type == null) continue; + if (type.FullName == TypeName) + { + TypesByName.Add(TypeName, type); + found = true; + break; + } + } + if (found) break; + } + if (!found) return null; + } + return TypesByName[TypeName]; + } + + private static System.Reflection.Assembly[] mvarAvailableAssemblies = null; + private static System.Reflection.Assembly[] GetAvailableAssemblies() + { + if (mvarAvailableAssemblies == null) + { + List list = new List(); + string dir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); + string[] dllfiles = System.IO.Directory.GetFiles(dir, "*.dll", System.IO.SearchOption.AllDirectories); + // string[] exefiles = System.IO.Directory.GetFiles(dir, "*.exe", System.IO.SearchOption.AllDirectories); + + foreach (string dllfile in dllfiles) + { + try + { + System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFile(dllfile); + list.Add(asm); + } + catch + { + } + } + mvarAvailableAssemblies = list.ToArray(); + } + return mvarAvailableAssemblies; + } + + + private static EditorReference[] mvarAvailableEditors = null; + public static EditorReference[] GetAvailableEditors() + { + if (mvarAvailableEditors == null) Initialize(); + return mvarAvailableEditors; + } + + /* + private static Dictionary editorsByObjectModelType = new Dictionary(); + public static IEditorImplementation[] GetAvailableEditors(ObjectModelReference objectModelReference) + { + if (!editorsByObjectModelType.ContainsKey(objectModelReference.ObjectModelType)) + { + List list = new List(); + IEditorImplementation[] editors = GetAvailableEditors(); + foreach (IEditorImplementation editor in editors) + { + if (editor.SupportedObjectModels.Contains(objectModelReference.ObjectModelType) || editor.SupportedObjectModels.Contains(objectModelReference.ObjectModelID)) + { + list.Add(editor); + } + } + if (!editorsByObjectModelType.ContainsKey(objectModelReference.ObjectModelType)) + { + editorsByObjectModelType.Add(objectModelReference.ObjectModelType, list.ToArray()); + } + } + // editorsByObjectModelType.Clear(); + return editorsByObjectModelType[objectModelReference.ObjectModelType]; + } + */ + + public static EditorReference[] GetAvailableEditors(ObjectModelReference objectModelReference) + { + List list = new List(); + EditorReference[] editors = GetAvailableEditors(); + foreach (EditorReference editor in editors) + { + if (editor.SupportedObjectModels.Contains(objectModelReference.Type) || editor.SupportedObjectModels.Contains(objectModelReference.ID)) + { + list.Add(editor); + } + } + return list.ToArray(); + } + + public static EditorReference GetAvailableEditorByID(Guid guid) + { + EditorReference[] editors = GetAvailableEditors(); + foreach (EditorReference editor in editors) + { + if (editor.ID == guid) return editor; + } + return null; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/ConfigurationManager.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/ConfigurationManager.cs new file mode 100644 index 00000000..2b7c6c5e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/ConfigurationManager.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.UserInterface +{ + public enum ConfigurationManagerPropertyScope + { + Local, + Global + } + public class ConfigurationManager + { + private PropertyListObjectModel mvarGlobalConfiguration = new PropertyListObjectModel(); + private PropertyListObjectModel mvarLocalConfiguration = new PropertyListObjectModel(); + + public void SetValue(string propertyName, T propertyValue, ConfigurationManagerPropertyScope scope = ConfigurationManagerPropertyScope.Local) + { + SetValue(new string[] { propertyName }, propertyValue, scope); + } + public void SetValue(string[] propertyName, T propertyValue, ConfigurationManagerPropertyScope scope = ConfigurationManagerPropertyScope.Local) + { + if (scope == ConfigurationManagerPropertyScope.Local) + { + mvarLocalConfiguration.SetValue(propertyName, propertyValue); + } + else if (scope == ConfigurationManagerPropertyScope.Global) + { + mvarGlobalConfiguration.SetValue(propertyName, propertyValue); + } + } + public T GetValue(string propertyName, T defaultValue = default(T)) + { + return GetValue(new string[] { propertyName }, defaultValue); + } + public T GetValue(string[] propertyName, T defaultValue = default(T)) + { + if (mvarLocalConfiguration.HasValue(propertyName)) + { + return mvarLocalConfiguration.GetValue(propertyName, defaultValue); + } + return mvarGlobalConfiguration.GetValue(propertyName, defaultValue); + } + + public void Load() + { + UniversalEditor.DataFormats.PropertyList.XML.XMLPropertyListDataFormat xdf = new DataFormats.PropertyList.XML.XMLPropertyListDataFormat(); + + string FileName = Engine.DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "Configuration.xml"; + if (System.IO.File.Exists(FileName)) + { + Document.Load(mvarLocalConfiguration, xdf, new Accessors.FileAccessor(FileName)); + } + } + + public void Save() + { + UniversalEditor.DataFormats.PropertyList.XML.XMLPropertyListDataFormat xdf = new DataFormats.PropertyList.XML.XMLPropertyListDataFormat(); + string FileName = Engine.DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "Configuration.xml"; + string dir = System.IO.Path.GetDirectoryName (FileName); + if (!System.IO.Directory.Exists(dir)) + { + System.IO.Directory.CreateDirectory(dir); + } + Document.Save(mvarLocalConfiguration, xdf, new Accessors.FileAccessor(FileName, true, true)); + } + + public void AddProperty(Property property, ConfigurationManagerPropertyScope scope) + { + switch (scope) + { + case ConfigurationManagerPropertyScope.Global: + { + mvarGlobalConfiguration.Properties.Add(property); + break; + } + case ConfigurationManagerPropertyScope.Local: + { + mvarLocalConfiguration.Properties.Add(property); + break; + } + } + } + public void AddGroup(Group group, ConfigurationManagerPropertyScope scope) + { + switch (scope) + { + case ConfigurationManagerPropertyScope.Global: + { + mvarGlobalConfiguration.Groups.Add(group); + break; + } + case ConfigurationManagerPropertyScope.Local: + { + mvarLocalConfiguration.Groups.Add(group); + break; + } + } + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/CustomOptionDialogType.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CustomOptionDialogType.cs new file mode 100644 index 00000000..b77ffcbf --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/CustomOptionDialogType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public enum CustomOptionDialogType + { + Import, + Export + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/EditorReference.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/EditorReference.cs new file mode 100644 index 00000000..0ebfcf25 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/EditorReference.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class EditorReference + { + private Guid mvarID = Guid.Empty; + public Guid ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private Type mvarEditorType = null; + public Type EditorType { get { return mvarEditorType; } set { mvarEditorType = value; } } + + private ObjectModelReference.ObjectModelReferenceCollection mvarSupportedObjectModels = new ObjectModelReference.ObjectModelReferenceCollection(); + public ObjectModelReference.ObjectModelReferenceCollection SupportedObjectModels { get { return mvarSupportedObjectModels; } } + + public EditorReference(Type type) + { + mvarEditorType = type; + } + + public IEditorImplementation Create() + { + if (mvarEditorType != null) + { + return (mvarEditorType.Assembly.CreateInstance(mvarEditorType.FullName) as IEditorImplementation); + } + return null; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Engine.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Engine.cs new file mode 100644 index 00000000..27cbe5fb --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Engine.cs @@ -0,0 +1,1324 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.PropertyList; + +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor.UserInterface +{ + public abstract class Engine + { + private static Engine[] m_AvailableEngines = null; + public static Engine[] GetAvailableEngines() + { + if (m_AvailableEngines == null) + { + string directory = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string[] libraries = System.IO.Directory.GetFiles(directory, "*.dll"); + List engines = new List(); + foreach (string library in libraries) + { + try + { + Assembly assembly = Assembly.LoadFile(library); + Type[] types = null; + try + { + types = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException ex) + { + types = ex.Types; + } + if (types == null) + { + continue; + } + + foreach (Type type in types) + { + if (type.IsSubclassOf(typeof(Engine))) + { + Engine engine = (Engine)type.Assembly.CreateInstance(type.FullName); + engines.Add(engine); + } + } + } + catch + { + + } + } + m_AvailableEngines = engines.ToArray(); + } + return m_AvailableEngines; + } + + public bool AttachCommandEventHandler(string commandID, EventHandler handler) + { + Command cmd = Commands[commandID]; + if (cmd != null) + { + cmd.Executed += handler; + return true; + } + Console.WriteLine("attempted to attach handler for unknown command '" + commandID + "'"); + return false; + } + + protected virtual void BeforeInitialization() + { + } + protected virtual void AfterInitialization() + { + } + + private void AfterInitializationInternal() + { + // Initialize all the commands that are common to UniversalEditor + #region File + AttachCommandEventHandler("FileNewDocument", delegate(object sender, EventArgs e) + { + LastWindow.NewFile(); + }); + AttachCommandEventHandler("FileNewProject", delegate(object sender, EventArgs e) + { + LastWindow.NewProject(); + }); + AttachCommandEventHandler("FileOpenDocument", delegate(object sender, EventArgs e) + { + LastWindow.OpenFile(); + }); + AttachCommandEventHandler("FileOpenProject", delegate(object sender, EventArgs e) + { + LastWindow.OpenProject(); + }); + AttachCommandEventHandler("FileSaveDocument", delegate(object sender, EventArgs e) + { + LastWindow.SaveFile(); + }); + AttachCommandEventHandler("FileSaveDocumentAs", delegate(object sender, EventArgs e) + { + LastWindow.SaveFileAs(); + }); + AttachCommandEventHandler("FileSaveProject", delegate(object sender, EventArgs e) + { + LastWindow.SaveProject(); + }); + AttachCommandEventHandler("FileSaveProjectAs", delegate(object sender, EventArgs e) + { + LastWindow.SaveProjectAs(); + }); + AttachCommandEventHandler("FileSaveAll", delegate(object sender, EventArgs e) + { + LastWindow.SaveAll(); + }); + AttachCommandEventHandler("FileCloseDocument", delegate(object sender, EventArgs e) + { + LastWindow.CloseFile(); + }); + AttachCommandEventHandler("FileCloseProject", delegate(object sender, EventArgs e) + { + LastWindow.CloseProject(); + }); + AttachCommandEventHandler("FileRestart", delegate(object sender, EventArgs e) + { + RestartApplication(); + }); + AttachCommandEventHandler("FileExit", delegate(object sender, EventArgs e) + { + StopApplication(); + }); + #endregion + #region Edit + AttachCommandEventHandler("EditCut", delegate(object sender, EventArgs e) + { + Command cmdCopy = mvarCommands["EditCopy"]; + Command cmdDelete = mvarCommands["EditDelete"]; + + cmdCopy.Execute (); + cmdDelete.Execute (); + }); + AttachCommandEventHandler("EditCopy", delegate(object sender, EventArgs e) + { + IEditorImplementation editor = LastWindow.GetCurrentEditor(); + if (editor == null) return; + editor.Copy(); + }); + AttachCommandEventHandler("EditPaste", delegate(object sender, EventArgs e) + { + IEditorImplementation editor = LastWindow.GetCurrentEditor(); + if (editor == null) return; + editor.Paste(); + }); + AttachCommandEventHandler("EditDelete", delegate(object sender, EventArgs e) + { + IEditorImplementation editor = LastWindow.GetCurrentEditor(); + if (editor == null) return; + editor.Delete(); + }); + AttachCommandEventHandler("EditUndo", delegate(object sender, EventArgs e) + { + IEditorImplementation editor = LastWindow.GetCurrentEditor(); + if (editor == null) return; + editor.Undo(); + }); + AttachCommandEventHandler("EditRedo", delegate(object sender, EventArgs e) + { + IEditorImplementation editor = LastWindow.GetCurrentEditor(); + if (editor == null) return; + editor.Redo(); + }); + #endregion + #region View + AttachCommandEventHandler("ViewFullScreen", delegate(object sender, EventArgs e) + { + Command cmd = (sender as Command); + LastWindow.FullScreen = !LastWindow.FullScreen; + cmd.Checked = LastWindow.FullScreen; + }); + #region Perspective + AttachCommandEventHandler("ViewPerspective1", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(1); + }); + AttachCommandEventHandler("ViewPerspective2", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(2); + }); + AttachCommandEventHandler("ViewPerspective3", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(3); + }); + AttachCommandEventHandler("ViewPerspective4", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(4); + }); + AttachCommandEventHandler("ViewPerspective5", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(5); + }); + AttachCommandEventHandler("ViewPerspective6", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(6); + }); + AttachCommandEventHandler("ViewPerspective7", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(7); + }); + AttachCommandEventHandler("ViewPerspective8", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(8); + }); + AttachCommandEventHandler("ViewPerspective9", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.SwitchPerspective(9); + }); + #endregion + + AttachCommandEventHandler("ViewStartPage", delegate(object sender, EventArgs e) + { + HostApplication.CurrentWindow.ShowStartPage(); + }); + + #endregion + #region Tools + // ToolsOptions should actually be under the Edit menu as "Preferences" on Linux systems + AttachCommandEventHandler("ToolsOptions", delegate(object sender, EventArgs e) + { + LastWindow.ShowOptionsDialog(); + }); + #endregion + #region Window + AttachCommandEventHandler("WindowNewWindow", delegate(object sender, EventArgs e) + { + OpenWindow(); + }); + AttachCommandEventHandler("WindowWindows", delegate(object sender, EventArgs e) + { + LastWindow.SetWindowListVisible(true, true); + }); + #endregion + #region Help + AttachCommandEventHandler("HelpAboutPlatform", delegate(object sender, EventArgs e) + { + ShowAboutDialog(); + }); + #endregion + + + #region Dynamic Commands + #region View + #region Panels + for (int i = mvarCommandBars.Count - 1; i >= 0; i--) + { + Command cmdViewToolbarsToolbar = new Command(); + cmdViewToolbarsToolbar.ID = "ViewToolbars" + i.ToString(); + cmdViewToolbarsToolbar.Title = mvarCommandBars[i].Title; + cmdViewToolbarsToolbar.Executed += cmdViewToolbarsToolbar_Executed; + mvarCommands.Add(cmdViewToolbarsToolbar); + mvarCommands["ViewToolbars"].Items.Insert(0, new CommandReferenceCommandItem(cmdViewToolbarsToolbar.ID)); + } + #endregion + #region Panels + if (mvarCommands["ViewPanels"] != null) + { + Command cmdViewPanels1 = new Command(); + cmdViewPanels1.ID = "ViewPanels1"; + mvarCommands.Add(cmdViewPanels1); + mvarCommands["ViewPanels"].Items.Add(new CommandReferenceCommandItem("ViewPanels1")); + } + #endregion + #endregion + #endregion + + #region Language Strings + #region Help + Command helpAboutPlatform = mvarCommands["HelpAboutPlatform"]; + if (helpAboutPlatform != null) + { + helpAboutPlatform.Title = String.Format(helpAboutPlatform.Title, mvarDefaultLanguage.GetStringTableEntry("ApplicationTitle", "Universal Editor")); + } + + Command helpLanguage = mvarCommands["HelpLanguage"]; + if (helpLanguage != null) + { + foreach (Language lang in mvarLanguages) + { + Command cmdLanguage = new Command(); + cmdLanguage.ID = "HelpLanguage_" + lang.ID; + cmdLanguage.Title = lang.Title; + cmdLanguage.Executed += delegate(object sender, EventArgs e) + { + HostApplication.Messages.Add(HostApplicationMessageSeverity.Notice, "Clicked language " + lang.ID); + }; + mvarCommands.Add(cmdLanguage); + + helpLanguage.Items.Add(new CommandReferenceCommandItem("HelpLanguage_" + lang.ID)); + } + } + #endregion + #endregion + } + + void cmdViewToolbarsToolbar_Executed(object sender, EventArgs e) + { + Command cmd = (sender as Command); + + } + + private IHostApplicationWindowCollection mvarWindows = new IHostApplicationWindowCollection(); + public IHostApplicationWindowCollection Windows { get { return mvarWindows; } } + + public void CloseAllWindows() + { + List windowsToClose = new List(); + foreach (IHostApplicationWindow window in mvarWindows) + { + windowsToClose.Add(window); + } + foreach (IHostApplicationWindow window in windowsToClose) + { + window.CloseWindow(); + } + } + + public static bool Execute() + { + Engine[] engines = null; + try + { + engines = GetAvailableEngines(); + } + catch + { + return false; + } + + for (int i = 0; i < engines.Length; i++) + { + Console.WriteLine("Found engine " + engines[i].GetType().FullName); + } + + if (engines.Length < 1) + { + return false; + } + else if (engines.Length == 1) + { + mvarCurrentEngine = engines[0]; + } + else + { + mvarCurrentEngine = engines[1]; + } + + if (mvarCurrentEngine != null) + { + Console.WriteLine("Using engine " + mvarCurrentEngine.GetType().FullName); + } + +#if !DEBUG + try + { +#endif + mvarCurrentEngine.StartApplication(); +#if !DEBUG + } + catch (Exception ex) + { + mvarCurrentEngine.ShowCrashDialog(ex); + } +#endif + return true; + } + + protected abstract void ShowCrashDialog(Exception ex); + + protected abstract void MainLoop(); + + private Command.CommandCollection mvarCommands = new Command.CommandCollection(); + /// + /// The commands defined for this application. + /// + public Command.CommandCollection Commands { get { return mvarCommands; } } + + private Language mvarDefaultLanguage = null; + /// + /// The default used to display translatable text in this application. + /// + public Language DefaultLanguage { get { return mvarDefaultLanguage; } set { mvarDefaultLanguage = value; } } + + private Language.LanguageCollection mvarLanguages = new Language.LanguageCollection(); + /// + /// The languages defined for this application. Translations can be added through XML files in the ~/Languages folder. + /// + public Language.LanguageCollection Languages { get { return mvarLanguages; } } + + private EngineMainMenu mvarMainMenu = new EngineMainMenu(); + /// + /// The main menu of this application, which can hold multiple s. + /// + public EngineMainMenu MainMenu { get { return mvarMainMenu; } } + + private CommandBar.CommandBarCollection mvarCommandBars = new CommandBar.CommandBarCollection(); + /// + /// The command bars loaded in this application, which can each hold multiple s. + /// + public CommandBar.CommandBarCollection CommandBars { get { return mvarCommandBars; } } + + /// + /// The aggregated raw markup of all the various XML files loaded in the current search path. + /// + private MarkupObjectModel mvarRawMarkup = new MarkupObjectModel(); + + private System.Collections.ObjectModel.ReadOnlyCollection mvarSelectedFileNames = null; + public System.Collections.ObjectModel.ReadOnlyCollection SelectedFileNames { get { return mvarSelectedFileNames; } } + + private string mvarBasePath = String.Empty; + public string BasePath { get { return mvarBasePath; } } + + private static string mvarDataPath = null; + public static string DataPath + { + get + { + if (mvarDataPath == null) + { + mvarDataPath = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "Mike Becker's Software", + "Universal Editor" + }); + } + return mvarDataPath; + } + } + + private IHostApplicationWindow mvarLastWindow = null; + public IHostApplicationWindow LastWindow { get { return mvarLastWindow; } set { mvarLastWindow = value; } } + + public void OpenFile(params string[] fileNames) + { + Document[] documents = new Document[fileNames.Length]; + for (int i = 0; i < fileNames.Length; i++) + { + documents[i] = new Document(null, null, new FileAccessor(fileNames[i])); + } + OpenFile(documents); + } + public void OpenFile(params Document[] documents) + { + if (LastWindow == null) + { + OpenWindow(documents); + return; + } + LastWindow.OpenFile(documents); + } + + /// + /// Opens a new window, optionally loading the specified documents. + /// + /// The file name(s) of the document(s) to load. + /// An representing the window that was created. + protected abstract IHostApplicationWindow OpenWindowInternal(params Document[] documents); + + public abstract void ShowAboutDialog(); + public abstract void ShowAboutDialog(DataFormatReference dfr); + + public void OpenWindow() + { + OpenWindow(new Document[0]); + } + public void OpenWindow(params string[] fileNames) + { + Document[] documents = new Document[fileNames.Length]; + for (int i = 0; i < fileNames.Length; i++) + { + documents[i] = new Document(null, null, new FileAccessor(fileNames[i])); + } + OpenWindow(documents); + } + /// + /// Opens a new window, optionally loading the specified documents. + /// + /// The file name(s) of the document(s) to load. + public void OpenWindow(params Document[] documents) + { + IHostApplicationWindow window = OpenWindowInternal(documents); + window.WindowClosed += delegate(object sender, EventArgs e) + { + mvarWindows.Remove(window); + }; + mvarWindows.Add(window); + } + + // UniversalDataStorage.Editor.WindowsForms.Program + private void SingleInstanceManager_Callback(object sender, SingleInstanceManager.InstanceCallbackEventArgs e) + { + if (!e.IsFirstInstance) + { + if (LastWindow != null) + { + Document[] documents = new Document[e.CommandLineArgs.Length - 1]; + for (int i = 1; i < e.CommandLineArgs.Length; i++) + { + documents[i - 1] = new Document(null, null, new FileAccessor(e.CommandLineArgs[i])); + } + + LastWindow.OpenFile(documents); + LastWindow.ActivateWindow(); + } + } + } + + protected virtual void InitializeXMLConfiguration() + { + #region Load the XML files + string[] xmlfiles = System.IO.Directory.GetFiles(mvarBasePath, "*.xml", System.IO.SearchOption.AllDirectories); + + UpdateSplashScreenStatus("Loading XML configuration files", 0, 0, xmlfiles.Length); + + XMLDataFormat xdf = new XMLDataFormat(); + foreach (string xmlfile in xmlfiles) + { + MarkupObjectModel markup = new MarkupObjectModel(); + Document doc = new Document(markup, xdf, new FileAccessor(xmlfile)); + doc.Accessor.DefaultEncoding = IO.Encoding.UTF8; + + doc.Accessor.Open(); + doc.Load(); + doc.Close(); + + markup.CopyTo(mvarRawMarkup); + + // UpdateSplashScreenStatus("Loading XML configuration files", Array.IndexOf(xmlfiles, xmlfile) + 1); + } + + #endregion + + #region Initialize the configuration with the loaded data + #region Commands + UpdateSplashScreenStatus("Loading available commands"); + MarkupTagElement tagCommands = (mvarRawMarkup.FindElement("UniversalEditor", "Application", "Commands") as MarkupTagElement); + if (tagCommands != null) + { + foreach (MarkupElement elCommand in tagCommands.Elements) + { + MarkupTagElement tagCommand = (elCommand as MarkupTagElement); + if (tagCommand == null) continue; + if (tagCommand.FullName != "Command") continue; + + MarkupAttribute attID = tagCommand.Attributes["ID"]; + if (attID == null) continue; + + Command cmd = new Command(); + cmd.ID = attID.Value; + + MarkupAttribute attDefaultCommandID = tagCommand.Attributes["DefaultCommandID"]; + if (attDefaultCommandID != null) + { + cmd.DefaultCommandID = attDefaultCommandID.Value; + } + + MarkupAttribute attTitle = tagCommand.Attributes["Title"]; + if (attTitle != null) + { + cmd.Title = attTitle.Value; + } + else + { + cmd.Title = cmd.ID; + } + + MarkupTagElement tagShortcut = (tagCommand.Elements["Shortcut"] as MarkupTagElement); + if (tagShortcut != null) + { + MarkupAttribute attModifiers = tagShortcut.Attributes["Modifiers"]; + MarkupAttribute attKey = tagShortcut.Attributes["Key"]; + if (attKey != null) + { + CommandShortcutKeyModifiers modifiers = CommandShortcutKeyModifiers.None; + if (attModifiers != null) + { + string[] strModifiers = attModifiers.Value.Split(new char[] { ',' }); + foreach (string strModifier in strModifiers) + { + switch (strModifier.Trim().ToLower()) + { + case "alt": + { + modifiers |= CommandShortcutKeyModifiers.Alt; + break; + } + case "control": + { + modifiers |= CommandShortcutKeyModifiers.Control; + break; + } + case "meta": + { + modifiers |= CommandShortcutKeyModifiers.Meta; + break; + } + case "shift": + { + modifiers |= CommandShortcutKeyModifiers.Shift; + break; + } + case "super": + { + modifiers |= CommandShortcutKeyModifiers.Super; + break; + } + } + } + } + + CommandShortcutKeyValue value = CommandShortcutKeyValue.None; + value = (CommandShortcutKeyValue)Enum.Parse(typeof(CommandShortcutKeyValue), attKey.Value); + + cmd.ShortcutKey = new CommandShortcutKey(value, modifiers); + } + } + + MarkupTagElement tagItems = (tagCommand.Elements["Items"] as MarkupTagElement); + if (tagItems != null) + { + foreach (MarkupElement el in tagItems.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + + InitializeMainMenuItem(tag, cmd); + } + } + + mvarCommands.Add(cmd); + } + } + #endregion + #region Main Menu Items + UpdateSplashScreenStatus("Loading main menu items"); + + MarkupTagElement tagMainMenuItems = (mvarRawMarkup.FindElement("UniversalEditor", "Application", "MainMenu", "Items") as MarkupTagElement); + if (tagMainMenuItems != null) + { + foreach (MarkupElement elItem in tagMainMenuItems.Elements) + { + MarkupTagElement tagItem = (elItem as MarkupTagElement); + if (tagItem == null) continue; + InitializeMainMenuItem(tagItem, null); + } + } + + UpdateSplashScreenStatus("Loading command bars"); + + MarkupTagElement tagCommandBars = (mvarRawMarkup.FindElement("UniversalEditor", "Application", "CommandBars") as MarkupTagElement); + if (tagCommandBars != null) + { + foreach (MarkupElement elCommandBar in tagCommandBars.Elements) + { + MarkupTagElement tagCommandBar = (elCommandBar as MarkupTagElement); + if (tagCommandBar == null) continue; + if (tagCommandBar.FullName != "CommandBar") continue; + InitializeCommandBar(tagCommandBar); + } + } + #endregion + #region Languages + UpdateSplashScreenStatus("Loading languages and translations"); + + MarkupTagElement tagLanguages = (mvarRawMarkup.FindElement("UniversalEditor", "Application", "Languages") as MarkupTagElement); + if (tagLanguages != null) + { + foreach (MarkupElement elLanguage in tagLanguages.Elements) + { + MarkupTagElement tagLanguage = (elLanguage as MarkupTagElement); + if (tagLanguage == null) continue; + if (tagLanguage.FullName != "Language") continue; + InitializeLanguage(tagLanguage); + } + + MarkupAttribute attDefaultLanguageID = tagLanguages.Attributes["DefaultLanguageID"]; + if (attDefaultLanguageID != null) + { + mvarDefaultLanguage = mvarLanguages[attDefaultLanguageID.Value]; + } + } + + UpdateSplashScreenStatus("Setting language"); + + if (mvarDefaultLanguage == null) + { + mvarDefaultLanguage = new Language(); + } + else + { + foreach (Command cmd in mvarCommands) + { + cmd.Title = mvarDefaultLanguage.GetCommandTitle(cmd.ID, cmd.ID); + } + } + #endregion + + #region Global Configuration + { + UpdateSplashScreenStatus("Loading global configuration"); + + MarkupTagElement tagConfiguration = (mvarRawMarkup.FindElement("UniversalEditor", "Configuration") as MarkupTagElement); + if (tagConfiguration != null) + { + foreach (MarkupElement el in tagConfiguration.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + LoadConfiguration(tag); + } + } + } + #endregion + #region Editor Configuration + { + UpdateSplashScreenStatus("Loading editor configuration"); + + MarkupTagElement tagEditors = (mvarRawMarkup.FindElement("UniversalEditor", "Editors") as MarkupTagElement); + if (tagEditors != null) + { + foreach (MarkupElement el in tagEditors.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName != "Editor") continue; + + EditorReference editor = Common.Reflection.GetAvailableEditorByID(new Guid(tag.Attributes["ID"].Value)); + + } + } + } + #endregion + #region Object Model Configuration + { + UpdateSplashScreenStatus("Loading object model configuration"); + + MarkupTagElement tagObjectModels = (mvarRawMarkup.FindElement("UniversalEditor", "ObjectModels") as MarkupTagElement); + if (tagObjectModels != null) + { + MarkupTagElement tagDefault = (tagObjectModels.Elements["Default"] as MarkupTagElement); + if (tagDefault != null) + { + ObjectModelReference[] omrs = UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + MarkupAttribute attVisible = tagDefault.Attributes["Visible"]; + foreach (ObjectModelReference omr in omrs) + { + if (attVisible != null) omr.Visible = (attVisible.Value == "true"); + } + } + + foreach (MarkupElement el in tagObjectModels.Elements) + { + MarkupTagElement tag = (el as MarkupTagElement); + if (tag == null) continue; + if (tag.FullName == "ObjectModel") + { + MarkupAttribute attTypeName = tag.Attributes["TypeName"]; + MarkupAttribute attID = tag.Attributes["ID"]; + MarkupAttribute attVisible = tag.Attributes["Visible"]; + + if (attTypeName != null) + { + ObjectModelReference omr = UniversalEditor.Common.Reflection.GetAvailableObjectModelByTypeName(attTypeName.Value); + if (attVisible != null) omr.Visible = (attVisible.Value == "true"); + } + else + { + ObjectModelReference omr = UniversalEditor.Common.Reflection.GetAvailableObjectModelByID(new Guid(attID.Value)); + if (attVisible != null) omr.Visible = (attVisible.Value == "true"); + } + } + } + } + } + #endregion + + UpdateSplashScreenStatus("Finalizing configuration"); + ConfigurationManager.Load(); + #endregion + } + + private void LoadConfiguration(MarkupTagElement tag, Group group = null) + { + if (tag.FullName == "Group") + { + Group group1 = new Group(); + group1.Name = tag.Attributes["ID"].Value; + foreach (MarkupElement el in tag.Elements) + { + MarkupTagElement tg = (el as MarkupTagElement); + if (tg == null) continue; + LoadConfiguration(tg, group1); + } + + if (group == null) + { + mvarConfigurationManager.AddGroup(group1, ConfigurationManagerPropertyScope.Global); + } + else + { + group.Groups.Add(group1); + } + } + else if (tag.FullName == "Property") + { + Property property = new Property(); + property.Name = tag.Attributes["ID"].Value; + MarkupAttribute att = tag.Attributes["Value"]; + if (att != null) + { + property.Value = att.Value; + } + + if (group == null) + { + mvarConfigurationManager.AddProperty(property, ConfigurationManagerPropertyScope.Global); + } + else + { + group.Properties.Add(property); + } + } + } + + private void InitializeLanguage(MarkupTagElement tag) + { + Language lang = new Language(); + + MarkupAttribute attID = tag.Attributes["ID"]; + if (attID == null) return; + lang.ID = attID.Value; + + MarkupAttribute attTitle = tag.Attributes["Title"]; + if (attTitle != null) + { + lang.Title = attTitle.Value; + } + else + { + lang.Title = lang.ID; + } + + MarkupTagElement tagStringTable = (tag.Elements["StringTable"] as MarkupTagElement); + if (tagStringTable != null) + { + foreach (MarkupElement elStringTableEntry in tagStringTable.Elements) + { + MarkupTagElement tagStringTableEntry = (elStringTableEntry as MarkupTagElement); + if (tagStringTableEntry == null) continue; + if (tagStringTableEntry.FullName != "StringTableEntry") continue; + + MarkupAttribute attStringTableEntryID = tagStringTableEntry.Attributes["ID"]; + if (attStringTableEntryID == null) continue; + + MarkupAttribute attStringTableEntryValue = tagStringTableEntry.Attributes["Value"]; + if (attStringTableEntryValue == null) continue; + + lang.SetStringTableEntry(attStringTableEntryID.Value, attStringTableEntryValue.Value); + } + } + + MarkupTagElement tagCommands = (tag.Elements["Commands"] as MarkupTagElement); + if (tagCommands != null) + { + foreach (MarkupElement elCommand in tagCommands.Elements) + { + MarkupTagElement tagCommand = (elCommand as MarkupTagElement); + if (tagCommand == null) continue; + if (tagCommand.FullName != "Command") continue; + + MarkupAttribute attCommandID = tagCommand.Attributes["ID"]; + if (attCommandID == null) continue; + + MarkupAttribute attCommandTitle = tagCommand.Attributes["Title"]; + if (attCommandTitle == null) continue; + + lang.SetCommandTitle(attCommandID.Value, attCommandTitle.Value); + } + } + + mvarLanguages.Add(lang); + } + + private void InitializeCommandBar(MarkupTagElement tag) + { + MarkupAttribute attID = tag.Attributes["ID"]; + if (attID == null) return; + + CommandBar cb = new CommandBar(); + cb.ID = attID.Value; + + MarkupAttribute attTitle = tag.Attributes["Title"]; + if (attTitle != null) + { + cb.Title = attTitle.Value; + } + else + { + cb.Title = cb.ID; + } + + MarkupTagElement tagItems = tag.Elements["Items"] as MarkupTagElement; + if (tagItems != null) + { + foreach (MarkupElement elItem in tagItems.Elements) + { + MarkupTagElement tagItem = (elItem as MarkupTagElement); + if (tagItem == null) continue; + switch (tagItem.FullName) + { + case "CommandReference": + { + MarkupAttribute attCommandID = tagItem.Attributes["CommandID"]; + if (attCommandID != null) + { + cb.Items.Add(new CommandReferenceCommandItem(attCommandID.Value)); + } + break; + } + case "Separator": + { + cb.Items.Add(new SeparatorCommandItem()); + break; + } + } + } + } + + mvarCommandBars.Add(cb); + } + + private void InitializeCommandBarItem(MarkupTagElement tag, CommandBar parent) + { + CommandItem item = null; + switch (tag.FullName) + { + case "CommandReference": + { + MarkupAttribute attCommandID = tag.Attributes["CommandID"]; + if (attCommandID != null) + { + item = new CommandReferenceCommandItem(attCommandID.Value); + } + break; + } + case "Separator": + { + item = new SeparatorCommandItem(); + break; + } + } + + if (item != null) + { + parent.Items.Add(item); + } + } + private void InitializeMainMenuItem(MarkupTagElement tag, Command parent) + { + CommandItem item = null; + switch (tag.FullName) + { + case "CommandReference": + { + MarkupAttribute attCommandID = tag.Attributes["CommandID"]; + if (attCommandID != null) + { + item = new CommandReferenceCommandItem(attCommandID.Value); + } + break; + } + case "Separator": + { + item = new SeparatorCommandItem(); + break; + } + } + + if (item != null) + { + if (parent == null) + { + mvarMainMenu.Items.Add(item); + } + else + { + parent.Items.Add(item); + } + } + } + + protected virtual void InitializeBranding() + { + + } + + private ConfigurationManager mvarConfigurationManager = new ConfigurationManager(); + public ConfigurationManager ConfigurationManager { get { return mvarConfigurationManager; } } + + private RecentFileManager mvarRecentFileManager = new RecentFileManager(); + public RecentFileManager RecentFileManager { get { return mvarRecentFileManager; } } + + private BookmarksManager mvarBookmarksManager = new BookmarksManager(); + public BookmarksManager BookmarksManager { get { return mvarBookmarksManager; } } + + private SessionManager mvarSessionManager = new SessionManager(); + public SessionManager SessionManager { get { return mvarSessionManager; } set { mvarSessionManager = value; } } + + private static Engine mvarCurrentEngine = null; + public static Engine CurrentEngine { get { return mvarCurrentEngine; } } + + private Perspective.PerspectiveCollection mvarPerspectives = new Perspective.PerspectiveCollection(); + public Perspective.PerspectiveCollection Perspectives { get { return mvarPerspectives; } } + + protected virtual void ShowSplashScreen() + { + } + protected virtual void HideSplashScreen() + { + } + protected virtual void UpdateSplashScreenStatus(string message, int progressValue = -1, int progressMinimum = 0, int progressMaximum = 100) + { + } + + private void Initialize() + { + // Initialize the XML files before anything else, since this also loads string tables needed + // to display the application title + InitializeXMLConfiguration(); + + System.Threading.Thread threadLoader = new System.Threading.Thread(threadLoader_ThreadStart); + threadLoader.Name = "Initialization Thread"; + threadLoader.Start(); + + ShowSplashScreen(); + + while (threadLoader.ThreadState == System.Threading.ThreadState.Running) + { + System.Threading.Thread.Sleep (500); + } + } + protected virtual void InitializeInternal() + { + UpdateSplashScreenStatus("Loading object models..."); + UniversalEditor.Common.Reflection.GetAvailableObjectModels(); + + UpdateSplashScreenStatus("Loading data formats..."); + UniversalEditor.Common.Reflection.GetAvailableDataFormats(); + + // Initialize Recent File Manager + mvarRecentFileManager.DataFileName = DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "RecentItems.xml"; + mvarRecentFileManager.Load(); + + // Initialize Bookmarks Manager + mvarBookmarksManager.DataFileName = DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "Bookmarks.xml"; + mvarBookmarksManager.Load(); + + // Initialize Session Manager + mvarSessionManager.DataFileName = DataPath + System.IO.Path.DirectorySeparatorChar.ToString() + "Sessions.xml"; + mvarSessionManager.Load(); + } + private void threadLoader_ThreadStart() + { + /* + if (Configuration.SplashScreen.Enabled) + { + while (splasher == null) System.Threading.Thread.Sleep(500); + } + */ + + InitializeInternal(); + HideSplashScreen(); + } + + private bool mvarRunning = false; + public bool Running { get { return mvarRunning; } } + + public void StartApplication() + { + Engine.mvarCurrentEngine = this; + mvarRunning = true; + + string INSTANCEID = GetType().FullName + "$2d429aa3371c421fb63b42525e51a50c$92751853175891031214292357218181357901238$"; + if (ConfigurationManager.GetValue("SingleInstanceUniquePerDirectory", true)) + { + // The single instance should be unique per directory + INSTANCEID += System.Reflection.Assembly.GetEntryAssembly().Location; + } + if (!SingleInstanceManager.CreateSingleInstance(INSTANCEID, new EventHandler(SingleInstanceManager_Callback))) return; + + string[] args1 = Environment.GetCommandLineArgs(); + string[] args = new string[args1.Length - 1]; + Array.Copy(args1, 1, args, 0, args.Length); + + System.Collections.ObjectModel.Collection selectedFileNames = new System.Collections.ObjectModel.Collection(); + if (selectedFileNames.Count == 0 || ConfigurationManager.GetValue(new string[] { "Application", "Startup", "ForceLoadStartupFileNames" }, false)) + { + object[] oStartupFileNames = ConfigurationManager.GetValue(new string[] { "Application", "Startup", "FileNames" }, new object[0]); + for (int i = 0; i < oStartupFileNames.Length; i++) + { + string startupFileName = oStartupFileNames[i].ToString(); + selectedFileNames.Add(startupFileName); + } + } + foreach (string commandLineArgument in args) + { + selectedFileNames.Add(commandLineArgument); + } + mvarSelectedFileNames = new System.Collections.ObjectModel.ReadOnlyCollection(selectedFileNames); + + // Set up the base path for the current application. Should this be able to be + // overridden with a switch (/basepath:...) ? + mvarBasePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + + BeforeInitialization(); + + // Initialize the branding for the selected application + InitializeBranding(); + + Initialize(); + + AfterInitializationInternal(); + AfterInitialization(); + + OpenWindow(SelectedFileNames.ToArray()); + + MainLoop(); + + SessionManager.Save(); + BookmarksManager.Save(); + RecentFileManager.Save(); + ConfigurationManager.Save(); + } + public void RestartApplication() + { + RestartApplicationInternal(); + } + public void StopApplication() + { + if (!BeforeStopApplication()) return; + StopApplicationInternal(); + } + protected virtual void RestartApplicationInternal() + { + StopApplication(); + StartApplication(); + } + protected virtual bool BeforeStopApplication() + { + return true; + } + protected virtual void StopApplicationInternal() + { + } + + public bool ShowCustomOptionDialog(ref DataFormat df, CustomOptionDialogType type) + { + CustomOption.CustomOptionCollection coll = null; + DataFormatReference dfr = df.MakeReference(); + + if (type == CustomOptionDialogType.Export) + { + coll = dfr.ExportOptions; + } + else + { + coll = dfr.ImportOptions; + } + if (coll.Count == 0) return true; + + bool retval = ShowCustomOptionDialog(ref coll, dfr.Title + " Options", delegate(object sender, EventArgs e) + { + ShowAboutDialog(dfr); + }); + + if (retval) + { + foreach (CustomOption eo in coll) + { + System.Reflection.PropertyInfo pi = dfr.Type.GetProperty(eo.PropertyName); + if (pi == null) continue; + + if (eo is CustomOptionNumber) + { + CustomOptionNumber itm = (eo as CustomOptionNumber); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + else if (eo is CustomOptionBoolean) + { + CustomOptionBoolean itm = (eo as CustomOptionBoolean); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + else if (eo is CustomOptionChoice) + { + CustomOptionFieldChoice choice = (eo as CustomOptionChoice).Value; + if (choice != null) + { + Type[] interfaces = pi.PropertyType.GetInterfaces(); + bool convertible = false; + foreach (Type t in interfaces) + { + if (t == typeof(IConvertible)) + { + convertible = true; + break; + } + } + if (convertible) + { + pi.SetValue(df, Convert.ChangeType(choice.Value, pi.PropertyType), null); + } + else + { + pi.SetValue(df, choice.Value, null); + } + } + } + else if (eo is CustomOptionText) + { + CustomOptionText itm = (eo as CustomOptionText); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + } + + return true; + } + return false; + } + public bool ShowCustomOptionDialog(ref Accessor df, CustomOptionDialogType type) + { + if (df == null) return true; + + CustomOption.CustomOptionCollection coll = null; + AccessorReference dfr = df.MakeReference(); + + if (type == CustomOptionDialogType.Export) + { + coll = dfr.ExportOptions; + } + else + { + coll = dfr.ImportOptions; + } + if (coll.Count == 0) return true; + + bool retval = ShowCustomOptionDialog(ref coll, dfr.Title + " Options"); + + if (retval) + { + foreach (CustomOption eo in coll) + { + System.Reflection.PropertyInfo pi = dfr.AccessorType.GetProperty(eo.PropertyName); + if (pi == null) continue; + + if (eo is CustomOptionNumber) + { + CustomOptionNumber itm = (eo as CustomOptionNumber); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + else if (eo is CustomOptionBoolean) + { + CustomOptionBoolean itm = (eo as CustomOptionBoolean); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + else if (eo is CustomOptionChoice) + { + CustomOptionFieldChoice choice = (eo as CustomOptionChoice).Value; + if (choice != null) + { + Type[] interfaces = pi.PropertyType.GetInterfaces(); + bool convertible = false; + foreach (Type t in interfaces) + { + if (t == typeof(IConvertible)) + { + convertible = true; + break; + } + } + if (convertible) + { + pi.SetValue(df, Convert.ChangeType(choice.Value, pi.PropertyType), null); + } + else + { + pi.SetValue(df, choice.Value, null); + } + } + } + else if (eo is CustomOptionText) + { + CustomOptionText itm = (eo as CustomOptionText); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + else if (eo is CustomOptionFile) + { + CustomOptionFile itm = (eo as CustomOptionFile); + pi.SetValue(df, Convert.ChangeType(itm.Value, pi.PropertyType), null); + } + } + + return true; + } + return false; + } + public abstract bool ShowCustomOptionDialog(ref CustomOption.CustomOptionCollection customOptions, string title = null, EventHandler aboutButtonClicked = null); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/EngineMainMenu.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/EngineMainMenu.cs new file mode 100644 index 00000000..6c3a088b --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/EngineMainMenu.cs @@ -0,0 +1,16 @@ +using System; +namespace UniversalEditor.UserInterface +{ + public class EngineMainMenu + { + private bool mvarEnableTearoff = false; + /// + /// Determines whether menus can be torn off to display their contents in a separate window. + /// + public bool EnableTearoff { get { return mvarEnableTearoff; } set { mvarEnableTearoff = value; } } + + private CommandItem.CommandItemCollection mvarItems = new CommandItem.CommandItemCollection(); + public CommandItem.CommandItemCollection Items { get { return mvarItems; } } + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplication.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplication.cs new file mode 100644 index 00000000..34d1f5b8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplication.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public static class HostApplication + { + /// + /// Gets or sets the current window of the host application. + /// + public static IHostApplicationWindow CurrentWindow { get { return Engine.CurrentEngine.LastWindow; } set { Engine.CurrentEngine.LastWindow = value; } } + + private static HostApplicationOutputWindow mvarOutputWindow = new HostApplicationOutputWindow(); + /// + /// Gets or sets the output window of the host application, where other plugins can read from and write to. + /// + public static HostApplicationOutputWindow OutputWindow { get { return mvarOutputWindow; } set { mvarOutputWindow = value; } } + + private static HostApplicationMessage.HostApplicationMessageCollection mvarMessages = new HostApplicationMessage.HostApplicationMessageCollection(); + /// + /// A collection of messages to display in the Error List panel. + /// + public static HostApplicationMessage.HostApplicationMessageCollection Messages { get { return mvarMessages; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationMessage.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationMessage.cs new file mode 100644 index 00000000..ecf33e89 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationMessage.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public enum HostApplicationMessageSeverity + { + None = 0, + Notice = 1, + Warning = 2, + Error = 3 + } + public delegate void HostApplicationMessageModifyingEventHandler(object sender, HostApplicationMessageModifyingEventArgs e); + public class HostApplicationMessageModifyingEventArgs + : CancelEventArgs + { + public HostApplicationMessageModifyingEventArgs(HostApplicationMessage message) + { + mvarMessage = message; + } + + private HostApplicationMessage mvarMessage = null; + public HostApplicationMessage Message { get { return mvarMessage; } } + } + public delegate void HostApplicationMessageModifiedEventHandler(object sender, HostApplicationMessageModifiedEventArgs e); + public class HostApplicationMessageModifiedEventArgs + : EventArgs + { + public HostApplicationMessageModifiedEventArgs(HostApplicationMessage message) + { + mvarMessage = message; + } + + private HostApplicationMessage mvarMessage = null; + public HostApplicationMessage Message { get { return mvarMessage; } } + } + + public class HostApplicationMessage + { + public class HostApplicationMessageCollection + : System.Collections.ObjectModel.Collection + { + public event HostApplicationMessageModifyingEventHandler MessageAdding; + public event HostApplicationMessageModifyingEventHandler MessageRemoving; + + public event HostApplicationMessageModifiedEventHandler MessageAdded; + public event HostApplicationMessageModifiedEventHandler MessageRemoved; + + public HostApplicationMessage Add(HostApplicationMessageSeverity severity, string description, string fileName = null, int? lineNumber = null, int? columnNumber = null, string projectName = null) + { + HostApplicationMessage message = new HostApplicationMessage(); + message.Severity = severity; + message.Description = description; + message.FileName = fileName; + message.LineNumber = lineNumber; + message.ColumnNumber = columnNumber; + message.ProjectName = projectName; + Add(message); + return message; + } + + protected virtual void OnMessageAdding(HostApplicationMessageModifyingEventArgs e) + { + if (MessageAdding != null) + { + MessageAdding(this, e); + } + } + protected virtual void OnMessageAdded(HostApplicationMessageModifiedEventArgs e) + { + if (MessageAdded != null) + { + MessageAdded(this, e); + } + } + + protected virtual void OnMessageRemoving(HostApplicationMessageModifyingEventArgs e) + { + if (MessageRemoving != null) + { + MessageRemoving(this, e); + } + } + protected virtual void OnMessageRemoved(HostApplicationMessageModifiedEventArgs e) + { + if (MessageRemoved != null) + { + MessageRemoved(this, e); + } + } + + public event EventHandler MessagesCleared; + protected virtual void OnMessagesCleared(EventArgs e) + { + if (MessagesCleared != null) MessagesCleared(this, e); + } + + protected override void InsertItem(int index, HostApplicationMessage item) + { + HostApplicationMessage message = item; + HostApplicationMessageModifyingEventArgs e = new HostApplicationMessageModifyingEventArgs(message); + OnMessageAdding(e); + if (e.Cancel) return; + + base.InsertItem(index, item); + + OnMessageAdded(new HostApplicationMessageModifiedEventArgs(message)); + } + protected override void RemoveItem(int index) + { + HostApplicationMessage message = this[index]; + HostApplicationMessageModifyingEventArgs e = new HostApplicationMessageModifyingEventArgs(message); + OnMessageRemoving(e); + if (e.Cancel) return; + + base.RemoveItem(index); + + OnMessageRemoved(new HostApplicationMessageModifiedEventArgs(message)); + } + protected override void ClearItems() + { + base.ClearItems(); + OnMessagesCleared(EventArgs.Empty); + } + } + + private HostApplicationMessageSeverity mvarSeverity = HostApplicationMessageSeverity.None; + public HostApplicationMessageSeverity Severity { get { return mvarSeverity; } set { mvarSeverity = value; } } + + private string mvarDescription = String.Empty; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + + private string mvarFileName = null; + public string FileName { get { return mvarFileName; } set { mvarFileName = value; } } + + private int? mvarLineNumber = null; + public int? LineNumber { get { return mvarLineNumber; } set { mvarLineNumber = value; } } + + private int? mvarColumnNumber = null; + public int? ColumnNumber { get { return mvarColumnNumber; } set { mvarColumnNumber = value; } } + + private string mvarProjectName = null; + public string ProjectName { get { return mvarProjectName; } set { mvarProjectName = value; } } + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationOutputWindow.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationOutputWindow.cs new file mode 100644 index 00000000..66191b4d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/HostApplicationOutputWindow.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + /// + /// Handles the output window in Universal Editor. If the user is running a plugin which makes + /// use of these features in non-GUI mode, it will write to the console instead. + /// + public class HostApplicationOutputWindow + { + public event TextWrittenEventHandler TextWritten; + protected virtual void OnTextWritten(TextWrittenEventArgs e) + { + if (TextWritten != null) + { + TextWritten(this, e); + } + else + { + Console.Write(e.Text); + } + } + + public event EventHandler TextCleared; + protected virtual void OnTextCleared(EventArgs e) + { + if (TextCleared != null) + { + TextCleared(this, e); + } + else + { + Console.Clear(); + } + } + + public void Clear() + { + OnTextCleared(EventArgs.Empty); + } + public void Write(string text) + { + OnTextWritten(new TextWrittenEventArgs(text)); + } + public void WriteLine(string text) + { + Write(text + System.Environment.NewLine); + } + } + + public delegate void TextWrittenEventHandler(object sender, TextWrittenEventArgs e); + public class TextWrittenEventArgs + { + private string mvarText = String.Empty; + public string Text { get { return mvarText; } } + + public TextWrittenEventArgs(string text) + { + mvarText = text; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/IEditorImplementation.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/IEditorImplementation.cs new file mode 100644 index 00000000..43bd6ab3 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/IEditorImplementation.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + /// + /// Provides an interface for custom editor implementations not using the Universal Widget Toolkit. + /// + public interface IEditorImplementation + { + /// + /// Copies the selected content to the Universal Editor clipboard. + /// + void Copy(); + /// + /// Pastes the content from the Universal Editor clipboard, overwriting any selected content. + /// + void Paste(); + /// + /// Deletes the selected content. + /// + void Delete(); + + /// + /// Restores the previous object model in the stack. + /// + void Undo(); + /// + /// Restores the previously-undone object model from the stack. + /// + void Redo(); + + string Title { get; } + + event ToolboxItemEventHandler ToolboxItemAdded; + event ToolboxItemEventHandler ToolboxItemSelected; + + bool SelectToolboxItem(ToolboxItem item); + + EditorReference MakeReference(); + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/IHostApplicationWindow.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/IHostApplicationWindow.cs new file mode 100644 index 00000000..b898ef67 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/IHostApplicationWindow.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public interface IHostApplicationWindow + { + event EventHandler WindowClosed; + + void NewFile(); + void NewProject(bool combineObjects = false); + + void OpenFile(); + void OpenFile(params string[] fileNames); + void OpenFile(params Document[] documents); + void OpenProject(bool combineObjects = false); + void OpenProject(string FileName, bool combineObjects = false); + + void SaveFile(); + void SaveFileAs(); + void SaveFileAs(string FileName, DataFormat df); + + void SaveProject(); + void SaveProjectAs(); + void SaveProjectAs(string FileName, DataFormat df); + + void SaveAll(); + + /// + /// Switches the current window's perspective. + /// + /// The index of the perspective to switch to. + void SwitchPerspective(int index); + + void CloseFile(); + void CloseProject(); + void CloseWindow(); + + IEditorImplementation GetCurrentEditor(); + + bool FullScreen { get; set; } + + /// + /// Displays the "Options" dialog (on Windows, under the "Tools" menu; on Linux, under the "Edit" + /// menu, labeled as "Preferences"). + /// + /// True if the user accepted the dialog; false otherwise. + bool ShowOptionsDialog(); + + void ToggleMenuItemEnabled(string menuItemName, bool enabled); + void RefreshCommand(object nativeCommandObject); + + void UpdateStatus(string statusText); + + void UpdateProgress(bool visible); + void UpdateProgress(int minimum, int maximium, int value); + + void ActivateWindow(); + + void ShowStartPage(); + + /// + /// Shows or hides the window list based on the given options. + /// + /// True if the window list should be shown; false if the window list should be hidden. + /// True if the window list should be presented as a modal dialog; false if it should be presented as a popup (for example, during a window switch action). + void SetWindowListVisible(bool visible, bool modal); + } + public class IHostApplicationWindowCollection + : System.Collections.ObjectModel.Collection + { + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/IOptionPanelImplementation.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/IOptionPanelImplementation.cs new file mode 100644 index 00000000..b9e1e3db --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/IOptionPanelImplementation.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public interface IOptionPanelImplementation + { + void LoadSettings(); + void SaveSettings(); + void ResetSettings(); + + bool IsAvailable { get; } + + string[] OptionGroups { get; } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Language.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Language.cs new file mode 100644 index 00000000..778bf195 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Language.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class Language + { + public class LanguageCollection + : System.Collections.ObjectModel.Collection + { + public Language this[string ID] + { + get + { + foreach (Language language in this) + { + if (language.ID == ID) return language; + } + return null; + } + } + } + + private string mvarID = String.Empty; + public string ID { get { return mvarID; } set { mvarID = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private Dictionary mvarCommandTitles = new Dictionary(); + private Dictionary mvarStringTableEntries = new Dictionary(); + + public string GetCommandTitle(string id, string defaultValue = null) + { + if (mvarCommandTitles.ContainsKey(id)) return mvarCommandTitles[id]; + return defaultValue; + } + public void SetCommandTitle(string id, string value) + { + mvarCommandTitles[id] = value; + } + public string GetStringTableEntry(string id, string defaultValue = null) + { + if (mvarStringTableEntries.ContainsKey(id)) return mvarStringTableEntries[id]; + return defaultValue; + } + public void SetStringTableEntry(string id, string value) + { + mvarStringTableEntries[id] = value; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/MenuBar.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/MenuBar.cs new file mode 100644 index 00000000..1817b521 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/MenuBar.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class MenuBar + { + private MenuItem.MenuItemCollection mvarItems = new MenuItem.MenuItemCollection(); + public MenuItem.MenuItemCollection Items { get { return mvarItems; } } + } + + public abstract class MenuItem + { + public class MenuItemCollection + : System.Collections.ObjectModel.Collection + { + private System.Collections.Generic.Dictionary itemsByName = new Dictionary(); + + public ActionMenuItem Add(string name, string title) + { + return Add(name, title, null); + } + public ActionMenuItem Add(string name, string title, EventHandler onClick) + { + return Add(name, title, onClick, Count); + } + public ActionMenuItem Add(string name, string title, int position) + { + return Add(name, title, null, position); + } + public ActionMenuItem Add(string name, string title, EventHandler onClick, int position) + { + ActionMenuItem item = new ActionMenuItem(name, title); + if (onClick != null) + { + item.Click += onClick; + } + item.Position = position; + Add(item); + return item; + } + public SeparatorMenuItem AddSeparator() + { + return AddSeparator(Count); + } + public SeparatorMenuItem AddSeparator(int position) + { + SeparatorMenuItem item = new SeparatorMenuItem(); + item.Position = position; + item.Name = "separator__" + (Count + 1).ToString(); + Add(item); + return item; + } + + public MenuItem this[string name] + { + get + { + return itemsByName[name]; + } + } + + public bool Contains(string name) + { + return itemsByName.ContainsKey(name); + } + public bool Remove(string name) + { + if (itemsByName.ContainsKey(name)) + { + base.Remove(itemsByName[name]); + return true; + } + return false; + } + + protected override void InsertItem(int index, MenuItem item) + { + item.mvarParent = this; + base.InsertItem(index, item); + itemsByName.Add(item.Name, item); + } + protected override void RemoveItem(int index) + { + this[index].mvarParent = null; + itemsByName.Remove(this[index].Name); + base.RemoveItem(index); + } + + internal void UpdateName(MenuItem item, string oldName) + { + itemsByName.Remove(oldName); + itemsByName.Add(item.Name, item); + } + } + + private List mvarNativeControls = new List(); + public List NativeControls { get { return mvarNativeControls; } } + + private MenuItemCollection mvarParent = null; + + private string mvarName = String.Empty; + public string Name + { + get { return mvarName; } + set + { + string oldName = mvarName; mvarName = value; + if (mvarParent != null) + { + mvarParent.UpdateName(this, oldName); + } + } + } + + private int mvarPosition = -1; + public int Position { get { return mvarPosition; } set { mvarPosition = value; } } + + private bool mvarEnabled = true; + public bool Enabled + { + get { return mvarEnabled; } + set + { + mvarEnabled = value; + foreach (object NativeControl in mvarNativeControls) + { + HostApplication.CurrentWindow.RefreshCommand(NativeControl); + } + } + } + + private bool mvarVisible = true; + public bool Visible { get { return mvarVisible; } + set + { + mvarVisible = value; + foreach (object NativeControl in mvarNativeControls) + { + HostApplication.CurrentWindow.RefreshCommand(NativeControl); + } + } + } + } + public class ActionMenuItem : MenuItem + { + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private MenuItem.MenuItemCollection mvarItems = new MenuItem.MenuItemCollection(); + public MenuItem.MenuItemCollection Items { get { return mvarItems; } } + + private CommandDisplayStyle mvarDisplayStyle = CommandDisplayStyle.ImageOnly; + public CommandDisplayStyle DisplayStyle { get { return mvarDisplayStyle; } set { mvarDisplayStyle = value; } } + + public event EventHandler Click; + + public ActionMenuItem(string title) + { + base.Name = title; + mvarTitle = title; + } + public ActionMenuItem(string name, string title) + { + base.Name = name; + mvarTitle = title; + } + + + public void OnClick(EventArgs e) + { + if (Click != null) + { + Click(this, e); + } + } + } + public class SeparatorMenuItem : MenuItem + { + + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/ObjectModelChangingEvent.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/ObjectModelChangingEvent.cs new file mode 100644 index 00000000..4c0e9321 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/ObjectModelChangingEvent.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public delegate void ObjectModelChangingEventHandler(object sender, ObjectModelChangingEventArgs e); + public class ObjectModelChangingEventArgs : CancelEventArgs + { + private ObjectModel mvarOldObjectModel = null; + public ObjectModel OldObjectModel { get { return mvarOldObjectModel; } } + + private ObjectModel mvarNewObjectModel = null; + public ObjectModel NewObjectModel { get { return mvarNewObjectModel; } set { mvarNewObjectModel = value; } } + + public ObjectModelChangingEventArgs(ObjectModel oldObjectModel, ObjectModel newObjectModel) + { + mvarOldObjectModel = oldObjectModel; + mvarNewObjectModel = newObjectModel; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Perspective.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Perspective.cs new file mode 100644 index 00000000..9bea3e09 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Perspective.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class Perspective + { + public class PerspectiveCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarDescription = String.Empty; + public string Description { get { return mvarDescription; } set { mvarDescription = value; } } + + private List mvarObjectModels = new List(); + public List ObjectModels { get { return mvarObjectModels; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Properties/AssemblyInfo.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..e7168ed2 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Universal Editor User Interface")] +[assembly: AssemblyDescription("Common user interface components for all Universal Editor engines.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor")] +[assembly: AssemblyCopyright("Copyright ©2012-2014 Mike Becker's Software")] +[assembly: AssemblyTrademark("Licensed under the GNU General Public License, version 3.")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b6096ad7-2149-4a0e-ae2f-7d8586813c4d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/PropertyMapping.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/PropertyMapping.cs new file mode 100644 index 00000000..5084097d --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/PropertyMapping.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class PropertyMapping + { + public class PropertyMappingCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarControlName = String.Empty; + public string ControlName { get { return mvarControlName; } set { mvarControlName = value; } } + + private string mvarControlPropertyName = String.Empty; + public string ControlPropertyName { get { return mvarControlPropertyName; } set { mvarControlPropertyName = value; } } + + private string mvarObjectModelPropertyName = String.Empty; + public string ObjectModelPropertyName { get { return mvarObjectModelPropertyName; } set { mvarObjectModelPropertyName = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/RecentFileManager.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/RecentFileManager.cs new file mode 100644 index 00000000..bf484bc4 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/RecentFileManager.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Accessors; +using UniversalEditor; + +namespace UniversalEditor.UserInterface +{ + public class RecentFileManager + { + private System.Collections.Specialized.StringCollection mvarFileNames = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection FileNames { get { return mvarFileNames; } } + + private int mvarMaximumDocumentFileNames = 5; + public int MaximumDocumentFileNames { get { return mvarMaximumDocumentFileNames; } set { mvarMaximumDocumentFileNames = value; } } + + private string mvarDataFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "Mike Becker's Software", + "Universal Editor", + "RecentItems.xml" + }); + public string DataFileName { get { return mvarDataFileName; } set { mvarDataFileName = value; } } + + private Version mvarFormatVersion = new Version(1, 0); + + public void Load() + { + MarkupObjectModel mom = new MarkupObjectModel(); + XMLDataFormat xml = new XMLDataFormat(); + + if (!System.IO.File.Exists(mvarDataFileName)) return; + + Document doc = new Document(mom, xml, new FileAccessor(mvarDataFileName)); + + MarkupTagElement tagRecentItems = (mom.Elements["RecentItems"] as MarkupTagElement); + if (tagRecentItems == null) return; + + MarkupAttribute attVersion = tagRecentItems.Attributes["Version"]; + if (attVersion != null) + { + mvarFormatVersion = new Version(attVersion.Value); + } + + MarkupTagElement tagSolutions = (tagRecentItems.Elements["Solutions"] as MarkupTagElement); + + MarkupTagElement tagDocuments = (tagRecentItems.Elements["Documents"] as MarkupTagElement); + if (tagDocuments != null) + { + foreach (MarkupElement elDocument in tagDocuments.Elements) + { + MarkupTagElement tagDocument = (elDocument as MarkupTagElement); + if (tagDocument == null) continue; + if (tagDocument.FullName != "Document") continue; + + MarkupAttribute attFileName = tagDocument.Attributes["FileName"]; + if (attFileName == null) continue; + + mvarFileNames.Add(attFileName.Value); + } + } + } + public void Save() + { + MarkupObjectModel mom = new MarkupObjectModel(); + XMLDataFormat xml = new XMLDataFormat(); + + MarkupPreprocessorElement xmlp = new MarkupPreprocessorElement(); + xmlp.FullName = "xml"; + xmlp.Value = "version=\"1.0\" encoding=\"UTF-8\""; + mom.Elements.Add(xmlp); + + MarkupTagElement tagRecentItems = new MarkupTagElement(); + tagRecentItems.FullName = "RecentItems"; + tagRecentItems.Attributes.Add("Version", mvarFormatVersion.ToString()); + + mom.Elements.Add(tagRecentItems); + + if (mvarFileNames.Count > 0) + { + MarkupTagElement tagDocuments = new MarkupTagElement(); + tagDocuments.FullName = "Documents"; + tagDocuments.Attributes.Add("Maximum", mvarMaximumDocumentFileNames.ToString()); + foreach (string fileName in mvarFileNames) + { + MarkupTagElement tagDocument = new MarkupTagElement(); + tagDocument.FullName = "Document"; + tagDocument.Attributes.Add("FileName", fileName); + tagDocuments.Elements.Add(tagDocument); + } + tagRecentItems.Elements.Add(tagDocuments); + } + + string dir = System.IO.Path.GetDirectoryName (mvarDataFileName); + if (!System.IO.Directory.Exists (dir)) + { + System.IO.Directory.CreateDirectory (dir); + } + + Document.Save(mom, xml, new FileAccessor(mvarDataFileName, true, true), true); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/SessionManager.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/SessionManager.cs new file mode 100644 index 00000000..6ba4521e --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/SessionManager.cs @@ -0,0 +1,251 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Accessors; +using UniversalEditor; + +namespace UniversalEditor.UserInterface +{ + public class SessionManager + { + public class Window + { + public class WindowCollection + : System.Collections.ObjectModel.Collection + { + } + + private int mvarLeft = 0; + public int Left { get { return mvarLeft; } set { mvarLeft = value; } } + + private int mvarTop = 0; + public int Top { get { return mvarTop; } set { mvarTop = value; } } + + private int mvarWidth = 0; + public int Width { get { return mvarWidth; } set { mvarWidth = value; } } + + private int mvarHeight = 0; + public int Height { get { return mvarHeight; } set { mvarHeight = value; } } + + private WindowState mvarWindowState = WindowState.Normal; + public WindowState WindowState { get { return mvarWindowState; } set { mvarWindowState = value; } } + + private List mvarDocuments = new List(); + public List Documents { get { return mvarDocuments; } } + + } + public class Session + { + public class SessionCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private Window.WindowCollection mvarWindows = new Window.WindowCollection(); + public Window.WindowCollection Windows { get { return mvarWindows; } } + } + + private string mvarDataFileName = String.Join(System.IO.Path.DirectorySeparatorChar.ToString(), new string[] + { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "Mike Becker's Software", + "Universal Editor", + "Sessions.xml" + }); + public string DataFileName { get { return mvarDataFileName; } set { mvarDataFileName = value; } } + + private Session.SessionCollection mvarSessions = new Session.SessionCollection(); + public Session.SessionCollection Sessions { get { return mvarSessions; } } + + private Version mvarFormatVersion = new Version(1, 0); + + public void Load() + { + MarkupObjectModel mom = new MarkupObjectModel(); + XMLDataFormat xml = new XMLDataFormat(); + + if (!System.IO.File.Exists(mvarDataFileName)) return; + + Document.Load(mom, xml, new FileAccessor(mvarDataFileName), true); + + MarkupTagElement tagSessions = (mom.Elements["Sessions"] as MarkupTagElement); + if (tagSessions == null) return; + + MarkupAttribute attVersion = tagSessions.Attributes["Version"]; + if (attVersion != null) + { + mvarFormatVersion = new Version(attVersion.Value); + } + + foreach (MarkupElement elSession in tagSessions.Elements) + { + MarkupTagElement tagSession = (elSession as MarkupTagElement); + if (tagSession == null) continue; + if (tagSession.FullName != "Session") continue; + + MarkupAttribute attTitle = tagSession.Attributes["Title"]; + if (attTitle == null) continue; + + Session session = new Session(); + session.Title = attTitle.Value; + + MarkupTagElement tagWindows = (tagSession.Elements["Windows"] as MarkupTagElement); + foreach (MarkupElement elWindow in tagWindows.Elements) + { + MarkupTagElement tagWindow = (elWindow as MarkupTagElement); + if (tagWindow == null) continue; + if (tagWindow.FullName != "Window") continue; + + Window window = new Window(); + + int left = 0, top = 0, width = 600, height = 400; + + MarkupAttribute attLeft = tagWindow.Attributes["Left"]; + if (attLeft != null) Int32.TryParse(attLeft.Value, out left); + MarkupAttribute attTop = tagWindow.Attributes["Top"]; + if (attTop != null) Int32.TryParse(attTop.Value, out top); + MarkupAttribute attWidth = tagWindow.Attributes["Width"]; + if (attWidth != null) Int32.TryParse(attWidth.Value, out width); + MarkupAttribute attHeight = tagWindow.Attributes["Height"]; + if (attHeight != null) Int32.TryParse(attHeight.Value, out height); + + window.Left = left; + window.Top = top; + window.Width = width; + window.Height = height; + + MarkupTagElement tagDocuments = (tagWindow.Elements["Documents"] as MarkupTagElement); + if (tagDocuments != null) + { + foreach (MarkupElement elDocument in tagDocuments.Elements) + { + MarkupTagElement tagDocument = (elDocument as MarkupTagElement); + if (tagDocument == null) continue; + if (tagDocument.FullName != "Document") continue; + + // TODO: Implement accessor agnosticism in Session Manager!!! +#if DEBUG + throw new NotImplementedException(); +#endif + + /* + MarkupAttribute attFileName = tagDocument.Attributes["FileName"]; + if (attFileName == null) continue; + + window.Documents.Add(attFileName.Value); + */ + } + } + + session.Windows.Add(window); + } + + mvarSessions.Add(session); + } + } + public void Save() + { + MarkupObjectModel mom = new MarkupObjectModel(); + UniversalEditor.ObjectModel om = mom; + + XMLDataFormat xml = new XMLDataFormat(); + + MarkupPreprocessorElement xmlp = new MarkupPreprocessorElement(); + xmlp.FullName = "xml"; + xmlp.Value = "version=\"1.0\" encoding=\"UTF-8\""; + mom.Elements.Add(xmlp); + + MarkupTagElement tagSessions = new MarkupTagElement(); + tagSessions.FullName = "Sessions"; + tagSessions.Attributes.Add("Version", mvarFormatVersion.ToString()); + + mom.Elements.Add(tagSessions); + + if (mvarSessions.Count > 0) + { + foreach (Session session in mvarSessions) + { + if (session.Windows.Count < 1) continue; + + MarkupTagElement tagSession = new MarkupTagElement(); + tagSession.FullName = "Session"; + + tagSession.Attributes.Add("Title", session.Title); + + MarkupTagElement tagWindows = new MarkupTagElement(); + tagWindows.FullName = "Windows"; + + foreach (Window window in session.Windows) + { + MarkupTagElement tagWindow = new MarkupTagElement(); + tagWindow.FullName = "Window"; + + tagWindow.Attributes.Add("Left", window.Left.ToString()); + tagWindow.Attributes.Add("Top", window.Top.ToString()); + tagWindow.Attributes.Add("Width", window.Width.ToString()); + tagWindow.Attributes.Add("Height", window.Height.ToString()); + + if (window.Documents.Count > 0) + { + MarkupTagElement tagDocuments = new MarkupTagElement(); + tagDocuments.FullName = "Documents"; + foreach (Document document in window.Documents) + { + MarkupTagElement tagDocument = new MarkupTagElement(); + tagDocument.FullName = "Document"; + +#if DEBUG + throw new NotImplementedException("Implement accessor agnosticism in Session Manager"); +#endif + + // We need to store information about the ObjectModel and DataFormat + // if the document has not been saved yet. + if (document.ObjectModel != null) + { + MarkupTagElement tagObjectModel = new MarkupTagElement(); + tagObjectModel.FullName = "ObjectModel"; + + ObjectModelReference omr = document.ObjectModel.MakeReference(); + if (omr.TypeName != null) + { + tagObjectModel.Attributes.Add("TypeName", omr.TypeName); + } + if (omr.ID != Guid.Empty) + { + tagObjectModel.Attributes.Add("ID", omr.ID.ToString("B")); + } + + tagDocument.Elements.Add(tagObjectModel); + } + + // tagDocument.Attributes.Add("FileName", fileName); + tagDocuments.Elements.Add(tagDocument); + } + tagWindow.Elements.Add(tagDocuments); + } + + tagWindows.Elements.Add(tagWindow); + } + tagSession.Elements.Add(tagWindows); + + tagSessions.Elements.Add(tagSession); + } + } + + string dir = System.IO.Path.GetDirectoryName (mvarDataFileName); + if (!System.IO.Directory.Exists (dir)) + { + System.IO.Directory.CreateDirectory (dir); + } + + Document.Save(om, xml, new FileAccessor(mvarDataFileName, true, true), true); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Settings/SettingsManager.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Settings/SettingsManager.cs new file mode 100644 index 00000000..5b5818ee --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Settings/SettingsManager.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface.Settings +{ + public static class SettingsManager + { + public static T GetPropertyValue(string[] path, T defaultValue = default(T)) + { + return defaultValue; + } + public static void SetPropertyValue(string[] path, T value) + { + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/SingleInstanceManager.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/SingleInstanceManager.cs new file mode 100644 index 00000000..ee26a2b8 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/SingleInstanceManager.cs @@ -0,0 +1,123 @@ +using System; +using System.Security.Permissions; +using System.Threading; +using System.Runtime.Remoting.Channels; +using System.Runtime.Remoting; +using System.Diagnostics; +using System.Runtime.Remoting.Channels.Ipc; + +internal static class SingleInstanceManager +{ + [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] + [Serializable] + private class InstanceProxy : MarshalByRefObject + { + public static bool IsFirstInstance + { + get; + internal set; + } + public static string[] CommandLineArgs + { + get; + internal set; + } + public void SetCommandLineArgs(bool isFirstInstance, string[] commandLineArgs) + { + SingleInstanceManager.InstanceProxy.IsFirstInstance = isFirstInstance; + SingleInstanceManager.InstanceProxy.CommandLineArgs = commandLineArgs; + } + } + public class InstanceCallbackEventArgs : EventArgs + { + public bool IsFirstInstance + { + get; + private set; + } + public string[] CommandLineArgs + { + get; + private set; + } + internal InstanceCallbackEventArgs(bool isFirstInstance, string[] commandLineArgs) + { + this.IsFirstInstance = isFirstInstance; + this.CommandLineArgs = commandLineArgs; + } + } + public static bool CreateSingleInstance(string name, EventHandler callback) + { + bool result; + switch (Environment.OSVersion.Platform) + { + case PlatformID.Unix: + case PlatformID.Xbox: + case PlatformID.MacOSX: + result = true; + return result; + } + name = name.Replace("\\", "_"); + name = name.Replace("/", "_"); + EventWaitHandle eventWaitHandle = null; + string name2 = string.Format("{0}-{1}", Environment.MachineName, name); + SingleInstanceManager.InstanceProxy.IsFirstInstance = false; + SingleInstanceManager.InstanceProxy.CommandLineArgs = Environment.GetCommandLineArgs(); + try + { + eventWaitHandle = EventWaitHandle.OpenExisting(name2); + } + catch + { + SingleInstanceManager.InstanceProxy.IsFirstInstance = true; + } + if (SingleInstanceManager.InstanceProxy.IsFirstInstance) + { + eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, name2); + ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, new WaitOrTimerCallback(SingleInstanceManager.WaitOrTimerCallback), callback, -1, false); + eventWaitHandle.Close(); + SingleInstanceManager.RegisterRemoteType(name); + } + else + { + SingleInstanceManager.UpdateRemoteObject(name); + if (eventWaitHandle != null) + { + eventWaitHandle.Set(); + } + Environment.Exit(0); + } + result = SingleInstanceManager.InstanceProxy.IsFirstInstance; + return result; + } + private static void UpdateRemoteObject(string uri) + { + IpcClientChannel chnl = new IpcClientChannel(); + ChannelServices.RegisterChannel(chnl, true); + SingleInstanceManager.InstanceProxy instanceProxy = Activator.GetObject(typeof(SingleInstanceManager.InstanceProxy), string.Format("ipc://{0}{1}/{1}", Environment.MachineName, uri)) as SingleInstanceManager.InstanceProxy; + if (instanceProxy != null) + { + instanceProxy.SetCommandLineArgs(SingleInstanceManager.InstanceProxy.IsFirstInstance, SingleInstanceManager.InstanceProxy.CommandLineArgs); + } + ChannelServices.UnregisterChannel(chnl); + } + private static void RegisterRemoteType(string uri) + { + IpcServerChannel serverChannel = new IpcServerChannel(Environment.MachineName + uri); + ChannelServices.RegisterChannel(serverChannel, true); + RemotingConfiguration.RegisterWellKnownServiceType(typeof(SingleInstanceManager.InstanceProxy), uri, WellKnownObjectMode.Singleton); + Process currentProcess = Process.GetCurrentProcess(); + currentProcess.Exited += delegate + { + ChannelServices.UnregisterChannel(serverChannel); + }; + } + private static void WaitOrTimerCallback(object state, bool timedOut) + { + EventHandler eventHandler = state as EventHandler; + if (eventHandler != null) + { + eventHandler(state, new SingleInstanceManager.InstanceCallbackEventArgs(SingleInstanceManager.InstanceProxy.IsFirstInstance, SingleInstanceManager.InstanceProxy.CommandLineArgs)); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/StockCommandType.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/StockCommandType.cs new file mode 100644 index 00000000..6b1b38f6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/StockCommandType.cs @@ -0,0 +1,9 @@ +using System; +namespace UniversalEditor.UserInterface +{ + public enum StockCommandType + { + None + } +} + diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbar.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbar.cs new file mode 100644 index 00000000..076b470c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbar.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public class Toolbar + { + public class ToolbarCollection + : System.Collections.ObjectModel.Collection + { + public Toolbar Add(string name) + { + return Add(name, name); + } + public Toolbar Add(string name, string title) + { + Toolbar tb = new Toolbar(); + tb.Name = name; + tb.Title = title; + Add(tb); + return tb; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private MenuItem.MenuItemCollection mvarItems = new MenuItem.MenuItemCollection(); + public MenuItem.MenuItemCollection Items { get { return mvarItems; } } + + private bool mvarVisible = true; + public bool Visible { get { return mvarVisible; } set { mvarVisible = value; } } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbox.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbox.cs new file mode 100644 index 00000000..49719a5c --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/Toolbox.cs @@ -0,0 +1,107 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 8/18/2013 + * Time: 6:22 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.ComponentModel; + +namespace UniversalEditor.UserInterface +{ + /// + /// Description of Toolbox. + /// + public sealed class Toolbox + { + private ToolboxItem.ToolboxItemCollection mvarItems = new ToolboxItem.ToolboxItemCollection(); + public ToolboxItem.ToolboxItemCollection Items { get { return mvarItems; } } + } + public abstract class ToolboxItem + { + public sealed class ToolboxItemCollection + : System.Collections.ObjectModel.Collection + { + public ToolboxCommandItem AddCommand(string name) + { + return AddCommand(name, name); + } + public ToolboxCommandItem AddCommand(string name, string title) + { + return AddCommand(name, title, null); + } + public ToolboxCommandItem AddCommand(string name, string title, string imageFileName) + { + ToolboxCommandItem item = new ToolboxCommandItem(name, title, imageFileName); + Add(item); + return item; + } + + public ToolboxGroupItem AddGroup(string name) + { + return AddGroup(name, name); + } + public ToolboxGroupItem AddGroup(string name, string title) + { + ToolboxGroupItem group = new ToolboxGroupItem(name, title); + Add(group); + return group; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private ToolboxGroupItem mvarParent = null; + public ToolboxGroupItem Parent { get { return mvarParent; } set { mvarParent = value; } } + + public ToolboxItem(string name) + { + mvarName = name; + } + } + public class ToolboxGroupItem : ToolboxItem + { + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private ToolboxItem.ToolboxItemCollection mvarItems = new ToolboxItem.ToolboxItemCollection(); + public ToolboxItem.ToolboxItemCollection Items { get { return mvarItems; } } + + public ToolboxGroupItem(string name, string title) : base(name) + { + mvarTitle = title; + } + } + public class ToolboxCommandItem : ToolboxItem + { + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarImageFileName = String.Empty; + public string ImageFileName { get { return mvarImageFileName; } set { mvarImageFileName = value; } } + + public ToolboxCommandItem(string name, string title, string imageFileName = "") : base(name) + { + mvarTitle = title; + mvarImageFileName = imageFileName; + } + } + + public delegate void ToolboxItemEventHandler(object sender, ToolboxItemEventArgs e); + /// + /// Contains the toolbox item that is responsible for the toolbox item event. + /// + public class ToolboxItemEventArgs : CancelEventArgs + { + private ToolboxItem mvarItem = null; + public ToolboxItem Item { get { return mvarItem; } } + + public ToolboxItemEventArgs(ToolboxItem item) + { + mvarItem = item; + } + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj b/CSharp/V5/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj new file mode 100644 index 00000000..c855acdd --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj @@ -0,0 +1,126 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {8622EBC4-8E20-476E-B284-33D472081F5C} + Library + Properties + UniversalEditor.UserInterface + UniversalEditor.UserInterface + v4.0 + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + true + full + false + ..\..\Output\Debug\ + DEBUG;TRACE + prompt + 4 + AllRules.ruleset + + + none + true + ..\..\Output\Release\ + TRACE + prompt + 4 + AllRules.ruleset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467e5c-05bc-4856-aadc-13906ef4cadd} + UniversalEditor.Essential + + + + + \ No newline at end of file diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/UnsavedDocumentOption.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/UnsavedDocumentOption.cs new file mode 100644 index 00000000..9137ef0a --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/UnsavedDocumentOption.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public enum UnsavedDocumentOption + { + Save, + Discard + } +} diff --git a/CSharp/V5/Libraries/UniversalEditor.UserInterface/WindowState.cs b/CSharp/V5/Libraries/UniversalEditor.UserInterface/WindowState.cs new file mode 100644 index 00000000..4b5006d6 --- /dev/null +++ b/CSharp/V5/Libraries/UniversalEditor.UserInterface/WindowState.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.UserInterface +{ + public enum WindowState + { + Hidden = 0, + Normal = 1, + Minimized = 2, + Maximized = 3 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Color.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Color.cs new file mode 100644 index 00000000..96a1fa4b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Color.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor +{ + public struct Color + { + private double mvarRed; + public double Red { get { return mvarRed; } set { mvarRed = value; } } + + private double mvarGreen; + public double Green { get { return mvarGreen; } set { mvarGreen = value; } } + + private double mvarBlue; + public double Blue { get { return mvarBlue; } set { mvarBlue = value; } } + + private double mvarAlpha; + public double Alpha { get { return mvarAlpha; } set { mvarAlpha = value; } } + + public static readonly Color Empty; + + public override bool Equals(object obj) + { + if (obj is Color) + { + Color color = (Color)obj; + return ((mvarRed == color.mvarRed) && (mvarGreen == color.mvarGreen) && (mvarBlue == color.mvarBlue) && (mvarAlpha == color.mvarAlpha)); + } + return false; + } + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public static Color FromRGBA(double red, double green, double blue, double alpha = 1.0) + { + Color color = new Color(); + color.Red = red; + color.Green = green; + color.Blue = blue; + color.Alpha = alpha; + return color; + } + public static Color FromRGBA(float red, float green, float blue, float alpha = 1.0f) + { + Color color = new Color(); + color.Red = red; + color.Green = green; + color.Blue = blue; + color.Alpha = alpha; + return color; + } + public static Color FromRGBA(byte red, byte green, byte blue, byte alpha = 255) + { + Color color = new Color(); + color.Red = ((double)red / 255); + color.Green = ((double)green / 255); + color.Blue = ((double)blue / 255); + color.Alpha = ((double)alpha / 255); + return color; + } + public static Color FromRGBA(int red, int green, int blue, int alpha = 255) + { + Color color = new Color(); + color.Red = ((double)red / 255); + color.Green = ((double)green / 255); + color.Blue = ((double)blue / 255); + color.Alpha = ((double)alpha / 255); + return color; + } + + public float[] ToFloatRGB() + { + return new float[] { (float)mvarRed, (float)mvarGreen, (float)mvarBlue }; + } + public float[] ToFloatRGBA() + { + return new float[] { (float)mvarRed, (float)mvarGreen, (float)mvarBlue, (float)mvarAlpha }; + } + + public int ToInt32() + { + byte a = (byte)(mvarAlpha * 255); + byte r = (byte)(mvarRed * 255); + byte g = (byte)(mvarGreen * 255); + byte b = (byte)(mvarBlue * 255); + return (((a | (r << 8)) | (g << 0x10)) | (b << 0x18)); + } + + public int CompareTo(Color other) + { + int thisVal = ToInt32(); + int otherVal = other.ToInt32(); + return thisVal.CompareTo(otherVal); + } + + public static bool operator ==(Color left, Color right) + { + return left.Equals(right); + } + public static bool operator !=(Color left, Color right) + { + return !left.Equals(right); + } + } + public static class Colors + { + private static Color m_White = Color.FromRGBA(255, 255, 255); + public static Color White { get { return m_White; } } + private static Color m_Black = Color.FromRGBA(0, 0, 0); + public static Color Black { get { return m_Black; } } + private static Color m_Transparent = Color.FromRGBA(255, 255, 255, 0); + public static Color Transparent { get { return m_Transparent; } } + + private static Color m_DarkBlue = Color.FromRGBA(0, 0, 64, 255); + public static Color DarkBlue { get { return m_DarkBlue; } } + + private static Color m_Red = Color.FromRGBA(255, 0, 0); + public static Color Red { get { return m_Red; } } + private static Color m_Green = Color.FromRGBA(0, 255, 0); + public static Color Green { get { return m_Green; } } + private static Color m_Blue = Color.FromRGBA(0, 0, 255); + public static Color Blue { get { return m_Blue; } } + + private static Color m_Cyan = Color.FromRGBA(0, 255, 255); + public static Color Cyan { get { return m_Cyan; } } + + private static Color m_LightGreen = Color.FromRGBA(144, 238, 144); + public static Color LightGreen { get { return m_LightGreen; } } + private static Color m_Coral = Color.FromRGBA(255, 127, 80); + public static Color Coral { get { return m_Coral; } } + private static Color m_LightGoldenrodYellow = Color.FromRGBA(250, 250, 210); + public static Color LightGoldenrodYellow { get { return m_LightGoldenrodYellow; } } + private static Color m_LightGray = Color.FromRGBA(211, 211, 211); + public static Color LightGray { get { return m_LightGray; } } + private static Color m_Silver = Color.FromRGBA(192, 192, 192); + public static Color Silver { get { return m_Silver; } } + private static Color m_DarkGray = Color.FromRGBA(128, 128, 128); + public static Color DarkGray { get { return m_DarkGray; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSCompressedDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSCompressedDataFormat.cs new file mode 100644 index 00000000..b1ae216e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSCompressedDataFormat.cs @@ -0,0 +1,31 @@ +using System; +using UniversalEditor.Compression; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Project; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Project.LMMS +{ + public class LMMSCompressedDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Linux MultiMedia Studio (LMMS) project (compressed)", new string[] { "*.mmpz" }); + dfr.Capabilities.Add(typeof(AudioProjectObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + byte[] input = br.ReadToEnd(); + byte[] output = CompressionStream.Decompress(CompressionMethod.Gzip, input); + LMMSProjectDataFormat mmp = new LMMSProjectDataFormat(); + mmp.Open(ref output); + mmp.Load(ref objectModel); + mmp.Close(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSProjectDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSProjectDataFormat.cs new file mode 100644 index 00000000..b2bd385d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Project/LMMS/LMMSProjectDataFormat.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Project; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Project.LMMS +{ + public class LMMSProjectDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("Linux MultiMedia Studio Project", new string[] { "*.mmp" }); + dfr.Capabilities.Add(typeof(AudioProjectObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + MarkupObjectModel mom = new MarkupObjectModel(); + objectModels.Push(mom); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + AudioProjectObjectModel seq = objectModels.Pop() as AudioProjectObjectModel; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommand.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommand.cs new file mode 100644 index 00000000..5a4f4c30 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommand.cs @@ -0,0 +1,130 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.MIDI +{ + public class MIDICommand + { + private byte mvarChannel = 0; + private byte mvarCommand = 0; + public MIDICommandType CommandType + { + get + { + MIDICommandType result; + switch (this.mvarCommand) + { + case 0: + { + result = MIDICommandType.None; + return result; + } + case 8: + { + result = MIDICommandType.NoteOff; + return result; + } + case 9: + { + result = MIDICommandType.NoteOn; + return result; + } + case 10: + { + result = MIDICommandType.KeyAfterTouch; + return result; + } + case 11: + { + result = MIDICommandType.ControlChange; + return result; + } + case 12: + { + result = MIDICommandType.ProgramChange; + return result; + } + case 13: + { + result = MIDICommandType.ChannelAfterTouch; + return result; + } + case 14: + { + result = MIDICommandType.PitchWheelChange; + return result; + } + } + result = MIDICommandType.Unknown; + return result; + } + set + { + switch (value) + { + case MIDICommandType.None: + { + this.mvarCommand = 0; + return; + } + case MIDICommandType.NoteOff: + { + this.mvarCommand = 8; + return; + } + case MIDICommandType.NoteOn: + { + this.mvarCommand = 9; + return; + } + case MIDICommandType.KeyAfterTouch: + { + this.mvarCommand = 10; + return; + } + case MIDICommandType.ControlChange: + { + this.mvarCommand = 11; + return; + } + case MIDICommandType.ProgramChange: + { + this.mvarCommand = 12; + return; + } + case MIDICommandType.ChannelAfterTouch: + { + this.mvarCommand = 13; + return; + } + case MIDICommandType.PitchWheelChange: + { + this.mvarCommand = 14; + return; + } + } + this.mvarCommand = 0; + } + } + public byte Channel + { + get + { + return this.mvarChannel; + } + set + { + this.mvarChannel = value; + } + } + public byte Command + { + get + { + return this.mvarCommand; + } + set + { + this.mvarCommand = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommandType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommandType.cs new file mode 100644 index 00000000..7d8ca34b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDICommandType.cs @@ -0,0 +1,16 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.MIDI +{ + public enum MIDICommandType + { + Unknown = -1, + None, + NoteOff = 8, + NoteOn, + KeyAfterTouch, + ControlChange, + ProgramChange, + ChannelAfterTouch, + PitchWheelChange + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDIDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDIDataFormat.cs new file mode 100644 index 00000000..8d257334 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MIDI/MIDIDataFormat.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.MIDI +{ + public class MIDIDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Music Instrument Digital Interface sequence", new byte?[][] { new byte?[] { (byte)'M', (byte)'T', (byte)'h', (byte)'d' } }, new string[] { "*.mid", "*.midi", "*.rmi" }); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + SynthesizedAudioObjectModel syn = objectModel as SynthesizedAudioObjectModel; + string MThd = br.ReadFixedLengthString(4); + int headerSize = br.ReadInt32(); + short fileFormat = br.ReadInt16(); + short trackCount = br.ReadInt16(); + short ticksPerQuarterNote = br.ReadInt16(); + for (short i = 0; i < trackCount; i += 1) + { + string MTrk = br.ReadFixedLengthString(4); + int trackLength = br.ReadInt32(); + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + long position = br.BaseStream.Position; + while (br.BaseStream.Position - position < (long)trackLength) + { + int deltaTime = br.ReadVariableLengthInt32(); + byte command = br.ReadByte(); + if (command == 255) + { + byte metaEventType = br.ReadByte(); + byte b = metaEventType; + if (b <= 47) + { + switch (b) + { + case 1: + { + byte length = br.ReadByte(); + string text = br.ReadFixedLengthString(length); + track.Commands.Add(new SynthesizedAudioCommandText(text)); + break; + } + case 2: + { + break; + } + case 3: + { + byte length = br.ReadByte(); + string text = br.ReadFixedLengthString(length); + track.Name = text; + break; + } + default: + { + if (b == 47) + { + byte endOfTrackMarker = br.ReadByte(); + syn.Tracks.Add(track); + } + break; + } + } + } + else + { + if (b != 81) + { + if (b == 88) + { + byte zero4 = br.ReadByte(); + byte numerator = br.ReadByte(); + byte denominator = (byte)Math.Pow(2.0, (double)br.ReadByte()); + byte ticksPerMetronomeClick = br.ReadByte(); + byte numberOf32ndNotesPerQuarterNote = br.ReadByte(); + track.Commands.Add(new SynthesizedAudioCommandTimeSignature(numerator, denominator, ticksPerMetronomeClick, numberOf32ndNotesPerQuarterNote)); + } + } + else + { + byte zero5 = br.ReadByte(); + int tempo = (int)br.ReadInt16(); + int tempo2 = (int)br.ReadByte(); + int tempo3 = tempo + tempo2; + track.Commands.Add(new SynthesizedAudioCommandTempo((double)tempo3)); + } + } + } + } + } + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + SynthesizedAudioTrack trkControl = au.Tracks["Control"]; + if (trkControl != null) + { + bool inSettingsBlock = false; + foreach (SynthesizedAudioCommand cmd in trkControl.Commands) + { + if (!(cmd is SynthesizedAudioCommandTempo)) + { + if (!(cmd is SynthesizedAudioCommandTimeSignature)) + { + if (cmd is SynthesizedAudioCommandText) + { + SynthesizedAudioCommandText text = cmd as SynthesizedAudioCommandText; + if (text.Text == "Settings") + { + inSettingsBlock = true; + } + else + { + if (inSettingsBlock && text.Text.StartsWith("@rem project=")) + { + au.Information.SongTitle = text.Text.Substring(13); + } + else + { + if (inSettingsBlock && text.Text.StartsWith("@set tempo=")) + { + double tempo = double.Parse(text.Text.Substring(11)); + } + } + } + } + } + } + } + } + } + [ImplementationStatus(ImplementationStatus.NotImplemented)] + protected override void SaveInternal(ObjectModel objectModel) + { + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs new file mode 100644 index 00000000..6f7a6e50 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.Common; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Voicebank; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.MusicXML +{ + public class MusicXMLDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("MusicXML markup", new string[] { "*.mxl" }); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + MarkupObjectModel mom = new MarkupObjectModel(); + objectModels.Push(mom); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + MarkupTagElement score_partwise = (mom.FindElement("score-partwise") as MarkupTagElement); + if (score_partwise != null) + { + foreach (MarkupElement el in score_partwise.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + SynthesizedAudioTrack currentTrack = null; + string text = tag.Name; + if (text != null) + { + if (!(text == "part-list")) + { + if (text == "part") + { + if (tag.Attributes["id"] != null) + { + currentTrack = au.Tracks[tag.Attributes["id"].Value]; + if (currentTrack != null) + { + foreach (MarkupElement el2 in tag.Elements) + { + MarkupTagElement tag2 = el2 as MarkupTagElement; + if (tag2.Name == "measure") + { + foreach (MarkupElement elMeasureItem in tag2.Elements) + { + MarkupTagElement tagMeasureItem = elMeasureItem as MarkupTagElement; + if (tagMeasureItem != null) + { + text = tagMeasureItem.Name; + if (text != null) + { + if (!(text == "attributes")) + { + if (text == "note") + { + SynthesizedAudioCommandNote note = new SynthesizedAudioCommandNote(); + foreach (MarkupElement elNoteItem in tagMeasureItem.Elements) + { + MarkupTagElement tagNoteItem = elNoteItem as MarkupTagElement; + if (tagNoteItem != null) + { + MarkupElement elPhoneme = tagNoteItem.FindElement("sing", "phoneme"); + MarkupElement elLyric = tagNoteItem.FindElement("sing", "lyric"); + if (elPhoneme != null) + { + note.Phoneme = elPhoneme.Value; + } + if (elLyric != null) + { + note.Lyric = elLyric.Value; + } + } + } + currentTrack.Commands.Add(note); + } + } + } + } + } + } + } + } + } + } + } + else + { + foreach (MarkupElement elScorePart in tag.Elements) + { + if (elScorePart is MarkupTagElement) + { + MarkupTagElement tagScorePart = elScorePart as MarkupTagElement; + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + if (tagScorePart.Attributes["id"] != null) + { + track.ID = tagScorePart.Attributes["id"].Value; + } + foreach (MarkupElement elTagScorePartChild in tagScorePart.Elements) + { + if (elTagScorePartChild is MarkupTagElement) + { + MarkupTagElement tag_elTagScorePartChild = elTagScorePartChild as MarkupTagElement; + text = tag_elTagScorePartChild.Name; + if (text != null) + { + if (!(text == "part-name")) + { + if (text == "link") + { + if (tag_elTagScorePartChild.Attributes["rel"] != null) + { + text = tag_elTagScorePartChild.Attributes["rel"].Value; + if (text != null) + { + if (text == "synthesizer") + { + if (FileName != null) + { + track.Synthesizer = Reflection.GetAvailableObjectModel(Path.MakeAbsolutePath(tag_elTagScorePartChild.Attributes["href"].Value, System.IO.Path.GetDirectoryName(FileName))); + } + } + } + } + } + } + else + { + track.Name = tag_elTagScorePartChild.Value; + } + } + } + } + au.Tracks.Add(track); + } + } + } + } + } + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/NIFF/NIFFDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/NIFF/NIFFDataFormat.cs new file mode 100644 index 00000000..3f0a2811 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/NIFF/NIFFDataFormat.cs @@ -0,0 +1,17 @@ +using System; +using UniversalEditor.DataFormats.Chunked; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.NIFF +{ + public class NIFFDataFormat : RIFFDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Notation Interchange File Format", new byte?[][] { new byte?[] { new byte?(82), new byte?(73), new byte?(70), new byte?(88), null, null, null, null, new byte?(78), new byte?(73), new byte?(70), new byte?(70) } }, new string[] { "*.nif" }); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/SPC/SPC700DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/SPC/SPC700DataFormat.cs new file mode 100644 index 00000000..484b0139 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/SPC/SPC700DataFormat.cs @@ -0,0 +1,156 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.SPC +{ + public class SPC700DataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("SNES-SPC700 sound file", new byte?[][] { new byte?[] { new byte?(83), new byte?(78), new byte?(69), new byte?(83), new byte?(45), new byte?(83), new byte?(80), new byte?(67), new byte?(55), new byte?(48), new byte?(48), new byte?(32), new byte?(83), new byte?(111), new byte?(117), new byte?(110), new byte?(100), new byte?(32), new byte?(70), new byte?(105), new byte?(108), new byte?(101), new byte?(32), new byte?(68), new byte?(97), new byte?(116), new byte?(97) } }, new string[] { "*.spc" }); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private byte[] mvarID666Reserved = new byte[45]; + public byte[] ID666Reserved { get { return mvarID666Reserved; } set { mvarID666Reserved = value; } } + private byte mvarID666DefaultChannelDisables = 0; + public byte ID666DefaultChannelDisables { get { return mvarID666DefaultChannelDisables; } set { mvarID666DefaultChannelDisables = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + SynthesizedAudioObjectModel au = (objectModel as SynthesizedAudioObjectModel); + BinaryReader br = base.Stream.BinaryReader; + string fileHeader = br.ReadFixedLengthString(33); + byte[] flags = br.ReadBytes(2u); + byte hasID666Value = br.ReadByte(); + bool hasID666 = hasID666Value == 26; + byte versionMinor = br.ReadByte(); + short regPC = br.ReadInt16(); + byte regA = br.ReadByte(); + byte regX = br.ReadByte(); + byte regY = br.ReadByte(); + byte regPSW = br.ReadByte(); + byte regSP = br.ReadByte(); + short regReserved = br.ReadInt16(); + if (hasID666) + { + au.Information.SongTitle = br.ReadNullTerminatedString(32); + au.Information.AlbumTitle = br.ReadNullTerminatedString(32); + au.Information.Creator = br.ReadNullTerminatedString(16); + au.Information.Comments = br.ReadNullTerminatedString(32); + string id666DumpDate = br.ReadNullTerminatedString(11); + au.Information.DateCreated = new DateTime(int.Parse(id666DumpDate.Substring(0, 4)), int.Parse(id666DumpDate.Substring(3, 2)), int.Parse(id666DumpDate.Substring(5, 2))); + au.Information.FadeOutDelay = int.Parse(br.ReadNullTerminatedString(3)); + au.Information.FadeOutLength = int.Parse(br.ReadNullTerminatedString(5)); + au.Information.SongArtist = br.ReadNullTerminatedString(32); + this.mvarID666DefaultChannelDisables = br.ReadByte(); + switch (br.ReadByte()) + { + case 0: + { + au.Information.GeneratorTitle = string.Empty; + break; + } + case 1: + { + au.Information.GeneratorTitle = "ZSNES"; + break; + } + case 2: + { + au.Information.GeneratorTitle = "Snes9x"; + break; + } + } + byte[] id666Reserved = br.ReadBytes(45u); + this.mvarID666Reserved = id666Reserved; + } + byte[] regRAM = br.ReadBytes(65536u); + byte[] regDSP = br.ReadBytes(128u); + byte[] regUnused2 = br.ReadBytes(64u); + byte[] regExtra = br.ReadBytes(64u); + } + protected override void SaveInternal(ObjectModel objectModel) + { + SynthesizedAudioObjectModel au = objectModel as SynthesizedAudioObjectModel; + BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteFixedLengthString("SNES-SPC700 Sound File Data v0.30"); + byte[] flags = new byte[] + { + 26, + 26 + }; + bw.Write(flags); + bool hasID666 = true; + if (hasID666) + { + bw.Write(26); + } + else + { + bw.Write(27); + } + byte versionMinor = 30; + bw.Write(versionMinor); + short regPC = 0; + bw.Write(regPC); + byte regA = 0; + bw.Write(regA); + byte regX = 0; + bw.Write(regX); + byte regY = 0; + bw.Write(regY); + byte regPSW = 0; + bw.Write(regPSW); + byte regSP = 0; + bw.Write(regSP); + short regReserved = 0; + bw.Write(regReserved); + if (hasID666) + { + bw.WriteFixedLengthString(au.Information.SongTitle, 32); + bw.WriteFixedLengthString(au.Information.AlbumTitle, 32); + bw.WriteFixedLengthString(au.Information.Creator, 16); + bw.WriteFixedLengthString(au.Information.Comments, 32); + string id666DumpDate = au.Information.DateCreated.ToString("YYYYMMDD"); + bw.WriteFixedLengthString(id666DumpDate, 11); + BinaryWriter arg_15E_0 = bw; + int num = au.Information.FadeOutDelay; + arg_15E_0.WriteFixedLengthString(num.ToString(), 3); + BinaryWriter arg_17A_0 = bw; + num = au.Information.FadeOutLength; + arg_17A_0.WriteFixedLengthString(num.ToString(), 5); + bw.WriteFixedLengthString(au.Information.SongArtist, 32); + bw.Write(this.mvarID666DefaultChannelDisables); + string generatorTitle = au.Information.GeneratorTitle; + if (generatorTitle != null) + { + if (generatorTitle == "ZSNES") + { + bw.Write(1); + goto IL_1F1; + } + if (generatorTitle == "Snes9x") + { + bw.Write(2); + goto IL_1F1; + } + } + bw.Write(0); + IL_1F1: + bw.WriteFixedLengthBytes(this.mvarID666Reserved, 45); + } + byte[] regRAM = new byte[65536]; + bw.Write(regRAM); + byte[] regDSP = new byte[128]; + bw.Write(regDSP); + byte[] regUnused2 = new byte[64]; + bw.Write(regUnused2); + byte[] regExtra = new byte[64]; + bw.Write(regExtra); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/UTAU/USTDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/UTAU/USTDataFormat.cs new file mode 100644 index 00000000..5baec19d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/UTAU/USTDataFormat.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor; +using UniversalEditor.DataFormats.PropertyList; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.UTAU +{ + public class USTDataFormat : WindowsConfigurationDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + + dfr.Filters.Add("UTAU voice sequence", new string[] { "*.ust" }); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + PropertyListObjectModel plom = objectModels.Pop() as PropertyListObjectModel; + SynthesizedAudioObjectModel sa = objectModels.Pop() as SynthesizedAudioObjectModel; + sa.Tempo = double.Parse(plom.Groups["#SETTING"].Properties["Tempo"].Value.ToString()); + sa.Name = plom.Groups["#SETTING"].Properties["ProjectName"].Value.ToString(); + int trackCount = int.Parse(plom.Groups["#SETTING"].Properties["Tracks"].Value.ToString()); + int groupStart = 1; + for (int i = 0; i < trackCount; i++) + { + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + Group grp = plom.Groups[groupStart]; + while (grp.Name != "#TRACKEND") + { + SynthesizedAudioCommandNote note = null; + if (grp.Properties["Lyric"].Value.ToString() == "R") + { + note = new SynthesizedAudioCommandRest(); + } + else + { + note = new SynthesizedAudioCommandNote(); + } + note.Length = int.Parse(grp.Properties["Length"].Value.ToString()); + note.Lyric = grp.Properties["Lyric"].Value.ToString(); + note.Frequency = int.Parse(grp.Properties["NoteNum"].Value.ToString()); + if (grp.Properties["PreUtterance"] != null && grp.Properties["PreUtterance"].Value != null && !string.IsNullOrEmpty(grp.Properties["PreUtterance"].Value.ToString())) + { + note.PreUtterance = int.Parse(grp.Properties["PreUtterance"].Value.ToString()); + } + if (grp.Properties["VoiceOverlap"] != null && grp.Properties["VoiceOverlap"].Value != null && !string.IsNullOrEmpty(grp.Properties["VoiceOverlap"].Value.ToString())) + { + note.VoiceOverlap = int.Parse(grp.Properties["VoiceOverlap"].Value.ToString()); + } + if (grp.Properties["Intensity"] != null && grp.Properties["Intensity"].Value != null && !string.IsNullOrEmpty(grp.Properties["Intensity"].Value.ToString())) + { + note.Intensity = int.Parse(grp.Properties["Intensity"].Value.ToString()); + } + if (grp.Properties["Moduration"] != null && grp.Properties["Moduration"].Value != null && !string.IsNullOrEmpty(grp.Properties["Moduration"].Value.ToString())) + { + note.Modulation = int.Parse(grp.Properties["Moduration"].Value.ToString()); + } + if (grp.Properties["PBType"] != null && grp.Properties["PBType"].Value != null && !string.IsNullOrEmpty(grp.Properties["PBType"].Value.ToString())) + { + note.PBType = int.Parse(grp.Properties["PBType"].Value.ToString()); + } + if (grp.Properties["Piches"] != null && grp.Properties["Piches"].Value != null && !string.IsNullOrEmpty(grp.Properties["Piches"].Value.ToString())) + { + note.Pitches = grp.Properties["Piches"].Value.ToString().Split(new char[] { ',' }); + } + if (grp.Properties["Envelope"] != null && grp.Properties["Envelope"].Value != null && !string.IsNullOrEmpty(grp.Properties["Envelope"].Value.ToString())) + { + note.Envelope = grp.Properties["Envelope"].Value.ToString().Split(new char[] + { + ',' + }); + } + if (grp.Properties["VBR"] != null && grp.Properties["VBR"].Value != null && !string.IsNullOrEmpty(grp.Properties["VBR"].Value.ToString())) + { + note.VBR = grp.Properties["VBR"].Value.ToString().Split(new char[] { ',' }); + } + track.Commands.Add(note); + groupStart++; + grp = plom.Groups[groupStart]; + } + sa.Tracks.Add(track); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQDataFormat.cs new file mode 100644 index 00000000..557cd57a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQDataFormat.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.PropertyList; +using UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.MIDI; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +using UniversalEditor.ObjectModels.PropertyList; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.Vocaloid +{ + public class VSQDataFormat : MIDIDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("VOCALOID2 voice sequence", new string[] { "*.vsq" }); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void AfterLoadInternal(Stack objectModels) + { + SynthesizedAudioObjectModel audio = objectModels.Pop() as SynthesizedAudioObjectModel; + for (int i = 1; i < audio.Tracks.Count; i++) + { + SynthesizedAudioTrack track = audio.Tracks[i]; + string text = string.Empty; + foreach (SynthesizedAudioCommand cmd in track.Commands) + { + if (cmd is SynthesizedAudioCommandText) + { + string textt = (cmd as SynthesizedAudioCommandText).Text; + if (textt.StartsWith("DM:")) + { + textt = textt.Substring(8); + } + text += textt; + } + } + PropertyListObjectModel plom = new PropertyListObjectModel(); + ObjectModel om = plom; + WindowsConfigurationDataFormat ini = new WindowsConfigurationDataFormat(); + ini.OpenString(text); + ini.CommentSignals = new string[0]; + ini.Load(ref om); + ini.Close(); + foreach (Group grp in plom.Groups) + { + string text2 = grp.Name; + if (text2 != null) + { + if (!(text2 == "Common")) + { + if (!(text2 == "Master")) + { + if (!(text2 == "Mixer")) + { + if (text2 == "EventList") + { + foreach (Property prop in grp.Properties) + { + string eventName = prop.Name; + string eventValue = prop.Value.ToString(); + int thisNotePosition = int.Parse(eventName); + if (eventValue.StartsWith("ID#")) + { + Group eventGroup = plom.Groups[eventValue]; + text2 = eventGroup.Properties["Type"].Value.ToString(); + if (text2 != null) + { + if (!(text2 == "Singer")) + { + if (text2 == "Anote") + { + SynthesizedAudioCommandNote note = new SynthesizedAudioCommandNote(); + Group lyricInfo = plom.Groups[eventGroup.Properties["LyricHandle"].Value.ToString()]; + string phonemeInfo = lyricInfo.Properties["L0"].Value.ToString(); + int length = int.Parse(eventGroup.Properties["Length"].Value.ToString()); + int noteNumber = int.Parse(eventGroup.Properties["Note#"].Value.ToString()); + string[] phonemeInfos = phonemeInfo.Split(new char[] + { + ',' + }, "\""); + note.Lyric = phonemeInfos[0]; + note.Phoneme = phonemeInfos[1]; + note.Length = length; + note.Frequency = 128 - noteNumber; + track.Commands.Add(note); + if (grp.Properties.IndexOf(prop) < grp.Properties.Count - 1) + { + int nextNotePosition = int.Parse(grp.Properties[grp.Properties.IndexOf(prop) + 1].Name); + if (thisNotePosition + note.Length < nextNotePosition) + { + int restLength = nextNotePosition - thisNotePosition; + SynthesizedAudioCommandRest rest = new SynthesizedAudioCommandRest(); + rest.Length = restLength; + track.Commands.Add(rest); + } + } + } + } + else + { + Group singerInfo = plom.Groups[eventGroup.Properties["IconHandle"].Value.ToString()]; + string singerName = singerInfo.Properties["IDS"].Value.ToString(); + int programChange = int.Parse(singerInfo.Properties["Program"].Value.ToString()); + } + } + } + } + } + } + } + } + } + } + } + base.AfterLoadInternal(objectModels); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs new file mode 100644 index 00000000..ce6e9c36 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs @@ -0,0 +1,824 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Synthesized; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Voicebank; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Synthesized.Vocaloid +{ + public class VSQXDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("VOCALOID3 voice sequence (XML)", new string[] { "*.vsqx" }); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + MarkupTagElement tagVSQ3 = mom.Elements["vsq3"] as MarkupTagElement; + if (tagVSQ3 != null) + { + foreach (MarkupElement el in tagVSQ3.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + string text = tag.FullName; + if (text != null) + { + if (!(text == "vender")) + { + if (!(text == "version")) + { + if (text == "vsTrack") + { + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + MarkupTagElement tagTrackName = tag.Elements["trackName"] as MarkupTagElement; + if (tagTrackName != null) + { + MarkupStringElement tagTrackNameCDATA = tagTrackName.Elements[0] as MarkupStringElement; + if (tagTrackNameCDATA != null) + { + track.Name = tagTrackNameCDATA.Value; + } + } + MarkupTagElement tagTrackComment = tag.Elements["comment"] as MarkupTagElement; + if (tagTrackComment != null) + { + MarkupStringElement tagTrackNameCDATA = tagTrackComment.Elements[0] as MarkupStringElement; + if (tagTrackNameCDATA != null) + { + track.Comment = tagTrackNameCDATA.Value; + } + } + foreach (MarkupElement el2 in tag.Elements) + { + MarkupTagElement tag2 = el2 as MarkupTagElement; + if (tag2 != null) + { + text = tag2.FullName; + if (text != null) + { + if (!(text == "stylePlugin")) + { + if (text == "note") + { + SynthesizedAudioCommandNote note = new SynthesizedAudioCommandNote(); + MarkupTagElement tagPosTick = tag2.Elements["posTick"] as MarkupTagElement; + if (tagPosTick != null) + { + int posTick = 0; + if (int.TryParse(tagPosTick.Value, out posTick)) + { + note.Position = posTick; + } + } + MarkupTagElement tagDurTick = tag2.Elements["durTick"] as MarkupTagElement; + if (tagDurTick != null) + { + int durTick = 0; + if (int.TryParse(tagDurTick.Value, out durTick)) + { + note.Length = durTick; + } + } + MarkupTagElement tagNoteNum = tag2.Elements["noteNum"] as MarkupTagElement; + if (tagNoteNum != null) + { + int noteNum = 0; + if (int.TryParse(tagNoteNum.Value, out noteNum)) + { + note.Frequency = noteNum; + } + } + MarkupTagElement tagVelocity = tag2.Elements["velocity"] as MarkupTagElement; + if (tagVelocity != null) + { + int velocity = 0; + if (int.TryParse(tagVelocity.Value, out velocity)) + { + note.Intensity = velocity; + } + } + MarkupTagElement tagLyric = tag2.Elements["lyric"] as MarkupTagElement; + if (tagLyric != null) + { + MarkupStringElement tagLyricCDATA = tagLyric.Elements[0] as MarkupStringElement; + if (tagLyricCDATA != null) + { + note.Lyric = tagLyricCDATA.Value; + } + } + MarkupTagElement tagPhoneme = tag2.Elements["phnms"] as MarkupTagElement; + if (tagPhoneme != null) + { + MarkupStringElement tagPhonemeCDATA = tagPhoneme.Elements[0] as MarkupStringElement; + if (tagPhonemeCDATA != null) + { + note.Phoneme = tagPhonemeCDATA.Value; + } + } + MarkupTagElement tagNoteStyle = tag2.Elements["noteStyle"] as MarkupTagElement; + if (tagNoteStyle != null) + { + foreach (MarkupElement elAttr in tagNoteStyle.Elements) + { + MarkupTagElement tagAttr = elAttr as MarkupTagElement; + if (tagAttr != null) + { + if (tagAttr.Attributes["id"] != null) + { + if (tagAttr.Name == "attr") + { + text = tagAttr.Attributes["id"].Value; + switch (text) + { + case "accent": + { + string value = tagAttr.Value; + int realValue = 50; + int.TryParse(value, out realValue); + note.Accent = realValue; + break; + } + case "bendDep": + { + string value = tagAttr.Value; + int realValue = 8; + int.TryParse(value, out realValue); + note.PitchBendDepth = realValue; + break; + } + case "bendLen": + { + string value = tagAttr.Value; + int realValue = 0; + int.TryParse(value, out realValue); + note.PitchBendLength = realValue; + break; + } + case "decay": + { + string value = tagAttr.Value; + int realValue = 50; + int.TryParse(value, out realValue); + note.Decay = realValue; + break; + } + case "fallPort": + { + string value = tagAttr.Value; + bool realValue2 = false; + bool.TryParse(value, out realValue2); + note.PortamentoFalling = realValue2; + break; + } + case "opening": + { + string value = tagAttr.Value; + int realValue = 127; + int.TryParse(value, out realValue); + note.Opening = realValue; + break; + } + case "risePort": + { + string value = tagAttr.Value; + bool realValue2 = false; + bool.TryParse(value, out realValue2); + note.PortamentoRising = realValue2; + break; + } + case "vibLen": + { + string value = tagAttr.Value; + int realValue = 66; + int.TryParse(value, out realValue); + note.VibratoLength = realValue; + break; + } + case "vibType": + { + string value = tagAttr.Value; + SynthesizedAudioVibratoType realValue3 = SynthesizedAudioVibratoType.None; + try + { + realValue3 = (SynthesizedAudioVibratoType)Enum.Parse(typeof(SynthesizedAudioVibratoType), value); + } + catch + { + } + note.VibratoType = realValue3; + break; + } + } + } + else + { + if (tagAttr.FullName == "seqAttr") + { + if (tagAttr.Attributes["id"] != null) + { + text = tagAttr.Attributes["id"].Value; + if (text != null) + { + if (!(text == "vibDep")) + { + if (text == "vibRate") + { + MarkupTagElement tagPosNrm = tagAttr.FindElement(new string[] + { + "elem", + "posNrm" + }) as MarkupTagElement; + MarkupTagElement tagElv = tagAttr.FindElement(new string[] + { + "elem", + "elv" + }) as MarkupTagElement; + if (tagPosNrm != null) + { + int posNrm = 0; + int.TryParse(tagPosNrm.Value, out posNrm); + } + if (tagElv != null) + { + int elv = 0; + int.TryParse(tagElv.Value, out elv); + } + } + } + else + { + MarkupTagElement tagPosNrm = tagAttr.FindElement(new string[] + { + "elem", + "posNrm" + }) as MarkupTagElement; + MarkupTagElement tagElv = tagAttr.FindElement(new string[] + { + "elem", + "elv" + }) as MarkupTagElement; + if (tagPosNrm != null) + { + int posNrm = 0; + int.TryParse(tagPosNrm.Value, out posNrm); + } + if (tagElv != null) + { + int elv = 0; + int.TryParse(tagElv.Value, out elv); + } + } + } + } + } + } + } + } + } + } + track.Commands.Add(note); + } + } + else + { + Guid StylePluginID = Guid.Empty; + string StylePluginName = string.Empty; + Version StylePluginVersion = new Version(1, 0, 0, 0); + MarkupTagElement tagStylePluginID = tag2.Elements["stylePluginID"] as MarkupTagElement; + if (tagStylePluginID != null) + { + MarkupStringElement tagStylePluginIDCDATA = tagStylePluginID.Elements[0] as MarkupStringElement; + if (tagStylePluginIDCDATA != null) + { + try + { + StylePluginID = new Guid(tagStylePluginIDCDATA.Value); + } + catch + { + } + } + } + MarkupTagElement tagStylePluginName = tag2.Elements["stylePluginName"] as MarkupTagElement; + if (tagStylePluginName != null) + { + MarkupStringElement tagStylePluginNameCDATA = tagStylePluginName.Elements[0] as MarkupStringElement; + if (tagStylePluginNameCDATA != null) + { + StylePluginName = tagStylePluginNameCDATA.Value; + } + } + MarkupTagElement tagStylePluginVersion = tag2.Elements["version"] as MarkupTagElement; + if (tagStylePluginVersion != null) + { + MarkupStringElement tagStylePluginVersionCDATA = tagStylePluginVersion.Elements[0] as MarkupStringElement; + if (tagStylePluginVersionCDATA != null) + { + StylePluginVersion = new Version(tagStylePluginVersionCDATA.Value); + } + } + SynthesizedAudioStylePlugin plugin = new SynthesizedAudioStylePlugin(); + plugin.ID = StylePluginID; + plugin.Name = StylePluginName; + plugin.Version = StylePluginVersion; + } + } + } + } + au.Tracks.Add(track); + } + } + else + { + MarkupStringElement tagCDATA = tag.Elements[0] as MarkupStringElement; + if (tagCDATA != null) + { + au.Information.GeneratorVersion = new Version(tagCDATA.Value); + } + } + } + else + { + MarkupStringElement tagCDATA = tag.Elements[0] as MarkupStringElement; + if (tagCDATA != null) + { + au.Information.GeneratorAuthor = tagCDATA.Value; + } + } + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupPreprocessorElement xml = new MarkupPreprocessorElement(); + xml.Name = "xml"; + xml.Value = "version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\""; + mom.Elements.Add(xml); + MarkupTagElement tagVSQ3 = new MarkupTagElement(); + tagVSQ3.Attributes.Add("xmlns", "http://www.yamaha.co.jp/vocaloid/schema/vsq3/"); + tagVSQ3.Attributes.Add("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); + tagVSQ3.Attributes.Add("xsi:schemaLocation", "http://www.yamaha.co.jp/vocaloid/schema/vsq3/vsq3.xsd"); + MarkupTagElement tagVender = new MarkupTagElement(); + tagVender.FullName = "vender"; + MarkupStringElement tagVenderCDATA = new MarkupStringElement(); + tagVenderCDATA.Name = "CDATA"; + tagVenderCDATA.Value = au.Information.GeneratorAuthor; + tagVender.Elements.Add(tagVenderCDATA); + tagVSQ3.Elements.Add(tagVender); + MarkupTagElement tagVersion = new MarkupTagElement(); + tagVersion.FullName = "version"; + MarkupStringElement tagVersionCDATA = new MarkupStringElement(); + tagVersionCDATA.Name = "CDATA"; + tagVersionCDATA.Value = au.Information.GeneratorVersion.ToString(); + tagVersion.Elements.Add(tagVersionCDATA); + tagVSQ3.Elements.Add(tagVersion); + MarkupTagElement tagvVoiceTable = new MarkupTagElement(); + tagvVoiceTable.FullName = "vVoiceTable"; + foreach (VoicebankObjectModel voice in au.Voices) + { + MarkupTagElement tagvVoice = new MarkupTagElement(); + tagvVoice.FullName = "vVoice"; + MarkupTagElement tagvBS = new MarkupTagElement(); + tagvBS.FullName = "vBS"; + MarkupElement arg_1AB_0 = tagvBS; + int num = voice.BankSelect; + arg_1AB_0.Value = num.ToString(); + tagvVoice.Elements.Add(tagvBS); + MarkupTagElement tagvPC = new MarkupTagElement(); + tagvPC.FullName = "vPC"; + MarkupElement arg_1E6_0 = tagvPC; + num = voice.ProgramChange; + arg_1E6_0.Value = num.ToString(); + tagvVoice.Elements.Add(tagvPC); + MarkupTagElement tagcompID = new MarkupTagElement(); + tagcompID.FullName = "compID"; + MarkupStringElement tagcompIDCDATA = new MarkupStringElement(); + tagcompIDCDATA.Name = "CDATA"; + tagcompIDCDATA.Value = voice.ID; + tagcompID.Elements.Add(tagcompIDCDATA); + tagvVoice.Elements.Add(tagcompID); + MarkupTagElement tagvVoiceName = new MarkupTagElement(); + tagvVoiceName.FullName = "vVoiceName"; + MarkupStringElement tagvVoiceNameCDATA = new MarkupStringElement(); + tagvVoiceNameCDATA.Name = "CDATA"; + tagvVoiceNameCDATA.Value = voice.ID; + tagvVoiceName.Elements.Add(tagvVoiceNameCDATA); + tagvVoice.Elements.Add(tagvVoiceName); + MarkupTagElement tagvVoiceParam = new MarkupTagElement(); + tagvVoiceParam.FullName = "vVoiceParam"; + MarkupTagElement tagvVoiceParamBRE = new MarkupTagElement(); + tagvVoiceParamBRE.FullName = "bre"; + MarkupElement arg_2E9_0 = tagvVoiceParamBRE; + byte b = voice.SynthesisParameters.Breathiness; + arg_2E9_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamBRE); + MarkupTagElement tagvVoiceParamBRI = new MarkupTagElement(); + tagvVoiceParamBRI.FullName = "bri"; + MarkupElement arg_329_0 = tagvVoiceParamBRI; + b = voice.SynthesisParameters.Brightness; + arg_329_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamBRI); + MarkupTagElement tagvVoiceParamCLE = new MarkupTagElement(); + tagvVoiceParamCLE.FullName = "cle"; + MarkupElement arg_369_0 = tagvVoiceParamCLE; + b = voice.SynthesisParameters.Clearness; + arg_369_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamCLE); + MarkupTagElement tagvVoiceParamGEN = new MarkupTagElement(); + tagvVoiceParamGEN.FullName = "gen"; + MarkupElement arg_3A9_0 = tagvVoiceParamGEN; + b = voice.SynthesisParameters.GenderFactor; + arg_3A9_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamGEN); + MarkupTagElement tagvVoiceParamOPE = new MarkupTagElement(); + tagvVoiceParamOPE.FullName = "ope"; + MarkupElement arg_3E9_0 = tagvVoiceParamOPE; + b = voice.SynthesisParameters.Openness; + arg_3E9_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamOPE); + tagvVoice.Elements.Add(tagvVoiceParam); + tagvVoiceTable.Elements.Add(tagvVoice); + } + tagVSQ3.Elements.Add(tagvVoiceTable); + MarkupTagElement tagMixer = new MarkupTagElement(); + tagMixer.FullName = "mixer"; + MarkupTagElement tagMasterUnit = new MarkupTagElement(); + tagMasterUnit.FullName = "masterUnit"; + MarkupTagElement tagOutDev = new MarkupTagElement(); + tagOutDev.FullName = "outDev"; + tagOutDev.Value = "0"; + tagMasterUnit.Elements.Add(tagOutDev); + MarkupTagElement tagRetLevel = new MarkupTagElement(); + tagRetLevel.FullName = "retLevel"; + tagRetLevel.Value = "0"; + tagMasterUnit.Elements.Add(tagRetLevel); + MarkupTagElement tagVolume = new MarkupTagElement(); + tagVolume.FullName = "vol"; + tagVolume.Value = "0"; + tagMasterUnit.Elements.Add(tagVolume); + tagMixer.Elements.Add(tagMasterUnit); + MarkupTagElement tagInGain; + MarkupTagElement tagSendLevel; + MarkupTagElement tagSendEnable; + MarkupTagElement tagMute; + MarkupTagElement tagSolo; + MarkupTagElement tagPan; + MarkupTagElement tagVol; + foreach (SynthesizedAudioTrack track in au.Tracks) + { + MarkupTagElement tagVSUnit = new MarkupTagElement(); + tagVSUnit.FullName = "vsUnit"; + MarkupTagElement tagVSTrackNo = new MarkupTagElement(); + tagVSTrackNo.FullName = "vsTrackNo"; + MarkupElement arg_57B_0 = tagVSTrackNo; + int num = au.Tracks.IndexOf(track); + arg_57B_0.Value = num.ToString(); + tagVSUnit.Elements.Add(tagVSTrackNo); + tagInGain = new MarkupTagElement(); + tagInGain.FullName = "inGain"; + tagInGain.Value = "0"; + tagVSUnit.Elements.Add(tagInGain); + tagSendLevel = new MarkupTagElement(); + tagSendLevel.FullName = "sendLevel"; + tagSendLevel.Value = "0"; + tagVSUnit.Elements.Add(tagSendLevel); + tagSendEnable = new MarkupTagElement(); + tagSendEnable.FullName = "sendEnable"; + tagSendEnable.Value = "0"; + tagVSUnit.Elements.Add(tagSendEnable); + tagMute = new MarkupTagElement(); + tagMute.FullName = "mute"; + tagMute.Value = (track.IsMuted ? "1" : "0"); + tagVSUnit.Elements.Add(tagMute); + tagSolo = new MarkupTagElement(); + tagSolo.FullName = "solo"; + tagSolo.Value = (track.IsSolo ? "1" : "0"); + tagVSUnit.Elements.Add(tagSolo); + tagPan = new MarkupTagElement(); + tagPan.FullName = "pan"; + MarkupElement arg_6C6_0 = tagPan; + byte b = track.Panpot; + arg_6C6_0.Value = b.ToString(); + tagVSUnit.Elements.Add(tagPan); + tagVol = new MarkupTagElement(); + tagVol.FullName = "vol"; + MarkupElement arg_701_0 = tagVol; + b = track.Volume; + arg_701_0.Value = b.ToString(); + tagVSUnit.Elements.Add(tagVol); + tagMixer.Elements.Add(tagVSUnit); + } + MarkupTagElement tagSEUnit = new MarkupTagElement(); + tagSEUnit.FullName = "seUnit"; + tagInGain = new MarkupTagElement(); + tagInGain.FullName = "inGain"; + tagInGain.Value = "0"; + tagSEUnit.Elements.Add(tagInGain); + tagSendLevel = new MarkupTagElement(); + tagSendLevel.FullName = "sendLevel"; + tagSendLevel.Value = "0"; + tagSEUnit.Elements.Add(tagSendLevel); + tagSendEnable = new MarkupTagElement(); + tagSendEnable.FullName = "sendEnable"; + tagSendEnable.Value = "0"; + tagSEUnit.Elements.Add(tagSendEnable); + tagMute = new MarkupTagElement(); + tagMute.FullName = "mute"; + tagMute.Value = "0"; + tagSEUnit.Elements.Add(tagMute); + tagSolo = new MarkupTagElement(); + tagSolo.FullName = "solo"; + tagSolo.Value = "0"; + tagSEUnit.Elements.Add(tagSolo); + tagPan = new MarkupTagElement(); + tagPan.FullName = "pan"; + tagPan.Value = "64"; + tagSEUnit.Elements.Add(tagPan); + tagVol = new MarkupTagElement(); + tagVol.FullName = "vol"; + tagVol.Value = "0"; + tagSEUnit.Elements.Add(tagVol); + tagMixer.Elements.Add(tagSEUnit); + MarkupTagElement tagKaraokeUnit = new MarkupTagElement(); + tagKaraokeUnit.FullName = "karaokeUnit"; + tagInGain = new MarkupTagElement(); + tagInGain.FullName = "inGain"; + tagInGain.Value = "0"; + tagKaraokeUnit.Elements.Add(tagInGain); + tagMute = new MarkupTagElement(); + tagMute.FullName = "mute"; + tagMute.Value = "0"; + tagKaraokeUnit.Elements.Add(tagMute); + tagSolo = new MarkupTagElement(); + tagSolo.FullName = "solo"; + tagSolo.Value = "0"; + tagKaraokeUnit.Elements.Add(tagSolo); + tagVol = new MarkupTagElement(); + tagVol.FullName = "vol"; + tagVol.Value = "0"; + tagKaraokeUnit.Elements.Add(tagVol); + tagMixer.Elements.Add(tagKaraokeUnit); + tagVSQ3.Elements.Add(tagMixer); + MarkupTagElement tagMasterTrack = new MarkupTagElement(); + tagMasterTrack.FullName = "masterTrack"; + MarkupTagElement tagSeqName = new MarkupTagElement(); + tagSeqName.FullName = "seqName"; + MarkupStringElement tagSeqNameCDATA = new MarkupStringElement(); + tagSeqNameCDATA.Name = "CDATA"; + tagSeqNameCDATA.Value = "Voice1"; + tagSeqName.Elements.Add(tagSeqNameCDATA); + tagMasterTrack.Elements.Add(tagSeqName); + MarkupTagElement tagComment = new MarkupTagElement(); + tagComment.FullName = "comment"; + MarkupStringElement tagCommentCDATA = new MarkupStringElement(); + tagCommentCDATA.Name = "CDATA"; + tagCommentCDATA.Value = "Voice1"; + tagComment.Elements.Add(tagCommentCDATA); + tagMasterTrack.Elements.Add(tagComment); + MarkupTagElement tagResolution = new MarkupTagElement(); + tagResolution.FullName = "resolution"; + tagResolution.Value = "480"; + tagMasterTrack.Elements.Add(tagResolution); + MarkupTagElement tagPreMeasure = new MarkupTagElement(); + tagPreMeasure.FullName = "preMeasure"; + tagPreMeasure.Value = "480"; + tagMasterTrack.Elements.Add(tagPreMeasure); + MarkupTagElement tagTimeSig = new MarkupTagElement(); + tagTimeSig.FullName = "timeSig"; + MarkupTagElement tagTimeSigPosMes = new MarkupTagElement(); + tagTimeSigPosMes.FullName = "posMes"; + tagTimeSigPosMes.Value = "0"; + tagTimeSig.Elements.Add(tagTimeSigPosMes); + MarkupTagElement tagTimeSigNume = new MarkupTagElement(); + tagTimeSigNume.FullName = "nume"; + tagTimeSigNume.Value = "4"; + tagTimeSig.Elements.Add(tagTimeSigNume); + MarkupTagElement tagTimeSigDenomi = new MarkupTagElement(); + tagTimeSigDenomi.FullName = "denomi"; + tagTimeSigDenomi.Value = "4"; + tagTimeSig.Elements.Add(tagTimeSigDenomi); + tagMasterTrack.Elements.Add(tagTimeSig); + MarkupTagElement tagTempo = new MarkupTagElement(); + tagTempo.FullName = "tempo"; + MarkupTagElement tagTempoPosTick = new MarkupTagElement(); + tagTempoPosTick.FullName = "posTick"; + tagTempoPosTick.Value = "0"; + tagTempo.Elements.Add(tagTempoPosTick); + MarkupTagElement tagTempoBPM = new MarkupTagElement(); + tagTempoBPM.FullName = "bpm"; + tagTempoBPM.Value = "20500"; + tagTempo.Elements.Add(tagTempoBPM); + tagTempo.Elements.Add(tagTempoPosTick); + tagMasterTrack.Elements.Add(tagTempo); + tagVSQ3.Elements.Add(tagMasterTrack); + foreach (SynthesizedAudioTrack track in au.Tracks) + { + MarkupTagElement tagVSTrack = new MarkupTagElement(); + tagVSTrack.FullName = "vsTrack"; + MarkupTagElement tagVSTrackNo = new MarkupTagElement(); + tagVSTrackNo.FullName = "vsTrackNo"; + MarkupElement arg_C87_0 = tagVSTrackNo; + int num = au.Tracks.IndexOf(track); + arg_C87_0.Value = num.ToString(); + tagVSTrack.Elements.Add(tagVSTrackNo); + MarkupTagElement tagTrackName = new MarkupTagElement(); + tagTrackName.FullName = "trackName"; + MarkupStringElement tagTrackNameCDATA = new MarkupStringElement(); + tagTrackNameCDATA.Name = "CDATA"; + tagTrackNameCDATA.Value = track.Name; + tagTrackName.Elements.Add(tagTrackNameCDATA); + tagVSTrack.Elements.Add(tagTrackName); + tagComment = new MarkupTagElement(); + tagComment.FullName = "comment"; + tagCommentCDATA = new MarkupStringElement(); + tagCommentCDATA.Name = "CDATA"; + if (!string.IsNullOrEmpty(track.Comment)) + { + tagCommentCDATA.Value = track.Comment; + } + else + { + tagCommentCDATA.Value = track.Name; + } + tagComment.Elements.Add(tagCommentCDATA); + tagVSTrack.Elements.Add(tagComment); + MarkupTagElement tagMusicalPart = new MarkupTagElement(); + tagMusicalPart.FullName = "musicalPart"; + foreach (SynthesizedAudioCommand cmd in track.Commands) + { + if (cmd is SynthesizedAudioCommandNote) + { + SynthesizedAudioCommandNote note = cmd as SynthesizedAudioCommandNote; + MarkupTagElement tagNote = new MarkupTagElement(); + tagNote.FullName = "note"; + MarkupTagElement tagNotePosTick = new MarkupTagElement(); + tagNotePosTick.FullName = "posTick"; + MarkupElement arg_E00_0 = tagNotePosTick; + num = note.Position; + arg_E00_0.Value = num.ToString(); + tagNote.Elements.Add(tagNotePosTick); + MarkupTagElement tagNoteDurTick = new MarkupTagElement(); + tagNoteDurTick.FullName = "durTick"; + MarkupElement arg_E3D_0 = tagNoteDurTick; + num = (int)note.Length; + arg_E3D_0.Value = num.ToString(); + tagNote.Elements.Add(tagNoteDurTick); + MarkupTagElement tagNoteNum = new MarkupTagElement(); + tagNoteNum.FullName = "noteNum"; + MarkupElement arg_E7A_0 = tagNoteNum; + arg_E7A_0.Value = note.Frequency.ToString(); + tagNote.Elements.Add(tagNoteNum); + MarkupTagElement tagVelocity = new MarkupTagElement(); + tagVelocity.FullName = "velocity"; + MarkupElement arg_EB7_0 = tagVelocity; + arg_EB7_0.Value = note.Frequency.ToString(); + tagNote.Elements.Add(tagVelocity); + MarkupTagElement tagLyric = new MarkupTagElement(); + tagLyric.FullName = "lyric"; + MarkupStringElement tagLyricCDATA = new MarkupStringElement(); + tagLyricCDATA.Name = "CDATA"; + tagLyricCDATA.Value = note.Lyric.ToString(); + tagLyric.Elements.Add(tagLyricCDATA); + tagNote.Elements.Add(tagLyric); + MarkupTagElement tagPhoneme = new MarkupTagElement(); + tagPhoneme.FullName = "phnms"; + MarkupStringElement tagPhonemeCDATA = new MarkupStringElement(); + tagPhonemeCDATA.Name = "CDATA"; + tagPhonemeCDATA.Value = note.Phoneme.ToString(); + tagPhoneme.Elements.Add(tagPhonemeCDATA); + tagNote.Elements.Add(tagPhoneme); + MarkupTagElement tagNoteStyle = new MarkupTagElement(); + tagNoteStyle.FullName = "noteStyle"; + MarkupTagElement tagNoteStyleAccent = new MarkupTagElement(); + tagNoteStyleAccent.FullName = "attr"; + tagNoteStyleAccent.Attributes.Add("id", "accent"); + MarkupElement arg_FD7_0 = tagNoteStyleAccent; + num = note.Accent; + arg_FD7_0.Value = num.ToString(); + tagNoteStyle.Elements.Add(tagNoteStyleAccent); + MarkupTagElement tagNoteStyleBendDepth = new MarkupTagElement(); + tagNoteStyleBendDepth.FullName = "attr"; + tagNoteStyleBendDepth.Attributes.Add("id", "bendDep"); + MarkupElement arg_1029_0 = tagNoteStyleBendDepth; + num = note.PitchBendDepth; + arg_1029_0.Value = num.ToString(); + tagNoteStyle.Elements.Add(tagNoteStyleBendDepth); + MarkupTagElement tagNoteStyleBendLength = new MarkupTagElement(); + tagNoteStyleBendLength.FullName = "attr"; + tagNoteStyleBendLength.Attributes.Add("id", "bendLen"); + MarkupElement arg_107B_0 = tagNoteStyleBendLength; + num = note.PitchBendLength; + arg_107B_0.Value = num.ToString(); + tagNoteStyle.Elements.Add(tagNoteStyleBendLength); + MarkupTagElement tagNoteStyleDecay = new MarkupTagElement(); + tagNoteStyleDecay.FullName = "attr"; + tagNoteStyleDecay.Attributes.Add("id", "decay"); + tagNoteStyleDecay.Value = "50"; + tagNoteStyle.Elements.Add(tagNoteStyleDecay); + MarkupTagElement tagNoteStyleFallPort = new MarkupTagElement(); + tagNoteStyleFallPort.FullName = "attr"; + tagNoteStyleFallPort.Attributes.Add("id", "fallPort"); + tagNoteStyleFallPort.Value = (note.PortamentoFalling ? "1" : "0"); + tagNoteStyle.Elements.Add(tagNoteStyleFallPort); + MarkupTagElement tagNoteStyleOpening = new MarkupTagElement(); + tagNoteStyleOpening.FullName = "attr"; + tagNoteStyleOpening.Attributes.Add("id", "opening"); + tagNoteStyleOpening.Value = "127"; + tagNoteStyle.Elements.Add(tagNoteStyleOpening); + MarkupTagElement tagNoteStyleRisePort = new MarkupTagElement(); + tagNoteStyleRisePort.FullName = "attr"; + tagNoteStyleRisePort.Attributes.Add("id", "risePort"); + tagNoteStyleRisePort.Value = (note.PortamentoRising ? "1" : "0"); + tagNoteStyle.Elements.Add(tagNoteStyleRisePort); + MarkupTagElement tagNoteStyleVibLen = new MarkupTagElement(); + tagNoteStyleVibLen.FullName = "attr"; + tagNoteStyleVibLen.Attributes.Add("id", "vibLen"); + tagNoteStyleVibLen.Value = "0"; + tagNoteStyle.Elements.Add(tagNoteStyleVibLen); + MarkupTagElement tagNoteStyleVibType = new MarkupTagElement(); + tagNoteStyleVibType.FullName = "attr"; + tagNoteStyleVibType.Attributes.Add("id", "vibType"); + tagNoteStyleVibType.Value = "0"; + tagNoteStyle.Elements.Add(tagNoteStyleVibType); + if (note.VibratoType != SynthesizedAudioVibratoType.None) + { + MarkupTagElement tagSeqAttr = new MarkupTagElement(); + tagSeqAttr.FullName = "seqAttr"; + tagSeqAttr.Attributes.Add("id", "vibDep"); + MarkupTagElement tagSeqAttrElem = new MarkupTagElement(); + tagSeqAttr.FullName = "elem"; + MarkupTagElement tagSeqAttrElemPosNrm = new MarkupTagElement(); + tagSeqAttrElemPosNrm.FullName = "posNrm"; + tagSeqAttrElemPosNrm.Value = "27670"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemPosNrm); + MarkupTagElement tagSeqAttrElemElv = new MarkupTagElement(); + tagSeqAttrElemElv.FullName = "elv"; + tagSeqAttrElemElv.Value = "64"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemElv); + tagSeqAttr.Elements.Add(tagSeqAttrElem); + tagSeqAttr = new MarkupTagElement(); + tagSeqAttr.FullName = "seqAttr"; + tagSeqAttr.Attributes.Add("id", "vibRate"); + tagSeqAttrElem = new MarkupTagElement(); + tagSeqAttr.FullName = "elem"; + tagSeqAttrElemPosNrm = new MarkupTagElement(); + tagSeqAttrElemPosNrm.FullName = "posNrm"; + tagSeqAttrElemPosNrm.Value = "27670"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemPosNrm); + tagSeqAttrElemElv = new MarkupTagElement(); + tagSeqAttrElemElv.FullName = "elv"; + tagSeqAttrElemElv.Value = "27670"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemElv); + tagSeqAttr.Elements.Add(tagSeqAttrElem); + } + tagNote.Elements.Add(tagNoteStyle); + tagMusicalPart.Elements.Add(tagNote); + } + } + tagVSTrack.Elements.Add(tagMusicalPart); + tagVSQ3.Elements.Add(tagVSTrack); + } + MarkupTagElement tagSETrack = new MarkupTagElement(); + tagSETrack.FullName = "seTrack"; + tagVSQ3.Elements.Add(tagSETrack); + MarkupTagElement tagKaraokeTrack = new MarkupTagElement(); + tagKaraokeTrack.FullName = "karaokeTrack"; + tagVSQ3.Elements.Add(tagKaraokeTrack); + MarkupTagElement tagAux = new MarkupTagElement(); + tagAux.FullName = "aux"; + MarkupTagElement tagAuxID = new MarkupTagElement(); + tagAuxID.FullName = "auxID"; + MarkupStringElement tagAuxIDCDATA = new MarkupStringElement(); + tagAuxIDCDATA.Name = "CDATA"; + tagAuxIDCDATA.Value = "AUX_VST_HOST_CHUNK_INFO"; + tagAuxID.Elements.Add(tagAuxIDCDATA); + tagAux.Elements.Add(tagAuxID); + MarkupTagElement tagAuxContent = new MarkupTagElement(); + tagAuxContent.FullName = "content"; + MarkupStringElement tagAuxContentCDATA = new MarkupStringElement(); + tagAuxContentCDATA.Name = "CDATA"; + tagAuxContentCDATA.Value = "VlNDSwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; + tagAuxContent.Elements.Add(tagAuxContentCDATA); + tagAux.Elements.Add(tagAuxContent); + tagVSQ3.Elements.Add(tagAux); + mom.Elements.Add(tagVSQ3); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs new file mode 100644 index 00000000..f95a22a8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs @@ -0,0 +1,52 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Voicebank; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Voicebank.DirectWave +{ + public class DirectWavePatchDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("DirectWave patch", new byte?[][] { new byte?[] { new byte?(68), new byte?(119), new byte?(80), new byte?(114) } }, new string[] { "*.dwp" }); + dfr.Capabilities.Add(typeof(VoicebankObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + VoicebankObjectModel vom = (objectModel as VoicebankObjectModel); + BinaryReader br = base.Stream.BinaryReader; + string DwPr = br.ReadFixedLengthString(4); + int n0 = br.ReadInt32(); + int n = br.ReadInt32(); + vom.Name = br.ReadNullTerminatedString(32); + vom.InstallationPath = br.ReadNullTerminatedString(260); + int n2 = br.ReadInt32(); + int n3 = br.ReadInt32(); + int n4 = br.ReadInt32(); + int sampleCount = br.ReadInt32(); + byte[] data = br.ReadBytes(144u); + for (int i = 0; i < sampleCount; i++) + { + VoicebankSample sample = new VoicebankSample(); + sample.Name = br.ReadNullTerminatedString(32); + sample.FileName = br.ReadNullTerminatedString(260); + sample.Data = br.ReadBytes(1406u); + vom.Samples.Add(sample); + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + VoicebankObjectModel vom = objectModel as VoicebankObjectModel; + BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteFixedLengthString("DwPr"); + int n0 = 0; + bw.Write(n0); + int n = 0; + bw.Write(n); + bw.WriteNullTerminatedString(vom.Name, 32); + bw.WriteNullTerminatedString(vom.InstallationPath, 264); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs new file mode 100644 index 00000000..8b7cd5b1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs @@ -0,0 +1,81 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Voicebank; +using UniversalEditor.ObjectModels.FileSystem; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Voicebank.Vocaloid +{ + public class VocaloidVoicebankDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("VOCALOID voice bank database", new byte?[][] { new byte?[] { new byte?(70), new byte?(45), new byte?(0), new byte?(0) }, new byte?[] { new byte?(70), new byte?(82), new byte?(77), new byte?(50) } }, new string[] { "*.ddb" }); + dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.Load); + dfr.Capabilities.Add(typeof(VoicebankObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + + VoicebankObjectModel vom = (objectModel as VoicebankObjectModel); + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + + byte[] signature = br.ReadBytes(4u); + int vocaloidVersion = 1; + if (signature[0] == 70 && signature[1] == 45 && signature[2] == 0 && signature[3] == 0) + { + vocaloidVersion = 1; + } + else + { + if (signature[0] == 70 && signature[1] == 82 && signature[2] == 77 && signature[3] == 50) + { + vocaloidVersion = 2; + } + } + if (vom != null) + { + vom.CreatorVersion = new Version(vocaloidVersion, 0); + } + + int i = 0; + while (!br.EndOfStream) + { + br.SeekUntil("SND "); + + string SND_ = br.ReadFixedLengthString(4); + if (SND_ == "SND ") + { + int sign = br.ReadInt32(); + int size = br.ReadInt32(); + int freq = br.ReadInt32(); + short channels = br.ReadInt16(); + int dummy = br.ReadInt32(); + + byte[] data = br.ReadBytes(size - 18); + + if (fsom != null) + { + fsom.Files.Add(i.ToString() + ".raw", data); + } + Console.WriteLine("found sound file " + i.ToString() + ":"); + Console.WriteLine(" sign: " + sign.ToString()); + Console.WriteLine(" size: " + size.ToString()); + Console.WriteLine(" freq: " + freq.ToString()); + Console.WriteLine(" channels: " + channels.ToString()); + Console.WriteLine(" unknown_int32: " + dummy.ToString()); + i++; + } + else + { + break; + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs new file mode 100644 index 00000000..073da8d1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.AdvancedAudioCodec +{ + public class AACDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Advanced Audio Codec", new string[] { "*.aac" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/BRSTM/BRSTMDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/BRSTM/BRSTMDataFormat.cs new file mode 100644 index 00000000..3ec14956 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/BRSTM/BRSTMDataFormat.cs @@ -0,0 +1,77 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.BRSTM +{ + public class BRSTMDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("BRSTM/ADPCM sound data", new byte?[][] { new byte?[] { new byte?(77), new byte?(84), new byte?(83), new byte?(82), new byte?(255), new byte?(254) } }, new string[] { "*.brstm" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + WaveformAudioObjectModel auom = objectModel as WaveformAudioObjectModel; + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + string RSTM = br.ReadFixedLengthString(4); + ushort magic = br.ReadUInt16(); + byte versionMajor = br.ReadByte(); + byte versionMinor = br.ReadByte(); + uint fileSize = br.ReadUInt32(); + ushort headerSize = br.ReadUInt16(); + ushort chunkCount = br.ReadUInt16(); + uint headChunkOffset = br.ReadUInt32(); + uint headChunkSize = br.ReadUInt32(); + uint adpcChunkOffset = br.ReadUInt32(); + uint adpcChunkSize = br.ReadUInt32(); + uint dataChunkOffset = br.ReadUInt32(); + uint dataChunkSize = br.ReadUInt32(); + byte[] reserved = br.ReadBytes(24u); + base.Stream.BaseStream.Seek((long)((ulong)headChunkOffset), System.IO.SeekOrigin.Begin); + byte[] headChunk = br.ReadBytes(headChunkSize); + base.Stream.BaseStream.Seek((long)((ulong)adpcChunkOffset), System.IO.SeekOrigin.Begin); + byte[] adpcChunk = br.ReadBytes(adpcChunkSize); + base.Stream.BaseStream.Seek((long)((ulong)dataChunkOffset), System.IO.SeekOrigin.Begin); + byte[] dataChunk = br.ReadBytes(dataChunkSize); + byte[] dataChunkMinusHeader = new byte[dataChunk.Length - 4]; + Array.Copy(dataChunk, 4, dataChunkMinusHeader, 0, dataChunkMinusHeader.Length); + auom.RawData = dataChunkMinusHeader; + } + protected override void SaveInternal(ObjectModel objectModel) + { + WaveformAudioObjectModel auom = objectModel as WaveformAudioObjectModel; + BinaryWriter bw = base.Stream.BinaryWriter; + bw.Endianness = Endianness.BigEndian; + bw.WriteFixedLengthString("RSTM"); + ushort magic = 65279; + bw.Write(magic); + byte versionMajor = 1; + bw.Write(versionMajor); + byte versionMinor = 0; + bw.Write(versionMinor); + ushort headerSize = 40; + uint fileSize = (uint)headerSize; + bw.Write(fileSize); + bw.Write(headerSize); + ushort chunkCount = 0; + bw.Write(chunkCount); + uint headChunkOffset = 0u; + bw.Write(headChunkOffset); + uint headChunkSize = 0u; + bw.Write(headChunkSize); + uint adpcChunkOffset = 0u; + bw.Write(adpcChunkOffset); + uint adpcChunkSize = 0u; + bw.Write(adpcChunkSize); + uint dataChunkOffset = 0u; + bw.Write(dataChunkOffset); + uint dataChunkSize = 0u; + bw.Write(dataChunkSize); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/FLACDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/FLACDataFormat.cs new file mode 100644 index 00000000..d3151d90 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/FLACDataFormat.cs @@ -0,0 +1,53 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.FLAC.Internal; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.FLAC +{ + public class FLACDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Free Lossless Audio Codec", new byte?[][] { new byte?[] { new byte?(102), new byte?(76), new byte?(97), new byte?(67) } }, new string[] { "*.flac" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private FLACMetadataBlock.FLACMetadataBlockCollection mvarMetadataBlocks = new FLACMetadataBlock.FLACMetadataBlockCollection(); + public FLACMetadataBlock.FLACMetadataBlockCollection MetadataBlocks { get { return this.mvarMetadataBlocks; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + private void SaveMetadataBlockHeader(BinaryWriter bw, FLACMetadataBlockHeader header) + { + byte flagAndType = 0; + if (header.IsLastMetadataBlock) + { + flagAndType |= 1; + } + flagAndType |= (byte)header.BlockType; + bw.Write(flagAndType); + bw.WriteInt24(header.ContentLength); + } + private void SaveMetadataBlockStreamInfo(BinaryWriter bw, FLACMetadataBlockStreamInfo block) + { + this.SaveMetadataBlockHeader(bw, new FLACMetadataBlockHeader + { + IsLastMetadataBlock = this.mvarMetadataBlocks.Count == 0, + BlockType = FLACMetadataBlockType.StreamInfo, + ContentLength = 0 + }); + } + protected override void SaveInternal(ObjectModel objectModel) + { + BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteFixedLengthString("fLaC"); + FLACMetadataBlockStreamInfo streamInfo = new FLACMetadataBlockStreamInfo(); + this.SaveMetadataBlockStreamInfo(bw, streamInfo); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs new file mode 100644 index 00000000..4b9c7eab --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.ObjectModel; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.FLAC.Internal +{ + public class FLACMetadataBlock + { + public class FLACMetadataBlockCollection : Collection + { + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs new file mode 100644 index 00000000..46775903 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs @@ -0,0 +1,43 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.FLAC.Internal +{ + public class FLACMetadataBlockHeader + { + private bool mvarIsLastMetadataBlock = false; + private FLACMetadataBlockType mvarBlockType = FLACMetadataBlockType.Unknown; + private int mvarContentLength = 0; + public bool IsLastMetadataBlock + { + get + { + return this.mvarIsLastMetadataBlock; + } + set + { + this.mvarIsLastMetadataBlock = value; + } + } + public FLACMetadataBlockType BlockType + { + get + { + return this.mvarBlockType; + } + set + { + this.mvarBlockType = value; + } + } + public int ContentLength + { + get + { + return this.mvarContentLength; + } + set + { + this.mvarContentLength = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs new file mode 100644 index 00000000..b9800f00 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs @@ -0,0 +1,115 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.FLAC.Internal +{ + public class FLACMetadataBlockStreamInfo : FLACMetadataBlock + { + private short mvarMinimumBlockSize = 0; + private short mvarMaximumBlockSize = 0; + private int mvarMinimumFrameSize = 0; + private int mvarMaximumFrameSize = 0; + private int mvarSampleRate = 0; + private byte mvarChannelCount = 0; + private byte mvarBitsPerSample = 0; + private long mvarTotalSamplesInStream = 0L; + private short mvarMD5Signature = 0; + public short MinimumBlockSize + { + get + { + return this.mvarMinimumBlockSize; + } + set + { + this.mvarMinimumBlockSize = value; + } + } + public short MaximumBlockSize + { + get + { + return this.mvarMaximumBlockSize; + } + set + { + this.mvarMaximumBlockSize = value; + } + } + public int MinimumFrameSize + { + get + { + return this.mvarMinimumFrameSize; + } + set + { + this.mvarMinimumFrameSize = value; + } + } + public int MaximumFrameSize + { + get + { + return this.mvarMaximumFrameSize; + } + set + { + this.mvarMaximumFrameSize = value; + } + } + public int SampleRate + { + get + { + return this.mvarSampleRate; + } + set + { + this.mvarSampleRate = value; + } + } + public byte ChannelCount + { + get + { + return this.mvarChannelCount; + } + set + { + this.mvarChannelCount = value; + } + } + public byte BitsPerSample + { + get + { + return this.mvarBitsPerSample; + } + set + { + this.mvarBitsPerSample = value; + } + } + public long TotalSamplesInStream + { + get + { + return this.mvarTotalSamplesInStream; + } + set + { + this.mvarTotalSamplesInStream = value; + } + } + public short MD5Signature + { + get + { + return this.mvarMD5Signature; + } + set + { + this.mvarMD5Signature = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs new file mode 100644 index 00000000..5b239f38 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs @@ -0,0 +1,16 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.FLAC.Internal +{ + public enum FLACMetadataBlockType + { + Unknown = -1, + StreamInfo, + Padding, + Application, + SeekTable, + VorbisComment, + Cuesheet, + Picture, + Invalid = 127 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP3/MP3DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP3/MP3DataFormat.cs new file mode 100644 index 00000000..0d550630 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP3/MP3DataFormat.cs @@ -0,0 +1,41 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.MP3 +{ + public class MP3DataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("MPEG-2 layer III audio", new byte?[][] { new byte?[] { new byte?(73), new byte?(68), new byte?(51) } }, new string[] { "*.mp3" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + WaveformAudioObjectModel wave = objectModel as WaveformAudioObjectModel; + BinaryReader br = base.Stream.BinaryReader; + string ID3 = br.ReadFixedLengthString(3); + if (ID3 == "ID3") + { + int lz = br.ReadInt32(); + } + else + { + br.BaseStream.Seek(-3L, System.IO.SeekOrigin.Current); + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + WaveformAudioObjectModel wave = objectModel as WaveformAudioObjectModel; + BinaryWriter bw = base.Stream.BinaryWriter; + if (wave.Information.CustomProperties.Count > 0) + { + bw.WriteFixedLengthString("ID3"); + } + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP4/MP4DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP4/MP4DataFormat.cs new file mode 100644 index 00000000..9b29762b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MP4/MP4DataFormat.cs @@ -0,0 +1,28 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.MP4 +{ + public class MP4DataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("MPEG-4 Part 14", new byte?[][] { + new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(24), new byte?(102), new byte?(116), new byte?(121), new byte?(112), new byte?(109), new byte?(112), new byte?(52), new byte?(50) }, + new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(20), new byte?(102), new byte?(116), new byte?(121), new byte?(112), new byte?(105), new byte?(115), new byte?(111), new byte?(109) }, + new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(28), new byte?(102), new byte?(116), new byte?(121), new byte?(112), new byte?(109), new byte?(112), new byte?(52), new byte?(50) } }, + new string[] { "*.mp4", "*.m4a", "*.m4p", "*.m4b", "*.m4r", "*.m4v" }); + + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs new file mode 100644 index 00000000..f1e7e0d7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UniversalEditor.DataFormats.Chunked; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +using UniversalEditor.ObjectModels.Chunked; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.MicrosoftWave +{ + public class MicrosoftWaveDataFormat : RIFFDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Title = "Microsoft waveform audio"; + dfr.Filters.Add("Microsoft waveform audio", new string[] { "*.wav", "*.wave" }); + dfr.Filters.Add("Sony ATRAC3+ encoded waveform audio", new string[] { "*.at3" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + // TODO: Test IsObjectModelSupported!!! + + protected override bool IsObjectModelSupported(ObjectModel omb) + { + ChunkedObjectModel riff = (omb as ChunkedObjectModel); + if (riff != null) + { + RIFFGroupChunk waveChunk = (riff.Chunks["WAVE"] as RIFFGroupChunk); + if (waveChunk != null) + { + RIFFDataChunk fmtChunk = (waveChunk.Chunks["fmt "] as RIFFDataChunk); + if (fmtChunk != null) + { + return true; + } + } + } + return false; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + ChunkedObjectModel riff = objectModels.Pop() as ChunkedObjectModel; + WaveformAudioObjectModel wave = objectModels.Pop() as WaveformAudioObjectModel; + + RIFFGroupChunk waveChunk = (riff.Chunks["WAVE"] as RIFFGroupChunk); + if (waveChunk != null) + { + RIFFDataChunk fmtChunk = (waveChunk.Chunks["fmt "] as RIFFDataChunk); + UniversalEditor.IO.BinaryReader br = new UniversalEditor.IO.BinaryReader(fmtChunk.Data); + if (fmtChunk.Size >= 16) + { + wave.Header.FormatTag = br.ReadUInt16(); + wave.Header.ChannelCount = br.ReadInt16(); + wave.Header.SampleRate = br.ReadInt32(); + wave.Header.DataRate = br.ReadInt32(); + wave.Header.BlockAlignment = br.ReadInt16(); + wave.Header.BitsPerSample = br.ReadInt16(); + if (fmtChunk.Size >= 18) + { + short cbSize = br.ReadInt16(); + if (fmtChunk.Size >= 40) + { + wave.ExtendedHeader.Enabled = true; + wave.ExtendedHeader.ValidBitsPerSample = br.ReadInt16(); + wave.ExtendedHeader.ChannelMask = br.ReadInt32(); + wave.ExtendedHeader.SubFormatGUID = br.ReadGuid(); + } + } + } + RIFFDataChunk dataChunk = (waveChunk.Chunks["data"] as RIFFDataChunk); + br = new UniversalEditor.IO.BinaryReader(dataChunk.Data); + short[] dataa = new short[dataChunk.Data.Length / 2]; + for (int i = 0; i < dataa.Length; i++) + { + dataa[i] = br.ReadInt16(); + } + wave.RawData = dataChunk.Data; + wave.RawSamples = dataa; + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + WaveformAudioObjectModel wave = objectModels.Pop() as WaveformAudioObjectModel; + ChunkedObjectModel riff = new ChunkedObjectModel(); + + RIFFGroupChunk WAVE = new RIFFGroupChunk(); + WAVE.TypeID = "RIFF"; + WAVE.ID = "WAVE"; + + RIFFDataChunk fmtChunk = new RIFFDataChunk(); + fmtChunk.ID = "fmt "; + MemoryStream ms = new MemoryStream(); + UniversalEditor.IO.BinaryWriter bw = new UniversalEditor.IO.BinaryWriter(ms); + bw.Write(wave.Header.FormatTag); + bw.Write(wave.Header.ChannelCount); + bw.Write(wave.Header.SampleRate); + bw.Write(wave.Header.DataRate); + bw.Write(wave.Header.BlockAlignment); + bw.Write(wave.Header.BitsPerSample); + if (wave.ExtendedHeader.Enabled) + { + bw.Write(22); + bw.Write(wave.ExtendedHeader.ValidBitsPerSample); + bw.Write(wave.ExtendedHeader.ChannelMask); + bw.Write(wave.ExtendedHeader.SubFormatGUID); + } + bw.Flush(); + bw.Close(); + fmtChunk.Data = ms.ToArray(); + + RIFFDataChunk dataChunk = new RIFFDataChunk(); + dataChunk.ID = "data"; + if (wave.RawData == null) + { + MemoryStream ms2 = new MemoryStream(); + UniversalEditor.IO.BinaryWriter bw2 = new UniversalEditor.IO.BinaryWriter(ms2); + short[] rawSamples = wave.RawSamples; + for (int i = 0; i < rawSamples.Length; i++) + { + short s = rawSamples[i]; + bw2.Write(s); + } + bw2.Flush(); + bw2.Close(); + wave.RawData = ms2.ToArray(); + } + dataChunk.Data = wave.RawData; + + WAVE.Chunks.Add(fmtChunk); + WAVE.Chunks.Add(dataChunk); + + riff.Chunks.Add(WAVE); + objectModels.Push(riff); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APEDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APEDataFormat.cs new file mode 100644 index 00000000..17a359eb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APEDataFormat.cs @@ -0,0 +1,24 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.MonkeyAudio +{ + public class APEDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Monkey's Audio", new string[] { "*.ape" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APLDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APLDataFormat.cs new file mode 100644 index 00000000..ae22a702 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/MonkeyAudio/APLDataFormat.cs @@ -0,0 +1,22 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.MonkeyAudio +{ + public class APLDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Monkey's Audio track metadata", new string[] { "*.apl" }); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/OGG/OGGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/OGG/OGGDataFormat.cs new file mode 100644 index 00000000..c8185248 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/OGG/OGGDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.OGG +{ + public class OGGDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Ogg audio container", new string[] { "*.ogg", "*.ogm", "*.oga", "*.ogv" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/REX2/REX2DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/REX2/REX2DataFormat.cs new file mode 100644 index 00000000..c03248ca --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/REX2/REX2DataFormat.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Chunked; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +using UniversalEditor.ObjectModels.Chunked; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.REX2 +{ + public class REX2DataFormat : RIFFDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + + dfr.Filters.Add("Propellerhead ReCycle EXport", new byte?[][] { new byte?[] { new byte?(67), new byte?(65), new byte?(84), new byte?(32), null, null, null, null, new byte?(82), new byte?(69), new byte?(88), new byte?(50) } }, new string[] { "*.rex", "*.rx2" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + dfr.Capabilities.Add(typeof(ChunkedObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private string[] mvarRIFFTags = new string[] { "CAT " }; + public override string[] RIFFTagsLittleEndian { get { return mvarRIFFTags; } } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + ChunkedObjectModel rom = (objectModels.Pop() as ChunkedObjectModel); + WaveformAudioObjectModel wave = (objectModels.Pop() as WaveformAudioObjectModel); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/RealAudio/RealAudioDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/RealAudio/RealAudioDataFormat.cs new file mode 100644 index 00000000..24eada98 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/RealAudio/RealAudioDataFormat.cs @@ -0,0 +1,203 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.RealAudio +{ + public class RealAudioDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("RealNetworks Audio", new byte?[][] { new byte?[] { new byte?(46), new byte?(114), new byte?(97), new byte?(253) } }, new string[] { "*.ra" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + private short mvarVersion = 3; + public short Version { get { return mvarVersion; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + byte[] signature = br.ReadBytes(4u); + this.mvarVersion = br.ReadInt16(); + if (this.mvarVersion == 3) + { + short headerSize = br.ReadInt16(); + byte[] unknown = br.ReadBytes(10u); + int dataSize = br.ReadInt32(); + byte titleStringLength = br.ReadByte(); + string titleString = br.ReadNullTerminatedString((int)titleStringLength); + byte authorStringLength = br.ReadByte(); + string authorString = br.ReadNullTerminatedString((int)authorStringLength); + byte copyrightStringLength = br.ReadByte(); + string copyrightString = br.ReadNullTerminatedString((int)copyrightStringLength); + byte commentStringLength = br.ReadByte(); + string commentString = br.ReadNullTerminatedString((int)commentStringLength); + int finalHeaderSize = (int)(15 + titleStringLength + 1 + authorStringLength + 1 + copyrightStringLength + 1 + commentStringLength); + int finalHeaderSizeDifference = (int)headerSize - finalHeaderSize; + string fourccString = string.Empty; + if (finalHeaderSizeDifference >= 1) + { + byte unknown2 = br.ReadByte(); + if (finalHeaderSizeDifference >= 2) + { + byte fourccStringLength = br.ReadByte(); + if (finalHeaderSizeDifference > 2) + { + fourccString = br.ReadFixedLengthString(fourccStringLength); + } + } + } + } + else + { + if (this.mvarVersion == 4) + { + short unused = br.ReadInt16(); + string ra4signature = br.ReadFixedLengthString(4); + int dataSize = br.ReadInt32(); + dataSize -= 39; + short version2 = br.ReadInt16(); + int headerSize2 = br.ReadInt32(); + short codecFlavor = br.ReadInt16(); + int codedFrameSize = br.ReadInt32(); + byte[] unknown3 = br.ReadBytes(12u); + short subPacketH = br.ReadInt16(); + short frameSize = br.ReadInt16(); + short subPacketSize = br.ReadInt16(); + short unknown4 = br.ReadInt16(); + short sampleRate = br.ReadInt16(); + short unknown5 = br.ReadInt16(); + short sampleSize = br.ReadInt16(); + short channels = br.ReadInt16(); + byte interleaverIDStringLength = br.ReadByte(); + string interleaverIDString = br.ReadFixedLengthString(interleaverIDStringLength); + byte fourccStringLength = br.ReadByte(); + string fourccString = br.ReadFixedLengthString(fourccStringLength); + byte[] unknown6 = br.ReadBytes(3u); + byte titleStringLength = br.ReadByte(); + string titleString = br.ReadFixedLengthString(titleStringLength); + byte authorStringLength = br.ReadByte(); + string authorString = br.ReadFixedLengthString(authorStringLength); + byte copyrightStringLength = br.ReadByte(); + string copyrightString = br.ReadFixedLengthString(copyrightStringLength); + byte commentStringLength = br.ReadByte(); + string commentString = br.ReadFixedLengthString(commentStringLength); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + WaveformAudioObjectModel wave = (objectModel as WaveformAudioObjectModel); + if (wave != null) + { + BinaryWriter bw = base.Stream.BinaryWriter; + bw.Endianness = Endianness.BigEndian; + byte[] signature = new byte[] + { + 46, + 114, + 97, + 253 + }; + bw.Write(signature); + bw.Write(this.mvarVersion); + switch (this.mvarVersion) + { + case 3: + { + byte[] unknown = new byte[10]; + int dataSize = 0; + string titleString = wave.Information.SongTitle; + byte titleStringLength = (byte)titleString.Length; + string authorString = wave.Information.SongArtist; + byte authorStringLength = (byte)authorString.Length; + string copyrightString = wave.Information.CustomProperties["Copyright"].Value.ToString(); + byte copyrightStringLength = (byte)copyrightString.Length; + string commentString = wave.Information.Comments; + byte commentStringLength = (byte)commentString.Length; + short headerSize = (short)(15 + titleStringLength + 1 + authorStringLength + 1 + copyrightStringLength + 1 + commentStringLength + 6); + bw.Write(headerSize); + bw.Write(unknown); + bw.Write(dataSize); + bw.Write(titleStringLength); + bw.WriteNullTerminatedString(titleString, (int)titleStringLength); + bw.Write(authorStringLength); + bw.WriteNullTerminatedString(authorString, (int)authorStringLength); + bw.Write(copyrightStringLength); + bw.WriteNullTerminatedString(copyrightString, (int)copyrightStringLength); + bw.Write(commentStringLength); + bw.WriteNullTerminatedString(commentString, (int)commentStringLength); + bw.Write(0); + bw.Write(4); + bw.WriteFixedLengthString("lpcJ"); + break; + } + case 4: + { + short unused = 0; + bw.Write(unused); + string ra4signature = ".ra4"; + bw.WriteFixedLengthString(ra4signature); + int dataSize = 39; + bw.Write(dataSize); + string titleString = wave.Information.SongTitle; + byte titleStringLength = (byte)titleString.Length; + string authorString = wave.Information.SongArtist; + byte authorStringLength = (byte)authorString.Length; + string copyrightString = wave.Information.CustomProperties["Copyright"].Value.ToString(); + byte copyrightStringLength = (byte)copyrightString.Length; + string commentString = wave.Information.Comments; + byte commentStringLength = (byte)commentString.Length; + bw.Write(this.mvarVersion); + int headerSize2 = 16; + bw.Write(headerSize2); + short codecFlavor = 0; + bw.Write(codecFlavor); + int codedFrameSize = 0; + bw.Write(codedFrameSize); + byte[] unknown2 = new byte[12]; + bw.Write(unknown2); + short subPacketH = 0; + bw.Write(subPacketH); + short frameSize = 0; + bw.Write(frameSize); + short subPacketSize = 0; + bw.Write(subPacketSize); + short unknown3 = 0; + bw.Write(unknown3); + short sampleRate = 0; + bw.Write(sampleRate); + short unknown4 = 0; + bw.Write(unknown4); + short sampleSize = 0; + bw.Write(sampleSize); + short channels = 0; + bw.Write(channels); + byte interleaverIDStringLength = 4; + bw.Write(interleaverIDStringLength); + string interleaverIDString = "\0\0\0\0"; + bw.Write(interleaverIDString); + byte fourccStringLength = 4; + bw.Write(fourccStringLength); + string fourccString = "lpcJ"; + bw.Write(fourccString); + byte[] unknown5 = new byte[3]; + bw.Write(unknown5); + bw.Write(titleStringLength); + bw.Write(titleString); + bw.Write(authorStringLength); + bw.Write(authorString); + bw.Write(copyrightStringLength); + bw.Write(copyrightString); + bw.Write(commentStringLength); + bw.Write(commentString); + break; + } + } + bw.Flush(); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/Shorten/ShortenDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/Shorten/ShortenDataFormat.cs new file mode 100644 index 00000000..0d3dbf2d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/Shorten/ShortenDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.Shorten +{ + public class ShortenDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Shorten audio", new string[] { "*.shn" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuDataFormat.cs new file mode 100644 index 00000000..ff09f545 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuDataFormat.cs @@ -0,0 +1,292 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.SunAu +{ + public class SunAuDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Sun Microsystems audio file", new byte?[][] { new byte?[] { new byte?(46), new byte?(115), new byte?(110), new byte?(100) } }, new string[] { "*.au" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private SunAuEncoding Int32ToSunAuEncoding(int encoding) + { + SunAuEncoding result; + switch (encoding) + { + case 1: + { + result = SunAuEncoding.G711ULaw8Bit; + return result; + } + case 2: + { + result = SunAuEncoding.LinearPCM8Bit; + return result; + } + case 3: + { + result = SunAuEncoding.LinearPCM16Bit; + return result; + } + case 4: + { + result = SunAuEncoding.LinearPCM24Bit; + return result; + } + case 5: + { + result = SunAuEncoding.LinearPCM32Bit; + return result; + } + case 6: + { + result = SunAuEncoding.IeeeFloatingPoint32Bit; + return result; + } + case 7: + { + result = SunAuEncoding.IeeeFloatingPoint64Bit; + return result; + } + case 8: + { + result = SunAuEncoding.FragmentedSampleData; + return result; + } + case 9: + { + result = SunAuEncoding.DspProgram; + return result; + } + case 10: + { + result = SunAuEncoding.FixedPoint8Bit; + return result; + } + case 11: + { + result = SunAuEncoding.FixedPoint16Bit; + return result; + } + case 12: + { + result = SunAuEncoding.FixedPoint24Bit; + return result; + } + case 13: + { + result = SunAuEncoding.FixedPoint32Bit; + return result; + } + case 18: + { + result = SunAuEncoding.LinearWithEmphasis16Bit; + return result; + } + case 19: + { + result = SunAuEncoding.LinearCompressed16Bit; + return result; + } + case 20: + { + result = SunAuEncoding.LinearWithEmphasisCompressed16Bit; + return result; + } + case 21: + { + result = SunAuEncoding.DspProgramMusicKit; + return result; + } + case 23: + { + result = SunAuEncoding.G721Adpcm4Bit; + return result; + } + case 24: + { + result = SunAuEncoding.G722Adpcm4Bit; + return result; + } + case 25: + { + result = SunAuEncoding.G723Adpcm3Bit; + return result; + } + case 26: + { + result = SunAuEncoding.G723Adpcm5Bit; + return result; + } + case 27: + { + result = SunAuEncoding.G711ALaw8Bit; + return result; + } + } + result = SunAuEncoding.Unknown; + return result; + } + private int SunAuEncodingToInt32(SunAuEncoding encoding) + { + int result; + switch (encoding) + { + case SunAuEncoding.G711ULaw8Bit: + { + result = 1; + break; + } + case SunAuEncoding.LinearPCM8Bit: + { + result = 2; + break; + } + case SunAuEncoding.LinearPCM16Bit: + { + result = 3; + break; + } + case SunAuEncoding.LinearPCM24Bit: + { + result = 4; + break; + } + case SunAuEncoding.LinearPCM32Bit: + { + result = 5; + break; + } + case SunAuEncoding.IeeeFloatingPoint32Bit: + { + result = 6; + break; + } + case SunAuEncoding.IeeeFloatingPoint64Bit: + { + result = 7; + break; + } + case SunAuEncoding.FragmentedSampleData: + { + result = 8; + break; + } + case SunAuEncoding.DspProgram: + { + result = 9; + break; + } + case SunAuEncoding.FixedPoint8Bit: + { + result = 10; + break; + } + case SunAuEncoding.FixedPoint16Bit: + { + result = 11; + break; + } + case SunAuEncoding.FixedPoint24Bit: + { + result = 12; + break; + } + case SunAuEncoding.FixedPoint32Bit: + { + result = 13; + break; + } + case SunAuEncoding.LinearWithEmphasis16Bit: + { + result = 18; + break; + } + case SunAuEncoding.LinearCompressed16Bit: + { + result = 19; + break; + } + case SunAuEncoding.LinearWithEmphasisCompressed16Bit: + { + result = 20; + break; + } + case SunAuEncoding.DspProgramMusicKit: + { + result = 21; + break; + } + case SunAuEncoding.G721Adpcm4Bit: + { + result = 23; + break; + } + case SunAuEncoding.G722Adpcm4Bit: + { + result = 24; + break; + } + case SunAuEncoding.G723Adpcm3Bit: + { + result = 25; + break; + } + case SunAuEncoding.G723Adpcm5Bit: + { + result = 26; + break; + } + case SunAuEncoding.G711ALaw8Bit: + { + result = 27; + break; + } + default: + { + result = -1; + break; + } + } + return result; + } + + private SunAuEncoding mvarEncoding = SunAuEncoding.Unknown; + public SunAuEncoding Encoding { get { return mvarEncoding; } set { mvarEncoding = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + string magicNumber = br.ReadFixedLengthString(4); + int dataOffset = br.ReadInt32(); + uint dataSize = br.ReadUInt32(); + int encoding = br.ReadInt32(); + this.mvarEncoding = this.Int32ToSunAuEncoding(encoding); + int sampleRate = br.ReadInt32(); + int channels = br.ReadInt32(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + BinaryWriter bw = base.Stream.BinaryWriter; + bw.Endianness = Endianness.BigEndian; + bw.WriteFixedLengthString(".snd"); + int dataOffset = 24; + bw.Write(dataOffset); + uint dataSize = 4294967295u; + bw.Write(dataSize); + int encoding = this.SunAuEncodingToInt32(this.mvarEncoding); + bw.Write(encoding); + int sampleRate = 0; + bw.Write(sampleRate); + int channels = 2; + bw.Write(channels); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuEncoding.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuEncoding.cs new file mode 100644 index 00000000..96d6e40a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/SunAu/SunAuEncoding.cs @@ -0,0 +1,30 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.SunAu +{ + public enum SunAuEncoding + { + Unknown = -1, + G711ULaw8Bit, + LinearPCM8Bit, + LinearPCM16Bit, + LinearPCM24Bit, + LinearPCM32Bit, + IeeeFloatingPoint32Bit, + IeeeFloatingPoint64Bit, + FragmentedSampleData, + DspProgram, + FixedPoint8Bit, + FixedPoint16Bit, + FixedPoint24Bit, + FixedPoint32Bit, + LinearWithEmphasis16Bit, + LinearCompressed16Bit, + LinearWithEmphasisCompressed16Bit, + DspProgramMusicKit, + G721Adpcm4Bit, + G722Adpcm4Bit, + G723Adpcm3Bit, + G723Adpcm5Bit, + G711ALaw8Bit + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/WavPack/WavPackDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/WavPack/WavPackDataFormat.cs new file mode 100644 index 00000000..7375bbc7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Audio/Waveform/WavPack/WavPackDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Audio.Waveform.WavPack +{ + public class WavPackDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("WavPack audio", new string[] { "*.wv" }); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/HDMVDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/HDMVDataFormat.cs new file mode 100644 index 00000000..01996be7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/HDMVDataFormat.cs @@ -0,0 +1,29 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.BluRay +{ + public class HDMVDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Blu-Ray/AVCHD Clip Info", new byte?[][] { new byte?[] { new byte?(72), new byte?(68), new byte?(77), new byte?(86) } }, new string[] { "*.clpi", "*.cpi" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + + string signature = br.ReadFixedLengthString(4); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/INDXDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/INDXDataFormat.cs new file mode 100644 index 00000000..fee11e90 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/INDXDataFormat.cs @@ -0,0 +1,28 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.BluRay +{ + public class INDXDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Blu-Ray/AVCHD index", new byte?[][] { new byte?[] { new byte?(73), new byte?(78), new byte?(68), new byte?(88) } }, new string[] { "*.bdmv", "*.bdm" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MOBJDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MOBJDataFormat.cs new file mode 100644 index 00000000..73c8173e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MOBJDataFormat.cs @@ -0,0 +1,28 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.BluRay +{ + public class MOBJDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Blu-Ray/AVCHD Movie Object", new byte?[][] { new byte?[] { new byte?(77), new byte?(79), new byte?(66), new byte?(74) } }, new string[] { "*.bdmv", "*.bdm" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MPLSDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MPLSDataFormat.cs new file mode 100644 index 00000000..04b50a0c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/BluRay/MPLSDataFormat.cs @@ -0,0 +1,31 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.BluRay +{ + public class MPLSDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Blu-Ray/AVCHD Media PlayList", new byte?[][] { new byte?[] { new byte?(77), new byte?(80), new byte?(76), new byte?(83) } }, new string[] { "*.mpls", "*.mpl" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + BinaryReader br = base.Stream.BinaryReader; + br.Endianness = Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + string version = br.ReadFixedLengthString(4); + byte[] unknown = br.ReadBytes(54u); + int count = br.ReadInt32(); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSCompressedDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSCompressedDataFormat.cs new file mode 100644 index 00000000..083d5db8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSCompressedDataFormat.cs @@ -0,0 +1,35 @@ +using System; +using UniversalEditor.Accessors; +using UniversalEditor.Compression; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Project; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Project.LMMS +{ + public class LMMSCompressedDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(AudioProjectObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + byte[] input = br.ReadToEnd(); + byte[] output = CompressionModules.Gzip.Decompress(input); + LMMSProjectDataFormat mmp = new LMMSProjectDataFormat(); + MemoryAccessor file = new MemoryAccessor(output); + Document doc = new Document(objectModel, mmp, file); + + file.Open(); + doc.Load(); + file.Close(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSProjectDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSProjectDataFormat.cs new file mode 100644 index 00000000..32167d0a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Project/LMMS/LMMSProjectDataFormat.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Multimedia.Audio.Project; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Project.LMMS +{ + public class LMMSProjectDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(AudioProjectObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + MarkupObjectModel mom = new MarkupObjectModel(); + objectModels.Push(mom); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + AudioProjectObjectModel seq = objectModels.Pop() as AudioProjectObjectModel; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/ExtendedMIDI/XMIDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/ExtendedMIDI/XMIDataFormat.cs new file mode 100644 index 00000000..5b6bb253 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/ExtendedMIDI/XMIDataFormat.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.DataFormats.Chunked.RIFF; +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.ExtendedMIDI +{ + public class XMIDataFormat : RIFFDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(this.GetType()); + _dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + _dfr.Capabilities.Add(typeof(ChunkedObjectModel), DataFormatCapabilities.Bootstrap); + } + return _dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + ChunkedObjectModel chunked = (objectModels.Pop() as ChunkedObjectModel); + SynthesizedAudioObjectModel audio = (objectModels.Pop() as SynthesizedAudioObjectModel); + + + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + SynthesizedAudioObjectModel audio = (objectModels.Pop() as SynthesizedAudioObjectModel); + ChunkedObjectModel chunked = new ChunkedObjectModel(); + + + + objectModels.Push(chunked); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommand.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommand.cs new file mode 100644 index 00000000..75b4170a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommand.cs @@ -0,0 +1,130 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI +{ + public class MIDICommand + { + private byte mvarChannel = 0; + private byte mvarCommand = 0; + public MIDICommandType CommandType + { + get + { + MIDICommandType result; + switch (this.mvarCommand) + { + case 0: + { + result = MIDICommandType.None; + return result; + } + case 8: + { + result = MIDICommandType.NoteOff; + return result; + } + case 9: + { + result = MIDICommandType.NoteOn; + return result; + } + case 10: + { + result = MIDICommandType.KeyAfterTouch; + return result; + } + case 11: + { + result = MIDICommandType.ControlChange; + return result; + } + case 12: + { + result = MIDICommandType.ProgramChange; + return result; + } + case 13: + { + result = MIDICommandType.ChannelAfterTouch; + return result; + } + case 14: + { + result = MIDICommandType.PitchWheelChange; + return result; + } + } + result = MIDICommandType.Unknown; + return result; + } + set + { + switch (value) + { + case MIDICommandType.None: + { + this.mvarCommand = 0; + return; + } + case MIDICommandType.NoteOff: + { + this.mvarCommand = 8; + return; + } + case MIDICommandType.NoteOn: + { + this.mvarCommand = 9; + return; + } + case MIDICommandType.KeyAfterTouch: + { + this.mvarCommand = 10; + return; + } + case MIDICommandType.ControlChange: + { + this.mvarCommand = 11; + return; + } + case MIDICommandType.ProgramChange: + { + this.mvarCommand = 12; + return; + } + case MIDICommandType.ChannelAfterTouch: + { + this.mvarCommand = 13; + return; + } + case MIDICommandType.PitchWheelChange: + { + this.mvarCommand = 14; + return; + } + } + this.mvarCommand = 0; + } + } + public byte Channel + { + get + { + return this.mvarChannel; + } + set + { + this.mvarChannel = value; + } + } + public byte Command + { + get + { + return this.mvarCommand; + } + set + { + this.mvarCommand = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommandType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommandType.cs new file mode 100644 index 00000000..e81f728e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDICommandType.cs @@ -0,0 +1,16 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI +{ + public enum MIDICommandType + { + Unknown = -1, + None, + NoteOff = 8, + NoteOn, + KeyAfterTouch, + ControlChange, + ProgramChange, + ChannelAfterTouch, + PitchWheelChange + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDIDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDIDataFormat.cs new file mode 100644 index 00000000..c14cf1cd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MIDI/MIDIDataFormat.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI +{ + public class MIDIDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + SynthesizedAudioObjectModel syn = objectModel as SynthesizedAudioObjectModel; + string MThd = br.ReadFixedLengthString(4); + if (MThd != "MThd") throw new InvalidDataFormatException("File does not begin with \"MThd\""); + + int headerSize = br.ReadInt32(); + short fileFormat = br.ReadInt16(); + short trackCount = br.ReadInt16(); + short ticksPerQuarterNote = br.ReadInt16(); + for (short i = 0; i < trackCount; i += 1) + { + string MTrk = br.ReadFixedLengthString(4); + if (MTrk != "MTrk") throw new InvalidDataFormatException("Could not read track " + (trackCount + 1).ToString() + " - does not begin with \"MTrk\""); + + int trackLength = br.ReadInt32(); + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + long position = br.Accessor.Position; + while (br.Accessor.Position - position < (long)trackLength) + { + try + { + int deltaTime = br.ReadVariableLengthInt32(); + byte command = br.ReadByte(); + if (command == 255) + { + byte metaEventType = br.ReadByte(); + byte b = metaEventType; + if (b <= 47) + { + switch (b) + { + case 1: + { + byte length = br.ReadByte(); + string text = br.ReadFixedLengthString(length); + track.Commands.Add(new SynthesizedAudioCommandText(text)); + break; + } + case 2: + { + break; + } + case 3: + { + byte length = br.ReadByte(); + string text = br.ReadFixedLengthString(length); + track.Name = text; + break; + } + default: + { + if (b == 47) + { + byte endOfTrackMarker = br.ReadByte(); + syn.Tracks.Add(track); + } + break; + } + } + } + else + { + if (b != 81) + { + if (b == 88) + { + byte zero4 = br.ReadByte(); + byte numerator = br.ReadByte(); + byte denominator = (byte)Math.Pow(2.0, (double)br.ReadByte()); + byte ticksPerMetronomeClick = br.ReadByte(); + byte numberOf32ndNotesPerQuarterNote = br.ReadByte(); + track.Commands.Add(new SynthesizedAudioCommandTimeSignature(numerator, denominator, ticksPerMetronomeClick, numberOf32ndNotesPerQuarterNote)); + } + } + else + { + byte zero5 = br.ReadByte(); + int tempo = (int)br.ReadInt16(); + int tempo2 = (int)br.ReadByte(); + int tempo3 = tempo + tempo2; + track.Commands.Add(new SynthesizedAudioCommandTempo((double)tempo3)); + } + } + } + } + catch (System.IO.EndOfStreamException ex) + { + continue; + } + } + } + } + + /* + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + SynthesizedAudioTrack trkControl = au.Tracks["Control"]; + if (trkControl != null) + { + bool inSettingsBlock = false; + foreach (SynthesizedAudioCommand cmd in trkControl.Commands) + { + if (!(cmd is SynthesizedAudioCommandTempo)) + { + if (!(cmd is SynthesizedAudioCommandTimeSignature)) + { + if (cmd is SynthesizedAudioCommandText) + { + SynthesizedAudioCommandText text = cmd as SynthesizedAudioCommandText; + if (text.Text == "Settings") + { + inSettingsBlock = true; + } + else + { + if (inSettingsBlock && text.Text.StartsWith("@rem project=")) + { + au.Information.SongTitle = text.Text.Substring(13); + } + else + { + if (inSettingsBlock && text.Text.StartsWith("@set tempo=")) + { + double tempo = double.Parse(text.Text.Substring(11)); + } + } + } + } + } + } + } + } + } + */ + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs new file mode 100644 index 00000000..9ec0e03d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/MusicXML/MusicXMLDataFormat.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.Accessors; +using UniversalEditor.Common; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; + +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MusicXML +{ + public class MusicXMLDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + MarkupObjectModel mom = new MarkupObjectModel(); + objectModels.Push(mom); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + MarkupTagElement score_partwise = (mom.FindElement("score-partwise") as MarkupTagElement); + if (score_partwise != null) + { + foreach (MarkupElement el in score_partwise.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + SynthesizedAudioTrack currentTrack = null; + string text = tag.Name; + if (text != null) + { + if (!(text == "part-list")) + { + if (text == "part") + { + if (tag.Attributes["id"] != null) + { + currentTrack = au.Tracks[tag.Attributes["id"].Value]; + if (currentTrack != null) + { + foreach (MarkupElement el2 in tag.Elements) + { + MarkupTagElement tag2 = el2 as MarkupTagElement; + if (tag2.Name == "measure") + { + foreach (MarkupElement elMeasureItem in tag2.Elements) + { + MarkupTagElement tagMeasureItem = elMeasureItem as MarkupTagElement; + if (tagMeasureItem != null) + { + text = tagMeasureItem.Name; + if (text != null) + { + if (!(text == "attributes")) + { + if (text == "note") + { + SynthesizedAudioCommandNote note = new SynthesizedAudioCommandNote(); + foreach (MarkupElement elNoteItem in tagMeasureItem.Elements) + { + MarkupTagElement tagNoteItem = elNoteItem as MarkupTagElement; + if (tagNoteItem != null) + { + MarkupElement elPhoneme = tagNoteItem.FindElement("sing", "phoneme"); + MarkupElement elLyric = tagNoteItem.FindElement("sing", "lyric"); + if (elPhoneme != null) + { + note.Phoneme = elPhoneme.Value; + } + if (elLyric != null) + { + note.Lyric = elLyric.Value; + } + } + } + currentTrack.Commands.Add(note); + } + } + } + } + } + } + } + } + } + } + } + else + { + foreach (MarkupElement elScorePart in tag.Elements) + { + if (elScorePart is MarkupTagElement) + { + MarkupTagElement tagScorePart = elScorePart as MarkupTagElement; + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + if (tagScorePart.Attributes["id"] != null) + { + track.ID = tagScorePart.Attributes["id"].Value; + } + foreach (MarkupElement elTagScorePartChild in tagScorePart.Elements) + { + if (elTagScorePartChild is MarkupTagElement) + { + MarkupTagElement tag_elTagScorePartChild = elTagScorePartChild as MarkupTagElement; + text = tag_elTagScorePartChild.Name; + if (text != null) + { + if (!(text == "part-name")) + { + if (text == "link") + { + if (tag_elTagScorePartChild.Attributes["rel"] != null) + { + text = tag_elTagScorePartChild.Attributes["rel"].Value; + if (text != null) + { + if (text == "synthesizer") + { + if (Accessor is FileAccessor) + { + FileAccessor file = (Accessor as FileAccessor); + if (file.FileName != null) + { + string fileName = Path.MakeAbsolutePath(tag_elTagScorePartChild.Attributes["href"].Value, System.IO.Path.GetDirectoryName(file.FileName)); + track.Synthesizer = Reflection.GetAvailableObjectModel(new FileAccessor(fileName)); + } + } + } + } + } + } + } + else + { + track.Name = tag_elTagScorePartChild.Value; + } + } + } + } + au.Tracks.Add(track); + } + } + } + } + } + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/NIFF/NIFFDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/NIFF/NIFFDataFormat.cs new file mode 100644 index 00000000..a4e3200e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/NIFF/NIFFDataFormat.cs @@ -0,0 +1,42 @@ +using System; + +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.DataFormats.Chunked.RIFF; + +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.NIFF +{ + public class NIFFDataFormat : RIFFDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = new DataFormatReference(this.GetType()); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(System.Collections.Generic.Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(System.Collections.Generic.Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + ChunkedObjectModel riff = (objectModels.Pop() as ChunkedObjectModel); + SynthesizedAudioObjectModel audio = (objectModels.Pop() as SynthesizedAudioObjectModel); + + throw new InvalidDataFormatException(Localization.StringTable.ErrorDataFormatInvalid); + } + protected override void BeforeSaveInternal(System.Collections.Generic.Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + SynthesizedAudioObjectModel audio = (objectModels.Pop() as SynthesizedAudioObjectModel); + ChunkedObjectModel riff = new ChunkedObjectModel(); + + objectModels.Push(riff); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFDataFormat.cs new file mode 100644 index 00000000..f739231d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFDataFormat.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.PSF +{ + public class PSFDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + private PSFPlatform mvarPlatform = PSFPlatform.Playstation; + /// + /// The platform byte is used to determine the type of PSF file. It does NOT affect the basic + /// structure of the file in any way. Depending on the platform byte, the reserved and program + /// sections are interpreted differently. Some tags may also be interpreted differently. Refer + /// to the linked sections above for more information. + /// + public PSFPlatform Platform { get { return mvarPlatform; } set { mvarPlatform = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + SynthesizedAudioObjectModel audio = (objectModel as SynthesizedAudioObjectModel); + if (audio == null) throw new ObjectModelNotSupportedException(); + + IO.Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(3); + if (signature != "PSF") throw new InvalidDataFormatException("File does not begin with \"PSF\""); + mvarPlatform = (PSFPlatform)br.ReadByte(); + + // Size of reserved area (R) + uint reservedAreaLength = br.ReadUInt32(); + // This is the length of the program data _after_ compression. + uint compressedProgramLength = br.ReadUInt32(); + // This is the CRC-32 of the program data _after_ compression. Filling in this value is + // mandatory, as a PSF file may be regarded as corrupt if it does not match. + uint compressedProgramCRC32 = br.ReadUInt32(); + byte[] reservedAreaData = br.ReadBytes(reservedAreaLength); + byte[] compressedProgramData = br.ReadBytes(compressedProgramLength); + + if (br.Remaining > 5) + { + string tag = br.ReadFixedLengthString(5); + if (tag != "[TAG]") return; + + while (!br.EndOfStream) + { + string propValuePair = br.ReadStringUntil("\n"); + string[] propNameValue = propValuePair.Split(new char[] { '=' }, 2, StringSplitOptions.RemoveEmptyEntries); + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + SynthesizedAudioObjectModel audio = (objectModel as SynthesizedAudioObjectModel); + if (audio == null) throw new ObjectModelNotSupportedException(); + + IO.Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("PSF"); + bw.WriteByte((byte)mvarPlatform); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFPlatform.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFPlatform.cs new file mode 100644 index 00000000..5b7e1195 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/PSF/PSFPlatform.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.PSF +{ + public enum PSFPlatform : byte + { + /// + /// Playstation (PSF1) + /// + Playstation = 0x01, + /// + /// Playstation 2 (PSF2) + /// + Playstation2 = 0x02, + /// + /// Saturn (SSF) (format subject to change) + /// + Saturn = 0x11, + /// + /// Dreamcast (DSF) (format subject to change) + /// + Dreamcast = 0x12, + /// + /// Sega Genesis (format to be announced) + /// + Genesis = 0x13, + /// + /// Nintendo 64 (USF) + /// + Nintendo64 = 0x21, + /// + /// GameBoy Advance (GSF) + /// + GameBoyAdvance = 0x22, + /// + /// Super NES (SNSF) + /// + SuperNES = 0x23, + /// + /// Capcom QSound (QSF) + /// + CapcomQSound = 0x41 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs new file mode 100644 index 00000000..a3c763f0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700DataFormat.cs @@ -0,0 +1,153 @@ +// Universal Editor DataFormat for loading SPC700 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC +{ + public class SPC700DataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + + dfr.ExportOptions.Add(new CustomOptionChoice("Generator", "&Generator:", true, + new CustomOptionFieldChoice("Unknown", SPC700Emulator.Unknown, true), + new CustomOptionFieldChoice("ZSNES", SPC700Emulator.ZSNES), + new CustomOptionFieldChoice("Snes9x", SPC700Emulator.Snes9x) + )); + + return dfr; + } + + private byte[] mvarID666Reserved = new byte[45]; + public byte[] ID666Reserved { get { return mvarID666Reserved; } set { mvarID666Reserved = value; } } + private byte mvarID666DefaultChannelDisables = 0; + public byte ID666DefaultChannelDisables { get { return mvarID666DefaultChannelDisables; } set { mvarID666DefaultChannelDisables = value; } } + + private SPC700Emulator mvarGenerator = SPC700Emulator.Unknown; + /// + /// The emulator that generated this file. + /// + public SPC700Emulator Generator { get { return mvarGenerator; } set { mvarGenerator = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + SynthesizedAudioObjectModel au = (objectModel as SynthesizedAudioObjectModel); + + Reader br = base.Accessor.Reader; + string fileHeader = br.ReadFixedLengthString(33); + if (!fileHeader.StartsWith("SNES-SPC700 Sound File Data")) throw new InvalidDataFormatException("File does not begin with \"SNES-SPC700 Sound File Data\""); + + byte[] flags = br.ReadBytes(2u); + byte hasID666Value = br.ReadByte(); + bool hasID666 = (hasID666Value == 26); + byte versionMinor = br.ReadByte(); + short regPC = br.ReadInt16(); + byte regA = br.ReadByte(); + byte regX = br.ReadByte(); + byte regY = br.ReadByte(); + byte regPSW = br.ReadByte(); + byte regSP = br.ReadByte(); + short regReserved = br.ReadInt16(); + if (hasID666) + { + au.Information.SongTitle = br.ReadNullTerminatedString(32); + au.Information.AlbumTitle = br.ReadNullTerminatedString(32); + au.Information.Creator = br.ReadNullTerminatedString(16); + au.Information.Comments = br.ReadNullTerminatedString(32); + string id666DumpDate = br.ReadNullTerminatedString(11); + au.Information.DateCreated = new DateTime(int.Parse(id666DumpDate.Substring(0, 4)), int.Parse(id666DumpDate.Substring(3, 2)), int.Parse(id666DumpDate.Substring(5, 2))); + au.Information.FadeOutDelay = int.Parse(br.ReadNullTerminatedString(3)); + au.Information.FadeOutLength = int.Parse(br.ReadNullTerminatedString(5)); + au.Information.SongArtist = br.ReadNullTerminatedString(32); + this.mvarID666DefaultChannelDisables = br.ReadByte(); + mvarGenerator = (SPC700Emulator)br.ReadByte(); + byte[] id666Reserved = br.ReadBytes(45u); + this.mvarID666Reserved = id666Reserved; + } + byte[] regRAM = br.ReadBytes(65536u); + byte[] regDSP = br.ReadBytes(128u); + byte[] regUnused2 = br.ReadBytes(64u); + byte[] regExtra = br.ReadBytes(64u); + } + protected override void SaveInternal(ObjectModel objectModel) + { + SynthesizedAudioObjectModel au = objectModel as SynthesizedAudioObjectModel; + Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("SNES-SPC700 Sound File Data v0.30"); + bw.WriteBytes(new byte[] { 26, 26 }); + bool hasID666 = true; + if (hasID666) + { + bw.WriteByte(26); + } + else + { + bw.WriteByte(27); + } + byte versionMinor = 30; + bw.WriteByte(versionMinor); + short regPC = 0; + bw.WriteInt16(regPC); + byte regA = 0; + bw.WriteByte(regA); + byte regX = 0; + bw.WriteByte(regX); + byte regY = 0; + bw.WriteByte(regY); + byte regPSW = 0; + bw.WriteByte(regPSW); + byte regSP = 0; + bw.WriteByte(regSP); + short regReserved = 0; + bw.WriteInt16(regReserved); + if (hasID666) + { + bw.WriteFixedLengthString(au.Information.SongTitle, 32); + bw.WriteFixedLengthString(au.Information.AlbumTitle, 32); + bw.WriteFixedLengthString(au.Information.Creator, 16); + bw.WriteFixedLengthString(au.Information.Comments, 32); + string id666DumpDate = au.Information.DateCreated.ToString("YYYYMMDD"); + bw.WriteFixedLengthString(id666DumpDate, 11); + Writer arg_15E_0 = bw; + int num = au.Information.FadeOutDelay; + arg_15E_0.WriteFixedLengthString(num.ToString(), 3); + Writer arg_17A_0 = bw; + num = au.Information.FadeOutLength; + arg_17A_0.WriteFixedLengthString(num.ToString(), 5); + bw.WriteFixedLengthString(au.Information.SongArtist, 32); + bw.WriteByte(mvarID666DefaultChannelDisables); + bw.WriteByte((byte)mvarGenerator); + + bw.WriteFixedLengthBytes(this.mvarID666Reserved, 45); + } + byte[] regRAM = new byte[65536]; + bw.WriteBytes(regRAM); + byte[] regDSP = new byte[128]; + bw.WriteBytes(regDSP); + byte[] regUnused2 = new byte[64]; + bw.WriteBytes(regUnused2); + byte[] regExtra = new byte[64]; + bw.WriteBytes(regExtra); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs new file mode 100644 index 00000000..49297710 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Emulator.cs @@ -0,0 +1,31 @@ +// Universal Editor DataFormat for loading SPC700 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC +{ + /// + /// Description of SPC700Emulator. + /// + public enum SPC700Emulator : byte + { + Unknown = 0, + ZSNES = 1, + Snes9x = 2 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs new file mode 100644 index 00000000..1740af0c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ExtendedID666Tag.cs @@ -0,0 +1,30 @@ +// Universal Editor DataFormat for loading SPC700 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; + +namespace ExtensibleDataStorage.Media.SPC700 +{ + /// + /// Description of SPC700ExtendedID666Tag. + /// + public class SPC700ExtendedID666Tag + { + private bool mvarEnabled = false; + public bool Enabled { get { return mvarEnabled; } set { mvarEnabled = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs new file mode 100644 index 00000000..b2e2bf26 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700ID666Tag.cs @@ -0,0 +1,72 @@ +// Universal Editor DataFormat for loading SPC700 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC +{ + public enum SPC700ID666Format + { + None = 0, + Binary = 1, + Text = 2 + } + + /// + /// Description of SPC700ID666Tag. + /// + public class SPC700ID666Tag + { + + private SPC700ID666Format mvarFormat = SPC700ID666Format.Text; + public SPC700ID666Format Format { get { return mvarFormat; } set { mvarFormat = value; } } + + private string mvarSongTitle = ""; + public string SongTitle { get { return mvarSongTitle; } set { mvarSongTitle = value; } } + + private string mvarGameTitle = ""; + public string GameTitle { get { return mvarGameTitle; } set { mvarGameTitle = value; } } + + private string mvarDumperName = ""; + public string DumperName { get { return mvarDumperName; } set { mvarDumperName = value; } } + + private string mvarComments = ""; + public string Comments { get { return mvarComments; } set { mvarComments = value; } } + + private DateTime mvarDumpDate = DateTime.Now; + public DateTime DumpDate { get { return mvarDumpDate; } set { mvarDumpDate = value; } } + + private byte[] _fFadeOutSeconds = new byte[3]; + public byte[] fFadeOutSeconds { get { return _fFadeOutSeconds; } set { _fFadeOutSeconds = value; } } + + private byte[] _fFadeLength = new byte[5]; + public byte[] fFadeLength { get { return _fFadeLength; } set { _fFadeLength = value; } } + + private string mvarSongArtist = ""; + public string SongArtist { get { return mvarSongArtist; } set { mvarSongArtist = value; } } + + private bool mvarDefaultDisables = false; + public bool DefaultDisables { get { return mvarDefaultDisables; } set { mvarDefaultDisables = value; } } + + private SPC700Emulator mvarEmulator = SPC700Emulator.Unknown; + public SPC700Emulator Emulator { get { return mvarEmulator; } set { mvarEmulator = value; } } + + private byte[] _fReserved2 = new byte[45]; + public byte[] fReserved2 { get { return _fReserved2; } set { _fReserved2 = value; } } + + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs new file mode 100644 index 00000000..d64b29c1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Memory.cs @@ -0,0 +1,39 @@ +// Universal Editor DataFormat for loading SPC700 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC +{ + /// + /// Description of SPC700Memory. + /// + public class SPC700Memory + { + private byte[] _fRAM = new byte[65536]; + public byte[] fRAM { get { return _fRAM; } set { _fRAM = value; } } + + private byte[] _fDSP = new byte[128]; + public byte[] fDSP { get { return _fDSP; } set { _fDSP = value; } } + + private byte[] _fUnused = new byte[64]; + public byte[] fUnused { get { return _fUnused; } set { _fUnused = value; } } + + private byte[] _fExtra = new byte[64]; + public byte[] fExtra { get { return _fExtra; } set { _fExtra = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs new file mode 100644 index 00000000..c6d7375e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/SPC/SPC700Registers.cs @@ -0,0 +1,48 @@ +// Universal Editor DataFormat for loading SPC700 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC +{ + /// + /// Description of SPC700Registers. + /// + public class SPC700Registers + { + private ushort _fPC = 0; + public ushort fPC { get { return _fPC; } set { _fPC = value; } } + + private byte _fA = 0; + public byte fA { get { return _fA; } set { _fA = value; } } + + private byte _fX = 0; + public byte fX { get { return _fX; } set { _fX = value; } } + + private byte _fY = 0; + public byte fY { get { return _fY; } set { _fY = value; } } + + private byte _fPSW = 0; + public byte fPSW { get { return _fPSW; } set { _fPSW = value; } } + + private byte _fSP = 0; + public byte fSP { get { return _fSP; } set { _fSP = value; } } + + private ushort _fReserved1 = 0; + public ushort fReserved1 { get { return _fReserved1; } set { _fReserved1 = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/UTAU/USTDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/UTAU/USTDataFormat.cs new file mode 100644 index 00000000..d966dd2e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/UTAU/USTDataFormat.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.DataFormats.PropertyList; + +using UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary; +using UniversalEditor.DataFormats.Multimedia.Audio.VoicebankPhonemeDictionary; + +using UniversalEditor.Accessors; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.UTAU +{ + public class USTDataFormat : WindowsConfigurationDataFormat + { + #region Phoneme Dictionary + private static PhonemeDictionaryObjectModel mvarPhonemeDictionary = null; + public static void InitializePhonemeDictionary() + { + string BasePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string FileName = BasePath + System.IO.Path.DirectorySeparatorChar.ToString() + "PhonemeDictionary.xml"; + InitializePhonemeDictionary(FileName); + } + public static void InitializePhonemeDictionary(string FileName) + { + if (mvarPhonemeDictionary != null) return; + + mvarPhonemeDictionary = new PhonemeDictionaryObjectModel(); + ObjectModel om = mvarPhonemeDictionary; + + PhonemeDictionaryXMLDataFormat xdf = new PhonemeDictionaryXMLDataFormat(); + + try + { + Document.Load(om, xdf, new FileAccessor(FileName, false, false, false), true); + } + catch (InvalidDataFormatException ex) + { + // data format invalid + } + } + #endregion + + public USTDataFormat() + { + InitializePhonemeDictionary(); + } + + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + + dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + + // base.Accessor.DefaultEncoding = IO.Encoding.GetRuntimeEncoding(System.Text.Encoding.GetEncoding("shift-jis")); + throw new NotImplementedException(); + + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + PropertyListObjectModel plom = objectModels.Pop() as PropertyListObjectModel; + SynthesizedAudioObjectModel sa = objectModels.Pop() as SynthesizedAudioObjectModel; + sa.Tempo = double.Parse(plom.Groups["#SETTING"].Properties["Tempo"].Value.ToString()); + sa.Name = plom.Groups["#SETTING"].Properties["ProjectName"].Value.ToString(); + int trackCount = int.Parse(plom.Groups["#SETTING"].Properties["Tracks"].Value.ToString()); + int groupStart = 1; + for (int i = 0; i < trackCount; i++) + { + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + Group grp = plom.Groups[groupStart]; + while (grp.Name != "#TRACKEND") + { + SynthesizedAudioCommandNote note = null; + if (grp.Properties["Lyric"].Value.ToString() == "R") + { + note = new SynthesizedAudioCommandRest(); + } + else + { + note = new SynthesizedAudioCommandNote(); + } + note.Length = int.Parse(grp.Properties["Length"].Value.ToString()); + note.Lyric = grp.Properties["Lyric"].Value.ToString(); + note.Phoneme = LyricToPhoneme(note.Lyric); + note.Frequency = int.Parse(grp.Properties["NoteNum"].Value.ToString()); + if (grp.Properties["PreUtterance"] != null && grp.Properties["PreUtterance"].Value != null && !string.IsNullOrEmpty(grp.Properties["PreUtterance"].Value.ToString())) + { + note.PreUtterance = int.Parse(grp.Properties["PreUtterance"].Value.ToString()); + } + if (grp.Properties["VoiceOverlap"] != null && grp.Properties["VoiceOverlap"].Value != null && !string.IsNullOrEmpty(grp.Properties["VoiceOverlap"].Value.ToString())) + { + note.VoiceOverlap = int.Parse(grp.Properties["VoiceOverlap"].Value.ToString()); + } + if (grp.Properties["Intensity"] != null && grp.Properties["Intensity"].Value != null && !string.IsNullOrEmpty(grp.Properties["Intensity"].Value.ToString())) + { + note.Intensity = int.Parse(grp.Properties["Intensity"].Value.ToString()); + } + if (grp.Properties["Moduration"] != null && grp.Properties["Moduration"].Value != null && !string.IsNullOrEmpty(grp.Properties["Moduration"].Value.ToString())) + { + note.Modulation = int.Parse(grp.Properties["Moduration"].Value.ToString()); + } + if (grp.Properties["PBType"] != null && grp.Properties["PBType"].Value != null && !string.IsNullOrEmpty(grp.Properties["PBType"].Value.ToString())) + { + note.PBType = int.Parse(grp.Properties["PBType"].Value.ToString()); + } + if (grp.Properties["Piches"] != null && grp.Properties["Piches"].Value != null && !string.IsNullOrEmpty(grp.Properties["Piches"].Value.ToString())) + { + note.Pitches = grp.Properties["Piches"].Value.ToString().Split(new char[] { ',' }); + } + if (grp.Properties["Envelope"] != null && grp.Properties["Envelope"].Value != null && !string.IsNullOrEmpty(grp.Properties["Envelope"].Value.ToString())) + { + note.Envelope = grp.Properties["Envelope"].Value.ToString().Split(new char[] + { + ',' + }); + } + if (grp.Properties["VBR"] != null && grp.Properties["VBR"].Value != null && !string.IsNullOrEmpty(grp.Properties["VBR"].Value.ToString())) + { + note.VBR = grp.Properties["VBR"].Value.ToString().Split(new char[] { ',' }); + } + track.Commands.Add(note); + groupStart++; + grp = plom.Groups[groupStart]; + } + sa.Tracks.Add(track); + } + } + + private string LyricToPhoneme(string lyric) + { + // Use PhonemeDictionary.xml lookup table to find the phoneme that corresponds to the + // lyric + Phoneme p = mvarPhonemeDictionary.PhonemeLists[0].GetPhonemeFromMapping(lyric); + if (p == null) return null; + return p.Value; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQDataFormat.cs new file mode 100644 index 00000000..0e565461 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQDataFormat.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.PropertyList; +using UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.MIDI; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.Accessors; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.Vocaloid +{ + public class VSQDataFormat : MIDIDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void AfterLoadInternal(Stack objectModels) + { + SynthesizedAudioObjectModel audio = objectModels.Pop() as SynthesizedAudioObjectModel; + for (int i = 1; i < audio.Tracks.Count; i++) + { + SynthesizedAudioTrack track = audio.Tracks[i]; + string text = string.Empty; + foreach (SynthesizedAudioCommand cmd in track.Commands) + { + if (cmd is SynthesizedAudioCommandText) + { + string textt = (cmd as SynthesizedAudioCommandText).Text; + if (textt.StartsWith("DM:")) + { + textt = textt.Substring(8); + } + text += textt; + } + } + PropertyListObjectModel plom = new PropertyListObjectModel(); + ObjectModel om = plom; + + WindowsConfigurationDataFormat ini = new WindowsConfigurationDataFormat(); + ini.CommentSignals = new string[0]; + + Document.Load(om, ini, new StringAccessor(text), true); + + foreach (Group grp in plom.Groups) + { + string text2 = grp.Name; + switch (text2) + { + case "Common": + case "Master": + case "Mixer": + { + break; + } + case "EventList": + { + foreach (Property prop in grp.Properties) + { + string eventName = prop.Name; + string eventValue = prop.Value.ToString(); + int thisNotePosition = int.Parse(eventName); + if (eventValue.StartsWith("ID#")) + { + Group eventGroup = plom.Groups[eventValue]; + text2 = eventGroup.Properties["Type"].Value.ToString(); + switch (text2) + { + case "Anote": + { + SynthesizedAudioCommandNote note = new SynthesizedAudioCommandNote(); + Group lyricInfo = plom.Groups[eventGroup.Properties["LyricHandle"].Value.ToString()]; + string phonemeInfo = lyricInfo.Properties["L0"].Value.ToString(); + int length = int.Parse(eventGroup.Properties["Length"].Value.ToString()); + int noteNumber = int.Parse(eventGroup.Properties["Note#"].Value.ToString()); + string[] phonemeInfos = phonemeInfo.Split(new char[] + { + ',' + }, "\""); + note.Lyric = phonemeInfos[0]; + note.Phoneme = phonemeInfos[1]; + note.Length = length; + note.Frequency = 128 - noteNumber; + track.Commands.Add(note); + if (grp.Properties.IndexOf(prop) < grp.Properties.Count - 1) + { + int nextNotePosition = int.Parse(grp.Properties[grp.Properties.IndexOf(prop) + 1].Name); + if (thisNotePosition + note.Length < nextNotePosition) + { + int restLength = nextNotePosition - thisNotePosition; + SynthesizedAudioCommandRest rest = new SynthesizedAudioCommandRest(); + rest.Length = restLength; + track.Commands.Add(rest); + } + } + break; + } + case "Singer": + { + Group singerInfo = plom.Groups[eventGroup.Properties["IconHandle"].Value.ToString()]; + string singerName = singerInfo.Properties["IDS"].Value.ToString(); + int programChange = int.Parse(singerInfo.Properties["Program"].Value.ToString()); + break; + } + } + } + } + break; + } + } + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs new file mode 100644 index 00000000..4a9d34e1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Synthesized/Vocaloid/VSQXDataFormat.cs @@ -0,0 +1,830 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.Vocaloid +{ + public class VSQXDataFormat : XMLDataFormat + { + private string mvarProductVendor = String.Empty; + public string ProductVendor { get { return mvarProductVendor; } set { mvarProductVendor = value; } } + + private Version mvarProductVersion = new Version(1, 0); + public Version ProductVersion { get { return mvarProductVersion; } set { mvarProductVersion = value; } } + + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = new DataFormatReference(this.GetType()); + dfr.Capabilities.Add(typeof(SynthesizedAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + SynthesizedAudioObjectModel au = (objectModels.Pop() as SynthesizedAudioObjectModel); + if (au == null) throw new ObjectModelNotSupportedException(); + + MarkupTagElement tagVSQ3 = mom.Elements["vsq3"] as MarkupTagElement; + if (tagVSQ3 != null) + { + foreach (MarkupElement el in tagVSQ3.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + string text = tag.FullName; + if (text != null) + { + if (!(text == "vender")) + { + if (!(text == "version")) + { + if (text == "vsTrack") + { + SynthesizedAudioTrack track = new SynthesizedAudioTrack(); + MarkupTagElement tagTrackName = tag.Elements["trackName"] as MarkupTagElement; + if (tagTrackName != null) + { + MarkupStringElement tagTrackNameCDATA = tagTrackName.Elements[0] as MarkupStringElement; + if (tagTrackNameCDATA != null) + { + track.Name = tagTrackNameCDATA.Value; + } + } + MarkupTagElement tagTrackComment = tag.Elements["comment"] as MarkupTagElement; + if (tagTrackComment != null) + { + MarkupStringElement tagTrackNameCDATA = tagTrackComment.Elements[0] as MarkupStringElement; + if (tagTrackNameCDATA != null) + { + track.Comment = tagTrackNameCDATA.Value; + } + } + foreach (MarkupElement el2 in tag.Elements) + { + MarkupTagElement tag2 = el2 as MarkupTagElement; + if (tag2 != null) + { + text = tag2.FullName; + if (text != null) + { + if (!(text == "stylePlugin")) + { + if (text == "note") + { + SynthesizedAudioCommandNote note = new SynthesizedAudioCommandNote(); + MarkupTagElement tagPosTick = tag2.Elements["posTick"] as MarkupTagElement; + if (tagPosTick != null) + { + int posTick = 0; + if (int.TryParse(tagPosTick.Value, out posTick)) + { + note.Position = posTick; + } + } + MarkupTagElement tagDurTick = tag2.Elements["durTick"] as MarkupTagElement; + if (tagDurTick != null) + { + int durTick = 0; + if (int.TryParse(tagDurTick.Value, out durTick)) + { + note.Length = durTick; + } + } + MarkupTagElement tagNoteNum = tag2.Elements["noteNum"] as MarkupTagElement; + if (tagNoteNum != null) + { + int noteNum = 0; + if (int.TryParse(tagNoteNum.Value, out noteNum)) + { + note.Frequency = noteNum; + } + } + MarkupTagElement tagVelocity = tag2.Elements["velocity"] as MarkupTagElement; + if (tagVelocity != null) + { + int velocity = 0; + if (int.TryParse(tagVelocity.Value, out velocity)) + { + note.Intensity = velocity; + } + } + MarkupTagElement tagLyric = tag2.Elements["lyric"] as MarkupTagElement; + if (tagLyric != null) + { + MarkupStringElement tagLyricCDATA = tagLyric.Elements[0] as MarkupStringElement; + if (tagLyricCDATA != null) + { + note.Lyric = tagLyricCDATA.Value; + } + } + MarkupTagElement tagPhoneme = tag2.Elements["phnms"] as MarkupTagElement; + if (tagPhoneme != null) + { + MarkupStringElement tagPhonemeCDATA = tagPhoneme.Elements[0] as MarkupStringElement; + if (tagPhonemeCDATA != null) + { + note.Phoneme = tagPhonemeCDATA.Value; + } + } + MarkupTagElement tagNoteStyle = tag2.Elements["noteStyle"] as MarkupTagElement; + if (tagNoteStyle != null) + { + foreach (MarkupElement elAttr in tagNoteStyle.Elements) + { + MarkupTagElement tagAttr = elAttr as MarkupTagElement; + if (tagAttr != null) + { + if (tagAttr.Attributes["id"] != null) + { + if (tagAttr.Name == "attr") + { + text = tagAttr.Attributes["id"].Value; + switch (text) + { + case "accent": + { + string value = tagAttr.Value; + int realValue = 50; + int.TryParse(value, out realValue); + note.Accent = realValue; + break; + } + case "bendDep": + { + string value = tagAttr.Value; + int realValue = 8; + int.TryParse(value, out realValue); + note.PitchBendDepth = realValue; + break; + } + case "bendLen": + { + string value = tagAttr.Value; + int realValue = 0; + int.TryParse(value, out realValue); + note.PitchBendLength = realValue; + break; + } + case "decay": + { + string value = tagAttr.Value; + int realValue = 50; + int.TryParse(value, out realValue); + note.Decay = realValue; + break; + } + case "fallPort": + { + string value = tagAttr.Value; + bool realValue2 = false; + bool.TryParse(value, out realValue2); + note.PortamentoFalling = realValue2; + break; + } + case "opening": + { + string value = tagAttr.Value; + int realValue = 127; + int.TryParse(value, out realValue); + note.Opening = realValue; + break; + } + case "risePort": + { + string value = tagAttr.Value; + bool realValue2 = false; + bool.TryParse(value, out realValue2); + note.PortamentoRising = realValue2; + break; + } + case "vibLen": + { + string value = tagAttr.Value; + int realValue = 66; + int.TryParse(value, out realValue); + note.VibratoLength = realValue; + break; + } + case "vibType": + { + string value = tagAttr.Value; + SynthesizedAudioVibratoType realValue3 = SynthesizedAudioVibratoType.None; + try + { + realValue3 = (SynthesizedAudioVibratoType)Enum.Parse(typeof(SynthesizedAudioVibratoType), value); + } + catch + { + } + note.VibratoType = realValue3; + break; + } + } + } + else + { + if (tagAttr.FullName == "seqAttr") + { + if (tagAttr.Attributes["id"] != null) + { + text = tagAttr.Attributes["id"].Value; + if (text != null) + { + if (!(text == "vibDep")) + { + if (text == "vibRate") + { + MarkupTagElement tagPosNrm = tagAttr.FindElement(new string[] + { + "elem", + "posNrm" + }) as MarkupTagElement; + MarkupTagElement tagElv = tagAttr.FindElement(new string[] + { + "elem", + "elv" + }) as MarkupTagElement; + if (tagPosNrm != null) + { + int posNrm = 0; + int.TryParse(tagPosNrm.Value, out posNrm); + } + if (tagElv != null) + { + int elv = 0; + int.TryParse(tagElv.Value, out elv); + } + } + } + else + { + MarkupTagElement tagPosNrm = tagAttr.FindElement(new string[] + { + "elem", + "posNrm" + }) as MarkupTagElement; + MarkupTagElement tagElv = tagAttr.FindElement(new string[] + { + "elem", + "elv" + }) as MarkupTagElement; + if (tagPosNrm != null) + { + int posNrm = 0; + int.TryParse(tagPosNrm.Value, out posNrm); + } + if (tagElv != null) + { + int elv = 0; + int.TryParse(tagElv.Value, out elv); + } + } + } + } + } + } + } + } + } + } + track.Commands.Add(note); + } + } + else + { + Guid StylePluginID = Guid.Empty; + string StylePluginName = string.Empty; + Version StylePluginVersion = new Version(1, 0, 0, 0); + MarkupTagElement tagStylePluginID = tag2.Elements["stylePluginID"] as MarkupTagElement; + if (tagStylePluginID != null) + { + MarkupStringElement tagStylePluginIDCDATA = tagStylePluginID.Elements[0] as MarkupStringElement; + if (tagStylePluginIDCDATA != null) + { + try + { + StylePluginID = new Guid(tagStylePluginIDCDATA.Value); + } + catch + { + } + } + } + MarkupTagElement tagStylePluginName = tag2.Elements["stylePluginName"] as MarkupTagElement; + if (tagStylePluginName != null) + { + MarkupStringElement tagStylePluginNameCDATA = tagStylePluginName.Elements[0] as MarkupStringElement; + if (tagStylePluginNameCDATA != null) + { + StylePluginName = tagStylePluginNameCDATA.Value; + } + } + MarkupTagElement tagStylePluginVersion = tag2.Elements["version"] as MarkupTagElement; + if (tagStylePluginVersion != null) + { + MarkupStringElement tagStylePluginVersionCDATA = tagStylePluginVersion.Elements[0] as MarkupStringElement; + if (tagStylePluginVersionCDATA != null) + { + StylePluginVersion = new Version(tagStylePluginVersionCDATA.Value); + } + } + SynthesizedAudioStylePlugin plugin = new SynthesizedAudioStylePlugin(); + plugin.ID = StylePluginID; + plugin.Name = StylePluginName; + plugin.Version = StylePluginVersion; + } + } + } + } + au.Tracks.Add(track); + } + } + else + { + MarkupStringElement tagCDATA = tag.Elements[0] as MarkupStringElement; + if (tagCDATA != null) + { + mvarProductVersion = new Version(tagCDATA.Value); + } + } + } + else + { + MarkupStringElement tagCDATA = tag.Elements[0] as MarkupStringElement; + if (tagCDATA != null) + { + mvarProductVendor = tagCDATA.Value; + } + } + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + SynthesizedAudioObjectModel au = objectModels.Pop() as SynthesizedAudioObjectModel; + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupPreprocessorElement xml = new MarkupPreprocessorElement(); + xml.Name = "xml"; + xml.Value = "version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\""; + mom.Elements.Add(xml); + MarkupTagElement tagVSQ3 = new MarkupTagElement(); + tagVSQ3.Attributes.Add("xmlns", "http://www.yamaha.co.jp/vocaloid/schema/vsq3/"); + tagVSQ3.Attributes.Add("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); + tagVSQ3.Attributes.Add("xsi:schemaLocation", "http://www.yamaha.co.jp/vocaloid/schema/vsq3/vsq3.xsd"); + MarkupTagElement tagVender = new MarkupTagElement(); + tagVender.FullName = "vender"; + MarkupStringElement tagVenderCDATA = new MarkupStringElement(); + tagVenderCDATA.Name = "CDATA"; + tagVenderCDATA.Value = mvarProductVendor; + tagVender.Elements.Add(tagVenderCDATA); + tagVSQ3.Elements.Add(tagVender); + MarkupTagElement tagVersion = new MarkupTagElement(); + tagVersion.FullName = "version"; + MarkupStringElement tagVersionCDATA = new MarkupStringElement(); + tagVersionCDATA.Name = "CDATA"; + tagVersionCDATA.Value = mvarProductVersion.ToString(); + tagVersion.Elements.Add(tagVersionCDATA); + tagVSQ3.Elements.Add(tagVersion); + MarkupTagElement tagvVoiceTable = new MarkupTagElement(); + tagvVoiceTable.FullName = "vVoiceTable"; + foreach (VoicebankObjectModel voice in au.Voices) + { + MarkupTagElement tagvVoice = new MarkupTagElement(); + tagvVoice.FullName = "vVoice"; + MarkupTagElement tagvBS = new MarkupTagElement(); + tagvBS.FullName = "vBS"; + MarkupElement arg_1AB_0 = tagvBS; + int num = voice.BankSelect; + arg_1AB_0.Value = num.ToString(); + tagvVoice.Elements.Add(tagvBS); + MarkupTagElement tagvPC = new MarkupTagElement(); + tagvPC.FullName = "vPC"; + MarkupElement arg_1E6_0 = tagvPC; + num = voice.ProgramChange; + arg_1E6_0.Value = num.ToString(); + tagvVoice.Elements.Add(tagvPC); + MarkupTagElement tagcompID = new MarkupTagElement(); + tagcompID.FullName = "compID"; + MarkupStringElement tagcompIDCDATA = new MarkupStringElement(); + tagcompIDCDATA.Name = "CDATA"; + tagcompIDCDATA.Value = voice.ID; + tagcompID.Elements.Add(tagcompIDCDATA); + tagvVoice.Elements.Add(tagcompID); + MarkupTagElement tagvVoiceName = new MarkupTagElement(); + tagvVoiceName.FullName = "vVoiceName"; + MarkupStringElement tagvVoiceNameCDATA = new MarkupStringElement(); + tagvVoiceNameCDATA.Name = "CDATA"; + tagvVoiceNameCDATA.Value = voice.ID; + tagvVoiceName.Elements.Add(tagvVoiceNameCDATA); + tagvVoice.Elements.Add(tagvVoiceName); + MarkupTagElement tagvVoiceParam = new MarkupTagElement(); + tagvVoiceParam.FullName = "vVoiceParam"; + MarkupTagElement tagvVoiceParamBRE = new MarkupTagElement(); + tagvVoiceParamBRE.FullName = "bre"; + MarkupElement arg_2E9_0 = tagvVoiceParamBRE; + byte b = voice.SynthesisParameters.Breathiness; + arg_2E9_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamBRE); + MarkupTagElement tagvVoiceParamBRI = new MarkupTagElement(); + tagvVoiceParamBRI.FullName = "bri"; + MarkupElement arg_329_0 = tagvVoiceParamBRI; + b = voice.SynthesisParameters.Brightness; + arg_329_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamBRI); + MarkupTagElement tagvVoiceParamCLE = new MarkupTagElement(); + tagvVoiceParamCLE.FullName = "cle"; + MarkupElement arg_369_0 = tagvVoiceParamCLE; + b = voice.SynthesisParameters.Clearness; + arg_369_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamCLE); + MarkupTagElement tagvVoiceParamGEN = new MarkupTagElement(); + tagvVoiceParamGEN.FullName = "gen"; + MarkupElement arg_3A9_0 = tagvVoiceParamGEN; + b = voice.SynthesisParameters.GenderFactor; + arg_3A9_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamGEN); + MarkupTagElement tagvVoiceParamOPE = new MarkupTagElement(); + tagvVoiceParamOPE.FullName = "ope"; + MarkupElement arg_3E9_0 = tagvVoiceParamOPE; + b = voice.SynthesisParameters.Openness; + arg_3E9_0.Value = b.ToString(); + tagvVoiceParam.Elements.Add(tagvVoiceParamOPE); + tagvVoice.Elements.Add(tagvVoiceParam); + tagvVoiceTable.Elements.Add(tagvVoice); + } + tagVSQ3.Elements.Add(tagvVoiceTable); + MarkupTagElement tagMixer = new MarkupTagElement(); + tagMixer.FullName = "mixer"; + MarkupTagElement tagMasterUnit = new MarkupTagElement(); + tagMasterUnit.FullName = "masterUnit"; + MarkupTagElement tagOutDev = new MarkupTagElement(); + tagOutDev.FullName = "outDev"; + tagOutDev.Value = "0"; + tagMasterUnit.Elements.Add(tagOutDev); + MarkupTagElement tagRetLevel = new MarkupTagElement(); + tagRetLevel.FullName = "retLevel"; + tagRetLevel.Value = "0"; + tagMasterUnit.Elements.Add(tagRetLevel); + MarkupTagElement tagVolume = new MarkupTagElement(); + tagVolume.FullName = "vol"; + tagVolume.Value = "0"; + tagMasterUnit.Elements.Add(tagVolume); + tagMixer.Elements.Add(tagMasterUnit); + MarkupTagElement tagInGain; + MarkupTagElement tagSendLevel; + MarkupTagElement tagSendEnable; + MarkupTagElement tagMute; + MarkupTagElement tagSolo; + MarkupTagElement tagPan; + MarkupTagElement tagVol; + foreach (SynthesizedAudioTrack track in au.Tracks) + { + MarkupTagElement tagVSUnit = new MarkupTagElement(); + tagVSUnit.FullName = "vsUnit"; + MarkupTagElement tagVSTrackNo = new MarkupTagElement(); + tagVSTrackNo.FullName = "vsTrackNo"; + MarkupElement arg_57B_0 = tagVSTrackNo; + int num = au.Tracks.IndexOf(track); + arg_57B_0.Value = num.ToString(); + tagVSUnit.Elements.Add(tagVSTrackNo); + tagInGain = new MarkupTagElement(); + tagInGain.FullName = "inGain"; + tagInGain.Value = "0"; + tagVSUnit.Elements.Add(tagInGain); + tagSendLevel = new MarkupTagElement(); + tagSendLevel.FullName = "sendLevel"; + tagSendLevel.Value = "0"; + tagVSUnit.Elements.Add(tagSendLevel); + tagSendEnable = new MarkupTagElement(); + tagSendEnable.FullName = "sendEnable"; + tagSendEnable.Value = "0"; + tagVSUnit.Elements.Add(tagSendEnable); + tagMute = new MarkupTagElement(); + tagMute.FullName = "mute"; + tagMute.Value = (track.IsMuted ? "1" : "0"); + tagVSUnit.Elements.Add(tagMute); + tagSolo = new MarkupTagElement(); + tagSolo.FullName = "solo"; + tagSolo.Value = (track.IsSolo ? "1" : "0"); + tagVSUnit.Elements.Add(tagSolo); + tagPan = new MarkupTagElement(); + tagPan.FullName = "pan"; + MarkupElement arg_6C6_0 = tagPan; + byte b = track.Panpot; + arg_6C6_0.Value = b.ToString(); + tagVSUnit.Elements.Add(tagPan); + tagVol = new MarkupTagElement(); + tagVol.FullName = "vol"; + MarkupElement arg_701_0 = tagVol; + b = track.Volume; + arg_701_0.Value = b.ToString(); + tagVSUnit.Elements.Add(tagVol); + tagMixer.Elements.Add(tagVSUnit); + } + MarkupTagElement tagSEUnit = new MarkupTagElement(); + tagSEUnit.FullName = "seUnit"; + tagInGain = new MarkupTagElement(); + tagInGain.FullName = "inGain"; + tagInGain.Value = "0"; + tagSEUnit.Elements.Add(tagInGain); + tagSendLevel = new MarkupTagElement(); + tagSendLevel.FullName = "sendLevel"; + tagSendLevel.Value = "0"; + tagSEUnit.Elements.Add(tagSendLevel); + tagSendEnable = new MarkupTagElement(); + tagSendEnable.FullName = "sendEnable"; + tagSendEnable.Value = "0"; + tagSEUnit.Elements.Add(tagSendEnable); + tagMute = new MarkupTagElement(); + tagMute.FullName = "mute"; + tagMute.Value = "0"; + tagSEUnit.Elements.Add(tagMute); + tagSolo = new MarkupTagElement(); + tagSolo.FullName = "solo"; + tagSolo.Value = "0"; + tagSEUnit.Elements.Add(tagSolo); + tagPan = new MarkupTagElement(); + tagPan.FullName = "pan"; + tagPan.Value = "64"; + tagSEUnit.Elements.Add(tagPan); + tagVol = new MarkupTagElement(); + tagVol.FullName = "vol"; + tagVol.Value = "0"; + tagSEUnit.Elements.Add(tagVol); + tagMixer.Elements.Add(tagSEUnit); + MarkupTagElement tagKaraokeUnit = new MarkupTagElement(); + tagKaraokeUnit.FullName = "karaokeUnit"; + tagInGain = new MarkupTagElement(); + tagInGain.FullName = "inGain"; + tagInGain.Value = "0"; + tagKaraokeUnit.Elements.Add(tagInGain); + tagMute = new MarkupTagElement(); + tagMute.FullName = "mute"; + tagMute.Value = "0"; + tagKaraokeUnit.Elements.Add(tagMute); + tagSolo = new MarkupTagElement(); + tagSolo.FullName = "solo"; + tagSolo.Value = "0"; + tagKaraokeUnit.Elements.Add(tagSolo); + tagVol = new MarkupTagElement(); + tagVol.FullName = "vol"; + tagVol.Value = "0"; + tagKaraokeUnit.Elements.Add(tagVol); + tagMixer.Elements.Add(tagKaraokeUnit); + tagVSQ3.Elements.Add(tagMixer); + MarkupTagElement tagMasterTrack = new MarkupTagElement(); + tagMasterTrack.FullName = "masterTrack"; + MarkupTagElement tagSeqName = new MarkupTagElement(); + tagSeqName.FullName = "seqName"; + MarkupStringElement tagSeqNameCDATA = new MarkupStringElement(); + tagSeqNameCDATA.Name = "CDATA"; + tagSeqNameCDATA.Value = "Voice1"; + tagSeqName.Elements.Add(tagSeqNameCDATA); + tagMasterTrack.Elements.Add(tagSeqName); + MarkupTagElement tagComment = new MarkupTagElement(); + tagComment.FullName = "comment"; + MarkupStringElement tagCommentCDATA = new MarkupStringElement(); + tagCommentCDATA.Name = "CDATA"; + tagCommentCDATA.Value = "Voice1"; + tagComment.Elements.Add(tagCommentCDATA); + tagMasterTrack.Elements.Add(tagComment); + MarkupTagElement tagResolution = new MarkupTagElement(); + tagResolution.FullName = "resolution"; + tagResolution.Value = "480"; + tagMasterTrack.Elements.Add(tagResolution); + MarkupTagElement tagPreMeasure = new MarkupTagElement(); + tagPreMeasure.FullName = "preMeasure"; + tagPreMeasure.Value = "480"; + tagMasterTrack.Elements.Add(tagPreMeasure); + MarkupTagElement tagTimeSig = new MarkupTagElement(); + tagTimeSig.FullName = "timeSig"; + MarkupTagElement tagTimeSigPosMes = new MarkupTagElement(); + tagTimeSigPosMes.FullName = "posMes"; + tagTimeSigPosMes.Value = "0"; + tagTimeSig.Elements.Add(tagTimeSigPosMes); + MarkupTagElement tagTimeSigNume = new MarkupTagElement(); + tagTimeSigNume.FullName = "nume"; + tagTimeSigNume.Value = "4"; + tagTimeSig.Elements.Add(tagTimeSigNume); + MarkupTagElement tagTimeSigDenomi = new MarkupTagElement(); + tagTimeSigDenomi.FullName = "denomi"; + tagTimeSigDenomi.Value = "4"; + tagTimeSig.Elements.Add(tagTimeSigDenomi); + tagMasterTrack.Elements.Add(tagTimeSig); + MarkupTagElement tagTempo = new MarkupTagElement(); + tagTempo.FullName = "tempo"; + MarkupTagElement tagTempoPosTick = new MarkupTagElement(); + tagTempoPosTick.FullName = "posTick"; + tagTempoPosTick.Value = "0"; + tagTempo.Elements.Add(tagTempoPosTick); + MarkupTagElement tagTempoBPM = new MarkupTagElement(); + tagTempoBPM.FullName = "bpm"; + tagTempoBPM.Value = "20500"; + tagTempo.Elements.Add(tagTempoBPM); + tagTempo.Elements.Add(tagTempoPosTick); + tagMasterTrack.Elements.Add(tagTempo); + tagVSQ3.Elements.Add(tagMasterTrack); + foreach (SynthesizedAudioTrack track in au.Tracks) + { + MarkupTagElement tagVSTrack = new MarkupTagElement(); + tagVSTrack.FullName = "vsTrack"; + MarkupTagElement tagVSTrackNo = new MarkupTagElement(); + tagVSTrackNo.FullName = "vsTrackNo"; + MarkupElement arg_C87_0 = tagVSTrackNo; + int num = au.Tracks.IndexOf(track); + arg_C87_0.Value = num.ToString(); + tagVSTrack.Elements.Add(tagVSTrackNo); + MarkupTagElement tagTrackName = new MarkupTagElement(); + tagTrackName.FullName = "trackName"; + MarkupStringElement tagTrackNameCDATA = new MarkupStringElement(); + tagTrackNameCDATA.Name = "CDATA"; + tagTrackNameCDATA.Value = track.Name; + tagTrackName.Elements.Add(tagTrackNameCDATA); + tagVSTrack.Elements.Add(tagTrackName); + tagComment = new MarkupTagElement(); + tagComment.FullName = "comment"; + tagCommentCDATA = new MarkupStringElement(); + tagCommentCDATA.Name = "CDATA"; + if (!string.IsNullOrEmpty(track.Comment)) + { + tagCommentCDATA.Value = track.Comment; + } + else + { + tagCommentCDATA.Value = track.Name; + } + tagComment.Elements.Add(tagCommentCDATA); + tagVSTrack.Elements.Add(tagComment); + MarkupTagElement tagMusicalPart = new MarkupTagElement(); + tagMusicalPart.FullName = "musicalPart"; + foreach (SynthesizedAudioCommand cmd in track.Commands) + { + if (cmd is SynthesizedAudioCommandNote) + { + SynthesizedAudioCommandNote note = cmd as SynthesizedAudioCommandNote; + MarkupTagElement tagNote = new MarkupTagElement(); + tagNote.FullName = "note"; + MarkupTagElement tagNotePosTick = new MarkupTagElement(); + tagNotePosTick.FullName = "posTick"; + MarkupElement arg_E00_0 = tagNotePosTick; + num = note.Position; + arg_E00_0.Value = num.ToString(); + tagNote.Elements.Add(tagNotePosTick); + MarkupTagElement tagNoteDurTick = new MarkupTagElement(); + tagNoteDurTick.FullName = "durTick"; + MarkupElement arg_E3D_0 = tagNoteDurTick; + num = (int)note.Length; + arg_E3D_0.Value = num.ToString(); + tagNote.Elements.Add(tagNoteDurTick); + MarkupTagElement tagNoteNum = new MarkupTagElement(); + tagNoteNum.FullName = "noteNum"; + MarkupElement arg_E7A_0 = tagNoteNum; + arg_E7A_0.Value = note.Frequency.ToString(); + tagNote.Elements.Add(tagNoteNum); + MarkupTagElement tagVelocity = new MarkupTagElement(); + tagVelocity.FullName = "velocity"; + MarkupElement arg_EB7_0 = tagVelocity; + arg_EB7_0.Value = note.Frequency.ToString(); + tagNote.Elements.Add(tagVelocity); + MarkupTagElement tagLyric = new MarkupTagElement(); + tagLyric.FullName = "lyric"; + MarkupStringElement tagLyricCDATA = new MarkupStringElement(); + tagLyricCDATA.Name = "CDATA"; + tagLyricCDATA.Value = note.Lyric.ToString(); + tagLyric.Elements.Add(tagLyricCDATA); + tagNote.Elements.Add(tagLyric); + MarkupTagElement tagPhoneme = new MarkupTagElement(); + tagPhoneme.FullName = "phnms"; + MarkupStringElement tagPhonemeCDATA = new MarkupStringElement(); + tagPhonemeCDATA.Name = "CDATA"; + tagPhonemeCDATA.Value = note.Phoneme.ToString(); + tagPhoneme.Elements.Add(tagPhonemeCDATA); + tagNote.Elements.Add(tagPhoneme); + MarkupTagElement tagNoteStyle = new MarkupTagElement(); + tagNoteStyle.FullName = "noteStyle"; + MarkupTagElement tagNoteStyleAccent = new MarkupTagElement(); + tagNoteStyleAccent.FullName = "attr"; + tagNoteStyleAccent.Attributes.Add("id", "accent"); + MarkupElement arg_FD7_0 = tagNoteStyleAccent; + num = note.Accent; + arg_FD7_0.Value = num.ToString(); + tagNoteStyle.Elements.Add(tagNoteStyleAccent); + MarkupTagElement tagNoteStyleBendDepth = new MarkupTagElement(); + tagNoteStyleBendDepth.FullName = "attr"; + tagNoteStyleBendDepth.Attributes.Add("id", "bendDep"); + MarkupElement arg_1029_0 = tagNoteStyleBendDepth; + num = note.PitchBendDepth; + arg_1029_0.Value = num.ToString(); + tagNoteStyle.Elements.Add(tagNoteStyleBendDepth); + MarkupTagElement tagNoteStyleBendLength = new MarkupTagElement(); + tagNoteStyleBendLength.FullName = "attr"; + tagNoteStyleBendLength.Attributes.Add("id", "bendLen"); + MarkupElement arg_107B_0 = tagNoteStyleBendLength; + num = note.PitchBendLength; + arg_107B_0.Value = num.ToString(); + tagNoteStyle.Elements.Add(tagNoteStyleBendLength); + MarkupTagElement tagNoteStyleDecay = new MarkupTagElement(); + tagNoteStyleDecay.FullName = "attr"; + tagNoteStyleDecay.Attributes.Add("id", "decay"); + tagNoteStyleDecay.Value = "50"; + tagNoteStyle.Elements.Add(tagNoteStyleDecay); + MarkupTagElement tagNoteStyleFallPort = new MarkupTagElement(); + tagNoteStyleFallPort.FullName = "attr"; + tagNoteStyleFallPort.Attributes.Add("id", "fallPort"); + tagNoteStyleFallPort.Value = (note.PortamentoFalling ? "1" : "0"); + tagNoteStyle.Elements.Add(tagNoteStyleFallPort); + MarkupTagElement tagNoteStyleOpening = new MarkupTagElement(); + tagNoteStyleOpening.FullName = "attr"; + tagNoteStyleOpening.Attributes.Add("id", "opening"); + tagNoteStyleOpening.Value = "127"; + tagNoteStyle.Elements.Add(tagNoteStyleOpening); + MarkupTagElement tagNoteStyleRisePort = new MarkupTagElement(); + tagNoteStyleRisePort.FullName = "attr"; + tagNoteStyleRisePort.Attributes.Add("id", "risePort"); + tagNoteStyleRisePort.Value = (note.PortamentoRising ? "1" : "0"); + tagNoteStyle.Elements.Add(tagNoteStyleRisePort); + MarkupTagElement tagNoteStyleVibLen = new MarkupTagElement(); + tagNoteStyleVibLen.FullName = "attr"; + tagNoteStyleVibLen.Attributes.Add("id", "vibLen"); + tagNoteStyleVibLen.Value = "0"; + tagNoteStyle.Elements.Add(tagNoteStyleVibLen); + MarkupTagElement tagNoteStyleVibType = new MarkupTagElement(); + tagNoteStyleVibType.FullName = "attr"; + tagNoteStyleVibType.Attributes.Add("id", "vibType"); + tagNoteStyleVibType.Value = "0"; + tagNoteStyle.Elements.Add(tagNoteStyleVibType); + if (note.VibratoType != SynthesizedAudioVibratoType.None) + { + MarkupTagElement tagSeqAttr = new MarkupTagElement(); + tagSeqAttr.FullName = "seqAttr"; + tagSeqAttr.Attributes.Add("id", "vibDep"); + MarkupTagElement tagSeqAttrElem = new MarkupTagElement(); + tagSeqAttr.FullName = "elem"; + MarkupTagElement tagSeqAttrElemPosNrm = new MarkupTagElement(); + tagSeqAttrElemPosNrm.FullName = "posNrm"; + tagSeqAttrElemPosNrm.Value = "27670"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemPosNrm); + MarkupTagElement tagSeqAttrElemElv = new MarkupTagElement(); + tagSeqAttrElemElv.FullName = "elv"; + tagSeqAttrElemElv.Value = "64"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemElv); + tagSeqAttr.Elements.Add(tagSeqAttrElem); + tagSeqAttr = new MarkupTagElement(); + tagSeqAttr.FullName = "seqAttr"; + tagSeqAttr.Attributes.Add("id", "vibRate"); + tagSeqAttrElem = new MarkupTagElement(); + tagSeqAttr.FullName = "elem"; + tagSeqAttrElemPosNrm = new MarkupTagElement(); + tagSeqAttrElemPosNrm.FullName = "posNrm"; + tagSeqAttrElemPosNrm.Value = "27670"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemPosNrm); + tagSeqAttrElemElv = new MarkupTagElement(); + tagSeqAttrElemElv.FullName = "elv"; + tagSeqAttrElemElv.Value = "27670"; + tagSeqAttrElem.Elements.Add(tagSeqAttrElemElv); + tagSeqAttr.Elements.Add(tagSeqAttrElem); + } + tagNote.Elements.Add(tagNoteStyle); + tagMusicalPart.Elements.Add(tagNote); + } + } + tagVSTrack.Elements.Add(tagMusicalPart); + tagVSQ3.Elements.Add(tagVSTrack); + } + MarkupTagElement tagSETrack = new MarkupTagElement(); + tagSETrack.FullName = "seTrack"; + tagVSQ3.Elements.Add(tagSETrack); + MarkupTagElement tagKaraokeTrack = new MarkupTagElement(); + tagKaraokeTrack.FullName = "karaokeTrack"; + tagVSQ3.Elements.Add(tagKaraokeTrack); + MarkupTagElement tagAux = new MarkupTagElement(); + tagAux.FullName = "aux"; + MarkupTagElement tagAuxID = new MarkupTagElement(); + tagAuxID.FullName = "auxID"; + MarkupStringElement tagAuxIDCDATA = new MarkupStringElement(); + tagAuxIDCDATA.Name = "CDATA"; + tagAuxIDCDATA.Value = "AUX_VST_HOST_CHUNK_INFO"; + tagAuxID.Elements.Add(tagAuxIDCDATA); + tagAux.Elements.Add(tagAuxID); + MarkupTagElement tagAuxContent = new MarkupTagElement(); + tagAuxContent.FullName = "content"; + MarkupStringElement tagAuxContentCDATA = new MarkupStringElement(); + tagAuxContentCDATA.Name = "CDATA"; + tagAuxContentCDATA.Value = "VlNDSwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; + tagAuxContent.Elements.Add(tagAuxContentCDATA); + tagAux.Elements.Add(tagAuxContent); + tagVSQ3.Elements.Add(tagAux); + mom.Elements.Add(tagVSQ3); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs new file mode 100644 index 00000000..33edd2ac --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/DirectWave/DirectWavePatchDataFormat.cs @@ -0,0 +1,51 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Voicebank.DirectWave +{ + public class DirectWavePatchDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(VoicebankObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + VoicebankObjectModel vom = (objectModel as VoicebankObjectModel); + Reader br = base.Accessor.Reader; + string DwPr = br.ReadFixedLengthString(4); + int n0 = br.ReadInt32(); + int n = br.ReadInt32(); + vom.Title = br.ReadNullTerminatedString(32); + vom.InstallationPath = br.ReadNullTerminatedString(260); + int n2 = br.ReadInt32(); + int n3 = br.ReadInt32(); + int n4 = br.ReadInt32(); + int sampleCount = br.ReadInt32(); + byte[] data = br.ReadBytes(144u); + for (int i = 0; i < sampleCount; i++) + { + VoicebankSample sample = new VoicebankSample(); + sample.Name = br.ReadNullTerminatedString(32); + sample.FileName = br.ReadNullTerminatedString(260); + sample.Data = br.ReadBytes(1406u); + vom.Samples.Add(sample); + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + VoicebankObjectModel vom = objectModel as VoicebankObjectModel; + Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("DwPr"); + int n0 = 0; + bw.WriteInt32(n0); + int n = 0; + bw.WriteInt32(n); + bw.WriteNullTerminatedString(vom.Title, 32); + bw.WriteNullTerminatedString(vom.InstallationPath, 264); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs new file mode 100644 index 00000000..2a8597df --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Voicebank/Vocaloid/VocaloidVoicebankDataFormat.cs @@ -0,0 +1,86 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.Accessors; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Voicebank.Vocaloid +{ + public class VocaloidVoicebankDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(VoicebankObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + + VoicebankObjectModel vom = (objectModel as VoicebankObjectModel); + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + + byte[] signature = br.ReadBytes(4u); + int vocaloidVersion = 1; + if (signature[0] == 70 && signature[1] == 45 && signature[2] == 0 && signature[3] == 0) + { + vocaloidVersion = 1; + } + else + { + if (signature[0] == 70 && signature[1] == 82 && signature[2] == 77 && signature[3] == 50) + { + vocaloidVersion = 2; + } + } + if (vom != null) + { + vom.CreatorVersion = new Version(vocaloidVersion, 0); + } + + int i = 0; + while (!br.EndOfStream) + { + string chunkName = br.ReadFixedLengthString(4); + uint chunkSize = br.ReadUInt32(); + uint dataSize = chunkSize - 8; + byte[] chunkData = br.ReadBytes(dataSize); + + switch (chunkName) + { + case "SND ": + { + Reader r = new Reader(new MemoryAccessor(chunkData)); + int size = r.ReadInt32(); + int freq = r.ReadInt32(); + short channels = br.ReadInt16(); + int dummy = br.ReadInt32(); + + // TODO: test this + byte[] data = br.ReadBytes(size - 18); + + if (fsom != null) + { + fsom.Files.Add(i.ToString() + ".raw", data); + } + Console.WriteLine("found sound file " + i.ToString() + ":"); + Console.WriteLine(" size: " + size.ToString()); + Console.WriteLine(" freq: " + freq.ToString()); + Console.WriteLine(" channels: " + channels.ToString()); + Console.WriteLine(" unknown_int32: " + dummy.ToString()); + i++; + break; + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIDataFormat.cs new file mode 100644 index 00000000..e1a12770 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIDataFormat.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +using UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankIndex; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.VoicebankIndex.Vocaloid +{ + public class VocaloidIndexDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(VoicebankIndexObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + VoicebankIndexObjectModel dbse = (objectModel as VoicebankIndexObjectModel); + if (dbse == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + // Bruno Clara + uint unknown1 = reader.ReadUInt32(); // 0 + uint unknown2 = reader.ReadUInt32(); + string chunkName = reader.ReadFixedLengthString(4); // DBSe + uint unknown3 = reader.ReadUInt32(); + uint unknown4 = reader.ReadUInt32(); // 1 + uint unknown5 = reader.ReadUInt32(); + uint unknown6 = reader.ReadUInt32(); // 3, subchunk count? + + long offsetToPHDC = reader.Accessor.Position; + string chunkNamePHDC = reader.ReadFixedLengthString(4); + uint chunkSizePHDC = reader.ReadUInt32(); // total size of PHDC chunk (3927 in Bruno) + + uint offsetToGuid = (uint)(chunkSizePHDC + offsetToPHDC); + + + uint unknown7 = reader.ReadUInt32(); // 4 + + uint phonemeCount = reader.ReadUInt32(); // 32 + for (uint i = 0; i < phonemeCount; i++) + { + string phonemeName = reader.ReadFixedLengthString(30).TrimNull(); + byte phonemeData = reader.ReadByte(); + + Phoneme p = new Phoneme(); + p.Title = phonemeName; + dbse.Phonemes.Add(p); + } + + string chunkNamePHG2 = reader.ReadFixedLengthString(4); + uint chunkSizePHG2 = reader.ReadUInt32(); // total size of PHG2 chunk (515 in Bruno) + + uint groupCount = reader.ReadUInt32(); // 9 + for (uint i = 0; i < groupCount; i++) + { + uint groupNameLength = reader.ReadUInt32(); + string groupName = reader.ReadFixedLengthString(groupNameLength); + uint groupPhonemeCount = reader.ReadUInt32(); + + PhonemeGroup pg = new PhonemeGroup(); + pg.Title = groupName; + + for (uint j = 0; j < groupPhonemeCount; j++) + { + uint unknown8 = reader.ReadUInt32(); // unknown (possibly index into PHDC table?) + uint groupPhonemeNameLength = reader.ReadUInt32(); + string groupPhonemeName = reader.ReadFixedLengthString(groupPhonemeNameLength); + + Phoneme p = new Phoneme(); + p.Title = groupPhonemeName; + pg.Phonemes.Add(p); + } + uint unknown9 = reader.ReadUInt32(); + + dbse.Groups.Add(pg); + } + + // I do not know how to read the rest of the PHDC chunk, but I do know how to skip it... + base.Accessor.Seek(offsetToGuid, SeekOrigin.Begin); + + dbse.Title = reader.ReadFixedLengthString(260).TrimNull(); + + uint unknown10 = reader.ReadUInt32(); + uint unknown11 = reader.ReadUInt32(); + uint unknown12 = reader.ReadUInt32(); + + string chunkNameTDB = reader.ReadFixedLengthString(4); + uint unknown13 = reader.ReadUInt32(); // 0 + uint unknown14 = reader.ReadUInt32(); // 1 + uint unknown15 = reader.ReadUInt32(); // 0 + + uint chunkCountTMM = reader.ReadUInt32(); + uint unknown16 = reader.ReadUInt32(); + uint unknown17 = reader.ReadUInt32(); + for (uint i = 0; i < chunkCountTMM; i++) + { + string chunkNameTMM = reader.ReadFixedLengthString(4); + uint unknown18 = reader.ReadUInt32(); // 0 + uint unknown19 = reader.ReadUInt32(); // 1 + uint unknown20 = reader.ReadUInt32(); // 0 + uint phonemeIndex = reader.ReadUInt32(); // is this right? + uint chunkCountARR = reader.ReadUInt32(); + uint unknown21 = reader.ReadUInt32(); + uint unknown22 = reader.ReadUInt32(); + + for (uint j = 0; j < chunkCountARR; j++) + { + DDIParameter param = new DDIParameter(); + string chunkNameARR = reader.ReadFixedLengthString(4); + uint unknown23 = reader.ReadUInt32(); // 0 + uint unknown24 = reader.ReadUInt32(); // 1 + uint unknown25 = reader.ReadUInt32(); // 0 + uint unknown26 = reader.ReadUInt32(); + uint paramNameLength = reader.ReadUInt32(); + param.ParameterName = reader.ReadFixedLengthString(paramNameLength); + + int phonemeNameLength = reader.ReadInt32(); + string phonemeName = null; + if (phonemeNameLength > -1) + { + phonemeName = reader.ReadFixedLengthString(phonemeNameLength); + } + param.PhonemeName = phonemeName; + + uint unknown28 = reader.ReadUInt32(); + } + + uint unknown29 = reader.ReadUInt32(); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + VoicebankIndexObjectModel dbse = (objectModel as VoicebankIndexObjectModel); + if (dbse == null) throw new ObjectModelNotSupportedException(); + + Writer writer = base.Accessor.Writer; + writer.WriteUInt32(0); + writer.WriteUInt32(0); + writer.WriteFixedLengthString("DBSe"); + + writer.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIParameter.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIParameter.cs new file mode 100644 index 00000000..b9cd42d9 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankIndex/Vocaloid/DDIParameter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.VoicebankIndex.Vocaloid +{ + public struct DDIParameter + { + public string ParameterName; + public string PhonemeName; + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + if (PhonemeName != null) + { + sb.Append(PhonemeName); + sb.Append(":"); + } + if (ParameterName != null) sb.Append(ParameterName); + return sb.ToString(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryXMLDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryXMLDataFormat.cs new file mode 100644 index 00000000..8f09fc1d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryXMLDataFormat.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; + +using UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.VoicebankPhonemeDictionary +{ + public class PhonemeDictionaryXMLDataFormat : XMLDataFormat + { + private DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + _dfr.Capabilities.Add(typeof(PhonemeDictionaryObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + MarkupObjectModel mom = (objectModels.Pop() as MarkupObjectModel); + PhonemeDictionaryObjectModel dict = (objectModels.Pop() as PhonemeDictionaryObjectModel); + + MarkupTagElement tagPhonemeLists = (mom.FindElement("Synthaloid", "PhonemeDictionary", "PhonemeLists") as MarkupTagElement); + if (tagPhonemeLists == null) throw new InvalidDataFormatException(); + + foreach (MarkupElement elPhonemeList in tagPhonemeLists.Elements) + { + MarkupTagElement tagPhonemeList = (elPhonemeList as MarkupTagElement); + if (tagPhonemeList == null) continue; + if (tagPhonemeList.FullName != "PhonemeList") continue; + + PhonemeList list = new PhonemeList(); + MarkupAttribute attLanguageID = tagPhonemeList.Attributes["LanguageID"]; + if (attLanguageID != null) + { + int langID = -1; + if (Int32.TryParse(attLanguageID.Value, out langID)) + { + list.LanguageID = langID; + } + } + + MarkupTagElement tagPhonemes = (tagPhonemeList.Elements["Phonemes"] as MarkupTagElement); + foreach (MarkupElement elPhoneme in tagPhonemes.Elements) + { + MarkupTagElement tagPhoneme = (elPhoneme as MarkupTagElement); + if (tagPhoneme == null) continue; + if (tagPhoneme.FullName != "Phoneme") continue; + + MarkupAttribute attValue = tagPhoneme.Attributes["Value"]; + if (attValue == null) continue; + + Phoneme phoneme = new Phoneme(); + phoneme.Value = attValue.Value; + + MarkupTagElement tagMappings = (tagPhoneme.Elements["Mappings"] as MarkupTagElement); + foreach (MarkupElement elMapping in tagMappings.Elements) + { + MarkupTagElement tagMapping = (elMapping as MarkupTagElement); + if (tagMapping == null) continue; + if (tagMapping.FullName != "Mapping") continue; + + MarkupAttribute attMappingValue = tagMapping.Attributes["Value"]; + if (attMappingValue != null) phoneme.Mappings.Add(attMappingValue.Value); + } + + list.Phonemes.Add(phoneme); + } + + dict.PhonemeLists.Add(list); + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + PhonemeDictionaryObjectModel dict = (objectModels.Pop() as PhonemeDictionaryObjectModel); + MarkupObjectModel mom = new MarkupObjectModel(); + + + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs new file mode 100644 index 00000000..cfa24d19 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/AdvancedAudioCodec/AACDataFormat.cs @@ -0,0 +1,22 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.AdvancedAudioCodec +{ + public class AACDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/BRSTM/BRSTMDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/BRSTM/BRSTMDataFormat.cs new file mode 100644 index 00000000..1258a9af --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/BRSTM/BRSTMDataFormat.cs @@ -0,0 +1,76 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.BRSTM +{ + public class BRSTMDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + WaveformAudioObjectModel auom = objectModel as WaveformAudioObjectModel; + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + string RSTM = br.ReadFixedLengthString(4); + ushort magic = br.ReadUInt16(); + byte versionMajor = br.ReadByte(); + byte versionMinor = br.ReadByte(); + uint fileSize = br.ReadUInt32(); + ushort headerSize = br.ReadUInt16(); + ushort chunkCount = br.ReadUInt16(); + uint headChunkOffset = br.ReadUInt32(); + uint headChunkSize = br.ReadUInt32(); + uint adpcChunkOffset = br.ReadUInt32(); + uint adpcChunkSize = br.ReadUInt32(); + uint dataChunkOffset = br.ReadUInt32(); + uint dataChunkSize = br.ReadUInt32(); + byte[] reserved = br.ReadBytes(24u); + base.Accessor.Seek((long)headChunkOffset, SeekOrigin.Begin); + byte[] headChunk = br.ReadBytes(headChunkSize); + base.Accessor.Seek((long)adpcChunkOffset, SeekOrigin.Begin); + byte[] adpcChunk = br.ReadBytes(adpcChunkSize); + base.Accessor.Seek((long)dataChunkOffset, SeekOrigin.Begin); + byte[] dataChunk = br.ReadBytes(dataChunkSize); + byte[] dataChunkMinusHeader = new byte[dataChunk.Length - 4]; + Array.Copy(dataChunk, 4, dataChunkMinusHeader, 0, dataChunkMinusHeader.Length); + auom.RawData = dataChunkMinusHeader; + } + protected override void SaveInternal(ObjectModel objectModel) + { + WaveformAudioObjectModel auom = objectModel as WaveformAudioObjectModel; + Writer bw = base.Accessor.Writer; + bw.Endianness = Endianness.BigEndian; + bw.WriteFixedLengthString("RSTM"); + ushort magic = 65279; + bw.WriteUInt16(magic); + byte versionMajor = 1; + bw.WriteByte(versionMajor); + byte versionMinor = 0; + bw.WriteByte(versionMinor); + ushort headerSize = 40; + bw.WriteUInt16(headerSize); + uint fileSize = (uint)headerSize; + bw.WriteUInt32(fileSize); + ushort chunkCount = 0; + bw.WriteUInt16(chunkCount); + uint headChunkOffset = 0u; + bw.WriteUInt32(headChunkOffset); + uint headChunkSize = 0u; + bw.WriteUInt32(headChunkSize); + uint adpcChunkOffset = 0u; + bw.WriteUInt32(adpcChunkOffset); + uint adpcChunkSize = 0u; + bw.WriteUInt32(adpcChunkSize); + uint dataChunkOffset = 0u; + bw.WriteUInt32(dataChunkOffset); + uint dataChunkSize = 0u; + bw.WriteUInt32(dataChunkSize); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/FLACDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/FLACDataFormat.cs new file mode 100644 index 00000000..98a05d30 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/FLACDataFormat.cs @@ -0,0 +1,52 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC +{ + public class FLACDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private FLACMetadataBlock.FLACMetadataBlockCollection mvarMetadataBlocks = new FLACMetadataBlock.FLACMetadataBlockCollection(); + public FLACMetadataBlock.FLACMetadataBlockCollection MetadataBlocks { get { return this.mvarMetadataBlocks; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + private void SaveMetadataBlockHeader(Writer bw, FLACMetadataBlockHeader header) + { + byte flagAndType = 0; + if (header.IsLastMetadataBlock) + { + flagAndType |= 1; + } + flagAndType |= (byte)header.BlockType; + bw.WriteByte(flagAndType); + bw.WriteInt24(header.ContentLength); + } + private void SaveMetadataBlockStreamInfo(Writer bw, FLACMetadataBlockStreamInfo block) + { + this.SaveMetadataBlockHeader(bw, new FLACMetadataBlockHeader + { + IsLastMetadataBlock = this.mvarMetadataBlocks.Count == 0, + BlockType = FLACMetadataBlockType.StreamInfo, + ContentLength = 0 + }); + } + protected override void SaveInternal(ObjectModel objectModel) + { + Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("fLaC"); + FLACMetadataBlockStreamInfo streamInfo = new FLACMetadataBlockStreamInfo(); + this.SaveMetadataBlockStreamInfo(bw, streamInfo); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs new file mode 100644 index 00000000..0c82c945 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlock.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.ObjectModel; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal +{ + public class FLACMetadataBlock + { + public class FLACMetadataBlockCollection : Collection + { + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs new file mode 100644 index 00000000..a443be34 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockHeader.cs @@ -0,0 +1,43 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal +{ + public class FLACMetadataBlockHeader + { + private bool mvarIsLastMetadataBlock = false; + private FLACMetadataBlockType mvarBlockType = FLACMetadataBlockType.Unknown; + private int mvarContentLength = 0; + public bool IsLastMetadataBlock + { + get + { + return this.mvarIsLastMetadataBlock; + } + set + { + this.mvarIsLastMetadataBlock = value; + } + } + public FLACMetadataBlockType BlockType + { + get + { + return this.mvarBlockType; + } + set + { + this.mvarBlockType = value; + } + } + public int ContentLength + { + get + { + return this.mvarContentLength; + } + set + { + this.mvarContentLength = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs new file mode 100644 index 00000000..1cf418b0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockStreamInfo.cs @@ -0,0 +1,115 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal +{ + public class FLACMetadataBlockStreamInfo : FLACMetadataBlock + { + private short mvarMinimumBlockSize = 0; + private short mvarMaximumBlockSize = 0; + private int mvarMinimumFrameSize = 0; + private int mvarMaximumFrameSize = 0; + private int mvarSampleRate = 0; + private byte mvarChannelCount = 0; + private byte mvarBitsPerSample = 0; + private long mvarTotalSamplesInStream = 0L; + private short mvarMD5Signature = 0; + public short MinimumBlockSize + { + get + { + return this.mvarMinimumBlockSize; + } + set + { + this.mvarMinimumBlockSize = value; + } + } + public short MaximumBlockSize + { + get + { + return this.mvarMaximumBlockSize; + } + set + { + this.mvarMaximumBlockSize = value; + } + } + public int MinimumFrameSize + { + get + { + return this.mvarMinimumFrameSize; + } + set + { + this.mvarMinimumFrameSize = value; + } + } + public int MaximumFrameSize + { + get + { + return this.mvarMaximumFrameSize; + } + set + { + this.mvarMaximumFrameSize = value; + } + } + public int SampleRate + { + get + { + return this.mvarSampleRate; + } + set + { + this.mvarSampleRate = value; + } + } + public byte ChannelCount + { + get + { + return this.mvarChannelCount; + } + set + { + this.mvarChannelCount = value; + } + } + public byte BitsPerSample + { + get + { + return this.mvarBitsPerSample; + } + set + { + this.mvarBitsPerSample = value; + } + } + public long TotalSamplesInStream + { + get + { + return this.mvarTotalSamplesInStream; + } + set + { + this.mvarTotalSamplesInStream = value; + } + } + public short MD5Signature + { + get + { + return this.mvarMD5Signature; + } + set + { + this.mvarMD5Signature = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs new file mode 100644 index 00000000..221cb722 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/FLAC/Internal/FLACMetadataBlockType.cs @@ -0,0 +1,16 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.FLAC.Internal +{ + public enum FLACMetadataBlockType + { + Unknown = -1, + StreamInfo, + Padding, + Application, + SeekTable, + VorbisComment, + Cuesheet, + Picture, + Invalid = 127 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP3/MP3DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP3/MP3DataFormat.cs new file mode 100644 index 00000000..0d9df694 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP3/MP3DataFormat.cs @@ -0,0 +1,40 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MP3 +{ + public class MP3DataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + WaveformAudioObjectModel wave = objectModel as WaveformAudioObjectModel; + Reader br = base.Accessor.Reader; + string ID3 = br.ReadFixedLengthString(3); + if (ID3 == "ID3") + { + int lz = br.ReadInt32(); + } + else + { + br.Accessor.Seek(-3L, SeekOrigin.Current); + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + WaveformAudioObjectModel wave = objectModel as WaveformAudioObjectModel; + Writer bw = base.Accessor.Writer; + if (wave.Information.CustomProperties.Count > 0) + { + bw.WriteFixedLengthString("ID3"); + } + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP4/MP4DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP4/MP4DataFormat.cs new file mode 100644 index 00000000..1c686868 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MP4/MP4DataFormat.cs @@ -0,0 +1,22 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MP4 +{ + public class MP4DataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs new file mode 100644 index 00000000..f30f07d7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MicrosoftWave/MicrosoftWaveDataFormat.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UniversalEditor.IO; + +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.DataFormats.Chunked.RIFF; + +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +using UniversalEditor.Accessors; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MicrosoftWave +{ + public class MicrosoftWaveDataFormat : RIFFDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + // TODO: Test IsObjectModelSupported!!! + + protected override bool IsObjectModelSupported(ObjectModel omb) + { + ChunkedObjectModel riff = (omb as ChunkedObjectModel); + if (riff != null) + { + RIFFGroupChunk waveChunk = (riff.Chunks["WAVE"] as RIFFGroupChunk); + if (waveChunk != null) + { + RIFFDataChunk fmtChunk = (waveChunk.Chunks["fmt "] as RIFFDataChunk); + if (fmtChunk != null) + { + return true; + } + } + } + return false; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + ChunkedObjectModel riff = objectModels.Pop() as ChunkedObjectModel; + WaveformAudioObjectModel wave = objectModels.Pop() as WaveformAudioObjectModel; + if (wave == null) throw new ObjectModelNotSupportedException(); + + RIFFGroupChunk waveChunk = (riff.Chunks["WAVE"] as RIFFGroupChunk); + if (waveChunk == null) throw new InvalidDataFormatException("File does not contain a \"WAVE\" chunk"); + + RIFFDataChunk fmtChunk = (waveChunk.Chunks["fmt "] as RIFFDataChunk); + IO.Reader br = new IO.Reader(new MemoryAccessor(fmtChunk.Data)); + if (fmtChunk.Size >= 16) + { + wave.Header.FormatTag = br.ReadUInt16(); + wave.Header.ChannelCount = br.ReadInt16(); + wave.Header.SampleRate = br.ReadInt32(); + wave.Header.DataRate = br.ReadInt32(); + wave.Header.BlockAlignment = br.ReadInt16(); + wave.Header.BitsPerSample = br.ReadInt16(); + if (fmtChunk.Size >= 18) + { + short cbSize = br.ReadInt16(); + if (fmtChunk.Size >= 40) + { + wave.ExtendedHeader.Enabled = true; + wave.ExtendedHeader.ValidBitsPerSample = br.ReadInt16(); + wave.ExtendedHeader.ChannelMask = br.ReadInt32(); + wave.ExtendedHeader.SubFormatGUID = br.ReadGuid(); + } + } + } + RIFFDataChunk dataChunk = (waveChunk.Chunks["data"] as RIFFDataChunk); + if (dataChunk == null) + { + // TODO: FIX THIS UGLY HACK!!! + RIFFGroupChunk infoChunk = (waveChunk.Chunks["INFO"] as RIFFGroupChunk); + if (infoChunk != null) + { + dataChunk = (infoChunk.Chunks["data"] as RIFFDataChunk); + } + } + br = new IO.Reader(new MemoryAccessor(dataChunk.Data)); + short[] dataa = new short[dataChunk.Data.Length / 2]; + for (int i = 0; i < dataa.Length; i++) + { + dataa[i] = br.ReadInt16(); + } + wave.RawData = dataChunk.Data; + wave.RawSamples = dataa; + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + WaveformAudioObjectModel wave = objectModels.Pop() as WaveformAudioObjectModel; + ChunkedObjectModel riff = new ChunkedObjectModel(); + + RIFFGroupChunk WAVE = new RIFFGroupChunk(); + WAVE.TypeID = "RIFF"; + WAVE.ID = "WAVE"; + + RIFFDataChunk fmtChunk = new RIFFDataChunk(); + fmtChunk.ID = "fmt "; + MemoryStream ms = new MemoryStream(); + IO.Writer bw = new IO.Writer(new StreamAccessor(ms)); + bw.WriteUInt16(wave.Header.FormatTag); + bw.WriteInt16(wave.Header.ChannelCount); + bw.WriteInt32(wave.Header.SampleRate); + bw.WriteInt32(wave.Header.DataRate); + bw.WriteInt16(wave.Header.BlockAlignment); + bw.WriteInt16(wave.Header.BitsPerSample); + if (wave.ExtendedHeader.Enabled) + { + bw.WriteInt32(22); + bw.WriteInt16(wave.ExtendedHeader.ValidBitsPerSample); + bw.WriteInt32(wave.ExtendedHeader.ChannelMask); + bw.WriteGuid(wave.ExtendedHeader.SubFormatGUID); + } + bw.Flush(); + bw.Close(); + fmtChunk.Data = ms.ToArray(); + + RIFFDataChunk dataChunk = new RIFFDataChunk(); + dataChunk.ID = "data"; + if (wave.RawData == null) + { + MemoryStream ms2 = new MemoryStream(); + IO.Writer bw2 = new IO.Writer(new StreamAccessor(ms2)); + short[] rawSamples = wave.RawSamples; + for (int i = 0; i < rawSamples.Length; i++) + { + short s = rawSamples[i]; + bw2.WriteInt16(s); + } + bw2.Flush(); + bw2.Close(); + wave.RawData = ms2.ToArray(); + } + dataChunk.Data = wave.RawData; + + WAVE.Chunks.Add(fmtChunk); + WAVE.Chunks.Add(dataChunk); + + riff.Chunks.Add(WAVE); + objectModels.Push(riff); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APEDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APEDataFormat.cs new file mode 100644 index 00000000..bcdb1673 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APEDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MonkeyAudio +{ + public class APEDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APLDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APLDataFormat.cs new file mode 100644 index 00000000..c23d5eca --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/MonkeyAudio/APLDataFormat.cs @@ -0,0 +1,21 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.MonkeyAudio +{ + public class APLDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/OGG/OGGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/OGG/OGGDataFormat.cs new file mode 100644 index 00000000..dd02d5d4 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/OGG/OGGDataFormat.cs @@ -0,0 +1,22 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.OGG +{ + public class OGGDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/REX2/REX2DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/REX2/REX2DataFormat.cs new file mode 100644 index 00000000..b272173c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/REX2/REX2DataFormat.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.DataFormats.Chunked.RIFF; + +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; + +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.REX2 +{ + public class REX2DataFormat : RIFFDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(ChunkedObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private string[] mvarRIFFTags = new string[] { "CAT " }; + public override string[] RIFFTagsLittleEndian { get { return mvarRIFFTags; } } + + protected override bool IsObjectModelSupported(ObjectModel objectModel) + { + if (objectModel is ChunkedObjectModel) + { + ChunkedObjectModel riff = (objectModel as ChunkedObjectModel); + // TODO: Figure this out + } + return base.IsObjectModelSupported(objectModel); + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + ChunkedObjectModel rom = (objectModels.Pop() as ChunkedObjectModel); + WaveformAudioObjectModel wave = (objectModels.Pop() as WaveformAudioObjectModel); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/RealAudio/RealAudioDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/RealAudio/RealAudioDataFormat.cs new file mode 100644 index 00000000..31fb9e3e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/RealAudio/RealAudioDataFormat.cs @@ -0,0 +1,202 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.RealAudio +{ + public class RealAudioDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + private short mvarVersion = 3; + public short Version { get { return mvarVersion; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + byte[] signature = br.ReadBytes(4u); + this.mvarVersion = br.ReadInt16(); + if (this.mvarVersion == 3) + { + short headerSize = br.ReadInt16(); + byte[] unknown = br.ReadBytes(10u); + int dataSize = br.ReadInt32(); + byte titleStringLength = br.ReadByte(); + string titleString = br.ReadNullTerminatedString((int)titleStringLength); + byte authorStringLength = br.ReadByte(); + string authorString = br.ReadNullTerminatedString((int)authorStringLength); + byte copyrightStringLength = br.ReadByte(); + string copyrightString = br.ReadNullTerminatedString((int)copyrightStringLength); + byte commentStringLength = br.ReadByte(); + string commentString = br.ReadNullTerminatedString((int)commentStringLength); + int finalHeaderSize = (int)(15 + titleStringLength + 1 + authorStringLength + 1 + copyrightStringLength + 1 + commentStringLength); + int finalHeaderSizeDifference = (int)headerSize - finalHeaderSize; + string fourccString = string.Empty; + if (finalHeaderSizeDifference >= 1) + { + byte unknown2 = br.ReadByte(); + if (finalHeaderSizeDifference >= 2) + { + byte fourccStringLength = br.ReadByte(); + if (finalHeaderSizeDifference > 2) + { + fourccString = br.ReadFixedLengthString(fourccStringLength); + } + } + } + } + else + { + if (this.mvarVersion == 4) + { + short unused = br.ReadInt16(); + string ra4signature = br.ReadFixedLengthString(4); + int dataSize = br.ReadInt32(); + dataSize -= 39; + short version2 = br.ReadInt16(); + int headerSize2 = br.ReadInt32(); + short codecFlavor = br.ReadInt16(); + int codedFrameSize = br.ReadInt32(); + byte[] unknown3 = br.ReadBytes(12u); + short subPacketH = br.ReadInt16(); + short frameSize = br.ReadInt16(); + short subPacketSize = br.ReadInt16(); + short unknown4 = br.ReadInt16(); + short sampleRate = br.ReadInt16(); + short unknown5 = br.ReadInt16(); + short sampleSize = br.ReadInt16(); + short channels = br.ReadInt16(); + byte interleaverIDStringLength = br.ReadByte(); + string interleaverIDString = br.ReadFixedLengthString(interleaverIDStringLength); + byte fourccStringLength = br.ReadByte(); + string fourccString = br.ReadFixedLengthString(fourccStringLength); + byte[] unknown6 = br.ReadBytes(3u); + byte titleStringLength = br.ReadByte(); + string titleString = br.ReadFixedLengthString(titleStringLength); + byte authorStringLength = br.ReadByte(); + string authorString = br.ReadFixedLengthString(authorStringLength); + byte copyrightStringLength = br.ReadByte(); + string copyrightString = br.ReadFixedLengthString(copyrightStringLength); + byte commentStringLength = br.ReadByte(); + string commentString = br.ReadFixedLengthString(commentStringLength); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + WaveformAudioObjectModel wave = (objectModel as WaveformAudioObjectModel); + if (wave != null) + { + Writer bw = base.Accessor.Writer; + bw.Endianness = Endianness.BigEndian; + byte[] signature = new byte[] + { + 46, + 114, + 97, + 253 + }; + bw.WriteBytes(signature); + bw.WriteInt16(mvarVersion); + switch (mvarVersion) + { + case 3: + { + byte[] unknown = new byte[10]; + int dataSize = 0; + string titleString = wave.Information.SongTitle; + byte titleStringLength = (byte)titleString.Length; + string authorString = wave.Information.SongArtist; + byte authorStringLength = (byte)authorString.Length; + string copyrightString = wave.Information.CustomProperties["Copyright"].Value.ToString(); + byte copyrightStringLength = (byte)copyrightString.Length; + string commentString = wave.Information.Comments; + byte commentStringLength = (byte)commentString.Length; + short headerSize = (short)(15 + titleStringLength + 1 + authorStringLength + 1 + copyrightStringLength + 1 + commentStringLength + 6); + bw.WriteInt16(headerSize); + bw.WriteBytes(unknown); + bw.WriteInt32(dataSize); + bw.WriteByte(titleStringLength); + bw.WriteNullTerminatedString(titleString, (int)titleStringLength); + bw.WriteByte(authorStringLength); + bw.WriteNullTerminatedString(authorString, (int)authorStringLength); + bw.WriteByte(copyrightStringLength); + bw.WriteNullTerminatedString(copyrightString, (int)copyrightStringLength); + bw.WriteByte(commentStringLength); + bw.WriteNullTerminatedString(commentString, (int)commentStringLength); + bw.WriteInt32(0); + bw.WriteInt32(4); + bw.WriteFixedLengthString("lpcJ"); + break; + } + case 4: + { + short unused = 0; + bw.WriteInt16(unused); + string ra4signature = ".ra4"; + bw.WriteFixedLengthString(ra4signature); + int dataSize = 39; + bw.WriteInt32(dataSize); + string titleString = wave.Information.SongTitle; + byte titleStringLength = (byte)titleString.Length; + string authorString = wave.Information.SongArtist; + byte authorStringLength = (byte)authorString.Length; + string copyrightString = wave.Information.CustomProperties["Copyright"].Value.ToString(); + byte copyrightStringLength = (byte)copyrightString.Length; + string commentString = wave.Information.Comments; + byte commentStringLength = (byte)commentString.Length; + bw.WriteInt16(mvarVersion); + int headerSize2 = 16; + bw.WriteInt32(headerSize2); + short codecFlavor = 0; + bw.WriteInt16(codecFlavor); + int codedFrameSize = 0; + bw.WriteInt32(codedFrameSize); + byte[] unknown2 = new byte[12]; + bw.WriteBytes(unknown2); + short subPacketH = 0; + bw.WriteInt16(subPacketH); + short frameSize = 0; + bw.WriteInt16(frameSize); + short subPacketSize = 0; + bw.WriteInt16(subPacketSize); + short unknown3 = 0; + bw.WriteInt16(unknown3); + short sampleRate = 0; + bw.WriteInt16(sampleRate); + short unknown4 = 0; + bw.WriteInt16(unknown4); + short sampleSize = 0; + bw.WriteInt16(sampleSize); + short channels = 0; + bw.WriteInt16(channels); + byte interleaverIDStringLength = 4; + bw.WriteByte(interleaverIDStringLength); + string interleaverIDString = "\0\0\0\0"; + bw.WriteFixedLengthString(interleaverIDString); + byte fourccStringLength = 4; + bw.WriteByte(fourccStringLength); + string fourccString = "lpcJ"; + bw.WriteFixedLengthString(fourccString); + byte[] unknown5 = new byte[3]; + bw.WriteBytes(unknown5); + bw.WriteByte(titleStringLength); + bw.WriteFixedLengthString(titleString); + bw.WriteByte(authorStringLength); + bw.WriteFixedLengthString(authorString); + bw.WriteByte(copyrightStringLength); + bw.WriteFixedLengthString(copyrightString); + bw.WriteByte(commentStringLength); + bw.WriteFixedLengthString(commentString); + break; + } + } + bw.Flush(); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/Shorten/ShortenDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/Shorten/ShortenDataFormat.cs new file mode 100644 index 00000000..2d4562cb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/Shorten/ShortenDataFormat.cs @@ -0,0 +1,22 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.Shorten +{ + public class ShortenDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuDataFormat.cs new file mode 100644 index 00000000..5c11b082 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuDataFormat.cs @@ -0,0 +1,291 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.SunAu +{ + public class SunAuDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private SunAuEncoding Int32ToSunAuEncoding(int encoding) + { + SunAuEncoding result; + switch (encoding) + { + case 1: + { + result = SunAuEncoding.G711ULaw8Bit; + return result; + } + case 2: + { + result = SunAuEncoding.LinearPCM8Bit; + return result; + } + case 3: + { + result = SunAuEncoding.LinearPCM16Bit; + return result; + } + case 4: + { + result = SunAuEncoding.LinearPCM24Bit; + return result; + } + case 5: + { + result = SunAuEncoding.LinearPCM32Bit; + return result; + } + case 6: + { + result = SunAuEncoding.IeeeFloatingPoint32Bit; + return result; + } + case 7: + { + result = SunAuEncoding.IeeeFloatingPoint64Bit; + return result; + } + case 8: + { + result = SunAuEncoding.FragmentedSampleData; + return result; + } + case 9: + { + result = SunAuEncoding.DspProgram; + return result; + } + case 10: + { + result = SunAuEncoding.FixedPoint8Bit; + return result; + } + case 11: + { + result = SunAuEncoding.FixedPoint16Bit; + return result; + } + case 12: + { + result = SunAuEncoding.FixedPoint24Bit; + return result; + } + case 13: + { + result = SunAuEncoding.FixedPoint32Bit; + return result; + } + case 18: + { + result = SunAuEncoding.LinearWithEmphasis16Bit; + return result; + } + case 19: + { + result = SunAuEncoding.LinearCompressed16Bit; + return result; + } + case 20: + { + result = SunAuEncoding.LinearWithEmphasisCompressed16Bit; + return result; + } + case 21: + { + result = SunAuEncoding.DspProgramMusicKit; + return result; + } + case 23: + { + result = SunAuEncoding.G721Adpcm4Bit; + return result; + } + case 24: + { + result = SunAuEncoding.G722Adpcm4Bit; + return result; + } + case 25: + { + result = SunAuEncoding.G723Adpcm3Bit; + return result; + } + case 26: + { + result = SunAuEncoding.G723Adpcm5Bit; + return result; + } + case 27: + { + result = SunAuEncoding.G711ALaw8Bit; + return result; + } + } + result = SunAuEncoding.Unknown; + return result; + } + private int SunAuEncodingToInt32(SunAuEncoding encoding) + { + int result; + switch (encoding) + { + case SunAuEncoding.G711ULaw8Bit: + { + result = 1; + break; + } + case SunAuEncoding.LinearPCM8Bit: + { + result = 2; + break; + } + case SunAuEncoding.LinearPCM16Bit: + { + result = 3; + break; + } + case SunAuEncoding.LinearPCM24Bit: + { + result = 4; + break; + } + case SunAuEncoding.LinearPCM32Bit: + { + result = 5; + break; + } + case SunAuEncoding.IeeeFloatingPoint32Bit: + { + result = 6; + break; + } + case SunAuEncoding.IeeeFloatingPoint64Bit: + { + result = 7; + break; + } + case SunAuEncoding.FragmentedSampleData: + { + result = 8; + break; + } + case SunAuEncoding.DspProgram: + { + result = 9; + break; + } + case SunAuEncoding.FixedPoint8Bit: + { + result = 10; + break; + } + case SunAuEncoding.FixedPoint16Bit: + { + result = 11; + break; + } + case SunAuEncoding.FixedPoint24Bit: + { + result = 12; + break; + } + case SunAuEncoding.FixedPoint32Bit: + { + result = 13; + break; + } + case SunAuEncoding.LinearWithEmphasis16Bit: + { + result = 18; + break; + } + case SunAuEncoding.LinearCompressed16Bit: + { + result = 19; + break; + } + case SunAuEncoding.LinearWithEmphasisCompressed16Bit: + { + result = 20; + break; + } + case SunAuEncoding.DspProgramMusicKit: + { + result = 21; + break; + } + case SunAuEncoding.G721Adpcm4Bit: + { + result = 23; + break; + } + case SunAuEncoding.G722Adpcm4Bit: + { + result = 24; + break; + } + case SunAuEncoding.G723Adpcm3Bit: + { + result = 25; + break; + } + case SunAuEncoding.G723Adpcm5Bit: + { + result = 26; + break; + } + case SunAuEncoding.G711ALaw8Bit: + { + result = 27; + break; + } + default: + { + result = -1; + break; + } + } + return result; + } + + private SunAuEncoding mvarEncoding = SunAuEncoding.Unknown; + public SunAuEncoding Encoding { get { return mvarEncoding; } set { mvarEncoding = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + string magicNumber = br.ReadFixedLengthString(4); + int dataOffset = br.ReadInt32(); + uint dataSize = br.ReadUInt32(); + int encoding = br.ReadInt32(); + mvarEncoding = Int32ToSunAuEncoding(encoding); + int sampleRate = br.ReadInt32(); + int channels = br.ReadInt32(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + Writer bw = base.Accessor.Writer; + bw.Endianness = Endianness.BigEndian; + bw.WriteFixedLengthString(".snd"); + int dataOffset = 24; + bw.WriteInt32(dataOffset); + uint dataSize = 4294967295u; + bw.WriteUInt32(dataSize); + int encoding = SunAuEncodingToInt32(mvarEncoding); + bw.WriteInt32(encoding); + int sampleRate = 0; + bw.WriteInt32(sampleRate); + int channels = 2; + bw.WriteInt32(channels); + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuEncoding.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuEncoding.cs new file mode 100644 index 00000000..7197cf90 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/SunAu/SunAuEncoding.cs @@ -0,0 +1,30 @@ +using System; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.SunAu +{ + public enum SunAuEncoding + { + Unknown = -1, + G711ULaw8Bit, + LinearPCM8Bit, + LinearPCM16Bit, + LinearPCM24Bit, + LinearPCM32Bit, + IeeeFloatingPoint32Bit, + IeeeFloatingPoint64Bit, + FragmentedSampleData, + DspProgram, + FixedPoint8Bit, + FixedPoint16Bit, + FixedPoint24Bit, + FixedPoint32Bit, + LinearWithEmphasis16Bit, + LinearCompressed16Bit, + LinearWithEmphasisCompressed16Bit, + DspProgramMusicKit, + G721Adpcm4Bit, + G722Adpcm4Bit, + G723Adpcm3Bit, + G723Adpcm5Bit, + G711ALaw8Bit + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/WavPack/WavPackDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/WavPack/WavPackDataFormat.cs new file mode 100644 index 00000000..806b9e82 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Audio/Waveform/WavPack/WavPackDataFormat.cs @@ -0,0 +1,22 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +namespace UniversalEditor.DataFormats.Multimedia.Audio.Waveform.WavPack +{ + public class WavPackDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(WaveformAudioObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs new file mode 100644 index 00000000..299f9ab4 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/AudioCollection/Synthesized/SPC2/SPC2DataFormat.cs @@ -0,0 +1,142 @@ +// Universal Editor DataFormat for loading SPC2 synthesized audio files +// Copyright (C) 2014 Mike Becker's Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.DataFormats.Multimedia.Audio.Synthesized.SPC; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.ObjectModels.Multimedia.AudioCollection.Synthesized; + +namespace UniversalEditor.DataFormats.Multimedia.AudioCollection.Synthesized.SPC2 +{ + public class SPC2DataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(SynthesizedAudioCollectionObjectModel), DataFormatCapabilities.All); + _dfr.ImportOptions.Add(new CustomOptionBoolean("UseID666TagInformationIfAvailable", "Use &ID666 tag information if available")); + _dfr.ExportOptions.Add(new CustomOptionBoolean("IncludeID666TagInformation", "Include &ID666 tag information in output file")); + _dfr.Sources.Add("http://blog.kevtris.org/blogfiles/spc2_file_specification_v1.txt"); + } + return _dfr; + } + + private bool mvarUseID666TagInformationIfAvailable = false; + public bool UseID666TagInformationIfAvailable { get { return mvarUseID666TagInformationIfAvailable; } set { mvarUseID666TagInformationIfAvailable = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + SynthesizedAudioCollectionObjectModel coll = (objectModel as SynthesizedAudioCollectionObjectModel); + if (coll == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + string signature = reader.ReadFixedLengthString(4); + byte x1A = reader.ReadByte(); + if (signature != "KSPC" || x1A != 0x1A) throw new InvalidDataFormatException("File does not begin with 'KSPC', 0x1A"); + + byte versionMajor = reader.ReadByte(); + byte versionMinor = reader.ReadByte(); + + ushort fileCount = reader.ReadUInt16(); + byte[] expansion = reader.ReadBytes(7); + + for (ushort i = 0; i < fileCount; i++) + { + // Each SPC data block has this format + for (int j = 0; j < 256; j++) + { + // Offsets for all 256, 256 byte blocks of data in RAM + ushort dataBlockRAMOffset = reader.ReadUInt16(); + } + + // DSP register data (as-is from .SPC) + byte[] dspRegisterData = reader.ReadBytes(128); + + // IPL ROM (as-is from .SPC) + byte[] iplROM = reader.ReadBytes(64); + + // PCL, PCH, A, X, Y, PSW, SP (as-is from .SPC) + byte registerPCL = reader.ReadByte(); + byte registerPCH = reader.ReadByte(); + byte registerA = reader.ReadByte(); + byte registerX = reader.ReadByte(); + byte registerY = reader.ReadByte(); + byte registerPSW = reader.ReadByte(); + byte registerSP = reader.ReadByte(); + + // channel enable bits, 1 per chan (0 = en, 1 = dis) (as-is) + byte channelEnableBits = reader.ReadByte(); + + // stored as four bytes, in mm/dd/yyyy as BCD, like so: + // 01h, 12h, 20h, 00h would be 01/12/2000 + // 07h, 30h, 19h, 95h would be 07/30/1995 + byte[] dateParts = reader.ReadBytes(4); + DateTime date = new DateTime + ( + Int32.Parse(dateParts[2].ToString("X").PadLeft(2, '0') + dateParts[3].ToString("X").PadLeft(2, '0')), + Int32.Parse(dateParts[0].ToString("X").PadLeft(2, '0')), + Int32.Parse(dateParts[1].ToString("X").PadLeft(2, '0')) + ); + + // 1/64000th's to play before fadeout + uint fadeoutDelay = reader.ReadUInt32(); + // 1/64000th's to fade to silence + uint fadeoutLength = reader.ReadUInt32(); + + // amplification value (10000h == 1.00) + uint iAmplificationValue = reader.ReadUInt32(); + double amplificationValue = (double)iAmplificationValue * 0.00001; + + SPC700Emulator emulator = (SPC700Emulator)reader.ReadByte(); + + byte ostDisk = reader.ReadByte(); + byte ostTrackNumber = reader.ReadByte(); + + ushort copyrightYear = reader.ReadUInt16(); + + byte[] unused = reader.ReadBytes(34); + + SynthesizedAudioCollectionTrack track = new SynthesizedAudioCollectionTrack(); + track.SongTitle = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.GameTitle = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.ArtistName = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.DumperName = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.Comments = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.AlbumTitle = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.PublisherName = reader.ReadFixedLengthString(32).TrimNull().Trim(); + track.OriginalFileName = reader.ReadFixedLengthString(28).TrimNull().Trim(); + + uint extendedDataBlockOffset = reader.ReadUInt32(); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + SynthesizedAudioCollectionObjectModel coll = (objectModel as SynthesizedAudioCollectionObjectModel); + if (coll == null) throw new ObjectModelNotSupportedException(); + + Writer writer = base.Accessor.Writer; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/BDJODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/BDJODataFormat.cs new file mode 100644 index 00000000..189e6995 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/BDJODataFormat.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.BluRay +{ + public class BDJODataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + // _dfr.Capabilities.Add(typeof( + _dfr.Filters.Add("Blu-Ray Disc Java Object", new string[] { "*.bdjo" }); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + // PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + IO.BinaryReader br = base.Stream.BinaryReader; + br.Endianness = IO.Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + string version = br.ReadFixedLengthString(4); + + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/HDMVDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/HDMVDataFormat.cs new file mode 100644 index 00000000..d35f2f08 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/HDMVDataFormat.cs @@ -0,0 +1,28 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +namespace UniversalEditor.DataFormats.Multimedia.BluRay +{ + public class HDMVDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + + string signature = br.ReadFixedLengthString(4); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/INDXDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/INDXDataFormat.cs new file mode 100644 index 00000000..e3c47324 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/INDXDataFormat.cs @@ -0,0 +1,27 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +namespace UniversalEditor.DataFormats.Multimedia.BluRay +{ + public class INDXDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MOBJDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MOBJDataFormat.cs new file mode 100644 index 00000000..acbbfd8d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MOBJDataFormat.cs @@ -0,0 +1,27 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +namespace UniversalEditor.DataFormats.Multimedia.BluRay +{ + public class MOBJDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MPLSDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MPLSDataFormat.cs new file mode 100644 index 00000000..74eddbab --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/BluRay/MPLSDataFormat.cs @@ -0,0 +1,30 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +namespace UniversalEditor.DataFormats.Multimedia.BluRay +{ + public class MPLSDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + PlaylistObjectModel pom = objectModel as PlaylistObjectModel; + Reader br = base.Accessor.Reader; + br.Endianness = Endianness.BigEndian; + string signature = br.ReadFixedLengthString(4); + string version = br.ReadFixedLengthString(4); + byte[] unknown = br.ReadBytes(54u); + int count = br.ReadInt32(); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ACODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ACODataFormat.cs new file mode 100644 index 00000000..eb42cfb5 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ACODataFormat.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Palette; + +namespace UniversalEditor.DataFormats.Multimedia.Palette.Adobe +{ + public class ACODataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PaletteObjectModel), DataFormatCapabilities.All); + _dfr.Sources.Add("http://www.nomodes.com/aco.html"); + _dfr.ExportOptions.Add(new CustomOptionNumber("Version", "&Version:", 1, 1, ushort.MaxValue)); + } + return _dfr; + } + + private ushort mvarVersion = 1; + public ushort Version { get { return mvarVersion; } set { mvarVersion = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PaletteObjectModel palette = (objectModel as PaletteObjectModel); + IO.Reader br = base.Accessor.Reader; + br.Endianness = IO.Endianness.BigEndian; + + // The palette begins with a two-word header: + mvarVersion = br.ReadUInt16(); + ushort colorCount = br.ReadUInt16(); + + // The header is followed by nc color specs. In a version 1 ACO file, each color spec + // occupies five words: + for (ushort i = 0; i < colorCount; i++) + { + ushort colorSpace = br.ReadUInt16(); + ushort w = br.ReadUInt16(); + ushort x = br.ReadUInt16(); + ushort y = br.ReadUInt16(); + ushort z = br.ReadUInt16(); + + string colorName = String.Empty; + if (mvarVersion >= 2) + { + ushort colorNameLength = br.ReadUInt16(); + colorName = br.ReadNullTerminatedString(); + } + + switch (colorSpace) + { + case 0: + { + // RGB + int R = (w / 256); + int G = (x / 256); + int B = (y / 256); + + PaletteEntry entry = new PaletteEntry(); + entry.Color = Color.FromRGBA(R, G, B); + palette.Entries.Add(entry); + break; + } + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + PaletteObjectModel palette = (objectModel as PaletteObjectModel); + IO.Writer bw = base.Accessor.Writer; + bw.Endianness = IO.Endianness.BigEndian; + + // The palette begins with a two-word header: + bw.WriteUInt16(mvarVersion); + ushort colorCount = (ushort)palette.Entries.Count; + bw.WriteUInt16(colorCount); + + // The header is followed by nc color specs. In a version 1 ACO file, each color spec + // occupies five words: + foreach (PaletteEntry color in palette.Entries) + { + ushort colorSpace = 0; // RGB + bw.WriteUInt16(colorSpace); + + switch (colorSpace) + { + case 0: + { + ushort w = (ushort)((color.Color.Red * 255) * 256); + ushort x = (ushort)((color.Color.Green * 255) * 256); + ushort y = (ushort)((color.Color.Blue * 255) * 256); + ushort z = 0; + + bw.WriteUInt16(w); + bw.WriteUInt16(x); + bw.WriteUInt16(y); + bw.WriteUInt16(z); + break; + } + } + + if (mvarVersion >= 2) + { + bw.WriteUInt16((ushort)color.Name.Length); + bw.WriteNullTerminatedString(color.Name); + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ASEDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ASEDataFormat.cs new file mode 100644 index 00000000..79602625 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/Adobe/ASEDataFormat.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Palette; + +namespace UniversalEditor.DataFormats.Multimedia.Palette.Adobe +{ + public class ASEDataFormat : DataFormat + { + // http://www.selapa.net/swatches/colors/fileformats.php#adobe_acb + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PaletteObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PaletteObjectModel palette = (objectModel as PaletteObjectModel); + + IO.Reader br = base.Accessor.Reader; + br.Endianness = IO.Endianness.BigEndian; + br.Accessor.DefaultEncoding = Encoding.UTF8; + + string ASEF = br.ReadFixedLengthString(4); + if (ASEF != "ASEF") throw new InvalidDataFormatException("File does not begin with \"ASEF\""); + + short versionMajor = br.ReadInt16(); + short versionMinor = br.ReadInt16(); + + int blockCount = br.ReadInt32(); + for (int i = 0; i < blockCount; i++) + { + ushort blockType = br.ReadUInt16(); + int blockLength = br.ReadInt32(); + ushort blockNameLength = br.ReadUInt16(); + + string blockName = br.ReadFixedLengthString(blockNameLength).TrimNull(); + + switch (blockType) + { + case 0xC001: + { + // Group start + break; + } + case 0xC002: + { + // Group end + break; + } + case 0x0001: + { + // Color entry + string colorModel = br.ReadFixedLengthString(4); + switch (colorModel) + { + case "CMYK": + { + break; + } + case "LAB ": + { + float r = br.ReadSingle(); + float g = br.ReadSingle(); + float b = br.ReadSingle(); + break; + } + case "RGB ": + { + float r = br.ReadSingle(); + float g = br.ReadSingle(); + float b = br.ReadSingle(); + + byte _r = (byte)(Math.Round(r * 255)); + byte _g = (byte)(Math.Round(g * 255)); + byte _b = (byte)(Math.Round(b * 255)); + + Color color = Color.FromRGBA(_r, _g, _b); + palette.Entries.Add(color); + break; + } + case "Gray": + { + break; + } + } + + ushort colorType = br.ReadUInt16(); + // 0 = Global, 1 = Spot, 2 = Normal + break; + } + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/GIMP/GPLDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/GIMP/GPLDataFormat.cs new file mode 100644 index 00000000..68e28e17 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/GIMP/GPLDataFormat.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Palette; + +namespace UniversalEditor.DataFormats.Multimedia.Palette.GIMP +{ + public class GPLDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PaletteObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PaletteObjectModel palette = (objectModel as PaletteObjectModel); + if (palette == null) return; + + IO.Reader tr = base.Accessor.Reader; + bool headerRead = false; + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + if (line.Contains("#")) line = line.Substring(0, line.IndexOf("#")); + line = line.Trim(); + if (line == String.Empty) continue; + + if (line == "GIMP Palette") + { + headerRead = true; + continue; + } + else if (!headerRead) + { + throw new InvalidDataFormatException("File does not begin with \"GIMP Palette\""); + } + else + { + string[] colors = line.Split(new char[] { ' ' }, 4, StringSplitOptions.RemoveEmptyEntries); + if (colors.Length >= 3) + { + string colorName = String.Empty; + int r = Int32.Parse(colors[0]); + int g = Int32.Parse(colors[1]); + int b = Int32.Parse(colors[2]); + if (colors.Length >= 4) + { + colorName = colors[3]; + } + + Color color = Color.FromRGBA(r, g, b); + palette.Entries.Add(color, colorName); + } + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/PaintShop/PaintShopPaletteDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/PaintShop/PaintShopPaletteDataFormat.cs new file mode 100644 index 00000000..49436717 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Palette/PaintShop/PaintShopPaletteDataFormat.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Palette; + +namespace UniversalEditor.DataFormats.Multimedia.Palette.PaintShop +{ + public class PaintShopPaletteDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PaletteObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PaletteObjectModel palette = (objectModel as PaletteObjectModel); + if (palette == null) return; + + IO.Reader tr = base.Accessor.Reader; + string signature = tr.ReadLine(); + if (signature != "JASC-PAL") throw new InvalidDataFormatException("File does not begin with \"JASC-PAL\""); + + string unknown = tr.ReadLine(); + string sColorCount = tr.ReadLine(); + int iColorCount = Int32.Parse(sColorCount); + + while (!tr.EndOfStream) + { + string colorLine = tr.ReadLine(); + string[] colorInfo = colorLine.Split(new char[] { ' ' }); + if (colorInfo.Length < 3) continue; + + string sR = colorInfo[0], sG = colorInfo[1], sB = colorInfo[2]; + int iR = Int32.Parse(sR), iG = Int32.Parse(sG), iB = Int32.Parse(sB); + + Color color = Color.FromRGBA(iR, iG, iB); + palette.Entries.Add(color); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ARGB/ARGBDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ARGB/ARGBDataFormat.cs new file mode 100644 index 00000000..daf2b4a4 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ARGB/ARGBDataFormat.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.ARGB +{ + public class ARGBDataFormat : DataFormat + { + private DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + IO.Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(4); + if (signature != "BGRA") throw new InvalidDataFormatException("File does not begin with \"BGRA\""); + + int unknown = br.ReadInt32(); + int imageWidth = br.ReadInt32(); + int imageHeight = br.ReadInt32(); + pic.Width = imageWidth; + pic.Height = imageHeight; + + for (short x = 0; x < imageWidth; x++) + { + for (short y = 0; y < imageHeight; y++) + { + byte a = br.ReadByte(); + byte r = br.ReadByte(); + byte g = br.ReadByte(); + byte b = br.ReadByte(); + + Color color = Color.FromRGBA(a, r, g, b); + pic.SetPixel(color, x, y); + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + IO.Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("BGRA"); + + int unknown = 0; + bw.WriteInt32(unknown); + bw.WriteInt32(pic.Width); + bw.WriteInt32(pic.Height); + + for (int x = 0; x < pic.Width; x++) + { + for (int y = 0; y < pic.Height; y++) + { + Color color = pic.GetPixel(x, y); + bw.WriteByte((byte)(color.Alpha * 255)); + bw.WriteByte((byte)(color.Red * 255)); + bw.WriteByte((byte)(color.Green * 255)); + bw.WriteByte((byte)(color.Blue * 255)); + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapBitsPerPixel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapBitsPerPixel.cs new file mode 100644 index 00000000..a66ae807 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapBitsPerPixel.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Bitmap +{ + public enum BitmapBitsPerPixel : short + { + /// + /// The number of bits-per-pixel is specified or is implied by the JPEG or PNG format. + /// + Implied = 0, + /// + /// The bitmap is monochrome, and the bmiColors member of BITMAPINFO contains two entries. Each bit + /// in the bitmap array represents a pixel. If the bit is clear, the pixel is displayed with the + /// color of the first entry in the bmiColors table; if the bit is set, the pixel has the color of + /// the second entry in the table. + /// + Monochrome = 1, + /// + /// The bitmap has a maximum of 16 colors, and the bmiColors member of BITMAPINFO contains up to 16 + /// entries. Each pixel in the bitmap is represented by a 4-bit index into the color table. For + /// example, if the first byte in the bitmap is 0x1F, the byte represents two pixels. The first pixel + /// contains the color in the second table entry, and the second pixel contains the color in the + /// sixteenth table entry. + /// + Color16 = 4, + /// + /// The bitmap has a maximum of 256 colors, and the bmiColors member of BITMAPINFO contains up to 256 + /// entries. In this case, each byte in the array represents a single pixel. + /// + Color256 = 8, + /// + /// + /// The bitmap has a maximum of 2^16 colors. If the biCompression member of the BITMAPINFOHEADER is + /// BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each WORD in the bitmap array represents a + /// single pixel. The relative intensities of red, green, and blue are represented with five bits for + /// each color component. The value for blue is in the least significant five bits, followed by five + /// bits each for green and red. The most significant bit is not used. The bmiColors color table is + /// used for optimizing colors used on palette-based devices, and must contain the number of entries + /// specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + /// + /// If the biCompression member of the BITMAPINFOHEADER is BI_BITFIELDS, the bmiColors member + /// contains three DWORD color masks that specify the red, green, and blue components, respectively, + /// of each pixel. Each WORD in the bitmap array represents a single pixel. + /// + /// + /// When the biCompression member is BI_BITFIELDS, bits set in each DWORD mask must be contiguous + /// and should not overlap the bits of another mask. All the bits in the pixel do not have to be + /// used. + /// + /// + HighColor = 16, + /// + /// The bitmap has a maximum of 2^24 colors, and the bmiColors member of BITMAPINFO is NULL. Each 3-byte + /// triplet in the bitmap array represents the relative intensities of blue, green, and red, respectively, + /// for a pixel. The bmiColors color table is used for optimizing colors used on palette-based devices, and + /// must contain the number of entries specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + TrueColor = 24, + /// + /// The bitmap has a maximum of 2^32 colors. If the biCompression member of the BITMAPINFOHEADER is BI_RGB, + /// the bmiColors member of BITMAPINFO is NULL. Each DWORD in the bitmap array represents the relative + /// intensities of blue, green, and red for a pixel. The value for blue is in the least significant 8 bits, + /// followed by 8 bits each for green and red. The high byte in each DWORD is not used. The bmiColors color + /// table is used for optimizing colors used on palette-based devices, and must contain the number of + /// entries specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + DeepColor = 32 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapCompression.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapCompression.cs new file mode 100644 index 00000000..733b96aa --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapCompression.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Bitmap +{ + public enum BitmapCompression : int + { + /// + /// An uncompressed format. + /// + None = 0, + /// + /// A run-length encoded (RLE) format for bitmaps with 8 bpp. The compression format is a 2-byte format + /// consisting of a count byte followed by a byte containing a color index. + /// + RLE8 = 1, + /// + /// An RLE format for bitmaps with 4 bpp. The compression format is a 2-byte format consisting of a count + /// byte followed by two word-length color indexes. + /// + RLE4 = 2, + /// + /// Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks + /// that specify the red, green, and blue components, respectively, of each pixel. This is valid when used + /// with 16- and 32-bpp bitmaps. + /// + Bitfields = 3, + /// + /// Indicates that the image is a JPEG image. + /// + JPEG = 4, + /// + /// Indicates that the image is a PNG image. + /// + PNG = 5 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapDataFormat.cs new file mode 100644 index 00000000..e128e471 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapDataFormat.cs @@ -0,0 +1,263 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Bitmap +{ + /// + /// Provides a for loading and saving Windows and OS/2 Bitmap documents. + /// Supports bitmap formats that are not natively supported by Windows. + /// + public class BitmapDataFormat : DataFormat + { + public const int BITMAP_HEADER_SIZE = (2 + 6 * 4 + 2 * 2 + 6 * 4); + public const int BITMAP_PALETTE_ENTRY_SIZE = 4; + + private BitmapBitsPerPixel mvarPixelDepth = BitmapBitsPerPixel.TrueColor; + /// + /// The number of bits-per-pixel. The biBitCount member of the BITMAPINFOHEADER structure determines the + /// number of bits that define each pixel and the maximum number of colors in the bitmap. + /// + public BitmapBitsPerPixel PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + + dfr.Filters.Add("Microsoft Windows and OS/2 bitmap", new byte?[][] + { + new byte?[] { (byte)'B', (byte)'M' }, // Windows 3.1x, 95, NT, ... etc.; and it is not mandatory unless file size is greater or equal to SIGNATURE + new byte?[] { (byte)'B', (byte)'A' }, // OS/2 struct Bitmap Array + new byte?[] { (byte)'C', (byte)'I' }, // OS/2 struct Color Icon + // new byte?[] { (byte)'C', (byte)'P' }, // OS/2 const Color Pointer + new byte?[] { (byte)'I', (byte)'C' }, // OS/2 struct Icon + new byte?[] { (byte)'P', (byte)'T' } // OS/2 Pointer + }, new string[] { "*.bmp", "*.spa", "*.sph" }); + + // TODO: Figure out how to prevent this from colliding with CPK files that start with "CP" ("CPK") + // dfr.Filters[0].HintComparison = DataFormatHintComparison.FilterOnly; + // TODO: Sort list of data formats by length of magic byte requirement during the sniffing process? ;) + + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) throw new ObjectModelNotSupportedException(); + + IO.BinaryReader br = base.Stream.BinaryReader; + + string signature = br.ReadFixedLengthString(2); + switch (signature) + { + case "BM": + case "BA": + case "CI": + case "CP": + case "IC": + case "PT": + { + break; + } + default: + { + throw new InvalidDataFormatException(); + } + } + + int fileSize = br.ReadInt32(); + short reserved1 = br.ReadInt16(); + short reserved2 = br.ReadInt16(); + int offset = br.ReadInt32(); + + BitmapInfoHeader header = BitmapInfoHeader.Load(br); + mvarPixelDepth = header.PixelDepth; + + pic.Width = header.Width; + pic.Height = header.Height; + + byte bitRead = 0; + int bitsRead = 0; + + List palette = new List(); + + // there is a palette + // To read the palette, we can simply read in a block of bytes + // since our array elements are guaranteed to be contiguous and in row-major order. + int paletteSize = offset - header.HeaderSize; + int numPaletteEntries = paletteSize / BITMAP_PALETTE_ENTRY_SIZE; + for (int i = 0; i < numPaletteEntries; i++) + { + byte b = br.ReadByte(); + byte g = br.ReadByte(); + byte r = br.ReadByte(); + byte a = br.ReadByte(); + palette.Add(Color.FromArgb(r, g, b, a)); + } + + if (mvarPixelDepth == BitmapBitsPerPixel.TrueColor) + { + } + br.BaseStream.Position = offset; + + // starts from bottom-left corner, goes BGR + for (int y = header.Height - 1; y >= 0; y--) + { + for (int x = 0; x < header.Width; x++) + { + byte r = 0, g = 0, b = 0, a = 255; + + switch (mvarPixelDepth) + { + case BitmapBitsPerPixel.Monochrome: + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + break; + } + case BitmapBitsPerPixel.Color16: + { + break; + } + case BitmapBitsPerPixel.Color256: + { + byte rgb = br.ReadByte(); + r = (byte)(palette[rgb].Red * 255); + g = (byte)(palette[rgb].Green * 255); + b = (byte)(palette[rgb].Blue * 255); + break; + } + case BitmapBitsPerPixel.HighColor: + { + // X1R5G5B5 + short value = br.ReadInt16(); + int x1 = value.GetBits(16, 1); + b = (byte)(8 * value.GetBits(0, 5)); + g = (byte)(8 * value.GetBits(5, 5)); + r = (byte)(8 * value.GetBits(10, 5)); + break; + } + case BitmapBitsPerPixel.TrueColor: + { + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) G 72 + r = br.ReadByte(); // (2,2) R 63 + break; + } + case BitmapBitsPerPixel.DeepColor: + { + if (header.Compression == BitmapCompression.Bitfields) + { + // this is really black magic going on here. these aren't bitfields at all.. + + a = br.ReadByte(); // (2,2) R 63 + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) B 204 + r = br.ReadByte(); // (2,2) G 72 + a = 255; + } + else + { + b = br.ReadByte(); // (2,2) R 63 + g = br.ReadByte(); // (2,2) B 204 + r = br.ReadByte(); // (2,2) B 204 + a = br.ReadByte(); // (2,2) G 72 + a = 255; + } + break; + } + } + + Color color = Color.FromArgb(a, r, g, b); + pic.SetPixel(color, x, y); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryWriter bw = base.Stream.BinaryWriter; + + string signature = "BM"; + bw.WriteFixedLengthString(signature); + + int fileSize = 54 + (pic.Width * pic.Height * 4); + bw.Write(fileSize); + + short reserved1 = 0; + short reserved2 = 0; + bw.Write(reserved1); + bw.Write(reserved2); + + int offset = 54; + bw.Write(offset); + + BitmapInfoHeader header = new BitmapInfoHeader(); + header.Width = pic.Width; + header.Height = pic.Height; + header.Planes = 1; + header.PixelDepth = mvarPixelDepth; + header.Compression = BitmapCompression.None; + header.ImageSize = 0; + header.PelsPerMeterX = 0; + header.PelsPerMeterY = 0; + header.UsedColorIndexCount = 0; + header.RequiredColorIndexCount = 0; + BitmapInfoHeader.Save(bw, header); + + for (int y = pic.Height - 1; y >= 0; y--) + { + for (int x = 0; x < pic.Width; x++) + { + Color color = pic.GetPixel(x, y); + byte r = (byte)(color.Red * 255), g = (byte)(color.Green * 255), b = (byte)(color.Blue * 255); + + /* + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else */ + + switch (mvarPixelDepth) + { + case BitmapBitsPerPixel.TrueColor: + { + bw.Write(b); + bw.Write(g); + bw.Write(r); + break; + } + } + } + } + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapInfoHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapInfoHeader.cs new file mode 100644 index 00000000..9c3300cc --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Bitmap/BitmapInfoHeader.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Bitmap +{ + public struct BitmapInfoHeader + { + private int mvarWidth; + /// + /// The width of the bitmap, in pixels. If biCompression is JPEG or PNG, the biWidth member specifies the + /// width of the decompressed JPEG or PNG image file, respectively. + /// + public int Width { get { return mvarWidth; } set { mvarWidth = value; } } + + private int mvarHeaderSize; + public int HeaderSize { get { return mvarHeaderSize; } set { mvarHeaderSize = value; } } + + private int mvarHeight; + public int Height { get { return mvarHeight; } set { mvarHeight = value; } } + + private short mvarPlanes; + /// + /// The number of planes for the target device. This value must be set to 1. + /// + public short Planes { get { return mvarPlanes; } set { mvarPlanes = value; } } + + private BitmapCompression mvarCompression; + /// + /// The type of compression for a compressed bottom-up bitmap (top-down DIBs cannot be compressed). + /// + public BitmapCompression Compression { get { return mvarCompression; } set { mvarCompression = value; } } + + private int mvarImageSize; + /// + /// The size, in bytes, of the image. This may be set to zero for Uncompressed bitmaps. If biCompression is + /// JPEG or PNG, biSizeImage indicates the size of the JPEG or PNG image buffer, respectively. + /// + public int ImageSize { get { return mvarImageSize; } set { mvarImageSize = value; } } + + private int mvarPelsPerMeterX; + /// + /// The horizontal resolution, in pixels-per-meter, of the target device for the bitmap. An application + /// can use this value to select a bitmap from a resource group that best matches the characteristics of + /// the current device. + /// + public int PelsPerMeterX { get { return mvarPelsPerMeterX; } set { mvarPelsPerMeterX = value; } } + + private int mvarPelsPerMeterY; + /// + /// The vertical resolution, in pixels-per-meter, of the target device for the bitmap. + /// + public int PelsPerMeterY { get { return mvarPelsPerMeterY; } set { mvarPelsPerMeterY = value; } } + + private int mvarUsedColorIndexCount; + /// + /// + /// The number of color indexes in the color table that are actually used by the bitmap. If this + /// value is zero, the bitmap uses the maximum number of colors corresponding to the value of the + /// biBitCount member for the compression mode specified by biCompression. + /// + /// + /// If biClrUsed is nonzero and the biBitCount member is less than 16, the biClrUsed member specifies + /// the actual number of colors the graphics engine or device driver accesses. If biBitCount is 16 or + /// greater, the biClrUsed member specifies the size of the color table used to optimize performance + /// of the system color palettes. If biBitCount equals 16 or 32, the optimal color palette starts + /// immediately following the three DWORD masks. + /// + /// + /// When the bitmap array immediately follows the BITMAPINFO structure, it is a packed bitmap. Packed + /// bitmaps are referenced by a single pointer. Packed bitmaps require that the biClrUsed member must + /// be either zero or the actual size of the color table. + /// + /// + public int UsedColorIndexCount { get { return mvarUsedColorIndexCount; } set { mvarUsedColorIndexCount = value; } } + + private int mvarRequiredColorIndexCount; + /// + /// The number of color indexes that are required for displaying the bitmap. If this value is zero, all + /// colors are required. + /// + public int RequiredColorIndexCount { get { return mvarRequiredColorIndexCount; } set { mvarRequiredColorIndexCount = value; } } + + private BitmapBitsPerPixel mvarPixelDepth; + public BitmapBitsPerPixel PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + public static BitmapInfoHeader Load(IO.BinaryReader br) + { + BitmapInfoHeader header = new BitmapInfoHeader(); + header.HeaderSize = br.ReadInt32(); // 40 vs. 56 + header.Width = br.ReadInt32(); + header.Height = br.ReadInt32(); + header.Planes = br.ReadInt16(); // 1 + header.PixelDepth = (BitmapBitsPerPixel)br.ReadInt16(); + header.Compression = (BitmapCompression)br.ReadInt32(); + header.ImageSize = br.ReadInt32(); + header.PelsPerMeterX = br.ReadInt32(); + header.PelsPerMeterY = br.ReadInt32(); + header.UsedColorIndexCount = br.ReadInt32(); + header.RequiredColorIndexCount = br.ReadInt32(); + + if (header.HeaderSize < 56) + { + br.BaseStream.Position += (56 - header.HeaderSize); + } + return header; + } + public static void Save(IO.BinaryWriter bw, BitmapInfoHeader header) + { + bw.Write((int)40); // header size + bw.Write(header.Width); + bw.Write(header.Height); + bw.Write(header.Planes); + bw.Write((short)header.PixelDepth); + bw.Write((int)header.Compression); + bw.Write(header.ImageSize); + bw.Write(header.PelsPerMeterX); + bw.Write(header.PelsPerMeterY); + bw.Write(header.UsedColorIndexCount); + bw.Write(header.RequiredColorIndexCount); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/BitmapDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/BitmapDataFormat.cs new file mode 100644 index 00000000..abfe6e87 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/BitmapDataFormat.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class BitmapDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + + dfr.Filters.Add("Microsoft Windows and OS/2 bitmap", new byte?[][] + { + new byte?[] { (byte)'B', (byte)'M' }, // Windows 3.1x, 95, NT, ... etc.; and it is not mandatory unless file size is greater or equal to SIGNATURE + new byte?[] { (byte)'B', (byte)'A' }, // OS/2 struct Bitmap Array + new byte?[] { (byte)'C', (byte)'I' }, // OS/2 struct Color Icon + // new byte?[] { (byte)'C', (byte)'P' }, // OS/2 const Color Pointer + new byte?[] { (byte)'I', (byte)'C' }, // OS/2 struct Icon + new byte?[] { (byte)'P', (byte)'T' } // OS/2 Pointer + }, new string[] { "*.bmp", "*.spa", "*.sph" }); + + // TODO: Figure out how to prevent this from colliding with CPK files that start with "CP" ("CPK") + // dfr.Filters[0].HintComparison = DataFormatHintComparison.FilterOnly; + + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryReader br = base.Stream.BinaryReader; + + string signature = br.ReadFixedLengthString(2); + int fileSize = br.ReadInt32(); + short reserved1 = br.ReadInt16(); + short reserved2 = br.ReadInt16(); + int offset = br.ReadInt32(); + int reserved3 = br.ReadInt32(); // 40 + int width = br.ReadInt32(); + int height = br.ReadInt32(); + + short reserved4 = br.ReadInt16(); // 1 + short bitsPerPixel = br.ReadInt16(); // 24 for 24-bit bitmap + int reserved6 = br.ReadInt32(); // 8 for 256-color bitmap + int reserved7 = br.ReadInt32(); + int reserved8 = br.ReadInt32(); + int reserved9 = br.ReadInt32(); + int reserved10 = br.ReadInt32(); + int reserved11 = br.ReadInt32(); + + pic.Width = width; + pic.Height = height; + + byte bitRead = 0; + int bitsRead = 0; + + // starts from bottom-left corner, goes BGR + for (int y = height - 1; y >= 0; y--) + { + for (int x = 0; x < width; x++) + { + byte r = 0, g = 0, b = 0; + + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else if (bitsPerPixel == 24) + { + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) G 72 + r = br.ReadByte(); // (2,2) R 63 + } + + System.Drawing.Color color = System.Drawing.Color.FromArgb(r, g, b); + pic.SetPixel(color, x, y); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryWriter bw = base.Stream.BinaryWriter; + + string signature = "BM"; + bw.WriteFixedLengthString(signature); + + int fileSize = 54 + (pic.Width * pic.Height * 4); + bw.Write(fileSize); + + short reserved1 = 0; + short reserved2 = 0; + bw.Write(reserved1); + bw.Write(reserved2); + + int offset = 54; + bw.Write(offset); + + int reserved3 = 40; // 40 + bw.Write(reserved3); + + bw.Write(pic.Width); + bw.Write(pic.Height); + + short reserved4 = 1; // 1 + bw.Write(reserved4); + + short bitsPerPixel = 24; // 24 for 24-bit bitmap + bw.Write(bitsPerPixel); // 8 for 256-color bitmap + + int reserved6 = 0; + bw.Write(reserved6); + int reserved7 = 0; + bw.Write(reserved6); + int reserved8 = 0; + bw.Write(reserved6); + int reserved9 = 0; + bw.Write(reserved6); + int reserved10 = 0; + bw.Write(reserved6); + int reserved11 = 0; + bw.Write(reserved6); + + for (int y = pic.Height - 1; y >= 0; y--) + { + for (int x = 0; x < pic.Width; x++) + { + System.Drawing.Color color = pic.GetPixel(x, y); + byte r = (byte)color.R, g = (byte)color.G, b = (byte)color.B; + + /* + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else */ if (bitsPerPixel == 24) + { + bw.Write(b); + bw.Write(g); + bw.Write(r); + } + } + } + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CURDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CURDataFormat.cs new file mode 100644 index 00000000..4eb26dbb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CURDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Picture; +namespace UniversalEditor.DataFormats.Multimedia.Picture +{ + public class CURDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ChaosWorks/CWESpriteDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ChaosWorks/CWESpriteDataFormat.cs new file mode 100644 index 00000000..9ea2a8de --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ChaosWorks/CWESpriteDataFormat.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.ChaosWorks +{ + public class CWESpriteDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + + IO.Reader br = base.Accessor.Reader; + br.Accessor.Position = 0; + + string CWE_sprite = br.ReadNullTerminatedString(); + if (CWE_sprite != "CWE sprite") throw new InvalidDataFormatException(); + uint unknown1 = br.ReadUInt32(); // always the same? + uint unknown2 = br.ReadUInt32(); // always the same? + + // ushort unknown3 = br.ReadUInt16(); + + pic.Width = br.ReadByte(); + pic.Height = br.ReadByte(); + + br.Accessor.Position = 512; + for (int x = 0; x < pic.Width; x++) + { + for (int y = 0; y < pic.Height; y++) + { + byte r = br.ReadByte(); + byte g = br.ReadByte(); + byte b = br.ReadByte(); + + pic.SetPixel(Color.FromRGBA(r, g, b), x, y); + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/CompressedBGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/CompressedBGDataFormat.cs new file mode 100644 index 00000000..101deed2 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/CompressedBGDataFormat.cs @@ -0,0 +1,369 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.CompressedBG +{ + // portions from minirop's arc-reader, licensed under the zlib license (GPL compatible) + // https://github.com/minirop/arc-reader/blob/master/cbg.c + + /* + Arc Reader - Reading .arc files from the BGI engine + Copyright (C) 2011 Alexander Roper (minirop@peyj.com) + Translated from C to C# into a Universal Editor plugin by Michael Becker (alcexhim@gmail.com) + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it freely, + subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + */ + + public class CompressedBGDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return _dfr; + } + + private int hash_update(ref int hash_val) + { + int eax = 0, edx = 0; + edx = (20021 * hash_val.LowerWord()); + eax = (20021 * hash_val.UpperWord()) + (346 * hash_val) + edx.UpperWord(); + hash_val = (eax.LowerWord() << 16) + edx.LowerWord() + 1; + return eax & 0x7FFF; + } + private uint hash_update(ref uint hash_val) + { + uint eax = 0, edx = 0; + edx = (20021 * hash_val.LowerWord()); + eax = (20021 * hash_val.UpperWord()) + (346 * hash_val) + edx.UpperWord(); + hash_val = (eax.LowerWord() << 16) + edx.LowerWord() + 1; + return eax & 0x7FFF; + } + + private int method2(uint[/*256*/] table1, Internal.NodeCBG[/*511*/] table2) + { + int sum_of_values = 0; + Internal.NodeCBG node = new Internal.NodeCBG(); + int cnodes = 256; + int[] vinfo = new int[2]; + + for (int i = 0; i < 256; i++) + { + table2[i].vv = new int[6]; + + table2[i].vv[0] = ((table1[i] > 0) ? 1 : 0); + table2[i].vv[1] = (int)table1[i]; + table2[i].vv[2] = 0; + table2[i].vv[3] =-1; + table2[i].vv[4] = i; + table2[i].vv[5] = i; + sum_of_values += (int)table1[i]; + } + + node.vv = new int[6]; + node.vv[0] = 0; + node.vv[1] = 0; + node.vv[2] = 1; + node.vv[3] =-1; + node.vv[4] =-1; + node.vv[5] =-1; + + for (int i = 0; i < 255; i++) + { + table2[256 + i] = node; + } + + while (true) + { + uint m; + for(m = 0; m < 2; m++) + { + uint min_value = 0xFFFFFFFF; + vinfo[m] = Int32.MaxValue; + + for (int i = 0; i < cnodes; i++) + { + Internal.NodeCBG cnode = table2[i]; + + if ((cnode.vv[0] != 0) && (cnode.vv[1] < min_value)) + { + vinfo[m] = i; + min_value = (uint)cnode.vv[1]; + } + } + + if ((uint)vinfo[m] != UInt32.MaxValue) + { + table2[vinfo[m]].vv[0] = 0; + table2[vinfo[m]].vv[3] = cnodes; + } + } + + node.vv[0] = 1; + node.vv[1] = (((uint)vinfo[1] != 0xFFFFFFFF) ? table2[vinfo[1]].vv[1] : 0) + table2[vinfo[0]].vv[1]; + node.vv[2] = 1; + node.vv[3] =-1; + node.vv[4] = vinfo[0]; + node.vv[5] = vinfo[1]; + + table2[cnodes++] = node; + + if (node.vv[1] == sum_of_values) break; + } + return cnodes - 1; + } + + private uint readVariable(byte[] ptr) + { + byte c; + uint v = 0; + int shift = 0; + int i = 0; + do + { + c = ptr[i]; + i++; + v |= (uint)((c & 0x7F) << shift); + shift += 7; + } + while ((c & 0x80) == 0x80); + + return v; + } + + private static uint color_avg(uint x, uint y) + { + uint a = (((x & 0xFF000000) / 2) + ((y & 0xFF000000) / 2)) & 0xFF000000; + uint r = (((x & 0x00FF0000) + (y & 0x00FF0000)) / 2) & 0x00FF0000; + uint g = (((x & 0x0000FF00) + (y & 0x0000FF00)) / 2) & 0x0000FF00; + uint b = (((x & 0x000000FF) + (y & 0x000000FF)) / 2) & 0x000000FF; + return (a | r | g | b); + } + + private static uint color_add(uint x, uint y) + { + uint a = ((x & 0xFF000000) + (y & 0xFF000000)) & 0xFF000000; + uint r = ((x & 0x00FF0000) + (y & 0x00FF0000)) & 0x00FF0000; + uint g = ((x & 0x0000FF00) + (y & 0x0000FF00)) & 0x0000FF00; + uint b = ((x & 0x000000FF) + (y & 0x000000FF)) & 0x000000FF; + + return (a | r | g | b); + } + + private static uint extract(byte[] src, uint bpp) + { + IO.Reader br = new IO.Reader(new MemoryAccessor(src)); + if (bpp == 32) + { + return br.ReadUInt32(); + } + else + { + uint r = 0, g = 0, b = 0; + r = br.ReadByte(); + if (bpp == 24) + { + g = br.ReadByte(); + b = br.ReadByte(); + } + else + { + g = r; + b = r; + } + return (0xff000000 | r << 16 | g << 8 | b); + } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.Reader br = base.Accessor.Reader; + string magic = br.ReadFixedLengthString(16); + if (magic != "CompressedBG___\0") throw new InvalidDataFormatException(); + + ushort width = br.ReadUInt16(); + ushort height = br.ReadUInt16(); + uint bitsPerPixel = br.ReadUInt32(); + uint padding0 = br.ReadUInt32(); + uint padding1 = br.ReadUInt32(); + + uint data1Length = br.ReadUInt32(); + uint data0Value = br.ReadUInt32(); + uint data0Length = br.ReadUInt32(); + + byte sum_check = br.ReadByte(); + byte xor_check = br.ReadByte(); + byte unknown = br.ReadByte(); + + byte sum_data = 0, xor_data = 0; + + uint[] table = new uint[256]; + Internal.NodeCBG[] table2 = new Internal.NodeCBG[511]; + + byte[] data0 = br.ReadBytes(data0Length); + for (int i = 0; i < data0Length; i++) + { + data0[i] -= (byte)(hash_update(ref data0Value) & 0xFF); + sum_data += data0[i]; + xor_data ^= data0[i]; + } + + if (sum_data != sum_check || xor_data != xor_check) + { + throw new DataCorruptedException(); + } + + for(int i = 0; i < 256; i++) + { + table[i] = readVariable(data0); + } + data0 = null; + + uint method2_res = (uint)method2(table, table2); + byte[] data1 = new byte[data1Length]; + #region Decrypt data + for (int i = 0; i < data1Length; i++) + { + uint cvalue = method2_res; + if (table2[method2_res].vv[2] == 1) + { + byte crypted = br.ReadByte(); + uint mask = 0x80; + do + { + uint value = (crypted & mask); + + // double-NOT the value + if (value != 0) value = 1; + if (value == 1) value = 0; + + int bit = (int)value; + mask >>= 1; + + cvalue = (uint)table2[cvalue].vv[4 + bit]; + + if (mask != 0) + { + crypted = br.ReadByte(); + mask = 0x80; + } + } + while(table2[cvalue].vv[2] == 1); + } + + data1[i] = (byte)cvalue; + } + + byte[] data3 = new byte[width * height * 4]; + byte[] psrc = data1; + byte[] pdst = data3; + bool type = false; + + int psrci = 0, pdsti = 0; + while (psrci < data1Length) + { + int len = (int)readVariable(psrc); + if (type) + { + for(int i = 0; i < len; i++) + { + pdst[i] = 0; + } + } + else + { + for(int i = 0; i < len; i++) + { + pdst[i] = psrc[i]; + } + psrci += len; + } + pdsti += len; + type = !type; + } + data1 = null; + #endregion + + uint[] data = new uint[width * height]; + int datai = 0; + uint c = 0; + + for (int x = 0; x < width; x++) + { + c = color_add(c, extract(data3, bitsPerPixel)); + data[datai] = c; + datai++; + } + for (int y = 1; y < height; y++) + { + c = color_add((data[datai - width]), extract(data3, bitsPerPixel)); + data[datai] = c; + datai++; + + for (int x = 1;x < width;x++) + { + uint moy = color_avg(c, (data[datai - width])); + c = color_add(moy, extract(data3, bitsPerPixel)); + data[datai] = c; + datai++; + } + } + data3 = null; + + byte[] pixels = new byte[width * height * 4]; + + int pxi = 0; + for(int px = 0; px < (width * height); px++) + { + byte r = 0, g = 0, b = 0, a = 0; + if (bitsPerPixel == 32) + { + a = (byte)((data[px] >> 24) & 0xFF); + r = (byte)((data[px] >> 16) & 0xFF); + g = (byte)((data[px] >> 8) & 0xFF); + b = (byte)(data[px] & 0xFF); + } + else + { + b = (byte)((data[px] >> 16) & 0xFF); + g = (byte)((data[px] >> 8) & 0xFF); + r = (byte)(data[px] & 0xFF); + a = (byte)(0xFF); + } + + pixels[pxi] = r; + pixels[pxi + 1] = g; + pixels[pxi + 2] = b; + pixels[pxi + 3] = a; + pxi += 4; + } + data = null; + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/Internal/NodeCBG.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/Internal/NodeCBG.cs new file mode 100644 index 00000000..a76abfbd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/CompressedBG/Internal/NodeCBG.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.CompressedBG.Internal +{ + internal struct NodeCBG + { + public int[/*6*/] vv; + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMDataFormat.cs new file mode 100644 index 00000000..e6e0c8b6 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMDataFormat.cs @@ -0,0 +1,358 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/19/2013 + * Time: 2:43 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Collections.Generic; + +using UniversalEditor.ObjectModels.Multimedia.Picture; +using UniversalEditor.ObjectModels.Multimedia.Palette; +using UniversalEditor.IO; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GIM +{ + /// + /// Description of GIMDataFormat. + /// + public class GIMDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + _dfr.Sources.Add("http://pspdum.my.land.to/psp/gim.html"); + + _dfr.ExportOptions.Add(new CustomOptionChoice("Endianness", "&Endianness:", true, + new CustomOptionFieldChoice("Big-Endian", IO.Endianness.BigEndian), + new CustomOptionFieldChoice("Little-Endian", IO.Endianness.LittleEndian, true) + )); + + _dfr.ExportOptions.Add(new CustomOptionChoice("ImageFormat", "&Image format:", true, + new CustomOptionFieldChoice("Indexed (4-bit)", GIMImageFormat.Index4), + new CustomOptionFieldChoice("Indexed (8-bit)", GIMImageFormat.Index8), + new CustomOptionFieldChoice("Indexed (16-bit)", GIMImageFormat.Index16), + new CustomOptionFieldChoice("Indexed (32-bit)", GIMImageFormat.Index32), + new CustomOptionFieldChoice("Bitmap (R4-G4-B4-A4)", GIMImageFormat.RGBA4444), + new CustomOptionFieldChoice("Bitmap (R5-G5-B5-A1)", GIMImageFormat.RGBA5551), + new CustomOptionFieldChoice("Bitmap (R5-G6-B5-A0)", GIMImageFormat.RGBA5650), + new CustomOptionFieldChoice("Bitmap (R8-G8-B8-A8)", GIMImageFormat.RGBA8888, true) + )); + _dfr.ExportOptions.Add(new CustomOptionChoice("PaletteFormat", "&Palette format:", true, + new CustomOptionFieldChoice("Bitmap (R4-G4-B4-A4)", GIMPaletteFormat.RGBA4444), + new CustomOptionFieldChoice("Bitmap (R5-G5-B5-A1)", GIMPaletteFormat.RGBA5551), + new CustomOptionFieldChoice("Bitmap (R5-G6-B5-A0)", GIMPaletteFormat.RGBA5650), + new CustomOptionFieldChoice("Bitmap (R8-G8-B8-A8)", GIMPaletteFormat.RGBA8888, true) + )); + _dfr.ExportOptions.Add(new CustomOptionChoice("PixelOrder", "Pixel &order:", true, + new CustomOptionFieldChoice("Normal", GIMPixelOrder.Normal, true), + new CustomOptionFieldChoice("Faster", GIMPixelOrder.Faster) + )); + + _dfr.ExportOptions.Add(new CustomOptionText("OriginalFileName", "Original &filename:")); + _dfr.ExportOptions.Add(new CustomOptionText("CreationUserName", "Creation &user:")); + _dfr.ExportOptions.Add(new CustomOptionText("CreationApplication", "&Application name:", "Universal Editor")); + } + return _dfr; + } + + private IO.Endianness mvarEndianness = IO.Endianness.LittleEndian; + public IO.Endianness Endianness { get { return mvarEndianness; } set { mvarEndianness = value; } } + + private GIMImageFormat mvarImageFormat = GIMImageFormat.RGBA8888; + public GIMImageFormat ImageFormat { get { return mvarImageFormat; } set { mvarImageFormat = value; } } + private GIMPaletteFormat mvarPaletteFormat = GIMPaletteFormat.RGBA8888; + public GIMPaletteFormat PaletteFormat { get { return mvarPaletteFormat; } set { mvarPaletteFormat = value; } } + + private GIMPixelOrder mvarPixelOrder = GIMPixelOrder.Normal; + public GIMPixelOrder PixelOrder { get { return mvarPixelOrder; } set { mvarPixelOrder = value; } } + + private string mvarOriginalFileName = String.Empty; + public string OriginalFileName { get { return mvarOriginalFileName; } set { mvarOriginalFileName = value; } } + private string mvarCreationUserName = String.Empty; + public string CreationUserName { get { return mvarCreationUserName; } set { mvarCreationUserName = value; } } + private string mvarCreationApplication = String.Empty; + public string CreationApplication { get { return mvarCreationApplication; } set { mvarCreationApplication = value; } } + + private PaletteObjectModel mvarPalette = new PaletteObjectModel(); + public PaletteObjectModel Palette { get { return mvarPalette; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.Reader br = base.Accessor.Reader; + br.Accessor.Position = 0; + + string signature = br.ReadFixedLengthString(4); + if (signature == ".GIM") + { + br.Endianness = IO.Endianness.BigEndian; + } + else if (signature == "MIG.") + { + + } + else + { + throw new InvalidDataFormatException("File does not begin with \"MIG.\" or \".GIM\""); + } + + string version = br.ReadFixedLengthString(4); + string format = br.ReadFixedLengthString(4); + uint nul = br.ReadUInt32(); + + if (!(format.EndsWith("\0") && nul == 0)) + { + // back up? + br.Accessor.Position += 42; // (45) - 4 bytes for UInt32 and 1 byte for the end of Format + } + + List pixelColorIndices = new List(); + + while (!br.EndOfStream) + { + GIMPartType partType = (GIMPartType)br.ReadInt16(); + short partUnknown1 = br.ReadInt16(); + uint address = br.ReadUInt32(); + uint partSize = br.ReadUInt32(); + uint partUnknown2 = br.ReadUInt32(); // 16? + + uint realPartSize = partSize - 16; + long pos = br.Accessor.Position; + + switch (partType) + { + case GIMPartType.EndOfFileAddress: + { + // address field contains the end-of-file address + break; + } + case GIMPartType.FileInfoAddress: + { + // address field contains the file info address + break; + } + case GIMPartType.ImageData: + { + ushort dataOffset = br.ReadUInt16(); + ushort unknown1 = br.ReadUInt16(); + + mvarImageFormat = (GIMImageFormat)br.ReadUInt16(); + mvarPixelOrder = (GIMPixelOrder)br.ReadUInt16(); + + ushort visibleWidth = br.ReadUInt16(); + ushort visibleHeight = br.ReadUInt16(); + pic.Width = visibleWidth; + pic.Height = visibleHeight; + + ushort colorDepth = br.ReadUInt16(); + + ushort unknown2 = br.ReadUInt16(); + ushort unknown3 = br.ReadUInt16(); + ushort unknown4 = br.ReadUInt16(); + uint unknown5 = br.ReadUInt32(); + uint unknown6 = br.ReadUInt32(); + uint unknown7 = br.ReadUInt32(); + uint partSizeMinus16 = br.ReadUInt32(); + uint unknown8 = br.ReadUInt32(); + ushort unknown9 = br.ReadUInt16(); // 1 + ushort unknown10 = br.ReadUInt16(); // 1 + ushort unknown11 = br.ReadUInt16(); // 3 + ushort unknown12 = br.ReadUInt16(); // 1 + uint unknown13 = br.ReadUInt16(); // 0x40 + byte[] unknown14 = br.ReadBytes(12); + + switch (mvarPixelOrder) + { + case GIMPixelOrder.Normal: + { + byte nextByte = 0; + bool useNextByte = false; + + for (ushort x = 0; x < visibleWidth; x++) + { + for (ushort y = 0; y < visibleHeight; y++) + { + switch (mvarImageFormat) + { + case GIMImageFormat.RGBA5650: + { + Color color = br.ReadColorRGBA5650(); + pic.SetPixel(color, x, y); + break; + } + case GIMImageFormat.RGBA5551: + { + Color color = br.ReadColorRGBA5551(); + pic.SetPixel(color, x, y); + break; + } + case GIMImageFormat.RGBA4444: + { + Color color = br.ReadColorRGBA4444(); + pic.SetPixel(color, x, y); + break; + } + case GIMImageFormat.RGBA8888: + { + Color color = br.ReadColorRGBA8888(); + pic.SetPixel(color, x, y); + break; + } + case GIMImageFormat.Index4: + { + int paletteIndex = 0; + if (useNextByte) + { + paletteIndex = nextByte.GetBits(4, 4); + useNextByte = false; + } + else + { + nextByte = br.ReadByte(); + useNextByte = true; + paletteIndex = nextByte.GetBits(0, 4); + } + + Color color = mvarPalette.Entries[paletteIndex].Color; + pic.SetPixel(color, x, y); + break; + } + case GIMImageFormat.Index8: + { + int paletteIndex = (int)br.ReadByte(); + pixelColorIndices.Add(paletteIndex); + break; + } + case GIMImageFormat.Index16: + { + int paletteIndex = (int)br.ReadInt16(); + pixelColorIndices.Add(paletteIndex); + break; + } + case GIMImageFormat.Index32: + { + int paletteIndex = br.ReadInt32(); + pixelColorIndices.Add(paletteIndex); + break; + } + } + } + } + break; + } + } + break; + } + case GIMPartType.PaletteData: + { + ushort dataOffset = br.ReadUInt16(); + ushort nul1 = br.ReadUInt16(); + mvarPaletteFormat = (GIMPaletteFormat)br.ReadUInt16(); + ushort nul2 = br.ReadUInt16(); + ushort paletteColorCount = br.ReadUInt16(); + + byte[] unknown3 = br.ReadBytes(16); + uint unknown6 = br.ReadUInt32(); + uint unknown7 = br.ReadUInt32(); + + uint partSizeMinus16 = br.ReadUInt32(); + uint unknown8 = br.ReadUInt32(); + ushort unknown9 = br.ReadUInt16(); + ushort unknown10 = br.ReadUInt16(); + ushort unknown11 = br.ReadUInt16(); + ushort unknown12 = br.ReadUInt16(); + + uint unknown13 = br.ReadUInt32(); + + // documentation says read 12 bytes here, but that extra 2 bytes is what was messing + // us up, so we really should only read 10 bytes here!!! + byte[] unknown14 = br.ReadBytes(10); + + // palette data(16色なら16x4=64B、256色なら256x4=1024B) + // GIM用のパレットのデータはR,G,B,Aの4バイト×色数と並んでいる。 + // BMP用のパレットのデータはB,G,R,Aの順なのでR,Bの値の入れ替えが必要。 + + // palette data (if 256 color 256x4 = 1024B, if 16 color 16x4 = 64B) + // Data Palette for GIM is aligned with 4 bytes × number of colors R, G, B, and A. + // Require replacement of the values ​​of R, and B data of the palette of BMP for so order B, G, R, of A. + for (ushort i = 0; i < paletteColorCount; i++) + { + switch (mvarPaletteFormat) + { + case GIMPaletteFormat.RGBA5650: + { + Color color = br.ReadColorRGBA5650(); + mvarPalette.Entries.Add(color); + break; + } + case GIMPaletteFormat.RGBA5551: + { + // 5 bits R, 5 bits G, 5 bits B, 1 bits alpha + Color color = br.ReadColorRGBA5551(); + mvarPalette.Entries.Add(color); + break; + } + case GIMPaletteFormat.RGBA4444: + { + Color color = br.ReadColorRGBA4444(); + mvarPalette.Entries.Add(color); + break; + } + case GIMPaletteFormat.RGBA8888: + { + Color color = br.ReadColorRGBA8888(); + mvarPalette.Entries.Add(color); + break; + } + } + } + break; + } + case GIMPartType.FileInfoData: + { + mvarOriginalFileName = br.ReadNullTerminatedString(); + mvarCreationUserName = br.ReadNullTerminatedString(); + string timestamp = br.ReadNullTerminatedString(); + mvarCreationApplication = br.ReadNullTerminatedString(); + break; + } + } + + long bytesReadSoFar = br.Accessor.Position - pos; + long bytesRemaining = realPartSize - bytesReadSoFar; + br.Accessor.Seek(bytesRemaining, SeekOrigin.Current); + } + + foreach (int index in pixelColorIndices) + { + Color color = mvarPalette.Entries[index].Color; + pic.SetPixel(color); + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + IO.Writer bw = base.Accessor.Writer; + bw.Endianness = mvarEndianness; + switch (mvarEndianness) + { + case IO.Endianness.BigEndian: + { + bw.WriteFixedLengthString(".GIM1.00\0PSP"); + break; + } + case IO.Endianness.LittleEndian: + { + bw.WriteFixedLengthString("MIG.00.1PSP\0"); + break; + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMImageFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMImageFormat.cs new file mode 100644 index 00000000..1171430c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMImageFormat.cs @@ -0,0 +1,55 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/19/2013 + * Time: 5:12 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GIM +{ + /// + /// Description of GIMImageFormat. + /// + public enum GIMImageFormat + { + /// + /// Pixels are comprised of 5 bits Red, 6 bits Green, 5 bits Blue, 0 bits + /// Alpha. + /// + RGBA5650 = 0x00, + /// + /// Pixels are comprised of 5 bits Red, 5 bits Green, 5 bits Blue, 1 bit + /// Alpha. + /// + RGBA5551 = 0x01, + /// + /// Pixels are comprised of 4 bits Red, 4 bits Green, 4 bits Blue, 4 bits + /// Alpha. + /// + RGBA4444 = 0x02, + /// + /// Pixels are comprised of 8 bits Red, 8 bits Green, 8 bits Blue, 8 bits + /// Alpha. + /// + RGBA8888 = 0x03, + /// + /// Pixels are comprised of 4-bit indices into the palette color table. + /// + Index4 = 0x04, + /// + /// Pixels are comprised of 8-bit indices into the palette color table. + /// + Index8 = 0x05, + /// + /// Pixels are comprised of 16-bit indices into the palette color table. + /// + Index16 = 0x06, + /// + /// Pixels are comprised of 32-bit indices into the palette color table. + /// + Index32 = 0x07 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPaletteFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPaletteFormat.cs new file mode 100644 index 00000000..d80229d1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPaletteFormat.cs @@ -0,0 +1,35 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/19/2013 + * Time: 4:41 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GIM +{ + /// + /// Description of GIMPaletteFormat. + /// + public enum GIMPaletteFormat + { + /// + /// 5 bits Red, 6 bits Green, 5 bits Red, 0 bits Alpha + /// + RGBA5650 = 0x00, + /// + /// 5 bits Red, 5 bits Green, 5 bits Red, 1 bit Alpha + /// + RGBA5551 = 0x01, + /// + /// 4 bits Red, 4 bits Green, 4 bits Red, 4 bits Alpha + /// + RGBA4444 = 0x02, + /// + /// 8 bits Red, 8 bits Green, 8 bits Red, 8 bits Alpha + /// + RGBA8888 = 0x03 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPartType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPartType.cs new file mode 100644 index 00000000..1cb2e01d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPartType.cs @@ -0,0 +1,24 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/19/2013 + * Time: 4:23 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GIM +{ + /// + /// Description of GIMPartType. + /// + public enum GIMPartType + { + EndOfFileAddress = 0x02, + FileInfoAddress = 0x03, + ImageData = 0x04, + PaletteData = 0x05, + FileInfoData = 0xFF + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPixelOrder.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPixelOrder.cs new file mode 100644 index 00000000..c45738f7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMPixelOrder.cs @@ -0,0 +1,25 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/19/2013 + * Time: 5:15 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GIM +{ + /// + /// Description of GIMPixelOrder. + /// + public enum GIMPixelOrder + { + Normal = 0x00, + /// + /// PSP fast pixel storage format [16x8 block relocation] + /// PSP高速ピクセル格納形式 [16x8ブロック再配置] + /// + Faster = 0x01 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMSwizzleEncoder.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMSwizzleEncoder.cs new file mode 100644 index 00000000..ba1df978 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GIM/GIMSwizzleEncoder.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GIM +{ + public class GIMSwizzleEncoder + { + // Swizzle a GIM image + public static void Encode(ref byte[] Buf, int Pointer, int Width, int Height) + { + // Make a copy of the unswizzled input + byte[] UnSwizzled = new byte[Buf.Length - Pointer]; + Array.Copy(Buf, Pointer, UnSwizzled, 0, UnSwizzled.Length); + + int rowblocks = (Width / 16); + + for (int y = 0; y < Height; y++) + { + for (int x = 0; x < Width; x++) + { + int blockx = x / 16; + int blocky = y / 8; + + int block_index = blockx + ((blocky) * rowblocks); + int block_address = block_index * 16 * 8; + + Buf[Pointer + block_address + (x - blockx * 16) + ((y - blocky * 8) * 16)] = UnSwizzled[x + (y * Width)]; + } + } + } + + // Unswizzle a GIM image + public static void Decode(ref byte[] Buf, int Pointer, int Width, int Height) + { + // Make a copy of the unswizzled input + byte[] Swizzled = new byte[Buf.Length - Pointer]; + Array.Copy(Buf, Pointer, Swizzled, 0, Swizzled.Length); + + int rowblocks = (Width / 16); + + for (int y = 0; y < Height; y++) + { + for (int x = 0; x < Width; x++) + { + int blockx = x / 16; + int blocky = y / 8; + + int block_index = blockx + (blocky * rowblocks); + int block_address = block_index * 16 * 8; + + Buf[Pointer + x + (y * Width)] = Swizzled[block_address + (x - blockx * 16) + ((y - blocky * 8) * 16)]; + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs new file mode 100644 index 00000000..ce9b91ec --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.ObjectModels.Multimedia.Picture; +namespace UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange +{ + public class GraphicsInterchangeDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlockCollection mvarExtensions = new GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlockCollection(); + public GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlockCollection Extensions + { + get { return mvarExtensions; } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + string magic = br.ReadFixedLengthString(6); + if (!(magic == "GIF87a" || magic == "GIF89a")) throw new InvalidDataFormatException("File does not begin with \"GIF87a\" or \"GIF89a\""); + + List palette = new List(); + + #region Logical Screen Descriptor + short logicalWidth = br.ReadInt16(); + short logicalHeight = br.ReadInt16(); + byte gct = br.ReadByte(); + byte backgroundColorPaletteID = br.ReadByte(); + byte defaultPixelAspectRatio = br.ReadByte(); + + int maxColors = gct + 9; + for (int i = 0; i < maxColors; i++) + { + byte r = br.ReadByte(); + byte g = br.ReadByte(); + byte b = br.ReadByte(); + palette.Add(Color.FromRGBA(r, g, b)); + } + #endregion + + while (!br.EndOfStream) + { + byte sentinel = br.ReadByte(); + switch (sentinel) + { + case 0x2C: // ',' image + break; + case 0x21: // '!' extension + GraphicsInterchangeExtensionBlock extension = new GraphicsInterchangeExtensionBlock(); + extension.ID = br.ReadByte(); + + // The linked lists used by the image data and the extension blocks consist of series + // of sub-blocks, each sub-block beginning with a byte giving the number of subsequent + // data bytes in the sub-block (1 to 255). The series of sub-blocks is terminated by + // an empty sub-block (a 0 byte). + while (!br.EndOfStream) + { + byte extSize = br.ReadByte(); + if (extSize == 0) break; + + byte[] extData = br.ReadBytes(extSize); + extension.DataBlocks.Add(extData); + } + + mvarExtensions.Add(extension); + break; + case 0x3B: // ';' end of file + return; + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs new file mode 100644 index 00000000..fff2f576 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.GraphicsInterchange +{ + public class GraphicsInterchangeExtensionBlock + { + public class GraphicsInterchangeExtensionBlockCollection + : System.Collections.ObjectModel.Collection + { + public GraphicsInterchangeExtensionBlock Add(byte id, params byte[][] dataBlocks) + { + GraphicsInterchangeExtensionBlock block = new GraphicsInterchangeExtensionBlock(); + block.ID = id; + foreach (byte[] dataBlock in dataBlocks) + { + block.DataBlocks.Add(dataBlock); + } + base.Add(block); + return block; + } + + private Dictionary blocksById = new Dictionary(); + protected override void InsertItem(int index, GraphicsInterchangeExtensionBlock item) + { + blocksById.Add(item.ID, item); + base.InsertItem(index, item); + } + protected override void RemoveItem(int index) + { + if (blocksById.ContainsKey(this[index].ID)) + { + blocksById.Remove(this[index].ID); + } + base.RemoveItem(index); + } + + public GraphicsInterchangeExtensionBlock this[byte id] + { + get + { + if (blocksById.ContainsKey(id)) + { + return blocksById[id]; + } + return null; + } + } + public bool Contains(byte id) + { + return blocksById.ContainsKey(id); + } + public bool Remove(byte id) + { + if (!blocksById.ContainsKey(id)) + { + return false; + } + + this.Remove(blocksById[id]); + return true; + } + } + + private byte mvarID = 0; + public byte ID { get { return mvarID; } set { mvarID = value; } } + + private List mvarDataBlocks = new List(); + public List DataBlocks { get { return mvarDataBlocks; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchangeDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchangeDataFormat.cs new file mode 100644 index 00000000..a8ba84b7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/GraphicsInterchangeDataFormat.cs @@ -0,0 +1,24 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class GraphicsInterchangeDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("CompuServe Graphics Interchange Format", new byte?[][] { new byte?[] { new byte?(71), new byte?(105), new byte?(102), new byte?(56), new byte?(57), new byte?(97) } }, new string[] { "*.gif" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/I16/I16DataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/I16/I16DataFormat.cs new file mode 100644 index 00000000..cedb0147 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/I16/I16DataFormat.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.I16 +{ + public class I16DataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + IO.Reader br = base.Accessor.Reader; + ushort u1 = br.ReadUInt16(); + ushort u2 = br.ReadUInt16(); + ushort u3 = br.ReadUInt16(); + ushort u4 = br.ReadUInt16(); + + byte u = br.ReadByte(); + + int size = (int)((double)br.Accessor.Length / 8); + pic.Width = size; + pic.Height = size; + + while (!br.EndOfStream) + { + byte r = br.ReadByte(); + byte g = br.ReadByte(); + byte b = br.ReadByte(); + byte a = br.ReadByte(); + + Color color = Color.FromRGBA(a, r, g, b); + pic.SetPixel(color); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ICODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ICODataFormat.cs new file mode 100644 index 00000000..107518d0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/ICODataFormat.cs @@ -0,0 +1,24 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class ICODataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Windows icon", new byte?[][] { new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(1) } }, new string[] { "*.ico" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/GroupICODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/GroupICODataFormat.cs new file mode 100644 index 00000000..c9a28f78 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/GroupICODataFormat.cs @@ -0,0 +1,67 @@ +using System; + +using UniversalEditor.ObjectModels.Multimedia.Picture; +using UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Bitmap; + +using UniversalEditor.ObjectModels.Multimedia.Picture.Collection; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Icon.Microsoft +{ + public class GroupICODataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureCollectionObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + + // An Icon file, which usually has the ICO extension, contains one icon resource. Given that + // an icon resource can contain multiple images, it is no surprise that the file begins with + // an icon directory: + byte u = br.ReadByte(); + + short idReserved = br.ReadInt16(); // Reserved (must be 0) + short idType = br.ReadInt16(); // Resource Type (1 for icons) + short idCount = br.ReadInt16(); // How many images? + + for (short i = 0; i < idCount; i++) + { + // The idCount member indicates how many images are present in the icon resource. The size + // of the idEntries array is determined by idCount. There exists one ICONDIRENTRY for each + // icon image in the file, providing details about its location in the file, size and color + // depth. The ICONDIRENTRY structure is defined as: + + byte bWidth = br.ReadByte(); // Width, in pixels, of the image + byte bHeight = br.ReadByte(); // Height, in pixels, of the image + byte bColorCount = br.ReadByte(); // Number of colors in image (0 if >=8bpp) + byte bReserved = br.ReadByte(); // Reserved ( must be 0) + short wPlanes = br.ReadInt16(); // Color Planes + short wBitCount = br.ReadInt16(); // Bits per pixel + int dwBytesInRes = br.ReadInt32(); // How many bytes in this resource? + int dwImageOffset = br.ReadInt32(); // Where in the file is this image? + + // The dwBytesInRes member indicates the size of the image data. This image data can be found + // dwImageOffset bytes from the beginning of the file, and is stored in the following format: + BitmapInfoHeader icHeader = BitmapInfoHeader.Load(br); // DIB header + + // RGBQUAD icColors[1]; // Color table + // BYTE icXOR[1]; // DIB bits for XOR mask + // BYTE icAND[1]; // DIB bits for AND mask + } + + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/ICODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/ICODataFormat.cs new file mode 100644 index 00000000..cd636395 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Icon/Microsoft/ICODataFormat.cs @@ -0,0 +1,58 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Picture; +using UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Bitmap; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Icon.Microsoft +{ + public class ICODataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + + // An Icon file, which usually has the ICO extension, contains one icon resource. Given that + // an icon resource can contain multiple images, it is no surprise that the file begins with + // an icon directory: + short idReserved = br.ReadInt16(); // Reserved (must be 0) + short idType = br.ReadInt16(); // Resource Type (1 for icons) + short idCount = br.ReadInt16(); // How many images? + + for (short i = 0; i < idCount; i++) + { + // The idCount member indicates how many images are present in the icon resource. The size + // of the idEntries array is determined by idCount. There exists one ICONDIRENTRY for each + // icon image in the file, providing details about its location in the file, size and color + // depth. The ICONDIRENTRY structure is defined as: + + byte bWidth = br.ReadByte(); // Width, in pixels, of the image + byte bHeight = br.ReadByte(); // Height, in pixels, of the image + byte bColorCount = br.ReadByte(); // Number of colors in image (0 if >=8bpp) + byte bReserved = br.ReadByte(); // Reserved ( must be 0) + short wPlanes = br.ReadInt16(); // Color Planes + short wBitCount = br.ReadInt16(); // Bits per pixel + int dwBytesInRes = br.ReadInt32(); // How many bytes in this resource? + int dwImageOffset = br.ReadInt32(); // Where in the file is this image? + + // The dwBytesInRes member indicates the size of the image data. This image data can be found + // dwImageOffset bytes from the beginning of the file, and is stored in the following format: + BitmapInfoHeader icHeader = BitmapInfoHeader.Load(br); // DIB header + + // RGBQUAD icColors[1]; // Color table + // BYTE icXOR[1]; // DIB bits for XOR mask + // BYTE icAND[1]; // DIB bits for AND mask + } + + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGDataFormat.cs new file mode 100644 index 00000000..580af7d1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGDataFormat.cs @@ -0,0 +1,186 @@ +using System; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.JPEG +{ + /// + /// Joint Photographic Experts Group image + /// + public class JPEGDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + br.Endianness = IO.Endianness.BigEndian; + + while (!br.EndOfStream) + { + JPEGMarker marker = (JPEGMarker)br.ReadUInt16(); + switch (marker) + { + case JPEGMarker.StartOfImage: + { + // SOI - Start of Image + break; + } + case JPEGMarker.EndOfImage: + { + // EOI - End of Image + + break; + } + case JPEGMarker.StartOfScan: + { + ushort length = br.ReadUInt16(); // = 6 + (2 * numComponentsInScan) + byte numComponentsInScan = br.ReadByte(); + for (byte i = 0; i < numComponentsInScan; i++) + { + // for each component, read two bytes + byte componentID = br.ReadByte(); // 1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q + byte huffmanTable = br.ReadByte(); // bit 0-3: AC table, bit 4-7: DC table + } + break; + } + case JPEGMarker.StartOfFrameBaseline: + { + // SOF0 - Start of Frame (Baseline DCT (discrete cosine transform)) + ushort length = br.ReadUInt16(); + byte dataPrecision = br.ReadByte(); + ushort imageHeight = br.ReadUInt16(); + ushort imageWidth = br.ReadUInt16(); + + // Number of components. Usually 1 = grayscale, 3 = YcBCr or YIQ, 4 = CMYK + byte componentCount = br.ReadByte(); + for (byte i = 0; i < componentCount; i++) + { + // Component type. 1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q + byte componentType = br.ReadByte(); + // bit 0-3 vertical, 4-7 horizontal + byte samplingFactors = br.ReadByte(); + byte quantizationTableNumber = br.ReadByte(); + } + break; + } + case JPEGMarker.DefineQuantizationTables: + { + // DQT - Define Quantization Tables + ushort length = br.ReadUInt16(); + byte precisionAndTableID = br.ReadByte(); + + byte[] quantizationTable = new byte[64]; + for (int i = 0; i < 64; i++) + { + quantizationTable[i] = br.ReadByte(); + } + break; + } + case JPEGMarker.DefineHuffmanTables: + { + ushort length = br.ReadUInt16(); + + // bit 0-3: number of huffman tables + // bit 4: type of huffman table (0 = DC, 1 = AC) + // bit 5-7: not used, must be 0 + byte htInfo = br.ReadByte(); + + byte nSymbols = 0; + byte[] nSymbols1 = br.ReadBytes(16); + for (int i = 0; i < nSymbols1.Length; i++) + { + nSymbols += (byte)(nSymbols1[i]); + } + + byte[] symbols = br.ReadBytes(nSymbols); + break; + } + case JPEGMarker.Application0: + case JPEGMarker.Application1: + case JPEGMarker.Application2: + case JPEGMarker.Application3: + case JPEGMarker.Application4: + case JPEGMarker.Application5: + case JPEGMarker.Application6: + case JPEGMarker.Application7: + case JPEGMarker.Application8: + case JPEGMarker.Application9: + case JPEGMarker.ApplicationA: + case JPEGMarker.ApplicationB: + case JPEGMarker.ApplicationC: + case JPEGMarker.ApplicationD: + case JPEGMarker.ApplicationE: + case JPEGMarker.ApplicationF: + { + ushort length = br.ReadUInt16(); + length -= 2; + string chunkID = br.ReadNullTerminatedString(); + + length -= (ushort)(chunkID.Length + 1); + byte[] chunkData = br.ReadBytes(length); + IO.Reader appbr = new IO.Reader(new MemoryAccessor(chunkData)); + // System.IO.File.WriteAllBytes(@"C:\Applications\MikuMikuDance\UserFile\Model\kio\Luka110320\pony01s_exifchunk.dat", chunkData); + switch (marker) + { + case JPEGMarker.Application0: + { + byte versionMajor = appbr.ReadByte(); + byte versionMinor = appbr.ReadByte(); + + byte densityUnits = appbr.ReadByte(); + // 0 - No units, aspect ratio only specified + // 1 - Pixels per inch + // 2 - Pixels per centimetre + + ushort horizontalPixelDensity = appbr.ReadUInt16(); + ushort verticalPixelDensity = appbr.ReadUInt16(); + + byte thumbnailWidth = appbr.ReadByte(); + byte thumbnailHeight = appbr.ReadByte(); + + int thumbnailDataSize = (thumbnailWidth * thumbnailHeight); + byte[] thumbnailData = appbr.ReadBytes(thumbnailDataSize); + break; + } + case JPEGMarker.Application1: + { + switch (chunkID) + { + case "Exif": + { + + break; + } + } + break; + } + case JPEGMarker.ApplicationD: + { + switch (chunkID) + { + case "Photoshop 3.0": + { + + break; + } + } + break; + } + } + break; + } + } + } + + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGMarker.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGMarker.cs new file mode 100644 index 00000000..a444716b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEG/JPEGMarker.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.JPEG +{ + /// + /// + /// + public enum JPEGMarker + { + /// + /// SOI - Start of Image. + /// + StartOfImage = 0xFFD8, + /// + /// SOF0 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline = 0xFFC0, + /// + /// SOF1 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline1 = 0xFFC1, + /// + /// SOF2 - Start Of Frame (Progressive DCT). Indicates that this is a progressive DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameProgressive = 0xFFC2, + /// + /// SOF3 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline3 = 0xFFC3, + /// + /// DHT - Define Huffman Table(s). Specifies one or more Huffman tables. + /// + DefineHuffmanTables = 0xFFC4, + /// + /// SOF5 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline5 = 0xFFC5, + /// + /// SOF6 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline6 = 0xFFC6, + /// + /// SOF7 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline7 = 0xFFC7, + /// + /// SOF9 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline9 = 0xFFC9, + /// + /// SOFA - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline10 = 0xFFCA, + /// + /// SOFB - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline11 = 0xFFCB, + /// + /// SOFD - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline13 = 0xFFCD, + /// + /// SOFE - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline14 = 0xFFCE, + /// + /// SOFF - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline15 = 0xFFCF, + /// + /// DQT - Define Quantization Table(s). Specifies one or more quantization tables. + /// + DefineQuantizationTables = 0xFFDB, + /// + /// DRI - Define Restart Interval. Specifies the interval between RSTn markers, in macroblocks. This marker is followed by two bytes indicating the fixed size so it can be treated like any other variable size segment. + /// + DefineRestartInterval = 0xFFDD, + /// + /// SOS - Start Of Scan. Begins a top-to-bottom scan of the image. In baseline DCT JPEG images, there is generally a single scan. Progressive DCT JPEG images usually contain multiple scans. This marker specifies which slice of data it will contain, and is immediately followed by entropy-coded data. + /// + StartOfScan = 0xFFDA, + /// + /// RST0 - Restart 0. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart0 = 0xFFD0, + /// + /// RST1 - Restart 1. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart1 = 0xFFD1, + /// + /// RST2 - Restart 2. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart2 = 0xFFD2, + /// + /// RST3 - Restart 3. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart3 = 0xFFD3, + /// + /// RST4 - Restart 4. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart4 = 0xFFD4, + /// + /// RST5 - Restart 5. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart5 = 0xFFD5, + /// + /// RST6 - Restart 6. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart6 = 0xFFD6, + /// + /// RST7 - Restart 7. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart7 = 0xFFD7, + /// + /// APP0 - Application-specific 0. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application0 = 0xFFE0, + /// + /// APP1 - Application-specific 1. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application1 = 0xFFE1, + /// + /// APP2 - Application-specific 2. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application2 = 0xFFE2, + /// + /// APP3 - Application-specific 3. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application3 = 0xFFE3, + /// + /// APP4 - Application-specific 4. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application4 = 0xFFE4, + /// + /// APP5 - Application-specific 5. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application5 = 0xFFE5, + /// + /// APP6 - Application-specific 6. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application6 = 0xFFE6, + /// + /// APP7 - Application-specific 7. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application7 = 0xFFE7, + /// + /// APP8 - Application-specific 8. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application8 = 0xFFE8, + /// + /// APP9 - Application-specific 9. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application9 = 0xFFE9, + /// + /// APPA - Application-specific A. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationA = 0xFFEA, + /// + /// APPB - Application-specific B. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationB = 0xFFEB, + /// + /// APPC - Application-specific C. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationC = 0xFFEC, + /// + /// APPD - Application-specific D. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationD = 0xFFED, + /// + /// APPE - Application-specific E. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationE = 0xFFEE, + /// + /// APPF - Application-specific F. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationF = 0xFFEF, + /// + /// COM - Comment. Contains a text comment. + /// + Comment = 0xFFFE, + /// + /// EOI - End Of Image. + /// + EndOfImage = 0xFFD9, + Padding = 0xFFFF + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEGDataFormat.cs new file mode 100644 index 00000000..b6697112 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/JPEGDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class JPEGDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Joint Photographic Experts Group image", new string[] { "*.jpg", "*.jpe", "*.jpeg" } ); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/LEAD/CMPDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/LEAD/CMPDataFormat.cs new file mode 100644 index 00000000..6e167791 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/LEAD/CMPDataFormat.cs @@ -0,0 +1,61 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/12/2013 + * Time: 4:46 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.LEAD +{ + /// + /// Description of CMPDataFormat. + /// + public class CMPDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + IO.Reader br = base.Accessor.Reader; + string LEAD = br.ReadFixedLengthString(4); + if (LEAD != "LEAD") throw new InvalidDataFormatException("File does not begin with \"LEAD\""); + + ushort unknown1 = br.ReadUInt16(); + ushort unknown2 = br.ReadUInt16(); + ushort unknown3 = br.ReadUInt16(); + ushort unknown4 = br.ReadUInt16(); + ushort unknown5 = br.ReadUInt16(); + ushort unknown6 = br.ReadUInt16(); + + pic.Width = br.ReadUInt16(); + pic.Height = br.ReadUInt16(); + + ushort unknown9 = br.ReadUInt16(); + ushort unknown10 = br.ReadUInt16(); + + // starts the compressed data + byte[] compressedData = br.ReadToEnd(); + byte[] decompressedData = null; // UniversalEditor.Compression.CompressionStream.Decompress(UniversalEditor.Compression.CompressionMethod.Deflate, compressedData); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapBitsPerPixel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapBitsPerPixel.cs new file mode 100644 index 00000000..3b3c0e2f --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapBitsPerPixel.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Bitmap +{ + public enum BitmapBitsPerPixel : short + { + /// + /// The number of bits-per-pixel is specified or is implied by the JPEG or PNG format. + /// + Implied = 0, + /// + /// The bitmap is monochrome, and the bmiColors member of BITMAPINFO contains two entries. Each bit + /// in the bitmap array represents a pixel. If the bit is clear, the pixel is displayed with the + /// color of the first entry in the bmiColors table; if the bit is set, the pixel has the color of + /// the second entry in the table. + /// + Monochrome = 1, + /// + /// The bitmap has a maximum of 16 colors, and the bmiColors member of BITMAPINFO contains up to 16 + /// entries. Each pixel in the bitmap is represented by a 4-bit index into the color table. For + /// example, if the first byte in the bitmap is 0x1F, the byte represents two pixels. The first pixel + /// contains the color in the second table entry, and the second pixel contains the color in the + /// sixteenth table entry. + /// + Color16 = 4, + /// + /// The bitmap has a maximum of 256 colors, and the bmiColors member of BITMAPINFO contains up to 256 + /// entries. In this case, each byte in the array represents a single pixel. + /// + Color256 = 8, + /// + /// + /// The bitmap has a maximum of 2^16 colors. If the biCompression member of the BITMAPINFOHEADER is + /// BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each WORD in the bitmap array represents a + /// single pixel. The relative intensities of red, green, and blue are represented with five bits for + /// each color component. The value for blue is in the least significant five bits, followed by five + /// bits each for green and red. The most significant bit is not used. The bmiColors color table is + /// used for optimizing colors used on palette-based devices, and must contain the number of entries + /// specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + /// + /// If the biCompression member of the BITMAPINFOHEADER is BI_BITFIELDS, the bmiColors member + /// contains three DWORD color masks that specify the red, green, and blue components, respectively, + /// of each pixel. Each WORD in the bitmap array represents a single pixel. + /// + /// + /// When the biCompression member is BI_BITFIELDS, bits set in each DWORD mask must be contiguous + /// and should not overlap the bits of another mask. All the bits in the pixel do not have to be + /// used. + /// + /// + HighColor = 16, + /// + /// The bitmap has a maximum of 2^24 colors, and the bmiColors member of BITMAPINFO is NULL. Each 3-byte + /// triplet in the bitmap array represents the relative intensities of blue, green, and red, respectively, + /// for a pixel. The bmiColors color table is used for optimizing colors used on palette-based devices, and + /// must contain the number of entries specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + TrueColor = 24, + /// + /// The bitmap has a maximum of 2^32 colors. If the biCompression member of the BITMAPINFOHEADER is BI_RGB, + /// the bmiColors member of BITMAPINFO is NULL. Each DWORD in the bitmap array represents the relative + /// intensities of blue, green, and red for a pixel. The value for blue is in the least significant 8 bits, + /// followed by 8 bits each for green and red. The high byte in each DWORD is not used. The bmiColors color + /// table is used for optimizing colors used on palette-based devices, and must contain the number of + /// entries specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + DeepColor = 32 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapCompression.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapCompression.cs new file mode 100644 index 00000000..e76849a6 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapCompression.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Bitmap +{ + public enum BitmapCompression : int + { + /// + /// An uncompressed format. + /// + None = 0, + /// + /// A run-length encoded (RLE) format for bitmaps with 8 bpp. The compression format is a 2-byte format + /// consisting of a count byte followed by a byte containing a color index. + /// + RLE8 = 1, + /// + /// An RLE format for bitmaps with 4 bpp. The compression format is a 2-byte format consisting of a count + /// byte followed by two word-length color indexes. + /// + RLE4 = 2, + /// + /// Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks + /// that specify the red, green, and blue components, respectively, of each pixel. This is valid when used + /// with 16- and 32-bpp bitmaps. + /// + Bitfields = 3, + /// + /// Indicates that the image is a JPEG image. + /// + JPEG = 4, + /// + /// Indicates that the image is a PNG image. + /// + PNG = 5 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapDataFormat.cs new file mode 100644 index 00000000..6a19d85b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapDataFormat.cs @@ -0,0 +1,260 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Bitmap +{ + /// + /// Provides a for loading and saving Windows and OS/2 Bitmap documents. + /// Supports bitmap formats that are not natively supported by Windows. + /// + public class BitmapDataFormat : DataFormat + { + public const int BITMAP_HEADER_SIZE = (2 + 6 * 4 + 2 * 2 + 6 * 4); + public const int BITMAP_PALETTE_ENTRY_SIZE = 4; + + private BitmapBitsPerPixel mvarPixelDepth = BitmapBitsPerPixel.TrueColor; + /// + /// The number of bits-per-pixel. The biBitCount member of the BITMAPINFOHEADER structure determines the + /// number of bits that define each pixel and the maximum number of colors in the bitmap. + /// + public BitmapBitsPerPixel PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) throw new ObjectModelNotSupportedException(); + + IO.Reader br = base.Accessor.Reader; + + string signature = br.ReadFixedLengthString(2); + switch (signature) + { + case "BM": + case "BA": + case "CI": + case "CP": + case "IC": + case "PT": + { + break; + } + default: + { + throw new InvalidDataFormatException(); + } + } + + int fileSize = br.ReadInt32(); + short reserved1 = br.ReadInt16(); + short reserved2 = br.ReadInt16(); + int offset = br.ReadInt32(); + + BitmapInfoHeader header = BitmapInfoHeader.Load(br); + mvarPixelDepth = header.PixelDepth; + + pic.Width = header.Width; + pic.Height = header.Height; + + byte bitRead = 0; + int bitsRead = 0; + + List palette = new List(); + + // there is a palette + // To read the palette, we can simply read in a block of bytes + // since our array elements are guaranteed to be contiguous and in row-major order. + int paletteSize = offset - header.HeaderSize; + int numPaletteEntries = paletteSize / BITMAP_PALETTE_ENTRY_SIZE; + for (int i = 0; i < numPaletteEntries; i++) + { + byte b = br.ReadByte(); + byte g = br.ReadByte(); + byte r = br.ReadByte(); + byte a = br.ReadByte(); + palette.Add(Color.FromRGBA(r, g, b, a)); + } + + if (mvarPixelDepth == BitmapBitsPerPixel.TrueColor) + { + } + br.Accessor.Position = offset; + + // starts from bottom-left corner, goes BGR + for (int y = header.Height - 1; y >= 0; y--) + { + for (int x = 0; x < header.Width; x++) + { + byte r = 0, g = 0, b = 0, a = 255; + + switch (mvarPixelDepth) + { + case BitmapBitsPerPixel.Monochrome: + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + break; + } + case BitmapBitsPerPixel.Color16: + { + break; + } + case BitmapBitsPerPixel.Color256: + { + byte rgb = br.ReadByte(); + r = (byte)(palette[rgb].Red * 255); + g = (byte)(palette[rgb].Green * 255); + b = (byte)(palette[rgb].Blue * 255); + break; + } + case BitmapBitsPerPixel.HighColor: + { + // X1R5G5B5 + if (header.Compression == BitmapCompression.Bitfields) + { + // R5G6B5 + short value = br.ReadInt16(); + b = (byte)(8 * value.GetBits(0, 5)); + g = (byte)(8 * value.GetBits(6, 6)); + r = (byte)(8 * value.GetBits(11, 5)); + } + else + { + // X1R5G5B5 + short value = br.ReadInt16(); + int x1 = value.GetBits(16, 1); + b = (byte)(8 * value.GetBits(0, 5)); + g = (byte)(8 * value.GetBits(5, 5)); + r = (byte)(8 * value.GetBits(10, 5)); + } + break; + } + case BitmapBitsPerPixel.TrueColor: + { + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) G 72 + r = br.ReadByte(); // (2,2) R 63 + break; + } + case BitmapBitsPerPixel.DeepColor: + { + if (header.Compression == BitmapCompression.Bitfields) + { + // this is really black magic going on here. these aren't bitfields at all.. + + a = br.ReadByte(); // (2,2) R 63 + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) B 204 + r = br.ReadByte(); // (2,2) G 72 + a = 255; + } + else + { + b = br.ReadByte(); // (2,2) R 63 + g = br.ReadByte(); // (2,2) B 204 + r = br.ReadByte(); // (2,2) B 204 + a = br.ReadByte(); // (2,2) G 72 + a = 255; + } + break; + } + } + + Color color = Color.FromRGBA(r, g, b, a); + pic.SetPixel(color, x, y); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.Writer bw = base.Accessor.Writer; + + string signature = "BM"; + bw.WriteFixedLengthString(signature); + + int fileSize = 54 + (pic.Width * pic.Height * 4); + bw.WriteInt32(fileSize); + + short reserved1 = 0; + short reserved2 = 0; + bw.WriteInt16(reserved1); + bw.WriteInt16(reserved2); + + int offset = 54; + bw.WriteInt32(offset); + + BitmapInfoHeader header = new BitmapInfoHeader(); + header.Width = pic.Width; + header.Height = pic.Height; + header.Planes = 1; + header.PixelDepth = mvarPixelDepth; + header.Compression = BitmapCompression.None; + header.ImageSize = 0; + header.PelsPerMeterX = 0; + header.PelsPerMeterY = 0; + header.UsedColorIndexCount = 0; + header.RequiredColorIndexCount = 0; + BitmapInfoHeader.Save(bw, header); + + for (int y = pic.Height - 1; y >= 0; y--) + { + for (int x = 0; x < pic.Width; x++) + { + Color color = pic.GetPixel(x, y); + byte r = (byte)(color.Red * 255), g = (byte)(color.Green * 255), b = (byte)(color.Blue * 255); + + /* + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else */ + + switch (mvarPixelDepth) + { + case BitmapBitsPerPixel.TrueColor: + { + bw.WriteByte(b); + bw.WriteByte(g); + bw.WriteByte(r); + break; + } + } + } + } + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapInfoHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapInfoHeader.cs new file mode 100644 index 00000000..107f2b9d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Bitmap/BitmapInfoHeader.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Bitmap +{ + public struct BitmapInfoHeader + { + private int mvarWidth; + /// + /// The width of the bitmap, in pixels. If biCompression is JPEG or PNG, the biWidth member specifies the + /// width of the decompressed JPEG or PNG image file, respectively. + /// + public int Width { get { return mvarWidth; } set { mvarWidth = value; } } + + private int mvarHeaderSize; + public int HeaderSize { get { return mvarHeaderSize; } set { mvarHeaderSize = value; } } + + private int mvarHeight; + public int Height { get { return mvarHeight; } set { mvarHeight = value; } } + + private short mvarPlanes; + /// + /// The number of planes for the target device. This value must be set to 1. + /// + public short Planes { get { return mvarPlanes; } set { mvarPlanes = value; } } + + private BitmapCompression mvarCompression; + /// + /// The type of compression for a compressed bottom-up bitmap (top-down DIBs cannot be compressed). + /// + public BitmapCompression Compression { get { return mvarCompression; } set { mvarCompression = value; } } + + private int mvarImageSize; + /// + /// The size, in bytes, of the image. This may be set to zero for Uncompressed bitmaps. If biCompression is + /// JPEG or PNG, biSizeImage indicates the size of the JPEG or PNG image buffer, respectively. + /// + public int ImageSize { get { return mvarImageSize; } set { mvarImageSize = value; } } + + private int mvarPelsPerMeterX; + /// + /// The horizontal resolution, in pixels-per-meter, of the target device for the bitmap. An application + /// can use this value to select a bitmap from a resource group that best matches the characteristics of + /// the current device. + /// + public int PelsPerMeterX { get { return mvarPelsPerMeterX; } set { mvarPelsPerMeterX = value; } } + + private int mvarPelsPerMeterY; + /// + /// The vertical resolution, in pixels-per-meter, of the target device for the bitmap. + /// + public int PelsPerMeterY { get { return mvarPelsPerMeterY; } set { mvarPelsPerMeterY = value; } } + + private int mvarUsedColorIndexCount; + /// + /// + /// The number of color indexes in the color table that are actually used by the bitmap. If this + /// value is zero, the bitmap uses the maximum number of colors corresponding to the value of the + /// biBitCount member for the compression mode specified by biCompression. + /// + /// + /// If biClrUsed is nonzero and the biBitCount member is less than 16, the biClrUsed member specifies + /// the actual number of colors the graphics engine or device driver accesses. If biBitCount is 16 or + /// greater, the biClrUsed member specifies the size of the color table used to optimize performance + /// of the system color palettes. If biBitCount equals 16 or 32, the optimal color palette starts + /// immediately following the three DWORD masks. + /// + /// + /// When the bitmap array immediately follows the BITMAPINFO structure, it is a packed bitmap. Packed + /// bitmaps are referenced by a single pointer. Packed bitmaps require that the biClrUsed member must + /// be either zero or the actual size of the color table. + /// + /// + public int UsedColorIndexCount { get { return mvarUsedColorIndexCount; } set { mvarUsedColorIndexCount = value; } } + + private int mvarRequiredColorIndexCount; + /// + /// The number of color indexes that are required for displaying the bitmap. If this value is zero, all + /// colors are required. + /// + public int RequiredColorIndexCount { get { return mvarRequiredColorIndexCount; } set { mvarRequiredColorIndexCount = value; } } + + private BitmapBitsPerPixel mvarPixelDepth; + public BitmapBitsPerPixel PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + public static BitmapInfoHeader Load(IO.Reader br) + { + BitmapInfoHeader header = new BitmapInfoHeader(); + header.HeaderSize = br.ReadInt32(); // 40 vs. 56 + header.Width = br.ReadInt32(); + header.Height = br.ReadInt32(); + header.Planes = br.ReadInt16(); // 1 + header.PixelDepth = (BitmapBitsPerPixel)br.ReadInt16(); + header.Compression = (BitmapCompression)br.ReadInt32(); + header.ImageSize = br.ReadInt32(); + header.PelsPerMeterX = br.ReadInt32(); + header.PelsPerMeterY = br.ReadInt32(); + header.UsedColorIndexCount = br.ReadInt32(); + header.RequiredColorIndexCount = br.ReadInt32(); + + if (header.HeaderSize < 56) + { + br.Seek(56 - header.HeaderSize, SeekOrigin.Current); + } + return header; + } + public static void Save(IO.Writer bw, BitmapInfoHeader header) + { + bw.WriteInt32((int)40); // header size + bw.WriteInt32(header.Width); + bw.WriteInt32(header.Height); + bw.WriteInt16(header.Planes); + bw.WriteInt16((short)header.PixelDepth); + bw.WriteInt32((int)header.Compression); + bw.WriteInt32(header.ImageSize); + bw.WriteInt32(header.PelsPerMeterX); + bw.WriteInt32(header.PelsPerMeterY); + bw.WriteInt32(header.UsedColorIndexCount); + bw.WriteInt32(header.RequiredColorIndexCount); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/DirectDrawSurfaceDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/DirectDrawSurfaceDataFormat.cs new file mode 100644 index 00000000..6c0acf38 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/DirectDrawSurfaceDataFormat.cs @@ -0,0 +1,351 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw +{ + public class DirectDrawSurfaceDataFormat : DataFormat + { + public const uint DDS_MAGIC = 0x20534444; + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + uint magic = br.ReadUInt32(); + if (magic != DDS_MAGIC) throw new InvalidDataFormatException(); + + #region Header + uint dwHeaderSize = br.ReadUInt32(); + if (dwHeaderSize != 124) throw new InvalidDataFormatException(); + + Internal.DirectDrawSurfaceHeaderFlags dwHeaderFlags = (Internal.DirectDrawSurfaceHeaderFlags)br.ReadUInt32(); + // if (!((dwHeaderFlags & Internal.Constants.DirectDrawSurfaceFlags.PixelFormat) == Internal.Constants.DirectDrawSurfaceFlags.PixelFormat) || !((dwFlags & Internal.Constants.DirectDrawSurfaceFlags.Caps) == Internal.Constants.DirectDrawSurfaceFlags.Caps)) throw new InvalidDataFormatException(); + + uint dwHeight = br.ReadUInt32(); + uint dwWidth = br.ReadUInt32(); + pic.Width = (int)dwWidth; + pic.Height = (int)dwHeight; + + uint dwPitchOrLinearSize = br.ReadUInt32(); + uint dwDepth = br.ReadUInt32(); + uint dwMipMapCount = br.ReadUInt32(); + uint[] dwReserved1 = + { + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32(), + br.ReadUInt32() + }; + #endregion + #region PixelFormat + Internal.DirectDrawSurfacePixelFormat pf = new Internal.DirectDrawSurfacePixelFormat(); + if ((dwHeaderFlags & Internal.DirectDrawSurfaceHeaderFlags.PixelFormat) == Internal.DirectDrawSurfaceHeaderFlags.PixelFormat) + { + pf.PixelFormatSize = br.ReadUInt32(); + pf.Flags = (Internal.DirectDrawSurfacePixelFormatFlags)br.ReadUInt32(); + pf.FourCC = br.ReadFixedLengthString(4); + pf.RGBBitCount = br.ReadUInt32(); + pf.RBitMask = br.ReadUInt32(); + pf.GBitMask = br.ReadUInt32(); + pf.BBitMask = br.ReadUInt32(); + pf.AlphaBitMask = br.ReadUInt32(); + } + #endregion + #region Caps2 + if ((dwHeaderFlags & Internal.DirectDrawSurfaceHeaderFlags.Caps) == Internal.DirectDrawSurfaceHeaderFlags.Caps) + { + Internal.DirectDrawSurfaceCaps1 dwCaps1 = (Internal.DirectDrawSurfaceCaps1)br.ReadUInt32(); + Internal.DirectDrawSurfaceCaps2 dwCaps2 = (Internal.DirectDrawSurfaceCaps2)br.ReadUInt32(); + uint dwCaps3 = br.ReadUInt32(); // reserved + uint dwCaps4 = br.ReadUInt32(); // reserved + uint dwReserved2 = br.ReadUInt32(); // reserved + } + #endregion + + #region DDS Load Info + Internal.DirectDrawSurfaceLoadInfo li; + #region DXT1 + if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.FourCC) == Internal.DirectDrawSurfacePixelFormatFlags.FourCC) && (pf.FourCC == "1TXD" || pf.FourCC == "DXT1")) + { + li = new Internal.DirectDrawSurfaceLoadInfo(true, false, false, 4, 8, Internal.DirectDrawSurfaceFormat.DXT1); + } + #endregion + #region DXT3 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.FourCC) == Internal.DirectDrawSurfacePixelFormatFlags.FourCC) && (pf.FourCC == "3TXD" || pf.FourCC == "DXT3")) + { + li = new Internal.DirectDrawSurfaceLoadInfo(true, false, false, 4, 16, Internal.DirectDrawSurfaceFormat.DXT3); + } + #endregion + #region DXT5 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.FourCC) == Internal.DirectDrawSurfacePixelFormatFlags.FourCC) && (pf.FourCC == "5TXD" || pf.FourCC == "DXT5")) + { + li = new Internal.DirectDrawSurfaceLoadInfo(true, false, false, 4, 16, Internal.DirectDrawSurfaceFormat.DXT5); + } + #endregion + #region R16F + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.FourCC) == Internal.DirectDrawSurfacePixelFormatFlags.FourCC) && (pf.FourCC == "o\0\0\0" || pf.FourCC == "\0\0\0o")) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 4, 16, Internal.DirectDrawSurfaceFormat.R16F); + } + #endregion + #region G16R16F + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.FourCC) == Internal.DirectDrawSurfacePixelFormatFlags.FourCC) && (pf.FourCC == "p\0\0\0" || pf.FourCC == "\0\0\0p")) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 4, 16, Internal.DirectDrawSurfaceFormat.G16R16F); + } + #endregion + #region BGRA8 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) == Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 32 && pf.RBitMask == 0xff0000 && pf.GBitMask == 0xff00 && pf.BBitMask == 0xff && pf.AlphaBitMask == 0xff000000U) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 1, 4, Internal.DirectDrawSurfaceFormat.A8R8G8B8); + } + #endregion + #region BGR8 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) != Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 24 && pf.RBitMask == 0xff0000 && pf.GBitMask == 0xff00 && pf.BBitMask == 0xff) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 1, 3, Internal.DirectDrawSurfaceFormat.R8G8B8); + } + #endregion + #region A8B8G8R8 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) == Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 32 && pf.RBitMask == 0x0000ff && pf.GBitMask == 0xff00 && pf.BBitMask == 0xff0000 && pf.AlphaBitMask == 0xff000000U) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 1, 4, Internal.DirectDrawSurfaceFormat.A8B8G8R8); + } + #endregion + #region BGR5A1 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) == Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 16 && pf.RBitMask == 0x00007c00 && pf.GBitMask == 0x000003e0 && pf.BBitMask == 0x0000001f && pf.AlphaBitMask == 0x00008000) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, true, false, 1, 2, Internal.DirectDrawSurfaceFormat.A1R5G5B5); + } + #endregion + #region BGR565 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) != Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 16 && pf.RBitMask == 0x0000f800 && pf.GBitMask == 0x000007e0 && pf.BBitMask == 0x0000001f) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, true, false, 1, 2, Internal.DirectDrawSurfaceFormat.R5G6B5); + } + #endregion + #region G16R16 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) != Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 32 && pf.RBitMask == 0x0000ffff && pf.GBitMask == 0xffff0000 && pf.BBitMask == 0x00000000) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 1, 1, Internal.DirectDrawSurfaceFormat.G16R16); + } + #endregion + #region R3G3B2 + else if (((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.RGB) == Internal.DirectDrawSurfacePixelFormatFlags.RGB) && ((pf.Flags & Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) != Internal.DirectDrawSurfacePixelFormatFlags.AlphaPixels) && pf.RGBBitCount == 8 && pf.RBitMask == 0x000000e0 && pf.GBitMask == 0x0000001c && pf.BBitMask == 0x00000003) + { + li = new Internal.DirectDrawSurfaceLoadInfo(false, false, false, 1, 1, Internal.DirectDrawSurfaceFormat.R3G3B2); + } + #endregion + #region Failure + else + { + throw new InvalidDataFormatException("DirectDraw Surface invalid pixel format type"); + } + #endregion + #endregion + + #region Load the images + uint width = dwWidth, height = dwHeight; + uint mipMapCount = ((dwHeaderFlags & Internal.DirectDrawSurfaceHeaderFlags.MipMapCount) == Internal.DirectDrawSurfaceHeaderFlags.MipMapCount) ? dwMipMapCount : 1; + + if (li.Compressed) + { + uint size = Math.Max(li.DivSize, width) / li.DivSize * Math.Max(li.DivSize, height) / li.DivSize * li.BlockBytes; + if (size != dwPitchOrLinearSize) throw new InvalidOperationException("size is not equal to (pitch or linear size)"); + + if ((dwHeaderFlags & Internal.DirectDrawSurfaceHeaderFlags.LinearSize) != Internal.DirectDrawSurfaceHeaderFlags.LinearSize) throw new InvalidOperationException("flags does not contain LinearSize"); + + byte[] data = new byte[size]; + for (uint ix = 0; ix < mipMapCount; ++ix) + { + br.Read(data, 0, data.Length); + + if (objectModel is PictureObjectModel) + { + // do not read any more mipmaps if we are just looking for one picture + if (ix != 0) + { + width = (width + 1) >> 1; + height = (height + 1) >> 1; + size = Math.Max(li.DivSize, width) / li.DivSize * Math.Max(li.DivSize, height) / li.DivSize * li.BlockBytes; + data = new byte[size]; + continue; + } + } + + byte[] rgba = null; + Internal.DXTDecompression.decompressImage(out rgba, (int)width, (int)height, data, 1 << 1); + for (int i = 0; i < rgba.Length; i += 4) + { + Color color = Color.FromRGBA(rgba[i], rgba[i + 1], rgba[i + 2], rgba[i + 3]); + pic.SetPixel(color); + } + + /* + glCompressedTexImage2D(GL_TEXTURE_2D, ix, li->internalFormat, x, y, 0, size, data); + gl->updateError(); + */ + + width = (width + 1) >> 1; + height = (height + 1) >> 1; + size = Math.Max(li.DivSize, width) / li.DivSize * Math.Max(li.DivSize, height) / li.DivSize * li.BlockBytes; + } + data = null; + } + else if (li.Palette) + { + // currently, we unpack palette into BGRA + // I'm not sure we always get pitch... + if ((dwHeaderFlags & Internal.DirectDrawSurfaceHeaderFlags.Pitch) != Internal.DirectDrawSurfaceHeaderFlags.Pitch) throw new InvalidDataFormatException("header flags does not include pitch"); + if (pf.RGBBitCount != 8) throw new InvalidDataFormatException("pixel format RGB bit count must be 8"); + uint size = dwPitchOrLinearSize * height; + + // And I'm even less sure we don't get padding on the smaller MIP levels... + if (!(size == (width * height * li.BlockBytes))) throw new InvalidDataFormatException("size does not equal (x * y * li.BlockBytes)"); + + byte[] data = null; + uint[] palette = new uint[256]; + uint[] unpacked = new uint[size]; + + for (int i = 0; i < 256; i++) + { + palette[i] = br.ReadUInt32(); + } + for (uint ix = 0; ix < mipMapCount; ++ix ) + { + data = br.ReadBytes(size); + for(uint zz = 0; zz < size; ++zz ) + { + unpacked[zz] = palette[data[zz]]; + } + /* + glPixelStorei(GL_UNPACK_ROW_LENGTH, y); + glTexImage2D(GL_TEXTURE_2D, ix, li.InternalFormat, x, y, 0, li.ExternalFormat, li.Type, unpacked); + gl->updateError(); + */ + width = (width + 1) >> 1; + height = (height + 1) >> 1; + size = width * height * li.BlockBytes; + } + data = null; + unpacked = null; + } + else + { + if (li.Swap) + { + // glPixelStorei( GL_UNPACK_SWAP_BYTES, GL_TRUE ); + } + //fixme: how are MIP maps stored for 24-bit if pitch != ySize*3 ? + /* + for (uint ix = 0; ix < mipMapCount; ++ix ) + { + */ + uint y = 0; + + for (uint x = 0; x <= width; x++) + { + if (x + 1 > width) + { + x = 0; + y++; + } + if (y + 1 >= height) + { + break; + } + + byte r = 0, g = 0, b = 0, a = 255; + switch (li.Format) + { + case Internal.DirectDrawSurfaceFormat.R3G3B2: + { + // despite it saying R8G8B8, it is actually stored in the file as BGR!!! + byte rgb = br.ReadByte(); + b = (byte)rgb.GetBits(0, 2); + g = (byte)rgb.GetBits(2, 3); + r = (byte)rgb.GetBits(5, 3); + break; + } + case Internal.DirectDrawSurfaceFormat.A8R8G8B8: + { + // this is A8R8G8B8, in Grand Chase Cursor0.dds it is stored as RGBA + r = br.ReadByte(); + g = br.ReadByte(); + b = br.ReadByte(); + a = br.ReadByte(); + break; + } + case Internal.DirectDrawSurfaceFormat.A8B8G8R8: + { + // despite it saying R8G8B8, it is actually stored in the file as BGR!!! + a = br.ReadByte(); + b = br.ReadByte(); + g = br.ReadByte(); + r = br.ReadByte(); + break; + } + case Internal.DirectDrawSurfaceFormat.R8G8B8: + { + // despite it saying R8G8B8, it is actually stored in the file as BGR!!! + b = br.ReadByte(); + g = br.ReadByte(); + r = br.ReadByte(); + break; + } + case Internal.DirectDrawSurfaceFormat.G16R16F: + { + float g0 = br.ReadHalf(); + float r0 = br.ReadHalf(); + + throw new NotImplementedException(); + break; + } + } + + Color color = Color.FromRGBA(a, r, g, b); + pic.SetPixel(color, (int)x, (int)y); + } + + width = (width + 1) >> 1; + height = (height + 1) >> 1; + /* + } + */ + } + #endregion + } + + private Color GetColorFromR5G6B5(ushort rgb1, byte alpha = 255) + { + byte r = (byte)rgb1.GetBits(0, 5); + byte g = (byte)rgb1.GetBits(5, 6); + byte b = (byte)rgb1.GetBits(11, 5); + return Color.FromRGBA(alpha, r, g, b); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DXTDecompression.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DXTDecompression.cs new file mode 100644 index 00000000..7d2fcce7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DXTDecompression.cs @@ -0,0 +1,268 @@ +/* + * Copyright (c) <2011> + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +// most of the algorithms and data used in this Class-file has been ported from LibSquish! +// http://code.google.com/p/libsquish/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + public static class DXTDecompression + { + public enum DXTFlags : int + { + DXT1 = 1 << 0, + DXT3 = 1 << 1, + DXT5 = 1 << 2, + // Additional Enums not implemented :o + } + + private static void decompress(ref byte[] rgba, byte[] block, int flags) + { + // get the block locations + byte[] colourBlock = new byte[8]; + byte[] alphaBlock = block; + if ((flags & ((int)DXTFlags.DXT3 | (int)DXTFlags.DXT5)) != 0) + Array.Copy(block, 8, colourBlock, 0, 8); + else + Array.Copy(block, 0, colourBlock, 0, 8); + + // decompress color + decompressColor(ref rgba, colourBlock, ((flags & (int)DXTFlags.DXT1) != 0)); + + // decompress alpha separately if necessary + if ((flags & (int)DXTFlags.DXT3) != 0) + DecompressAlphaDxt3(ref rgba, alphaBlock); + else if ((flags & (int)DXTFlags.DXT5) != 0) + DecompressAlphaDxt5(ref rgba, alphaBlock); + + } + + private static void DecompressAlphaDxt3(ref byte[] rgba, byte[] block) + { + byte[] bytes = block; + + // Unpack the alpha values pairwise + for (int i = 0; i < 8; i++) + { + // Quantise down to 4 bits + byte quant = bytes[i]; + + byte lo = (byte)(quant & 0x0F); + byte hi = (byte)(quant & 0xF0); + + // Convert back up to bytes + rgba[8 * i + 3] = (byte)(lo | (lo << 4)); + rgba[8 * i + 7] = (byte)(hi | (hi >> 4)); + } + } + + private static void DecompressAlphaDxt5(ref byte[] rgba, byte[] block) + { + // Get the two alpha values + byte[] bytes = block; + int alpha0 = bytes[0]; + int alpha1 = bytes[1]; + + // compare the values to build the codebook + byte[] codes = new byte[8]; + codes[0] = (byte)alpha0; + codes[1] = (byte)alpha1; + if (alpha0 <= alpha1) + { + // Use 5-Alpha Codebook + for (int i = 1; i < 5; i++) + codes[1 + i] = (byte)(((5 - i) * alpha0 + i * alpha1) / 5); + codes[6] = 0; + codes[7] = 255; + } + else + { + // Use 7-Alpha Codebook + for (int i = 1; i < 7; i++) + { + codes[i + 1] = (byte)(((7 - i) * alpha0 + i * alpha1) / 7); + } + } + + // decode indices + byte[] indices = new byte[16]; + byte[] blockSrc = bytes; + int blockSrc_pos = 2; + byte[] dest = indices; + int indices_pos = 0; + for (int i = 0; i < 2; i++) + { + // grab 3 bytes + int value = 0; + for (int j = 0; j < 3; j++) + { + int _byte = blockSrc[blockSrc_pos++]; + value |= (_byte << 8 * j); + } + + // unpack 8 3-bit values from it + for (int j = 0; j < 8; j++) + { + int index = (value >> 3 * j) & 0x07; + dest[indices_pos++] = (byte)index; + } + } + + // write out the indexed coebook values + for (int i = 0; i < 16; i++) + { + rgba[4 * i + 3] = codes[indices[i]]; + } + } + + private static void decompressColor(ref byte[] rgba, byte[] block, bool isDxt1) + { + byte[] bytes = block; + + // Unpack Endpoints + byte[] codes = new byte[16]; + int a = unpack565(bytes, 0, ref codes, 0); + int b = unpack565(bytes, 2, ref codes, 4); + + // generate Midpoints + for (int i = 0; i < 3; i++) + { + int c = codes[i]; + int d = codes[4 + i]; + + if (isDxt1 && a <= b) + { + codes[8 + i] = (byte)((c + d) / 2); + codes[12 + i] = 0; + } + else + { + codes[8 + i] = (byte)((2 * c + d) / 3); + codes[12 + i] = (byte)((c + 2 * d) / 3); + } + } + + // Fill in alpha for intermediate values + codes[8 + 3] = 255; + codes[12 + 3] = (isDxt1 && a <= b) ? (byte)0 : (byte)255; + + //unpack the indices + byte[] indices = new byte[16]; + for (int i = 0; i < 4; i++) + { + byte packed = bytes[4 + i]; + + indices[0 + i * 4] = (byte)(packed & 0x3); + indices[1 + i * 4] = (byte)((packed >> 2) & 0x3); + indices[2 + i * 4] = (byte)((packed >> 4) & 0x3); + indices[3 + i * 4] = (byte)((packed >> 6) & 0x3); + } + + // store out the colours + for (int i = 0; i < 16; i++) + { + byte offset = (byte)(4 * indices[i]); + for (int j = 0; j < 4; j++) + { + rgba[4 * i + j] = codes[offset + j]; + } + } + } + + private static int unpack565(byte[] packed, int packed_offset, ref byte[] colour, int colour_offset) + { + // Build packed value + int value = (int)packed[0 + packed_offset] | ((int)packed[1 + packed_offset] << 8); + + // get components in the stored range + byte red = (byte)((value >> 11) & 0x1F); + byte green = (byte)((value >> 5) & 0x3F); + byte blue = (byte)(value & 0x1F); + + // Scale up to 8 Bit + colour[0 + colour_offset] = (byte)((red << 3) | (red >> 2)); + colour[1 + colour_offset] = (byte)((green << 2) | (green >> 4)); + colour[2 + colour_offset] = (byte)((blue << 3) | (blue >> 2)); + colour[3 + colour_offset] = 255; + + return value; + } + + public static void decompressImage(out byte[] rgba, int width, int height, byte[] blocks, int flags) + { + rgba = new byte[width * height * 4]; + + // initialise the block input + byte[] sourceBlock = blocks; + int sourceBlock_pos = 0; + int bytesPerBlock = ((flags & (int)DXTFlags.DXT1) != 0) ? 8 : 16; + + // loop over blocks + for (int y = 0; y < height; y += 4) + { + for (int x = 0; x < width; x += 4) + { + // decompress the block + byte[] targetRGBA = new byte[4 * 16]; + int targetRGBA_pos = 0; + byte[] sourceBlockBuffer = new byte[bytesPerBlock]; // größe korrekt? + if (sourceBlock.Length == sourceBlock_pos) continue; + Array.Copy(sourceBlock, sourceBlock_pos, sourceBlockBuffer, 0, bytesPerBlock); + //sourceBlock.CopyTo(sourceBlockBuffer, sourceBlock_pos); + decompress(ref targetRGBA, sourceBlockBuffer, flags); + + // Write the decompressed pixels to the correct image locations + byte[] sourcePixel = new byte[4]; + + for (int py = 0; py < 4; py++) + { + for (int px = 0; px < 4; px++) + { + int sx = x + px; + int sy = y + py; + if (sx < width && sy < height) + { + int targetPixel = 4 * (width * sy + sx); + + //targetRGBA.CopyTo(sourcePixel, targetRGBA_pos); + Array.Copy(targetRGBA, targetRGBA_pos, sourcePixel, 0, 4); + targetRGBA_pos += 4; + + for (int i = 0; i < 4; i++) + rgba[targetPixel + i] = sourcePixel[i]; + } + else + { + // Ignore that pixel + targetRGBA_pos += 4; + } + } + } + sourceBlock_pos += bytesPerBlock; + } + } + } + } +} \ No newline at end of file diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps1.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps1.cs new file mode 100644 index 00000000..60ebacfd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps1.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + /// + /// Specifies the complexity of the surfaces stored. + /// + /// When you write .dds files, you should set the DDSCAPS_TEXTURE flag, and for multiple surfaces you should also set the DDSCAPS_COMPLEX flag. However, when you read a .dds file, you should not rely on the DDSCAPS_TEXTURE and DDSCAPS_COMPLEX flags being set because some writers of such a file might not set these flags. + internal enum DirectDrawSurfaceCaps1 + { + /// + /// Optional; must be used on any file that contains more than one surface (a mipmap, a cubic environment map, or mipmapped volume texture). + /// + Complex = 0x8, + /// + /// Optional; should be used for a mipmap. + /// + Mipmap = 0x400000, + /// + /// Required + /// + Texture = 0x1000 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps2.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps2.cs new file mode 100644 index 00000000..631f08d3 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceCaps2.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + /// + /// Additional detail about the surfaces stored. + /// + internal enum DirectDrawSurfaceCaps2 + { + /// + /// Required for a cube map. + /// + CubeMap = 0x200, + /// + /// Required when these surfaces are stored in a cube map. + /// + CubeMapPositiveX = 0x400, + /// + /// Required when these surfaces are stored in a cube map. + /// + CubeMapNegativeX = 0x800, + /// + /// Required when these surfaces are stored in a cube map. + /// + CubeMapPositiveY = 0x1000, + /// + /// Required when these surfaces are stored in a cube map. + /// + CubeMapNegativeY = 0x2000, + /// + /// Required when these surfaces are stored in a cube map. + /// + CubeMapPositiveZ = 0x4000, + /// + /// Required when these surfaces are stored in a cube map. + /// + CubeMapNegativeZ = 0x8000, + /// + /// Required for a volume texture. + /// + Volume = 0x200000 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceFormat.cs new file mode 100644 index 00000000..59291a23 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceFormat.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + public enum DirectDrawSurfaceFormat + { + Unknown = 0, + #region DXTn Compressed Formats - These flags are used for compressed textures. + /// + /// DXT1 compression texture format + /// + DXT1 = 827611204, + /// + /// DXT2 compression texture format + /// + DXT2 = 844388420, + /// + /// DXT3 compression texture format + /// + DXT3 = 861165636, + /// + /// DXT4 compression texture format + /// + DXT4 = 877942852, + /// + /// DXT5 compression texture format + /// + DXT5 = 894720068, + #endregion + #region Floating-Point Formats - These 16-bits-per-channel formats are also known as s10e5 formats. + /// + /// 16-bit float format using 16 bits for the red channel. + /// + R16F = 111, + /// + /// 32-bit float format using 16 bits for the red channel and 16 bits for the green channel. + /// + G16R16F = 112, + /// + /// 64-bit float format using 16 bits for the each channel (alpha, blue, green, red). + /// + A16B16G16R16F = 113, + #endregion + #region FourCC - Data in a FOURCC format is compressed data. + Multi2ARGB8 = 827606349, + /// + /// A 16-bit packed RGB format analogous to YUY2 (Y0U0, Y1V0, Y2U2, and so on). It requires a pixel pair in order to properly represent the color value. The first pixel in the pair contains 8 bits of green (in the high 8 bits) and 8 bits of red (in the low 8 bits). The second pixel contains 8 bits of green (in the high 8 bits) and 8 bits of blue (in the low 8 bits). Together, the two pixels share the red and blue components, while each has a unique green component (G0R0, G1B0, G2R2, and so on). The texture sampler does not normalize the colors when looking up into a pixel shader; they remain in the range of 0.0f to 255.0f. This is true for all programmable pixel shader models. For the fixed function pixel shader, the hardware should normalize to the 0.f to 1.f range and essentially treat it as the YUY2 texture. Hardware that exposes this format must have the PixelShader1xMaxValue member of D3DCAPS9 set to a value capable of handling that range. + /// + G8R8G8B8 = 1111970375, + R8G8B8G8 = 1195525970, + /// + /// UYVY format (PC98 compliance) + /// + UYVY = 1498831189, + /// + /// YUY2 format (PC98 compliance) + /// + YUY2 = 844715353, + #endregion + #region IEEE Formats - These 32-bits-per-channel formats are also known as s23e8 formats. + /// + /// 32-bit float format using 32 bits for the red channel. + /// + R32F = 114, + /// + /// 64-bit float format using 32 bits for the red channel and 32 bits for the green channel. + /// + G32R32F = 115, + /// + /// 128-bit float format using 32 bits for the each channel (alpha, blue, green, red). + /// + A32B32G32R32F = 116, + #endregion + #region Mixed Formats - data in mixed formats can contain a combination of unsigned data and signed data. + /// + /// 16-bit bump-map format with luminance using 6 bits for luminance, and 5 bits each for v and u. + /// + L6V5U5 = 61, + /// + /// 32-bit bump-map format with luminance using 8 bits for each channel. + /// + X8L8V8U8 = 62, + /// + /// 32-bit bump-map format using 2 bits for alpha and 10 bits each for w, v, and u. + /// + A2W10V10U10 = 67, + #endregion + #region Signed Formats - data in a signed format can be both positive and negative. Signed formats use combinations of (U), (V), (W), and (Q) data. + /// + /// 16-bit bump-map format using 8 bits each for u and v data. + /// + V8U8 = 60, + /// + /// 32-bit bump-map format using 8 bits for each channel. + /// + Q8W8V8U8 = 63, + /// + /// 32-bit bump-map format using 16 bits for each channel. + /// + V16U16 = 64, + /// + /// 64-bit bump-map format using 16 bits for each component. + /// + Q16W16V16U16 = 110, + /// + /// 16-bit normal compression format. The texture sampler computes the C channel from: C = sqrt(1 - U2 - V2). + /// + CxV8U8 = 117, + #endregion + #region Unsigned Formats + /// + /// 24-bit RGB pixel format with 8 bits per channel. + /// + R8G8B8 = 20, + /// + /// 32-bit ARGB pixel format with alpha, using 8 bits per channel. + /// + A8R8G8B8 = 21, + /// + /// 32-bit RGB pixel format, where 8 bits are reserved for each color. + /// + X8R8G8B8 = 22, + /// + /// 16-bit RGB pixel format with 5 bits for red, 6 bits for green, and 5 bits for blue. + /// + R5G6B5 = 23, + /// + /// 16-bit pixel format where 5 bits are reserved for each color. + /// + X1R5G5B5 = 24, + /// + /// 16-bit pixel format where 5 bits are reserved for each color and 1 bit is reserved for alpha. + /// + A1R5G5B5 = 25, + /// + /// 16-bit ARGB pixel format with 4 bits for each channel. + /// + A4R4G4B4 = 26, + /// + /// 8-bit RGB texture format using 3 bits for red, 3 bits for green, and 2 bits for blue. + /// + R3G3B2 = 27, + /// + /// 8-bit alpha only. + /// + A8 = 28, + /// + /// 16-bit ARGB texture format using 8 bits for alpha, 3 bits each for red and green, and 2 bits for blue. + /// + A8R3G3B2 = 29, + /// + /// 16-bit RGB pixel format using 4 bits for each color. + /// + X4R4G4B4 = 30, + /// + /// 32-bit pixel format using 10 bits for each color and 2 bits for alpha. + /// + A2B10G10R10 = 31, + /// + /// 32-bit ARGB pixel format with alpha, using 8 bits per channel. + /// + A8B8G8R8 = 32, + /// + /// 32-bit RGB pixel format, where 8 bits are reserved for each color. + /// + X8B8G8R8 = 33, + /// + /// 32-bit pixel format using 16 bits each for green and red. + /// + G16R16 = 34, + /// + /// 32-bit pixel format using 10 bits each for red, green, and blue, and 2 bits for alpha. + /// + A2R10G10B10 = 35, + /// + /// 64-bit pixel format using 16 bits for each component. + /// + A16B16G16R16 = 36, + /// + /// 8-bit color indexed with 8 bits of alpha. + /// + A8P8 = 40, + /// + /// 8-bit color indexed. + /// + P8 = 41, + /// + /// 8-bit luminance only. + /// + L8 = 50, + /// + /// 16-bit using 8 bits each for alpha and luminance. + /// + A8L8 = 51, + /// + /// 8-bit using 4 bits each for alpha and luminance. + /// + A4L4 = 52, + /// + /// 16-bit luminance only. + /// + L16 = 81, + /// + /// 1-bit monochrome. This flag is available in Direct3D 9Ex only. + /// + A1 = 118, + /// + /// 2.8-biased fixed point. This flag is available in Direct3D 9Ex only. + /// + A2B10G10R10_XR_BIAS = 119, + /// + /// Binary format indicating that the data has no inherent type. This flag is available in Direct3D 9Ex only. + /// + BinaryBuffer = 199 + #endregion + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceHeaderFlags.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceHeaderFlags.cs new file mode 100644 index 00000000..e0ac4f0d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceHeaderFlags.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + public enum DirectDrawSurfaceHeaderFlags : uint + { + Caps = 0x00000001, + Height = 0x00000002, + Width = 0x00000004, + Pitch = 0x00000008, + PixelFormat = 0x00001000, + MipMapCount = 0x00020000, + LinearSize = 0x00080000, + Depth = 0x00800000 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceLoadInfo.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceLoadInfo.cs new file mode 100644 index 00000000..1965132c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfaceLoadInfo.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + public enum DirectDrawSurfaceLoadInfoType : uint + { + None = 0x0000, + UnsignedByte = 0x1401, + UnsignedShort565 = 0x8363, + UnsignedShort1555REV = 0x8366 + } + public enum DirectDrawSurfaceLoadInfoFormat + { + RGB = 0x1907, + CompressedRGBAS3TCDXT1 = 0x83F1, + CompressedRGBAS3TCDXT3 = 0x83F2, + CompressedRGBAS3TCDXT5 = 0x83F3, + RGB5 = 0x8050, + RGB8 = 0x8051, + RGB5A1 = 0x8057, + RGBA8 = 0x8058, + BGR = 0x80E0, + BGRA = 0x80E1 + } + internal struct DirectDrawSurfaceLoadInfo + { + private bool mvarCompressed; + public bool Compressed { get { return mvarCompressed; } } + + private bool mvarSwap; + public bool Swap { get { return mvarSwap; } } + + private bool mvarPalette; + public bool Palette { get { return mvarPalette; } } + + private uint mvarDivSize; + public uint DivSize { get { return mvarDivSize; } } + + private uint mvarBlockBytes; + public uint BlockBytes { get { return mvarBlockBytes; } } + + private DirectDrawSurfaceFormat mvarFormat; + public DirectDrawSurfaceFormat Format { get { return mvarFormat; } } + + public DirectDrawSurfaceLoadInfo(bool compressed, bool swap, bool palette, uint divSize, uint blockBytes, DirectDrawSurfaceFormat format) + { + mvarCompressed = compressed; + mvarSwap = swap; + mvarPalette = palette; + mvarDivSize = divSize; + mvarBlockBytes = blockBytes; + mvarFormat = format; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormat.cs new file mode 100644 index 00000000..9839a361 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormat.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + internal struct DirectDrawSurfacePixelFormat + { + private uint mvarPixelFormatSize; + public uint PixelFormatSize { get { return mvarPixelFormatSize; } set { mvarPixelFormatSize = value; } } + + private DirectDrawSurfacePixelFormatFlags mvarFlags; + public DirectDrawSurfacePixelFormatFlags Flags { get { return mvarFlags; } set { mvarFlags = value; } } + + private string mvarFourCC; + public string FourCC { get { return mvarFourCC; } set { mvarFourCC = value; } } + + private uint mvarRGBBitCount; + public uint RGBBitCount { get { return mvarRGBBitCount; } set { mvarRGBBitCount = value; } } + + private uint mvarRBitMask; + public uint RBitMask { get { return mvarRBitMask; } set { mvarRBitMask = value; } } + + private uint mvarGBitMask; + public uint GBitMask { get { return mvarGBitMask; } set { mvarGBitMask = value; } } + + private uint mvarBBitMask; + public uint BBitMask { get { return mvarBBitMask; } set { mvarBBitMask = value; } } + + private uint mvarAlphaBitMask; + public uint AlphaBitMask { get { return mvarAlphaBitMask; } set { mvarAlphaBitMask = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormatFlags.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormatFlags.cs new file mode 100644 index 00000000..5d3b18f6 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/DirectDraw/Internal/DirectDrawSurfacePixelFormatFlags.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia3D.Picture.Microsoft.DirectDraw.Internal +{ + public enum DirectDrawSurfacePixelFormatFlags : uint + { + None = 0x00000000, + AlphaPixels = 0x00000001, + FourCC = 0x00000004, + Indexed = 0x00000020, + RGB = 0x00000040 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Paint/MSPDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Paint/MSPDataFormat.cs new file mode 100644 index 00000000..c98dcec0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Microsoft/Paint/MSPDataFormat.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Microsoft.Paint +{ + public class MSPDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + _dfr.Sources.Add("http://www.fileformat.info/format/mspaint/egff.htm"); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel picture = (objectModel as PictureObjectModel); + if (picture == null) throw new ObjectModelNotSupportedException(); + + IO.Reader br = base.Accessor.Reader; + if (br.Accessor.Length < 32) throw new InvalidDataFormatException("File must be at least 32 bytes"); + + string signature = br.ReadFixedLengthString(4); + if (signature != "DanM" && signature != "LinS") throw new InvalidDataFormatException("File does not begin with \"DanM\" or \"LinS\""); + + short bitmapWidth = br.ReadInt16(); + short bitmapHeight = br.ReadInt16(); + picture.Width = bitmapWidth; + picture.Height = bitmapHeight; + + short bitmapAspectRatioX = br.ReadInt16(); + short bitmapAspectRatioY = br.ReadInt16(); + short printerAspectRatioX = br.ReadInt16(); + short printerAspectRatioY = br.ReadInt16(); + short printerWidth = br.ReadInt16(); + short printerHeight = br.ReadInt16(); + short aspectCorrectionX = br.ReadInt16(); + short aspectCorrectionY = br.ReadInt16(); + short checksum = br.ReadInt16(); + short padding0 = br.ReadInt16(); + short padding1 = br.ReadInt16(); + short padding2 = br.ReadInt16(); + + if (signature == "DanM") + { + for (int y = 0; y < bitmapHeight; y++) + { + int x = 0; + while (x < bitmapWidth) + { + byte next = br.ReadByte(); + bool[] exploded = ExplodeBits(next); + for (int i = 0; i < exploded.Length; i++, x++) + { + Color color = Colors.Black; + if (exploded[i]) color = Colors.White; + + picture.SetPixel(color, x, y); + } + } + } + } + else + { + throw new NotImplementedException("Format LinS is not yet implemented"); + } + } + + private bool[] ExplodeBits(byte value) + { + bool[] bits = new bool[8]; + bits[0] = ((value & 0x01) == 0x01); + bits[1] = ((value & 0x02) == 0x02); + bits[2] = ((value & 0x04) == 0x04); + bits[3] = ((value & 0x08) == 0x08); + bits[4] = ((value & 0x10) == 0x10); + bits[5] = ((value & 0x20) == 0x20); + bits[6] = ((value & 0x40) == 0x40); + bits[7] = ((value & 0x80) == 0x80); + return bits; + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGChunk.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGChunk.cs new file mode 100644 index 00000000..4b89f935 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGChunk.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + public class PNGChunk + { + public class PNGChunkCollection + : System.Collections.ObjectModel.Collection + { + public Dictionary chunksByName = new Dictionary(); + + public PNGChunk Add(string name, byte[] data) + { + PNGChunk chunk = null; + if (chunksByName.ContainsKey(name)) + { + chunk = chunksByName[name]; + + byte[] originalData = chunk.Data; + Array.Resize(ref originalData, originalData.Length + data.Length); + Array.Copy(data, 0, chunk.Data, chunk.Data.Length - data.Length, data.Length); + chunk.Data = originalData; + } + else + { + chunk = new PNGChunk(); + chunk.Name = name; + chunk.Data = data; + base.Add(chunk); + } + return chunk; + } + public PNGChunk this[string name] + { + get + { + if (chunksByName.ContainsKey(name)) + { + return chunksByName[name]; + } + return null; + } + } + + protected override void InsertItem(int index, PNGChunk item) + { + base.InsertItem(index, item); + if (!chunksByName.ContainsKey(item.Name)) + { + chunksByName.Add(item.Name, item); + } + } + protected override void RemoveItem(int index) + { + if (chunksByName.ContainsKey(this[index].Name)) + { + chunksByName.Remove(this[index].Name); + } + base.RemoveItem(index); + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private byte[] mvarData = new byte[0]; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + private int mvarCRC = 0; + public int CRC { get { return mvarCRC; } set { mvarCRC = value; } } + + public override string ToString() + { + return mvarName + " [" + mvarData.Length.ToString() + "]"; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGColorType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGColorType.cs new file mode 100644 index 00000000..da43779b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGColorType.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + /// + /// Describes the interpolation of the image data. + /// + [Flags()] + public enum PNGColorType + { + None = 0, + /// + /// Each pixel is referenced by an index into the palette table. + /// + Palette = 1, + /// + /// Each pixel is an R, G, B triple. + /// + Color = 2, + /// + /// Each pixel is followed by an alpha sample. + /// + AlphaChannel = 4 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionMethod.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionMethod.cs new file mode 100644 index 00000000..169850fb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionMethod.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + public enum PNGCompressionMethod + { + Zlib = 0 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionModule.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionModule.cs new file mode 100644 index 00000000..951efeec --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGCompressionModule.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.Compression; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + public class PNGCompressionModule : CompressionModule + { + public override string Name + { + get { return "PNG"; } + } + + protected override void CompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream) + { + throw new NotImplementedException(); + } + protected override void DecompressInternal(System.IO.Stream inputStream, System.IO.Stream outputStream, int inputLength, int outputLength) + { + IO.Reader reader = new IO.Reader(new StreamAccessor(inputStream)); + + IO.Writer writer = new IO.Writer(new StreamAccessor(outputStream)); + IO.Reader readerOut = new IO.Reader(new StreamAccessor(outputStream)); + + for (int y = 0; y < mvarImageHeight; y++) + { + PNGFilterType filterType = (PNGFilterType)reader.ReadByte(); + + for (int x = 0; x < mvarImageWidth; x++) + { + switch (filterType) + { + case PNGFilterType.None: + { + byte r = reader.ReadByte(); + byte g = reader.ReadByte(); + byte b = reader.ReadByte(); + + writer.WriteByte(r); + writer.WriteByte(g); + writer.WriteByte(b); + break; + } + case PNGFilterType.Sub: + { + // reverse the Sub filter on each pixel + byte g = (byte)(Sub(reader.Accessor.Position, reader) + (Raw(reader.Accessor.Position - mvarBytesPerPixel, reader) % 256)); + + writer.WriteByte(g); + break; + } + case PNGFilterType.Up: + { + // reverse the Up filter on each pixel + byte g = (byte)(Up(reader.Accessor.Position, reader) + Prior(reader.Accessor.Position, reader)); + + writer.WriteByte(g); + break; + } + case PNGFilterType.Paeth: + { + // reverse the Paeth filter on each pixel + byte g = (byte)(Paeth(reader.Accessor.Position, reader) + PaethPredictor(Raw(reader.Accessor.Position - mvarBytesPerPixel, reader), Prior(reader.Accessor.Position, reader), Prior(reader.Accessor.Position - mvarBytesPerPixel, reader))); + + writer.WriteByte(g); + break; + } + default: + { + break; + } + } + } + } + } + + private byte PaethPredictor(byte a, byte b, byte c) + { + // a = left, b = above, c = upper left + + byte p = (byte)(a + b - c); // initial estimate + byte pa = (byte)(Math.Abs(p - a) % 256); // distance to a + byte pb = (byte)(Math.Abs(p - b) % 256); // distance to b + byte pc = (byte)(Math.Abs(p - c) % 256); // distance to c + + // return nearest of a,b,c, + // breaking ties in order a,b,c. + if (pa <= pb && pa <= pc) + { + return a; + } + else if (pb <= pc) + { + return b; + } + else + { + return c; + } + } + + private byte Paeth(long position, IO.Reader reader) + { + return (byte)(Raw(position, reader) - PaethPredictor(Raw(position - mvarBytesPerPixel, reader), Prior(position, reader), Prior(position - mvarBytesPerPixel, reader))); + } + + /// + /// Predicts the next pixel based on the pixel immediately above the pixel specified at position. + /// + /// + /// + /// + private byte Up(long position, IO.Reader reader) + { + return (byte)(Raw(position, reader) - Prior(position, reader)); + } + + /// + /// Retrieves the unfiltered bytes of the prior scanline at the specified position. + /// + /// + /// + /// + private byte Prior(long position, IO.Reader reader) + { + // move up one scanline + position -= mvarImageWidth; + + // retrieve the actual value + return (byte)(Raw(position, reader)); + } + + private byte Sub(long position, IO.Reader reader) + { + return (byte)(Raw(position, reader) - Raw(position - mvarBytesPerPixel, reader)); + } + private byte Raw(long position, IO.Reader reader) + { + if (position < 0) return 0; + position++; + + long pos = reader.Accessor.Position; + reader.Accessor.Position = position; + + byte val = reader.ReadByte(); + reader.Accessor.Position = pos + 1; + + return val; + } + + private int mvarBytesPerPixel = 0; + public int BytesPerPixel { get { return mvarBytesPerPixel; } set { mvarBytesPerPixel = value; } } + + private int mvarImageWidth = 0; + public int ImageWidth { get { return mvarImageWidth; } set { mvarImageWidth = value; } } + + private int mvarImageHeight = 0; + public int ImageHeight { get { return mvarImageHeight; } set { mvarImageHeight = value; } } + + private PNGCompressionMethod mvarCompressionMethod = PNGCompressionMethod.Zlib; + public PNGCompressionMethod Method { get { return mvarCompressionMethod; } set { mvarCompressionMethod = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGDataFormat.cs new file mode 100644 index 00000000..39649741 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGDataFormat.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.Compression; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + public class PNGDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + byte[] signature = br.ReadBytes(8); + br.Endianness = IO.Endianness.BigEndian; + + PNGChunk.PNGChunkCollection chunks = new PNGChunk.PNGChunkCollection(); + + while (!br.EndOfStream) + { + int chunkLength = br.ReadInt32(); + string chunkType = br.ReadFixedLengthString(4); + byte[] chunkData = br.ReadBytes(chunkLength); + int chunkCRC = br.ReadInt32(); + chunks.Add(chunkType, chunkData); + + if (chunkType == "IEND") break; + } + + IO.Reader brIHDR = new IO.Reader(new MemoryAccessor(chunks["IHDR"].Data)); + brIHDR.Endianness = IO.Endianness.BigEndian; + pic.Width = brIHDR.ReadInt32(); + pic.Height = brIHDR.ReadInt32(); + byte bitDepth = brIHDR.ReadByte(); + PNGColorType colorType = (PNGColorType)brIHDR.ReadByte(); + PNGCompressionMethod compressionMethod = (PNGCompressionMethod)brIHDR.ReadByte(); + byte filterMethod = brIHDR.ReadByte(); + byte interlaceMethod = brIHDR.ReadByte(); + + byte[] imageData = chunks["IDAT"].Data; + + // first do a Zlib decompress + byte[] uncompressedFilteredImageData = CompressionModule.FromKnownCompressionMethod(CompressionMethod.Zlib).Decompress(imageData); + + // now do a PNG decompress + PNGCompressionModule compressionModule = new PNGCompressionModule(); + compressionModule.ImageWidth = pic.Width; + compressionModule.ImageHeight = pic.Height; + compressionModule.Method = compressionMethod; + compressionModule.BytesPerPixel = (int)(((double)bitDepth / 8) * 3); + + byte[] uncompressed = compressionModule.Decompress(uncompressedFilteredImageData); + + for (int y = 0; y < pic.Height; y++) + { + for (int x = 0; x < pic.Width; x++) + { + int index = ((y * pic.Width) + x) * 3; + + byte r = uncompressed[index]; + byte g = uncompressed[index + 1]; + byte b = uncompressed[index + 2]; + + Color color = Color.FromRGBA(r, g, b); + pic.SetPixel(color, x, y); + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + IO.Writer bw = base.Accessor.Writer; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + byte[] signature = new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; + bw.WriteBytes(signature); + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGFilterType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGFilterType.cs new file mode 100644 index 00000000..d521de91 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGFilterType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + public enum PNGFilterType + { + None = 0, + Sub = 1, + Up = 2, + Average = 3, + Paeth = 4 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGPredictionType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGPredictionType.cs new file mode 100644 index 00000000..8645f550 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortableNetworkGraphics/PNGPredictionType.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortableNetworkGraphics +{ + public enum PNGPredictionType + { + /// + /// Zero (so that the raw byte value passes through unaltered) + /// + None = 0, + /// + /// Byte A (to the left) + /// + Sub = 1, + /// + /// Byte B (above) + /// + Up = 2, + /// + /// Mean of bytes A and B, rounded down + /// + Average = 3, + /// + /// A, B, or C, whichever is closest to p = A + B − C + /// + Paeth = 4 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortablePixelmap/PPMDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortablePixelmap/PPMDataFormat.cs new file mode 100644 index 00000000..1c37fe03 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/PortablePixelmap/PPMDataFormat.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.PortablePixelmap +{ + public class PPMDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + IO.Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(2); + + switch (signature) + { + case "P1": + case "P2": + case "P3": + { + IO.Reader tr = base.Accessor.Reader; + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + if (line.Contains("#")) line = line.Substring(0, line.IndexOf("#")); + if (String.IsNullOrEmpty(line.Trim())) continue; + + + } + break; + } + case "P4": + case "P5": + case "P6": + { + IO.Reader tr = base.Accessor.Reader; + + bool dimensionsRead = false; + bool divisorRead = false; + int divisor = 1; // maximum value of pixel + + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + if (line.Contains("#")) line = line.Substring(0, line.IndexOf("#")); + if (String.IsNullOrEmpty(line.Trim())) continue; + if (!dimensionsRead) + { + string[] dimensions = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (dimensions.Length < 2) throw new InvalidDataFormatException("Could not read dimensions"); + + pic.Width = Int32.Parse(dimensions[0]); + pic.Height = Int32.Parse(dimensions[1]); + dimensionsRead = true; + } + else if (!divisorRead) + { + if (signature == "P4") break; + divisor = Int32.Parse(line); + divisorRead = true; + break; + } + } + + for (int x = 0; x < pic.Width; x++) + { + for (int y = 0; y < pic.Height; y++) + { + switch (signature) + { + case "P4": + { + // pixelmap + byte r = (byte)tr.ReadChar(); + byte g = (byte)tr.ReadChar(); + byte b = (byte)tr.ReadChar(); + + r = (byte)(255 - r); + g = (byte)(255 - g); + b = (byte)(255 - b); + + Color color = Color.FromRGBA(r, g, b); + pic.SetPixel(color, x, y); + break; + } + case "P5": + { + // graymap + byte level = (byte)tr.ReadChar(); + level = (byte)((double)level / (256 - divisor)); + + Color color = Color.FromRGBA(level, level, level); + pic.SetPixel(color, x, y); + break; + } + case "P6": + { + // colormap + byte r = (byte)tr.ReadChar(); + byte g = (byte)tr.ReadChar(); + byte b = (byte)tr.ReadChar(); + + Color color = Color.FromRGBA(r, g, b); + pic.SetPixel(color, x, y); + break; + } + } + } + } + break; + } + case "P7": + { + throw new NotImplementedException(); + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/TMH/TMHDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/TMH/TMHDataFormat.cs new file mode 100644 index 00000000..dc110c0c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/TMH/TMHDataFormat.cs @@ -0,0 +1,54 @@ +/* + * Created by SharpDevelop. + * User: Mike Becker + * Date: 5/19/2013 + * Time: 3:19 PM + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.TMH +{ + /// + /// Description of TMHDataFormat. + /// + public class TMHDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(8); + if (signature != ".TMH0.14") throw new InvalidDataFormatException("File does not begin with \".TMH0.14\""); + + uint unknown1 = br.ReadUInt32(); + uint unknown2 = br.ReadUInt32(); + uint unknown3 = br.ReadUInt32(); + uint unknown4 = br.ReadUInt32(); + uint unknown5 = br.ReadUInt32(); + uint unknown6 = br.ReadUInt32(); + uint unknown7 = br.ReadUInt32(); + uint unknown8 = br.ReadUInt32(); + uint unknown9 = br.ReadUInt32(); + ushort unknown10a = br.ReadUInt16(); + ushort unknown10b = br.ReadUInt16(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs new file mode 100644 index 00000000..46037ac3 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + public class TargaExtensionArea + { + private bool mvarEnabled = false; + public bool Enabled { get { return mvarEnabled; } set { mvarEnabled = value; } } + + private DateTime mvarDateCreated = DateTime.Now; + public DateTime DateCreated { get { return mvarDateCreated; } set { mvarDateCreated = value; } } + + private TimeSpan mvarJobTime = TimeSpan.Zero; + public TimeSpan JobTime { get { return mvarJobTime; } set { mvarJobTime = value; } } + + private string mvarSoftwareID = String.Empty; + public string SoftwareID { get { return mvarSoftwareID; } set { mvarSoftwareID = value; } } + + private string mvarVersionString = String.Empty; + public string VersionString { get { return mvarVersionString; } set { mvarVersionString = value; } } + + private Color mvarColorKey = Color.Empty; + public Color ColorKey { get { return mvarColorKey; } set { mvarColorKey = value; } } + + private int mvarPixelAspectRatioNumerator = 0; + public int PixelAspectRatioNumerator { get { return mvarPixelAspectRatioNumerator; } set { mvarPixelAspectRatioNumerator = value; } } + + private int mvarPixelAspectRatioDenominator = 0; + public int PixelAspectRatioDenominator { get { return mvarPixelAspectRatioDenominator; } set { mvarPixelAspectRatioDenominator = value; } } + + private int mvarGammaNumerator = 0; + public int GammaNumerator { get { return mvarGammaNumerator; } set { mvarGammaNumerator = value; } } + + private int mvarGammaDenominator = 0; + public int GammaDenominator { get { return mvarGammaDenominator; } set { mvarGammaDenominator = value; } } + + private List mvarScanLineTable = new List(); + public List ScanLineTable { get { return mvarScanLineTable; } } + + private List mvarColorCorrectionTable = new List(); + public List ColorCorrectionTable { get { return mvarColorCorrectionTable; } } + + private int mvarAttributesType = 0; + public int AttributesType { get { return mvarAttributesType; } set { mvarAttributesType = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFirstPixelDestination.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFirstPixelDestination.cs new file mode 100644 index 00000000..28553533 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFirstPixelDestination.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + /// + /// Screen destination of first pixel based on the VerticalTransferOrder and HorizontalTransferOrder. + /// + public enum TargaFirstPixelDestination + { + /// + /// Unknown first pixel destination. + /// + Unknown = 0, + /// + /// First pixel destination is the top-left corner of the image. + /// + TopLeft = 1, + /// + /// First pixel destination is the top-right corner of the image. + /// + TopRight = 2, + /// + /// First pixel destination is the bottom-left corner of the image. + /// + BottomLeft = 3, + /// + /// First pixel destination is the bottom-right corner of the image. + /// + BottomRight = 4 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaHorizontalTransferOrder.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaHorizontalTransferOrder.cs new file mode 100644 index 00000000..72d9596e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaHorizontalTransferOrder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + /// + /// The left-to-right ordering in which pixel data is transferred from the file to the screen. + /// + public enum TargaHorizontalTransferOrder + { + /// + /// Unknown transfer order. + /// + Unknown = -1, + /// + /// Transfer order of pixels is from the right to left. + /// + RightToLeft = 0, + /// + /// Transfer order of pixels is from the left to right. + /// + LeftToRight = 1 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaImageType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaImageType.cs new file mode 100644 index 00000000..383cb202 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaImageType.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + /// + /// The type of image read from the file. + /// + public enum TargaImageType + { + /// + /// No image data was found in file. + /// + None = 0, + /// + /// Image is an uncompressed, indexed color-mapped image. + /// + UncompressedIndexed = 1, + /// + /// Image is an uncompressed, RGB image. + /// + UncompressedTrueColor = 2, + /// + /// Image is an uncompressed, grayscale image. + /// + UncompressedGrayscale = 3, + /// + /// Image is a compressed, indexed color-mapped image. + /// + CompressedIndexed = 9, + /// + /// Image is a compressed, RGB image. + /// + CompressedTrueColor = 10, + /// + /// Image is a compressed, grayscale image. + /// + CompressedGrayscale = 11 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaRLEPacketType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaRLEPacketType.cs new file mode 100644 index 00000000..771ff387 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaRLEPacketType.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + /// + /// The RLE packet type used in a RLE compressed image. + /// + public enum TargaRLEPacketType + { + /// + /// A raw RLE packet type. + /// + Uncompressed = 0, + /// + /// A run-length RLE packet type. + /// + Compressed = 1 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaVerticalTransferOrder.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaVerticalTransferOrder.cs new file mode 100644 index 00000000..37b83dac --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaVerticalTransferOrder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + /// + /// The top-to-bottom ordering in which pixel data is transferred from the file to the screen. + /// + public enum TargaVerticalTransferOrder + { + /// + /// Unknown transfer order. + /// + Unknown = -1, + /// + /// Transfer order of pixels is from the bottom to top. + /// + BottomToTop = 0, + /// + /// Transfer order of pixels is from the top to bottom. + /// + TopToBottom = 1 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs new file mode 100644 index 00000000..f7ea1a14 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs @@ -0,0 +1,1179 @@ + using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + public class TrueVisionTGADataFormat : DataFormat + { + private const int HEADER_BYTE_LENGTH = 18; + private const int FOOTER_BYTE_LENGTH = 26; + + private const int EXTENSION_AREA_AUTHOR_NAME_LENGTH = 41; + private const int EXTENSION_AREA_AUTHOR_COMMENTS_LENGTH = 324; + private const int EXTENSION_AREA_JOB_NAME_LENGTH = 41; + private const int EXTENSION_AREA_SOFTWARE_ID_LENGTH = 41; + private const int EXTENSION_AREA_SOFTWARE_VERSION_LETTER_LENGTH = 1; + private const int EXTENSION_AREA_COLOR_CORRECTION_TABLE_VALUE_LENGTH = 41; + + private TargaExtensionArea mvarExtensionArea = new TargaExtensionArea(); + public TargaExtensionArea ExtensionArea { get { return mvarExtensionArea; } } + + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.Add("image/x-targa"); + dfr.ContentTypes.Add("image/x-tga"); + return dfr; + } + + private int mvarFormatVersion = 100; // ORIGINAL_TGA + public int FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + private int GetImageDataOffset(int colorMapLength, byte imageIDLength, byte colorMapEntrySize) + { + // calculate the image data offset + + // start off with the number of bytes holding the header info. + int intImageDataOffset = HEADER_BYTE_LENGTH; + + // add the Image ID length (could be variable) + intImageDataOffset += imageIDLength; + + // determine the number of bytes for each Color Map entry + int Bytes = 0; + switch (colorMapEntrySize) + { + case 15: + Bytes = 2; + break; + case 16: + Bytes = 2; + break; + case 24: + Bytes = 3; + break; + case 32: + Bytes = 4; + break; + } + + // add the length of the color map + intImageDataOffset += ((int)colorMapLength * (int)Bytes); + + // return result + return intImageDataOffset; + } + + private byte mvarPixelDepth = 0; + public byte PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + + public int BytesPerPixel + { + get { return (int)(mvarPixelDepth / 8); } + set + { + if ((value * 8) > 255) + { + throw new ArgumentOutOfRangeException("Bytes per pixel exceeds maximum allowed bits per pixel depth of 255"); + } + mvarPixelDepth = (byte)(value * 8); + } + } + + + private int mvarPadding = 0; + + private TargaImageType mvarImageType = TargaImageType.None; + public TargaImageType ImageType + { + get { return mvarImageType; } + set { mvarImageType = value; } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + short imageWidth = 0; + short imageHeight = 0; + int extensionAreaOffset = 0; + int developerDirectoryOffset = 0; + TargaVerticalTransferOrder verticalTransferOrder = TargaVerticalTransferOrder.Unknown; + TargaHorizontalTransferOrder horizontalTransferOrder = TargaHorizontalTransferOrder.Unknown; + int imageDataOffset = 0; + + if (br.Accessor.Length < 18) throw new InvalidDataFormatException("File must be at least 18 bytes"); + + #region Targa Footer + { + // set the cursor at the beginning of the signature string. + br.Accessor.Seek((-1 * HEADER_BYTE_LENGTH), SeekOrigin.End); + + // read the signature bytes and convert to ASCII string + string Signature = br.ReadNullTerminatedString(16); + + // do we have a proper signature + if (Signature == "TRUEVISION-XFILE") + { + // this is a NEW targa file. + mvarFormatVersion = 200; + + // set cursor to beginning of footer info + br.Accessor.Seek((-1 * FOOTER_BYTE_LENGTH), SeekOrigin.End); + + // read the Extension Area Offset value + extensionAreaOffset = br.ReadInt32(); + + // read the Developer Directory Offset value + developerDirectoryOffset = br.ReadInt32(); + + // skip the signature we have already read it. + string Signature2 = br.ReadNullTerminatedString(16); + + // set all values to our TargaFooter class + // this.objTargaFooter.SetExtensionAreaOffset(ExtOffset); + // this.objTargaFooter.SetDeveloperDirectoryOffset(DevDirOff); + // this.objTargaFooter.SetSignature(Signature); + // this.objTargaFooter.SetReservedCharacter(ResChar); + } + else + { + // this is not an ORIGINAL targa file. + mvarFormatVersion = 100; + } + } + #endregion + #region Targa Header + { + // set the cursor at the beginning of the file. + br.Accessor.Seek(0, SeekOrigin.Begin); + + // read the header properties from the file + byte imageIDLength = br.ReadByte(); + bool colorMapEnabled = br.ReadBoolean(); + mvarImageType = (TargaImageType)br.ReadByte(); + + short colorMapFirstEntryIndex = br.ReadInt16(); + short colorMapLength = br.ReadInt16(); + byte colorMapEntrySize = br.ReadByte(); + + short originX = br.ReadInt16(); + short originY = br.ReadInt16(); + imageWidth = br.ReadInt16(); + imageHeight = br.ReadInt16(); + + pic.Width = imageWidth; + pic.Height = imageHeight; + + mvarPixelDepth = br.ReadByte(); + switch (mvarPixelDepth) + { + case 8: + case 16: + case 24: + case 32: + break; + default: + throw new InvalidOperationException("Targa image file format only supports 8, 16, 24, or 32 bit pixel depths"); + } + + + byte ImageDescriptor = br.ReadByte(); + int attributeBits = ImageDescriptor.GetBits(0, 4); + + verticalTransferOrder = (TargaVerticalTransferOrder)ImageDescriptor.GetBits(5, 1); + horizontalTransferOrder = (TargaHorizontalTransferOrder)ImageDescriptor.GetBits(4, 1); + + // load ImageID value if any + if (imageIDLength > 0) + { + string ImageID = br.ReadNullTerminatedString(imageIDLength); + } + + imageDataOffset = GetImageDataOffset(colorMapLength, imageIDLength, colorMapEntrySize); + + #region Load Colormap + { + // load color map if it's included and/or needed + // Only needed for UNCOMPRESSED_COLOR_MAPPED and RUN_LENGTH_ENCODED_COLOR_MAPPED + // image types. If color map is included for other file types we can ignore it. + if (colorMapEnabled) + { + if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + { + if (colorMapLength > 0) + { + for (int i = 0; i < colorMapLength; i++) + { + int a = 0; + int r = 0; + int g = 0; + int b = 0; + + // load each color map entry based on the ColorMapEntrySize value + switch (colorMapEntrySize) + { + case 15: + { + byte[] color15 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + pic.ColorMap.Add(GetColorFrom2Bytes(color15[1], color15[0])); + break; + } + case 16: + { + byte[] color16 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + pic.ColorMap.Add(GetColorFrom2Bytes(color16[1], color16[0])); + break; + } + case 24: + { + b = Convert.ToInt32(br.ReadByte()); + g = Convert.ToInt32(br.ReadByte()); + r = Convert.ToInt32(br.ReadByte()); + pic.ColorMap.Add(Color.FromRGBA(r, g, b)); + break; + } + case 32: + { + a = Convert.ToInt32(br.ReadByte()); + b = Convert.ToInt32(br.ReadByte()); + g = Convert.ToInt32(br.ReadByte()); + r = Convert.ToInt32(br.ReadByte()); + pic.ColorMap.Add(Color.FromRGBA(a, r, g, b)); + break; + } + default: + { + throw new ArgumentOutOfRangeException("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); + } + } + + + } + } + else + { + throw new InvalidOperationException("Image Type requires a Color Map and Color Map Length is zero."); + } + } + + + } + else + { + if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + { + throw new InvalidOperationException("Indexed image type requires a colormap and there was not a colormap included in the file."); + } + } + } + #endregion + } + #endregion + #region Targa extension area + { + // is there an Extension Area in file + if (!br.EndOfStream && (extensionAreaOffset > 0)) + { + mvarExtensionArea.Enabled = true; + + // set the cursor at the beginning of the Extension Area using ExtensionAreaOffset. + br.Accessor.Seek(extensionAreaOffset, SeekOrigin.Begin); + + // load the extension area fields from the file + + short extensionAreaSize = br.ReadInt16(); + string authorName = br.ReadNullTerminatedString(EXTENSION_AREA_AUTHOR_NAME_LENGTH); + string authorComments = br.ReadNullTerminatedString(EXTENSION_AREA_AUTHOR_COMMENTS_LENGTH); + + + // get the date/time stamp of the file + short iMonth = br.ReadInt16(); + short iDay = br.ReadInt16(); + short iYear = br.ReadInt16(); + short iHour = br.ReadInt16(); + short iMinute = br.ReadInt16(); + short iSecond = br.ReadInt16(); + DateTime dtstamp; + string strStamp = iMonth.ToString() + @"/" + iDay.ToString() + @"/" + iYear.ToString() + @" "; + strStamp += iHour.ToString() + @":" + iMinute.ToString() + @":" + iSecond.ToString(); + if (DateTime.TryParse(strStamp, out dtstamp) == true) + { + mvarExtensionArea.DateCreated = dtstamp; + } + + + string JobName = br.ReadNullTerminatedString(EXTENSION_AREA_JOB_NAME_LENGTH); + + + // get the job time of the file + iHour = br.ReadInt16(); + iMinute = br.ReadInt16(); + iSecond = br.ReadInt16(); + TimeSpan ts = new TimeSpan((int)iHour, (int)iMinute, (int)iSecond); + mvarExtensionArea.JobTime = ts; + + string softwareID = br.ReadNullTerminatedString(EXTENSION_AREA_SOFTWARE_ID_LENGTH); + mvarExtensionArea.SoftwareID = softwareID; + + + // get the version number and letter from file + short sVersionNumber = br.ReadInt16(); + float iVersionNumber = (float)sVersionNumber / 100.0F; + + string strVersionLetter = br.ReadNullTerminatedString(EXTENSION_AREA_SOFTWARE_VERSION_LETTER_LENGTH); + + mvarExtensionArea.VersionString = (iVersionNumber.ToString(@"F2") + strVersionLetter); + + + // get the color key of the file + int a = (int)br.ReadByte(); + int r = (int)br.ReadByte(); + int b = (int)br.ReadByte(); + int g = (int)br.ReadByte(); + mvarExtensionArea.ColorKey = (Color.FromRGBA(a, r, g, b)); + + + mvarExtensionArea.PixelAspectRatioNumerator = (int)br.ReadInt16(); + mvarExtensionArea.PixelAspectRatioDenominator = (int)br.ReadInt16(); + mvarExtensionArea.GammaNumerator = (int)br.ReadInt16(); + mvarExtensionArea.GammaDenominator = (int)br.ReadInt16(); + + int extensionAreaColorCorrectionOffset = br.ReadInt32(); + int extensionAreaPostageStampOffset = br.ReadInt32(); + int extensionAreaScanLineOffset = br.ReadInt32(); + mvarExtensionArea.AttributesType = (int)br.ReadByte(); + + + // load Scan Line Table from file if any + if (extensionAreaScanLineOffset > 0) + { + br.Accessor.Seek(extensionAreaScanLineOffset, SeekOrigin.Begin); + for (int i = 0; i < imageHeight; i++) + { + mvarExtensionArea.ScanLineTable.Add(br.ReadInt32()); + } + } + + + // load Color Correction Table from file if any + if (extensionAreaColorCorrectionOffset > 0) + { + br.Accessor.Seek(extensionAreaColorCorrectionOffset, SeekOrigin.Begin); + for (int i = 0; i < EXTENSION_AREA_COLOR_CORRECTION_TABLE_VALUE_LENGTH; i++) + { + a = (int)br.ReadInt16(); + r = (int)br.ReadInt16(); + b = (int)br.ReadInt16(); + g = (int)br.ReadInt16(); + mvarExtensionArea.ColorCorrectionTable.Add(Color.FromRGBA(a, r, g, b)); + } + } + } + } + #endregion + #region Targa image + { + //************** NOTE ******************* + // The memory allocated for Microsoft Bitmaps must be aligned on a 32bit boundary. + // The stride refers to the number of bytes allocated for one scanline of the bitmap. + // In your loop, you copy the pixels one scanline at a time and take into + // consideration the amount of padding that occurs due to memory alignment. + // calculate the stride, in bytes, of the image (32bit aligned width of each image row) + int intStride = (((int)imageWidth * (int)mvarPixelDepth + 31) & ~31) >> 3; // width in bytes + + // calculate the padding, in bytes, of the image + // number of bytes to add to make each row a 32bit aligned row + // padding in bytes + mvarPadding = intStride - ((((int)imageWidth * (int)mvarPixelDepth) + 7) / 8); + + // get the image data bytes + byte[] bimagedata = null; + + #region Image Data Bytes + { + + // read the image data into a byte array + // take into account stride has to be a multiple of 4 + // use padding to make sure multiple of 4 + + byte[] data = null; + + // padding bytes + byte[] padding = new byte[mvarPadding]; + System.IO.MemoryStream msData = null; + + // seek to the beginning of the image data using the ImageDataOffset value + br.Accessor.Seek(imageDataOffset, SeekOrigin.Begin); + + + // get the size in bytes of each row in the image + int intImageRowByteSize = (int)pic.Width * ((int)BytesPerPixel); + + // get the size in bytes of the whole image + int intImageByteSize = intImageRowByteSize * (int)pic.Height; + + List> rows = new List>(); + + // is this a RLE compressed image type + #region COMPRESSED + if (mvarImageType == TargaImageType.CompressedGrayscale || mvarImageType == TargaImageType.CompressedIndexed || mvarImageType == TargaImageType.CompressedTrueColor) + { + // RLE Packet info + byte bRLEPacket = 0; + int intRLEPacketType = -1; + int intRLEPixelCount = 0; + byte[] bRunLengthPixel = null; + + // used to keep track of bytes read + int intImageBytesRead = 0; + int intImageRowBytesRead = 0; + + List row = new List(); + + // keep reading until we have the all image bytes + while (intImageBytesRead < intImageByteSize) + { + // get the RLE packet + bRLEPacket = br.ReadByte(); + intRLEPacketType = bRLEPacket.GetBits(7, 1); + intRLEPixelCount = bRLEPacket.GetBits(0, 7) + 1; + + // check the RLE packet type + if ((TargaRLEPacketType)intRLEPacketType == TargaRLEPacketType.Compressed) + { + // get the pixel color data + bRunLengthPixel = br.ReadBytes(BytesPerPixel); + + // add the number of pixels specified using the read pixel color + for (int i = 0; i < intRLEPixelCount; i++) + { + foreach (byte b in bRunLengthPixel) + { + row.Add(b); + } + + // increment the byte counts + intImageRowBytesRead += bRunLengthPixel.Length; + intImageBytesRead += bRunLengthPixel.Length; + + // if we have read a full image row + // add the row to the row list and clear it + // restart row byte count + if (intImageRowBytesRead == intImageRowByteSize) + { + rows.Add(row); + row = new List(); + intImageRowBytesRead = 0; + } + } + } + else if ((TargaRLEPacketType)intRLEPacketType == TargaRLEPacketType.Uncompressed) + { + // get the number of bytes to read based on the read pixel count + int intBytesToRead = intRLEPixelCount * (int)BytesPerPixel; + + // read each byte + for (int i = 0; i < intBytesToRead; i++) + { + row.Add(br.ReadByte()); + + // increment the byte counts + intImageBytesRead++; + intImageRowBytesRead++; + + // if we have read a full image row + // add the row to the row list and clear it + // restart row byte count + if (intImageRowBytesRead == intImageRowByteSize) + { + rows.Add(row); + row = new System.Collections.Generic.List(); + intImageRowBytesRead = 0; + } + } + } + } + } + #endregion + #region NON-COMPRESSED + else + { + + // loop through each row in the image + for (int i = 0; i < (int)imageHeight; i++) + { + // create a new row + System.Collections.Generic.List row = new System.Collections.Generic.List(); + + // loop through each byte in the row + for (int j = 0; j < intImageRowByteSize; j++) + { + // add the byte to the row + row.Add(br.ReadByte()); + } + + // add row to the list of rows + rows.Add(row); + } + } + #endregion + + // flag that states whether or not to reverse the location of all rows. + bool blnRowsReverse = false; + + // flag that states whether or not to reverse the bytes in each row. + bool blnEachRowReverse = false; + + // use FirstPixelDestination to determine the alignment of the + // image data byte + switch (GetFirstPixelDestination(verticalTransferOrder, horizontalTransferOrder)) + { + case TargaFirstPixelDestination.TopLeft: + { + blnRowsReverse = false; + blnEachRowReverse = true; + break; + } + case TargaFirstPixelDestination.TopRight: + { + blnRowsReverse = false; + blnEachRowReverse = false; + break; + } + case TargaFirstPixelDestination.BottomLeft: + { + blnRowsReverse = true; + blnEachRowReverse = true; + break; + } + case TargaFirstPixelDestination.BottomRight: + case TargaFirstPixelDestination.Unknown: + { + blnRowsReverse = true; + blnEachRowReverse = false; + break; + } + } + + // write the bytes from each row into a memory stream and get the + // resulting byte array + using (msData = new System.IO.MemoryStream()) + { + // do we reverse the rows in the row list. + if (blnRowsReverse == true) + { + rows.Reverse(); + } + + // go through each row + for (int i = 0; i < rows.Count; i++) + { + // do we reverse the bytes in the row + if (blnEachRowReverse == true) + { + rows[i].Reverse(); + } + + // get the byte array for the row + byte[] brow = rows[i].ToArray(); + + // write the row bytes and padding bytes to the memory streem + msData.Write(brow, 0, brow.Length); + msData.Write(padding, 0, padding.Length); + } + + // get the image byte array + data = msData.ToArray(); + + int x = 0, y = 0; + for (int z = 0; z < data.Length; z += 3) + { + int r = data[z + 2]; + int g = data[z + 1]; + int b = data[z]; + int a = 255; + + if (mvarPixelDepth == 32) + { + a = data[z + 3]; + z++; + } + + Color color = Color.FromRGBA(r, g, b, a); + pic.SetPixel(color, x, y); + + x++; + if (x == imageWidth) + { + x = 0; + y++; + + if (y == imageHeight) + { + break; + } + } + } + } + } + #endregion + } + #endregion + } + + private TargaFirstPixelDestination GetFirstPixelDestination(TargaVerticalTransferOrder verticalTransferOrder, TargaHorizontalTransferOrder horizontalTransferOrder) + { + if (verticalTransferOrder == TargaVerticalTransferOrder.Unknown || horizontalTransferOrder == TargaHorizontalTransferOrder.Unknown) + { + return TargaFirstPixelDestination.Unknown; + } + else if (verticalTransferOrder == TargaVerticalTransferOrder.BottomToTop && horizontalTransferOrder == TargaHorizontalTransferOrder.LeftToRight) + { + return TargaFirstPixelDestination.BottomLeft; + } + else if (verticalTransferOrder == TargaVerticalTransferOrder.BottomToTop && horizontalTransferOrder == TargaHorizontalTransferOrder.RightToLeft) + { + return TargaFirstPixelDestination.BottomRight; + } + else if (verticalTransferOrder == TargaVerticalTransferOrder.TopToBottom && horizontalTransferOrder == TargaHorizontalTransferOrder.LeftToRight) + { + return TargaFirstPixelDestination.TopLeft; + } + return TargaFirstPixelDestination.TopRight; + } + + + /// + /// Reads ARGB values from the 16 bits of two given Bytes in a 1555 format. + /// + /// The first Byte. + /// The Second Byte. + /// A Color with a ARGB values read from the two given Bytes + /// + /// Gets the ARGB values from the 16 bits in the two bytes based on the below diagram + /// | BYTE 1 | BYTE 2 | + /// | A RRRRR GG | GGG BBBBB | + /// + private static Color GetColorFrom2Bytes(byte one, byte two) + { + // get the 5 bits used for the RED value from the first byte + int r1 = one.GetBits(2, 5); + int r = r1 << 3; + + // get the two high order bits for GREEN from the from the first byte + int bit = one.GetBits(0, 2); + // shift bits to the high order + int g1 = bit << 6; + + // get the 3 low order bits for GREEN from the from the second byte + bit = two.GetBits(5, 3); + // shift the low order bits + int g2 = bit << 3; + // add the shifted values together to get the full GREEN value + int g = g1 + g2; + + // get the 5 bits used for the BLUE value from the second byte + int b1 = two.GetBits(0, 5); + int b = b1 << 3; + + // get the 1 bit used for the ALPHA value from the first byte + int a1 = one.GetBits(7, 1); + int a = a1 * 255; + + // return the resulting Color + return Color.FromRGBA(a, r, g, b); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + IO.Writer bw = base.Accessor.Writer; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + /* + #region Targa Header + { + // set the cursor at the beginning of the file. + br.Accessor.Seek(0, SeekOrigin.Begin); + + // read the header properties from the file + byte imageIDLength = br.ReadByte(); + bool colorMapEnabled = br.ReadBoolean(); + mvarImageType = (TargaImageType)br.ReadByte(); + + short colorMapFirstEntryIndex = br.ReadInt16(); + short colorMapLength = br.ReadInt16(); + byte colorMapEntrySize = br.ReadByte(); + + short originX = br.ReadInt16(); + short originY = br.ReadInt16(); + imageWidth = br.ReadInt16(); + imageHeight = br.ReadInt16(); + + pic.Width = imageWidth; + pic.Height = imageHeight; + + mvarPixelDepth = br.ReadByte(); + switch (mvarPixelDepth) + { + case 8: + case 16: + case 24: + case 32: + break; + default: + throw new InvalidOperationException("Targa image file format only supports 8, 16, 24, or 32 bit pixel depths"); + } + + + byte ImageDescriptor = br.ReadByte(); + int attributeBits = ImageDescriptor.GetBits(0, 4); + + verticalTransferOrder = (TargaVerticalTransferOrder)ImageDescriptor.GetBits(5, 1); + horizontalTransferOrder = (TargaHorizontalTransferOrder)ImageDescriptor.GetBits(4, 1); + + // load ImageID value if any + if (imageIDLength > 0) + { + string ImageID = br.ReadNullTerminatedString(imageIDLength); + } + + imageDataOffset = GetImageDataOffset(colorMapLength, imageIDLength, colorMapEntrySize); + + #region Load Colormap + { + // load color map if it's included and/or needed + // Only needed for UNCOMPRESSED_COLOR_MAPPED and RUN_LENGTH_ENCODED_COLOR_MAPPED + // image types. If color map is included for other file types we can ignore it. + if (colorMapEnabled) + { + if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + { + if (colorMapLength > 0) + { + for (int i = 0; i < colorMapLength; i++) + { + int a = 0; + int r = 0; + int g = 0; + int b = 0; + + // load each color map entry based on the ColorMapEntrySize value + switch (colorMapEntrySize) + { + case 15: + { + byte[] color15 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + pic.ColorMap.Add(GetColorFrom2Bytes(color15[1], color15[0])); + break; + } + case 16: + { + byte[] color16 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + pic.ColorMap.Add(GetColorFrom2Bytes(color16[1], color16[0])); + break; + } + case 24: + { + b = Convert.ToInt32(br.ReadByte()); + g = Convert.ToInt32(br.ReadByte()); + r = Convert.ToInt32(br.ReadByte()); + pic.ColorMap.Add(Color.FromRGBA(r, g, b)); + break; + } + case 32: + { + a = Convert.ToInt32(br.ReadByte()); + b = Convert.ToInt32(br.ReadByte()); + g = Convert.ToInt32(br.ReadByte()); + r = Convert.ToInt32(br.ReadByte()); + pic.ColorMap.Add(Color.FromRGBA(a, r, g, b)); + break; + } + default: + { + throw new ArgumentOutOfRangeException("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); + } + } + + + } + } + else + { + throw new InvalidOperationException("Image Type requires a Color Map and Color Map Length is zero."); + } + } + + + } + else + { + if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + { + throw new InvalidOperationException("Indexed image type requires a colormap and there was not a colormap included in the file."); + } + } + } + #endregion + } + #endregion + + #region Targa image + { + // ************** NOTE ******************* + // The memory allocated for Microsoft Bitmaps must be aligned on a 32bit boundary. + // The stride refers to the number of bytes allocated for one scanline of the bitmap. + // In your loop, you copy the pixels one scanline at a time and take into + // consideration the amount of padding that occurs due to memory alignment. + // calculate the stride, in bytes, of the image (32bit aligned width of each image row) + int intStride = (((int)pic.Width * (int)mvarPixelDepth + 31) & ~31) >> 3; // width in bytes + + // calculate the padding, in bytes, of the image + // number of bytes to add to make each row a 32bit aligned row + // padding in bytes + mvarPadding = intStride - ((((int)pic.Width * (int)mvarPixelDepth) + 7) / 8); + + // get the image data bytes + byte[] bimagedata = null; + + #region Image Data Bytes + { + + // read the image data into a byte array + // take into account stride has to be a multiple of 4 + // use padding to make sure multiple of 4 + + byte[] data = null; + + // padding bytes + byte[] padding = new byte[mvarPadding]; + System.IO.MemoryStream msData = null; + + // get the size in bytes of each row in the image + int intImageRowByteSize = (int)pic.Width * ((int)BytesPerPixel); + + // get the size in bytes of the whole image + int intImageByteSize = intImageRowByteSize * (int)pic.Height; + + List> rows = new List>(); + + // is this a RLE compressed image type + #region COMPRESSED + if (mvarImageType == TargaImageType.CompressedGrayscale || mvarImageType == TargaImageType.CompressedIndexed || mvarImageType == TargaImageType.CompressedTrueColor) + { + // RLE Packet info + byte bRLEPacket = 0; + int intRLEPacketType = -1; + int intRLEPixelCount = 0; + byte[] bRunLengthPixel = null; + + // used to keep track of bytes read + int intImageBytesRead = 0; + int intImageRowBytesRead = 0; + + List row = new List(); + + // keep reading until we have the all image bytes + while (intImageBytesRead < intImageByteSize) + { + // get the RLE packet + bRLEPacket = br.ReadByte(); + intRLEPacketType = bRLEPacket.GetBits(7, 1); + intRLEPixelCount = bRLEPacket.GetBits(0, 7) + 1; + + // check the RLE packet type + if ((TargaRLEPacketType)intRLEPacketType == TargaRLEPacketType.Compressed) + { + // get the pixel color data + bRunLengthPixel = br.ReadBytes(BytesPerPixel); + + // add the number of pixels specified using the read pixel color + for (int i = 0; i < intRLEPixelCount; i++) + { + foreach (byte b in bRunLengthPixel) + { + row.Add(b); + } + + // increment the byte counts + intImageRowBytesRead += bRunLengthPixel.Length; + intImageBytesRead += bRunLengthPixel.Length; + + // if we have read a full image row + // add the row to the row list and clear it + // restart row byte count + if (intImageRowBytesRead == intImageRowByteSize) + { + rows.Add(row); + row = new List(); + intImageRowBytesRead = 0; + } + } + } + else if ((TargaRLEPacketType)intRLEPacketType == TargaRLEPacketType.Uncompressed) + { + // get the number of bytes to read based on the read pixel count + int intBytesToRead = intRLEPixelCount * (int)BytesPerPixel; + + // read each byte + for (int i = 0; i < intBytesToRead; i++) + { + row.Add(br.ReadByte()); + + // increment the byte counts + intImageBytesRead++; + intImageRowBytesRead++; + + // if we have read a full image row + // add the row to the row list and clear it + // restart row byte count + if (intImageRowBytesRead == intImageRowByteSize) + { + rows.Add(row); + row = new System.Collections.Generic.List(); + intImageRowBytesRead = 0; + } + } + } + } + } + #endregion + #region NON-COMPRESSED + else + { + + // loop through each row in the image + for (int i = 0; i < (int)pic.Height; i++) + { + // create a new row + System.Collections.Generic.List row = new System.Collections.Generic.List(); + + // loop through each byte in the row + for (int j = 0; j < intImageRowByteSize; j++) + { + // add the byte to the row + row.Add(br.ReadByte()); + } + + // add row to the list of rows + rows.Add(row); + } + } + #endregion + + // flag that states whether or not to reverse the location of all rows. + bool blnRowsReverse = false; + + // flag that states whether or not to reverse the bytes in each row. + bool blnEachRowReverse = false; + + // use FirstPixelDestination to determine the alignment of the + // image data byte + switch (GetFirstPixelDestination(verticalTransferOrder, horizontalTransferOrder)) + { + case TargaFirstPixelDestination.TopLeft: + { + blnRowsReverse = false; + blnEachRowReverse = true; + break; + } + case TargaFirstPixelDestination.TopRight: + { + blnRowsReverse = false; + blnEachRowReverse = false; + break; + } + case TargaFirstPixelDestination.BottomLeft: + { + blnRowsReverse = true; + blnEachRowReverse = true; + break; + } + case TargaFirstPixelDestination.BottomRight: + case TargaFirstPixelDestination.Unknown: + { + blnRowsReverse = true; + blnEachRowReverse = false; + break; + } + } + + // write the bytes from each row into a memory stream and get the + // resulting byte array + using (msData = new System.IO.MemoryStream()) + { + // do we reverse the rows in the row list. + if (blnRowsReverse == true) + { + rows.Reverse(); + } + + // go through each row + for (int i = 0; i < rows.Count; i++) + { + // do we reverse the bytes in the row + if (blnEachRowReverse == true) + { + rows[i].Reverse(); + } + + // get the byte array for the row + byte[] brow = rows[i].ToArray(); + + // write the row bytes and padding bytes to the memory streem + msData.Write(brow, 0, brow.Length); + msData.Write(padding, 0, padding.Length); + } + + // get the image byte array + data = msData.ToArray(); + + int x = 0, y = 0; + for (int z = 0; z < data.Length; z += 3) + { + int r = data[z + 2]; + int g = data[z + 1]; + int b = data[z]; + int a = 255; + + if (mvarPixelDepth == 32) + { + a = data[z + 3]; + z++; + } + + Color color = Color.FromRGBA(a, r, g, b); + pic.SetPixel(color, x, y); + + x++; + if (x == pic.Width) + { + x = 0; + y++; + + if (y == pic.Height) + { + break; + } + } + } + } + } + #endregion + } + #endregion + #region Targa extension area + { + // is there an Extension Area in file + if (mvarExtensionArea.Enabled) + { + short extensionAreaSize = 164; + bw.Write(extensionAreaSize); + + bw.WriteFixedLengthString(mvarExtensionArea.AuthorName, EXTENSION_AREA_AUTHOR_NAME_LENGTH); + bw.WriteFixedLengthString(mvarExtensionArea.AuthorComments, EXTENSION_AREA_AUTHOR_NAME_LENGTH); + + bw.Write((short)mvarExtensionArea.DateCreated.Month); + bw.Write((short)mvarExtensionArea.DateCreated.Day); + bw.Write((short)mvarExtensionArea.DateCreated.Year); + bw.Write((short)mvarExtensionArea.DateCreated.Hour); + bw.Write((short)mvarExtensionArea.DateCreated.Minute); + bw.Write((short)mvarExtensionArea.DateCreated.Second); + + bw.WriteFixedLengthString(mvarExtensionArea.JobName, EXTENSION_AREA_JOB_NAME_LENGTH); + + bw.Write((short)mvarExtensionArea.JobTime.Hours); + bw.Write((short)mvarExtensionArea.JobTime.Minutes); + bw.Write((short)mvarExtensionArea.JobTime.Seconds); + + bw.WriteFixedLengthString(mvarExtensionArea.SoftwareID, EXTENSION_AREA_SOFTWARE_ID_LENGTH); + + // get the version number and letter from file + float iVersionNumber = 1.0f; + short sVersionNumber = (short)(iVersionNumber * 100.0F); + bw.Write(sVersionNumber); + bw.Write((char)'A'); + // bw.WriteFixedLengthString(mvarExtensionArea.VersionString.Substring(mvarExtensionArea.VersionString.Length - 1, 1)); + // mvarExtensionArea.VersionString = (iVersionNumber.ToString(@"F2") + strVersionLetter); + + + // get the color key of the file + bw.Write((byte)(mvarExtensionArea.ColorKey.Alpha * 255)); + bw.Write((byte)(mvarExtensionArea.ColorKey.Red * 255)); + bw.Write((byte)(mvarExtensionArea.ColorKey.Blue * 255)); + bw.Write((byte)(mvarExtensionArea.ColorKey.Green * 255)); + + + bw.Write((short)mvarExtensionArea.PixelAspectRatioNumerator); + bw.Write((short)mvarExtensionArea.PixelAspectRatioDenominator); + bw.Write((short)mvarExtensionArea.GammaNumerator); + bw.Write((short)mvarExtensionArea.GammaDenominator); + + + int extensionAreaColorCorrectionOffset = 0; + bw.Write(extensionAreaColorCorrectionOffset); + int extensionAreaPostageStampOffset = 0; + bw.Write(extensionAreaPostageStampOffset); + int extensionAreaScanLineOffset = 0; + bw.Write(extensionAreaScanLineOffset); + bw.Write((byte)mvarExtensionArea.AttributesType); + + // load Scan Line Table from file if any + if (extensionAreaScanLineOffset > 0) + { + br.Accessor.Seek(extensionAreaScanLineOffset, SeekOrigin.Begin); + for (int i = 0; i < imageHeight; i++) + { + mvarExtensionArea.ScanLineTable.Add(br.ReadInt32()); + } + } + + + // load Color Correction Table from file if any + if (extensionAreaColorCorrectionOffset > 0) + { + br.Accessor.Seek(extensionAreaColorCorrectionOffset, SeekOrigin.Begin); + for (int i = 0; i < EXTENSION_AREA_COLOR_CORRECTION_TABLE_VALUE_LENGTH; i++) + { + a = (int)br.ReadInt16(); + r = (int)br.ReadInt16(); + b = (int)br.ReadInt16(); + g = (int)br.ReadInt16(); + mvarExtensionArea.ColorCorrectionTable.Add(Color.FromRGBA(a, r, g, b)); + } + } + } + } + #endregion + #region Targa Footer + { + if (mvarFormatVersion == 200) + { + int extensionAreaOffset = 0; + bw.Write(extensionAreaOffset); + + int developerDirectoryOffset = 0; + bw.Write(developerDirectoryOffset); + + bw.WriteFixedLengthString("TRUEVISION-XFILE"); + } + } + #endregion + bw.Flush(); + */ + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/Constants.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/Constants.cs new file mode 100644 index 00000000..af3ea448 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/Constants.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization.Internal +{ + public static class Constants + { + /*used to "mask out" n number of bits from data stream*/ + public static int[] BITMASK = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; + + public const int MAX_DHT_TABLES = 8; + public const int MAX_HUFFBITS = 16; + public const int MAX_HUFFCOUNTS_WSQ = 256; + + public const int W_TREELEN = 20; + public const int Q_TREELEN = 64; + + /* WSQ Marker Definitions */ + public const int SOI_WSQ = 0xffa0; + public const int EOI_WSQ = 0xffa1; + public const int SOF_WSQ = 0xffa2; + public const int SOB_WSQ = 0xffa3; + public const int DTT_WSQ = 0xffa4; + public const int DQT_WSQ = 0xffa5; + public const int DHT_WSQ = 0xffa6; + public const int DRT_WSQ = 0xffa7; + public const int COM_WSQ = 0xffa8; + + public const int STRT_SUBBAND_2 = 19; + public const int STRT_SUBBAND_3 = 52; + public const int MAX_SUBBANDS = 64; + public const int NUM_SUBBANDS = 60; + public const int STRT_SUBBAND_DEL = NUM_SUBBANDS; + public const int STRT_SIZE_REGION_2 = 4; + public const int STRT_SIZE_REGION_3 = 51; + + /* Case for getting ANY marker. */ + public const int ANY_WSQ = 0xffff; + public const int TBLS_N_SOF = 2; + public const int TBLS_N_SOB = TBLS_N_SOF + 2; + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs new file mode 100644 index 00000000..7bd0c935 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization +{ + public struct WavletTree + { + public int x; + public int y; + public int lenx; + public int leny; + public int invrw; + public int invcl; + } + + public struct TableDTT + { + public float[] lofilt; + public float[] hifilt; + public int losz; + public int hisz; + public int lodef; + public int hidef; + } + + public struct HuffCode + { + public int size; + public int code; + } + + public struct HeaderFrm + { + public int black; + public int white; + public int width; + public int height; + public float mShift; + public float rScale; + public int wsqEncoder; + public int software; + } + + public struct HuffmanTable + { + public int tableLen; + public int bytesLeft; + public int tableId; + public int[] huffbits; + public int[] huffvalues; + } + + public class TableDHT + { + private const int MAX_HUFFBITS = 16; /*DO NOT CHANGE THIS CONSTANT!! */ + private const int MAX_HUFFCOUNTS_WSQ = 256; /* Length of code table: change as needed */ + + public byte tabdef; + public int[] huffbits = new int[MAX_HUFFBITS]; + public int[] huffvalues = new int[MAX_HUFFCOUNTS_WSQ + 1]; + } + + public class Table_DQT + { + public const int MAX_SUBBANDS = 64; + public float binCenter; + public float[] qBin = new float[MAX_SUBBANDS]; + public float[] zBin = new float[MAX_SUBBANDS]; + public int dqtDef; + } + + public class QuantTree + { + public int x; /* UL corner of block */ + public int y; + public int lenx; /* block size */ + public int leny; /* block size */ + } + + public class IntRef + { + public int value; + + + public IntRef() + { + } + + public IntRef(int value) + { + this.value = value; + } + } + + internal class Token + { + public TableDHT[] tableDHT; + public TableDTT tableDTT; + public Table_DQT tableDQT; + + public WavletTree[] wtree; + public QuantTree[] qtree; + + + public byte[] buffer; + public int pointer; + + public Token(byte[] buffer) + { + this.buffer = buffer; + this.pointer = 0; + } + + public void initialize() + { + tableDTT = new TableDTT(); + tableDQT = new Table_DQT(); + + /* Init DHT Tables to 0. */ + tableDHT = new TableDHT[Internal.Constants.MAX_DHT_TABLES]; + for (int i = 0; i < Internal.Constants.MAX_DHT_TABLES; i++) + { + tableDHT[i] = new TableDHT(); + tableDHT[i].tabdef = 0; + } + } + + public long readInt() + { + byte byte1 = buffer[pointer++]; + byte byte2 = buffer[pointer++]; + byte byte3 = buffer[pointer++]; + byte byte4 = buffer[pointer++]; + + return (0xffL & byte1) << 24 | (0xffL & byte2) << 16 | (0xffL & byte3) << 8 | (0xffL & byte4); + } + + public int readShort() + { + int byte1 = buffer[pointer++]; + int byte2 = buffer[pointer++]; + + return (0xff & byte1) << 8 | (0xff & byte2); + } + + public int readByte() + { + byte byte1 = buffer[pointer++]; + + return 0xff & byte1; + } + + public byte[] readBytes(int size) + { + byte[] bytes = new byte[size]; + + for (int i = 0; i < size; i++) + { + bytes[i] = buffer[pointer++]; + } + + return bytes; + } + } + + //public class Bitmap + //{ + // private int width; + // private int height; + // private int ppi; + // private int depth; + // private int lossyflag; + + // private byte[] pixels; + // private int length; + + // public Bitmap(byte[] pixels, int width, int height, int ppi, int depth, int lossyflag) + // { + // this.pixels = pixels; + // this.length = pixels != null ? pixels.Length : 0; + + // this.width = width; + // this.height = height; + // this.ppi = ppi; + // this.depth = depth; + // this.lossyflag = lossyflag; + // } + + + // public int getWidth() + // { + // return width; + // } + + // public int getHeight() + // { + // return height; + // } + + // public int getPpi() + // { + // return ppi; + // } + + // public byte[] getPixels() + // { + // return pixels; + // } + + // public int getLength() + // { + // return length; + // } + + // public int getDepth() + // { + // return depth; + // } + + // public int getLossyflag() + // { + // return lossyflag; + // } + //} +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/WSQDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/WSQDataFormat.cs new file mode 100644 index 00000000..4da45aec --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WaveletScalarQuantization/WSQDataFormat.cs @@ -0,0 +1,1683 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.WaveletScalarQuantization +{ + public class WSQDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + private class WSQData + { + public static TableDHT[] tableDHT; + public static TableDTT tableDTT; + public static Table_DQT tableDQT; + + public static WavletTree[] wtree; + public static QuantTree[] qtree; + + public static void Initialize() + { + tableDTT = new TableDTT(); + tableDQT = new Table_DQT(); + + // Initialize DHT tables to 0 + tableDHT = new TableDHT[Internal.Constants.MAX_DHT_TABLES]; + for (int i = 0; i < Internal.Constants.MAX_DHT_TABLES; i++) + { + tableDHT[i] = new TableDHT(); + tableDHT[i].tabdef = 0; + } + } + } + + + private int intSign(int power) + { + /* "sign" power */ + int cnt; /* counter */ + int num = -1; /* sign return value */ + + if (power == 0) + { + return 1; + } + for (cnt = 1; cnt < power; cnt++) + { + num *= -1; + } + return num; + } + + private HuffmanTable getCHuffmanTable(IO.Reader br, int maxHuffcounts, int bytesLeft, bool readTableLen) + { + + HuffmanTable huffmanTable = new HuffmanTable(); + + /* table_len */ + if (readTableLen) + { + huffmanTable.tableLen = br.ReadInt16(); + huffmanTable.bytesLeft = huffmanTable.tableLen - 2; + bytesLeft = huffmanTable.bytesLeft; + } + else + { + huffmanTable.bytesLeft = bytesLeft; + } + + /* If no bytes left ... */ + if (bytesLeft <= 0) + { + throw new SystemException("ERROR : getCHuffmanTable : no huffman table bytes remaining"); + } + + /* Table ID */ + huffmanTable.tableId = br.ReadByte(); + huffmanTable.bytesLeft--; + + + huffmanTable.huffbits = new int[Internal.Constants.MAX_HUFFBITS]; + int numHufvals = 0; + /* L1 ... L16 */ + for (int i = 0; i < Internal.Constants.MAX_HUFFBITS; i++) + { + huffmanTable.huffbits[i] = br.ReadByte(); + numHufvals += huffmanTable.huffbits[i]; + } + huffmanTable.bytesLeft -= Internal.Constants.MAX_HUFFBITS; + + if (numHufvals > maxHuffcounts + 1) + { + throw new SystemException("ERROR : getCHuffmanTable : numHufvals is larger than MAX_HUFFCOUNTS"); + } + + // Could allocate only the amount needed ... then we wouldn't + // need to pass MAX_HUFFCOUNTS + huffmanTable.huffvalues = new int[maxHuffcounts + 1]; + + // V1,1 ... V16,16 + for (int i = 0; i < numHufvals; i++) + { + huffmanTable.huffvalues[i] = br.ReadByte(); + } + huffmanTable.bytesLeft -= numHufvals; + + return huffmanTable; + } + + private void wtree4(int start1, int start2, int lenx, int leny, int x, int y, int stop1) + { + int evenx, eveny; /* Check length of subband for even or odd */ + int p1, p2; /* w_tree locations for storing subband sizes and locations */ + + p1 = start1; + p2 = start2; + + evenx = lenx % 2; + eveny = leny % 2; + + WSQData.wtree[p1].x = x; + WSQData.wtree[p1].y = y; + WSQData.wtree[p1].lenx = lenx; + WSQData.wtree[p1].leny = leny; + + WSQData.wtree[p2].x = x; + WSQData.wtree[p2 + 2].x = x; + WSQData.wtree[p2].y = y; + WSQData.wtree[p2 + 1].y = y; + + if (evenx == 0) + { + WSQData.wtree[p2].lenx = lenx / 2; + WSQData.wtree[p2 + 1].lenx = WSQData.wtree[p2].lenx; + } + else + { + if (p1 == 4) + { + WSQData.wtree[p2].lenx = (lenx - 1) / 2; + WSQData.wtree[p2 + 1].lenx = WSQData.wtree[p2].lenx + 1; + } + else + { + WSQData.wtree[p2].lenx = (lenx + 1) / 2; + WSQData.wtree[p2 + 1].lenx = WSQData.wtree[p2].lenx - 1; + } + } + WSQData.wtree[p2 + 1].x = WSQData.wtree[p2].lenx + x; + if (stop1 == 0) + { + WSQData.wtree[p2 + 3].lenx = WSQData.wtree[p2 + 1].lenx; + WSQData.wtree[p2 + 3].x = WSQData.wtree[p2 + 1].x; + } + WSQData.wtree[p2 + 2].lenx = WSQData.wtree[p2].lenx; + + + if (eveny == 0) + { + WSQData.wtree[p2].leny = leny / 2; + WSQData.wtree[p2 + 2].leny = WSQData.wtree[p2].leny; + } + else + { + if (p1 == 5) + { + WSQData.wtree[p2].leny = (leny - 1) / 2; + WSQData.wtree[p2 + 2].leny = WSQData.wtree[p2].leny + 1; + } + else + { + WSQData.wtree[p2].leny = (leny + 1) / 2; + WSQData.wtree[p2 + 2].leny = WSQData.wtree[p2].leny - 1; + } + } + WSQData.wtree[p2 + 2].y = WSQData.wtree[p2].leny + y; + if (stop1 == 0) + { + WSQData.wtree[p2 + 3].leny = WSQData.wtree[p2 + 2].leny; + WSQData.wtree[p2 + 3].y = WSQData.wtree[p2 + 2].y; + } + WSQData.wtree[p2 + 1].leny = WSQData.wtree[p2].leny; + } + private void qtree16(int start, int lenx, int leny, int x, int y, int rw, int cl) + { + int tempx, temp2x; /* temporary x values */ + int tempy, temp2y; /* temporary y values */ + int evenx, eveny; /* Check length of subband for even or odd */ + int p; /* indicates subband information being stored */ + + p = start; + evenx = lenx % 2; + eveny = leny % 2; + + if (evenx == 0) + { + tempx = lenx / 2; + temp2x = tempx; + } + else + { + if (cl != 0) + { + temp2x = (lenx + 1) / 2; + tempx = temp2x - 1; + } + else + { + tempx = (lenx + 1) / 2; + temp2x = tempx - 1; + } + } + + if (eveny == 0) + { + tempy = leny / 2; + temp2y = tempy; + } + else + { + if (rw != 0) + { + temp2y = (leny + 1) / 2; + tempy = temp2y - 1; + } + else + { + tempy = (leny + 1) / 2; + temp2y = tempy - 1; + } + } + + evenx = tempx % 2; + eveny = tempy % 2; + + WSQData.qtree[p].x = x; + WSQData.qtree[p + 2].x = x; + WSQData.qtree[p].y = y; + WSQData.qtree[p + 1].y = y; + if (evenx == 0) + { + WSQData.qtree[p].lenx = tempx / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p].lenx; + } + else + { + WSQData.qtree[p].lenx = (tempx + 1) / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx - 1; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p + 1].lenx; + } + WSQData.qtree[p + 1].x = x + WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].x = WSQData.qtree[p + 1].x; + if (eveny == 0) + { + WSQData.qtree[p].leny = tempy / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 3].leny = WSQData.qtree[p].leny; + } + else + { + WSQData.qtree[p].leny = (tempy + 1) / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny - 1; + WSQData.qtree[p + 3].leny = WSQData.qtree[p + 2].leny; + } + WSQData.qtree[p + 2].y = y + WSQData.qtree[p].leny; + WSQData.qtree[p + 3].y = WSQData.qtree[p + 2].y; + + + evenx = temp2x % 2; + + WSQData.qtree[p + 4].x = x + tempx; + WSQData.qtree[p + 6].x = WSQData.qtree[p + 4].x; + WSQData.qtree[p + 4].y = y; + WSQData.qtree[p + 5].y = y; + WSQData.qtree[p + 6].y = WSQData.qtree[p + 2].y; + WSQData.qtree[p + 7].y = WSQData.qtree[p + 2].y; + WSQData.qtree[p + 4].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 5].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 6].leny = WSQData.qtree[p + 2].leny; + WSQData.qtree[p + 7].leny = WSQData.qtree[p + 2].leny; + if (evenx == 0) + { + WSQData.qtree[p + 4].lenx = temp2x / 2; + WSQData.qtree[p + 5].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 6].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 7].lenx = WSQData.qtree[p + 4].lenx; + } + else + { + WSQData.qtree[p + 5].lenx = (temp2x + 1) / 2; + WSQData.qtree[p + 4].lenx = WSQData.qtree[p + 5].lenx - 1; + WSQData.qtree[p + 6].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 7].lenx = WSQData.qtree[p + 5].lenx; + } + WSQData.qtree[p + 5].x = WSQData.qtree[p + 4].x + WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 7].x = WSQData.qtree[p + 5].x; + + + eveny = temp2y % 2; + + WSQData.qtree[p + 8].x = x; + WSQData.qtree[p + 9].x = WSQData.qtree[p + 1].x; + WSQData.qtree[p + 10].x = x; + WSQData.qtree[p + 11].x = WSQData.qtree[p + 1].x; + WSQData.qtree[p + 8].y = y + tempy; + WSQData.qtree[p + 9].y = WSQData.qtree[p + 8].y; + WSQData.qtree[p + 8].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 9].lenx = WSQData.qtree[p + 1].lenx; + WSQData.qtree[p + 10].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 11].lenx = WSQData.qtree[p + 1].lenx; + if (eveny == 0) + { + WSQData.qtree[p + 8].leny = temp2y / 2; + WSQData.qtree[p + 9].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 10].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 11].leny = WSQData.qtree[p + 8].leny; + } + else + { + WSQData.qtree[p + 10].leny = (temp2y + 1) / 2; + WSQData.qtree[p + 11].leny = WSQData.qtree[p + 10].leny; + WSQData.qtree[p + 8].leny = WSQData.qtree[p + 10].leny - 1; + WSQData.qtree[p + 9].leny = WSQData.qtree[p + 8].leny; + } + WSQData.qtree[p + 10].y = WSQData.qtree[p + 8].y + WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 11].y = WSQData.qtree[p + 10].y; + + + WSQData.qtree[p + 12].x = WSQData.qtree[p + 4].x; + WSQData.qtree[p + 13].x = WSQData.qtree[p + 5].x; + WSQData.qtree[p + 14].x = WSQData.qtree[p + 4].x; + WSQData.qtree[p + 15].x = WSQData.qtree[p + 5].x; + WSQData.qtree[p + 12].y = WSQData.qtree[p + 8].y; + WSQData.qtree[p + 13].y = WSQData.qtree[p + 8].y; + WSQData.qtree[p + 14].y = WSQData.qtree[p + 10].y; + WSQData.qtree[p + 15].y = WSQData.qtree[p + 10].y; + WSQData.qtree[p + 12].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 13].lenx = WSQData.qtree[p + 5].lenx; + WSQData.qtree[p + 14].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 15].lenx = WSQData.qtree[p + 5].lenx; + WSQData.qtree[p + 12].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 13].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 14].leny = WSQData.qtree[p + 10].leny; + WSQData.qtree[p + 15].leny = WSQData.qtree[p + 10].leny; + } + private void qtree4(int start, int lenx, int leny, int x, int y) + { + int evenx, eveny; /* Check length of subband for even or odd */ + int p; /* indicates subband information being stored */ + + p = start; + evenx = lenx % 2; + eveny = leny % 2; + + + WSQData.qtree[p].x = x; + WSQData.qtree[p + 2].x = x; + WSQData.qtree[p].y = y; + WSQData.qtree[p + 1].y = y; + if (evenx == 0) + { + WSQData.qtree[p].lenx = lenx / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p].lenx; + } + else + { + WSQData.qtree[p].lenx = (lenx + 1) / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx - 1; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p + 1].lenx; + } + WSQData.qtree[p + 1].x = x + WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].x = WSQData.qtree[p + 1].x; + if (eveny == 0) + { + WSQData.qtree[p].leny = leny / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 3].leny = WSQData.qtree[p].leny; + } + else + { + WSQData.qtree[p].leny = (leny + 1) / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny - 1; + WSQData.qtree[p + 3].leny = WSQData.qtree[p + 2].leny; + } + WSQData.qtree[p + 2].y = y + WSQData.qtree[p].leny; + WSQData.qtree[p + 3].y = WSQData.qtree[p + 2].y; + } + + private byte[] ImageToByteArray(float[] img, int width, int height, float mShift, float rScale) + { + byte[] data = new byte[width * height]; + + int idx = 0; + for (int r = 0; r < height; r++) + { + for (int c = 0; c < width; c++) + { + float pixel = (img[idx] * rScale) + mShift; + pixel += 0.5F; + + if (pixel < 0.0) + { + data[idx] = 0; // neg pix poss after quantization + } + else if (pixel > 255.0) + { + data[idx] = (byte)255; + } + else + { + data[idx] = (byte)pixel; + } + idx++; + } + } + + return data; + } + + /// + /// + /// + /// + /// + /// + /// + /// temporary length parameters + /// temporary length parameters + /// The next row_col to filter + /// The next pixel to filter + /// + /// NEW + /// Filter coefficients + /// NEW + /// Spectral inversion + private void JoinLets(float[] newdata, float[] olddata, int newIndex, int oldIndex, int len1, int len2, int pitch, int stride, float[] hi, int hsz, float[] lo, int lsz, int inv) + { + int lp0, lp1; + int hp0, hp1; + int lopass, hipass; // lo/hi pass image pointers + int limg, himg; + int pix, cl_rw; // pixel counter and column/row counter + int i, da_ev; // if "scanline" is even or odd and + int loc, hoc; + int hlen, llen; + int nstr, pstr; + int tap; + int fi_ev; + int olle, ohle, olre, ohre; + int lle, lle2, lre, lre2; + int hle, hle2, hre, hre2; + int lpx, lspx; + int lpxstr, lspxstr; + int lstap, lotap; + int hpx, hspx; + int hpxstr, hspxstr; + int hstap, hotap; + int asym, fhre = 0, ofhre; + float ssfac, osfac, sfac; + + da_ev = len2 % 2; + fi_ev = lsz % 2; + pstr = stride; + nstr = -pstr; + if (da_ev != 0) + { + llen = (len2 + 1) / 2; + hlen = llen - 1; + } + else + { + llen = len2 / 2; + hlen = llen; + } + + if (fi_ev != 0) + { + asym = 0; + ssfac = 1.0f; + ofhre = 0; + loc = (lsz - 1) / 4; + hoc = (hsz + 1) / 4 - 1; + lotap = ((lsz - 1) / 2) % 2; + hotap = ((hsz + 1) / 2) % 2; + if (da_ev != 0) + { + olle = 0; + olre = 0; + ohle = 1; + ohre = 1; + } + else + { + olle = 0; + olre = 1; + ohle = 1; + ohre = 0; + } + } + else + { + asym = 1; + ssfac = -1.0f; + ofhre = 2; + loc = lsz / 4 - 1; + hoc = hsz / 4 - 1; + lotap = (lsz / 2) % 2; + hotap = (hsz / 2) % 2; + if (da_ev != 0) + { + olle = 1; + olre = 0; + ohle = 1; + ohre = 1; + } + else + { + olle = 1; + olre = 1; + ohle = 1; + ohre = 1; + } + + if (loc == -1) + { + loc = 0; + olle = 0; + } + if (hoc == -1) + { + hoc = 0; + ohle = 0; + } + + for (i = 0; i < hsz; i++) + { + hi[i] *= -1.0F; + } + } + + + for (cl_rw = 0; cl_rw < len1; cl_rw++) + { + limg = newIndex + cl_rw * pitch; + himg = limg; + newdata[himg] = 0.0f; + newdata[himg + stride] = 0.0f; + if (inv != 0) + { + hipass = oldIndex + cl_rw * pitch; + lopass = hipass + stride * hlen; + } + else + { + lopass = oldIndex + cl_rw * pitch; + hipass = lopass + stride * llen; + } + + + lp0 = lopass; + lp1 = lp0 + (llen - 1) * stride; + lspx = lp0 + (loc * stride); + lspxstr = nstr; + lstap = lotap; + lle2 = olle; + lre2 = olre; + + hp0 = hipass; + hp1 = hp0 + (hlen - 1) * stride; + hspx = hp0 + (hoc * stride); + hspxstr = nstr; + hstap = hotap; + hle2 = ohle; + hre2 = ohre; + osfac = ssfac; + + for (pix = 0; pix < hlen; pix++) + { + for (tap = lstap; tap >= 0; tap--) + { + lle = lle2; + lre = lre2; + lpx = lspx; + lpxstr = lspxstr; + + newdata[limg] = olddata[lpx] * lo[tap]; + for (i = tap + 2; i < lsz; i += 2) + { + if (lpx == lp0) + { + if (lle != 0) + { + lpxstr = 0; + lle = 0; + } + else + { + lpxstr = pstr; + } + } + if (lpx == lp1) + { + if (lre != 0) + { + lpxstr = 0; + lre = 0; + } + else + { + lpxstr = nstr; + } + } + lpx += lpxstr; + newdata[limg] += olddata[lpx] * lo[i]; + } + limg += stride; + } + if (lspx == lp0) + { + if (lle2 != 0) + { + lspxstr = 0; + lle2 = 0; + } + else + { + lspxstr = pstr; + } + } + lspx += lspxstr; + lstap = 1; + + for (tap = hstap; tap >= 0; tap--) + { + hle = hle2; + hre = hre2; + hpx = hspx; + hpxstr = hspxstr; + fhre = ofhre; + sfac = osfac; + + for (i = tap; i < hsz; i += 2) + { + if (hpx == hp0) + { + if (hle != 0) + { + hpxstr = 0; + hle = 0; + } + else + { + hpxstr = pstr; + sfac = 1.0f; + } + } + if (hpx == hp1) + { + if (hre != 0) + { + hpxstr = 0; + hre = 0; + if (asym != 0 && da_ev != 0) + { + hre = 1; + fhre--; + sfac = (float)fhre; + if (sfac == 0.0) + { + hre = 0; + } + } + } + else + { + hpxstr = nstr; + if (asym != 0) + { + sfac = -1.0f; + } + } + } + newdata[himg] += olddata[hpx] * hi[i] * sfac; + hpx += hpxstr; + } + himg += stride; + } + if (hspx == hp0) + { + if (hle2 != 0) + { + hspxstr = 0; + hle2 = 0; + } + else + { + hspxstr = pstr; + osfac = 1.0f; + } + } + hspx += hspxstr; + hstap = 1; + } + + + if (da_ev != 0) + { + if (lotap != 0) + { + lstap = 1; + } + else + { + lstap = 0; + } + } + else if (lotap != 0) + { + lstap = 2; + } + else + { + lstap = 1; + } + for (tap = 1; tap >= lstap; tap--) + { + lle = lle2; + lre = lre2; + lpx = lspx; + lpxstr = lspxstr; + + newdata[limg] = olddata[lpx] * lo[tap]; + for (i = tap + 2; i < lsz; i += 2) + { + if (lpx == lp0) + { + if (lle != 0) + { + lpxstr = 0; + lle = 0; + } + else + { + lpxstr = pstr; + } + } + if (lpx == lp1) + { + if (lre != 0) + { + lpxstr = 0; + lre = 0; + } + else + { + lpxstr = nstr; + } + } + lpx += lpxstr; + newdata[limg] += olddata[lpx] * lo[i]; + } + limg += stride; + } + + + if (da_ev != 0) + { + if (hotap != 0) + { + hstap = 1; + } + else + { + hstap = 0; + } + if (hsz == 2) + { + hspx -= hspxstr; + fhre = 1; + } + } + else if (hotap != 0) + { + hstap = 2; + } + else + { + hstap = 1; + } + + for (tap = 1; tap >= hstap; tap--) + { + hle = hle2; + hre = hre2; + hpx = hspx; + hpxstr = hspxstr; + sfac = osfac; + if (hsz != 2) + { + fhre = ofhre; + } + for (i = tap; i < hsz; i += 2) + { + if (hpx == hp0) + { + if (hle != 0) + { + hpxstr = 0; + hle = 0; + } + else + { + hpxstr = pstr; + sfac = 1.0f; + } + } + if (hpx == hp1) + { + if (hre != 0) + { + hpxstr = 0; + hre = 0; + if (asym != 0 && da_ev != 0) + { + hre = 1; + fhre--; + sfac = (float)fhre; + if (sfac == 0.0) + { + hre = 0; + } + } + } + else + { + hpxstr = nstr; + if (asym != 0) + sfac = -1.0f; + } + } + newdata[himg] += olddata[hpx] * hi[i] * sfac; + hpx += hpxstr; + } + himg += stride; + } + } + + if (fi_ev == 0) + { + for (i = 0; i < hsz; i++) + { + hi[i] *= -1.0F; + } + } + } + private void ReconstructWSQ(float[] fdata, int width, int height) + { + if (WSQData.tableDTT.lodef != 1) + { + throw new SystemException("ERROR: ReconstructWSQ : Lopass filter coefficients not defined"); + } + + if (WSQData.tableDTT.hidef != 1) + { + throw new SystemException("ERROR: ReconstructWSQ : Hipass filter coefficients not defined"); + } + + int numPix = width * height; + // Allocate temporary floating point pixmap + float[] fdataTemp = new float[numPix]; + + // Reconstruct floating point pixmap from wavelet subband buffer + for (int node = Internal.Constants.W_TREELEN - 1; node >= 0; node--) + { + int fdataBse = (WSQData.wtree[node].y * width) + WSQData.wtree[node].x; + JoinLets(fdataTemp, fdata, 0, fdataBse, WSQData.wtree[node].lenx, WSQData.wtree[node].leny, 1, width, WSQData.tableDTT.hifilt, WSQData.tableDTT.hisz, WSQData.tableDTT.lofilt, WSQData.tableDTT.losz, WSQData.wtree[node].invcl); + JoinLets(fdata, fdataTemp, fdataBse, 0, WSQData.wtree[node].leny, WSQData.wtree[node].lenx, width, 1, WSQData.tableDTT.hifilt, WSQData.tableDTT.hisz, WSQData.tableDTT.lofilt, WSQData.tableDTT.losz, WSQData.wtree[node].invrw); + } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + br.Endianness = IO.Endianness.BigEndian; + + // Initialize WSQ data structures + WSQData.Initialize(); + + // Read the SOI marker + ushort signature = br.ReadUInt16(); + if (signature != Internal.Constants.SOI_WSQ) throw new InvalidDataFormatException("Invalid Wavelet Scalar Quantization image"); + + #region Supporting Tables + // Read in supporting tables up to the SOF marker + bool done = false; + do + { + signature = br.ReadUInt16(); + switch (signature) + { + case Internal.Constants.SOF_WSQ: + { + done = true; + break; + } + case Internal.Constants.DTT_WSQ: + { + ProcessTransformTable(br); + break; + } + case Internal.Constants.DQT_WSQ: + { + ProcessQuantizationTable(br); + break; + } + case Internal.Constants.DHT_WSQ: + { + ProcessHuffmanTable(br); + break; + } + case Internal.Constants.COM_WSQ: + { + ProcessComment(br); + break; + } + default: + { + throw new SystemException("ERROR: getCTableWSQ : Invalid table defined : " + signature.ToString()); + } + } + } + while ((signature != Internal.Constants.SOF_WSQ) || (!done)); + #endregion + #region Frame Header + // Read in the Frame Header + short hdrSize = br.ReadInt16(); /* header size */ + + byte black = br.ReadByte(); + byte white = br.ReadByte(); + short height = br.ReadInt16(); + short width = br.ReadInt16(); + byte hScale = br.ReadByte(); // exponent scaling parameter + short hShrtDat = br.ReadInt16(); // buffer pointer + float mShift = (float)hShrtDat; + while (hScale > 0) + { + mShift /= 10.0F; + hScale--; + } + + hScale = br.ReadByte(); + hShrtDat = br.ReadInt16(); + float rScale = (float)hShrtDat; + while (hScale > 0) + { + rScale /= 10.0F; + hScale--; + } + + byte wsqEncoder = br.ReadByte(); + short software = br.ReadInt16(); + + #endregion + + int ppi = -1; + #region WSQ Decomposition Trees + // Build a W-TREE structure for the image + BuildWTree(width, height); + BuildQTree(); + #endregion + + // Decode the Huffman encoded buffer blocks + int[] qdata = DecodeHuffmanTable(br, width * height); + + // Decode the quantize wavelet subband buffer + float[] fdata = Unquantize(qdata, width, height); + + // Done with quantized wavelet subband buffer + qdata = null; + + ReconstructWSQ(fdata, width, height); + + // Convert floating point pixels to unsigned char pixels + byte[] cdata = ImageToByteArray(fdata, width, height, mShift, rScale); + fdata = null; + + pic.Width = width; + pic.Height = height; + int pix = 0; + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + pic.SetPixel(Color.FromRGBA(cdata[pix], cdata[pix], cdata[pix]), j, i); + pix++; + } + } + } + + private void ProcessTable(IO.Reader br, int marker) + { + switch (marker) + { + case Internal.Constants.DTT_WSQ: + { + ProcessTransformTable(br); + return; + } + case Internal.Constants.DQT_WSQ: + { + ProcessQuantizationTable(br); + return; + } + case Internal.Constants.DHT_WSQ: + { + ProcessHuffmanTable(br); + return; + } + case Internal.Constants.COM_WSQ: + { + ProcessComment(br); + return; + } + default: + { + throw new SystemException("ERROR: getCTableWSQ : Invalid table defined : " + marker); + } + } + } + private void ProcessComment(IO.Reader br) + { + int size = br.ReadInt16() - 2; + string commentValue = br.ReadFixedLengthString(size); + } + private void ProcessHuffmanTable(IO.Reader br) + { + // First time, read table length + HuffmanTable firstHuffmanTable = getCHuffmanTable(br, Internal.Constants.MAX_HUFFCOUNTS_WSQ, 0, true); + + // Store table into global structure list + int tableId = firstHuffmanTable.tableId; + WSQData.tableDHT[tableId].huffbits = (int[])firstHuffmanTable.huffbits.Clone(); + WSQData.tableDHT[tableId].huffvalues = (int[])firstHuffmanTable.huffvalues.Clone(); + WSQData.tableDHT[tableId].tabdef = 1; + + int bytesLeft = firstHuffmanTable.bytesLeft; + while (bytesLeft != 0) + { + // Read next table without reading table length + HuffmanTable huffmantable = getCHuffmanTable(br, Internal.Constants.MAX_HUFFCOUNTS_WSQ, bytesLeft, false); + + // If table is already defined ... + tableId = huffmantable.tableId; + if (WSQData.tableDHT[tableId].tabdef != 0) + { + throw new SystemException("ERROR : ProcessHuffmanTable : huffman table already defined."); + } + + /* Store table into global structure list. */ + WSQData.tableDHT[tableId].huffbits = (int[])huffmantable.huffbits.Clone(); + WSQData.tableDHT[tableId].huffvalues = (int[])huffmantable.huffvalues.Clone(); + WSQData.tableDHT[tableId].tabdef = 1; + bytesLeft = huffmantable.bytesLeft; + } + } + private void ProcessQuantizationTable(IO.Reader br) + { + br.ReadInt16(); /* header size */ + int scale = br.ReadByte(); /* scaling parameter */ + int shrtDat = br.ReadInt16(); /* counter and temp short buffer */ + + WSQData.tableDQT.binCenter = (float)shrtDat; + while (scale > 0) + { + WSQData.tableDQT.binCenter /= 10.0F; + scale--; + } + + for (int cnt = 0; cnt < Table_DQT.MAX_SUBBANDS; cnt++) + { + scale = br.ReadByte(); + shrtDat = br.ReadInt16(); + WSQData.tableDQT.qBin[cnt] = (float)shrtDat; + while (scale > 0) + { + WSQData.tableDQT.qBin[cnt] /= 10.0F; + scale--; + } + + scale = br.ReadByte(); + shrtDat = br.ReadInt16(); + WSQData.tableDQT.zBin[cnt] = (float)shrtDat; + while (scale > 0) + { + WSQData.tableDQT.zBin[cnt] /= 10.0F; + scale--; + } + } + + WSQData.tableDQT.dqtDef = 1; + } + private void ProcessTransformTable(IO.Reader br) + { + short temp = br.ReadInt16(); + + WSQData.tableDTT.hisz = br.ReadByte(); // has to be &'d with 0xFF? + WSQData.tableDTT.losz = br.ReadByte(); + + WSQData.tableDTT.hifilt = new float[WSQData.tableDTT.hisz]; + WSQData.tableDTT.lofilt = new float[WSQData.tableDTT.losz]; + + int aSize; + if (WSQData.tableDTT.hisz % 2 != 0) + { + aSize = (WSQData.tableDTT.hisz + 1) / 2; + } + else + { + aSize = WSQData.tableDTT.hisz / 2; + } + + float[] aLofilt = new float[aSize]; + + + aSize--; + for (int cnt = 0; cnt <= aSize; cnt++) + { + int sign = br.ReadByte(); + int scale = br.ReadByte(); + long shrtDat = br.ReadInt32(); + aLofilt[cnt] = (float)shrtDat; + + while (scale > 0) + { + aLofilt[cnt] /= 10.0F; + scale--; + } + + if (sign != 0) + { + aLofilt[cnt] *= -1.0F; + } + + if (WSQData.tableDTT.hisz % 2 != 0) + { + WSQData.tableDTT.hifilt[cnt + aSize] = intSign(cnt) * aLofilt[cnt]; + if (cnt > 0) + { + WSQData.tableDTT.hifilt[aSize - cnt] = WSQData.tableDTT.hifilt[cnt + aSize]; + } + } + else + { + WSQData.tableDTT.hifilt[cnt + aSize + 1] = intSign(cnt) * aLofilt[cnt]; + WSQData.tableDTT.hifilt[aSize - cnt] = -1 * WSQData.tableDTT.hifilt[cnt + aSize + 1]; + } + } + + if (WSQData.tableDTT.losz % 2 != 0) + { + aSize = (WSQData.tableDTT.losz + 1) / 2; + } + else + { + aSize = WSQData.tableDTT.losz / 2; + } + + float[] aHifilt = new float[aSize]; + + aSize--; + for (int cnt = 0; cnt <= aSize; cnt++) + { + int sign = br.ReadByte(); + int scale = br.ReadByte(); + long shrtDat = br.ReadInt32(); + + aHifilt[cnt] = (float)shrtDat; + + while (scale > 0) + { + aHifilt[cnt] /= 10.0F; + scale--; + } + + if (sign != 0) + { + aHifilt[cnt] *= -1.0F; + } + + if (WSQData.tableDTT.losz % 2 != 0) + { + WSQData.tableDTT.lofilt[cnt + aSize] = intSign(cnt) * aHifilt[cnt]; + if (cnt > 0) + { + WSQData.tableDTT.lofilt[aSize - cnt] = WSQData.tableDTT.lofilt[cnt + aSize]; + } + } + else + { + WSQData.tableDTT.lofilt[cnt + aSize + 1] = intSign(cnt + 1) * aHifilt[cnt]; + WSQData.tableDTT.lofilt[aSize - cnt] = WSQData.tableDTT.lofilt[cnt + aSize + 1]; + } + } + + WSQData.tableDTT.lodef = 1; + WSQData.tableDTT.hidef = 1; + } + + private void BuildWTree(short width, short height) + { + // starting lengths of sections of the image being split into subbands + int lenx, lenx2, leny, leny2; + WSQData.wtree = new WavletTree[Internal.Constants.W_TREELEN]; + for (int i = 0; i < Internal.Constants.W_TREELEN; i++) + { + WSQData.wtree[i] = new WavletTree(); + WSQData.wtree[i].invrw = 0; + WSQData.wtree[i].invcl = 0; + } + + WSQData.wtree[2].invrw = 1; + WSQData.wtree[4].invrw = 1; + WSQData.wtree[7].invrw = 1; + WSQData.wtree[9].invrw = 1; + WSQData.wtree[11].invrw = 1; + WSQData.wtree[13].invrw = 1; + WSQData.wtree[16].invrw = 1; + WSQData.wtree[18].invrw = 1; + WSQData.wtree[3].invcl = 1; + WSQData.wtree[5].invcl = 1; + WSQData.wtree[8].invcl = 1; + WSQData.wtree[9].invcl = 1; + WSQData.wtree[12].invcl = 1; + WSQData.wtree[13].invcl = 1; + WSQData.wtree[17].invcl = 1; + WSQData.wtree[18].invcl = 1; + + wtree4(0, 1, width, height, 0, 0, 1); + + if ((WSQData.wtree[1].lenx % 2) == 0) + { + lenx = WSQData.wtree[1].lenx / 2; + lenx2 = lenx; + } + else + { + lenx = (WSQData.wtree[1].lenx + 1) / 2; + lenx2 = lenx - 1; + } + + if ((WSQData.wtree[1].leny % 2) == 0) + { + leny = WSQData.wtree[1].leny / 2; + leny2 = leny; + } + else + { + leny = (WSQData.wtree[1].leny + 1) / 2; + leny2 = leny - 1; + } + + wtree4(4, 6, lenx2, leny, lenx, 0, 0); + wtree4(5, 10, lenx, leny2, 0, leny, 0); + wtree4(14, 15, lenx, leny, 0, 0, 0); + + WSQData.wtree[19].x = 0; + WSQData.wtree[19].y = 0; + if ((WSQData.wtree[15].lenx % 2) == 0) + { + WSQData.wtree[19].lenx = WSQData.wtree[15].lenx / 2; + } + else + { + WSQData.wtree[19].lenx = (WSQData.wtree[15].lenx + 1) / 2; + } + if ((WSQData.wtree[15].leny % 2) == 0) + { + WSQData.wtree[19].leny = WSQData.wtree[15].leny / 2; + } + else + { + WSQData.wtree[19].leny = (WSQData.wtree[15].leny + 1) / 2; + } + } + private void BuildQTree() + { + WSQData.qtree = new QuantTree[Internal.Constants.Q_TREELEN]; + for (int i = 0; i < WSQData.qtree.Length; i++) + { + WSQData.qtree[i] = new QuantTree(); + } + + qtree16(3, WSQData.wtree[14].lenx, WSQData.wtree[14].leny, WSQData.wtree[14].x, WSQData.wtree[14].y, 0, 0); + qtree16(19, WSQData.wtree[4].lenx, WSQData.wtree[4].leny, WSQData.wtree[4].x, WSQData.wtree[4].y, 0, 1); + qtree16(48, WSQData.wtree[0].lenx, WSQData.wtree[0].leny, WSQData.wtree[0].x, WSQData.wtree[0].y, 0, 0); + qtree16(35, WSQData.wtree[5].lenx, WSQData.wtree[5].leny, WSQData.wtree[5].x, WSQData.wtree[5].y, 1, 0); + qtree4(0, WSQData.wtree[19].lenx, WSQData.wtree[19].leny, WSQData.wtree[19].x, WSQData.wtree[19].y); + } + private int AssertNextMarker(IO.Reader br, ushort ExpectedMarker) + { + ushort nextMarker = br.ReadUInt16(); + switch (ExpectedMarker) + { + case Internal.Constants.SOI_WSQ: + { + if (nextMarker != Internal.Constants.SOI_WSQ) + { + throw new SystemException("ERROR : AssertNextMarker : No SOI marker : " + nextMarker); + } + return nextMarker; + } + case Internal.Constants.TBLS_N_SOF: + { + if (nextMarker != Internal.Constants.DTT_WSQ + && nextMarker != Internal.Constants.DQT_WSQ + && nextMarker != Internal.Constants.DHT_WSQ + && nextMarker != Internal.Constants.SOB_WSQ + && nextMarker != Internal.Constants.COM_WSQ) + { + throw new SystemException("ERROR : AssertNextMarker : No SOB, Table, or comment markers : " + nextMarker); + } + return nextMarker; + } + case Internal.Constants.TBLS_N_SOB: + { + if (nextMarker != Internal.Constants.DTT_WSQ + && nextMarker != Internal.Constants.DQT_WSQ + && nextMarker != Internal.Constants.DHT_WSQ + && nextMarker != Internal.Constants.SOB_WSQ + && nextMarker != Internal.Constants.COM_WSQ) + { + throw new SystemException("ERROR : AssertNextMarker : No SOB, Table, or comment markers : " + + nextMarker); + } + return nextMarker; + } + case Internal.Constants.ANY_WSQ: + { + if ((nextMarker & 0xff00) != 0xff00) + { + throw new SystemException("ERROR : AssertNextMarker : no marker found : " + nextMarker); + } + if ((nextMarker < Internal.Constants.SOI_WSQ) || (nextMarker > Internal.Constants.COM_WSQ)) + { + throw new SystemException("ERROR : AssertNextMarker : not a valid marker : " + nextMarker); + } + return nextMarker; + } + } + throw new SystemException("ERROR : AssertNextMarker : Invalid marker : " + nextMarker); + } + + private int getCNextbitsWSQ(IO.Reader br, ref int marker, ref int bitCount, int bitsReq, ref int nextByte) + { + if (bitCount == 0) + { + nextByte = br.ReadByte(); + + bitCount = 8; + if (nextByte == 0xFF) + { + int code2 = br.ReadByte(); // stuffed byte of buffer + + if (code2 != 0x00 && bitsReq == 1) + { + marker = (nextByte << 8) | code2; + return 1; + } + if (code2 != 0x00) + { + throw new SystemException("ERROR: getCNextbitsWSQ : No stuffed zeros."); + } + } + } + + int bits, tbits; // bits of current buffer byte requested + int bitsNeeded; // additional bits required to finish request + + if (bitsReq <= bitCount) + { + bits = (nextByte >> (bitCount - bitsReq)) & (Internal.Constants.BITMASK[bitsReq]); + bitCount -= bitsReq; + nextByte &= Internal.Constants.BITMASK[bitCount]; + } + else + { + bitsNeeded = bitsReq - bitCount; // additional bits required to finish request + bits = nextByte << bitsNeeded; + bitCount = 0; + tbits = getCNextbitsWSQ(br, ref marker, ref bitCount, bitsNeeded, ref nextByte); + bits |= tbits; + } + + return bits; + } + + private float[] Unquantize(int[] sip, int width, int height) + { + float[] fip = new float[width * height]; // floating point image + + if (WSQData.tableDQT.dqtDef != 1) + { + throw new SystemException("ERROR: unquantize : quantization table parameters not defined!"); + } + + float binCenter = WSQData.tableDQT.binCenter; // quantizer bin center + + int sptr = 0; + for (int cnt = 0; cnt < Internal.Constants.NUM_SUBBANDS; cnt++) + { + if (WSQData.tableDQT.qBin[cnt] == 0.0) + { + continue; + } + + int fptr = (WSQData.qtree[cnt].y * width) + WSQData.qtree[cnt].x; + + for (int row = 0; row < WSQData.qtree[cnt].leny; row++, fptr += width - WSQData.qtree[cnt].lenx) + { + for (int col = 0; col < WSQData.qtree[cnt].lenx; col++) + { + if (sip[sptr] == 0) + { + fip[fptr] = 0.0f; + } + else if (sip[sptr] > 0) + { + fip[fptr] = (WSQData.tableDQT.qBin[cnt] * (sip[sptr] - binCenter)) + (WSQData.tableDQT.zBin[cnt] / 2.0f); + } + else if (sip[sptr] < 0) + { + fip[fptr] = (WSQData.tableDQT.qBin[cnt] * (sip[sptr] + binCenter)) - (WSQData.tableDQT.zBin[cnt] / 2.0f); + } + else + { + throw new SystemException("ERROR : unquantize : invalid quantization pixel value"); + } + fptr++; + sptr++; + } + } + } + + return fip; + } + + #region Huffman Table + private void BuildHuffmanCodes(HuffCode[] huffcodeTable) + { + short tempCode = 0; /*used to construct code word*/ + int pointer = 0; /*pointer to code word information*/ + + int tempSize = huffcodeTable[0].size; + if (huffcodeTable[pointer].size == 0) + { + return; + } + + do + { + do + { + huffcodeTable[pointer].code = tempCode; + tempCode++; + pointer++; + } + while (huffcodeTable[pointer].size == tempSize); + + if (huffcodeTable[pointer].size == 0) return; + + do + { + tempCode <<= 1; + tempSize++; + } + while (huffcodeTable[pointer].size != tempSize); + } + while (huffcodeTable[pointer].size == tempSize); + } + private void GenerateHuffmanDecodeTable(HuffCode[] huffcodeTable, int[] maxcode, int[] mincode, int[] valptr, int[] huffbits) + { + for (int i = 0; i <= Internal.Constants.MAX_HUFFBITS; i++) + { + maxcode[i] = 0; + mincode[i] = 0; + valptr[i] = 0; + } + + int i2 = 0; + for (int i = 1; i <= Internal.Constants.MAX_HUFFBITS; i++) + { + if (huffbits[i - 1] == 0) + { + maxcode[i] = -1; + continue; + } + valptr[i] = i2; + mincode[i] = huffcodeTable[i2].code; + i2 = i2 + huffbits[i - 1] - 1; + maxcode[i] = huffcodeTable[i2].code; + i2++; + } + } + + private int DecodeHuffmanDataMemory(IO.Reader br, int[] mincode, int[] maxcode, int[] valptr, int[] huffvalues, ref int bitCount, ref int marker, ref int nextByte) + { + short code = (short)getCNextbitsWSQ(br, ref marker, ref bitCount, 1, ref nextByte); // becomes a huffman code word (one bit at a time) + if (marker != 0) return -1; + + int inx; + + for (inx = 1; code > maxcode[inx]; inx++) + { + int tbits = getCNextbitsWSQ(br, ref marker, ref bitCount, 1, ref nextByte); // becomes a huffman code word (one bit at a time) + code = (short)((code << 1) + tbits); + + if (marker != 0) return -1; + } + + int inx2 = valptr[inx] + code - mincode[inx]; /*increment variables*/ + return huffvalues[inx2]; + } + private HuffCode[] BuildHuffmanSizes(int[] huffbits, int maxHuffcounts) + { + HuffCode[] huffcodeTable; // table of huffman codes and sizes + int numberOfCodes = 1; // the number codes for a given code size + + huffcodeTable = new HuffCode[maxHuffcounts + 1]; + + int tempSize = 0; + for (int codeSize = 1; codeSize <= Internal.Constants.MAX_HUFFBITS; codeSize++) + { + while (numberOfCodes <= huffbits[codeSize - 1]) + { + huffcodeTable[tempSize] = new HuffCode(); + huffcodeTable[tempSize].size = codeSize; + tempSize++; + numberOfCodes++; + } + numberOfCodes = 1; + } + + huffcodeTable[tempSize] = new HuffCode(); + huffcodeTable[tempSize].size = 0; + + return huffcodeTable; + } + private int[] DecodeHuffmanTable(IO.Reader br, int size) + { + int[] qdata = new int[size]; + + int[] maxcode = new int[Internal.Constants.MAX_HUFFBITS + 1]; + int[] mincode = new int[Internal.Constants.MAX_HUFFBITS + 1]; + int[] valptr = new int[Internal.Constants.MAX_HUFFBITS + 1]; + + int marker = AssertNextMarker(br, Internal.Constants.TBLS_N_SOB); + + int bitCount = 0; // bit count for getc_nextbits_wsq routine + int nextByte = 0; // next byte of buffer + int hufftableId = 0; // huffman table number + int ip = 0; + + while (marker != Internal.Constants.EOI_WSQ) + { + if (marker != 0) + { + while (marker != Internal.Constants.SOB_WSQ) + { + ProcessTable(br, marker); + marker = AssertNextMarker(br, Internal.Constants.TBLS_N_SOB); + } + + short u0 = br.ReadInt16(); // block header size + hufftableId = br.ReadByte(); // huffman table number + + if (WSQData.tableDHT[hufftableId].tabdef != 1) + { + throw new SystemException("ERROR : huffmanDecodeDataMem : huffman table undefined."); + } + + // the next two routines reconstruct the huffman tables + HuffCode[] hufftable = BuildHuffmanSizes(WSQData.tableDHT[hufftableId].huffbits, Internal.Constants.MAX_HUFFCOUNTS_WSQ); + BuildHuffmanCodes(hufftable); + + // build a set of three tables used in decoding the compressed buffer + GenerateHuffmanDecodeTable(hufftable, maxcode, mincode, valptr, WSQData.tableDHT[hufftableId].huffbits); + + bitCount = 0; + marker = 0; + } + + // get next huffman category code from compressed input buffer stream + int nodeptr = DecodeHuffmanDataMemory(br, mincode, maxcode, valptr, WSQData.tableDHT[hufftableId].huffvalues, ref bitCount, ref marker, ref nextByte); + // nodeptr pointers for decoding + + if (nodeptr == -1) + { + continue; + } + + if (nodeptr > 0 && nodeptr <= 100) + { + for (int n = 0; n < nodeptr; n++) + { + qdata[ip++] = 0; /* z run */ + } + } + else if (nodeptr > 106 && nodeptr < 0xff) + { + qdata[ip++] = nodeptr - 180; + } + else if (nodeptr == 101) + { + qdata[ip++] = getCNextbitsWSQ(br, ref marker, ref bitCount, 8, ref nextByte); + + } + else if (nodeptr == 102) + { + qdata[ip++] = -getCNextbitsWSQ(br, ref marker, ref bitCount, 8, ref nextByte); + } + else if (nodeptr == 103) + { + qdata[ip++] = getCNextbitsWSQ(br, ref marker, ref bitCount, 16, ref nextByte); + } + else if (nodeptr == 104) + { + qdata[ip++] = -getCNextbitsWSQ(br, ref marker, ref bitCount, 16, ref nextByte); + } + else if (nodeptr == 105) + { + int n = getCNextbitsWSQ(br, ref marker, ref bitCount, 8, ref nextByte); + while (n-- > 0) + { + qdata[ip++] = 0; + } + } + else if (nodeptr == 106) + { + int n = getCNextbitsWSQ(br, ref marker, ref bitCount, 16, ref nextByte); + while (n-- > 0) + { + qdata[ip++] = 0; + } + } + else + { + throw new SystemException("ERROR: huffman_decode_data_mem : Invalid code (" + nodeptr + ")"); + } + } + + return qdata; + } + #endregion + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WebP/WebPDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WebP/WebPDataFormat.cs new file mode 100644 index 00000000..6c7a0ce7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WebP/WebPDataFormat.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.DataFormats.Chunked.RIFF; + +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.WebP +{ + public class WebPDataFormat : RIFFDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(this.GetType()); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + _dfr.Capabilities.Add(typeof(ChunkedObjectModel), DataFormatCapabilities.Bootstrap); + } + return _dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + + ChunkedObjectModel chunked = (objectModels.Pop() as ChunkedObjectModel); + PictureObjectModel pic = (objectModels.Pop() as PictureObjectModel); + + RIFFGroupChunk WEBP = (chunked.Chunks["WEBP"] as RIFFGroupChunk); + if (WEBP == null) throw new InvalidDataFormatException("File does not contain a \"WEBP\" chunk"); + + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WirelessBitmap/WBMPDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WirelessBitmap/WBMPDataFormat.cs new file mode 100644 index 00000000..972fad0d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/WirelessBitmap/WBMPDataFormat.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Picture; + +namespace UniversalEditor.DataFormats.Multimedia.Picture.WirelessBitmap +{ + public class WBMPDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Wireless Application Protocol Bitmap image", new string[] { "*.wbmp" }); + } + return _dfr; + } + + private uint ReadCompactUInt32(IO.BinaryReader br) + { + uint retval = 0; + byte value = br.ReadByte(); + bool a = ((value & 0x80) == 0x80); + while (a) + { + uint val = (uint)(value & ~0x80); + retval += val; + value = br.ReadByte(); + a = ((value & 0x80) == 0x80); + } + + retval += (uint)(value & ~0x80); + return retval; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = new PictureObjectModel(); + IO.BinaryReader br = base.Stream.BinaryReader; + br.BaseStream.Position = 0; + + uint imageType = ReadCompactUInt32(br); + byte reserved = br.ReadByte(); + uint imageWidth = ReadCompactUInt32(br); + uint imageHeight = ReadCompactUInt32(br); + + while (!br.EndOfStream) + { + byte next = br.ReadByte(); + + for (int i = 0; i < 8; i++) + { + byte bit = next.GetBits(i, 1); + if (bit == 0) + { + pic.SetPixel(System.Drawing.Color.Black); + } + else + { + pic.SetPixel(System.Drawing.Color.White); + } + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/ASXDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/ASXDataFormat.cs new file mode 100644 index 00000000..c235d0cb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/ASXDataFormat.cs @@ -0,0 +1,241 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class ASXDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.Add("video/x-ms-asf"); + return dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement tagASX = mom.Elements["asx"] as MarkupTagElement; + if (tagASX != null) + { + foreach (MarkupElement el in tagASX.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + string name2 = tag.Name; + if (name2 != null) + { + if (!(name2 == "title")) + { + if (!(name2 == "author")) + { + if (!(name2 == "abstract")) + { + if (!(name2 == "copyright")) + { + if (!(name2 == "param")) + { + if (name2 == "entry") + { + PlaylistEntry entry = new PlaylistEntry(); + foreach (MarkupElement entryEl in tag.Elements) + { + MarkupTagElement tagEl = entryEl as MarkupTagElement; + if (tagEl != null) + { + name2 = tagEl.Name; + if (name2 != null) + { + if (!(name2 == "title")) + { + if (!(name2 == "author")) + { + if (!(name2 == "abstract")) + { + if (!(name2 == "copyright")) + { + if (!(name2 == "ref")) + { + if (name2 == "param") + { + if (tagEl.Attributes["name"] != null) + { + string name = tagEl.Attributes["name"].Value; + string value = string.Empty; + if (tagEl.Attributes["value"] != null) + { + value = tagEl.Attributes["value"].Value; + } + entry.CustomInformation.Add(name, value); + } + } + } + else + { + if (tagEl.Attributes["href"] != null) + { + entry.FileName = tagEl.Attributes["href"].Value; + } + } + } + else + { + entry.Copyright = tagEl.Value; + } + } + else + { + entry.Abstract = tagEl.Value; + } + } + else + { + entry.Author = tagEl.Value; + } + } + else + { + entry.Title = tagEl.Value; + } + } + } + } + pom.Entries.Add(entry); + } + } + else + { + if (tag.Attributes["name"] != null) + { + string name = tag.Attributes["name"].Value; + string value = string.Empty; + if (tag.Attributes["value"] != null) + { + value = tag.Attributes["value"].Value; + } + pom.CustomInformation.Add(name, value); + } + } + } + else + { + pom.Copyright = tag.Value; + } + } + else + { + pom.Abstract = tag.Value; + } + } + else + { + pom.Author = tag.Value; + } + } + else + { + pom.Title = tag.Value; + } + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + if (pom != null) + { + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupTagElement tagASX = new MarkupTagElement(); + tagASX.Name = "asx"; + tagASX.Attributes.Add("version", "3.0"); + tagASX.Attributes.Add("previewmode", "No"); + if (!string.IsNullOrEmpty(pom.Abstract)) + { + MarkupTagElement tagAbstract = new MarkupTagElement(); + tagAbstract.Name = "abstract"; + tagAbstract.Value = pom.Abstract; + tagASX.Elements.Add(tagAbstract); + } + if (!string.IsNullOrEmpty(pom.Title)) + { + MarkupTagElement tagTitle = new MarkupTagElement(); + tagTitle.Name = "title"; + tagTitle.Value = pom.Title; + tagASX.Elements.Add(tagTitle); + } + if (!string.IsNullOrEmpty(pom.Author)) + { + MarkupTagElement tagAuthor = new MarkupTagElement(); + tagAuthor.Name = "author"; + tagAuthor.Value = pom.Author; + tagASX.Elements.Add(tagAuthor); + } + if (!string.IsNullOrEmpty(pom.Copyright)) + { + MarkupTagElement tagCopyright = new MarkupTagElement(); + tagCopyright.Name = "copyright"; + tagCopyright.Value = pom.Copyright; + tagASX.Elements.Add(tagCopyright); + } + foreach (PlaylistEntry entry in pom.Entries) + { + MarkupTagElement tagEntry = new MarkupTagElement(); + tagEntry.Name = "entry"; + if (!string.IsNullOrEmpty(entry.FileName)) + { + MarkupTagElement tagRef = new MarkupTagElement(); + tagRef.Name = "ref"; + tagRef.Attributes.Add("href", entry.FileName); + tagEntry.Elements.Add(tagRef); + } + if (!string.IsNullOrEmpty(entry.Abstract)) + { + MarkupTagElement tagAbstract = new MarkupTagElement(); + tagAbstract.Name = "abstract"; + tagAbstract.Value = entry.Abstract; + tagEntry.Elements.Add(tagAbstract); + } + if (!string.IsNullOrEmpty(entry.Title)) + { + MarkupTagElement tagTitle = new MarkupTagElement(); + tagTitle.Name = "title"; + tagTitle.Value = entry.Title; + tagEntry.Elements.Add(tagTitle); + } + if (!string.IsNullOrEmpty(entry.Author)) + { + MarkupTagElement tagAuthor = new MarkupTagElement(); + tagAuthor.Name = "author"; + tagAuthor.Value = entry.Author; + tagEntry.Elements.Add(tagAuthor); + } + if (!string.IsNullOrEmpty(entry.Copyright)) + { + MarkupTagElement tagCopyright = new MarkupTagElement(); + tagCopyright.Name = "copyright"; + tagCopyright.Value = entry.Copyright; + tagEntry.Elements.Add(tagCopyright); + } + tagASX.Elements.Add(tagEntry); + } + mom.Elements.Add(tagASX); + objectModels.Push(mom); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/CDDA/CDDADataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/CDDA/CDDADataFormat.cs new file mode 100644 index 00000000..c4926c3a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/CDDA/CDDADataFormat.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UniversalEditor.IO; + +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.DataFormats.Chunked.RIFF; + +using UniversalEditor.ObjectModels.Multimedia.Playlist; + +namespace UniversalEditor.DataFormats.Multimedia.Playlist.CDDA +{ + public class CDDADataFormat : RIFFDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + ChunkedObjectModel rom = new ChunkedObjectModel(); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + RIFFDataChunk fmtChunk = new RIFFDataChunk(); + fmtChunk.ID = "fmt "; + Accessors.MemoryAccessor ms = new Accessors.MemoryAccessor(); + IO.Writer bw = new IO.Writer(ms); + ushort CDAFileVersion = 1; + ushort CDATrackNumber = 1; + uint CDADiscSerialNumber = 0u; + uint CDATrackStartHSG = 0u; + uint CDATrackLengthHSG = 0u; + byte CDATrackStartRBFFrame = 0; + byte CDATrackStartRBFSecond = 0; + byte CDATrackStartRBFMinute = 0; + byte CDATrackStartRBFUnused = 0; + byte CDATrackLengthRBFFrame = 0; + byte CDATrackLengthRBFSecond = 0; + byte CDATrackLengthRBFMinute = 0; + byte CDATrackLengthRBFUnused = 0; + if (pom.Entries.Count > 0) + { + PlaylistEntry entry = pom.Entries[0]; + } + bw.WriteUInt16(CDAFileVersion); + bw.WriteUInt16(CDATrackNumber); + bw.WriteUInt32(CDADiscSerialNumber); + bw.WriteUInt32(CDATrackStartHSG); + bw.WriteUInt32(CDATrackLengthHSG); + bw.WriteBytes(new byte[] + { + CDATrackStartRBFFrame, + CDATrackStartRBFSecond, + CDATrackStartRBFMinute, + CDATrackStartRBFUnused + }); + bw.WriteBytes(new byte[] + { + CDATrackLengthRBFFrame, + CDATrackLengthRBFSecond, + CDATrackLengthRBFMinute, + CDATrackLengthRBFUnused + }); + ms.Close(); + + fmtChunk.Data = ms.ToArray(); + rom.Chunks.Add(fmtChunk); + objectModels.Push(rom); + } + protected override void BeforeLoadInternal(Stack objectModels) + { + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + ChunkedObjectModel rom = objectModels.Pop() as ChunkedObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + RIFFDataChunk fmtChunk = (rom.Chunks["fmt "] as RIFFDataChunk); + IO.Reader br = new IO.Reader(new Accessors.MemoryAccessor(fmtChunk.Data)); + ushort CDAFileVersion = br.ReadUInt16(); + ushort CDATrackNumber = br.ReadUInt16(); + uint CDADiscSerialNumber = br.ReadUInt32(); + uint CDATrackStartHSG = br.ReadUInt32(); + uint CDATrackLengthHSG = br.ReadUInt32(); + byte CDATrackStartRBFFrame = br.ReadByte(); + byte CDATrackStartRBFSecond = br.ReadByte(); + byte CDATrackStartRBFMinute = br.ReadByte(); + byte CDATrackStartRBFUnused = br.ReadByte(); + byte CDATrackLengthRBFFrame = br.ReadByte(); + byte CDATrackLengthRBFSecond = br.ReadByte(); + byte CDATrackLengthRBFMinute = br.ReadByte(); + byte CDATrackLengthRBFUnused = br.ReadByte(); + PlaylistEntry entry = new PlaylistEntry(); + entry.Title = "Track" + CDATrackNumber.ToString().PadLeft(2, '0'); + entry.Length = (long)((ulong)CDATrackLengthHSG); + entry.Offset = (long)((ulong)CDATrackStartHSG); + pom.Entries.Add(entry); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/HTMLPlaylistDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/HTMLPlaylistDataFormat.cs new file mode 100644 index 00000000..f23e644c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/HTMLPlaylistDataFormat.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class HTMLPlaylistDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override bool IsObjectModelSupported(UniversalEditor.ObjectModel omb) + { + MarkupObjectModel mom = (omb as MarkupObjectModel); + if (mom == null) return false; + + return (mom.Elements.Count == 1 && mom.Elements[0].FullName == "html"); + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + } + + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + PlaylistObjectModel pom = (objectModels.Pop() as PlaylistObjectModel); + if (pom == null) throw new ObjectModelNotSupportedException(); + + MarkupObjectModel mom = new MarkupObjectModel(); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/M3UDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/M3UDataFormat.cs new file mode 100644 index 00000000..46d580b8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/M3UDataFormat.cs @@ -0,0 +1,104 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class M3UDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader tr = base.Accessor.Reader; + if (tr.EndOfStream || tr.ReadLine() != "#EXTM3U") + { + throw new InvalidDataFormatException("File does not begin with \"#EXTM3U\""); + } + PlaylistObjectModel objm = objectModel as PlaylistObjectModel; + PlaylistEntry nextEntry = null; + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + if (!string.IsNullOrEmpty(line)) + { + if (line.StartsWith("#")) + { + if (nextEntry == null) + { + nextEntry = new PlaylistEntry(); + } + string[] tagNameAndValue = line.Split(new char[] + { + ':' + }, 2, StringSplitOptions.None); + string tagName = tagNameAndValue[0]; + string tagValue = string.Empty; + if (tagNameAndValue.Length > 1) + { + tagValue = tagNameAndValue[1]; + } + string[] tagPropTypeAndValue = tagValue.Split(new char[] + { + ',' + }, 2, StringSplitOptions.None); + string tagPropType = tagPropTypeAndValue[0]; + string tagPropValue = string.Empty; + if (tagPropTypeAndValue.Length > 1) + { + tagPropValue = tagPropTypeAndValue[1]; + } + string text = tagName; + if (text != null) + { + if (text == "EXTINF") + { + text = tagPropType; + if (text != null) + { + if (text == "189") + { + nextEntry.Title = tagPropValue; + } + } + } + } + } + else + { + if (nextEntry == null) + { + nextEntry = new PlaylistEntry(); + } + nextEntry.FileName = line; + objm.Entries.Add(nextEntry); + nextEntry = null; + } + } + } + if (nextEntry != null) + { + objm.Entries.Add(nextEntry); + nextEntry = null; + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + Writer tw = base.Accessor.Writer; + tw.WriteLine("#EXTM3U"); + PlaylistObjectModel objm = (objectModel as PlaylistObjectModel); + foreach (PlaylistEntry entry in objm.Entries) + { + if (!string.IsNullOrEmpty(entry.Title)) + { + tw.WriteLine("#EXTINF:189," + entry.Title); + } + tw.WriteLine(entry.FileName); + } + tw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/NotepadPlusPlaylistDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/NotepadPlusPlaylistDataFormat.cs new file mode 100644 index 00000000..5953f73e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/NotepadPlusPlaylistDataFormat.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class NotepadPlusPlaylistDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override bool IsObjectModelSupported(ObjectModel omb) + { + MarkupObjectModel mom = (omb as MarkupObjectModel); + if (mom == null) return false; + return (mom.Elements.Count > 0 && mom.Elements[0].FullName == "NotepadPlus"); + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement tagMainView = mom.FindElement("NotepadPlus", "Session", "mainView") as MarkupTagElement; + if (tagMainView != null) + { + foreach (MarkupElement el in tagMainView.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + if (tag.Name == "File") + { + if (tag.Attributes["filename"] != null) + { + string fileName = tag.Attributes["filename"].Value; + PlaylistEntry entry = new PlaylistEntry(); + entry.FileName = fileName; + pom.Entries.Add(entry); + } + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupTagElement tagNotepadPlus = new MarkupTagElement(); + tagNotepadPlus.Name = "NotepadPlus"; + MarkupTagElement tagSession = new MarkupTagElement(); + tagSession.Name = "Session"; + tagSession.Attributes.Add("activeView", "0"); + MarkupTagElement tagMainView = new MarkupTagElement(); + tagMainView.Name = "mainView"; + tagMainView.Attributes.Add("activeIndex", "0"); + foreach (PlaylistEntry entry in pom.Entries) + { + MarkupTagElement tagFile = new MarkupTagElement(); + tagFile.Name = "File"; + tagFile.Attributes.Add("firstVisibleLine", "4"); + tagFile.Attributes.Add("xOffset", "0"); + tagFile.Attributes.Add("scrollWidth", "886935"); + tagFile.Attributes.Add("startPos", "440"); + tagFile.Attributes.Add("endPos", "440"); + tagFile.Attributes.Add("selMode", "0"); + tagFile.Attributes.Add("lang", "Normal Text"); + tagFile.Attributes.Add("encoding", "-1"); + tagFile.Attributes.Add("filename", entry.FileName); + tagMainView.Elements.Add(tagFile); + } + tagSession.Elements.Add(tagMainView); + MarkupTagElement tagSubView = new MarkupTagElement(); + tagSubView.Name = "subView"; + tagSubView.Attributes.Add("activeIndex", "0"); + tagSession.Elements.Add(tagSubView); + tagNotepadPlus.Elements.Add(tagSession); + mom.Elements.Add(tagNotepadPlus); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/PLSDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/PLSDataFormat.cs new file mode 100644 index 00000000..e07f6406 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/PLSDataFormat.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.PropertyList; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class PLSDataFormat : WindowsConfigurationDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = new DataFormatReference(GetType()); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.Add("audio/x-scpls"); + return dfr; + } + + private int mvarVersion = 2; + public int Version { get { return mvarVersion; } set { mvarVersion = value; } } + + + public PLSDataFormat() + { + PropertyValuePrefix = String.Empty; + PropertyValueSuffix = String.Empty; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + PropertyListObjectModel plom = objectModels.Pop() as PropertyListObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + if (plom.Groups["playlist"] != null && plom.Groups["playlist"].Properties["NumberOfEntries"] != null) + { + if (plom.Groups["playlist"].Properties["Version"] == null) + { + this.mvarVersion = int.Parse(plom.Groups["playlist"].Properties["Version"].Value.ToString()); + } + int numberOfEntries = int.Parse(plom.Groups["playlist"].Properties["NumberOfEntries"].Value.ToString()); + for (int i = 1; i <= numberOfEntries; i++) + { + if (plom.Groups["playlist"].Properties["File" + i.ToString()] != null) + { + string FileName = plom.Groups["playlist"].Properties["File" + i.ToString()].Value.ToString(); + PlaylistEntry entry = new PlaylistEntry(); + entry.FileName = FileName; + if (plom.Groups["playlist"].Properties["Title" + i.ToString()] != null) + { + entry.Title = plom.Groups["playlist"].Properties["Title" + i.ToString()].Value.ToString(); + } + if (plom.Groups["playlist"].Properties["Length" + i.ToString()] != null) + { + entry.Length = long.Parse(plom.Groups["playlist"].Properties["Length" + i.ToString()].Value.ToString()); + } + pom.Entries.Add(entry); + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + PropertyListObjectModel plom = new PropertyListObjectModel(); + Group grpPlaylist = new Group(); + grpPlaylist.Name = "playlist"; + grpPlaylist.Properties.Add("NumberOfEntries", pom.Entries.Count); + grpPlaylist.Properties.Add("Version", mvarVersion); + foreach (PlaylistEntry entry in pom.Entries) + { + int i = pom.Entries.IndexOf(entry) + 1; + grpPlaylist.Properties.Add("File" + i.ToString(), entry.FileName); + if (!String.IsNullOrEmpty(entry.Title)) + { + grpPlaylist.Properties.Add("Title" + i.ToString(), entry.Title); + } + grpPlaylist.Properties.Add("Length" + i.ToString(), entry.Length); + } + plom.Groups.Add(grpPlaylist); + objectModels.Push(plom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/SMILDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/SMILDataFormat.cs new file mode 100644 index 00000000..54e52266 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/SMILDataFormat.cs @@ -0,0 +1,194 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.ObjectModels.Markup; +using UniversalEditor.DataFormats.Markup.XML; + +using UniversalEditor.ObjectModels.Multimedia.Playlist; + +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class SMILDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.AddRange("application/smil+xml", "application/vnd.ms-wpl"); + return dfr; + } + protected override bool IsObjectModelSupported(ObjectModel objectModel) + { + MarkupObjectModel mom = objectModel as MarkupObjectModel; + return mom.Elements.Count > 0 && mom.Elements[0].FullName == "smil"; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement head = (mom.FindElement("smil", "head") as MarkupTagElement); + if (head != null) + { + foreach (MarkupElement headEl in head.Elements) + { + if (headEl is MarkupTagElement) + { + MarkupTagElement tagEl = headEl as MarkupTagElement; + string name2 = tagEl.Name; + if (name2 != null) + { + if (!(name2 == "meta")) + { + if (!(name2 == "author")) + { + if (name2 == "title") + { + pom.Title = tagEl.Value; + } + } + else + { + pom.Author = tagEl.Value; + } + } + else + { + if (tagEl.Attributes["name"] != null) + { + string name = tagEl.Attributes["name"].Value; + string value = string.Empty; + if (tagEl.Attributes["content"] != null) + { + value = tagEl.Attributes["content"].Value; + } + pom.CustomInformation.Add(name, value); + } + } + } + } + } + } + MarkupTagElement seq = (mom.FindElement("smil", "body", "seq") as MarkupTagElement); + if (seq != null) + { + foreach (MarkupElement el in seq.Elements) + { + if (el is MarkupTagElement) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag.Name == "media" && tag.Attributes["src"] != null) + { + PlaylistEntry entry = new PlaylistEntry(); + entry.FileName = tag.Attributes["src"].Value; + if (tag.Attributes["albumTitle"] != null) + { + entry.Album.Title = tag.Attributes["albumTitle"].Value; + } + if (tag.Attributes["albumArtist"] != null) + { + entry.Album.Artist = tag.Attributes["albumArtist"].Value; + } + if (tag.Attributes["trackTitle"] != null) + { + entry.Title = tag.Attributes["trackTitle"].Value; + } + if (tag.Attributes["trackArtist"] != null) + { + entry.Author = tag.Attributes["trackArtist"].Value; + } + if (tag.Attributes["duration"] != null) + { + entry.Length = long.Parse(tag.Attributes["duration"].Value); + } + else + { + entry.Length = -1L; + } + pom.Entries.Add(entry); + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupTagElement smil = new MarkupTagElement(); + smil.Name = "smil"; + MarkupTagElement head = new MarkupTagElement(); + head.Name = "head"; + MarkupTagElement guid = new MarkupTagElement(); + guid.Name = "guid"; + guid.Value = "{" + pom.ID.ToString().ToUpper() + "}"; + head.Elements.Add(guid); + if (!string.IsNullOrEmpty(pom.Title)) + { + MarkupTagElement tagPlaylistTitle = new MarkupTagElement(); + tagPlaylistTitle.Name = "title"; + tagPlaylistTitle.Value = pom.Title; + head.Elements.Add(tagPlaylistTitle); + } + if (!string.IsNullOrEmpty(pom.Author)) + { + MarkupTagElement tagPlaylistAuthor = new MarkupTagElement(); + tagPlaylistAuthor.Name = "author"; + tagPlaylistAuthor.Value = pom.Author; + head.Elements.Add(tagPlaylistAuthor); + } + foreach (KeyValuePair kvp in pom.CustomInformation) + { + MarkupTagElement tagMeta = new MarkupTagElement(); + tagMeta.Name = "meta"; + tagMeta.Attributes.Add("name", kvp.Key); + tagMeta.Attributes.Add("content", kvp.Value); + head.Elements.Add(tagMeta); + } + smil.Elements.Add(head); + MarkupTagElement body = new MarkupTagElement(); + body.Name = "body"; + MarkupTagElement seq = new MarkupTagElement(); + seq.Name = "seq"; + foreach (PlaylistEntry entry in pom.Entries) + { + MarkupTagElement media = new MarkupTagElement(); + media.Name = "media"; + media.Attributes.Add("src", entry.FileName); + if (!string.IsNullOrEmpty(entry.Album.Title)) + { + media.Attributes.Add("albumTitle", entry.Album.Title); + } + if (!string.IsNullOrEmpty(entry.Album.Artist)) + { + media.Attributes.Add("albumArtist", entry.Album.Artist); + } + if (!string.IsNullOrEmpty(entry.Title)) + { + media.Attributes.Add("trackTitle", entry.Title); + } + if (!string.IsNullOrEmpty(entry.Author)) + { + media.Attributes.Add("trackArtist", entry.Author); + } + if (entry.Length > -1L) + { + media.Attributes.Add("duration", entry.Length.ToString()); + } + seq.Elements.Add(media); + } + body.Elements.Add(seq); + smil.Elements.Add(body); + mom.Elements.Add(smil); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/XSPFDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/XSPFDataFormat.cs new file mode 100644 index 00000000..831f8e54 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Playlist/XSPFDataFormat.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.ObjectModels.Multimedia.Playlist; +using UniversalEditor.ObjectModels.Markup; + +namespace UniversalEditor.DataFormats.Multimedia.Playlist +{ + public class XSPFDataFormat : XMLDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override bool IsObjectModelSupported(ObjectModel objectModel) + { + MarkupObjectModel mom = (objectModel as MarkupObjectModel); + if (mom == null) return false; + + return ((mom.Elements.Count > 0) && (mom.Elements[0].Name == "playlist")); + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement tagPlaylist = mom.FindElement("playlist") as MarkupTagElement; + if (tagPlaylist != null) + { + if (tagPlaylist.Elements["title"] != null) + { + pom.Title = tagPlaylist.Elements["title"].Value; + } + MarkupTagElement tagTrackList = tagPlaylist.Elements["trackList"] as MarkupTagElement; + if (tagTrackList != null) + { + foreach (MarkupElement el in tagTrackList.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + if (tag.Name == "track") + { + PlaylistEntry entry = new PlaylistEntry(); + if (tag.Elements["location"] != null) + { + string fileName = tag.Elements["location"].Value; + if (fileName.StartsWith("file://")) + { + fileName = fileName.Substring(8); + fileName = fileName.UrlDecode(); + if (fileName.Length > 1 && fileName[1] == ':') + { + fileName = fileName.Replace('/', System.IO.Path.DirectorySeparatorChar); + } + else + { + fileName = "/" + fileName; + } + } + if (fileName.StartsWith("//")) + { + fileName = fileName.Substring(1); + } + entry.FileName = fileName; + } + if (tag.Elements["title"] != null) + { + entry.Title = tag.Elements["title"].Value; + } + if (tag.Elements["creator"] != null) + { + entry.Author = tag.Elements["creator"].Value; + } + if (tag.Elements["album"] != null) + { + entry.Album.Title = tag.Elements["album"].Value; + } + if (tag.Elements["trackNum"] != null) + { + entry.TrackNumber = int.Parse(tag.Elements["trackNum"].Value); + } + if (tag.Elements["image"] != null) + { + entry.AlbumArtImageURL = tag.Elements["image"].Value; + } + if (tag.Elements["duration"] != null) + { + entry.Length = long.Parse(tag.Elements["duration"].Value); + } + pom.Entries.Add(entry); + } + } + } + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/QuickSub/QuickSubTextDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/QuickSub/QuickSubTextDataFormat.cs new file mode 100644 index 00000000..0938ba7a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/QuickSub/QuickSubTextDataFormat.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.DataFormats.PropertyList.Text; +using UniversalEditor.ObjectModels.Multimedia.Subtitle; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.DataFormats.Multimedia.Subtitle.QuickSub +{ + public class QuickSubTextDataFormat : TextPropertyListDataFormat + { + public QuickSubTextDataFormat() + { + Settings.PropertyNameValueSeparators = new string[] { "\t" }; + } + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(this.GetType()); + _dfr.Capabilities.Add(typeof(SubtitleObjectModel), DataFormatCapabilities.All); + _dfr.Capabilities.Add(typeof(PropertyListObjectModel), DataFormatCapabilities.None); + } + return _dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel); + SubtitleObjectModel subtitle = (objectModels.Pop() as SubtitleObjectModel); + if (subtitle == null) throw new ObjectModelNotSupportedException(); + + Group grpEvents = plom.Groups["Events"]; + foreach (Property property in grpEvents.Properties) + { + if (property.Value == null || property.Name == "-") + { + // get the previous event + if (subtitle.Events.Count < 1) continue; + + Event evt = subtitle.Events[subtitle.Events.Count - 1]; + if (property.Value == null) + { + evt.Text += "\r\n" + property.Name; + } + else + { + evt.Text += "\r\n" + property.Value.ToString(); + } + } + else + { + string[] values = property.Value.ToString().Split(new char[] { '\t' }, 5, StringSplitOptions.RemoveEmptyEntries); + + string[] startTime = property.Name.Split(new char[] { ':' }); + string[] endTime = values[0].Trim().Split(new char[] { ':' }); + + int sh = 0, sm = 0, ss = 0; + if (startTime.Length >= 1) + { + ss = Int32.Parse(startTime[startTime.Length - 1]); + if (startTime.Length >= 2) + { + sm = Int32.Parse(startTime[startTime.Length - 2]); + if (startTime.Length >= 3) + { + sh = Int32.Parse(startTime[startTime.Length - 3]); + } + } + } + + string language = values[1].Trim(); + string actor = values[2].Trim(); + string text = values[3].Trim(); + + Event evt = new Event(); + evt.StartTimestamp = DateTime.Today.Add(new TimeSpan(sh, sm, ss)); + if (values[0].Trim() != "-") + { + int eh = 0, em = 0, es = 0; + if (endTime.Length >= 1) + { + es = Int32.Parse(endTime[endTime.Length - 1]); + if (endTime.Length >= 2) + { + em = Int32.Parse(endTime[endTime.Length - 2]); + if (endTime.Length >= 3) + { + eh = Int32.Parse(endTime[endTime.Length - 3]); + } + } + } + evt.EndTimestamp = DateTime.Today.Add(new TimeSpan(eh, em, es)); + } + else + { + evt.EndTimestamp = evt.StartTimestamp.AddSeconds(5); + } + + evt.Actor = new Actor(); + evt.Actor.Name = actor; + evt.Text = text; + subtitle.Events.Add(evt); + } + } + } + + protected override void BeforeSaveInternal(Stack objectModels) + { + SubtitleObjectModel subtitle = (objectModels.Pop() as SubtitleObjectModel); + PropertyListObjectModel plom = new PropertyListObjectModel(); + + plom.Title = "QuickSub Text File Format"; + + objectModels.Push(plom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubRip/SubRipDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubRip/SubRipDataFormat.cs new file mode 100644 index 00000000..e5298857 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubRip/SubRipDataFormat.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.Multimedia.Subtitle; + +namespace UniversalEditor.DataFormats.Multimedia.Subtitle.SubRip +{ + public class SubRipDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(SubtitleObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + SubtitleObjectModel subtitle = (objectModel as SubtitleObjectModel); + if (subtitle == null) throw new ObjectModelNotSupportedException(); + + IO.Reader tr = base.Accessor.Reader; + while (!tr.EndOfStream) + { + string index = tr.ReadLine(); + if (index == String.Empty || tr.EndOfStream) return; + + string duration = tr.ReadLine(); + if (tr.EndOfStream) return; + + string text = tr.ReadLine(); + + Event evt = new Event(); + // evt.Index = Int32.Parse(index); + string[] timingData = duration.Split(new string[] { "-->" }); + if (timingData.Length >= 1) + { + string startTimeS = timingData[0].Trim(); + string endTimeS = String.Empty; + + evt.StartTimestamp = DateTime.Parse(startTimeS); + if (timingData.Length >= 2) + { + endTimeS = timingData[1].Trim(); + evt.EndTimestamp = DateTime.Parse(startTimeS); + } + } + evt.Text = text; + subtitle.Events.Add(evt); + + if (tr.EndOfStream) return; + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + SubtitleObjectModel subtitle = (objectModel as SubtitleObjectModel); + if (subtitle == null) throw new ObjectModelNotSupportedException(); + + IO.Writer tw = base.Accessor.Writer; + + int index = 1; + foreach (Event evt in subtitle.Events) + { + tw.WriteLine(index.ToString()); + + StringBuilder sb = new StringBuilder(); + sb.Append(evt.StartTimestamp.ToString("HH:MM:SS,TTT")); + sb.Append(" --> "); + sb.Append(evt.EndTimestamp.ToString("HH:MM:SS,TTT")); + + if (!evt.Position.IsEmpty) + { + sb.Append(" X1:"); + sb.Append(evt.Position.X.ToString()); + sb.Append(" X2:"); + sb.Append(evt.Position.X.ToString()); + sb.Append(" Y1:"); + sb.Append(evt.Position.Y.ToString()); + sb.Append(" Y2:"); + sb.Append(evt.Position.Y.ToString()); + } + + tw.WriteLine(sb.ToString()); + tw.WriteLine(evt.Text); + } + tw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubStationAlpha/SubStationAlphaDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubStationAlpha/SubStationAlphaDataFormat.cs new file mode 100644 index 00000000..a1d3bcdd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Subtitle/SubStationAlpha/SubStationAlphaDataFormat.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.ObjectModels.PropertyList; +using UniversalEditor.DataFormats.PropertyList; + +using UniversalEditor.ObjectModels.Multimedia.Subtitle; + +namespace UniversalEditor.DataFormats.Multimedia.Subtitle.SubStationAlpha +{ + public class SubStationAlphaDataFormat : WindowsConfigurationDataFormat + { + public SubStationAlphaDataFormat() + { + PropertyNameValueSeparator = ": "; + PropertyValuePrefix = String.Empty; + PropertyValueSuffix = String.Empty; + } + + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(SubtitleObjectModel), DataFormatCapabilities.All); + _dfr.ExportOptions.Add(new CustomOptionText("Title", "&Title:")); + _dfr.ExportOptions.Add(new CustomOptionFile("VideoFileName", "&Video file:", String.Empty, "*.asf;*.avi;*.avs;*.d2v;*.m2ts;*.m4v;*.mkv;*.mov;*.mp4;*.mpeg;*.mpg;*.ogm;*.webm;*.wmv;*.ts;*.y4m;*.yuv")); + } + return _dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + } + protected override void BeforeSaveInternal(Stack objectModels) + { + SubtitleObjectModel subtitle = (objectModels.Pop() as SubtitleObjectModel); + if (subtitle == null) throw new ObjectModelNotSupportedException(); + + PropertyListObjectModel plom = new PropertyListObjectModel(); + + Group grpScriptInfo = plom.Groups.Add("Script Info"); + grpScriptInfo.Properties.Add("Title", mvarTitle); + grpScriptInfo.Properties.Add("ScriptType", "v4.00+"); + grpScriptInfo.Properties.Add("WrapStyle", "0"); + grpScriptInfo.Properties.Add("ScaledBorderAndShadow", "yes"); + grpScriptInfo.Properties.Add("Collisions", "Normal"); + grpScriptInfo.Properties.Add("PlayResX", "1280"); + grpScriptInfo.Properties.Add("PlayResY", "720"); + grpScriptInfo.Properties.Add("Scroll Position", "0"); + grpScriptInfo.Properties.Add("Active Line", "0"); + grpScriptInfo.Properties.Add("Video Zoom Percent", "0.5"); + grpScriptInfo.Properties.Add("Video File", mvarVideoFileName); + grpScriptInfo.Properties.Add("Video Aspect Ratio", "c1.77778"); + grpScriptInfo.Properties.Add("Video Position", "0"); + grpScriptInfo.Properties.Add("Last Style Storage", "Default"); + grpScriptInfo.Properties.Add("Export Encoding", "Unicode (UTF-8)"); + grpScriptInfo.Properties.Add("YCbCr Matrix", "TV.601"); + + Group grpV4Styles = plom.Groups.Add("V4+ Styles"); + grpV4Styles.Properties.Add("Format", "Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding"); + foreach (Style style in subtitle.Styles) + { + grpV4Styles.Properties.Add("Style", style.Name + "," + style.FontName + "," + style.FontSize + "," + ToHexadecimalVB(style.PrimaryColor) + "," + ToHexadecimalVB(style.SecondaryColor) + "," + ToHexadecimalVB(style.OutlineColor) + "," + ToHexadecimalVB(style.BackgroundColor) + "," + (style.Bold ? "1" : "0") + (style.Italic ? "1" : "0") + (style.Underline ? "1" : "0") + (style.Strikethrough ? "1" : "0") + "," + (style.ScaleX * 100).ToString() + ",100,0,0,1,2,2,2,10,10,10,1"); + } + + Group grpEvents = plom.Groups.Add("Events"); + grpEvents.Properties.Add("Format", "Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); + foreach (Event evt in subtitle.Events) + { + StringBuilder sb = new StringBuilder(); + if (!evt.Position.IsEmpty) + { + sb.Append("{\\pos(" + evt.Position.X + "," + evt.Position.Y + ")}"); + } + sb.Append(evt.Text); + + string styleName = String.Empty; + if (evt.Style != null) + { + styleName = evt.Style.Name; + } + else if (subtitle.Styles.Count > 0) + { + styleName = subtitle.Styles[0].Name; + } + string actorName = String.Empty; + if (evt.Actor != null) actorName = evt.Actor.Name; + + grpEvents.Properties.Add("Dialogue", "0," + evt.StartTimestamp.ToString("H:MM:SS.TT") + "," + evt.EndTimestamp.ToString("H:MM:SS.TT") + "," + styleName + "," + actorName + "," + "0,0,0,," + sb.ToString()); + } + + objectModels.Push(plom); + } + + private string ToHexadecimalVB(Color color) + { + StringBuilder sb = new StringBuilder(); + sb.Append("&H"); + sb.Append((color.Red * 255).ToString("X")); + sb.Append((color.Green * 255).ToString("X")); + sb.Append((color.Blue * 255).ToString("X")); + sb.Append((color.Alpha * 255).ToString("X")); + return sb.ToString(); + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarVideoFileName = String.Empty; + public string VideoFileName { get { return mvarVideoFileName; } set { mvarVideoFileName = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/VectorImage/Microsoft/ExpressionDesign/ExpressionDesignDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/VectorImage/Microsoft/ExpressionDesign/ExpressionDesignDataFormat.cs new file mode 100644 index 00000000..b2790e08 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/VectorImage/Microsoft/ExpressionDesign/ExpressionDesignDataFormat.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.VectorImage; + +namespace UniversalEditor.DataFormats.Multimedia.VectorImage.Microsoft.ExpressionDesign +{ + public class ExpressionDesignDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Capabilities.Add(typeof(VectorImageObjectModel), DataFormatCapabilities.All); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + VectorImageObjectModel vector = (objectModel as VectorImageObjectModel); + if (vector == null) throw new ObjectModelNotSupportedException(); + + Reader reader = base.Accessor.Reader; + + string signature = reader.ReadFixedLengthString(9); + if (signature != "\n") throw new InvalidDataFormatException(); + + reader.Accessor.Seek(32, SeekOrigin.Begin); + byte[] compressedData = reader.ReadToEnd(); + + System.IO.File.WriteAllBytes(@"C:\Users\Mike Becker\Documents\Expression\Expression Design\Untitled1.compressed", compressedData); + + UniversalEditor.Compression.CompressionModule module = UniversalEditor.Compression.CompressionModule.FromKnownCompressionMethod(Compression.CompressionMethod.Zlib); + byte[] decompressedData = module.Decompress(compressedData); + + System.IO.File.WriteAllBytes(@"C:\Users\Mike Becker\Documents\Expression\Expression Design\Untitled1.decompressed", decompressedData); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/AVI/AVIDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/AVI/AVIDataFormat.cs new file mode 100644 index 00000000..b472d8ab --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/AVI/AVIDataFormat.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.ObjectModels.Chunked; +using UniversalEditor.DataFormats.Chunked.RIFF; + +using UniversalEditor.ObjectModels.Multimedia.Video; + +namespace UniversalEditor.DataFormats.Multimedia.Video.AVI +{ + public class AVIDataFormat : RIFFDataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Clear(); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + ChunkedObjectModel riff = objectModels.Pop() as ChunkedObjectModel; + VideoObjectModel video = objectModels.Pop() as VideoObjectModel; + + RIFFChunk aviChunk = riff.Chunks["AVI "]; + + if (aviChunk == null) throw new InvalidDataFormatException("Could not read initial AVI chunk"); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Bink/BinkDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Bink/BinkDataFormat.cs new file mode 100644 index 00000000..b2360cb0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Bink/BinkDataFormat.cs @@ -0,0 +1,100 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Video; +namespace UniversalEditor.DataFormats.Multimedia.Video.RAD.Bink +{ + public class BinkDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + dfr.Sources.Add("http://wiki.multimedia.cx/index.php?title=Smacker"); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + VideoObjectModel video = (objectModel as VideoObjectModel); + if (video != null) + { + Reader br = base.Accessor.Reader; + string BIK = br.ReadFixedLengthString(3); + byte videoCodecRevision = br.ReadByte(); + int fileSize = br.ReadInt32(); + int frameCount = br.ReadInt32(); + int largestFrameSize = br.ReadInt32(); + int frameCount2 = br.ReadInt32(); + int videoWidth = br.ReadInt32(); + int videoHeight = br.ReadInt32(); + int videoFramesPerSecondDividend = br.ReadInt32(); + int videoFramesPerSecondDivisor = br.ReadInt32(); + int videoFlags = br.ReadInt32(); + int audioTrackCount = br.ReadInt32(); + for (int i = 0; i < audioTrackCount; i++) + { + byte[] unknown = br.ReadBytes(2u); + short audioChannels = br.ReadInt16(); + } + for (int i = 0; i < audioTrackCount; i++) + { + ushort audioSampleRate = br.ReadUInt16(); + short flags = br.ReadInt16(); + } + for (int i = 0; i < audioTrackCount; i++) + { + int audioTrackID = br.ReadInt32(); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + VideoObjectModel video = objectModel as VideoObjectModel; + if (video != null) + { + Writer bw = base.Accessor.Writer; + bw.WriteFixedLengthString("BIK"); + byte videoCodecRevision = 98; + bw.WriteByte(videoCodecRevision); + int fileSize = 0; + bw.WriteInt32(fileSize); + int frameCount = 0; + bw.WriteInt32(frameCount); + int largestFrameSize = 0; + bw.WriteInt32(largestFrameSize); + bw.WriteInt32(frameCount); + int videoWidth = 320; + bw.WriteInt32(videoWidth); + int videoHeight = 240; + bw.WriteInt32(videoHeight); + int videoFramesPerSecondDividend = 24; + bw.WriteInt32(videoFramesPerSecondDividend); + int videoFramesPerSecondDivisor = 1; + bw.WriteInt32(videoFramesPerSecondDivisor); + int videoFlags = 0; + bw.WriteInt32(videoFlags); + int audioTrackCount = 0; + bw.WriteInt32(audioTrackCount); + for (int i = 0; i < audioTrackCount; i++) + { + byte[] unknown = new byte[2]; + bw.WriteBytes(unknown); + short audioChannels = 1; + bw.WriteInt16(audioChannels); + } + for (int i = 0; i < audioTrackCount; i++) + { + ushort audioSampleRate = 44100; + bw.WriteUInt16(audioSampleRate); + short flags = 0; + bw.WriteInt16(flags); + } + for (int i = 0; i < audioTrackCount; i++) + { + int audioTrackID = 0; + bw.WriteInt32(audioTrackID); + } + bw.Flush(); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Smacker/SmackerDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Smacker/SmackerDataFormat.cs new file mode 100644 index 00000000..e25e7981 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/RAD/Smacker/SmackerDataFormat.cs @@ -0,0 +1,52 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Video; +namespace UniversalEditor.DataFormats.Multimedia.Video.RAD.Smacker +{ + public class SmackerDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + dfr.Sources.Add("http://wiki.multimedia.cx/index.php?title=Smacker"); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(4); + int width = br.ReadInt32(); + int height = br.ReadInt32(); + int frames = br.ReadInt32(); + int frameRate = br.ReadInt32(); + if (frameRate > 0) + { + int framesPerSecond = 1000 / frameRate; + } + else + { + if (frameRate < 0) + { + int framesPerSecond = 100000 / -frameRate; + } + } + int flags = br.ReadInt32(); + int[] audioSize = br.ReadInt32Array(7); + int TreesSize = br.ReadInt32(); + int MMap_Size = br.ReadInt32(); + int MClr_Size = br.ReadInt32(); + int Full_Size = br.ReadInt32(); + int Type_Size = br.ReadInt32(); + int[] audioRate = br.ReadInt32Array(7); + int dummy = br.ReadInt32(); + int[] frameSizes = br.ReadInt32Array(frames); + byte[] frameTypes = br.ReadBytes(frames); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQChunk.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQChunk.cs new file mode 100644 index 00000000..328b38da --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQChunk.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.ObjectModel; +namespace UniversalEditor.DataFormats.Multimedia.Video.ROQ +{ + public class ROQChunk + { + public class ROQChunkCollection : Collection + { + } + private short mvarID = 0; + private short mvarArgument = 0; + private byte[] mvarData = new byte[0]; + public short ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public short Argument + { + get + { + return this.mvarArgument; + } + set + { + this.mvarArgument = value; + } + } + public byte[] Data + { + get + { + return this.mvarData; + } + set + { + this.mvarData = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQDataFormat.cs new file mode 100644 index 00000000..fd196023 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/ROQ/ROQDataFormat.cs @@ -0,0 +1,71 @@ +using System; +using UniversalEditor.Accessors; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; +using UniversalEditor.ObjectModels.Multimedia.Video; +namespace UniversalEditor.DataFormats.Multimedia.Video.ROQ +{ + public class ROQDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + dfr.Sources.Add("http://multimedia.cx/mirror/idroq.txt"); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + byte[] signature = br.ReadBytes(8u); + VideoObjectModel vom = objectModel as VideoObjectModel; + WaveformAudioObjectModel wave = new WaveformAudioObjectModel(); + AudioTrack audio = new AudioTrack(); + VideoTrack video = new VideoTrack(); + video.FrameRate = 30; + wave.Header.BitsPerSample = 16; + wave.Header.SampleRate = 22050; + while (!br.EndOfStream) + { + ROQChunk chunk = new ROQChunk(); + chunk.ID = br.ReadInt16(); + int size = br.ReadInt32(); + chunk.Argument = br.ReadInt16(); + chunk.Data = br.ReadBytes(size); + short iD = chunk.ID; + switch (iD) + { + case 4097: + { + Reader brch = new Reader(new MemoryAccessor(chunk.Data)); + video.Width = (int)brch.ReadInt16(); + video.Height = (int)brch.ReadInt16(); + video.BlockDimension = (int)brch.ReadInt16(); + video.SubBlockDimension = (int)brch.ReadInt16(); + brch.Close(); + break; + } + case 4098: + { + break; + } + default: + { + if (iD != 4113) + { + switch (iD) + { + } + } + break; + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/THP/THPDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/THP/THPDataFormat.cs new file mode 100644 index 00000000..c00a306a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/THP/THPDataFormat.cs @@ -0,0 +1,76 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Video; +namespace UniversalEditor.DataFormats.Multimedia.Video.THP +{ + public class THPDataFormat : DataFormat + { + protected override DataFormatReference MakeReferenceInternal() + { + DataFormatReference dfr = base.MakeReferenceInternal(); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + string signature = br.ReadFixedLengthString(4); + uint version = br.ReadUInt32(); + uint maxBufferSize = br.ReadUInt32(); + uint maxAudioSamples = br.ReadUInt32(); + float fps = br.ReadSingle(); + uint numFrames = br.ReadUInt32(); + uint firstFrameSize = br.ReadUInt32(); + uint dataSize = br.ReadUInt32(); + uint componentDataOffset = br.ReadUInt32(); + uint offsetsDataOffset = br.ReadUInt32(); + uint firstFrameOffset = br.ReadUInt32(); + uint lastFrameOffset = br.ReadUInt32(); + br.Accessor.Seek((long)((ulong)componentDataOffset), SeekOrigin.Begin); + uint numComponents = br.ReadUInt32(); + byte[] componentTypes = new byte[(int)((UIntPtr)numComponents)]; + for (uint i = 0u; i < numComponents; i += 1u) + { + componentTypes[(int)((UIntPtr)i)] = br.ReadByte(); + switch (componentTypes[(int)((UIntPtr)i)]) + { + case 0: + { + uint width = br.ReadUInt32(); + uint height = br.ReadUInt32(); + if (version == 69632u) + { + uint unknown = br.ReadUInt32(); + } + break; + } + case 1: + { + uint numChannels = br.ReadUInt32(); + uint frequency = br.ReadUInt32(); + uint numSamples = br.ReadUInt32(); + uint numData = br.ReadUInt32(); + break; + } + } + } + br.Accessor.Seek((long)((ulong)firstFrameOffset), SeekOrigin.Begin); + uint nextTotalSize = br.ReadUInt32(); + uint prevTotalSize = br.ReadUInt32(); + uint imageSize = br.ReadUInt32(); + if (maxAudioSamples != 0u) + { + uint audioSize = br.ReadUInt32(); + } + uint channelSize = br.ReadUInt32(); + uint numSamples2 = br.ReadUInt32(); + ushort[] table = br.ReadUInt16Array(16); + ushort[] table2 = br.ReadUInt16Array(16); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UEV/UEVDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UEV/UEVDataFormat.cs new file mode 100644 index 00000000..f8185e9b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UEV/UEVDataFormat.cs @@ -0,0 +1,95 @@ +using System; +using System.Drawing; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.Multimedia.Video; + +namespace UniversalEditor.DataFormats.Multimedia.Video.UEV +{ + public class UEVDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Universal Editor video", new byte?[][] { new byte?[] { new byte?(85), new byte?(69), new byte?(86), new byte?(105), new byte?(100), new byte?(101), new byte?(111), new byte?(90) } }, new string[] { "*.uev" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private Version mvarVersion = new Version(); + public Version Version { get { return mvarVersion; } set { mvarVersion = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + VideoObjectModel vom = objectModel as VideoObjectModel; + BinaryReader br = base.Stream.BinaryReader; + string UEVideoZ = br.ReadFixedLengthString(8); + if (!(UEVideoZ != "UEVideoZ")) + { + int versionMajor = br.ReadInt32(); + int versionMinor = br.ReadInt32(); + int versionBuild = br.ReadInt32(); + int versionRevision = br.ReadInt32(); + this.mvarVersion = new Version(versionMajor, versionMinor, versionBuild, versionRevision); + int audioTrackCount = br.ReadInt32(); + for (int i = 0; i < audioTrackCount; i++) + { + int audioTrackFormat = br.ReadInt32(); + int audioTrackSize = br.ReadInt32(); + } + int videoTrackCount = br.ReadInt32(); + for (int i = 0; i < videoTrackCount; i++) + { + int frameCount = br.ReadInt32(); + for (int j = 0; j < frameCount; j++) + { + int frameSize = br.ReadInt32(); + byte[] frameBytes = br.ReadBytes(frameSize); + System.IO.MemoryStream ms = new System.IO.MemoryStream(frameBytes); + Image frameImage = Image.FromStream(ms); + ms.Close(); + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + VideoObjectModel vom = objectModel as VideoObjectModel; + BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteFixedLengthString("UEVideoZ"); + bw.Write(this.mvarVersion.Major); + bw.Write(this.mvarVersion.Minor); + bw.Write(this.mvarVersion.Build); + bw.Write(this.mvarVersion.Revision); + bw.Write(vom.AudioTracks.Count); + for (int i = 0; i < vom.AudioTracks.Count; i++) + { + AudioTrack audio = vom.AudioTracks[i]; + bw.Write(audio.ObjectModel.Header.BitsPerSample); + bw.Write(audio.ObjectModel.Header.BlockAlignment); + bw.Write(audio.ObjectModel.Header.ChannelCount); + bw.Write(audio.ObjectModel.Header.DataRate); + bw.Write(audio.ObjectModel.Header.FormatTag); + bw.Write(audio.ObjectModel.Header.SampleRate); + bw.Write(audio.ObjectModel.ExtendedHeader.Enabled); + if (audio.ObjectModel.ExtendedHeader.Enabled) + { + bw.Write(audio.ObjectModel.ExtendedHeader.ChannelMask); + bw.Write(audio.ObjectModel.ExtendedHeader.SubFormatGUID); + bw.Write(audio.ObjectModel.ExtendedHeader.ValidBitsPerSample); + } + // bw.WriteArray(audio.ObjectModel.RawSamples); + throw new NotImplementedException(); + } + bw.Write(vom.VideoTracks.Count); + for (int i = 0; i < vom.VideoTracks.Count; i++) + { + VideoTrack video = vom.VideoTracks[i]; + bw.Write(video.Frames.Count); + for (int j = 0; j < video.Frames.Count; j++) + { + VideoFrame frame = video.Frames[j]; + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSColorspace.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSColorspace.cs new file mode 100644 index 00000000..28aaba3f --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSColorspace.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Video.UVS +{ + public enum UVSColorspace + { + None = 0x00000000, + /// + /// Unspecified R'G'B' + /// + UnspecifiedRGB = 0x00000001, + /// + /// Unspecified Y'CbCr + /// + UnspecifiedYCbCr = 0x00000002 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSDataFormat.cs new file mode 100644 index 00000000..e7c4e5c9 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSDataFormat.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Video.UVS +{ + public class UVSDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = base.MakeReferenceInternal(); + _dfr.Sources.Add("http://wiki.xiph.org/OggUVS"); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.Reader br = base.Accessor.Reader; + #region Main Header Packet + string codecIdentifierWord1 = br.ReadFixedLengthString(4); + string codecIdentifierWord2 = br.ReadFixedLengthString(4); + if (codecIdentifierWord1 != "UVS " || codecIdentifierWord2 != " ") throw new InvalidDataFormatException("File does not begin with \"UVS \""); + + // Version Major (breaks backwards compatability to increment) + ushort versionMajor = br.ReadUInt16(); + // Version Minor (backwards compatable, ie, more supported format id's) + ushort versionMinor = br.ReadUInt16(); + + ushort displayWidth = br.ReadUInt16(); + ushort displayHeight = br.ReadUInt16(); + + ushort pixelAspectRatioNumerator = br.ReadUInt16(); + ushort pixelAspectRatioDenominator = br.ReadUInt16(); + double pixelAspectRatio = ((double)pixelAspectRatioNumerator / (double)pixelAspectRatioDenominator); + + ushort fieldRateNumerator = br.ReadUInt16(); + ushort fieldRateDenominator = br.ReadUInt16(); + double fieldRate = ((double)fieldRateNumerator / (double)fieldRateDenominator); + + uint timebase = br.ReadUInt32(); // in hertz + uint fieldImageSize = br.ReadUInt32(); // in bytes + uint extraHeaderCount= br.ReadUInt32(); + UVSColorspace colorspace = (UVSColorspace)(br.ReadUInt32()); + + UVSFlags flags = (UVSFlags)(br.ReadUInt32()); + UVSLayoutID layoutID = new UVSLayoutID(br.ReadUInt32()); + #endregion + #region Comment packet + #endregion + if (layoutID == UVSLayoutID.Custom) + { + + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSFlags.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSFlags.cs new file mode 100644 index 00000000..d91bcbdc --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSFlags.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Video.UVS +{ + [Flags()] + public enum UVSFlags : uint + { + None = 0x00000000, + Interlaced = 0x00000001 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSLayoutID.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSLayoutID.cs new file mode 100644 index 00000000..c27b2009 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Video/UVS/UVSLayoutID.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.Multimedia.Video.UVS +{ + public struct UVSLayoutID : IComparable, IComparable + { + private uint mvarID; + public uint ID { get { return mvarID; } } + + public UVSLayoutID(uint id) + { + mvarID = id; + } + + /// + /// The layout is defined in the Data Layout Packet. + /// + public static readonly UVSLayoutID Custom = new UVSLayoutID(0); + /// + /// 8-bpp Y plane, followed by 8-bpp 2×2 V and U planes. + /// + public static readonly UVSLayoutID YV12 = new UVSLayoutID(0x32315659); + /// + /// 8-bpp Y plane, followed by 8-bpp 2×2 U and V planes. + /// + public static readonly UVSLayoutID IYUV = new UVSLayoutID(0x56555949); + /// + /// UV downsampled 2:1 horizontally, ordered Y0 U0 Y1 V0 + /// + public static readonly UVSLayoutID YUY2 = new UVSLayoutID(0x32595559); + /// + /// UV downsampled 2:1 horizontally, ordered U0 Y0 V0 Y1 + /// + public static readonly UVSLayoutID UYVY = new UVSLayoutID(0x59565955); + /// + /// UV downsampled 2:1 horizontally, ordered Y0 V0 Y1 U0 + /// + public static readonly UVSLayoutID YVYU = new UVSLayoutID(0x55595659); + /// + /// 8 bits per component, stored BGR, rows aligned to a 32 bit boundary, rows stored bottom first. + /// + public static readonly UVSLayoutID RGB24DIB = new UVSLayoutID(0x80808081); + /// + /// 8 bits per component, stored BGRx (x is don't care), rows stored bottom first. + /// + public static readonly UVSLayoutID RGB32DIB = new UVSLayoutID(0x80808082); + /// + /// 8 bits per component, stored BGRA, rows stored bottom first. + /// + public static readonly UVSLayoutID ARGBDIB = new UVSLayoutID(0x80808083); + + public int CompareTo(UVSLayoutID other) + { + return mvarID.CompareTo(other.ID); + } + public int CompareTo(uint other) + { + return mvarID.CompareTo(other); + } + + public override int GetHashCode() + { + return mvarID.GetHashCode(); + } + + public static bool operator ==(UVSLayoutID left, UVSLayoutID right) + { + return (left.mvarID == right.mvarID); + } + public static bool operator !=(UVSLayoutID left, UVSLayoutID right) + { + return (left.mvarID != right.mvarID); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapBitsPerPixel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapBitsPerPixel.cs new file mode 100644 index 00000000..dee5787a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapBitsPerPixel.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Bitmap +{ + public enum BitmapBitsPerPixel : short + { + /// + /// The number of bits-per-pixel is specified or is implied by the JPEG or PNG format. + /// + Implied = 0, + /// + /// The bitmap is monochrome, and the bmiColors member of BITMAPINFO contains two entries. Each bit + /// in the bitmap array represents a pixel. If the bit is clear, the pixel is displayed with the + /// color of the first entry in the bmiColors table; if the bit is set, the pixel has the color of + /// the second entry in the table. + /// + Monochrome = 1, + /// + /// The bitmap has a maximum of 16 colors, and the bmiColors member of BITMAPINFO contains up to 16 + /// entries. Each pixel in the bitmap is represented by a 4-bit index into the color table. For + /// example, if the first byte in the bitmap is 0x1F, the byte represents two pixels. The first pixel + /// contains the color in the second table entry, and the second pixel contains the color in the + /// sixteenth table entry. + /// + Color16 = 4, + /// + /// The bitmap has a maximum of 256 colors, and the bmiColors member of BITMAPINFO contains up to 256 + /// entries. In this case, each byte in the array represents a single pixel. + /// + Color256 = 8, + /// + /// + /// The bitmap has a maximum of 2^16 colors. If the biCompression member of the BITMAPINFOHEADER is + /// BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each WORD in the bitmap array represents a + /// single pixel. The relative intensities of red, green, and blue are represented with five bits for + /// each color component. The value for blue is in the least significant five bits, followed by five + /// bits each for green and red. The most significant bit is not used. The bmiColors color table is + /// used for optimizing colors used on palette-based devices, and must contain the number of entries + /// specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + /// + /// If the biCompression member of the BITMAPINFOHEADER is BI_BITFIELDS, the bmiColors member + /// contains three DWORD color masks that specify the red, green, and blue components, respectively, + /// of each pixel. Each WORD in the bitmap array represents a single pixel. + /// + /// + /// When the biCompression member is BI_BITFIELDS, bits set in each DWORD mask must be contiguous + /// and should not overlap the bits of another mask. All the bits in the pixel do not have to be + /// used. + /// + /// + HighColor = 16, + /// + /// The bitmap has a maximum of 2^24 colors, and the bmiColors member of BITMAPINFO is NULL. Each 3-byte + /// triplet in the bitmap array represents the relative intensities of blue, green, and red, respectively, + /// for a pixel. The bmiColors color table is used for optimizing colors used on palette-based devices, and + /// must contain the number of entries specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + TrueColor = 24, + /// + /// The bitmap has a maximum of 2^32 colors. If the biCompression member of the BITMAPINFOHEADER is BI_RGB, + /// the bmiColors member of BITMAPINFO is NULL. Each DWORD in the bitmap array represents the relative + /// intensities of blue, green, and red for a pixel. The value for blue is in the least significant 8 bits, + /// followed by 8 bits each for green and red. The high byte in each DWORD is not used. The bmiColors color + /// table is used for optimizing colors used on palette-based devices, and must contain the number of + /// entries specified by the biClrUsed member of the BITMAPINFOHEADER. + /// + DeepColor = 32 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapCompression.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapCompression.cs new file mode 100644 index 00000000..fcd872f0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapCompression.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Bitmap +{ + public enum BitmapCompression : int + { + /// + /// An uncompressed format. + /// + None = 0, + /// + /// A run-length encoded (RLE) format for bitmaps with 8 bpp. The compression format is a 2-byte format + /// consisting of a count byte followed by a byte containing a color index. + /// + RLE8 = 1, + /// + /// An RLE format for bitmaps with 4 bpp. The compression format is a 2-byte format consisting of a count + /// byte followed by two word-length color indexes. + /// + RLE4 = 2, + /// + /// Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks + /// that specify the red, green, and blue components, respectively, of each pixel. This is valid when used + /// with 16- and 32-bpp bitmaps. + /// + Bitfields = 3, + /// + /// Indicates that the image is a JPEG image. + /// + JPEG = 4, + /// + /// Indicates that the image is a PNG image. + /// + PNG = 5 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapDataFormat.cs new file mode 100644 index 00000000..17fb2bd9 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapDataFormat.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Bitmap +{ + /// + /// Provides a for loading and saving Windows and OS/2 Bitmap documents. + /// Supports bitmap formats that are not natively supported by Windows. + /// + public class BitmapDataFormat : DataFormat + { + public const int BITMAP_HEADER_SIZE = (2 + 6 * 4 + 2 * 2 + 6 * 4); + public const int BITMAP_PALETTE_ENTRY_SIZE = 4; + + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + + dfr.Filters.Add("Microsoft Windows and OS/2 bitmap", new byte?[][] + { + new byte?[] { (byte)'B', (byte)'M' }, // Windows 3.1x, 95, NT, ... etc.; and it is not mandatory unless file size is greater or equal to SIGNATURE + new byte?[] { (byte)'B', (byte)'A' }, // OS/2 struct Bitmap Array + new byte?[] { (byte)'C', (byte)'I' }, // OS/2 struct Color Icon + // new byte?[] { (byte)'C', (byte)'P' }, // OS/2 const Color Pointer + new byte?[] { (byte)'I', (byte)'C' }, // OS/2 struct Icon + new byte?[] { (byte)'P', (byte)'T' } // OS/2 Pointer + }, new string[] { "*.bmp", "*.spa", "*.sph" }); + + // TODO: Figure out how to prevent this from colliding with CPK files that start with "CP" ("CPK") + // dfr.Filters[0].HintComparison = DataFormatHintComparison.FilterOnly; + + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryReader br = base.Stream.BinaryReader; + + string signature = br.ReadFixedLengthString(2); + int fileSize = br.ReadInt32(); + short reserved1 = br.ReadInt16(); + short reserved2 = br.ReadInt16(); + int offset = br.ReadInt32(); + + BitmapInfoHeader header = BitmapInfoHeader.Load(br); + + pic.Width = header.Width; + pic.Height = header.Height; + + byte bitRead = 0; + int bitsRead = 0; + + List palette = new List(); + + // there is a palette + // To read the palette, we can simply read in a block of bytes + // since our array elements are guaranteed to be contiguous and in row-major order. + int paletteSize = offset - BITMAP_HEADER_SIZE; + int numPaletteEntries = paletteSize / BITMAP_PALETTE_ENTRY_SIZE; + for (int i = 0; i < numPaletteEntries; i++) + { + byte[] paletteData = br.ReadBytes(BITMAP_PALETTE_ENTRY_SIZE); + palette.Add(paletteData); + } + + // starts from bottom-left corner, goes BGR + for (int y = header.Height - 1; y >= 0; y--) + { + for (int x = 0; x < header.Width; x++) + { + byte r = 0, g = 0, b = 0, a = 255; + + switch (header.PixelDepth) + { + case BitmapBitsPerPixel.Monochrome: + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + break; + } + case BitmapBitsPerPixel.Color16: + { + break; + } + case BitmapBitsPerPixel.Color256: + { + byte rgb = br.ReadByte(); + r = palette[rgb][0]; + g = palette[rgb][1]; + b = palette[rgb][2]; + break; + } + case BitmapBitsPerPixel.HighColor: + { + // X1R5G5B5 + short value = br.ReadInt16(); + int x1 = value.GetBits(16, 1); + b = (byte)(8 * value.GetBits(0, 5)); + g = (byte)(8 * value.GetBits(5, 5)); + r = (byte)(8 * value.GetBits(10, 5)); + break; + } + case BitmapBitsPerPixel.TrueColor: + { + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) G 72 + r = br.ReadByte(); // (2,2) R 63 + break; + } + case BitmapBitsPerPixel.DeepColor: + { + a = br.ReadByte(); // (2,2) R 63 + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) B 204 + r = br.ReadByte(); // (2,2) G 72 + a = 255; + break; + } + } + + System.Drawing.Color color = System.Drawing.Color.FromArgb(a, r, g, b); + pic.SetPixel(color, x, y); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryWriter bw = base.Stream.BinaryWriter; + + string signature = "BM"; + bw.WriteFixedLengthString(signature); + + int fileSize = 54 + (pic.Width * pic.Height * 4); + bw.Write(fileSize); + + short reserved1 = 0; + short reserved2 = 0; + bw.Write(reserved1); + bw.Write(reserved2); + + int offset = 54; + bw.Write(offset); + + BitmapInfoHeader header = new BitmapInfoHeader(); + header.Width = pic.Width; + header.Height = pic.Height; + header.Planes = 1; + header.PixelDepth = BitmapBitsPerPixel.TrueColor; + header.Compression = BitmapCompression.None; + header.ImageSize = 0; + header.PelsPerMeterX = 0; + header.PelsPerMeterY = 0; + header.UsedColorIndexCount = 0; + header.RequiredColorIndexCount = 0; + BitmapInfoHeader.Save(bw, header); + + for (int y = pic.Height - 1; y >= 0; y--) + { + for (int x = 0; x < pic.Width; x++) + { + System.Drawing.Color color = pic.GetPixel(x, y); + byte r = (byte)color.R, g = (byte)color.G, b = (byte)color.B; + + /* + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else */ + + switch (header.PixelDepth) + { + case BitmapBitsPerPixel.TrueColor: + { + bw.Write(b); + bw.Write(g); + bw.Write(r); + break; + } + } + } + } + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapInfoHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapInfoHeader.cs new file mode 100644 index 00000000..e6364a83 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Bitmap/BitmapInfoHeader.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Bitmap +{ + public struct BitmapInfoHeader + { + private int mvarWidth; + /// + /// The width of the bitmap, in pixels. If biCompression is JPEG or PNG, the biWidth member specifies the + /// width of the decompressed JPEG or PNG image file, respectively. + /// + public int Width { get { return mvarWidth; } set { mvarWidth = value; } } + + private int mvarHeight; + public int Height { get { return mvarHeight; } set { mvarHeight = value; } } + + private short mvarPlanes; + /// + /// The number of planes for the target device. This value must be set to 1. + /// + public short Planes { get { return mvarPlanes; } set { mvarPlanes = value; } } + + private BitmapBitsPerPixel mvarPixelDepth; + /// + /// The number of bits-per-pixel. The biBitCount member of the BITMAPINFOHEADER structure determines the + /// number of bits that define each pixel and the maximum number of colors in the bitmap. + /// + public BitmapBitsPerPixel PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + private BitmapCompression mvarCompression; + /// + /// The type of compression for a compressed bottom-up bitmap (top-down DIBs cannot be compressed). + /// + public BitmapCompression Compression { get { return mvarCompression; } set { mvarCompression = value; } } + + private int mvarImageSize; + /// + /// The size, in bytes, of the image. This may be set to zero for Uncompressed bitmaps. If biCompression is + /// JPEG or PNG, biSizeImage indicates the size of the JPEG or PNG image buffer, respectively. + /// + public int ImageSize { get { return mvarImageSize; } set { mvarImageSize = value; } } + + private int mvarPelsPerMeterX; + /// + /// The horizontal resolution, in pixels-per-meter, of the target device for the bitmap. An application + /// can use this value to select a bitmap from a resource group that best matches the characteristics of + /// the current device. + /// + public int PelsPerMeterX { get { return mvarPelsPerMeterX; } set { mvarPelsPerMeterX = value; } } + + private int mvarPelsPerMeterY; + /// + /// The vertical resolution, in pixels-per-meter, of the target device for the bitmap. + /// + public int PelsPerMeterY { get { return mvarPelsPerMeterY; } set { mvarPelsPerMeterY = value; } } + + private int mvarUsedColorIndexCount; + /// + /// + /// The number of color indexes in the color table that are actually used by the bitmap. If this + /// value is zero, the bitmap uses the maximum number of colors corresponding to the value of the + /// biBitCount member for the compression mode specified by biCompression. + /// + /// + /// If biClrUsed is nonzero and the biBitCount member is less than 16, the biClrUsed member specifies + /// the actual number of colors the graphics engine or device driver accesses. If biBitCount is 16 or + /// greater, the biClrUsed member specifies the size of the color table used to optimize performance + /// of the system color palettes. If biBitCount equals 16 or 32, the optimal color palette starts + /// immediately following the three DWORD masks. + /// + /// + /// When the bitmap array immediately follows the BITMAPINFO structure, it is a packed bitmap. Packed + /// bitmaps are referenced by a single pointer. Packed bitmaps require that the biClrUsed member must + /// be either zero or the actual size of the color table. + /// + /// + public int UsedColorIndexCount { get { return mvarUsedColorIndexCount; } set { mvarUsedColorIndexCount = value; } } + + private int mvarRequiredColorIndexCount; + /// + /// The number of color indexes that are required for displaying the bitmap. If this value is zero, all + /// colors are required. + /// + public int RequiredColorIndexCount { get { return mvarRequiredColorIndexCount; } set { mvarRequiredColorIndexCount = value; } } + + public static BitmapInfoHeader Load(IO.BinaryReader br) + { + BitmapInfoHeader header = new BitmapInfoHeader(); + int headerSize = br.ReadInt32(); + header.Width = br.ReadInt32(); + header.Height = br.ReadInt32(); + header.Planes = br.ReadInt16(); + header.PixelDepth = (BitmapBitsPerPixel)br.ReadInt16(); + header.Compression = (BitmapCompression)br.ReadInt32(); + header.ImageSize = br.ReadInt32(); + header.PelsPerMeterX = br.ReadInt32(); + header.PelsPerMeterY = br.ReadInt32(); + header.UsedColorIndexCount = br.ReadInt32(); + header.RequiredColorIndexCount = br.ReadInt32(); + return header; + } + public static void Save(IO.BinaryWriter bw, BitmapInfoHeader header) + { + bw.Write((int)40); // header size + bw.Write(header.Width); + bw.Write(header.Height); + bw.Write(header.Planes); + bw.Write((short)header.PixelDepth); + bw.Write((int)header.Compression); + bw.Write(header.ImageSize); + bw.Write(header.PelsPerMeterX); + bw.Write(header.PelsPerMeterY); + bw.Write(header.UsedColorIndexCount); + bw.Write(header.RequiredColorIndexCount); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/BitmapDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/BitmapDataFormat.cs new file mode 100644 index 00000000..abfe6e87 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/BitmapDataFormat.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class BitmapDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + + dfr.Filters.Add("Microsoft Windows and OS/2 bitmap", new byte?[][] + { + new byte?[] { (byte)'B', (byte)'M' }, // Windows 3.1x, 95, NT, ... etc.; and it is not mandatory unless file size is greater or equal to SIGNATURE + new byte?[] { (byte)'B', (byte)'A' }, // OS/2 struct Bitmap Array + new byte?[] { (byte)'C', (byte)'I' }, // OS/2 struct Color Icon + // new byte?[] { (byte)'C', (byte)'P' }, // OS/2 const Color Pointer + new byte?[] { (byte)'I', (byte)'C' }, // OS/2 struct Icon + new byte?[] { (byte)'P', (byte)'T' } // OS/2 Pointer + }, new string[] { "*.bmp", "*.spa", "*.sph" }); + + // TODO: Figure out how to prevent this from colliding with CPK files that start with "CP" ("CPK") + // dfr.Filters[0].HintComparison = DataFormatHintComparison.FilterOnly; + + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryReader br = base.Stream.BinaryReader; + + string signature = br.ReadFixedLengthString(2); + int fileSize = br.ReadInt32(); + short reserved1 = br.ReadInt16(); + short reserved2 = br.ReadInt16(); + int offset = br.ReadInt32(); + int reserved3 = br.ReadInt32(); // 40 + int width = br.ReadInt32(); + int height = br.ReadInt32(); + + short reserved4 = br.ReadInt16(); // 1 + short bitsPerPixel = br.ReadInt16(); // 24 for 24-bit bitmap + int reserved6 = br.ReadInt32(); // 8 for 256-color bitmap + int reserved7 = br.ReadInt32(); + int reserved8 = br.ReadInt32(); + int reserved9 = br.ReadInt32(); + int reserved10 = br.ReadInt32(); + int reserved11 = br.ReadInt32(); + + pic.Width = width; + pic.Height = height; + + byte bitRead = 0; + int bitsRead = 0; + + // starts from bottom-left corner, goes BGR + for (int y = height - 1; y >= 0; y--) + { + for (int x = 0; x < width; x++) + { + byte r = 0, g = 0, b = 0; + + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else if (bitsPerPixel == 24) + { + b = br.ReadByte(); // (2,2) B 204 + g = br.ReadByte(); // (2,2) G 72 + r = br.ReadByte(); // (2,2) R 63 + } + + System.Drawing.Color color = System.Drawing.Color.FromArgb(r, g, b); + pic.SetPixel(color, x, y); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + PictureObjectModel pic = (objectModel as PictureObjectModel); + IO.BinaryWriter bw = base.Stream.BinaryWriter; + + string signature = "BM"; + bw.WriteFixedLengthString(signature); + + int fileSize = 54 + (pic.Width * pic.Height * 4); + bw.Write(fileSize); + + short reserved1 = 0; + short reserved2 = 0; + bw.Write(reserved1); + bw.Write(reserved2); + + int offset = 54; + bw.Write(offset); + + int reserved3 = 40; // 40 + bw.Write(reserved3); + + bw.Write(pic.Width); + bw.Write(pic.Height); + + short reserved4 = 1; // 1 + bw.Write(reserved4); + + short bitsPerPixel = 24; // 24 for 24-bit bitmap + bw.Write(bitsPerPixel); // 8 for 256-color bitmap + + int reserved6 = 0; + bw.Write(reserved6); + int reserved7 = 0; + bw.Write(reserved6); + int reserved8 = 0; + bw.Write(reserved6); + int reserved9 = 0; + bw.Write(reserved6); + int reserved10 = 0; + bw.Write(reserved6); + int reserved11 = 0; + bw.Write(reserved6); + + for (int y = pic.Height - 1; y >= 0; y--) + { + for (int x = 0; x < pic.Width; x++) + { + System.Drawing.Color color = pic.GetPixel(x, y); + byte r = (byte)color.R, g = (byte)color.G, b = (byte)color.B; + + /* + if (bitsPerPixel == 1) + { + // TODO: Figure out how to read this bitmap + if (bitsRead == 0) bitRead = br.ReadByte(); + + b = (byte)(bitRead << (bitsRead)); + g = (byte)(bitRead << (bitsRead + 1)); + r = (byte)(bitRead << (bitsRead + 2)); + + bitsRead += 3; + if (bitsRead == 8) + { + bitsRead = 0; + } + } + else */ if (bitsPerPixel == 24) + { + bw.Write(b); + bw.Write(g); + bw.Write(r); + } + } + } + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CURDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CURDataFormat.cs new file mode 100644 index 00000000..fac7ac6b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CURDataFormat.cs @@ -0,0 +1,24 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class CURDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Windows cursor", new byte?[][] { new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(2) } }, new string[] { "*.cur" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CompressedBG/CompressedBGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CompressedBG/CompressedBGDataFormat.cs new file mode 100644 index 00000000..13f1dae0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/CompressedBG/CompressedBGDataFormat.cs @@ -0,0 +1,277 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.CompressedBG +{ + public class CompressedBGDataFormat : DataFormat + { + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + + #region Private Implementation + + private struct bg_huffman_node + { + public bool valid; /* ÊÇ·ñÓÐЧµÄ±ê¼Ç */ + public uint weight; /* Ȩֵ */ + public bool is_parent; /* ÊÇ·ñÊǸ¸½Úµã */ + public uint parent_index; /* ¸¸½ÚµãË÷Òý */ + public uint left_child_index; /* ×ó×Ó½ÚµãË÷Òý */ + public uint right_child_index; /* ÓÒ×Ó½ÚµãË÷Òý */ + } + private struct bg_header_t + { + public uint encode_length; + public uint key; + public byte sum_check; + public byte xor_check; + public uint zero_comprlen; + public uint width; + public uint height; + public int color_depth; + } + + private static byte update_key(ref uint key, byte[] magic) + { + uint v0, v1; + v0 = (key & 0xffff) * 20021; + v1 = ((uint)(magic[1] << 24) | (uint)(magic[0] << 16) | (uint)(key >> 16)); + v1 = v1 * 20021 + key * 346; + v1 = (v1 + (v0 >> 16)) & 0xffff; + key = (uint)((v1 << 16) + (v0 & 0xffff) + 1); + return (byte)(v1 & 0x7fff); + } + + /********************* CompressedBG___ *********************/ + private static void decode_bg(ref byte[] enc_buf, uint enc_buf_len, uint key, ref byte ret_sum, ref byte ret_xor) + { + byte sum = 0; + byte xor = 0; + byte[] magic = new byte[] { 0, 0 }; + for (uint i = 0; i < enc_buf_len; i++) + { + enc_buf[i] -= update_key(ref key, magic); + sum += enc_buf[i]; + xor ^= enc_buf[i]; + } + ret_sum = sum; + ret_xor = xor; + } + + private static uint bg_create_huffman_tree(bg_huffman_node[] nodes, uint[] leaf_nodes_weight) + { + uint parent_node_index = 256; /* ¸¸½Úµã´Ónodes[]µÄ256´¦¿ªÊ¼ */ + bg_huffman_node parent_node = nodes[parent_node_index]; + uint root_node_weight = 0; /* ¸ù½ÚµãȨֵ */ + uint i; + + /* ³õʼ»¯Ò¶½Úµã */ + for (i = 0; i < 256; i++) + { + nodes[i].valid = (leaf_nodes_weight[i] != 0); + nodes[i].weight = leaf_nodes_weight[i]; + nodes[i].is_parent = false; + root_node_weight += nodes[i].weight; + } + + while (true) + { + uint[] child_node_index = new uint[2]; + + /* ´´½¨×óÓÒ×Ó½Úµã */ + for (i = 0; i < 2; i++) + { + uint min_weight; + + min_weight = unchecked((uint)-1); + child_node_index[i] = unchecked((uint)-1); + /* ±éÀúnodes[], ÕÒµ½weight×îСµÄ2¸ö½Úµã×÷Ϊ×Ó½Úµã */ + for (uint n = 0; n < parent_node_index; n++) + { + if (nodes[n].valid) + { + if (nodes[n].weight < min_weight) + { + min_weight = nodes[n].weight; + child_node_index[i] = n; + } + } + } + /* ±»ÕÒµ½µÄ×Ó½Úµã±ê¼ÇΪÎÞЧ£¬ÒԱ㲻²ÎÓë½ÓÏÂÀ´µÄ²éÕÒ */ + nodes[child_node_index[i]].valid = false; + nodes[child_node_index[i]].parent_index = parent_node_index; + } + /* ´´½¨¸¸½Úµã */ + parent_node.valid = true; + parent_node.is_parent = true; + parent_node.left_child_index = child_node_index[0]; + parent_node.right_child_index = child_node_index[1]; + parent_node.weight = nodes[parent_node.left_child_index].weight + + nodes[parent_node.right_child_index].weight; + if (parent_node.weight == root_node_weight) + { + break; + } + parent_node = nodes[++parent_node_index]; + } + + return parent_node_index; + } + private static uint bg_huffman_decompress(bg_huffman_node[] huffman_nodes, uint root_node_index, byte[] uncompr, uint uncomprlen, byte[] compr, uint comprlen) + { + // bits bits; + // bits_init(ref bits, compr, comprlen); + uint act_uncomprlen = 0; + for (act_uncomprlen = 0; act_uncomprlen < uncomprlen; act_uncomprlen++) + { + byte child = 0; + uint node_index = root_node_index; + do + { + if (false) // (bit_get_high(ref bits, ref child)) + { + return act_uncomprlen; + } + if (child != 0) + { + node_index = huffman_nodes[node_index].left_child_index; + } + else + { + node_index = huffman_nodes[node_index].right_child_index; + } + } + while (huffman_nodes[node_index].is_parent); + + uncompr[act_uncomprlen] = (byte)node_index; + } + return act_uncomprlen; + } + private static uint zero_decompress(byte[] uncompr, uint uncomprlen, byte[] compr, uint comprlen) + { + uint act_uncomprlen = 0; + bool dec_zero = false; + uint curbyte = 0; + while (true) + { + uint bits = 0; + uint copy_bytes = 0; + byte code; + do + { + if (curbyte >= comprlen) return act_uncomprlen; + code = compr[curbyte++]; + copy_bytes |= (uint)((code & 0x7f) << (int)bits); + bits += 7; + } + while ((code & 0x80) == 0x80); + + if (act_uncomprlen + copy_bytes > uncomprlen) break; + if (!dec_zero && (curbyte + copy_bytes > comprlen)) break; + if (!dec_zero) + { + Array.Copy(uncompr, act_uncomprlen, compr, curbyte, copy_bytes); + curbyte += copy_bytes; + dec_zero = true; + } + else + { + uncompr.Fill(0); + dec_zero = false; + } + act_uncomprlen += copy_bytes; + } + return act_uncomprlen; + } + private static void bg_average_defilting(byte[] dib_buf, uint width, uint height, uint bpp) + { + uint line_len = (width * bpp); + for (uint y = 0; y < height; y++) + { + for (uint x = 0; x < width; x++) + { + for (uint p = 0; p < bpp; p++) + { + uint a, b; + uint avg; + b = (y > 0) ? (dib_buf[(y - 1) * line_len + x * bpp + p]) : unchecked((uint)-1); + a = (x > 0) ? (dib_buf[y * line_len + (x - 1) * bpp + p]) : unchecked((uint)-1); + avg = 0; + + if (a != unchecked((uint)-1)) avg += a; + if (b != unchecked((uint)-1)) avg += b; + if (a != unchecked((uint)-1) && b != unchecked((uint)-1)) avg /= 2; + + dib_buf[y * line_len + x * bpp + p] = (byte)(dib_buf[y * line_len + x * bpp + p] + avg); + } + } + } + } + private static uint bg_decompress(ref bg_header_t bg_header, ref byte[] enc_buf, uint bg_len, byte[] image_buf, uint image_size) + { + uint act_uncomprlen = 0; + uint i; + + /* ½âÃÜÒ¶½ÚµãȨֵ */ + byte sum = 0; + byte xor = 0; + decode_bg(ref enc_buf, bg_header.encode_length, bg_header.key, ref sum, ref xor); + + if (sum != bg_header.sum_check || xor != bg_header.xor_check) + { + throw new InvalidOperationException("checksum mismatch"); + } + + /* ³õʼ»¯Ò¶½ÚµãȨֵ */ + uint[] leaf_nodes_weight = new uint[256]; + uint curbyte = 0; + for (i = 0; i < 256; i++) + { + uint bits = 0; + uint weight = 0; + byte code; + do + { + if (curbyte >= bg_header.encode_length) return 0; + code = enc_buf[curbyte++]; + weight |= (uint)((code & 0x7f) << (int)bits); + bits += 7; + } + while ((code & 0x80) == 0x80); + leaf_nodes_weight[i] = weight; + } + + bg_huffman_node[] nodes = new bg_huffman_node[511]; + uint root_node_index = bg_create_huffman_tree(nodes, leaf_nodes_weight); + byte[] zero_compr = new byte[bg_header.zero_comprlen]; // will throw OutOfMemoryException if doesn't work + + byte[] compr = new byte[enc_buf.Length - bg_header.encode_length]; + Array.Copy(enc_buf, bg_header.encode_length, compr, 0, compr.Length); + + uint comprlen = (uint)(bg_len - System.Runtime.InteropServices.Marshal.SizeOf(bg_header) - bg_header.encode_length); + act_uncomprlen = bg_huffman_decompress(nodes, root_node_index, zero_compr, bg_header.zero_comprlen, compr, comprlen); + if (act_uncomprlen != bg_header.zero_comprlen) + { + zero_compr = null; + throw new Compression.CompressionFailureException("uncompressed length mismatch", Compression.CompressionMethod.Unknown, Compression.CompressionMode.Decompress); + } + + act_uncomprlen = zero_decompress(image_buf, image_size, zero_compr, bg_header.zero_comprlen); + zero_compr = null; + + bg_average_defilting(image_buf, bg_header.width, bg_header.height, (uint)(bg_header.color_depth / 8)); + return act_uncomprlen; + } + #endregion + } +} \ No newline at end of file diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs new file mode 100644 index 00000000..4a5f4c64 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeDataFormat.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; + +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.GraphicsInterchange +{ + public class GraphicsInterchangeDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("CompuServe Graphics Interchange Format", new byte?[][] { new byte?[] { (byte)'G', (byte)'I', (byte)'F', (byte)'8', (byte)'7', (byte)'a' }, new byte?[] { (byte)'G', (byte)'I', (byte)'F', (byte)'8', (byte)'9', (byte)'a' } }, new string[] { "*.gif" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlockCollection mvarExtensions = new GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlockCollection(); + public GraphicsInterchangeExtensionBlock.GraphicsInterchangeExtensionBlockCollection Extensions + { + get { return mvarExtensions; } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + string magic = br.ReadFixedLengthString(6); + if (!(magic == "GIF87a" || magic == "GIF89a")) throw new DataFormatException(Localization.StringTable.ErrorDataFormatInvalid); + + List palette = new List(); + + #region Logical Screen Descriptor + short logicalWidth = br.ReadInt16(); + short logicalHeight = br.ReadInt16(); + byte gct = br.ReadByte(); + byte backgroundColorPaletteID = br.ReadByte(); + byte defaultPixelAspectRatio = br.ReadByte(); + + int maxColors = gct + 9; + for (int i = 0; i < maxColors; i++) + { + byte r = br.ReadByte(); + byte g = br.ReadByte(); + byte b = br.ReadByte(); + palette.Add(System.Drawing.Color.FromArgb(r, g, b)); + } + #endregion + + while (!br.EndOfStream) + { + byte sentinel = br.ReadByte(); + switch (sentinel) + { + case 0x2C: // ',' image + break; + case 0x21: // '!' extension + GraphicsInterchangeExtensionBlock extension = new GraphicsInterchangeExtensionBlock(); + extension.ID = br.ReadByte(); + + // The linked lists used by the image data and the extension blocks consist of series + // of sub-blocks, each sub-block beginning with a byte giving the number of subsequent + // data bytes in the sub-block (1 to 255). The series of sub-blocks is terminated by + // an empty sub-block (a 0 byte). + while (!br.EndOfStream) + { + byte extSize = br.ReadByte(); + if (extSize == 0) break; + + byte[] extData = br.ReadBytes(extSize); + extension.DataBlocks.Add(extData); + } + + mvarExtensions.Add(extension); + break; + case 0x3B: // ';' end of file + return; + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs new file mode 100644 index 00000000..af9ea37a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchange/GraphicsInterchangeExtensionBlock.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.GraphicsInterchange +{ + public class GraphicsInterchangeExtensionBlock + { + public class GraphicsInterchangeExtensionBlockCollection + : System.Collections.ObjectModel.Collection + { + public GraphicsInterchangeExtensionBlock Add(byte id, params byte[][] dataBlocks) + { + GraphicsInterchangeExtensionBlock block = new GraphicsInterchangeExtensionBlock(); + block.ID = id; + foreach (byte[] dataBlock in dataBlocks) + { + block.DataBlocks.Add(dataBlock); + } + base.Add(block); + return block; + } + + private Dictionary blocksById = new Dictionary(); + protected override void InsertItem(int index, GraphicsInterchangeExtensionBlock item) + { + blocksById.Add(item.ID, item); + base.InsertItem(index, item); + } + protected override void RemoveItem(int index) + { + if (blocksById.ContainsKey(this[index].ID)) + { + blocksById.Remove(this[index].ID); + } + base.RemoveItem(index); + } + + public GraphicsInterchangeExtensionBlock this[byte id] + { + get + { + if (blocksById.ContainsKey(id)) + { + return blocksById[id]; + } + return null; + } + } + public bool Contains(byte id) + { + return blocksById.ContainsKey(id); + } + public bool Remove(byte id) + { + if (!blocksById.ContainsKey(id)) + { + return false; + } + + this.Remove(blocksById[id]); + return true; + } + } + + private byte mvarID = 0; + public byte ID { get { return mvarID; } set { mvarID = value; } } + + private List mvarDataBlocks = new List(); + public List DataBlocks { get { return mvarDataBlocks; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchangeDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchangeDataFormat.cs new file mode 100644 index 00000000..a8ba84b7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/GraphicsInterchangeDataFormat.cs @@ -0,0 +1,24 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class GraphicsInterchangeDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("CompuServe Graphics Interchange Format", new byte?[][] { new byte?[] { new byte?(71), new byte?(105), new byte?(102), new byte?(56), new byte?(57), new byte?(97) } }, new string[] { "*.gif" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/ICODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/ICODataFormat.cs new file mode 100644 index 00000000..107518d0 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/ICODataFormat.cs @@ -0,0 +1,24 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class ICODataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Windows icon", new byte?[][] { new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(1) } }, new string[] { "*.ico" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/GroupICODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/GroupICODataFormat.cs new file mode 100644 index 00000000..4b58d28d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/GroupICODataFormat.cs @@ -0,0 +1,60 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +using UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Bitmap; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Icon.Microsoft +{ + public class GroupICODataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + + // An Icon file, which usually has the ICO extension, contains one icon resource. Given that + // an icon resource can contain multiple images, it is no surprise that the file begins with + // an icon directory: + byte u = br.ReadByte(); + + short idReserved = br.ReadInt16(); // Reserved (must be 0) + short idType = br.ReadInt16(); // Resource Type (1 for icons) + short idCount = br.ReadInt16(); // How many images? + + for (short i = 0; i < idCount; i++) + { + // The idCount member indicates how many images are present in the icon resource. The size + // of the idEntries array is determined by idCount. There exists one ICONDIRENTRY for each + // icon image in the file, providing details about its location in the file, size and color + // depth. The ICONDIRENTRY structure is defined as: + + byte bWidth = br.ReadByte(); // Width, in pixels, of the image + byte bHeight = br.ReadByte(); // Height, in pixels, of the image + byte bColorCount = br.ReadByte(); // Number of colors in image (0 if >=8bpp) + byte bReserved = br.ReadByte(); // Reserved ( must be 0) + short wPlanes = br.ReadInt16(); // Color Planes + short wBitCount = br.ReadInt16(); // Bits per pixel + int dwBytesInRes = br.ReadInt32(); // How many bytes in this resource? + int dwImageOffset = br.ReadInt32(); // Where in the file is this image? + + // The dwBytesInRes member indicates the size of the image data. This image data can be found + // dwImageOffset bytes from the beginning of the file, and is stored in the following format: + BitmapInfoHeader icHeader = BitmapInfoHeader.Load(br); // DIB header + + // RGBQUAD icColors[1]; // Color table + // BYTE icXOR[1]; // DIB bits for XOR mask + // BYTE icAND[1]; // DIB bits for AND mask + } + + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/ICODataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/ICODataFormat.cs new file mode 100644 index 00000000..14fb137f --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Icon/Microsoft/ICODataFormat.cs @@ -0,0 +1,59 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +using UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Bitmap; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Icon.Microsoft +{ + public class ICODataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Windows icon", new byte?[][] { new byte?[] { new byte?(0), new byte?(0), new byte?(0), new byte?(1) } }, new string[] { "*.ico" }); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + + // An Icon file, which usually has the ICO extension, contains one icon resource. Given that + // an icon resource can contain multiple images, it is no surprise that the file begins with + // an icon directory: + short idReserved = br.ReadInt16(); // Reserved (must be 0) + short idType = br.ReadInt16(); // Resource Type (1 for icons) + short idCount = br.ReadInt16(); // How many images? + + for (short i = 0; i < idCount; i++) + { + // The idCount member indicates how many images are present in the icon resource. The size + // of the idEntries array is determined by idCount. There exists one ICONDIRENTRY for each + // icon image in the file, providing details about its location in the file, size and color + // depth. The ICONDIRENTRY structure is defined as: + + byte bWidth = br.ReadByte(); // Width, in pixels, of the image + byte bHeight = br.ReadByte(); // Height, in pixels, of the image + byte bColorCount = br.ReadByte(); // Number of colors in image (0 if >=8bpp) + byte bReserved = br.ReadByte(); // Reserved ( must be 0) + short wPlanes = br.ReadInt16(); // Color Planes + short wBitCount = br.ReadInt16(); // Bits per pixel + int dwBytesInRes = br.ReadInt32(); // How many bytes in this resource? + int dwImageOffset = br.ReadInt32(); // Where in the file is this image? + + // The dwBytesInRes member indicates the size of the image data. This image data can be found + // dwImageOffset bytes from the beginning of the file, and is stored in the following format: + BitmapInfoHeader icHeader = BitmapInfoHeader.Load(br); // DIB header + + // RGBQUAD icColors[1]; // Color table + // BYTE icXOR[1]; // DIB bits for XOR mask + // BYTE icAND[1]; // DIB bits for AND mask + } + + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGDataFormat.cs new file mode 100644 index 00000000..7a730bbd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGDataFormat.cs @@ -0,0 +1,186 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.JPEG +{ + /// + /// Joint Photographic Experts Group image + /// + public class JPEGDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Joint Photographic Experts Group image", new string[] { "*.jpg", "*.jpe", "*.jpeg" } ); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + br.Endianness = IO.Endianness.BigEndian; + + while (!br.EndOfStream) + { + JPEGMarker marker = (JPEGMarker)br.ReadUInt16(); + switch (marker) + { + case JPEGMarker.StartOfImage: + { + // SOI - Start of Image + break; + } + case JPEGMarker.EndOfImage: + { + // EOI - End of Image + + break; + } + case JPEGMarker.StartOfScan: + { + ushort length = br.ReadUInt16(); // = 6 + (2 * numComponentsInScan) + byte numComponentsInScan = br.ReadByte(); + for (byte i = 0; i < numComponentsInScan; i++) + { + // for each component, read two bytes + byte componentID = br.ReadByte(); // 1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q + byte huffmanTable = br.ReadByte(); // bit 0-3: AC table, bit 4-7: DC table + } + break; + } + case JPEGMarker.StartOfFrameBaseline: + { + // SOF0 - Start of Frame (Baseline DCT (discrete cosine transform)) + ushort length = br.ReadUInt16(); + byte dataPrecision = br.ReadByte(); + ushort imageHeight = br.ReadUInt16(); + ushort imageWidth = br.ReadUInt16(); + + // Number of components. Usually 1 = grayscale, 3 = YcBCr or YIQ, 4 = CMYK + byte componentCount = br.ReadByte(); + for (byte i = 0; i < componentCount; i++) + { + // Component type. 1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q + byte componentType = br.ReadByte(); + // bit 0-3 vertical, 4-7 horizontal + byte samplingFactors = br.ReadByte(); + byte quantizationTableNumber = br.ReadByte(); + } + break; + } + case JPEGMarker.DefineQuantizationTables: + { + // DQT - Define Quantization Tables + ushort length = br.ReadUInt16(); + byte precisionAndTableID = br.ReadByte(); + + byte[] quantizationTable = new byte[64]; + for (int i = 0; i < 64; i++) + { + quantizationTable[i] = br.ReadByte(); + } + break; + } + case JPEGMarker.DefineHuffmanTables: + { + ushort length = br.ReadUInt16(); + + // bit 0-3: number of huffman tables + // bit 4: type of huffman table (0 = DC, 1 = AC) + // bit 5-7: not used, must be 0 + byte htInfo = br.ReadByte(); + + byte nSymbols = 0; + byte[] nSymbols1 = br.ReadBytes(16); + for (int i = 0; i < nSymbols1.Length; i++) + { + nSymbols += (byte)(nSymbols1[i]); + } + + byte[] symbols = br.ReadBytes(nSymbols); + break; + } + case JPEGMarker.Application0: + case JPEGMarker.Application1: + case JPEGMarker.Application2: + case JPEGMarker.Application3: + case JPEGMarker.Application4: + case JPEGMarker.Application5: + case JPEGMarker.Application6: + case JPEGMarker.Application7: + case JPEGMarker.Application8: + case JPEGMarker.Application9: + case JPEGMarker.ApplicationA: + case JPEGMarker.ApplicationB: + case JPEGMarker.ApplicationC: + case JPEGMarker.ApplicationD: + case JPEGMarker.ApplicationE: + case JPEGMarker.ApplicationF: + { + ushort length = br.ReadUInt16(); + length -= 2; + string chunkID = br.ReadNullTerminatedString(); + + length -= (ushort)(chunkID.Length + 1); + byte[] chunkData = br.ReadBytes(length); + IO.BinaryReader appbr = new IO.BinaryReader(chunkData); + // System.IO.File.WriteAllBytes(@"C:\Applications\MikuMikuDance\UserFile\Model\kio\Luka110320\pony01s_exifchunk.dat", chunkData); + switch (marker) + { + case JPEGMarker.Application0: + { + byte versionMajor = appbr.ReadByte(); + byte versionMinor = appbr.ReadByte(); + + byte densityUnits = appbr.ReadByte(); + // 0 - No units, aspect ratio only specified + // 1 - Pixels per inch + // 2 - Pixels per centimetre + + ushort horizontalPixelDensity = appbr.ReadUInt16(); + ushort verticalPixelDensity = appbr.ReadUInt16(); + + byte thumbnailWidth = appbr.ReadByte(); + byte thumbnailHeight = appbr.ReadByte(); + + int thumbnailDataSize = (thumbnailWidth * thumbnailHeight); + byte[] thumbnailData = appbr.ReadBytes(thumbnailDataSize); + break; + } + case JPEGMarker.Application1: + { + switch (chunkID) + { + case "Exif": + { + + break; + } + } + break; + } + case JPEGMarker.ApplicationD: + { + switch (chunkID) + { + case "Photoshop 3.0": + { + + break; + } + } + break; + } + } + break; + } + } + } + + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGMarker.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGMarker.cs new file mode 100644 index 00000000..828a81c1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEG/JPEGMarker.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.JPEG +{ + /// + /// + /// + public enum JPEGMarker + { + /// + /// SOI - Start of Image. + /// + StartOfImage = 0xFFD8, + /// + /// SOF0 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline = 0xFFC0, + /// + /// SOF1 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline1 = 0xFFC1, + /// + /// SOF2 - Start Of Frame (Progressive DCT). Indicates that this is a progressive DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameProgressive = 0xFFC2, + /// + /// SOF3 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline3 = 0xFFC3, + /// + /// DHT - Define Huffman Table(s). Specifies one or more Huffman tables. + /// + DefineHuffmanTables = 0xFFC4, + /// + /// SOF5 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline5 = 0xFFC5, + /// + /// SOF6 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline6 = 0xFFC6, + /// + /// SOF7 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline7 = 0xFFC7, + /// + /// SOF9 - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline9 = 0xFFC9, + /// + /// SOFA - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline10 = 0xFFCA, + /// + /// SOFB - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline11 = 0xFFCB, + /// + /// SOFD - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline13 = 0xFFCD, + /// + /// SOFE - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline14 = 0xFFCE, + /// + /// SOFF - Start of Frame (Baseline DCT). Indicates that this is a baseline DCT-based JPEG, and specifies the width, height, number of components, and component subsampling (e.g., 4:2:0). + /// + StartOfFrameBaseline15 = 0xFFCF, + /// + /// DQT - Define Quantization Table(s). Specifies one or more quantization tables. + /// + DefineQuantizationTables = 0xFFDB, + /// + /// DRI - Define Restart Interval. Specifies the interval between RSTn markers, in macroblocks. This marker is followed by two bytes indicating the fixed size so it can be treated like any other variable size segment. + /// + DefineRestartInterval = 0xFFDD, + /// + /// SOS - Start Of Scan. Begins a top-to-bottom scan of the image. In baseline DCT JPEG images, there is generally a single scan. Progressive DCT JPEG images usually contain multiple scans. This marker specifies which slice of data it will contain, and is immediately followed by entropy-coded data. + /// + StartOfScan = 0xFFDA, + /// + /// RST0 - Restart 0. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart0 = 0xFFD0, + /// + /// RST1 - Restart 1. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart1 = 0xFFD1, + /// + /// RST2 - Restart 2. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart2 = 0xFFD2, + /// + /// RST3 - Restart 3. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart3 = 0xFFD3, + /// + /// RST4 - Restart 4. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart4 = 0xFFD4, + /// + /// RST5 - Restart 5. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart5 = 0xFFD5, + /// + /// RST6 - Restart 6. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart6 = 0xFFD6, + /// + /// RST7 - Restart 7. Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7. + /// + Restart7 = 0xFFD7, + /// + /// APP0 - Application-specific 0. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application0 = 0xFFE0, + /// + /// APP1 - Application-specific 1. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application1 = 0xFFE1, + /// + /// APP2 - Application-specific 2. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application2 = 0xFFE2, + /// + /// APP3 - Application-specific 3. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application3 = 0xFFE3, + /// + /// APP4 - Application-specific 4. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application4 = 0xFFE4, + /// + /// APP5 - Application-specific 5. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application5 = 0xFFE5, + /// + /// APP6 - Application-specific 6. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application6 = 0xFFE6, + /// + /// APP7 - Application-specific 7. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application7 = 0xFFE7, + /// + /// APP8 - Application-specific 8. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application8 = 0xFFE8, + /// + /// APP9 - Application-specific 9. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + Application9 = 0xFFE9, + /// + /// APPA - Application-specific A. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationA = 0xFFEA, + /// + /// APPB - Application-specific B. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationB = 0xFFEB, + /// + /// APPC - Application-specific C. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationC = 0xFFEC, + /// + /// APPD - Application-specific D. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationD = 0xFFED, + /// + /// APPE - Application-specific E. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationE = 0xFFEE, + /// + /// APPF - Application-specific F. For example, an Exif JPEG file uses an APP1 marker to store metadata, laid out in a structure based closely on TIFF. + /// + ApplicationF = 0xFFEF, + /// + /// COM - Comment. Contains a text comment. + /// + Comment = 0xFFFE, + /// + /// EOI - End Of Image. + /// + EndOfImage = 0xFFD9, + Padding = 0xFFFF + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEGDataFormat.cs new file mode 100644 index 00000000..b6697112 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/JPEGDataFormat.cs @@ -0,0 +1,23 @@ +using System; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class JPEGDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Joint Photographic Experts Group image", new string[] { "*.jpg", "*.jpe", "*.jpeg" } ); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/MicrosoftDDSDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/MicrosoftDDSDataFormat.cs new file mode 100644 index 00000000..da2afbc7 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/MicrosoftDDSDataFormat.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture +{ + public class MicrosoftDDSDataFormat : DataFormat + { + private const uint DDS_MAGIC = 0x20534444; + + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + dfr.Filters.Add("Microsoft DirectDraw Surface", new byte?[][] { new byte?[] { 0x44, 0x44, 0x53, 0x20 } }, new string[] { "*.dds" }); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + + uint dwMagic = br.ReadUInt32(); // 0x20534444 + uint dwSize = br.ReadUInt32(); + uint dwFlags = br.ReadUInt32(); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + IO.BinaryWriter bw = base.Stream.BinaryWriter; + bw.Write(DDS_MAGIC); + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGChunk.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGChunk.cs new file mode 100644 index 00000000..d75aa1ea --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGChunk.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.PortableNetworkGraphics +{ + public class PNGChunk + { + public class PNGChunkCollection + : System.Collections.ObjectModel.Collection + { + public Dictionary chunksByName = new Dictionary(); + + public PNGChunk Add(string name, byte[] data) + { + PNGChunk chunk = null; + if (chunksByName.ContainsKey(name)) + { + chunk = chunksByName[name]; + + byte[] originalData = chunk.Data; + Array.Resize(ref originalData, originalData.Length + data.Length); + Array.Copy(data, 0, chunk.Data, chunk.Data.Length - data.Length, data.Length); + chunk.Data = originalData; + } + else + { + chunk = new PNGChunk(); + chunk.Name = name; + chunk.Data = data; + base.Add(chunk); + } + return chunk; + } + public PNGChunk this[string name] + { + get + { + if (chunksByName.ContainsKey(name)) + { + return chunksByName[name]; + } + return null; + } + } + + protected override void InsertItem(int index, PNGChunk item) + { + base.InsertItem(index, item); + if (!chunksByName.ContainsKey(item.Name)) + { + chunksByName.Add(item.Name, item); + } + } + protected override void RemoveItem(int index) + { + if (chunksByName.ContainsKey(this[index].Name)) + { + chunksByName.Remove(this[index].Name); + } + base.RemoveItem(index); + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private byte[] mvarData = new byte[0]; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + private int mvarCRC = 0; + public int CRC { get { return mvarCRC; } set { mvarCRC = value; } } + + public override string ToString() + { + return mvarName + " [" + mvarData.Length.ToString() + "]"; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGDataFormat.cs new file mode 100644 index 00000000..9b98d80d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/PortableNetworkGraphics/PNGDataFormat.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.PortableNetworkGraphics +{ + public class PNGDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + dfr.Filters.Add("Portable Network Graphics", new byte?[][] { new byte?[] { (byte)0x89, (byte)'P', (byte)'N', (byte)'G', (byte)0x0D, (byte)0x0A, (byte)0x1A, (byte)0x0A } }, new string[] { "*.png" }); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + byte[] signature = br.ReadBytes(8); + br.Endianness = IO.Endianness.BigEndian; + + PNGChunk.PNGChunkCollection chunks = new PNGChunk.PNGChunkCollection(); + + while (!br.EndOfStream) + { + int chunkLength = br.ReadInt32(); + string chunkType = br.ReadFixedLengthString(4); + byte[] chunkData = br.ReadBytes(chunkLength); + int chunkCRC = br.ReadInt32(); + chunks.Add(chunkType, chunkData); + } + + IO.BinaryReader brIHDR = new IO.BinaryReader(chunks["IHDR"].Data); + brIHDR.Endianness = IO.Endianness.BigEndian; + pic.Width = brIHDR.ReadInt32(); + pic.Height = brIHDR.ReadInt32(); + byte bitDepth = brIHDR.ReadByte(); + byte colorType = brIHDR.ReadByte(); + byte compressionMethod = brIHDR.ReadByte(); + byte filterMethod = brIHDR.ReadByte(); + byte interlaceMethod = brIHDR.ReadByte(); + + byte[] imageData = chunks["IDAT"].Data; + + switch (compressionMethod) + { + case 0: // DEFLATE compression + { + byte[] uncompressedImageData = Compression.CompressionStream.Decompress(Compression.CompressionMethod.Zlib, imageData); + + for (int x = 0; x < pic.Width; x++) + { + for (int y = 0; y < pic.Height; y++) + { + byte r = 0, g = 0, b = 0; + int index = (x * (y + pic.Width)) + 3; + if ((index - 2) < uncompressedImageData.Length) r = uncompressedImageData[index - 2]; + if ((index - 1) < uncompressedImageData.Length) r = uncompressedImageData[index - 1]; + if ((index) < uncompressedImageData.Length) r = uncompressedImageData[index]; + System.Drawing.Color color = System.Drawing.Color.FromArgb(r,g,b); + pic.SetPixel(color, x, y); + } + } + break; + } + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + IO.BinaryWriter bw = base.Stream.BinaryWriter; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + byte[] signature = new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; + bw.Write(signature); + + bw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaExtensionArea.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaExtensionArea.cs new file mode 100644 index 00000000..130af22e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaExtensionArea.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + public class TargaExtensionArea + { + private bool mvarEnabled = false; + public bool Enabled { get { return mvarEnabled; } set { mvarEnabled = value; } } + + private DateTime mvarDateCreated = DateTime.Now; + public DateTime DateCreated { get { return mvarDateCreated; } set { mvarDateCreated = value; } } + + private TimeSpan mvarJobTime = TimeSpan.Zero; + public TimeSpan JobTime { get { return mvarJobTime; } set { mvarJobTime = value; } } + + private string mvarSoftwareID = String.Empty; + public string SoftwareID { get { return mvarSoftwareID; } set { mvarSoftwareID = value; } } + + private string mvarVersionString = String.Empty; + public string VersionString { get { return mvarVersionString; } set { mvarVersionString = value; } } + + private System.Drawing.Color mvarColorKey = System.Drawing.Color.Empty; + public System.Drawing.Color ColorKey { get { return mvarColorKey; } set { mvarColorKey = value; } } + + private int mvarPixelAspectRatioNumerator = 0; + public int PixelAspectRatioNumerator { get { return mvarPixelAspectRatioNumerator; } set { mvarPixelAspectRatioNumerator = value; } } + + private int mvarPixelAspectRatioDenominator = 0; + public int PixelAspectRatioDenominator { get { return mvarPixelAspectRatioDenominator; } set { mvarPixelAspectRatioDenominator = value; } } + + private int mvarGammaNumerator = 0; + public int GammaNumerator { get { return mvarGammaNumerator; } set { mvarGammaNumerator = value; } } + + private int mvarGammaDenominator = 0; + public int GammaDenominator { get { return mvarGammaDenominator; } set { mvarGammaDenominator = value; } } + + private List mvarScanLineTable = new List(); + public List ScanLineTable { get { return mvarScanLineTable; } } + + private List mvarColorCorrectionTable = new List(); + public List ColorCorrectionTable { get { return mvarColorCorrectionTable; } } + + private int mvarAttributesType = 0; + public int AttributesType { get { return mvarAttributesType; } set { mvarAttributesType = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaFirstPixelDestination.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaFirstPixelDestination.cs new file mode 100644 index 00000000..5f4b6e95 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaFirstPixelDestination.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + /// + /// Screen destination of first pixel based on the VerticalTransferOrder and HorizontalTransferOrder. + /// + public enum TargaFirstPixelDestination + { + /// + /// Unknown first pixel destination. + /// + Unknown = 0, + /// + /// First pixel destination is the top-left corner of the image. + /// + TopLeft = 1, + /// + /// First pixel destination is the top-right corner of the image. + /// + TopRight = 2, + /// + /// First pixel destination is the bottom-left corner of the image. + /// + BottomLeft = 3, + /// + /// First pixel destination is the bottom-right corner of the image. + /// + BottomRight = 4 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaHorizontalTransferOrder.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaHorizontalTransferOrder.cs new file mode 100644 index 00000000..0ab38bee --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaHorizontalTransferOrder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + /// + /// The left-to-right ordering in which pixel data is transferred from the file to the screen. + /// + public enum TargaHorizontalTransferOrder + { + /// + /// Unknown transfer order. + /// + Unknown = -1, + /// + /// Transfer order of pixels is from the right to left. + /// + RightToLeft = 0, + /// + /// Transfer order of pixels is from the left to right. + /// + LeftToRight = 1 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaImageType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaImageType.cs new file mode 100644 index 00000000..26926a79 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaImageType.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + /// + /// The type of image read from the file. + /// + public enum TargaImageType + { + /// + /// No image data was found in file. + /// + None = 0, + /// + /// Image is an uncompressed, indexed color-mapped image. + /// + UncompressedIndexed = 1, + /// + /// Image is an uncompressed, RGB image. + /// + UncompressedTrueColor = 2, + /// + /// Image is an uncompressed, grayscale image. + /// + UncompressedGrayscale = 3, + /// + /// Image is a compressed, indexed color-mapped image. + /// + CompressedIndexed = 9, + /// + /// Image is a compressed, RGB image. + /// + CompressedTrueColor = 10, + /// + /// Image is a compressed, grayscale image. + /// + CompressedGrayscale = 11 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaRLEPacketType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaRLEPacketType.cs new file mode 100644 index 00000000..a5005c11 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaRLEPacketType.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + /// + /// The RLE packet type used in a RLE compressed image. + /// + public enum TargaRLEPacketType + { + /// + /// A raw RLE packet type. + /// + Uncompressed = 0, + /// + /// A run-length RLE packet type. + /// + Compressed = 1 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaVerticalTransferOrder.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaVerticalTransferOrder.cs new file mode 100644 index 00000000..5e6bc80a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TargaVerticalTransferOrder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + /// + /// The top-to-bottom ordering in which pixel data is transferred from the file to the screen. + /// + public enum TargaVerticalTransferOrder + { + /// + /// Unknown transfer order. + /// + Unknown = -1, + /// + /// Transfer order of pixels is from the bottom to top. + /// + BottomToTop = 0, + /// + /// Transfer order of pixels is from the top to bottom. + /// + TopToBottom = 1 + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TrueVisionTGADataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TrueVisionTGADataFormat.cs new file mode 100644 index 00000000..c91ed735 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/Targa/TrueVisionTGADataFormat.cs @@ -0,0 +1,701 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.Targa +{ + public class TrueVisionTGADataFormat : DataFormat + { + private const int HEADER_BYTE_LENGTH = 18; + private const int FOOTER_BYTE_LENGTH = 26; + + private const int EXTENSION_AREA_AUTHOR_NAME_LENGTH = 41; + private const int EXTENSION_AREA_AUTHOR_COMMENTS_LENGTH = 324; + private const int EXTENSION_AREA_JOB_NAME_LENGTH = 41; + private const int EXTENSION_AREA_SOFTWARE_ID_LENGTH = 41; + private const int EXTENSION_AREA_SOFTWARE_VERSION_LETTER_LENGTH = 1; + private const int EXTENSION_AREA_COLOR_CORRECTION_TABLE_VALUE_LENGTH = 41; + + private TargaExtensionArea mvarExtensionArea = new TargaExtensionArea(); + public TargaExtensionArea ExtensionArea { get { return mvarExtensionArea; } } + + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + dfr.Filters.Add("TrueVision TARGA", new string[] { "*.tga" }); + dfr.ContentTypes.Add("image/x-targa"); + dfr.ContentTypes.Add("image/x-tga"); + return dfr; + } + + private int mvarFormatVersion = 100; // ORIGINAL_TGA + public int FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + private int GetImageDataOffset(int colorMapLength, byte imageIDLength, byte colorMapEntrySize) + { + // calculate the image data offset + + // start off with the number of bytes holding the header info. + int intImageDataOffset = HEADER_BYTE_LENGTH; + + // add the Image ID length (could be variable) + intImageDataOffset += imageIDLength; + + // determine the number of bytes for each Color Map entry + int Bytes = 0; + switch (colorMapEntrySize) + { + case 15: + Bytes = 2; + break; + case 16: + Bytes = 2; + break; + case 24: + Bytes = 3; + break; + case 32: + Bytes = 4; + break; + } + + // add the length of the color map + intImageDataOffset += ((int)colorMapLength * (int)Bytes); + + // return result + return intImageDataOffset; + } + + private byte mvarPixelDepth = 0; + public byte PixelDepth { get { return mvarPixelDepth; } set { mvarPixelDepth = value; } } + + + public int BytesPerPixel + { + get { return (int)(mvarPixelDepth / 8); } + set + { + if ((value * 8) > 255) + { + throw new ArgumentOutOfRangeException("Bytes per pixel exceeds maximum allowed bits per pixel depth of 255"); + } + mvarPixelDepth = (byte)(value * 8); + } + } + + + private int mvarPadding = 0; + + private TargaImageType mvarImageType = TargaImageType.None; + public TargaImageType ImageType + { + get { return mvarImageType; } + set { mvarImageType = value; } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + + short imageWidth = 0; + short imageHeight = 0; + int extensionAreaOffset = 0; + int developerDirectoryOffset = 0; + TargaVerticalTransferOrder verticalTransferOrder = TargaVerticalTransferOrder.Unknown; + TargaHorizontalTransferOrder horizontalTransferOrder = TargaHorizontalTransferOrder.Unknown; + int imageDataOffset = 0; + + #region Targa Footer + { + // set the cursor at the beginning of the signature string. + br.BaseStream.Seek((-1 * HEADER_BYTE_LENGTH), System.IO.SeekOrigin.End); + + // read the signature bytes and convert to ASCII string + string Signature = br.ReadNullTerminatedString(16); + + // do we have a proper signature + if (Signature == "TRUEVISION-XFILE") + { + // this is a NEW targa file. + mvarFormatVersion = 200; + + // set cursor to beginning of footer info + br.BaseStream.Seek((-1 * FOOTER_BYTE_LENGTH), System.IO.SeekOrigin.End); + + // read the Extension Area Offset value + extensionAreaOffset = br.ReadInt32(); + + // read the Developer Directory Offset value + developerDirectoryOffset = br.ReadInt32(); + + // skip the signature we have already read it. + string Signature2 = br.ReadNullTerminatedString(16); + + // set all values to our TargaFooter class + // this.objTargaFooter.SetExtensionAreaOffset(ExtOffset); + // this.objTargaFooter.SetDeveloperDirectoryOffset(DevDirOff); + // this.objTargaFooter.SetSignature(Signature); + // this.objTargaFooter.SetReservedCharacter(ResChar); + } + else + { + // this is not an ORIGINAL targa file. + mvarFormatVersion = 100; + } + } + #endregion + #region Targa Header + { + // set the cursor at the beginning of the file. + br.BaseStream.Seek(0, System.IO.SeekOrigin.Begin); + + // read the header properties from the file + byte imageIDLength = br.ReadByte(); + bool colorMapEnabled = br.ReadBoolean(); + mvarImageType = (TargaImageType)br.ReadByte(); + + short colorMapFirstEntryIndex = br.ReadInt16(); + short colorMapLength = br.ReadInt16(); + byte colorMapEntrySize = br.ReadByte(); + + short originX = br.ReadInt16(); + short originY = br.ReadInt16(); + imageWidth = br.ReadInt16(); + imageHeight = br.ReadInt16(); + + pic.Width = imageWidth; + pic.Height = imageHeight; + + mvarPixelDepth = br.ReadByte(); + switch (mvarPixelDepth) + { + case 8: + case 16: + case 24: + case 32: + break; + default: + throw new InvalidOperationException("Targa image file format only supports 8, 16, 24, or 32 bit pixel depths"); + } + + + byte ImageDescriptor = br.ReadByte(); + int attributeBits = ImageDescriptor.GetBits(0, 4); + + verticalTransferOrder = (TargaVerticalTransferOrder)ImageDescriptor.GetBits(5, 1); + horizontalTransferOrder = (TargaHorizontalTransferOrder)ImageDescriptor.GetBits(4, 1); + + // load ImageID value if any + if (imageIDLength > 0) + { + string ImageID = br.ReadNullTerminatedString(imageIDLength); + } + + imageDataOffset = GetImageDataOffset(colorMapLength, imageIDLength, colorMapEntrySize); + + #region Load Colormap + { + // load color map if it's included and/or needed + // Only needed for UNCOMPRESSED_COLOR_MAPPED and RUN_LENGTH_ENCODED_COLOR_MAPPED + // image types. If color map is included for other file types we can ignore it. + if (colorMapEnabled) + { + if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + { + if (colorMapLength > 0) + { + for (int i = 0; i < colorMapLength; i++) + { + int a = 0; + int r = 0; + int g = 0; + int b = 0; + + // load each color map entry based on the ColorMapEntrySize value + switch (colorMapEntrySize) + { + case 15: + { + byte[] color15 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + pic.ColorMap.Add(GetColorFrom2Bytes(color15[1], color15[0])); + break; + } + case 16: + { + byte[] color16 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + pic.ColorMap.Add(GetColorFrom2Bytes(color16[1], color16[0])); + break; + } + case 24: + { + b = Convert.ToInt32(br.ReadByte()); + g = Convert.ToInt32(br.ReadByte()); + r = Convert.ToInt32(br.ReadByte()); + pic.ColorMap.Add(System.Drawing.Color.FromArgb(r, g, b)); + break; + } + case 32: + { + a = Convert.ToInt32(br.ReadByte()); + b = Convert.ToInt32(br.ReadByte()); + g = Convert.ToInt32(br.ReadByte()); + r = Convert.ToInt32(br.ReadByte()); + pic.ColorMap.Add(System.Drawing.Color.FromArgb(a, r, g, b)); + break; + } + default: + { + throw new ArgumentOutOfRangeException("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); + } + } + + + } + } + else + { + throw new InvalidOperationException("Image Type requires a Color Map and Color Map Length is zero."); + } + } + + + } + else + { + if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + { + throw new InvalidOperationException("Indexed image type requires a colormap and there was not a colormap included in the file."); + } + } + } + #endregion + } + #endregion + #region Targa extension area + { + // is there an Extension Area in file + if (!br.EndOfStream && (extensionAreaOffset > 0)) + { + mvarExtensionArea.Enabled = true; + + // set the cursor at the beginning of the Extension Area using ExtensionAreaOffset. + br.BaseStream.Seek(extensionAreaOffset, System.IO.SeekOrigin.Begin); + + // load the extension area fields from the file + + short extensionAreaSize = br.ReadInt16(); + string authorName = br.ReadNullTerminatedString(EXTENSION_AREA_AUTHOR_NAME_LENGTH); + string authorComments = br.ReadNullTerminatedString(EXTENSION_AREA_AUTHOR_COMMENTS_LENGTH); + + + // get the date/time stamp of the file + short iMonth = br.ReadInt16(); + short iDay = br.ReadInt16(); + short iYear = br.ReadInt16(); + short iHour = br.ReadInt16(); + short iMinute = br.ReadInt16(); + short iSecond = br.ReadInt16(); + DateTime dtstamp; + string strStamp = iMonth.ToString() + @"/" + iDay.ToString() + @"/" + iYear.ToString() + @" "; + strStamp += iHour.ToString() + @":" + iMinute.ToString() + @":" + iSecond.ToString(); + if (DateTime.TryParse(strStamp, out dtstamp) == true) + { + mvarExtensionArea.DateCreated = dtstamp; + } + + + string JobName = br.ReadNullTerminatedString(EXTENSION_AREA_JOB_NAME_LENGTH); + + + // get the job time of the file + iHour = br.ReadInt16(); + iMinute = br.ReadInt16(); + iSecond = br.ReadInt16(); + TimeSpan ts = new TimeSpan((int)iHour, (int)iMinute, (int)iSecond); + mvarExtensionArea.JobTime = ts; + + string softwareID = br.ReadNullTerminatedString(EXTENSION_AREA_SOFTWARE_ID_LENGTH); + mvarExtensionArea.SoftwareID = softwareID; + + + // get the version number and letter from file + short sVersionNumber = br.ReadInt16(); + float iVersionNumber = (float)sVersionNumber / 100.0F; + + string strVersionLetter = br.ReadNullTerminatedString(EXTENSION_AREA_SOFTWARE_VERSION_LETTER_LENGTH); + + mvarExtensionArea.VersionString = (iVersionNumber.ToString(@"F2") + strVersionLetter); + + + // get the color key of the file + int a = (int)br.ReadByte(); + int r = (int)br.ReadByte(); + int b = (int)br.ReadByte(); + int g = (int)br.ReadByte(); + mvarExtensionArea.ColorKey = (System.Drawing.Color.FromArgb(a, r, g, b)); + + + mvarExtensionArea.PixelAspectRatioNumerator = (int)br.ReadInt16(); + mvarExtensionArea.PixelAspectRatioDenominator = (int)br.ReadInt16(); + mvarExtensionArea.GammaNumerator = (int)br.ReadInt16(); + mvarExtensionArea.GammaDenominator = (int)br.ReadInt16(); + + int extensionAreaColorCorrectionOffset = br.ReadInt32(); + int extensionAreaPostageStampOffset = br.ReadInt32(); + int extensionAreaScanLineOffset = br.ReadInt32(); + mvarExtensionArea.AttributesType = (int)br.ReadByte(); + + + // load Scan Line Table from file if any + if (extensionAreaScanLineOffset > 0) + { + br.BaseStream.Seek(extensionAreaScanLineOffset, System.IO.SeekOrigin.Begin); + for (int i = 0; i < imageHeight; i++) + { + mvarExtensionArea.ScanLineTable.Add(br.ReadInt32()); + } + } + + + // load Color Correction Table from file if any + if (extensionAreaColorCorrectionOffset > 0) + { + br.BaseStream.Seek(extensionAreaColorCorrectionOffset, System.IO.SeekOrigin.Begin); + for (int i = 0; i < EXTENSION_AREA_COLOR_CORRECTION_TABLE_VALUE_LENGTH; i++) + { + a = (int)br.ReadInt16(); + r = (int)br.ReadInt16(); + b = (int)br.ReadInt16(); + g = (int)br.ReadInt16(); + mvarExtensionArea.ColorCorrectionTable.Add(System.Drawing.Color.FromArgb(a, r, g, b)); + } + } + } + } + #endregion + #region Targa image + { + //************** NOTE ******************* + // The memory allocated for Microsoft Bitmaps must be aligned on a 32bit boundary. + // The stride refers to the number of bytes allocated for one scanline of the bitmap. + // In your loop, you copy the pixels one scanline at a time and take into + // consideration the amount of padding that occurs due to memory alignment. + // calculate the stride, in bytes, of the image (32bit aligned width of each image row) + int intStride = (((int)imageWidth * (int)mvarPixelDepth + 31) & ~31) >> 3; // width in bytes + + // calculate the padding, in bytes, of the image + // number of bytes to add to make each row a 32bit aligned row + // padding in bytes + mvarPadding = intStride - ((((int)imageWidth * (int)mvarPixelDepth) + 7) / 8); + + // get the image data bytes + byte[] bimagedata = null; + + #region Image Data Bytes + { + + // read the image data into a byte array + // take into account stride has to be a multiple of 4 + // use padding to make sure multiple of 4 + + byte[] data = null; + + // padding bytes + byte[] padding = new byte[mvarPadding]; + System.IO.MemoryStream msData = null; + + // seek to the beginning of the image data using the ImageDataOffset value + br.BaseStream.Seek(imageDataOffset, System.IO.SeekOrigin.Begin); + + + // get the size in bytes of each row in the image + int intImageRowByteSize = (int)pic.Width * ((int)BytesPerPixel); + + // get the size in bytes of the whole image + int intImageByteSize = intImageRowByteSize * (int)pic.Height; + + List> rows = new List>(); + + // is this a RLE compressed image type + #region COMPRESSED + if (mvarImageType == TargaImageType.CompressedGrayscale || mvarImageType == TargaImageType.CompressedIndexed || mvarImageType == TargaImageType.CompressedTrueColor) + { + // RLE Packet info + byte bRLEPacket = 0; + int intRLEPacketType = -1; + int intRLEPixelCount = 0; + byte[] bRunLengthPixel = null; + + // used to keep track of bytes read + int intImageBytesRead = 0; + int intImageRowBytesRead = 0; + + List row = new List(); + + // keep reading until we have the all image bytes + while (intImageBytesRead < intImageByteSize) + { + // get the RLE packet + bRLEPacket = br.ReadByte(); + intRLEPacketType = bRLEPacket.GetBits(7, 1); + intRLEPixelCount = bRLEPacket.GetBits(0, 7) + 1; + + // check the RLE packet type + if ((TargaRLEPacketType)intRLEPacketType == TargaRLEPacketType.Compressed) + { + // get the pixel color data + bRunLengthPixel = br.ReadBytes(BytesPerPixel); + + // add the number of pixels specified using the read pixel color + for (int i = 0; i < intRLEPixelCount; i++) + { + foreach (byte b in bRunLengthPixel) + { + row.Add(b); + } + + // increment the byte counts + intImageRowBytesRead += bRunLengthPixel.Length; + intImageBytesRead += bRunLengthPixel.Length; + + // if we have read a full image row + // add the row to the row list and clear it + // restart row byte count + if (intImageRowBytesRead == intImageRowByteSize) + { + rows.Add(row); + row = new List(); + intImageRowBytesRead = 0; + } + } + } + else if ((TargaRLEPacketType)intRLEPacketType == TargaRLEPacketType.Uncompressed) + { + // get the number of bytes to read based on the read pixel count + int intBytesToRead = intRLEPixelCount * (int)BytesPerPixel; + + // read each byte + for (int i = 0; i < intBytesToRead; i++) + { + row.Add(br.ReadByte()); + + // increment the byte counts + intImageBytesRead++; + intImageRowBytesRead++; + + // if we have read a full image row + // add the row to the row list and clear it + // restart row byte count + if (intImageRowBytesRead == intImageRowByteSize) + { + rows.Add(row); + row = new System.Collections.Generic.List(); + intImageRowBytesRead = 0; + } + } + } + } + } + #endregion + #region NON-COMPRESSED + else + { + + // loop through each row in the image + for (int i = 0; i < (int)imageHeight; i++) + { + // create a new row + System.Collections.Generic.List row = new System.Collections.Generic.List(); + + // loop through each byte in the row + for (int j = 0; j < intImageRowByteSize; j++) + { + // add the byte to the row + row.Add(br.ReadByte()); + } + + // add row to the list of rows + rows.Add(row); + } + } + #endregion + + // flag that states whether or not to reverse the location of all rows. + bool blnRowsReverse = false; + + // flag that states whether or not to reverse the bytes in each row. + bool blnEachRowReverse = false; + + // use FirstPixelDestination to determine the alignment of the + // image data byte + switch (GetFirstPixelDestination(verticalTransferOrder, horizontalTransferOrder)) + { + case TargaFirstPixelDestination.TopLeft: + { + blnRowsReverse = false; + blnEachRowReverse = true; + break; + } + case TargaFirstPixelDestination.TopRight: + { + blnRowsReverse = false; + blnEachRowReverse = false; + break; + } + case TargaFirstPixelDestination.BottomLeft: + { + blnRowsReverse = true; + blnEachRowReverse = true; + break; + } + case TargaFirstPixelDestination.BottomRight: + case TargaFirstPixelDestination.Unknown: + { + blnRowsReverse = true; + blnEachRowReverse = false; + break; + } + } + + // write the bytes from each row into a memory stream and get the + // resulting byte array + using (msData = new System.IO.MemoryStream()) + { + // do we reverse the rows in the row list. + if (blnRowsReverse == true) + { + rows.Reverse(); + } + + // go through each row + for (int i = 0; i < rows.Count; i++) + { + // do we reverse the bytes in the row + if (blnEachRowReverse == true) + { + rows[i].Reverse(); + } + + // get the byte array for the row + byte[] brow = rows[i].ToArray(); + + // write the row bytes and padding bytes to the memory streem + msData.Write(brow, 0, brow.Length); + msData.Write(padding, 0, padding.Length); + } + + // get the image byte array + data = msData.ToArray(); + + int x = 0, y = 0; + for (int z = 0; z < data.Length; z += 3) + { + int r = data[z + 2]; + int g = data[z + 1]; + int b = data[z]; + int a = 255; + + if (mvarPixelDepth == 32) + { + a = data[z + 3]; + z++; + } + + System.Drawing.Color color = System.Drawing.Color.FromArgb(a, r, g, b); + pic.SetPixel(color, x, y); + + x++; + if (x == imageWidth) + { + x = 0; + y++; + + if (y == imageHeight) + { + break; + } + } + } + } + } + #endregion + } + #endregion + } + + private TargaFirstPixelDestination GetFirstPixelDestination(TargaVerticalTransferOrder verticalTransferOrder, TargaHorizontalTransferOrder horizontalTransferOrder) + { + if (verticalTransferOrder == TargaVerticalTransferOrder.Unknown || horizontalTransferOrder == TargaHorizontalTransferOrder.Unknown) + { + return TargaFirstPixelDestination.Unknown; + } + else if (verticalTransferOrder == TargaVerticalTransferOrder.BottomToTop && horizontalTransferOrder == TargaHorizontalTransferOrder.LeftToRight) + { + return TargaFirstPixelDestination.BottomLeft; + } + else if (verticalTransferOrder == TargaVerticalTransferOrder.BottomToTop && horizontalTransferOrder == TargaHorizontalTransferOrder.RightToLeft) + { + return TargaFirstPixelDestination.BottomRight; + } + else if (verticalTransferOrder == TargaVerticalTransferOrder.TopToBottom && horizontalTransferOrder == TargaHorizontalTransferOrder.LeftToRight) + { + return TargaFirstPixelDestination.TopLeft; + } + return TargaFirstPixelDestination.TopRight; + } + + + /// + /// Reads ARGB values from the 16 bits of two given Bytes in a 1555 format. + /// + /// The first Byte. + /// The Second Byte. + /// A System.Drawing.Color with a ARGB values read from the two given Bytes + /// + /// Gets the ARGB values from the 16 bits in the two bytes based on the below diagram + /// | BYTE 1 | BYTE 2 | + /// | A RRRRR GG | GGG BBBBB | + /// + private static System.Drawing.Color GetColorFrom2Bytes(byte one, byte two) + { + // get the 5 bits used for the RED value from the first byte + int r1 = one.GetBits(2, 5); + int r = r1 << 3; + + // get the two high order bits for GREEN from the from the first byte + int bit = one.GetBits(0, 2); + // shift bits to the high order + int g1 = bit << 6; + + // get the 3 low order bits for GREEN from the from the second byte + bit = two.GetBits(5, 3); + // shift the low order bits + int g2 = bit << 3; + // add the shifted values together to get the full GREEN value + int g = g1 + g2; + + // get the 5 bits used for the BLUE value from the second byte + int b1 = two.GetBits(0, 5); + int b = b1 << 3; + + // get the 1 bit used for the ALPHA value from the first byte + int a1 = one.GetBits(7, 1); + int a = a1 * 255; + + // return the resulting Color + return System.Drawing.Color.FromArgb(a, r, g, b); + } + + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/Constants.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/Constants.cs new file mode 100644 index 00000000..ce71e000 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/Constants.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.WaveletScalarQuantization.Internal +{ + public static class Constants + { + /*used to "mask out" n number of bits from data stream*/ + public static int[] BITMASK = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; + + public const int MAX_DHT_TABLES = 8; + public const int MAX_HUFFBITS = 16; + public const int MAX_HUFFCOUNTS_WSQ = 256; + + public const int W_TREELEN = 20; + public const int Q_TREELEN = 64; + + /* WSQ Marker Definitions */ + public const int SOI_WSQ = 0xffa0; + public const int EOI_WSQ = 0xffa1; + public const int SOF_WSQ = 0xffa2; + public const int SOB_WSQ = 0xffa3; + public const int DTT_WSQ = 0xffa4; + public const int DQT_WSQ = 0xffa5; + public const int DHT_WSQ = 0xffa6; + public const int DRT_WSQ = 0xffa7; + public const int COM_WSQ = 0xffa8; + + public const int STRT_SUBBAND_2 = 19; + public const int STRT_SUBBAND_3 = 52; + public const int MAX_SUBBANDS = 64; + public const int NUM_SUBBANDS = 60; + public const int STRT_SUBBAND_DEL = NUM_SUBBANDS; + public const int STRT_SIZE_REGION_2 = 4; + public const int STRT_SIZE_REGION_3 = 51; + + /* Case for getting ANY marker. */ + public const int ANY_WSQ = 0xffff; + public const int TBLS_N_SOF = 2; + public const int TBLS_N_SOB = TBLS_N_SOF + 2; + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs new file mode 100644 index 00000000..b9f86b3c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/Internal/WsqHelper.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.WaveletScalarQuantization +{ + public struct WavletTree + { + public int x; + public int y; + public int lenx; + public int leny; + public int invrw; + public int invcl; + } + + public struct TableDTT + { + public float[] lofilt; + public float[] hifilt; + public int losz; + public int hisz; + public int lodef; + public int hidef; + } + + public struct HuffCode + { + public int size; + public int code; + } + + public struct HeaderFrm + { + public int black; + public int white; + public int width; + public int height; + public float mShift; + public float rScale; + public int wsqEncoder; + public int software; + } + + public struct HuffmanTable + { + public int tableLen; + public int bytesLeft; + public int tableId; + public int[] huffbits; + public int[] huffvalues; + } + + public class TableDHT + { + private const int MAX_HUFFBITS = 16; /*DO NOT CHANGE THIS CONSTANT!! */ + private const int MAX_HUFFCOUNTS_WSQ = 256; /* Length of code table: change as needed */ + + public byte tabdef; + public int[] huffbits = new int[MAX_HUFFBITS]; + public int[] huffvalues = new int[MAX_HUFFCOUNTS_WSQ + 1]; + } + + public class Table_DQT + { + public const int MAX_SUBBANDS = 64; + public float binCenter; + public float[] qBin = new float[MAX_SUBBANDS]; + public float[] zBin = new float[MAX_SUBBANDS]; + public int dqtDef; + } + + public class QuantTree + { + public int x; /* UL corner of block */ + public int y; + public int lenx; /* block size */ + public int leny; /* block size */ + } + + public class IntRef + { + public int value; + + + public IntRef() + { + } + + public IntRef(int value) + { + this.value = value; + } + } + + internal class Token + { + public TableDHT[] tableDHT; + public TableDTT tableDTT; + public Table_DQT tableDQT; + + public WavletTree[] wtree; + public QuantTree[] qtree; + + + public byte[] buffer; + public int pointer; + + public Token(byte[] buffer) + { + this.buffer = buffer; + this.pointer = 0; + } + + public void initialize() + { + tableDTT = new TableDTT(); + tableDQT = new Table_DQT(); + + /* Init DHT Tables to 0. */ + tableDHT = new TableDHT[Internal.Constants.MAX_DHT_TABLES]; + for (int i = 0; i < Internal.Constants.MAX_DHT_TABLES; i++) + { + tableDHT[i] = new TableDHT(); + tableDHT[i].tabdef = 0; + } + } + + public long readInt() + { + byte byte1 = buffer[pointer++]; + byte byte2 = buffer[pointer++]; + byte byte3 = buffer[pointer++]; + byte byte4 = buffer[pointer++]; + + return (0xffL & byte1) << 24 | (0xffL & byte2) << 16 | (0xffL & byte3) << 8 | (0xffL & byte4); + } + + public int readShort() + { + int byte1 = buffer[pointer++]; + int byte2 = buffer[pointer++]; + + return (0xff & byte1) << 8 | (0xff & byte2); + } + + public int readByte() + { + byte byte1 = buffer[pointer++]; + + return 0xff & byte1; + } + + public byte[] readBytes(int size) + { + byte[] bytes = new byte[size]; + + for (int i = 0; i < size; i++) + { + bytes[i] = buffer[pointer++]; + } + + return bytes; + } + } + + //public class Bitmap + //{ + // private int width; + // private int height; + // private int ppi; + // private int depth; + // private int lossyflag; + + // private byte[] pixels; + // private int length; + + // public Bitmap(byte[] pixels, int width, int height, int ppi, int depth, int lossyflag) + // { + // this.pixels = pixels; + // this.length = pixels != null ? pixels.Length : 0; + + // this.width = width; + // this.height = height; + // this.ppi = ppi; + // this.depth = depth; + // this.lossyflag = lossyflag; + // } + + + // public int getWidth() + // { + // return width; + // } + + // public int getHeight() + // { + // return height; + // } + + // public int getPpi() + // { + // return ppi; + // } + + // public byte[] getPixels() + // { + // return pixels; + // } + + // public int getLength() + // { + // return length; + // } + + // public int getDepth() + // { + // return depth; + // } + + // public int getLossyflag() + // { + // return lossyflag; + // } + //} +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/WSQDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/WSQDataFormat.cs new file mode 100644 index 00000000..10c2f1f9 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Picture/WaveletScalarQuantization/WSQDataFormat.cs @@ -0,0 +1,1684 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Picture; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Picture.WaveletScalarQuantization +{ + public class WSQDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Wavelet Scalar Quantization image", new byte?[][] { new byte?[] { 0xA0, 0xFF } }, new string[] { "*.wsq" }); + } + return _dfr; + } + + private class WSQData + { + public static TableDHT[] tableDHT; + public static TableDTT tableDTT; + public static Table_DQT tableDQT; + + public static WavletTree[] wtree; + public static QuantTree[] qtree; + + public static void Initialize() + { + tableDTT = new TableDTT(); + tableDQT = new Table_DQT(); + + // Initialize DHT tables to 0 + tableDHT = new TableDHT[Internal.Constants.MAX_DHT_TABLES]; + for (int i = 0; i < Internal.Constants.MAX_DHT_TABLES; i++) + { + tableDHT[i] = new TableDHT(); + tableDHT[i].tabdef = 0; + } + } + } + + + private int intSign(int power) + { + /* "sign" power */ + int cnt; /* counter */ + int num = -1; /* sign return value */ + + if (power == 0) + { + return 1; + } + for (cnt = 1; cnt < power; cnt++) + { + num *= -1; + } + return num; + } + + private HuffmanTable getCHuffmanTable(IO.BinaryReader br, int maxHuffcounts, int bytesLeft, bool readTableLen) + { + + HuffmanTable huffmanTable = new HuffmanTable(); + + /* table_len */ + if (readTableLen) + { + huffmanTable.tableLen = br.ReadInt16(); + huffmanTable.bytesLeft = huffmanTable.tableLen - 2; + bytesLeft = huffmanTable.bytesLeft; + } + else + { + huffmanTable.bytesLeft = bytesLeft; + } + + /* If no bytes left ... */ + if (bytesLeft <= 0) + { + throw new SystemException("ERROR : getCHuffmanTable : no huffman table bytes remaining"); + } + + /* Table ID */ + huffmanTable.tableId = br.ReadByte(); + huffmanTable.bytesLeft--; + + + huffmanTable.huffbits = new int[Internal.Constants.MAX_HUFFBITS]; + int numHufvals = 0; + /* L1 ... L16 */ + for (int i = 0; i < Internal.Constants.MAX_HUFFBITS; i++) + { + huffmanTable.huffbits[i] = br.ReadByte(); + numHufvals += huffmanTable.huffbits[i]; + } + huffmanTable.bytesLeft -= Internal.Constants.MAX_HUFFBITS; + + if (numHufvals > maxHuffcounts + 1) + { + throw new SystemException("ERROR : getCHuffmanTable : numHufvals is larger than MAX_HUFFCOUNTS"); + } + + // Could allocate only the amount needed ... then we wouldn't + // need to pass MAX_HUFFCOUNTS + huffmanTable.huffvalues = new int[maxHuffcounts + 1]; + + // V1,1 ... V16,16 + for (int i = 0; i < numHufvals; i++) + { + huffmanTable.huffvalues[i] = br.ReadByte(); + } + huffmanTable.bytesLeft -= numHufvals; + + return huffmanTable; + } + + private void wtree4(int start1, int start2, int lenx, int leny, int x, int y, int stop1) + { + int evenx, eveny; /* Check length of subband for even or odd */ + int p1, p2; /* w_tree locations for storing subband sizes and locations */ + + p1 = start1; + p2 = start2; + + evenx = lenx % 2; + eveny = leny % 2; + + WSQData.wtree[p1].x = x; + WSQData.wtree[p1].y = y; + WSQData.wtree[p1].lenx = lenx; + WSQData.wtree[p1].leny = leny; + + WSQData.wtree[p2].x = x; + WSQData.wtree[p2 + 2].x = x; + WSQData.wtree[p2].y = y; + WSQData.wtree[p2 + 1].y = y; + + if (evenx == 0) + { + WSQData.wtree[p2].lenx = lenx / 2; + WSQData.wtree[p2 + 1].lenx = WSQData.wtree[p2].lenx; + } + else + { + if (p1 == 4) + { + WSQData.wtree[p2].lenx = (lenx - 1) / 2; + WSQData.wtree[p2 + 1].lenx = WSQData.wtree[p2].lenx + 1; + } + else + { + WSQData.wtree[p2].lenx = (lenx + 1) / 2; + WSQData.wtree[p2 + 1].lenx = WSQData.wtree[p2].lenx - 1; + } + } + WSQData.wtree[p2 + 1].x = WSQData.wtree[p2].lenx + x; + if (stop1 == 0) + { + WSQData.wtree[p2 + 3].lenx = WSQData.wtree[p2 + 1].lenx; + WSQData.wtree[p2 + 3].x = WSQData.wtree[p2 + 1].x; + } + WSQData.wtree[p2 + 2].lenx = WSQData.wtree[p2].lenx; + + + if (eveny == 0) + { + WSQData.wtree[p2].leny = leny / 2; + WSQData.wtree[p2 + 2].leny = WSQData.wtree[p2].leny; + } + else + { + if (p1 == 5) + { + WSQData.wtree[p2].leny = (leny - 1) / 2; + WSQData.wtree[p2 + 2].leny = WSQData.wtree[p2].leny + 1; + } + else + { + WSQData.wtree[p2].leny = (leny + 1) / 2; + WSQData.wtree[p2 + 2].leny = WSQData.wtree[p2].leny - 1; + } + } + WSQData.wtree[p2 + 2].y = WSQData.wtree[p2].leny + y; + if (stop1 == 0) + { + WSQData.wtree[p2 + 3].leny = WSQData.wtree[p2 + 2].leny; + WSQData.wtree[p2 + 3].y = WSQData.wtree[p2 + 2].y; + } + WSQData.wtree[p2 + 1].leny = WSQData.wtree[p2].leny; + } + private void qtree16(int start, int lenx, int leny, int x, int y, int rw, int cl) + { + int tempx, temp2x; /* temporary x values */ + int tempy, temp2y; /* temporary y values */ + int evenx, eveny; /* Check length of subband for even or odd */ + int p; /* indicates subband information being stored */ + + p = start; + evenx = lenx % 2; + eveny = leny % 2; + + if (evenx == 0) + { + tempx = lenx / 2; + temp2x = tempx; + } + else + { + if (cl != 0) + { + temp2x = (lenx + 1) / 2; + tempx = temp2x - 1; + } + else + { + tempx = (lenx + 1) / 2; + temp2x = tempx - 1; + } + } + + if (eveny == 0) + { + tempy = leny / 2; + temp2y = tempy; + } + else + { + if (rw != 0) + { + temp2y = (leny + 1) / 2; + tempy = temp2y - 1; + } + else + { + tempy = (leny + 1) / 2; + temp2y = tempy - 1; + } + } + + evenx = tempx % 2; + eveny = tempy % 2; + + WSQData.qtree[p].x = x; + WSQData.qtree[p + 2].x = x; + WSQData.qtree[p].y = y; + WSQData.qtree[p + 1].y = y; + if (evenx == 0) + { + WSQData.qtree[p].lenx = tempx / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p].lenx; + } + else + { + WSQData.qtree[p].lenx = (tempx + 1) / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx - 1; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p + 1].lenx; + } + WSQData.qtree[p + 1].x = x + WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].x = WSQData.qtree[p + 1].x; + if (eveny == 0) + { + WSQData.qtree[p].leny = tempy / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 3].leny = WSQData.qtree[p].leny; + } + else + { + WSQData.qtree[p].leny = (tempy + 1) / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny - 1; + WSQData.qtree[p + 3].leny = WSQData.qtree[p + 2].leny; + } + WSQData.qtree[p + 2].y = y + WSQData.qtree[p].leny; + WSQData.qtree[p + 3].y = WSQData.qtree[p + 2].y; + + + evenx = temp2x % 2; + + WSQData.qtree[p + 4].x = x + tempx; + WSQData.qtree[p + 6].x = WSQData.qtree[p + 4].x; + WSQData.qtree[p + 4].y = y; + WSQData.qtree[p + 5].y = y; + WSQData.qtree[p + 6].y = WSQData.qtree[p + 2].y; + WSQData.qtree[p + 7].y = WSQData.qtree[p + 2].y; + WSQData.qtree[p + 4].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 5].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 6].leny = WSQData.qtree[p + 2].leny; + WSQData.qtree[p + 7].leny = WSQData.qtree[p + 2].leny; + if (evenx == 0) + { + WSQData.qtree[p + 4].lenx = temp2x / 2; + WSQData.qtree[p + 5].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 6].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 7].lenx = WSQData.qtree[p + 4].lenx; + } + else + { + WSQData.qtree[p + 5].lenx = (temp2x + 1) / 2; + WSQData.qtree[p + 4].lenx = WSQData.qtree[p + 5].lenx - 1; + WSQData.qtree[p + 6].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 7].lenx = WSQData.qtree[p + 5].lenx; + } + WSQData.qtree[p + 5].x = WSQData.qtree[p + 4].x + WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 7].x = WSQData.qtree[p + 5].x; + + + eveny = temp2y % 2; + + WSQData.qtree[p + 8].x = x; + WSQData.qtree[p + 9].x = WSQData.qtree[p + 1].x; + WSQData.qtree[p + 10].x = x; + WSQData.qtree[p + 11].x = WSQData.qtree[p + 1].x; + WSQData.qtree[p + 8].y = y + tempy; + WSQData.qtree[p + 9].y = WSQData.qtree[p + 8].y; + WSQData.qtree[p + 8].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 9].lenx = WSQData.qtree[p + 1].lenx; + WSQData.qtree[p + 10].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 11].lenx = WSQData.qtree[p + 1].lenx; + if (eveny == 0) + { + WSQData.qtree[p + 8].leny = temp2y / 2; + WSQData.qtree[p + 9].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 10].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 11].leny = WSQData.qtree[p + 8].leny; + } + else + { + WSQData.qtree[p + 10].leny = (temp2y + 1) / 2; + WSQData.qtree[p + 11].leny = WSQData.qtree[p + 10].leny; + WSQData.qtree[p + 8].leny = WSQData.qtree[p + 10].leny - 1; + WSQData.qtree[p + 9].leny = WSQData.qtree[p + 8].leny; + } + WSQData.qtree[p + 10].y = WSQData.qtree[p + 8].y + WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 11].y = WSQData.qtree[p + 10].y; + + + WSQData.qtree[p + 12].x = WSQData.qtree[p + 4].x; + WSQData.qtree[p + 13].x = WSQData.qtree[p + 5].x; + WSQData.qtree[p + 14].x = WSQData.qtree[p + 4].x; + WSQData.qtree[p + 15].x = WSQData.qtree[p + 5].x; + WSQData.qtree[p + 12].y = WSQData.qtree[p + 8].y; + WSQData.qtree[p + 13].y = WSQData.qtree[p + 8].y; + WSQData.qtree[p + 14].y = WSQData.qtree[p + 10].y; + WSQData.qtree[p + 15].y = WSQData.qtree[p + 10].y; + WSQData.qtree[p + 12].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 13].lenx = WSQData.qtree[p + 5].lenx; + WSQData.qtree[p + 14].lenx = WSQData.qtree[p + 4].lenx; + WSQData.qtree[p + 15].lenx = WSQData.qtree[p + 5].lenx; + WSQData.qtree[p + 12].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 13].leny = WSQData.qtree[p + 8].leny; + WSQData.qtree[p + 14].leny = WSQData.qtree[p + 10].leny; + WSQData.qtree[p + 15].leny = WSQData.qtree[p + 10].leny; + } + private void qtree4(int start, int lenx, int leny, int x, int y) + { + int evenx, eveny; /* Check length of subband for even or odd */ + int p; /* indicates subband information being stored */ + + p = start; + evenx = lenx % 2; + eveny = leny % 2; + + + WSQData.qtree[p].x = x; + WSQData.qtree[p + 2].x = x; + WSQData.qtree[p].y = y; + WSQData.qtree[p + 1].y = y; + if (evenx == 0) + { + WSQData.qtree[p].lenx = lenx / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p].lenx; + } + else + { + WSQData.qtree[p].lenx = (lenx + 1) / 2; + WSQData.qtree[p + 1].lenx = WSQData.qtree[p].lenx - 1; + WSQData.qtree[p + 2].lenx = WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].lenx = WSQData.qtree[p + 1].lenx; + } + WSQData.qtree[p + 1].x = x + WSQData.qtree[p].lenx; + WSQData.qtree[p + 3].x = WSQData.qtree[p + 1].x; + if (eveny == 0) + { + WSQData.qtree[p].leny = leny / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 3].leny = WSQData.qtree[p].leny; + } + else + { + WSQData.qtree[p].leny = (leny + 1) / 2; + WSQData.qtree[p + 1].leny = WSQData.qtree[p].leny; + WSQData.qtree[p + 2].leny = WSQData.qtree[p].leny - 1; + WSQData.qtree[p + 3].leny = WSQData.qtree[p + 2].leny; + } + WSQData.qtree[p + 2].y = y + WSQData.qtree[p].leny; + WSQData.qtree[p + 3].y = WSQData.qtree[p + 2].y; + } + + private byte[] ImageToByteArray(float[] img, int width, int height, float mShift, float rScale) + { + byte[] data = new byte[width * height]; + + int idx = 0; + for (int r = 0; r < height; r++) + { + for (int c = 0; c < width; c++) + { + float pixel = (img[idx] * rScale) + mShift; + pixel += 0.5F; + + if (pixel < 0.0) + { + data[idx] = 0; // neg pix poss after quantization + } + else if (pixel > 255.0) + { + data[idx] = (byte)255; + } + else + { + data[idx] = (byte)pixel; + } + idx++; + } + } + + return data; + } + + /// + /// + /// + /// + /// + /// + /// + /// temporary length parameters + /// temporary length parameters + /// The next row_col to filter + /// The next pixel to filter + /// + /// NEW + /// Filter coefficients + /// NEW + /// Spectral inversion + private void JoinLets(float[] newdata, float[] olddata, int newIndex, int oldIndex, int len1, int len2, int pitch, int stride, float[] hi, int hsz, float[] lo, int lsz, int inv) + { + int lp0, lp1; + int hp0, hp1; + int lopass, hipass; // lo/hi pass image pointers + int limg, himg; + int pix, cl_rw; // pixel counter and column/row counter + int i, da_ev; // if "scanline" is even or odd and + int loc, hoc; + int hlen, llen; + int nstr, pstr; + int tap; + int fi_ev; + int olle, ohle, olre, ohre; + int lle, lle2, lre, lre2; + int hle, hle2, hre, hre2; + int lpx, lspx; + int lpxstr, lspxstr; + int lstap, lotap; + int hpx, hspx; + int hpxstr, hspxstr; + int hstap, hotap; + int asym, fhre = 0, ofhre; + float ssfac, osfac, sfac; + + da_ev = len2 % 2; + fi_ev = lsz % 2; + pstr = stride; + nstr = -pstr; + if (da_ev != 0) + { + llen = (len2 + 1) / 2; + hlen = llen - 1; + } + else + { + llen = len2 / 2; + hlen = llen; + } + + if (fi_ev != 0) + { + asym = 0; + ssfac = 1.0f; + ofhre = 0; + loc = (lsz - 1) / 4; + hoc = (hsz + 1) / 4 - 1; + lotap = ((lsz - 1) / 2) % 2; + hotap = ((hsz + 1) / 2) % 2; + if (da_ev != 0) + { + olle = 0; + olre = 0; + ohle = 1; + ohre = 1; + } + else + { + olle = 0; + olre = 1; + ohle = 1; + ohre = 0; + } + } + else + { + asym = 1; + ssfac = -1.0f; + ofhre = 2; + loc = lsz / 4 - 1; + hoc = hsz / 4 - 1; + lotap = (lsz / 2) % 2; + hotap = (hsz / 2) % 2; + if (da_ev != 0) + { + olle = 1; + olre = 0; + ohle = 1; + ohre = 1; + } + else + { + olle = 1; + olre = 1; + ohle = 1; + ohre = 1; + } + + if (loc == -1) + { + loc = 0; + olle = 0; + } + if (hoc == -1) + { + hoc = 0; + ohle = 0; + } + + for (i = 0; i < hsz; i++) + { + hi[i] *= -1.0F; + } + } + + + for (cl_rw = 0; cl_rw < len1; cl_rw++) + { + limg = newIndex + cl_rw * pitch; + himg = limg; + newdata[himg] = 0.0f; + newdata[himg + stride] = 0.0f; + if (inv != 0) + { + hipass = oldIndex + cl_rw * pitch; + lopass = hipass + stride * hlen; + } + else + { + lopass = oldIndex + cl_rw * pitch; + hipass = lopass + stride * llen; + } + + + lp0 = lopass; + lp1 = lp0 + (llen - 1) * stride; + lspx = lp0 + (loc * stride); + lspxstr = nstr; + lstap = lotap; + lle2 = olle; + lre2 = olre; + + hp0 = hipass; + hp1 = hp0 + (hlen - 1) * stride; + hspx = hp0 + (hoc * stride); + hspxstr = nstr; + hstap = hotap; + hle2 = ohle; + hre2 = ohre; + osfac = ssfac; + + for (pix = 0; pix < hlen; pix++) + { + for (tap = lstap; tap >= 0; tap--) + { + lle = lle2; + lre = lre2; + lpx = lspx; + lpxstr = lspxstr; + + newdata[limg] = olddata[lpx] * lo[tap]; + for (i = tap + 2; i < lsz; i += 2) + { + if (lpx == lp0) + { + if (lle != 0) + { + lpxstr = 0; + lle = 0; + } + else + { + lpxstr = pstr; + } + } + if (lpx == lp1) + { + if (lre != 0) + { + lpxstr = 0; + lre = 0; + } + else + { + lpxstr = nstr; + } + } + lpx += lpxstr; + newdata[limg] += olddata[lpx] * lo[i]; + } + limg += stride; + } + if (lspx == lp0) + { + if (lle2 != 0) + { + lspxstr = 0; + lle2 = 0; + } + else + { + lspxstr = pstr; + } + } + lspx += lspxstr; + lstap = 1; + + for (tap = hstap; tap >= 0; tap--) + { + hle = hle2; + hre = hre2; + hpx = hspx; + hpxstr = hspxstr; + fhre = ofhre; + sfac = osfac; + + for (i = tap; i < hsz; i += 2) + { + if (hpx == hp0) + { + if (hle != 0) + { + hpxstr = 0; + hle = 0; + } + else + { + hpxstr = pstr; + sfac = 1.0f; + } + } + if (hpx == hp1) + { + if (hre != 0) + { + hpxstr = 0; + hre = 0; + if (asym != 0 && da_ev != 0) + { + hre = 1; + fhre--; + sfac = (float)fhre; + if (sfac == 0.0) + { + hre = 0; + } + } + } + else + { + hpxstr = nstr; + if (asym != 0) + { + sfac = -1.0f; + } + } + } + newdata[himg] += olddata[hpx] * hi[i] * sfac; + hpx += hpxstr; + } + himg += stride; + } + if (hspx == hp0) + { + if (hle2 != 0) + { + hspxstr = 0; + hle2 = 0; + } + else + { + hspxstr = pstr; + osfac = 1.0f; + } + } + hspx += hspxstr; + hstap = 1; + } + + + if (da_ev != 0) + { + if (lotap != 0) + { + lstap = 1; + } + else + { + lstap = 0; + } + } + else if (lotap != 0) + { + lstap = 2; + } + else + { + lstap = 1; + } + for (tap = 1; tap >= lstap; tap--) + { + lle = lle2; + lre = lre2; + lpx = lspx; + lpxstr = lspxstr; + + newdata[limg] = olddata[lpx] * lo[tap]; + for (i = tap + 2; i < lsz; i += 2) + { + if (lpx == lp0) + { + if (lle != 0) + { + lpxstr = 0; + lle = 0; + } + else + { + lpxstr = pstr; + } + } + if (lpx == lp1) + { + if (lre != 0) + { + lpxstr = 0; + lre = 0; + } + else + { + lpxstr = nstr; + } + } + lpx += lpxstr; + newdata[limg] += olddata[lpx] * lo[i]; + } + limg += stride; + } + + + if (da_ev != 0) + { + if (hotap != 0) + { + hstap = 1; + } + else + { + hstap = 0; + } + if (hsz == 2) + { + hspx -= hspxstr; + fhre = 1; + } + } + else if (hotap != 0) + { + hstap = 2; + } + else + { + hstap = 1; + } + + for (tap = 1; tap >= hstap; tap--) + { + hle = hle2; + hre = hre2; + hpx = hspx; + hpxstr = hspxstr; + sfac = osfac; + if (hsz != 2) + { + fhre = ofhre; + } + for (i = tap; i < hsz; i += 2) + { + if (hpx == hp0) + { + if (hle != 0) + { + hpxstr = 0; + hle = 0; + } + else + { + hpxstr = pstr; + sfac = 1.0f; + } + } + if (hpx == hp1) + { + if (hre != 0) + { + hpxstr = 0; + hre = 0; + if (asym != 0 && da_ev != 0) + { + hre = 1; + fhre--; + sfac = (float)fhre; + if (sfac == 0.0) + { + hre = 0; + } + } + } + else + { + hpxstr = nstr; + if (asym != 0) + sfac = -1.0f; + } + } + newdata[himg] += olddata[hpx] * hi[i] * sfac; + hpx += hpxstr; + } + himg += stride; + } + } + + if (fi_ev == 0) + { + for (i = 0; i < hsz; i++) + { + hi[i] *= -1.0F; + } + } + } + private void ReconstructWSQ(float[] fdata, int width, int height) + { + if (WSQData.tableDTT.lodef != 1) + { + throw new SystemException("ERROR: ReconstructWSQ : Lopass filter coefficients not defined"); + } + + if (WSQData.tableDTT.hidef != 1) + { + throw new SystemException("ERROR: ReconstructWSQ : Hipass filter coefficients not defined"); + } + + int numPix = width * height; + // Allocate temporary floating point pixmap + float[] fdataTemp = new float[numPix]; + + // Reconstruct floating point pixmap from wavelet subband buffer + for (int node = Internal.Constants.W_TREELEN - 1; node >= 0; node--) + { + int fdataBse = (WSQData.wtree[node].y * width) + WSQData.wtree[node].x; + JoinLets(fdataTemp, fdata, 0, fdataBse, WSQData.wtree[node].lenx, WSQData.wtree[node].leny, 1, width, WSQData.tableDTT.hifilt, WSQData.tableDTT.hisz, WSQData.tableDTT.lofilt, WSQData.tableDTT.losz, WSQData.wtree[node].invcl); + JoinLets(fdata, fdataTemp, fdataBse, 0, WSQData.wtree[node].leny, WSQData.wtree[node].lenx, width, 1, WSQData.tableDTT.hifilt, WSQData.tableDTT.hisz, WSQData.tableDTT.lofilt, WSQData.tableDTT.losz, WSQData.wtree[node].invrw); + } + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + IO.BinaryReader br = base.Stream.BinaryReader; + PictureObjectModel pic = (objectModel as PictureObjectModel); + if (pic == null) return; + + br.Endianness = IO.Endianness.BigEndian; + + // Initialize WSQ data structures + WSQData.Initialize(); + + // Read the SOI marker + ushort signature = br.ReadUInt16(); + if (signature != Internal.Constants.SOI_WSQ) throw new DataFormatException(Localization.StringTable.ErrorDataFormatInvalid); + + #region Supporting Tables + // Read in supporting tables up to the SOF marker + bool done = false; + do + { + signature = br.ReadUInt16(); + switch (signature) + { + case Internal.Constants.SOF_WSQ: + { + done = true; + break; + } + case Internal.Constants.DTT_WSQ: + { + ProcessTransformTable(br); + break; + } + case Internal.Constants.DQT_WSQ: + { + ProcessQuantizationTable(br); + break; + } + case Internal.Constants.DHT_WSQ: + { + ProcessHuffmanTable(br); + break; + } + case Internal.Constants.COM_WSQ: + { + ProcessComment(br); + break; + } + default: + { + throw new SystemException("ERROR: getCTableWSQ : Invalid table defined : " + signature.ToString()); + } + } + } + while ((signature != Internal.Constants.SOF_WSQ) || (!done)); + #endregion + #region Frame Header + // Read in the Frame Header + short hdrSize = br.ReadInt16(); /* header size */ + + byte black = br.ReadByte(); + byte white = br.ReadByte(); + short height = br.ReadInt16(); + short width = br.ReadInt16(); + byte hScale = br.ReadByte(); // exponent scaling parameter + short hShrtDat = br.ReadInt16(); // buffer pointer + float mShift = (float)hShrtDat; + while (hScale > 0) + { + mShift /= 10.0F; + hScale--; + } + + hScale = br.ReadByte(); + hShrtDat = br.ReadInt16(); + float rScale = (float)hShrtDat; + while (hScale > 0) + { + rScale /= 10.0F; + hScale--; + } + + byte wsqEncoder = br.ReadByte(); + short software = br.ReadInt16(); + + #endregion + + int ppi = -1; + #region WSQ Decomposition Trees + // Build a W-TREE structure for the image + BuildWTree(width, height); + BuildQTree(); + #endregion + + // Decode the Huffman encoded buffer blocks + int[] qdata = DecodeHuffmanTable(br, width * height); + + // Decode the quantize wavelet subband buffer + float[] fdata = Unquantize(qdata, width, height); + + // Done with quantized wavelet subband buffer + qdata = null; + + ReconstructWSQ(fdata, width, height); + + // Convert floating point pixels to unsigned char pixels + byte[] cdata = ImageToByteArray(fdata, width, height, mShift, rScale); + fdata = null; + + pic.Width = width; + pic.Height = height; + int pix = 0; + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + pic.SetPixel(System.Drawing.Color.FromArgb(cdata[pix], cdata[pix], cdata[pix]), j, i); + pix++; + } + } + } + + private void ProcessTable(IO.BinaryReader br, int marker) + { + switch (marker) + { + case Internal.Constants.DTT_WSQ: + { + ProcessTransformTable(br); + return; + } + case Internal.Constants.DQT_WSQ: + { + ProcessQuantizationTable(br); + return; + } + case Internal.Constants.DHT_WSQ: + { + ProcessHuffmanTable(br); + return; + } + case Internal.Constants.COM_WSQ: + { + ProcessComment(br); + return; + } + default: + { + throw new SystemException("ERROR: getCTableWSQ : Invalid table defined : " + marker); + } + } + } + private void ProcessComment(IO.BinaryReader br) + { + int size = br.ReadInt16() - 2; + string commentValue = br.ReadFixedLengthString(size); + } + private void ProcessHuffmanTable(IO.BinaryReader br) + { + // First time, read table length + HuffmanTable firstHuffmanTable = getCHuffmanTable(br, Internal.Constants.MAX_HUFFCOUNTS_WSQ, 0, true); + + // Store table into global structure list + int tableId = firstHuffmanTable.tableId; + WSQData.tableDHT[tableId].huffbits = (int[])firstHuffmanTable.huffbits.Clone(); + WSQData.tableDHT[tableId].huffvalues = (int[])firstHuffmanTable.huffvalues.Clone(); + WSQData.tableDHT[tableId].tabdef = 1; + + int bytesLeft = firstHuffmanTable.bytesLeft; + while (bytesLeft != 0) + { + // Read next table without reading table length + HuffmanTable huffmantable = getCHuffmanTable(br, Internal.Constants.MAX_HUFFCOUNTS_WSQ, bytesLeft, false); + + // If table is already defined ... + tableId = huffmantable.tableId; + if (WSQData.tableDHT[tableId].tabdef != 0) + { + throw new SystemException("ERROR : ProcessHuffmanTable : huffman table already defined."); + } + + /* Store table into global structure list. */ + WSQData.tableDHT[tableId].huffbits = (int[])huffmantable.huffbits.Clone(); + WSQData.tableDHT[tableId].huffvalues = (int[])huffmantable.huffvalues.Clone(); + WSQData.tableDHT[tableId].tabdef = 1; + bytesLeft = huffmantable.bytesLeft; + } + } + private void ProcessQuantizationTable(IO.BinaryReader br) + { + br.ReadInt16(); /* header size */ + int scale = br.ReadByte(); /* scaling parameter */ + int shrtDat = br.ReadInt16(); /* counter and temp short buffer */ + + WSQData.tableDQT.binCenter = (float)shrtDat; + while (scale > 0) + { + WSQData.tableDQT.binCenter /= 10.0F; + scale--; + } + + for (int cnt = 0; cnt < Table_DQT.MAX_SUBBANDS; cnt++) + { + scale = br.ReadByte(); + shrtDat = br.ReadInt16(); + WSQData.tableDQT.qBin[cnt] = (float)shrtDat; + while (scale > 0) + { + WSQData.tableDQT.qBin[cnt] /= 10.0F; + scale--; + } + + scale = br.ReadByte(); + shrtDat = br.ReadInt16(); + WSQData.tableDQT.zBin[cnt] = (float)shrtDat; + while (scale > 0) + { + WSQData.tableDQT.zBin[cnt] /= 10.0F; + scale--; + } + } + + WSQData.tableDQT.dqtDef = 1; + } + private void ProcessTransformTable(IO.BinaryReader br) + { + short temp = br.ReadInt16(); + + WSQData.tableDTT.hisz = br.ReadByte(); // has to be &'d with 0xFF? + WSQData.tableDTT.losz = br.ReadByte(); + + WSQData.tableDTT.hifilt = new float[WSQData.tableDTT.hisz]; + WSQData.tableDTT.lofilt = new float[WSQData.tableDTT.losz]; + + int aSize; + if (WSQData.tableDTT.hisz % 2 != 0) + { + aSize = (WSQData.tableDTT.hisz + 1) / 2; + } + else + { + aSize = WSQData.tableDTT.hisz / 2; + } + + float[] aLofilt = new float[aSize]; + + + aSize--; + for (int cnt = 0; cnt <= aSize; cnt++) + { + int sign = br.ReadByte(); + int scale = br.ReadByte(); + long shrtDat = br.ReadInt32(); + aLofilt[cnt] = (float)shrtDat; + + while (scale > 0) + { + aLofilt[cnt] /= 10.0F; + scale--; + } + + if (sign != 0) + { + aLofilt[cnt] *= -1.0F; + } + + if (WSQData.tableDTT.hisz % 2 != 0) + { + WSQData.tableDTT.hifilt[cnt + aSize] = intSign(cnt) * aLofilt[cnt]; + if (cnt > 0) + { + WSQData.tableDTT.hifilt[aSize - cnt] = WSQData.tableDTT.hifilt[cnt + aSize]; + } + } + else + { + WSQData.tableDTT.hifilt[cnt + aSize + 1] = intSign(cnt) * aLofilt[cnt]; + WSQData.tableDTT.hifilt[aSize - cnt] = -1 * WSQData.tableDTT.hifilt[cnt + aSize + 1]; + } + } + + if (WSQData.tableDTT.losz % 2 != 0) + { + aSize = (WSQData.tableDTT.losz + 1) / 2; + } + else + { + aSize = WSQData.tableDTT.losz / 2; + } + + float[] aHifilt = new float[aSize]; + + aSize--; + for (int cnt = 0; cnt <= aSize; cnt++) + { + int sign = br.ReadByte(); + int scale = br.ReadByte(); + long shrtDat = br.ReadInt32(); + + aHifilt[cnt] = (float)shrtDat; + + while (scale > 0) + { + aHifilt[cnt] /= 10.0F; + scale--; + } + + if (sign != 0) + { + aHifilt[cnt] *= -1.0F; + } + + if (WSQData.tableDTT.losz % 2 != 0) + { + WSQData.tableDTT.lofilt[cnt + aSize] = intSign(cnt) * aHifilt[cnt]; + if (cnt > 0) + { + WSQData.tableDTT.lofilt[aSize - cnt] = WSQData.tableDTT.lofilt[cnt + aSize]; + } + } + else + { + WSQData.tableDTT.lofilt[cnt + aSize + 1] = intSign(cnt + 1) * aHifilt[cnt]; + WSQData.tableDTT.lofilt[aSize - cnt] = WSQData.tableDTT.lofilt[cnt + aSize + 1]; + } + } + + WSQData.tableDTT.lodef = 1; + WSQData.tableDTT.hidef = 1; + } + + private void BuildWTree(short width, short height) + { + // starting lengths of sections of the image being split into subbands + int lenx, lenx2, leny, leny2; + WSQData.wtree = new WavletTree[Internal.Constants.W_TREELEN]; + for (int i = 0; i < Internal.Constants.W_TREELEN; i++) + { + WSQData.wtree[i] = new WavletTree(); + WSQData.wtree[i].invrw = 0; + WSQData.wtree[i].invcl = 0; + } + + WSQData.wtree[2].invrw = 1; + WSQData.wtree[4].invrw = 1; + WSQData.wtree[7].invrw = 1; + WSQData.wtree[9].invrw = 1; + WSQData.wtree[11].invrw = 1; + WSQData.wtree[13].invrw = 1; + WSQData.wtree[16].invrw = 1; + WSQData.wtree[18].invrw = 1; + WSQData.wtree[3].invcl = 1; + WSQData.wtree[5].invcl = 1; + WSQData.wtree[8].invcl = 1; + WSQData.wtree[9].invcl = 1; + WSQData.wtree[12].invcl = 1; + WSQData.wtree[13].invcl = 1; + WSQData.wtree[17].invcl = 1; + WSQData.wtree[18].invcl = 1; + + wtree4(0, 1, width, height, 0, 0, 1); + + if ((WSQData.wtree[1].lenx % 2) == 0) + { + lenx = WSQData.wtree[1].lenx / 2; + lenx2 = lenx; + } + else + { + lenx = (WSQData.wtree[1].lenx + 1) / 2; + lenx2 = lenx - 1; + } + + if ((WSQData.wtree[1].leny % 2) == 0) + { + leny = WSQData.wtree[1].leny / 2; + leny2 = leny; + } + else + { + leny = (WSQData.wtree[1].leny + 1) / 2; + leny2 = leny - 1; + } + + wtree4(4, 6, lenx2, leny, lenx, 0, 0); + wtree4(5, 10, lenx, leny2, 0, leny, 0); + wtree4(14, 15, lenx, leny, 0, 0, 0); + + WSQData.wtree[19].x = 0; + WSQData.wtree[19].y = 0; + if ((WSQData.wtree[15].lenx % 2) == 0) + { + WSQData.wtree[19].lenx = WSQData.wtree[15].lenx / 2; + } + else + { + WSQData.wtree[19].lenx = (WSQData.wtree[15].lenx + 1) / 2; + } + if ((WSQData.wtree[15].leny % 2) == 0) + { + WSQData.wtree[19].leny = WSQData.wtree[15].leny / 2; + } + else + { + WSQData.wtree[19].leny = (WSQData.wtree[15].leny + 1) / 2; + } + } + private void BuildQTree() + { + WSQData.qtree = new QuantTree[Internal.Constants.Q_TREELEN]; + for (int i = 0; i < WSQData.qtree.Length; i++) + { + WSQData.qtree[i] = new QuantTree(); + } + + qtree16(3, WSQData.wtree[14].lenx, WSQData.wtree[14].leny, WSQData.wtree[14].x, WSQData.wtree[14].y, 0, 0); + qtree16(19, WSQData.wtree[4].lenx, WSQData.wtree[4].leny, WSQData.wtree[4].x, WSQData.wtree[4].y, 0, 1); + qtree16(48, WSQData.wtree[0].lenx, WSQData.wtree[0].leny, WSQData.wtree[0].x, WSQData.wtree[0].y, 0, 0); + qtree16(35, WSQData.wtree[5].lenx, WSQData.wtree[5].leny, WSQData.wtree[5].x, WSQData.wtree[5].y, 1, 0); + qtree4(0, WSQData.wtree[19].lenx, WSQData.wtree[19].leny, WSQData.wtree[19].x, WSQData.wtree[19].y); + } + private int AssertNextMarker(IO.BinaryReader br, ushort ExpectedMarker) + { + ushort nextMarker = br.ReadUInt16(); + switch (ExpectedMarker) + { + case Internal.Constants.SOI_WSQ: + { + if (nextMarker != Internal.Constants.SOI_WSQ) + { + throw new SystemException("ERROR : AssertNextMarker : No SOI marker : " + nextMarker); + } + return nextMarker; + } + case Internal.Constants.TBLS_N_SOF: + { + if (nextMarker != Internal.Constants.DTT_WSQ + && nextMarker != Internal.Constants.DQT_WSQ + && nextMarker != Internal.Constants.DHT_WSQ + && nextMarker != Internal.Constants.SOB_WSQ + && nextMarker != Internal.Constants.COM_WSQ) + { + throw new SystemException("ERROR : AssertNextMarker : No SOB, Table, or comment markers : " + nextMarker); + } + return nextMarker; + } + case Internal.Constants.TBLS_N_SOB: + { + if (nextMarker != Internal.Constants.DTT_WSQ + && nextMarker != Internal.Constants.DQT_WSQ + && nextMarker != Internal.Constants.DHT_WSQ + && nextMarker != Internal.Constants.SOB_WSQ + && nextMarker != Internal.Constants.COM_WSQ) + { + throw new SystemException("ERROR : AssertNextMarker : No SOB, Table, or comment markers : " + + nextMarker); + } + return nextMarker; + } + case Internal.Constants.ANY_WSQ: + { + if ((nextMarker & 0xff00) != 0xff00) + { + throw new SystemException("ERROR : AssertNextMarker : no marker found : " + nextMarker); + } + if ((nextMarker < Internal.Constants.SOI_WSQ) || (nextMarker > Internal.Constants.COM_WSQ)) + { + throw new SystemException("ERROR : AssertNextMarker : not a valid marker : " + nextMarker); + } + return nextMarker; + } + } + throw new SystemException("ERROR : AssertNextMarker : Invalid marker : " + nextMarker); + } + + private int getCNextbitsWSQ(IO.BinaryReader br, ref int marker, ref int bitCount, int bitsReq, ref int nextByte) + { + if (bitCount == 0) + { + nextByte = br.ReadByte(); + + bitCount = 8; + if (nextByte == 0xFF) + { + int code2 = br.ReadByte(); // stuffed byte of buffer + + if (code2 != 0x00 && bitsReq == 1) + { + marker = (nextByte << 8) | code2; + return 1; + } + if (code2 != 0x00) + { + throw new SystemException("ERROR: getCNextbitsWSQ : No stuffed zeros."); + } + } + } + + int bits, tbits; // bits of current buffer byte requested + int bitsNeeded; // additional bits required to finish request + + if (bitsReq <= bitCount) + { + bits = (nextByte >> (bitCount - bitsReq)) & (Internal.Constants.BITMASK[bitsReq]); + bitCount -= bitsReq; + nextByte &= Internal.Constants.BITMASK[bitCount]; + } + else + { + bitsNeeded = bitsReq - bitCount; // additional bits required to finish request + bits = nextByte << bitsNeeded; + bitCount = 0; + tbits = getCNextbitsWSQ(br, ref marker, ref bitCount, bitsNeeded, ref nextByte); + bits |= tbits; + } + + return bits; + } + + private float[] Unquantize(int[] sip, int width, int height) + { + float[] fip = new float[width * height]; // floating point image + + if (WSQData.tableDQT.dqtDef != 1) + { + throw new SystemException("ERROR: unquantize : quantization table parameters not defined!"); + } + + float binCenter = WSQData.tableDQT.binCenter; // quantizer bin center + + int sptr = 0; + for (int cnt = 0; cnt < Internal.Constants.NUM_SUBBANDS; cnt++) + { + if (WSQData.tableDQT.qBin[cnt] == 0.0) + { + continue; + } + + int fptr = (WSQData.qtree[cnt].y * width) + WSQData.qtree[cnt].x; + + for (int row = 0; row < WSQData.qtree[cnt].leny; row++, fptr += width - WSQData.qtree[cnt].lenx) + { + for (int col = 0; col < WSQData.qtree[cnt].lenx; col++) + { + if (sip[sptr] == 0) + { + fip[fptr] = 0.0f; + } + else if (sip[sptr] > 0) + { + fip[fptr] = (WSQData.tableDQT.qBin[cnt] * (sip[sptr] - binCenter)) + (WSQData.tableDQT.zBin[cnt] / 2.0f); + } + else if (sip[sptr] < 0) + { + fip[fptr] = (WSQData.tableDQT.qBin[cnt] * (sip[sptr] + binCenter)) - (WSQData.tableDQT.zBin[cnt] / 2.0f); + } + else + { + throw new SystemException("ERROR : unquantize : invalid quantization pixel value"); + } + fptr++; + sptr++; + } + } + } + + return fip; + } + + #region Huffman Table + private void BuildHuffmanCodes(HuffCode[] huffcodeTable) + { + short tempCode = 0; /*used to construct code word*/ + int pointer = 0; /*pointer to code word information*/ + + int tempSize = huffcodeTable[0].size; + if (huffcodeTable[pointer].size == 0) + { + return; + } + + do + { + do + { + huffcodeTable[pointer].code = tempCode; + tempCode++; + pointer++; + } + while (huffcodeTable[pointer].size == tempSize); + + if (huffcodeTable[pointer].size == 0) return; + + do + { + tempCode <<= 1; + tempSize++; + } + while (huffcodeTable[pointer].size != tempSize); + } + while (huffcodeTable[pointer].size == tempSize); + } + private void GenerateHuffmanDecodeTable(HuffCode[] huffcodeTable, int[] maxcode, int[] mincode, int[] valptr, int[] huffbits) + { + for (int i = 0; i <= Internal.Constants.MAX_HUFFBITS; i++) + { + maxcode[i] = 0; + mincode[i] = 0; + valptr[i] = 0; + } + + int i2 = 0; + for (int i = 1; i <= Internal.Constants.MAX_HUFFBITS; i++) + { + if (huffbits[i - 1] == 0) + { + maxcode[i] = -1; + continue; + } + valptr[i] = i2; + mincode[i] = huffcodeTable[i2].code; + i2 = i2 + huffbits[i - 1] - 1; + maxcode[i] = huffcodeTable[i2].code; + i2++; + } + } + + private int DecodeHuffmanDataMemory(IO.BinaryReader br, int[] mincode, int[] maxcode, int[] valptr, int[] huffvalues, ref int bitCount, ref int marker, ref int nextByte) + { + short code = (short)getCNextbitsWSQ(br, ref marker, ref bitCount, 1, ref nextByte); // becomes a huffman code word (one bit at a time) + if (marker != 0) return -1; + + int inx; + + for (inx = 1; code > maxcode[inx]; inx++) + { + int tbits = getCNextbitsWSQ(br, ref marker, ref bitCount, 1, ref nextByte); // becomes a huffman code word (one bit at a time) + code = (short)((code << 1) + tbits); + + if (marker != 0) return -1; + } + + int inx2 = valptr[inx] + code - mincode[inx]; /*increment variables*/ + return huffvalues[inx2]; + } + private HuffCode[] BuildHuffmanSizes(int[] huffbits, int maxHuffcounts) + { + HuffCode[] huffcodeTable; // table of huffman codes and sizes + int numberOfCodes = 1; // the number codes for a given code size + + huffcodeTable = new HuffCode[maxHuffcounts + 1]; + + int tempSize = 0; + for (int codeSize = 1; codeSize <= Internal.Constants.MAX_HUFFBITS; codeSize++) + { + while (numberOfCodes <= huffbits[codeSize - 1]) + { + huffcodeTable[tempSize] = new HuffCode(); + huffcodeTable[tempSize].size = codeSize; + tempSize++; + numberOfCodes++; + } + numberOfCodes = 1; + } + + huffcodeTable[tempSize] = new HuffCode(); + huffcodeTable[tempSize].size = 0; + + return huffcodeTable; + } + private int[] DecodeHuffmanTable(IO.BinaryReader br, int size) + { + int[] qdata = new int[size]; + + int[] maxcode = new int[Internal.Constants.MAX_HUFFBITS + 1]; + int[] mincode = new int[Internal.Constants.MAX_HUFFBITS + 1]; + int[] valptr = new int[Internal.Constants.MAX_HUFFBITS + 1]; + + int marker = AssertNextMarker(br, Internal.Constants.TBLS_N_SOB); + + int bitCount = 0; // bit count for getc_nextbits_wsq routine + int nextByte = 0; // next byte of buffer + int hufftableId = 0; // huffman table number + int ip = 0; + + while (marker != Internal.Constants.EOI_WSQ) + { + if (marker != 0) + { + while (marker != Internal.Constants.SOB_WSQ) + { + ProcessTable(br, marker); + marker = AssertNextMarker(br, Internal.Constants.TBLS_N_SOB); + } + + short u0 = br.ReadInt16(); // block header size + hufftableId = br.ReadByte(); // huffman table number + + if (WSQData.tableDHT[hufftableId].tabdef != 1) + { + throw new SystemException("ERROR : huffmanDecodeDataMem : huffman table undefined."); + } + + // the next two routines reconstruct the huffman tables + HuffCode[] hufftable = BuildHuffmanSizes(WSQData.tableDHT[hufftableId].huffbits, Internal.Constants.MAX_HUFFCOUNTS_WSQ); + BuildHuffmanCodes(hufftable); + + // build a set of three tables used in decoding the compressed buffer + GenerateHuffmanDecodeTable(hufftable, maxcode, mincode, valptr, WSQData.tableDHT[hufftableId].huffbits); + + bitCount = 0; + marker = 0; + } + + // get next huffman category code from compressed input buffer stream + int nodeptr = DecodeHuffmanDataMemory(br, mincode, maxcode, valptr, WSQData.tableDHT[hufftableId].huffvalues, ref bitCount, ref marker, ref nextByte); + // nodeptr pointers for decoding + + if (nodeptr == -1) + { + continue; + } + + if (nodeptr > 0 && nodeptr <= 100) + { + for (int n = 0; n < nodeptr; n++) + { + qdata[ip++] = 0; /* z run */ + } + } + else if (nodeptr > 106 && nodeptr < 0xff) + { + qdata[ip++] = nodeptr - 180; + } + else if (nodeptr == 101) + { + qdata[ip++] = getCNextbitsWSQ(br, ref marker, ref bitCount, 8, ref nextByte); + + } + else if (nodeptr == 102) + { + qdata[ip++] = -getCNextbitsWSQ(br, ref marker, ref bitCount, 8, ref nextByte); + } + else if (nodeptr == 103) + { + qdata[ip++] = getCNextbitsWSQ(br, ref marker, ref bitCount, 16, ref nextByte); + } + else if (nodeptr == 104) + { + qdata[ip++] = -getCNextbitsWSQ(br, ref marker, ref bitCount, 16, ref nextByte); + } + else if (nodeptr == 105) + { + int n = getCNextbitsWSQ(br, ref marker, ref bitCount, 8, ref nextByte); + while (n-- > 0) + { + qdata[ip++] = 0; + } + } + else if (nodeptr == 106) + { + int n = getCNextbitsWSQ(br, ref marker, ref bitCount, 16, ref nextByte); + while (n-- > 0) + { + qdata[ip++] = 0; + } + } + else + { + throw new SystemException("ERROR: huffman_decode_data_mem : Invalid code (" + nodeptr + ")"); + } + } + + return qdata; + } + #endregion + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/ASXDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/ASXDataFormat.cs new file mode 100644 index 00000000..0bf58922 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/ASXDataFormat.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class ASXDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + + dfr.Filters.Add("Advanced Stream Redirector", new string[] { "*.asx" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.Add("video/x-ms-asf"); + return dfr; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement tagASX = mom.Elements["asx"] as MarkupTagElement; + if (tagASX != null) + { + foreach (MarkupElement el in tagASX.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + string name2 = tag.Name; + if (name2 != null) + { + if (!(name2 == "title")) + { + if (!(name2 == "author")) + { + if (!(name2 == "abstract")) + { + if (!(name2 == "copyright")) + { + if (!(name2 == "param")) + { + if (name2 == "entry") + { + PlaylistEntry entry = new PlaylistEntry(); + foreach (MarkupElement entryEl in tag.Elements) + { + MarkupTagElement tagEl = entryEl as MarkupTagElement; + if (tagEl != null) + { + name2 = tagEl.Name; + if (name2 != null) + { + if (!(name2 == "title")) + { + if (!(name2 == "author")) + { + if (!(name2 == "abstract")) + { + if (!(name2 == "copyright")) + { + if (!(name2 == "ref")) + { + if (name2 == "param") + { + if (tagEl.Attributes["name"] != null) + { + string name = tagEl.Attributes["name"].Value; + string value = string.Empty; + if (tagEl.Attributes["value"] != null) + { + value = tagEl.Attributes["value"].Value; + } + entry.CustomInformation.Add(name, value); + } + } + } + else + { + if (tagEl.Attributes["href"] != null) + { + entry.FileName = tagEl.Attributes["href"].Value; + } + } + } + else + { + entry.Copyright = tagEl.Value; + } + } + else + { + entry.Abstract = tagEl.Value; + } + } + else + { + entry.Author = tagEl.Value; + } + } + else + { + entry.Title = tagEl.Value; + } + } + } + } + pom.Entries.Add(entry); + } + } + else + { + if (tag.Attributes["name"] != null) + { + string name = tag.Attributes["name"].Value; + string value = string.Empty; + if (tag.Attributes["value"] != null) + { + value = tag.Attributes["value"].Value; + } + pom.CustomInformation.Add(name, value); + } + } + } + else + { + pom.Copyright = tag.Value; + } + } + else + { + pom.Abstract = tag.Value; + } + } + else + { + pom.Author = tag.Value; + } + } + else + { + pom.Title = tag.Value; + } + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + if (pom != null) + { + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupTagElement tagASX = new MarkupTagElement(); + tagASX.Name = "asx"; + tagASX.Attributes.Add("version", "3.0"); + tagASX.Attributes.Add("previewmode", "No"); + if (!string.IsNullOrEmpty(pom.Abstract)) + { + MarkupTagElement tagAbstract = new MarkupTagElement(); + tagAbstract.Name = "abstract"; + tagAbstract.Value = pom.Abstract; + tagASX.Elements.Add(tagAbstract); + } + if (!string.IsNullOrEmpty(pom.Title)) + { + MarkupTagElement tagTitle = new MarkupTagElement(); + tagTitle.Name = "title"; + tagTitle.Value = pom.Title; + tagASX.Elements.Add(tagTitle); + } + if (!string.IsNullOrEmpty(pom.Author)) + { + MarkupTagElement tagAuthor = new MarkupTagElement(); + tagAuthor.Name = "author"; + tagAuthor.Value = pom.Author; + tagASX.Elements.Add(tagAuthor); + } + if (!string.IsNullOrEmpty(pom.Copyright)) + { + MarkupTagElement tagCopyright = new MarkupTagElement(); + tagCopyright.Name = "copyright"; + tagCopyright.Value = pom.Copyright; + tagASX.Elements.Add(tagCopyright); + } + foreach (PlaylistEntry entry in pom.Entries) + { + MarkupTagElement tagEntry = new MarkupTagElement(); + tagEntry.Name = "entry"; + if (!string.IsNullOrEmpty(entry.FileName)) + { + MarkupTagElement tagRef = new MarkupTagElement(); + tagRef.Name = "ref"; + tagRef.Attributes.Add("href", entry.FileName); + tagEntry.Elements.Add(tagRef); + } + if (!string.IsNullOrEmpty(entry.Abstract)) + { + MarkupTagElement tagAbstract = new MarkupTagElement(); + tagAbstract.Name = "abstract"; + tagAbstract.Value = entry.Abstract; + tagEntry.Elements.Add(tagAbstract); + } + if (!string.IsNullOrEmpty(entry.Title)) + { + MarkupTagElement tagTitle = new MarkupTagElement(); + tagTitle.Name = "title"; + tagTitle.Value = entry.Title; + tagEntry.Elements.Add(tagTitle); + } + if (!string.IsNullOrEmpty(entry.Author)) + { + MarkupTagElement tagAuthor = new MarkupTagElement(); + tagAuthor.Name = "author"; + tagAuthor.Value = entry.Author; + tagEntry.Elements.Add(tagAuthor); + } + if (!string.IsNullOrEmpty(entry.Copyright)) + { + MarkupTagElement tagCopyright = new MarkupTagElement(); + tagCopyright.Name = "copyright"; + tagCopyright.Value = entry.Copyright; + tagEntry.Elements.Add(tagCopyright); + } + tagASX.Elements.Add(tagEntry); + } + mom.Elements.Add(tagASX); + objectModels.Push(mom); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/CDDA/CDDADataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/CDDA/CDDADataFormat.cs new file mode 100644 index 00000000..49f5e676 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/CDDA/CDDADataFormat.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UniversalEditor.DataFormats.Chunked; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.Chunked; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist.CDDA +{ + public class CDDADataFormat : RIFFDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + + dfr.Filters.Add("Compact Disc Digital Audio", new byte?[][] { new byte?[] { new byte?(82), new byte?(73), new byte?(70), new byte?(70), null, null, null, null, new byte?(67), new byte?(68), new byte?(68), new byte?(65) } }, new string[] { "*.cda" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + ChunkedObjectModel rom = new ChunkedObjectModel(); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + RIFFDataChunk fmtChunk = new RIFFDataChunk(); + fmtChunk.ID = "fmt "; + MemoryStream ms = new MemoryStream(); + UniversalEditor.IO.BinaryWriter bw = new UniversalEditor.IO.BinaryWriter(ms); + ushort CDAFileVersion = 1; + ushort CDATrackNumber = 1; + uint CDADiscSerialNumber = 0u; + uint CDATrackStartHSG = 0u; + uint CDATrackLengthHSG = 0u; + byte CDATrackStartRBFFrame = 0; + byte CDATrackStartRBFSecond = 0; + byte CDATrackStartRBFMinute = 0; + byte CDATrackStartRBFUnused = 0; + byte CDATrackLengthRBFFrame = 0; + byte CDATrackLengthRBFSecond = 0; + byte CDATrackLengthRBFMinute = 0; + byte CDATrackLengthRBFUnused = 0; + if (pom.Entries.Count > 0) + { + PlaylistEntry entry = pom.Entries[0]; + } + bw.Write(CDAFileVersion); + bw.Write(CDATrackNumber); + bw.Write(CDADiscSerialNumber); + bw.Write(CDATrackStartHSG); + bw.Write(CDATrackLengthHSG); + bw.Write(new byte[] + { + CDATrackStartRBFFrame, + CDATrackStartRBFSecond, + CDATrackStartRBFMinute, + CDATrackStartRBFUnused + }); + bw.Write(new byte[] + { + CDATrackLengthRBFFrame, + CDATrackLengthRBFSecond, + CDATrackLengthRBFMinute, + CDATrackLengthRBFUnused + }); + ms.Flush(); + fmtChunk.Data = ms.ToArray(); + rom.Chunks.Add(fmtChunk); + objectModels.Push(rom); + } + protected override void BeforeLoadInternal(Stack objectModels) + { + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + ChunkedObjectModel rom = objectModels.Pop() as ChunkedObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + RIFFDataChunk fmtChunk = (rom.Chunks["fmt "] as RIFFDataChunk); + UniversalEditor.IO.BinaryReader br = new UniversalEditor.IO.BinaryReader(fmtChunk.Data); + ushort CDAFileVersion = br.ReadUInt16(); + ushort CDATrackNumber = br.ReadUInt16(); + uint CDADiscSerialNumber = br.ReadUInt32(); + uint CDATrackStartHSG = br.ReadUInt32(); + uint CDATrackLengthHSG = br.ReadUInt32(); + byte CDATrackStartRBFFrame = br.ReadByte(); + byte CDATrackStartRBFSecond = br.ReadByte(); + byte CDATrackStartRBFMinute = br.ReadByte(); + byte CDATrackStartRBFUnused = br.ReadByte(); + byte CDATrackLengthRBFFrame = br.ReadByte(); + byte CDATrackLengthRBFSecond = br.ReadByte(); + byte CDATrackLengthRBFMinute = br.ReadByte(); + byte CDATrackLengthRBFUnused = br.ReadByte(); + PlaylistEntry entry = new PlaylistEntry(); + entry.Title = "Track" + CDATrackNumber.ToString().PadLeft(2, '0'); + entry.Length = (long)((ulong)CDATrackLengthHSG); + entry.Offset = (long)((ulong)CDATrackStartHSG); + pom.Entries.Add(entry); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/HTMLPlaylistDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/HTMLPlaylistDataFormat.cs new file mode 100644 index 00000000..c791d13e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/HTMLPlaylistDataFormat.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class HTMLPlaylistDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + + dfr.Filters.Add("HTML playlist", new byte?[][] { new byte?[] { new byte?(60), new byte?(63), new byte?(120), new byte?(109), new byte?(108) } }, new string[] { "*.html" }); + dfr.Filters[0].HintComparison = DataFormatHintComparison.Inquire; + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + + public override bool IsBootstrappable(ObjectModel omb) + { + MarkupObjectModel mom = omb as MarkupObjectModel; + return mom.Elements.Count == 1 && mom.Elements[0].FullName == "html"; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/M3UDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/M3UDataFormat.cs new file mode 100644 index 00000000..cd06dce9 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/M3UDataFormat.cs @@ -0,0 +1,105 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class M3UDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("M3U playlist", new byte?[][] { new byte?[] { new byte?(35), new byte?(69), new byte?(88), new byte?(84), new byte?(77), new byte?(51), new byte?(85) } }, new string[] { "*.m3u", "*.m3u8" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + TextReader tr = base.Stream.TextReader; + if (tr.EndOfStream || tr.ReadLine() != "#EXTM3U") + { + throw new DataFormatException("File does not begin with #EXTM3U"); + } + PlaylistObjectModel objm = objectModel as PlaylistObjectModel; + PlaylistEntry nextEntry = null; + while (!tr.EndOfStream) + { + string line = tr.ReadLine(); + if (!string.IsNullOrEmpty(line)) + { + if (line.StartsWith("#")) + { + if (nextEntry == null) + { + nextEntry = new PlaylistEntry(); + } + string[] tagNameAndValue = line.Split(new char[] + { + ':' + }, 2, StringSplitOptions.None); + string tagName = tagNameAndValue[0]; + string tagValue = string.Empty; + if (tagNameAndValue.Length > 1) + { + tagValue = tagNameAndValue[1]; + } + string[] tagPropTypeAndValue = tagValue.Split(new char[] + { + ',' + }, 2, StringSplitOptions.None); + string tagPropType = tagPropTypeAndValue[0]; + string tagPropValue = string.Empty; + if (tagPropTypeAndValue.Length > 1) + { + tagPropValue = tagPropTypeAndValue[1]; + } + string text = tagName; + if (text != null) + { + if (text == "EXTINF") + { + text = tagPropType; + if (text != null) + { + if (text == "189") + { + nextEntry.Title = tagPropValue; + } + } + } + } + } + else + { + if (nextEntry == null) + { + nextEntry = new PlaylistEntry(); + } + nextEntry.FileName = line; + objm.Entries.Add(nextEntry); + nextEntry = null; + } + } + } + if (nextEntry != null) + { + objm.Entries.Add(nextEntry); + nextEntry = null; + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + TextWriter tw = base.Stream.TextWriter; + tw.WriteLine("#EXTM3U"); + PlaylistObjectModel objm = (objectModel as PlaylistObjectModel); + foreach (PlaylistEntry entry in objm.Entries) + { + if (!string.IsNullOrEmpty(entry.Title)) + { + tw.WriteLine("#EXTINF:189," + entry.Title); + } + tw.WriteLine(entry.FileName); + } + tw.Flush(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/NotepadPlusPlaylistDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/NotepadPlusPlaylistDataFormat.cs new file mode 100644 index 00000000..1203be0c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/NotepadPlusPlaylistDataFormat.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class NotepadPlusPlaylistDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Notepad++ session", new byte?[][] { new byte?[] { new byte?(60), new byte?(63), new byte?(120), new byte?(109), new byte?(108) } }, new string[] { "session.xml" }); + dfr.Filters[0].HintComparison = DataFormatHintComparison.Inquire; + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + public override bool IsBootstrappable(ObjectModel omb) + { + MarkupObjectModel mom = omb as MarkupObjectModel; + return mom.Elements.Count > 0 && mom.Elements[0].FullName == "NotepadPlus"; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement tagMainView = mom.FindElement("NotepadPlus", "Session", "mainView") as MarkupTagElement; + if (tagMainView != null) + { + foreach (MarkupElement el in tagMainView.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + if (tag.Name == "File") + { + if (tag.Attributes["filename"] != null) + { + string fileName = tag.Attributes["filename"].Value; + PlaylistEntry entry = new PlaylistEntry(); + entry.FileName = fileName; + pom.Entries.Add(entry); + } + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupTagElement tagNotepadPlus = new MarkupTagElement(); + tagNotepadPlus.Name = "NotepadPlus"; + MarkupTagElement tagSession = new MarkupTagElement(); + tagSession.Name = "Session"; + tagSession.Attributes.Add("activeView", "0"); + MarkupTagElement tagMainView = new MarkupTagElement(); + tagMainView.Name = "mainView"; + tagMainView.Attributes.Add("activeIndex", "0"); + foreach (PlaylistEntry entry in pom.Entries) + { + MarkupTagElement tagFile = new MarkupTagElement(); + tagFile.Name = "File"; + tagFile.Attributes.Add("firstVisibleLine", "4"); + tagFile.Attributes.Add("xOffset", "0"); + tagFile.Attributes.Add("scrollWidth", "886935"); + tagFile.Attributes.Add("startPos", "440"); + tagFile.Attributes.Add("endPos", "440"); + tagFile.Attributes.Add("selMode", "0"); + tagFile.Attributes.Add("lang", "Normal Text"); + tagFile.Attributes.Add("encoding", "-1"); + tagFile.Attributes.Add("filename", entry.FileName); + tagMainView.Elements.Add(tagFile); + } + tagSession.Elements.Add(tagMainView); + MarkupTagElement tagSubView = new MarkupTagElement(); + tagSubView.Name = "subView"; + tagSubView.Attributes.Add("activeIndex", "0"); + tagSession.Elements.Add(tagSubView); + tagNotepadPlus.Elements.Add(tagSession); + mom.Elements.Add(tagNotepadPlus); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/PLSDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/PLSDataFormat.cs new file mode 100644 index 00000000..1a3ed9f6 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/PLSDataFormat.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.PropertyList; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.PropertyList; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class PLSDataFormat : WindowsConfigurationDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("PLS playlist", new byte?[][] { new byte?[] { new byte?(91), new byte?(112), new byte?(108), new byte?(97), new byte?(121), new byte?(108), new byte?(105), new byte?(115), new byte?(116), new byte?(93) } }, new string[] { "*.pls" }); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.Add("audio/x-scpls"); + return dfr; + } + + private int mvarVersion = 2; + public int Version { get { return mvarVersion; } set { mvarVersion = value; } } + + + public PLSDataFormat() + { + base.PropertyValuePrefix = String.Empty; + base.PropertyValueSuffix = String.Empty; + } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + PropertyListObjectModel plom = objectModels.Pop() as PropertyListObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + if (plom.Groups["playlist"] != null && plom.Groups["playlist"].Properties["NumberOfEntries"] != null) + { + if (plom.Groups["playlist"].Properties["Version"] == null) + { + this.mvarVersion = int.Parse(plom.Groups["playlist"].Properties["Version"].Value.ToString()); + } + int numberOfEntries = int.Parse(plom.Groups["playlist"].Properties["NumberOfEntries"].Value.ToString()); + for (int i = 1; i <= numberOfEntries; i++) + { + if (plom.Groups["playlist"].Properties["File" + i.ToString()] != null) + { + string FileName = plom.Groups["playlist"].Properties["File" + i.ToString()].Value.ToString(); + PlaylistEntry entry = new PlaylistEntry(); + entry.FileName = FileName; + if (plom.Groups["playlist"].Properties["Title" + i.ToString()] != null) + { + entry.Title = plom.Groups["playlist"].Properties["Title" + i.ToString()].Value.ToString(); + } + if (plom.Groups["playlist"].Properties["Length" + i.ToString()] != null) + { + entry.Length = long.Parse(plom.Groups["playlist"].Properties["Length" + i.ToString()].Value.ToString()); + } + pom.Entries.Add(entry); + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + PropertyListObjectModel plom = new PropertyListObjectModel(); + Group grpPlaylist = new Group(); + grpPlaylist.Name = "playlist"; + grpPlaylist.Properties.Add("NumberOfEntries", pom.Entries.Count); + grpPlaylist.Properties.Add("Version", mvarVersion); + foreach (PlaylistEntry entry in pom.Entries) + { + int i = pom.Entries.IndexOf(entry) + 1; + grpPlaylist.Properties.Add("File" + i.ToString(), entry.FileName); + if (!String.IsNullOrEmpty(entry.Title)) + { + grpPlaylist.Properties.Add("Title" + i.ToString(), entry.Title); + } + grpPlaylist.Properties.Add("Length" + i.ToString(), entry.Length); + } + plom.Groups.Add(grpPlaylist); + objectModels.Push(plom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/SMILDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/SMILDataFormat.cs new file mode 100644 index 00000000..3500c17b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/SMILDataFormat.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class SMILDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("SMIL playlist", new byte?[][] { new byte?[] { new byte?(60), new byte?(63), new byte?(119), new byte?(112), new byte?(108) }, new byte?[] { new byte?(60), new byte?(63), new byte?(122), new byte?(112), new byte?(108) }, new byte?[] { new byte?(60), new byte?(63), new byte?(120), new byte?(109), new byte?(108) } }, new string[] { "*.wpl", "*.zpl", "*.smil" }); + dfr.Filters[0].HintComparison = DataFormatHintComparison.Inquire; + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + dfr.ContentTypes.AddRange("application/smil+xml", "application/vnd.ms-wpl"); + return dfr; + } + public override bool IsBootstrappable(ObjectModel omb) + { + MarkupObjectModel mom = omb as MarkupObjectModel; + return mom.Elements.Count > 0 && mom.Elements[0].FullName == "smil"; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement head = (mom.FindElement("smil", "head") as MarkupTagElement); + if (head != null) + { + foreach (MarkupElement headEl in head.Elements) + { + if (headEl is MarkupTagElement) + { + MarkupTagElement tagEl = headEl as MarkupTagElement; + string name2 = tagEl.Name; + if (name2 != null) + { + if (!(name2 == "meta")) + { + if (!(name2 == "author")) + { + if (name2 == "title") + { + pom.Title = tagEl.Value; + } + } + else + { + pom.Author = tagEl.Value; + } + } + else + { + if (tagEl.Attributes["name"] != null) + { + string name = tagEl.Attributes["name"].Value; + string value = string.Empty; + if (tagEl.Attributes["content"] != null) + { + value = tagEl.Attributes["content"].Value; + } + pom.CustomInformation.Add(name, value); + } + } + } + } + } + } + MarkupTagElement seq = (mom.FindElement("smil", "body", "seq") as MarkupTagElement); + if (seq != null) + { + foreach (MarkupElement el in seq.Elements) + { + if (el is MarkupTagElement) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag.Name == "media" && tag.Attributes["src"] != null) + { + PlaylistEntry entry = new PlaylistEntry(); + entry.FileName = tag.Attributes["src"].Value; + if (tag.Attributes["albumTitle"] != null) + { + entry.Album.Title = tag.Attributes["albumTitle"].Value; + } + if (tag.Attributes["albumArtist"] != null) + { + entry.Album.Artist = tag.Attributes["albumArtist"].Value; + } + if (tag.Attributes["trackTitle"] != null) + { + entry.Title = tag.Attributes["trackTitle"].Value; + } + if (tag.Attributes["trackArtist"] != null) + { + entry.Author = tag.Attributes["trackArtist"].Value; + } + if (tag.Attributes["duration"] != null) + { + entry.Length = long.Parse(tag.Attributes["duration"].Value); + } + else + { + entry.Length = -1L; + } + pom.Entries.Add(entry); + } + } + } + } + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupObjectModel mom = new MarkupObjectModel(); + MarkupTagElement smil = new MarkupTagElement(); + smil.Name = "smil"; + MarkupTagElement head = new MarkupTagElement(); + head.Name = "head"; + MarkupTagElement guid = new MarkupTagElement(); + guid.Name = "guid"; + guid.Value = "{" + pom.ID.ToString().ToUpper() + "}"; + head.Elements.Add(guid); + if (!string.IsNullOrEmpty(pom.Title)) + { + MarkupTagElement tagPlaylistTitle = new MarkupTagElement(); + tagPlaylistTitle.Name = "title"; + tagPlaylistTitle.Value = pom.Title; + head.Elements.Add(tagPlaylistTitle); + } + if (!string.IsNullOrEmpty(pom.Author)) + { + MarkupTagElement tagPlaylistAuthor = new MarkupTagElement(); + tagPlaylistAuthor.Name = "author"; + tagPlaylistAuthor.Value = pom.Author; + head.Elements.Add(tagPlaylistAuthor); + } + foreach (KeyValuePair kvp in pom.CustomInformation) + { + MarkupTagElement tagMeta = new MarkupTagElement(); + tagMeta.Name = "meta"; + tagMeta.Attributes.Add("name", kvp.Key); + tagMeta.Attributes.Add("content", kvp.Value); + head.Elements.Add(tagMeta); + } + smil.Elements.Add(head); + MarkupTagElement body = new MarkupTagElement(); + body.Name = "body"; + MarkupTagElement seq = new MarkupTagElement(); + seq.Name = "seq"; + foreach (PlaylistEntry entry in pom.Entries) + { + MarkupTagElement media = new MarkupTagElement(); + media.Name = "media"; + media.Attributes.Add("src", entry.FileName); + if (!string.IsNullOrEmpty(entry.Album.Title)) + { + media.Attributes.Add("albumTitle", entry.Album.Title); + } + if (!string.IsNullOrEmpty(entry.Album.Artist)) + { + media.Attributes.Add("albumArtist", entry.Album.Artist); + } + if (!string.IsNullOrEmpty(entry.Title)) + { + media.Attributes.Add("trackTitle", entry.Title); + } + if (!string.IsNullOrEmpty(entry.Author)) + { + media.Attributes.Add("trackArtist", entry.Author); + } + if (entry.Length > -1L) + { + media.Attributes.Add("duration", entry.Length.ToString()); + } + seq.Elements.Add(media); + } + body.Elements.Add(seq); + smil.Elements.Add(body); + mom.Elements.Add(smil); + objectModels.Push(mom); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/XSPFDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/XSPFDataFormat.cs new file mode 100644 index 00000000..08e8d5cd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Playlist/XSPFDataFormat.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.Common; +using UniversalEditor.DataFormats.Markup.XML; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Playlist; +using UniversalEditor.ObjectModels.Markup; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Playlist +{ + public class XSPFDataFormat : XMLDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("XML Sharable Playlist File", new string[] { "*.xspf" }); + dfr.Filters[0].HintComparison = DataFormatHintComparison.Inquire; + dfr.Capabilities.Add(typeof(MarkupObjectModel), DataFormatCapabilities.Bootstrap); + dfr.Capabilities.Add(typeof(PlaylistObjectModel), DataFormatCapabilities.All); + return dfr; + } + public override bool IsBootstrappable(ObjectModel omb) + { + MarkupObjectModel mom = omb as MarkupObjectModel; + return ((mom != null) && ((mom.Elements.Count > 0) && (mom.Elements[0].Name == "playlist"))); + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new MarkupObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + MarkupObjectModel mom = objectModels.Pop() as MarkupObjectModel; + PlaylistObjectModel pom = objectModels.Pop() as PlaylistObjectModel; + MarkupTagElement tagPlaylist = mom.FindElement("playlist") as MarkupTagElement; + if (tagPlaylist != null) + { + if (tagPlaylist.Elements["title"] != null) + { + pom.Title = tagPlaylist.Elements["title"].Value; + } + MarkupTagElement tagTrackList = tagPlaylist.Elements["trackList"] as MarkupTagElement; + if (tagTrackList != null) + { + foreach (MarkupElement el in tagTrackList.Elements) + { + MarkupTagElement tag = el as MarkupTagElement; + if (tag != null) + { + if (tag.Name == "track") + { + PlaylistEntry entry = new PlaylistEntry(); + if (tag.Elements["location"] != null) + { + string fileName = tag.Elements["location"].Value; + if (fileName.StartsWith("file://")) + { + fileName = fileName.Substring(8); + fileName = fileName.UrlDecode(); + if (fileName.Length > 1 && fileName[1] == ':') + { + fileName = fileName.Replace('/', System.IO.Path.DirectorySeparatorChar); + } + else + { + fileName = "/" + fileName; + } + } + if (fileName.StartsWith("//")) + { + fileName = fileName.Substring(1); + } + entry.FileName = fileName; + } + if (tag.Elements["title"] != null) + { + entry.Title = tag.Elements["title"].Value; + } + if (tag.Elements["creator"] != null) + { + entry.Author = tag.Elements["creator"].Value; + } + if (tag.Elements["album"] != null) + { + entry.Album.Title = tag.Elements["album"].Value; + } + if (tag.Elements["trackNum"] != null) + { + entry.TrackNumber = int.Parse(tag.Elements["trackNum"].Value); + } + if (tag.Elements["image"] != null) + { + entry.AlbumArtImageURL = tag.Elements["image"].Value; + } + if (tag.Elements["duration"] != null) + { + entry.Length = long.Parse(tag.Elements["duration"].Value); + } + pom.Entries.Add(entry); + } + } + } + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/AVI/AVIDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/AVI/AVIDataFormat.cs new file mode 100644 index 00000000..783a000e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/AVI/AVIDataFormat.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.DataFormats.Chunked; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Video; +using UniversalEditor.ObjectModels.Chunked; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.AVI +{ + public class AVIDataFormat : RIFFDataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Clear(); + dfr.Filters.Add("Audio/Video Interleaved", new string[] { "*.avi" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new ChunkedObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + ChunkedObjectModel riff = objectModels.Pop() as ChunkedObjectModel; + VideoObjectModel video = objectModels.Pop() as VideoObjectModel; + + RIFFChunk aviChunk = riff.Chunks["AVI "]; + + if (aviChunk == null) throw new DataFormatException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Bink/BinkDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Bink/BinkDataFormat.cs new file mode 100644 index 00000000..c153f025 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Bink/BinkDataFormat.cs @@ -0,0 +1,101 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Video; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.RAD.Bink +{ + public class BinkDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("RAD Video Tools Bink video", new byte?[][] { new byte?[] { new byte?(83), new byte?(77), new byte?(75), new byte?(50) }, new byte?[] { new byte?(83), new byte?(77), new byte?(75), new byte?(52) } }, new string[] { "*.bik" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + dfr.Sources.Add("http://wiki.multimedia.cx/index.php?title=Smacker"); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + VideoObjectModel video = (objectModel as VideoObjectModel); + if (video != null) + { + BinaryReader br = base.Stream.BinaryReader; + string BIK = br.ReadFixedLengthString(3); + byte videoCodecRevision = br.ReadByte(); + int fileSize = br.ReadInt32(); + int frameCount = br.ReadInt32(); + int largestFrameSize = br.ReadInt32(); + int frameCount2 = br.ReadInt32(); + int videoWidth = br.ReadInt32(); + int videoHeight = br.ReadInt32(); + int videoFramesPerSecondDividend = br.ReadInt32(); + int videoFramesPerSecondDivisor = br.ReadInt32(); + int videoFlags = br.ReadInt32(); + int audioTrackCount = br.ReadInt32(); + for (int i = 0; i < audioTrackCount; i++) + { + byte[] unknown = br.ReadBytes(2u); + short audioChannels = br.ReadInt16(); + } + for (int i = 0; i < audioTrackCount; i++) + { + ushort audioSampleRate = br.ReadUInt16(); + short flags = br.ReadInt16(); + } + for (int i = 0; i < audioTrackCount; i++) + { + int audioTrackID = br.ReadInt32(); + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + VideoObjectModel video = objectModel as VideoObjectModel; + if (video != null) + { + BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteFixedLengthString("BIK"); + byte videoCodecRevision = 98; + bw.Write(videoCodecRevision); + int fileSize = 0; + bw.Write(fileSize); + int frameCount = 0; + bw.Write(frameCount); + int largestFrameSize = 0; + bw.Write(largestFrameSize); + bw.Write(frameCount); + int videoWidth = 320; + bw.Write(videoWidth); + int videoHeight = 240; + bw.Write(videoHeight); + int videoFramesPerSecondDividend = 24; + bw.Write(videoFramesPerSecondDividend); + int videoFramesPerSecondDivisor = 1; + bw.Write(videoFramesPerSecondDivisor); + int videoFlags = 0; + bw.Write(videoFlags); + int audioTrackCount = 0; + bw.Write(audioTrackCount); + for (int i = 0; i < audioTrackCount; i++) + { + byte[] unknown = new byte[2]; + bw.Write(unknown); + short audioChannels = 1; + bw.Write(audioChannels); + } + for (int i = 0; i < audioTrackCount; i++) + { + ushort audioSampleRate = 44100; + bw.Write(audioSampleRate); + short flags = 0; + bw.Write(flags); + } + for (int i = 0; i < audioTrackCount; i++) + { + int audioTrackID = 0; + bw.Write(audioTrackID); + } + bw.Flush(); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Smacker/SmackerDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Smacker/SmackerDataFormat.cs new file mode 100644 index 00000000..30cddacb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/RAD/Smacker/SmackerDataFormat.cs @@ -0,0 +1,53 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Video; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.RAD.Smacker +{ + public class SmackerDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("RAD Video Tools Smacker", new byte?[][] { new byte?[] { new byte?(83), new byte?(77), new byte?(75), new byte?(50) }, new byte?[] { new byte?(83), new byte?(77), new byte?(75), new byte?(52) } }, new string[] { "*.smk" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + dfr.Sources.Add("http://wiki.multimedia.cx/index.php?title=Smacker"); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + string signature = br.ReadFixedLengthString(4); + int width = br.ReadInt32(); + int height = br.ReadInt32(); + int frames = br.ReadInt32(); + int frameRate = br.ReadInt32(); + if (frameRate > 0) + { + int framesPerSecond = 1000 / frameRate; + } + else + { + if (frameRate < 0) + { + int framesPerSecond = 100000 / -frameRate; + } + } + int flags = br.ReadInt32(); + int[] audioSize = br.ReadInt32Array(7); + int TreesSize = br.ReadInt32(); + int MMap_Size = br.ReadInt32(); + int MClr_Size = br.ReadInt32(); + int Full_Size = br.ReadInt32(); + int Type_Size = br.ReadInt32(); + int[] audioRate = br.ReadInt32Array(7); + int dummy = br.ReadInt32(); + int[] frameSizes = br.ReadInt32Array(frames); + byte[] frameTypes = br.ReadBytes(frames); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQChunk.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQChunk.cs new file mode 100644 index 00000000..312299b2 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQChunk.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.ObjectModel; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.ROQ +{ + public class ROQChunk + { + public class ROQChunkCollection : Collection + { + } + private short mvarID = 0; + private short mvarArgument = 0; + private byte[] mvarData = new byte[0]; + public short ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public short Argument + { + get + { + return this.mvarArgument; + } + set + { + this.mvarArgument = value; + } + } + public byte[] Data + { + get + { + return this.mvarData; + } + set + { + this.mvarData = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQDataFormat.cs new file mode 100644 index 00000000..7e171590 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/ROQ/ROQDataFormat.cs @@ -0,0 +1,70 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Audio.Waveform; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Video; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.ROQ +{ + public class ROQDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("id software RoQ video", new byte?[][] { new byte?[] { new byte?(132), new byte?(16), new byte?(255), new byte?(255), new byte?(255), new byte?(255), new byte?(30), new byte?(0) } }, new string[] { "*.roq" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + dfr.Sources.Add("http://multimedia.cx/mirror/idroq.txt"); + return dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + byte[] signature = br.ReadBytes(8u); + VideoObjectModel vom = objectModel as VideoObjectModel; + WaveformAudioObjectModel wave = new WaveformAudioObjectModel(); + AudioTrack audio = new AudioTrack(); + VideoTrack video = new VideoTrack(); + video.FrameRate = 30; + wave.Header.BitsPerSample = 16; + wave.Header.SampleRate = 22050; + while (!br.EndOfStream) + { + ROQChunk chunk = new ROQChunk(); + chunk.ID = br.ReadInt16(); + int size = br.ReadInt32(); + chunk.Argument = br.ReadInt16(); + chunk.Data = br.ReadBytes(size); + short iD = chunk.ID; + switch (iD) + { + case 4097: + { + BinaryReader brch = new BinaryReader(chunk.Data); + video.Width = (int)brch.ReadInt16(); + video.Height = (int)brch.ReadInt16(); + video.BlockDimension = (int)brch.ReadInt16(); + video.SubBlockDimension = (int)brch.ReadInt16(); + break; + } + case 4098: + { + break; + } + default: + { + if (iD != 4113) + { + switch (iD) + { + } + } + break; + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/THP/THPDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/THP/THPDataFormat.cs new file mode 100644 index 00000000..267fa08d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/THP/THPDataFormat.cs @@ -0,0 +1,77 @@ +using System; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Video; +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.THP +{ + public class THPDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Nintendo GameCube THP video", new byte?[][] { new byte?[] { new byte?(84), new byte?(72), new byte?(80), new byte?(0) } }, new string[] { "*.thp" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + return dfr; + } + protected override void LoadInternal(ref ObjectModel objectModel) + { + BinaryReader br = base.Stream.BinaryReader; + string signature = br.ReadFixedLengthString(4); + uint version = br.ReadUInt32(); + uint maxBufferSize = br.ReadUInt32(); + uint maxAudioSamples = br.ReadUInt32(); + float fps = br.ReadSingle(); + uint numFrames = br.ReadUInt32(); + uint firstFrameSize = br.ReadUInt32(); + uint dataSize = br.ReadUInt32(); + uint componentDataOffset = br.ReadUInt32(); + uint offsetsDataOffset = br.ReadUInt32(); + uint firstFrameOffset = br.ReadUInt32(); + uint lastFrameOffset = br.ReadUInt32(); + br.BaseStream.Seek((long)((ulong)componentDataOffset), System.IO.SeekOrigin.Begin); + uint numComponents = br.ReadUInt32(); + byte[] componentTypes = new byte[(int)((UIntPtr)numComponents)]; + for (uint i = 0u; i < numComponents; i += 1u) + { + componentTypes[(int)((UIntPtr)i)] = br.ReadByte(); + switch (componentTypes[(int)((UIntPtr)i)]) + { + case 0: + { + uint width = br.ReadUInt32(); + uint height = br.ReadUInt32(); + if (version == 69632u) + { + uint unknown = br.ReadUInt32(); + } + break; + } + case 1: + { + uint numChannels = br.ReadUInt32(); + uint frequency = br.ReadUInt32(); + uint numSamples = br.ReadUInt32(); + uint numData = br.ReadUInt32(); + break; + } + } + } + br.BaseStream.Seek((long)((ulong)firstFrameOffset), System.IO.SeekOrigin.Begin); + uint nextTotalSize = br.ReadUInt32(); + uint prevTotalSize = br.ReadUInt32(); + uint imageSize = br.ReadUInt32(); + if (maxAudioSamples != 0u) + { + uint audioSize = br.ReadUInt32(); + } + uint channelSize = br.ReadUInt32(); + uint numSamples2 = br.ReadUInt32(); + ushort[] table = br.ReadUInt16Array(16); + ushort[] table2 = br.ReadUInt16Array(16); + throw new NotImplementedException(); + } + protected override void SaveInternal(ObjectModel objectModel) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/UEV/UEVDataFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/UEV/UEVDataFormat.cs new file mode 100644 index 00000000..a98197eb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Video/UEV/UEVDataFormat.cs @@ -0,0 +1,95 @@ +using System; +using System.Drawing; +using UniversalEditor.IO; +using UniversalEditor.Plugins.Multimedia.ObjectModels.Video; + +namespace UniversalEditor.Plugins.Multimedia.DataFormats.Video.UEV +{ + public class UEVDataFormat : DataFormat + { + public override DataFormatReference MakeReference() + { + DataFormatReference dfr = base.MakeReference(); + dfr.Filters.Add("Universal Editor video", new byte?[][] { new byte?[] { new byte?(85), new byte?(69), new byte?(86), new byte?(105), new byte?(100), new byte?(101), new byte?(111), new byte?(90) } }, new string[] { "*.uev" }); + dfr.Capabilities.Add(typeof(VideoObjectModel), DataFormatCapabilities.All); + return dfr; + } + + private Version mvarVersion = new Version(); + public Version Version { get { return mvarVersion; } set { mvarVersion = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + VideoObjectModel vom = objectModel as VideoObjectModel; + BinaryReader br = base.Stream.BinaryReader; + string UEVideoZ = br.ReadFixedLengthString(8); + if (!(UEVideoZ != "UEVideoZ")) + { + int versionMajor = br.ReadInt32(); + int versionMinor = br.ReadInt32(); + int versionBuild = br.ReadInt32(); + int versionRevision = br.ReadInt32(); + this.mvarVersion = new Version(versionMajor, versionMinor, versionBuild, versionRevision); + int audioTrackCount = br.ReadInt32(); + for (int i = 0; i < audioTrackCount; i++) + { + int audioTrackFormat = br.ReadInt32(); + int audioTrackSize = br.ReadInt32(); + } + int videoTrackCount = br.ReadInt32(); + for (int i = 0; i < videoTrackCount; i++) + { + int frameCount = br.ReadInt32(); + for (int j = 0; j < frameCount; j++) + { + int frameSize = br.ReadInt32(); + byte[] frameBytes = br.ReadBytes(frameSize); + System.IO.MemoryStream ms = new System.IO.MemoryStream(frameBytes); + Image frameImage = Image.FromStream(ms); + ms.Close(); + } + } + } + } + protected override void SaveInternal(ObjectModel objectModel) + { + VideoObjectModel vom = objectModel as VideoObjectModel; + BinaryWriter bw = base.Stream.BinaryWriter; + bw.WriteFixedLengthString("UEVideoZ"); + bw.Write(this.mvarVersion.Major); + bw.Write(this.mvarVersion.Minor); + bw.Write(this.mvarVersion.Build); + bw.Write(this.mvarVersion.Revision); + bw.Write(vom.AudioTracks.Count); + for (int i = 0; i < vom.AudioTracks.Count; i++) + { + AudioTrack audio = vom.AudioTracks[i]; + bw.Write(audio.ObjectModel.Header.BitsPerSample); + bw.Write(audio.ObjectModel.Header.BlockAlignment); + bw.Write(audio.ObjectModel.Header.ChannelCount); + bw.Write(audio.ObjectModel.Header.DataRate); + bw.Write(audio.ObjectModel.Header.FormatTag); + bw.Write(audio.ObjectModel.Header.SampleRate); + bw.Write(audio.ObjectModel.ExtendedHeader.Enabled); + if (audio.ObjectModel.ExtendedHeader.Enabled) + { + bw.Write(audio.ObjectModel.ExtendedHeader.ChannelMask); + bw.Write(audio.ObjectModel.ExtendedHeader.SubFormatGUID); + bw.Write(audio.ObjectModel.ExtendedHeader.ValidBitsPerSample); + } + // bw.WriteArray(audio.ObjectModel.RawSamples); + throw new NotImplementedException(); + } + bw.Write(vom.VideoTracks.Count); + for (int i = 0; i < vom.VideoTracks.Count; i++) + { + VideoTrack video = vom.VideoTracks[i]; + bw.Write(video.Frames.Count); + for (int j = 0; j < video.Frames.Count; j++) + { + VideoFrame frame = video.Frames[j]; + } + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.cs new file mode 100644 index 00000000..66a00809 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.cs @@ -0,0 +1,333 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +namespace UniversalEditor.Plugins.Multimedia.Dialogs.Audio +{ + public class NoteExpressionProperty : Form + { + private IContainer components = null; + private Label lblTemplate; + private ComboBox cboTemplate; + private GroupBox groupBox1; + private GroupBox groupBox2; + private Label label2; + private TextBox textBox1; + private TrackBar trackBar2; + private GroupBox fraBendDepth; + private TextBox txtBendDepth; + private Label label1; + private TrackBar trackBar1; + private GroupBox groupBox3; + private CheckBox checkBox1; + private CheckBox checkBox2; + private GroupBox groupBox4; + private GroupBox groupBox6; + private Label label3; + private TextBox textBox2; + private TrackBar trackBar3; + private GroupBox groupBox7; + private TextBox textBox3; + private Label label4; + private TrackBar trackBar4; + private Button cmdCancel; + private Button cmdOK; + public NoteExpressionProperty() + { + this.InitializeComponent(); + } + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + { + this.components.Dispose(); + } + base.Dispose(disposing); + } + private void InitializeComponent() + { + this.lblTemplate = new Label(); + this.cboTemplate = new ComboBox(); + this.groupBox1 = new GroupBox(); + this.trackBar1 = new TrackBar(); + this.fraBendDepth = new GroupBox(); + this.txtBendDepth = new TextBox(); + this.label1 = new Label(); + this.groupBox2 = new GroupBox(); + this.textBox1 = new TextBox(); + this.trackBar2 = new TrackBar(); + this.label2 = new Label(); + this.groupBox3 = new GroupBox(); + this.checkBox1 = new CheckBox(); + this.checkBox2 = new CheckBox(); + this.groupBox4 = new GroupBox(); + this.groupBox6 = new GroupBox(); + this.label3 = new Label(); + this.textBox2 = new TextBox(); + this.trackBar3 = new TrackBar(); + this.groupBox7 = new GroupBox(); + this.textBox3 = new TextBox(); + this.label4 = new Label(); + this.trackBar4 = new TrackBar(); + this.cmdCancel = new Button(); + this.cmdOK = new Button(); + this.groupBox1.SuspendLayout(); + ((ISupportInitialize)this.trackBar1).BeginInit(); + this.fraBendDepth.SuspendLayout(); + this.groupBox2.SuspendLayout(); + ((ISupportInitialize)this.trackBar2).BeginInit(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox6.SuspendLayout(); + ((ISupportInitialize)this.trackBar3).BeginInit(); + this.groupBox7.SuspendLayout(); + ((ISupportInitialize)this.trackBar4).BeginInit(); + base.SuspendLayout(); + this.lblTemplate.AutoSize = true; + this.lblTemplate.FlatStyle = FlatStyle.System; + this.lblTemplate.Location = new Point(12, 15); + this.lblTemplate.Name = "lblTemplate"; + this.lblTemplate.Size = new Size(54, 13); + this.lblTemplate.TabIndex = 0; + this.lblTemplate.Text = "&Template:"; + this.cboTemplate.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right); + this.cboTemplate.DropDownStyle = ComboBoxStyle.DropDownList; + this.cboTemplate.FlatStyle = FlatStyle.System; + this.cboTemplate.FormattingEnabled = true; + this.cboTemplate.Location = new Point(72, 12); + this.cboTemplate.Name = "cboTemplate"; + this.cboTemplate.Size = new Size(330, 21); + this.cboTemplate.TabIndex = 1; + this.groupBox1.Controls.Add(this.groupBox3); + this.groupBox1.Controls.Add(this.groupBox2); + this.groupBox1.Controls.Add(this.fraBendDepth); + this.groupBox1.FlatStyle = FlatStyle.System; + this.groupBox1.Location = new Point(12, 39); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new Size(192, 261); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Pitch control"; + this.trackBar1.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom); + this.trackBar1.Location = new Point(21, 19); + this.trackBar1.Maximum = 100; + this.trackBar1.Name = "trackBar1"; + this.trackBar1.Orientation = Orientation.Vertical; + this.trackBar1.Size = new Size(45, 104); + this.trackBar1.TabIndex = 0; + this.trackBar1.TickFrequency = 10; + this.trackBar1.TickStyle = TickStyle.Both; + this.trackBar1.Value = 8; + this.fraBendDepth.Controls.Add(this.txtBendDepth); + this.fraBendDepth.Controls.Add(this.label1); + this.fraBendDepth.Controls.Add(this.trackBar1); + this.fraBendDepth.FlatStyle = FlatStyle.System; + this.fraBendDepth.Location = new Point(6, 19); + this.fraBendDepth.Name = "fraBendDepth"; + this.fraBendDepth.Size = new Size(87, 161); + this.fraBendDepth.TabIndex = 0; + this.fraBendDepth.TabStop = false; + this.fraBendDepth.Text = "&Bend depth:"; + this.txtBendDepth.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); + this.txtBendDepth.Location = new Point(14, 129); + this.txtBendDepth.Name = "txtBendDepth"; + this.txtBendDepth.Size = new Size(56, 20); + this.txtBendDepth.TabIndex = 1; + this.txtBendDepth.Text = "8"; + this.txtBendDepth.TextAlign = HorizontalAlignment.Right; + this.label1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.label1.FlatStyle = FlatStyle.System; + this.label1.Location = new Point(71, 132); + this.label1.Name = "label1"; + this.label1.Size = new Size(10, 17); + this.label1.TabIndex = 2; + this.label1.Text = "%"; + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.textBox1); + this.groupBox2.Controls.Add(this.trackBar2); + this.groupBox2.FlatStyle = FlatStyle.System; + this.groupBox2.Location = new Point(99, 19); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new Size(87, 161); + this.groupBox2.TabIndex = 1; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Bend &length:"; + this.textBox1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); + this.textBox1.Location = new Point(14, 129); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new Size(56, 20); + this.textBox1.TabIndex = 1; + this.textBox1.Text = "0"; + this.textBox1.TextAlign = HorizontalAlignment.Right; + this.trackBar2.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom); + this.trackBar2.Location = new Point(21, 19); + this.trackBar2.Maximum = 100; + this.trackBar2.Name = "trackBar2"; + this.trackBar2.Orientation = Orientation.Vertical; + this.trackBar2.Size = new Size(45, 104); + this.trackBar2.TabIndex = 0; + this.trackBar2.TickFrequency = 10; + this.trackBar2.TickStyle = TickStyle.Both; + this.label2.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.label2.FlatStyle = FlatStyle.System; + this.label2.Location = new Point(71, 132); + this.label2.Name = "label2"; + this.label2.Size = new Size(10, 17); + this.label2.TabIndex = 2; + this.label2.Text = "%"; + this.groupBox3.Controls.Add(this.checkBox2); + this.groupBox3.Controls.Add(this.checkBox1); + this.groupBox3.FlatStyle = FlatStyle.System; + this.groupBox3.Location = new Point(6, 186); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new Size(180, 69); + this.groupBox3.TabIndex = 2; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Add portamento"; + this.checkBox1.AutoSize = true; + this.checkBox1.FlatStyle = FlatStyle.System; + this.checkBox1.Location = new Point(18, 20); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new Size(142, 18); + this.checkBox1.TabIndex = 0; + this.checkBox1.Text = "During &rising movement"; + this.checkBox1.UseVisualStyleBackColor = true; + this.checkBox2.AutoSize = true; + this.checkBox2.FlatStyle = FlatStyle.System; + this.checkBox2.Location = new Point(18, 44); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new Size(145, 18); + this.checkBox2.TabIndex = 1; + this.checkBox2.Text = "During &falling movement"; + this.checkBox2.UseVisualStyleBackColor = true; + this.groupBox4.Controls.Add(this.groupBox6); + this.groupBox4.Controls.Add(this.groupBox7); + this.groupBox4.FlatStyle = FlatStyle.System; + this.groupBox4.Location = new Point(210, 39); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new Size(192, 261); + this.groupBox4.TabIndex = 3; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "Dynamics control"; + this.groupBox6.Controls.Add(this.label3); + this.groupBox6.Controls.Add(this.textBox2); + this.groupBox6.Controls.Add(this.trackBar3); + this.groupBox6.FlatStyle = FlatStyle.System; + this.groupBox6.Location = new Point(99, 19); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new Size(87, 161); + this.groupBox6.TabIndex = 1; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "&Accent:"; + this.label3.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.label3.FlatStyle = FlatStyle.System; + this.label3.Location = new Point(71, 132); + this.label3.Name = "label3"; + this.label3.Size = new Size(10, 17); + this.label3.TabIndex = 2; + this.label3.Text = "%"; + this.textBox2.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); + this.textBox2.Location = new Point(14, 129); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new Size(56, 20); + this.textBox2.TabIndex = 1; + this.textBox2.Text = "50"; + this.textBox2.TextAlign = HorizontalAlignment.Right; + this.trackBar3.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom); + this.trackBar3.Location = new Point(21, 19); + this.trackBar3.Maximum = 100; + this.trackBar3.Name = "trackBar3"; + this.trackBar3.Orientation = Orientation.Vertical; + this.trackBar3.Size = new Size(45, 104); + this.trackBar3.TabIndex = 0; + this.trackBar3.TickFrequency = 10; + this.trackBar3.TickStyle = TickStyle.Both; + this.trackBar3.Value = 50; + this.groupBox7.Controls.Add(this.textBox3); + this.groupBox7.Controls.Add(this.label4); + this.groupBox7.Controls.Add(this.trackBar4); + this.groupBox7.FlatStyle = FlatStyle.System; + this.groupBox7.Location = new Point(6, 19); + this.groupBox7.Name = "groupBox7"; + this.groupBox7.Size = new Size(87, 161); + this.groupBox7.TabIndex = 0; + this.groupBox7.TabStop = false; + this.groupBox7.Text = "&Decay:"; + this.textBox3.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right); + this.textBox3.Location = new Point(14, 129); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new Size(56, 20); + this.textBox3.TabIndex = 1; + this.textBox3.Text = "50"; + this.textBox3.TextAlign = HorizontalAlignment.Right; + this.label4.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.label4.FlatStyle = FlatStyle.System; + this.label4.Location = new Point(71, 132); + this.label4.Name = "label4"; + this.label4.Size = new Size(10, 17); + this.label4.TabIndex = 2; + this.label4.Text = "%"; + this.trackBar4.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom); + this.trackBar4.Location = new Point(21, 19); + this.trackBar4.Maximum = 100; + this.trackBar4.Name = "trackBar4"; + this.trackBar4.Orientation = Orientation.Vertical; + this.trackBar4.Size = new Size(45, 104); + this.trackBar4.TabIndex = 0; + this.trackBar4.TickFrequency = 10; + this.trackBar4.TickStyle = TickStyle.Both; + this.trackBar4.Value = 50; + this.cmdCancel.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.cmdCancel.FlatStyle = FlatStyle.System; + this.cmdCancel.Location = new Point(327, 306); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new Size(75, 23); + this.cmdCancel.TabIndex = 5; + this.cmdCancel.Text = "&Cancel"; + this.cmdCancel.UseVisualStyleBackColor = true; + this.cmdOK.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right); + this.cmdOK.FlatStyle = FlatStyle.System; + this.cmdOK.Location = new Point(246, 306); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new Size(75, 23); + this.cmdOK.TabIndex = 4; + this.cmdOK.Text = "&OK"; + this.cmdOK.UseVisualStyleBackColor = true; + base.AcceptButton = this.cmdOK; + base.AutoScaleDimensions = new SizeF(6f, 13f); + base.AutoScaleMode = AutoScaleMode.Font; + base.CancelButton = this.cmdCancel; + base.ClientSize = new Size(414, 341); + base.Controls.Add(this.cmdOK); + base.Controls.Add(this.cmdCancel); + base.Controls.Add(this.groupBox4); + base.Controls.Add(this.groupBox1); + base.Controls.Add(this.cboTemplate); + base.Controls.Add(this.lblTemplate); + base.FormBorderStyle = FormBorderStyle.FixedDialog; + base.MaximizeBox = false; + base.MinimizeBox = false; + base.Name = "NoteExpressionProperty"; + base.StartPosition = FormStartPosition.CenterParent; + this.Text = "Note Expression Properties"; + this.groupBox1.ResumeLayout(false); + ((ISupportInitialize)this.trackBar1).EndInit(); + this.fraBendDepth.ResumeLayout(false); + this.fraBendDepth.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((ISupportInitialize)this.trackBar2).EndInit(); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + ((ISupportInitialize)this.trackBar3).EndInit(); + this.groupBox7.ResumeLayout(false); + this.groupBox7.PerformLayout(); + ((ISupportInitialize)this.trackBar4).EndInit(); + base.ResumeLayout(false); + base.PerformLayout(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.resources b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/Dialogs/Audio/NoteExpressionProperty.resources new file mode 100644 index 0000000000000000000000000000000000000000..06c24d06c1cab750788146ce052b37770f3fa530 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYis@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYis@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYis@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYis@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYis@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HY + /// Description of ExtensionMethods. + /// + public static class ExtensionMethods + { + #region Reader + /// + /// Reads a series of 3 32-bit Single values as a + /// in RGB order. + /// + /// + /// + public static Color ReadColorRGBSingle(this IO.Reader br) + { + float specularR = br.ReadSingle(); + float specularG = br.ReadSingle(); + float specularB = br.ReadSingle(); + + int r = (int)Math.Min(255f, specularR * 255f); + int g = (int)Math.Min(255f, specularG * 255f); + int b = (int)Math.Min(255f, specularB * 255f); + return Color.FromRGBA(r, g, b); + } + /// + /// Reads a series of 4 32-bit Single values as a + /// in RGBA order. + /// + /// + /// + public static Color ReadColorRGBASingle(this IO.Reader br) + { + float diffuseR = br.ReadSingle(); + float diffuseG = br.ReadSingle(); + float diffuseB = br.ReadSingle(); + float diffuseA = br.ReadSingle(); + + int a = (int)Math.Min(255f, diffuseA * 255f); + int r = (int)Math.Min(255f, diffuseR * 255f); + int g = (int)Math.Min(255f, diffuseG * 255f); + int b = (int)Math.Min(255f, diffuseB * 255f); + return Color.FromRGBA(r, g, b, a); + } + /// + /// Reads a series of 4 32-bit Single values as a + /// in RGBA order. + /// + /// + /// + public static Color ReadColorARGBSingle(this IO.Reader br) + { + float diffuseA = br.ReadSingle(); + float diffuseR = br.ReadSingle(); + float diffuseG = br.ReadSingle(); + float diffuseB = br.ReadSingle(); + + int a = (int)Math.Min(255f, diffuseA * 255f); + int r = (int)Math.Min(255f, diffuseR * 255f); + int g = (int)Math.Min(255f, diffuseG * 255f); + int b = (int)Math.Min(255f, diffuseB * 255f); + return Color.FromRGBA(r, g, b, a); + } + + /// + /// Reads a as 4 bits Red, 4 bits Green, 4 bits Blue, and 4 bits Alpha. + /// + /// + /// + public static Color ReadColorRGBA4444(this IO.Reader br) + { + // 4 bits R, 4 bits G, 4 bits B, 4 bits alpha + ushort rgba = br.ReadUInt16(); + byte r = (byte)(rgba.GetBits(0, 4)); + byte g = (byte)(rgba.GetBits(4, 4)); + byte b = (byte)(rgba.GetBits(8, 4)); + byte a = (byte)(rgba.GetBits(12, 4)); + + Color color = Color.FromRGBA(a, r, g, b); + return color; + } + + /// + /// Reads a as 5 bits Red, 6 bits Green, 5 bits Blue, and 0 bits Alpha. + /// + /// + /// + public static Color ReadColorRGBA5650(this IO.Reader br) + { + // 5 bits R, 6 bits G, 5 bits B, 0 bits alpha + ushort rgb = br.ReadUInt16(); + byte r = (byte)(rgb.GetBits(0, 5)); + byte g = (byte)(rgb.GetBits(5, 6)); + byte b = (byte)(rgb.GetBits(11, 5)); + + Color color = Color.FromRGBA(r, g, b); + return color; + } + + /// + /// Reads a as 8 bits Red, 8 bits Green, 8 bits Blue, and 8 bits Alpha. + /// + /// + /// + public static Color ReadColorRGBA8888(this IO.Reader br) + { + // 1 byte each R, G, B, A + byte r = br.ReadByte(); + byte g = br.ReadByte(); + byte b = br.ReadByte(); + byte a = br.ReadByte(); + + Color color = Color.FromRGBA(a, r, g, b); + return color; + } + + /// + /// Reads a as 5 bits Red, 5 bits Green, 5 bits Blue, and 1 bit Alpha. + /// + /// + /// + public static Color ReadColorRGBA5551(this IO.Reader br) + { + ushort rgba = br.ReadUInt16(); + byte r = (byte)(rgba.GetBits(0, 5)); + byte g = (byte)(rgba.GetBits(5, 5)); + byte b = (byte)(rgba.GetBits(10, 5)); + byte a = (byte)(rgba.GetBits(15, 1)); + + Color color = Color.FromRGBA(a, r, g, b); + return color; + } + #endregion + #region Writer + /// + /// Writes a series of 3 32-bit Single values as a + /// in RGB order. + /// + /// + /// + public static void WriteColorRGBSingle(this IO.Writer bw, Color color) + { + bw.WriteSingle((float)color.Red); + bw.WriteSingle((float)color.Green); + bw.WriteSingle((float)color.Blue); + } + /// + /// Writes a series of 4 32-bit Single values as a + /// in RGBA order. + /// + /// + /// + public static void WriteColorRGBASingle(this IO.Writer bw, Color color) + { + bw.WriteSingle((float)color.Red); + bw.WriteSingle((float)color.Green); + bw.WriteSingle((float)color.Blue); + bw.WriteSingle((float)color.Alpha); + } + /// + /// Writes a series of 4 32-bit Single values as a + /// in ARGB order. + /// + /// + /// + public static void WriteColorARGBSingle(this IO.Writer bw, Color color) + { + bw.WriteSingle((float)color.Alpha); + bw.WriteSingle((float)color.Red); + bw.WriteSingle((float)color.Green); + bw.WriteSingle((float)color.Blue); + } + + /// + /// Writes a as 4 bits Red, 4 bits Green, 4 bits Blue, and 4 bits Alpha. + /// + /// + /// + public static void WriteColorRGBA4444(this IO.Writer bw, Color color) + { + throw new NotImplementedException(); + /* + // 4 bits R, 4 bits G, 4 bits B, 4 bits alpha + ushort rgba = br.ReadUInt16(); + byte r = (byte)(rgba.GetBits(0, 4)); + byte g = (byte)(rgba.GetBits(4, 4)); + byte b = (byte)(rgba.GetBits(8, 4)); + byte a = (byte)(rgba.GetBits(12, 4)); + + Color color = Color.FromRGBA(a, r, g, b); + */ + } + + /// + /// Reads a as 5 bits Red, 6 bits Green, 5 bits Blue, and 0 bits Alpha. + /// + /// + /// + public static void WriteColorRGBA5650(this IO.Writer bw, Color color) + { + throw new NotImplementedException(); + } + + /// + /// Reads a as 8 bits Red, 8 bits Green, 8 bits Blue, and 8 bits Alpha. + /// + /// + /// + public static void WriteColorRGBA8888(this IO.Writer bw, Color color) + { + bw.WriteByte((byte)(color.Red * 255)); + bw.WriteByte((byte)(color.Green * 255)); + bw.WriteByte((byte)(color.Blue * 255)); + bw.WriteByte((byte)(color.Alpha * 255)); + } + + /// + /// Reads a as 5 bits Red, 5 bits Green, 5 bits Blue, and 1 bit Alpha. + /// + /// + /// + public static Color ReadColorRGBA5551(this IO.Writer bw, Color color) + { + throw new NotImplementedException(); + } + #endregion + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModel.cs new file mode 100644 index 00000000..f00a32c6 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModel.cs @@ -0,0 +1,9 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio +{ + public abstract class AudioObjectModel : ObjectModel + { + private AudioObjectModelInformation mvarInformation = new AudioObjectModelInformation(); + public AudioObjectModelInformation Information { get { return mvarInformation; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelDocumentProperties.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelDocumentProperties.cs new file mode 100644 index 00000000..395d3b7d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelDocumentProperties.cs @@ -0,0 +1,139 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.ObjectModels.Audio +{ + public class AudioObjectModelDocumentProperties + { + private string mvarSongTitle = string.Empty; + private string mvarAlbumTitle = string.Empty; + private string mvarCreator = string.Empty; + private string mvarComments = string.Empty; + private DateTime mvarDateCreated = DateTime.Now; + private int mvarFadeOutDelay = 0; + private int mvarFadeOutLength = 0; + private string mvarSongArtist = string.Empty; + private string mvarGeneratorTitle = string.Empty; + private string mvarGeneratorAuthor = string.Empty; + private Version mvarGeneratorVersion = new Version(1, 0, 0, 0); + public string SongTitle + { + get + { + return this.mvarSongTitle; + } + set + { + this.mvarSongTitle = value; + } + } + public string AlbumTitle + { + get + { + return this.mvarAlbumTitle; + } + set + { + this.mvarAlbumTitle = value; + } + } + public string Creator + { + get + { + return this.mvarCreator; + } + set + { + this.mvarCreator = value; + } + } + public string Comments + { + get + { + return this.mvarComments; + } + set + { + this.mvarComments = value; + } + } + public DateTime DateCreated + { + get + { + return this.mvarDateCreated; + } + set + { + this.mvarDateCreated = value; + } + } + public int FadeOutDelay + { + get + { + return this.mvarFadeOutDelay; + } + set + { + this.mvarFadeOutDelay = value; + } + } + public int FadeOutLength + { + get + { + return this.mvarFadeOutLength; + } + set + { + this.mvarFadeOutLength = value; + } + } + public string SongArtist + { + get + { + return this.mvarSongArtist; + } + set + { + this.mvarSongArtist = value; + } + } + public string GeneratorTitle + { + get + { + return this.mvarGeneratorTitle; + } + set + { + this.mvarGeneratorTitle = value; + } + } + public string GeneratorAuthor + { + get + { + return this.mvarGeneratorAuthor; + } + set + { + this.mvarGeneratorAuthor = value; + } + } + public Version GeneratorVersion + { + get + { + return this.mvarGeneratorVersion; + } + set + { + this.mvarGeneratorVersion = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelInformation.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelInformation.cs new file mode 100644 index 00000000..a6a3d7e9 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/AudioObjectModelInformation.cs @@ -0,0 +1,167 @@ +using System; +using UniversalEditor.ObjectModels.PropertyList; +namespace UniversalEditor.ObjectModels.Multimedia.Audio +{ + public class AudioObjectModelInformation + { + private string mvarSongTitle = string.Empty; + private string mvarAlbumTitle = string.Empty; + private string mvarCreator = string.Empty; + private string mvarComments = string.Empty; + private DateTime mvarDateCreated = DateTime.Now; + private int mvarFadeOutDelay = 0; + private int mvarFadeOutLength = 0; + private string mvarSongArtist = string.Empty; + private string mvarGeneratorTitle = string.Empty; + private string mvarGeneratorAuthor = string.Empty; + private Version mvarGeneratorVersion = new Version(1, 0, 0, 0); + public string SongTitle + { + get + { + return this.mvarSongTitle; + } + set + { + this.mvarSongTitle = value; + } + } + public string AlbumTitle + { + get + { + return this.mvarAlbumTitle; + } + set + { + this.mvarAlbumTitle = value; + } + } + public string Creator + { + get + { + return this.mvarCreator; + } + set + { + this.mvarCreator = value; + } + } + public string Comments + { + get + { + return this.mvarComments; + } + set + { + this.mvarComments = value; + } + } + public DateTime DateCreated + { + get + { + return this.mvarDateCreated; + } + set + { + this.mvarDateCreated = value; + } + } + public int FadeOutDelay + { + get + { + return this.mvarFadeOutDelay; + } + set + { + this.mvarFadeOutDelay = value; + } + } + public int FadeOutLength + { + get + { + return this.mvarFadeOutLength; + } + set + { + this.mvarFadeOutLength = value; + } + } + public string SongArtist + { + get + { + return this.mvarSongArtist; + } + set + { + this.mvarSongArtist = value; + } + } + public string GeneratorTitle + { + get + { + return this.mvarGeneratorTitle; + } + set + { + this.mvarGeneratorTitle = value; + } + } + public string GeneratorAuthor + { + get + { + return this.mvarGeneratorAuthor; + } + set + { + this.mvarGeneratorAuthor = value; + } + } + public Version GeneratorVersion + { + get + { + return this.mvarGeneratorVersion; + } + set + { + this.mvarGeneratorVersion = value; + } + } + + private string mvarGenre = String.Empty; + public string Genre { get { return mvarGenre; } set { mvarGenre = value; } } + + private int mvarTrackNumber = -1; + public int TrackNumber { get { return mvarTrackNumber; } set { mvarTrackNumber = value; } } + + private Property.PropertyCollection mvarCustomProperties = new Property.PropertyCollection(); + public Property.PropertyCollection CustomProperties { get { return mvarCustomProperties; } } + + public void Clear() + { + mvarAlbumTitle = String.Empty; + mvarComments = String.Empty; + mvarCreator = String.Empty; + mvarCustomProperties.Clear(); + mvarDateCreated = DateTime.Now; + mvarFadeOutDelay = 0; + mvarFadeOutLength = 0; + mvarGeneratorAuthor = String.Empty; + mvarGeneratorTitle = String.Empty; + mvarGeneratorVersion = new Version(1, 0, 0, 0); + mvarGenre = String.Empty; + mvarSongArtist = String.Empty; + mvarSongTitle = String.Empty; + mvarTrackNumber = -1; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Project/AudioProjectObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Project/AudioProjectObjectModel.cs new file mode 100644 index 00000000..8373443a --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Project/AudioProjectObjectModel.cs @@ -0,0 +1,21 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Project +{ + public class AudioProjectObjectModel : ObjectModel + { + public override ObjectModelReference MakeReference() + { + ObjectModelReference omr = base.MakeReference(); + omr.Title = "Audio project"; + omr.Path = new string[] { "Multimedia", "Audio", "Audio Project" }; + return omr; + } + public override void Clear() + { + } + public override void CopyTo(ObjectModel destination) + { + AudioProjectObjectModel clone = destination as AudioProjectObjectModel; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommand.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommand.cs new file mode 100644 index 00000000..b5333e42 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommand.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.ObjectModel; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommand : ICloneable + { + public class SynthesizedAudioCommandCollection : Collection + { + public SynthesizedAudioCommandRest Add(double length) + { + SynthesizedAudioCommandRest rest = new SynthesizedAudioCommandRest(); + rest.Length = length; + + base.Add(rest); + return rest; + } + public SynthesizedAudioCommandNote Add(SynthesizedAudioPredefinedNote note, double length, int octave, float volume) + { + SynthesizedAudioCommandNote command = new SynthesizedAudioCommandNote(); + command.Length = length; + command.Frequency = SynthesizedAudioPredefinedNoteConverter.GetFrequency(note, octave); + + base.Add(command); + return command; + } + + + } + public virtual object Clone() + { + return base.MemberwiseClone(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandNote.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandNote.cs new file mode 100644 index 00000000..84a4805d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandNote.cs @@ -0,0 +1,298 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandNote : SynthesizedAudioCommand + { + private bool mvarProtected = false; + private int mvarPosition = 0; + private string mvarPhoneme = null; + private string mvarLyric = null; + private double mvarFrequency = 0; + private int mvarPreUtterance = 0; + private int mvarVoiceOverlap = 0; + private int mvarIntensity = 0; + private int mvarModulation = 0; + private int mvarPBType = 0; + private double[] mvarPitches = new double[0]; + private string[] mvarEnvelope = new string[0]; + private double[] mvarVBR = new double[0]; + private int mvarAccent = 50; + private int mvarPitchBendDepth = 8; + private int mvarPitchBendLength = 0; + private int mvarDecay = 50; + private bool mvarPortamentoFalling = false; + private int mvarOpening = 127; + private bool mvarPortamentoRising = false; + private int mvarVibratoLength = 0; + private SynthesizedAudioVibratoType mvarVibratoType = SynthesizedAudioVibratoType.None; + public bool Protected + { + get + { + return this.mvarProtected; + } + set + { + this.mvarProtected = value; + } + } + public int Position + { + get + { + return this.mvarPosition; + } + set + { + this.mvarPosition = value; + } + } + private double mvarLength = 0; + public double Length + { + get { return mvarLength; } + set { mvarLength = value; } + } + public string Phoneme + { + get + { + return this.mvarPhoneme; + } + set + { + this.mvarPhoneme = value; + } + } + public string Lyric + { + get + { + return this.mvarLyric; + } + set + { + this.mvarLyric = value; + } + } + public double Frequency + { + get + { + return this.mvarFrequency; + } + set + { + this.mvarFrequency = value; + } + } + public int PreUtterance + { + get + { + return this.mvarPreUtterance; + } + set + { + this.mvarPreUtterance = value; + } + } + public int VoiceOverlap + { + get + { + return this.mvarVoiceOverlap; + } + set + { + this.mvarVoiceOverlap = value; + } + } + public int Intensity + { + get + { + return this.mvarIntensity; + } + set + { + this.mvarIntensity = value; + } + } + public int Modulation + { + get + { + return this.mvarModulation; + } + set + { + this.mvarModulation = value; + } + } + public int PBType + { + get + { + return this.mvarPBType; + } + set + { + this.mvarPBType = value; + } + } + public double[] Pitches + { + get + { + return this.mvarPitches; + } + set + { + this.mvarPitches = value; + } + } + public string[] Envelope + { + get + { + return this.mvarEnvelope; + } + set + { + this.mvarEnvelope = value; + } + } + public double[] VBR + { + get + { + return this.mvarVBR; + } + set + { + this.mvarVBR = value; + } + } + public int Accent + { + get + { + return this.mvarAccent; + } + set + { + this.mvarAccent = value; + } + } + public int PitchBendDepth + { + get + { + return this.mvarPitchBendDepth; + } + set + { + this.mvarPitchBendDepth = value; + } + } + public int PitchBendLength + { + get + { + return this.mvarPitchBendLength; + } + set + { + this.mvarPitchBendLength = value; + } + } + public int Decay + { + get + { + return this.mvarDecay; + } + set + { + this.mvarDecay = value; + } + } + public bool PortamentoFalling + { + get + { + return this.mvarPortamentoFalling; + } + set + { + this.mvarPortamentoFalling = value; + } + } + public int Opening + { + get + { + return this.mvarOpening; + } + set + { + this.mvarOpening = value; + } + } + public bool PortamentoRising + { + get + { + return this.mvarPortamentoRising; + } + set + { + this.mvarPortamentoRising = value; + } + } + public int VibratoLength + { + get + { + return this.mvarVibratoLength; + } + set + { + this.mvarVibratoLength = value; + } + } + public SynthesizedAudioVibratoType VibratoType + { + get + { + return this.mvarVibratoType; + } + set + { + this.mvarVibratoType = value; + } + } + public override object Clone() + { + return new SynthesizedAudioCommandNote + { + Envelope = this.mvarEnvelope.Clone() as string[], + Intensity = this.mvarIntensity, + Length = this.mvarLength, + Lyric = this.mvarLyric, + Modulation = this.mvarModulation, + PBType = this.mvarPBType, + Phoneme = this.mvarPhoneme, + Pitches = this.mvarPitches.Clone() as double[], + PortamentoFalling = this.mvarPortamentoFalling, + PortamentoRising = this.mvarPortamentoRising, + PreUtterance = this.mvarPreUtterance, + Protected = this.mvarProtected, + Frequency = this.mvarFrequency, + VBR = this.mvarVBR.Clone() as double[], + VoiceOverlap = this.mvarVoiceOverlap + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandRest.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandRest.cs new file mode 100644 index 00000000..2411b5d8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandRest.cs @@ -0,0 +1,7 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandRest : SynthesizedAudioCommandNote + { + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTempo.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTempo.cs new file mode 100644 index 00000000..f3490dc5 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTempo.cs @@ -0,0 +1,37 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandTempo : SynthesizedAudioCommand + { + private double mvarTempo = 0.0; + public double Tempo + { + get + { + return this.mvarTempo; + } + set + { + this.mvarTempo = value; + } + } + public SynthesizedAudioCommandTempo() + { + } + public SynthesizedAudioCommandTempo(double tempo) + { + this.mvarTempo = tempo; + } + public override string ToString() + { + return "MM = " + this.mvarTempo.ToString() + " BPM"; + } + public override object Clone() + { + return new SynthesizedAudioCommandTempo + { + Tempo = this.mvarTempo + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandText.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandText.cs new file mode 100644 index 00000000..b8adde07 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandText.cs @@ -0,0 +1,37 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandText : SynthesizedAudioCommand + { + private string mvarText = string.Empty; + public string Text + { + get + { + return this.mvarText; + } + set + { + this.mvarText = value; + } + } + public SynthesizedAudioCommandText() + { + } + public SynthesizedAudioCommandText(string text) + { + this.mvarText = text; + } + public override string ToString() + { + return "\"" + this.mvarText + "\""; + } + public override object Clone() + { + return new SynthesizedAudioCommandText + { + Text = this.mvarText.Clone() as string + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs new file mode 100644 index 00000000..327d55ed --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs @@ -0,0 +1,87 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandTimeSignature : SynthesizedAudioCommand + { + private byte mvarNumerator = 0; + private byte mvarDenominator = 0; + private byte mvarTicksPerMetronomeClick = 0; + private byte mvarNumberOf32ndNotesPerQuarterNote = 0; + public byte Numerator + { + get + { + return this.mvarNumerator; + } + set + { + this.mvarNumerator = value; + } + } + public byte Denominator + { + get + { + return this.mvarDenominator; + } + set + { + this.mvarDenominator = value; + } + } + public byte TicksPerMetronomeClick + { + get + { + return this.mvarTicksPerMetronomeClick; + } + set + { + this.mvarTicksPerMetronomeClick = value; + } + } + public byte NumberOf32ndNotesPerQuarterNote + { + get + { + return this.mvarNumberOf32ndNotesPerQuarterNote; + } + set + { + this.mvarNumberOf32ndNotesPerQuarterNote = value; + } + } + public SynthesizedAudioCommandTimeSignature() + { + } + public SynthesizedAudioCommandTimeSignature(byte numerator, byte denominator, byte ticksPerMetronomeClick, byte numberOf32ndNotesPerQuarterNote) + { + this.mvarNumerator = numerator; + this.mvarDenominator = denominator; + this.mvarTicksPerMetronomeClick = ticksPerMetronomeClick; + this.mvarNumberOf32ndNotesPerQuarterNote = numberOf32ndNotesPerQuarterNote; + } + public override string ToString() + { + return string.Concat(new string[] + { + "TS = ", + this.mvarNumerator.ToString(), + "/", + this.mvarDenominator.ToString(), + "; ♪ = ", + this.mvarNumberOf32ndNotesPerQuarterNote.ToString() + }); + } + public override object Clone() + { + return new SynthesizedAudioCommandTimeSignature + { + Denominator = this.mvarDenominator, + NumberOf32ndNotesPerQuarterNote = this.mvarNumberOf32ndNotesPerQuarterNote, + Numerator = this.mvarNumerator, + TicksPerMetronomeClick = this.mvarTicksPerMetronomeClick + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioObjectModel.cs new file mode 100644 index 00000000..bbe15d42 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioObjectModel.cs @@ -0,0 +1,47 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioObjectModel : AudioObjectModel + { + public override ObjectModelReference MakeReference() + { + ObjectModelReference omr = base.MakeReference(); + omr.Title = "Synthesized audio sequence"; + omr.Path = new string[] { "Multimedia", "Audio", "Synthesized Audio" }; + return omr; + } + + private short mvarChannelCount = 2; + public short ChannelCount { get { return mvarChannelCount; } set { mvarChannelCount = value; } } + + private string mvarName = string.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private double mvarTempo = 120.0; + public double Tempo { get { return mvarTempo; } set { mvarTempo = value; } } + + private SynthesizedAudioTrack.SynthesizedAudioTrackCollection mvarTracks = new SynthesizedAudioTrack.SynthesizedAudioTrackCollection(); + public SynthesizedAudioTrack.SynthesizedAudioTrackCollection Tracks { get { return mvarTracks; } } + + private VoicebankObjectModel.VoicebankObjectModelCollection mvarVoices = new VoicebankObjectModel.VoicebankObjectModelCollection(); + public VoicebankObjectModel.VoicebankObjectModelCollection Voices { get { return mvarVoices; } } + + public override void CopyTo(ObjectModel destination) + { + SynthesizedAudioObjectModel clone = destination as SynthesizedAudioObjectModel; + clone.Name = (this.mvarName.Clone() as string); + clone.Tempo = this.mvarTempo; + foreach (SynthesizedAudioTrack track in this.mvarTracks) + { + clone.Tracks.Add(track.Clone() as SynthesizedAudioTrack); + } + } + public override void Clear() + { + this.mvarName = string.Empty; + this.mvarTempo = 120.0; + this.mvarTracks.Clear(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs new file mode 100644 index 00000000..926ae631 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public enum SynthesizedAudioPredefinedNote + { + A = 0, + ASharp, + BFlat = ASharp, + B, + C, + CSharp, + DFlat = CSharp, + D, + DSharp, + EFlat = DSharp, + E, + F, + FSharp, + GFlat = FSharp, + G, + GSharp, + AFlat = GSharp + } + public static class SynthesizedAudioPredefinedNoteConverter + { + public static double GetFrequency(SynthesizedAudioPredefinedNote note, int octave) + { + return GetFrequency((int)note, octave); + } + public static double GetFrequency(int note, int octave) + { + return GetFrequency(note + ((octave - 4) * 12)); + } + public static double GetFrequency(int note) + { + /* + C5 = the C an octave above middle C. This is 3 half steps above A4 and so the frequency is + f3 = 440 * (1.059463..)^3 = 523.3 Hz + If your calculator does not have the ability to raise to powers, then use the fact that + (1.059463..)3 = (1.059463..)*(1.059463..)*(1.059463..) + That is, you multiply it by itself 3 times. + + Middle C is 9 half steps below A4 and the frequency is: + f -9 = 440 * (1.059463..)-9 = 261.6 Hz + If you don't have powers on your calculator, remember that the negative sign on the power means you divide instead of multiply. For this example, you divide by (1.059463..) 9 times. + */ + + double d = Math.Pow(2, (double)1 / 12); + int halfSteps = note; + double value = 440 * Math.Pow(d, halfSteps); + return value; + } + + public static int GetNote(double frequency) + { + double d = Math.Pow(2, (double)1 / 12); + double halfSteps = Math.Pow(frequency / 440, (1 / d)); + int note = (int)Math.Round((halfSteps - 1) * 12) + 1; + return note; + } + + public static double ChangeFrequency(double oldFrequency, int detuneBy) + { + if (detuneBy == 0) return oldFrequency; + + int note = GetNote(oldFrequency); + double freq = GetFrequency(note + detuneBy); + return freq; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioStylePlugin.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioStylePlugin.cs new file mode 100644 index 00000000..8fdb6f13 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioStylePlugin.cs @@ -0,0 +1,43 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioStylePlugin + { + private Guid mvarID = Guid.Empty; + private string mvarName = string.Empty; + private Version mvarVersion = new Version(1, 0); + public Guid ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public Version Version + { + get + { + return this.mvarVersion; + } + set + { + this.mvarVersion = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioTrack.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioTrack.cs new file mode 100644 index 00000000..468c8e01 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioTrack.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioTrack : ICloneable + { + public class SynthesizedAudioTrackCollection : Collection + { + private Dictionary tracksByID = new Dictionary(); + public SynthesizedAudioTrack this[string ID] + { + get + { + SynthesizedAudioTrack result; + if (this.tracksByID.ContainsKey(ID)) + { + result = this.tracksByID[ID]; + } + else + { + result = null; + } + return result; + } + } + public new void Add(SynthesizedAudioTrack item) + { + if (!string.IsNullOrEmpty(item.Name)) + { + this.tracksByID.Add(item.Name, item); + } + base.Add(item); + } + } + private string mvarID = string.Empty; + private string mvarName = string.Empty; + private string mvarComment = string.Empty; + private SynthesizedAudioCommand.SynthesizedAudioCommandCollection mvarCommands = new SynthesizedAudioCommand.SynthesizedAudioCommandCollection(); + private VoicebankObjectModel mvarSynthesizer = null; + private bool mvarIsMuted = false; + private bool mvarIsSolo = false; + private byte mvarPanpot = 64; + private byte mvarVolume = 0; + public string ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public string Comment + { + get + { + return this.mvarComment; + } + set + { + this.mvarComment = value; + } + } + public SynthesizedAudioCommand.SynthesizedAudioCommandCollection Commands + { + get + { + return this.mvarCommands; + } + } + public VoicebankObjectModel Synthesizer + { + get + { + return this.mvarSynthesizer; + } + set + { + this.mvarSynthesizer = value; + } + } + public bool IsMuted + { + get + { + return this.mvarIsMuted; + } + set + { + this.mvarIsMuted = value; + } + } + public bool IsSolo + { + get + { + return this.mvarIsSolo; + } + set + { + this.mvarIsSolo = value; + } + } + public byte Panpot + { + get + { + return this.mvarPanpot; + } + set + { + this.mvarPanpot = value; + } + } + public byte Volume + { + get + { + return this.mvarVolume; + } + set + { + this.mvarVolume = value; + } + } + public object Clone() + { + SynthesizedAudioTrack clone = new SynthesizedAudioTrack(); + foreach (SynthesizedAudioCommand command in this.mvarCommands) + { + clone.Commands.Add(command.Clone() as SynthesizedAudioCommand); + } + clone.ID = (this.mvarID.Clone() as string); + clone.Name = (this.mvarName.Clone() as string); + return clone; + } + + private double mvarTempo = 120; + public double Tempo { get { return mvarTempo; } set { mvarTempo = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioVibratoType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioVibratoType.cs new file mode 100644 index 00000000..5836948b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Synthesized/SynthesizedAudioVibratoType.cs @@ -0,0 +1,8 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public enum SynthesizedAudioVibratoType + { + None + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankObjectModel.cs new file mode 100644 index 00000000..c58ad9df --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankObjectModel.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class VoicebankObjectModel : ObjectModel + { + public class VoicebankObjectModelCollection : Collection + { + } + + public override ObjectModelReference MakeReference() + { + ObjectModelReference omr = base.MakeReference(); + omr.Title = "Synthesized audio voice bank"; + omr.Path = new string[] { "Multimedia", "Audio", "Voicebank" }; + return omr; + } + + public override void Clear() + { + mvarBankSelect = 0; + mvarCreatorVersion = new Version(1, 0); + mvarDocumentProperties = new DocumentProperties(); + mvarID = String.Empty; + mvarInstallationPath = String.Empty; + mvarProgramChange = 0; + mvarSamples.Clear(); + mvarSynthesisParameters.Clear(); + } + + private int mvarBankSelect = 0; + public int BankSelect { get { return mvarBankSelect; } set { mvarBankSelect = value; } } + + private int mvarProgramChange = 0; + public int ProgramChange { get { return mvarProgramChange; } set { mvarProgramChange = value; } } + + private string mvarID = string.Empty; + public string ID { get { return mvarID; } set { mvarID = value; } } + + private VoicebankSynthesisParameters mvarSynthesisParameters = new VoicebankSynthesisParameters(); + public VoicebankSynthesisParameters SynthesisParameters { get { return mvarSynthesisParameters; } } + + private DocumentProperties mvarDocumentProperties = new DocumentProperties(); + public DocumentProperties DocumentProperties { get { return mvarDocumentProperties; } } + + private VoicebankSample.VoicebankSampleCollection mvarSamples = new VoicebankSample.VoicebankSampleCollection(); + public VoicebankSample.VoicebankSampleCollection Samples { get { return mvarSamples; } } + + private Version mvarCreatorVersion = new Version(1, 0); + public Version CreatorVersion { get { return mvarCreatorVersion; } set { mvarCreatorVersion = value; } } + + private string mvarInstallationPath = string.Empty; + public string InstallationPath { get { return mvarInstallationPath; } set { mvarInstallationPath = value; } } + + public override void CopyTo(ObjectModel destination) + { + VoicebankObjectModel clone = (destination as VoicebankObjectModel); + if (clone == null) return; + + foreach (KeyValuePair kvp in mvarDocumentProperties.CustomProperties) + { + if (clone.DocumentProperties.CustomProperties.ContainsKey(kvp.Key)) + { + clone.DocumentProperties.CustomProperties[kvp.Key] = kvp.Value; + } + else + { + clone.DocumentProperties.CustomProperties.Add(kvp.Key, kvp.Value); + } + } + foreach (VoicebankSample phoneme in this.mvarSamples) + { + if (!clone.Samples.Contains(phoneme.Name)) clone.Samples.Add(phoneme.Clone() as VoicebankSample); + } + clone.CreatorVersion = (this.mvarCreatorVersion.Clone() as Version); + clone.InstallationPath = this.mvarInstallationPath; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSample.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSample.cs new file mode 100644 index 00000000..48bf4b2d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSample.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class VoicebankSample : ICloneable + { + public class VoicebankSampleCollection : Collection + { + private Dictionary phonemesByName = new Dictionary(); + public VoicebankSample this[string Name] { get { return phonemesByName[Name]; } } + + public VoicebankSample Add(string Name, byte[] data) + { + VoicebankSample vp = new VoicebankSample(); + vp.Name = Name; + vp.Data = data; + this.Add(vp); + return vp; + } + public bool Contains(string Name) + { + return this.phonemesByName.ContainsKey(Name); + } + protected override void InsertItem(int index, VoicebankSample item) + { + base.InsertItem(index, item); + if (!this.phonemesByName.ContainsKey(item.Name)) + { + this.phonemesByName.Add(item.Name, item); + } + } + } + + private string mvarName = string.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + private int mvarFrequency = 0; + public int Frequency { get { return mvarFrequency; } set { mvarFrequency = value; } } + private short mvarChannelCount = 0; + public short ChannelCount { get { return mvarChannelCount; } set { mvarChannelCount = value; } } + private int mvarDummy = 0; + public int Dummy { get { return mvarDummy; } set { mvarDummy = value; } } + + private byte[] mvarData = new byte[0]; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + private string mvarFileName = string.Empty; + public string FileName + { + get { return mvarFileName; } + set { mvarFileName = value; } + } + public object Clone() + { + return new VoicebankSample + { + Name = this.mvarName, + FileName = this.mvarFileName, + Data = this.mvarData + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSynthesisParameters.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSynthesisParameters.cs new file mode 100644 index 00000000..7a73ebe1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Voicebank/VoicebankSynthesisParameters.cs @@ -0,0 +1,30 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class VoicebankSynthesisParameters + { + private byte mvarBreathiness = 0; + public byte Breathiness { get { return mvarBreathiness; } set { mvarBreathiness = value; } } + + private byte mvarBrightness = 0; + public byte Brightness { get { return mvarBrightness; } set { mvarBrightness = value; } } + + private byte mvarClearness = 0; + public byte Clearness { get { return mvarClearness; } set { mvarClearness = value; } } + + private byte mvarGenderFactor = 0; + public byte GenderFactor { get { return mvarGenderFactor; } set { mvarGenderFactor = value; } } + + private byte mvarOpenness = 0; + public byte Openness { get { return mvarOpenness; } set { mvarOpenness = value; } } + + public void Clear() + { + mvarBreathiness = 0; + mvarBrightness = 0; + mvarClearness = 0; + mvarGenderFactor = 0; + mvarOpenness = 0; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioExtendedHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioExtendedHeader.cs new file mode 100644 index 00000000..8852de14 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioExtendedHeader.cs @@ -0,0 +1,55 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public class WaveformAudioExtendedHeader + { + private bool mvarEnabled = false; + private short mvarValidBitsPerSample = 0; + private int mvarChannelMask = 0; + private Guid mvarSubFormatGUID = Guid.Empty; + public bool Enabled + { + get + { + return this.mvarEnabled; + } + set + { + this.mvarEnabled = value; + } + } + public short ValidBitsPerSample + { + get + { + return this.mvarValidBitsPerSample; + } + set + { + this.mvarValidBitsPerSample = value; + } + } + public int ChannelMask + { + get + { + return this.mvarChannelMask; + } + set + { + this.mvarChannelMask = value; + } + } + public Guid SubFormatGUID + { + get + { + return this.mvarSubFormatGUID; + } + set + { + this.mvarSubFormatGUID = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioHeader.cs new file mode 100644 index 00000000..c0c747fd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioHeader.cs @@ -0,0 +1,59 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public class WaveformAudioHeader + { + private ushort mvarFormatTag = 1; + private short mvarChannelCount = 1; + private int mvarDataRate = 88200; + private short mvarBlockAlignment = 2; + public ushort FormatTag + { + get + { + return this.mvarFormatTag; + } + set + { + this.mvarFormatTag = value; + } + } + + public WaveformAudioKnownFormat Format + { + get { return (WaveformAudioKnownFormat)mvarFormatTag; } + set { mvarFormatTag = (ushort)value; } + } + + + public short ChannelCount + { + get + { + return this.mvarChannelCount; + } + set + { + this.mvarChannelCount = value; + } + } + private int mvarSampleRate = 44100; + public int SampleRate { get { return mvarSampleRate; } set { mvarSampleRate = value; } } + public int DataRate { get { return mvarDataRate; } set { mvarDataRate = value; } } + + public short BlockAlignment + { + get + { + return this.mvarBlockAlignment; + } + set + { + this.mvarBlockAlignment = value; + } + } + + private short mvarBitsPerSample = 16; + public short BitsPerSample { get { return mvarBitsPerSample; } set { mvarBitsPerSample = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioKnownFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioKnownFormat.cs new file mode 100644 index 00000000..10c4f828 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioKnownFormat.cs @@ -0,0 +1,843 @@ +// Based on code found at: +// http://www.koders.com/csharp/fidF004FB228F831C6703D8750BFA87599AA6FD245E.aspx?s=cdef%3Afile +// +// The license for the code is as follows: +// +// WaveFormatEx.cs: +// +// Author: +// Brian Nickel (brian.nickel@gmail.com) +// +// Copyright (C) 2007 Brian Nickel +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License version +// 2.1 as published by the Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public enum WaveformAudioKnownFormat + { + /// + /// Unknown Wave Format + /// + Unknown = 0x0000, + /// + /// PCM Audio + /// + PCM = 0x0001, + /// + /// Microsoft Adaptive PCM Audio + /// + MicrosoftAdaptivePCM = 0x0002, + /// + /// PCM Audio in IEEE floating-point format + /// + IEEEFloatingPointPCM = 0x0003, + /// + /// Compaq VSELP Audio + /// + CompaqVSELP = 0x0004, + /// + /// IBM CVSD Audio + /// + IBMCVSD = 0x0005, + /// + /// Microsoft ALAW Audio + /// + MicrosoftALAW = 0x0006, + /// + /// Microsoft MULAW Audio + /// + MicrosoftMULAW = 0x0007, + /// + /// Microsoft DTS Audio + /// + MicrosoftDTS = 0x0008, + /// + /// Microsoft DRM Encrypted Audio + /// + MicrosoftDRMEncrypted = 0x0009, + /// + /// Microsoft Speech Audio + /// + MicrosoftSpeech = 0x000A, + /// + /// Microsoft Windows Media RT Voice Audio + /// + MicrosoftWindowsMediaRTVoice = 0x000B, + /// + /// OKI ADPCM Audio + /// + OKIADPCM = 0x0010, + /// + /// Intel ADPCM Audio + /// + IntelADPCM = 0x0011, + /// + /// VideoLogic ADPCM Audio + /// + VideoLogicADPCM = 0x0012, + /// + /// Sierra ADPCM Audio + /// + SierraADPCM = 0x0013, + /// + /// Antex ADPCM Audio + /// + AntexADPCM = 0x0014, + /// + /// DSP DIGISTD Audio + /// + DSPDIGISTD = 0x0015, + /// + /// DSP DIGIFIX Audio + /// + DSPDIGIFIX = 0x0016, + /// + /// Dialogic OKI ADPCM Audio + /// + DialogicOKIADPCM = 0x0017, + /// + /// Media Vision ADPCM Audio for Jazz 16 + /// + MediaVisionADPCM = 0x0018, + /// + /// Hewlett-Packard CU Audio + /// + HewlettPackardCU = 0x0019, + /// + /// Hewlett-Packard Dynamic Voice Audio + /// + HewlettPackardDynamicVoice = 0x001A, + /// + /// Yamaha ADPCM Audio + /// + YamahaADPCM = 0x0020, + /// + /// Speech Compression Audio + /// + SpeechCompression = 0x0021, + /// + /// DSP Group True Speech Audio + /// + DSPGroupTrueSpeech = 0x0022, + /// + /// Echo Speech Audio + /// + EchoSpeech = 0x0023, + /// + /// Ahead AF36 Audio + /// + AheadAF36 = 0x0024, + /// + /// Audio Processing Technology Audio + /// + AudioProcessingTechnology = 0x0025, + /// + /// Ahead AF10 Audio + /// + AheadAF10 = 0x0026, + /// + /// Aculab Prosody CTI Speech Card Audio (format 39) + /// + AculabProsodyCTISpeechCard_39 = 0x0027, + /// + /// Merging Technologies LRC Audio + /// + MergingTechnologiesLRC = 0x0028, + /// + /// Dolby AC2 Audio + /// + DolbyAC2 = 0x0030, + /// + /// Microsoft GSM6.10 Audio + /// + MicrosoftGSM610 = 0x0031, + /// + /// Microsoft MSN Audio + /// + MicrosoftMSN = 0x0032, + /// + /// Antex ADPCME Audio + /// + AntexADPCME = 0x0033, + /// + /// Control Resources VQLPC + /// + ControlResourcesVQLPC = 0x0034, + /// + /// DSP REAL Audio + /// + DSPREAL = 0x0035, + /// + /// DSP ADPCM Audio + /// + DSPADPCM = 0x0036, + /// + /// Control Resources CR10 Audio + /// + ControlResourcesCR10 = 0x0037, + /// + /// Natural MicroSystems VBXADPCM Audio + /// + NaturalMicroSystemsVBXADPCM = 0x0038, + /// + /// Roland RDAC Proprietary Audio Format + /// + RolandRDACProprietaryAudioFormat = 0x0039, + /// + /// Echo Speech Proprietary Audio Compression Format + /// + EchoSpeechProprietaryAudioCompressionFormat = 0x003A, + /// + /// Rockwell ADPCM Audio + /// + RockwellADPCM = 0x003B, + /// + /// Rockwell DIGITALK Audio + /// + RockwellDIGITALK = 0x003C, + /// + /// Xebec Proprietary Audio Compression Format + /// + XebecProprietaryAudioCompressionFormat = 0x003D, + /// + /// Antex G721 ADPCM Audio + /// + AntexG721ADPCM = 0x0040, + /// + /// Antex G728 CELP Audio + /// + AntexG728CELP = 0x0041, + /// + /// Microsoft MSG723 Audio + /// + MicrosoftMSG723 = 0x0042, + /// + /// Microsoft MSG723.1 Audio + /// + MicrosoftMSG7231 = 0x0043, + /// + /// Microsoft MSG729 Audio + /// + MicrosoftMSG729 = 0x0044, + /// + /// Microsoft SPG726 Audio + /// + MicrosoftSPG726 = 0x0045, + /// + /// Microsoft MPEG Audio + /// + MicrosoftMPEG = 0x0050, + /// + /// InSoft RT24 Audio + /// + InSoftRT24 = 0x0052, + /// + /// InSoft PAC Audio + /// + InSoftPAC = 0x0053, + /// + /// ISO/MPEG Layer 3 Audio + /// + ISOMPEGLayer3 = 0x0055, + /// + /// Lucent G723 Audio + /// + LucentG723 = 0x0059, + /// + /// Cirrus Logic Audio + /// + CirrusLogic = 0x0060, + /// + /// ESS Technology PCM Audio + /// + ESSTechnologyPCM = 0x0061, + /// + /// Voxware Audio + /// + Voxware = 0x0062, + /// + /// Canopus ATRAC Audio + /// + CanopusATRAC = 0x0063, + /// + /// APICOM G726 ADPCM Audio + /// + APICOMG726ADPCM = 0x0064, + /// + /// APICOM G722 ADPCM Audio + /// + APICOMG722ADPCM = 0x0065, + /// + /// Microsoft DSAT Display Audio + /// + MicrosoftDSATDisplay = 0x0067, + /// + /// Voxware Byte Aligned Audio + /// + VoxwareByteAligned = 0x0069, + /// + /// Voxware AC8 Audio + /// + VoxwareAC8 = 0x0070, + /// + /// Voxware AC10 Audio + /// + VoxwareAC10 = 0x0071, + /// + /// Voxware AC16 Audio + /// + VoxwareAC16 = 0x0072, + /// + /// Voxware AC20 Audio + /// + VoxwareAC20 = 0x0073, + /// + /// Voxware RT24 Audio + /// + VoxwareRT24 = 0x0074, + /// + /// Voxware RT29 Audio + /// + VoxwareRT29 = 0x0075, + /// + /// Voxware RT29HW Audio + /// + VoxwareRT29HW = 0x0076, + /// + /// Voxware VR12 Audio + /// + VoxwareVR12 = 0x0077, + /// + /// Voxware VR18 Audio + /// + VoxwareVR18 = 0x0078, + /// + /// Voxware TQ40 Audio + /// + VoxwareTQ40 = 0x0079, + /// + /// Voxware SC3 Audio (122) + /// + VoxwareSC3_122 = 0x007A, + /// + /// Voxware SC3 Audio (123) + /// + VoxwareSC3_123 = 0x007B, + /// + /// SoftSound Audio + /// + SoftSound = 0x0080, + /// + /// Voxware TQ60 Audio + /// + VoxwareTQ60 = 0x0081, + /// + /// Microsoft RT24 Audio + /// + MicrosoftRT24 = 0x0082, + /// + /// AT&T G729A Audio + /// + ATTG729A = 0x0083, + /// + /// Motion Pixels MVI2 Audio + /// + MotionPixelsMVI2 = 0x0084, + /// + /// Datafusion Systems G726 Audio + /// + DatafusionSystemsG726 = 0x0085, + /// + /// Datafusion Systems G610 Audio + /// + DatafusionSystemsG610 = 0x0086, + /// + /// Iterated Systems Audio + /// + IteratedSystems = 0x0088, + /// + /// OnLive! Audio + /// + OnLive = 0x0089, + /// + /// Multitude FT SX20 Audio + /// + MultitudeFTSX20 = 0x008A, + /// + /// InfoCom ITS ACM G721 Audio + /// + InfoComITSACMG721 = 0x008B, + /// + /// Convedia G729 Audio + /// + ConvediaG729 = 0x008C, + /// + /// Congruency Audio + /// + Congruency = 0x008D, + /// + /// Siemens Business Communications 24 Audio + /// + SiemensBusinessCommunications24 = 0x0091, + /// + /// Sonic Foundary Dolby AC3 Audio + /// + SonicFoundryDolbyAC3 = 0x0092, + /// + /// MediaSonic G723 Audio + /// + MediaSonicG723 = 0x0093, + /// + /// Aculab Prosody CTI Speech Card Audio (format 148) + /// + AculabProsodyCTISpeechCard_148 = 0x0094, + /// + /// ZyXEL ADPCM + /// + ZyXELADPCM = 0x0097, + /// + /// Philips Speech Processing LPCBB Audio + /// + PhilipsSpeechProcessingLPCBB = 0x0098, + /// + /// Studer Professional PACKED Audio + /// + StuderProfessionalPACKED = 0x0099, + /// + /// Malden Electronics Phony Talk Audio + /// + MaldenElectronicsPhonyTalk = 0x00A0, + /// + /// Racal Recorder GSM Audio + /// + RacalRecorderGSM = 0x00A1, + /// + /// Racal Recorder G720.a Audio + /// + RacalRecorderG720a = 0x00A2, + /// + /// Racal G723.1 Audio + /// + RacalG7231 = 0x00A3, + /// + /// Racal Tetra ACELP Audio + /// + RacalTetraACELP = 0x00A4, + /// + /// NEC AAC Audio + /// + NECAAC = 0x00B0, + /// + /// Rhetorex ADPCM Audio + /// + RhetorexADPCM = 0x0100, + /// + /// BeCubed IRAT Audio + /// + BeCubedIRAT = 0x0101, + /// + /// Vivo G723 Audio + /// + VivoG723 = 0x0111, + /// + /// Vivo Siren Audio + /// + VivoSiren = 0x0112, + /// + /// Philips Speech Processing CELP Audio + /// + PhilipsSpeechProcessingCELP = 0x0120, + /// + /// Philips Speech Processing GRUNDIG Audio + /// + PhilipsSpeechProcessingGRUNDIG = 0x0121, + /// + /// Digital Equipment Corporation G723 Audio + /// + DigitalEquipmentCorporationG723 = 0x0123, + /// + /// Sanyo LD-ADPCM Audio + /// + SanyoLDADPCM = 0x0125, + /// + /// Sipro Lab ACELPNET Audio + /// + SiproLabACELPNET = 0x0130, + /// + /// Sipro Lab ACELP4800 Audio + /// + SiproLabACELP4800 = 0x0131, + /// + /// Sipro Lab ACELP8v3 Audio + /// + SiproLabACELP8v3 = 0x0132, + /// + /// Sipro Lab G729 Audio + /// + SiproLabG729 = 0x0133, + /// + /// Sipro Lab G729A Audio + /// + SiproLabG729A = 0x0134, + /// + /// Sipro Lab KELVIN Audio + /// + SiproLabKELVIN = 0x0135, + /// + /// VoiceAge AMR Audio + /// + VoiceAgeAMR = 0x0136, + /// + /// Dictaphone G726 ADPCM Audio + /// + DictaphoneG726ADPCM = 0x0140, + /// + /// Dictaphone CELP68 Audio + /// + DictaphoneCELP68 = 0x0141, + /// + /// Dictaphone CELP54 Audio + /// + DictaphoneCELP54 = 0x0142, + /// + /// QUALCOMM Pure Voice Audio + /// + QUALCOMMPureVoice = 0x0150, + /// + /// QUALCOMM Half Rate Audio + /// + QUALCOMMHalfRate = 0x0151, + /// + /// Ring Zero TUBGSM Audio + /// + RingZeroTUBGSM = 0x0155, + /// + /// Microsoft WMA1 Audio + /// + MicrosoftWMA1 = 0x0160, + /// + /// Microsoft WMA2 Audio + /// + MicrosoftWMA2 = 0x0161, + /// + /// Microsoft Multichannel WMA Audio + /// + MicrosoftWMAMultichannel = 0x0162, + /// + /// Microsoft Lossless WMA Audio + /// + MicrosoftWMALossless = 0x0163, + /// + /// Unisys NAP ADPCM Audio + /// + UnisysNAPADPCM = 0x0170, + /// + /// Unisys NAP ULAW Audio + /// + UnisysNAPULAW = 0x0171, + /// + /// Unisys NAP ALAW Audio + /// + UnisysNAPALAW = 0x0172, + /// + /// Unisys NAP 16K Audio + /// + UnisysNAP16K = 0x0173, + /// + /// SysCom ACM SYC008 Audio + /// + SysComACMSYC008 = 0X0174, + /// + /// SysCom ACM SYC701 G726L Audio + /// + SysComACMSYC701G726L = 0x0175, + /// + /// SysCom ACM SYC701 CELP54 Audio + /// + SysComACMSYC701CELP54 = 0x0176, + /// + /// SysCom ACM SYC701 CELP68 Audio + /// + SysComACMSYC701CELP68 = 0x0177, + /// + /// Knowledge Adventure ADPCM Audio + /// + KnowledgeAdventureADPCM = 0x0178, + /// + /// MPEG2 AAC Audio + /// + MPEG2AAC = 0x0180, + /// + /// Digital Theater Systems DTS DS Audio + /// + DigitalTheaterSystemsDTSDS = 0x0190, + /// + /// Innings ADPCM Audio + /// + InningsADPCM = 0x1979, + /// + /// Creative ADPCM Audio + /// + CreativeADPCM = 0x0200, + /// + /// Creative FastSpeech8 Audio + /// + CreativeFastSpeech8 = 0x0202, + /// + /// Creative FastSpeech10 Audio + /// + CreativeFastSpeech10 = 0x0203, + /// + /// UHER ADPCM Audio + /// + UHERADPCM = 0x0210, + /// + /// Quarterdeck Audio + /// + Quarterdeck = 0x0220, + /// + /// I-Link VC Audio + /// + ILinkVC = 0x0230, + /// + /// Aureal RAW SPORT Audio + /// + AurealRAWSPORT = 0x0240, + /// + /// Interactive Products HSX Audio + /// + InteractiveProductsHSX = 0x0250, + /// + /// Interactive Products RPELP Audio + /// + InteractiveProductsRPELP = 0x0251, + /// + /// Consistens Software CS2 Audio + /// + ConsistensSoftwareCS2 = 0x0260, + /// + /// Sony SCX Audio + /// + SonySCX = 0x0270, + /// + /// Sony SCY Audio + /// + SonySCY = 0x0271, + /// + /// Sony ATRAC3 Audio + /// + SonyATRAC3 = 0x0272, + /// + /// Sony SPC Audio + /// + SonySPC = 0x0273, + /// + /// Telum Audio + /// + Telum = 0x0280, + /// + /// Telum IA Audio + /// + TelumIA = 0x0281, + /// + /// Norcom Voice Systems ADPCM Audio + /// + NorcomVoiceSystemsADPCM = 0x0285, + /// + /// Fujitsu FM TOWNS SND Audio + /// + FujitsuFMTOWNSSND = 0x0300, + /// + /// Unknown Fujitsu Audio (format 769) + /// + UnknownFujitsu_769 = 0x0301, + /// + /// Unknown Fujitsu Audio (format 770) + /// + UnknownFujitsu_770 = 0x0302, + /// + /// Unknown Fujitsu Audio (format 771) + /// + UnknownFujitsu_771 = 0x0303, + /// + /// Unknown Fujitsu Audio (format 772) + /// + UnknownFujitsu_772 = 0x0304, + /// + /// Unknown Fujitsu Audio (format 773) + /// + UnknownFujitsu_773 = 0x0305, + /// + /// Unknown Fujitsu Audio (format 774) + /// + UnknownFujitsu_774 = 0x0306, + /// + /// Unknown Fujitsu Audio (format 775) + /// + UnknownFujitsu_775 = 0x0307, + /// + /// Unknown Fujitsu Audio (format 776) + /// + UnknownFujitsu_776 = 0x0308, + /// + /// Micronas Semiconductors Development Audio + /// + MicronasSemiconductorsDevelopment = 0x0350, + /// + /// Micronas Semiconductors CELP833 Audio + /// + MicronasSemiconductorsCELP833 = 0x0351, + /// + /// Brooktree Digital Audio + /// + BrooktreeDigital = 0x0400, + /// + /// QDesign Audio + /// + QDesign = 0x0450, + /// + /// AT&T VME VMPCM Audio + /// + ATTVMEVMPCM = 0x0680, + /// + /// AT&T TPC Audio + /// + ATTTPC = 0x0681, + /// + /// Ing. C. Olivetti & C., S.p.A. GSM Audio + /// + OlivettiGSM = 0x1000, + /// + /// Ing. C. Olivetti & C., S.p.A. ADPCM Audio + /// + OlivettiADPCM = 0x1001, + /// + /// Ing. C. Olivetti & C., S.p.A. CELP Audio + /// + OlivettiCELP = 0x1002, + /// + /// Ing. C. Olivetti & C., S.p.A. SBC Audio + /// + OlivettiSBC = 0x1003, + /// + /// Ing. C. Olivetti & C., S.p.A. OPR Audio + /// + OlivettiOPR = 0x1004, + /// + /// Lernout & Hauspie Audio + /// + LernoutHauspie = 0x1100, + /// + /// Lernout & Hauspie CELP Audio + /// + LernoutHauspieCELP = 0x1101, + /// + /// Lernout & Hauspie SB8 Audio + /// + LernoutHauspieSB8 = 0x1102, + /// + /// Lernout & Hauspie SB12 Audio + /// + LernoutHauspieSB12 = 0x1103, + /// + /// Lernout & Hauspie SB16 Audio + /// + LernoutHauspieSB16 = 0x1104, + /// + /// Norris Audio + /// + Norris = 0x1400, + /// + /// AT&T Soundspace Musicompress Audio + /// + ATTSoundspaceMusicompress = 0x1500, + /// + /// Sonic Foundry Lossless Audio + /// + SonicFoundryLossless = 0x1971, + /// + /// FAST Multimedia DVM Audio + /// + FASTMultimediaDVM = 0x2000, + /// + /// Divio AAC + /// + DivioAAC = 0x4143, + /// + /// Nokia Adaptive Multirate Audio + /// + NokiaAdaptiveMultirate = 0x4201, + /// + /// Divio G726 Audio + /// + DivioG726 = 0x4243, + /// + /// 3Com NBX Audio + /// + ThreeComNBX = 0x7000, + /// + /// Microsoft Adaptive Multirate Audio + /// + MicrosoftAdaptiveMultirate = 0x7A21, + /// + /// Microsoft Adaptive Multirate Audio with silence detection + /// + MicrosoftAdaptiveMultirateSilenceDetect = 0x7A22, + /// + /// Comverse Infosys G723 1 Audio + /// + ComverseInfosysG7231 = 0xA100, + /// + /// Comverse Infosys AVQSBC Audio + /// + ComverseInfosysAVQSBC = 0xA101, + /// + /// Comverse Infosys OLDSBC Audio + /// + ComverseInfosysOLDSBC = 0xA102, + /// + /// Symbol Technology G729A Audio + /// + SymbolTechnologyG729A = 0xA103, + /// + /// VoiceAge AMR WB Audio + /// + VoiceAgeAMRWB = 0xA104, + /// + /// Ingenient G726 Audio + /// + IngenientG726 = 0xA105, + /// + /// ISO/MPEG-4 Advanced Audio Coding + /// + ISOMPEG4AdvancedAudioCoding = 0xA106, + /// + /// Encore G726 Audio + /// + EncoreG726 = 0xA107, + /// + /// Extensible or custom format. + /// + /// When the format is WAVE_FORMAT_EXTENSIBLE (0xFFFE or 65534) then one should refer to the sub format for how to read the WAV. + Extensible = 0xFFFE + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioObjectModel.cs new file mode 100644 index 00000000..aff59177 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Audio/Waveform/WaveformAudioObjectModel.cs @@ -0,0 +1,100 @@ +using System; +using UniversalEditor.ObjectModels.PropertyList; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public class WaveformAudioObjectModel : AudioObjectModel + { + public override ObjectModelReference MakeReference() + { + ObjectModelReference omr = base.MakeReference(); + omr.Title = "Waveform (raw) audio"; + omr.Path = new string[] { "Multimedia", "Audio", "Waveform Audio" }; + return omr; + } + + private WaveformAudioHeader mvarHeader = new WaveformAudioHeader(); + private WaveformAudioExtendedHeader mvarExtendedHeader = new WaveformAudioExtendedHeader(); + private byte[] mvarRawData = null; + private short[] mvarRawSamples = new short[0]; + public WaveformAudioHeader Header + { + get + { + return this.mvarHeader; + } + } + public WaveformAudioExtendedHeader ExtendedHeader + { + get + { + return this.mvarExtendedHeader; + } + } + public byte[] RawData + { + get + { + return this.mvarRawData; + } + set + { + this.mvarRawData = value; + } + } + public short[] RawSamples + { + get + { + return this.mvarRawSamples; + } + set + { + this.mvarRawSamples = value; + } + } + public override void CopyTo(ObjectModel destination) + { + WaveformAudioObjectModel clone = destination as WaveformAudioObjectModel; + clone.ExtendedHeader.ChannelMask = this.mvarExtendedHeader.ChannelMask; + clone.ExtendedHeader.Enabled = this.mvarExtendedHeader.Enabled; + clone.ExtendedHeader.SubFormatGUID = this.mvarExtendedHeader.SubFormatGUID; + clone.ExtendedHeader.ValidBitsPerSample = this.mvarExtendedHeader.ValidBitsPerSample; + clone.Header.BitsPerSample = this.mvarHeader.BitsPerSample; + clone.Header.BlockAlignment = this.mvarHeader.BlockAlignment; + clone.Header.ChannelCount = this.mvarHeader.ChannelCount; + clone.Header.DataRate = this.mvarHeader.DataRate; + clone.Header.FormatTag = this.mvarHeader.FormatTag; + clone.Header.SampleRate = this.mvarHeader.SampleRate; + clone.RawData = (this.mvarRawData.Clone() as byte[]); + clone.RawSamples = (this.mvarRawSamples.Clone() as short[]); + + clone.Information.AlbumTitle = (Information.AlbumTitle.Clone() as string); + clone.Information.Comments = (Information.Comments.Clone() as string); + clone.Information.Creator = (Information.Creator.Clone() as string); + foreach (Property property in Information.CustomProperties) + { + clone.Information.CustomProperties.Add(property.Clone() as Property); + } + clone.Information.DateCreated = Information.DateCreated; + clone.Information.FadeOutDelay = Information.FadeOutDelay; + clone.Information.FadeOutLength = Information.FadeOutLength; + clone.Information.GeneratorAuthor = (Information.GeneratorAuthor.Clone() as string); + clone.Information.GeneratorTitle = (Information.GeneratorTitle.Clone() as string); + clone.Information.GeneratorVersion = (Information.GeneratorVersion.Clone() as Version); + clone.Information.Genre = (Information.Genre.Clone() as string); + clone.Information.SongArtist = (Information.SongArtist.Clone() as string); + clone.Information.SongTitle = (Information.SongTitle.Clone() as string); + clone.Information.TrackNumber = Information.TrackNumber; + } + public override void Clear() + { + mvarRawData = new byte[0]; + mvarHeader = new WaveformAudioHeader(); + mvarExtendedHeader = new WaveformAudioExtendedHeader(); + + Information.Clear(); + + mvarRawSamples = new short[0]; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModel.cs new file mode 100644 index 00000000..f00a32c6 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModel.cs @@ -0,0 +1,9 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio +{ + public abstract class AudioObjectModel : ObjectModel + { + private AudioObjectModelInformation mvarInformation = new AudioObjectModelInformation(); + public AudioObjectModelInformation Information { get { return mvarInformation; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelDocumentProperties.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelDocumentProperties.cs new file mode 100644 index 00000000..395d3b7d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelDocumentProperties.cs @@ -0,0 +1,139 @@ +using System; +namespace UniversalEditor.Plugins.Multimedia.ObjectModels.Audio +{ + public class AudioObjectModelDocumentProperties + { + private string mvarSongTitle = string.Empty; + private string mvarAlbumTitle = string.Empty; + private string mvarCreator = string.Empty; + private string mvarComments = string.Empty; + private DateTime mvarDateCreated = DateTime.Now; + private int mvarFadeOutDelay = 0; + private int mvarFadeOutLength = 0; + private string mvarSongArtist = string.Empty; + private string mvarGeneratorTitle = string.Empty; + private string mvarGeneratorAuthor = string.Empty; + private Version mvarGeneratorVersion = new Version(1, 0, 0, 0); + public string SongTitle + { + get + { + return this.mvarSongTitle; + } + set + { + this.mvarSongTitle = value; + } + } + public string AlbumTitle + { + get + { + return this.mvarAlbumTitle; + } + set + { + this.mvarAlbumTitle = value; + } + } + public string Creator + { + get + { + return this.mvarCreator; + } + set + { + this.mvarCreator = value; + } + } + public string Comments + { + get + { + return this.mvarComments; + } + set + { + this.mvarComments = value; + } + } + public DateTime DateCreated + { + get + { + return this.mvarDateCreated; + } + set + { + this.mvarDateCreated = value; + } + } + public int FadeOutDelay + { + get + { + return this.mvarFadeOutDelay; + } + set + { + this.mvarFadeOutDelay = value; + } + } + public int FadeOutLength + { + get + { + return this.mvarFadeOutLength; + } + set + { + this.mvarFadeOutLength = value; + } + } + public string SongArtist + { + get + { + return this.mvarSongArtist; + } + set + { + this.mvarSongArtist = value; + } + } + public string GeneratorTitle + { + get + { + return this.mvarGeneratorTitle; + } + set + { + this.mvarGeneratorTitle = value; + } + } + public string GeneratorAuthor + { + get + { + return this.mvarGeneratorAuthor; + } + set + { + this.mvarGeneratorAuthor = value; + } + } + public Version GeneratorVersion + { + get + { + return this.mvarGeneratorVersion; + } + set + { + this.mvarGeneratorVersion = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelInformation.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelInformation.cs new file mode 100644 index 00000000..304b6725 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/AudioObjectModelInformation.cs @@ -0,0 +1,134 @@ +using System; +using UniversalEditor.ObjectModels.PropertyList; +namespace UniversalEditor.ObjectModels.Multimedia.Audio +{ + public class AudioObjectModelInformation + { + private string mvarSongTitle = string.Empty; + private string mvarAlbumTitle = string.Empty; + private string mvarCreator = string.Empty; + private string mvarComments = string.Empty; + private DateTime mvarDateCreated = DateTime.Now; + private int mvarFadeOutDelay = 0; + private int mvarFadeOutLength = 0; + private string mvarSongArtist = string.Empty; + private string mvarGeneratorTitle = string.Empty; + private string mvarGeneratorAuthor = string.Empty; + private Version mvarGeneratorVersion = new Version(1, 0, 0, 0); + public string SongTitle + { + get + { + return this.mvarSongTitle; + } + set + { + this.mvarSongTitle = value; + } + } + public string AlbumTitle + { + get + { + return this.mvarAlbumTitle; + } + set + { + this.mvarAlbumTitle = value; + } + } + public string Creator + { + get + { + return this.mvarCreator; + } + set + { + this.mvarCreator = value; + } + } + public string Comments + { + get + { + return this.mvarComments; + } + set + { + this.mvarComments = value; + } + } + public DateTime DateCreated + { + get + { + return this.mvarDateCreated; + } + set + { + this.mvarDateCreated = value; + } + } + public int FadeOutDelay + { + get + { + return this.mvarFadeOutDelay; + } + set + { + this.mvarFadeOutDelay = value; + } + } + public int FadeOutLength + { + get + { + return this.mvarFadeOutLength; + } + set + { + this.mvarFadeOutLength = value; + } + } + public string SongArtist + { + get + { + return this.mvarSongArtist; + } + set + { + this.mvarSongArtist = value; + } + } + + private string mvarGenre = String.Empty; + public string Genre { get { return mvarGenre; } set { mvarGenre = value; } } + + private int mvarTrackNumber = -1; + public int TrackNumber { get { return mvarTrackNumber; } set { mvarTrackNumber = value; } } + + private Property.PropertyCollection mvarCustomProperties = new Property.PropertyCollection(); + public Property.PropertyCollection CustomProperties { get { return mvarCustomProperties; } } + + public void Clear() + { + mvarAlbumTitle = String.Empty; + mvarComments = String.Empty; + mvarCreator = String.Empty; + mvarCustomProperties.Clear(); + mvarDateCreated = DateTime.Now; + mvarFadeOutDelay = 0; + mvarFadeOutLength = 0; + mvarGeneratorAuthor = String.Empty; + mvarGeneratorTitle = String.Empty; + mvarGeneratorVersion = new Version(1, 0, 0, 0); + mvarGenre = String.Empty; + mvarSongArtist = String.Empty; + mvarSongTitle = String.Empty; + mvarTrackNumber = -1; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Project/AudioProjectObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Project/AudioProjectObjectModel.cs new file mode 100644 index 00000000..a98cb7e8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Project/AudioProjectObjectModel.cs @@ -0,0 +1,21 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Project +{ + public class AudioProjectObjectModel : ObjectModel + { + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Audio project"; + omr.Path = new string[] { "Multimedia", "Audio", "Audio Project" }; + return omr; + } + public override void Clear() + { + } + public override void CopyTo(ObjectModel destination) + { + AudioProjectObjectModel clone = destination as AudioProjectObjectModel; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Soundfont/SoundfontObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Soundfont/SoundfontObjectModel.cs new file mode 100644 index 00000000..d34052b8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Soundfont/SoundfontObjectModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Soundfont +{ + public class SoundfontObjectModel : ObjectModel + { + public override void Clear() + { + } + public override void CopyTo(ObjectModel where) + { + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommand.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommand.cs new file mode 100644 index 00000000..b5333e42 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommand.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.ObjectModel; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommand : ICloneable + { + public class SynthesizedAudioCommandCollection : Collection + { + public SynthesizedAudioCommandRest Add(double length) + { + SynthesizedAudioCommandRest rest = new SynthesizedAudioCommandRest(); + rest.Length = length; + + base.Add(rest); + return rest; + } + public SynthesizedAudioCommandNote Add(SynthesizedAudioPredefinedNote note, double length, int octave, float volume) + { + SynthesizedAudioCommandNote command = new SynthesizedAudioCommandNote(); + command.Length = length; + command.Frequency = SynthesizedAudioPredefinedNoteConverter.GetFrequency(note, octave); + + base.Add(command); + return command; + } + + + } + public virtual object Clone() + { + return base.MemberwiseClone(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandNote.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandNote.cs new file mode 100644 index 00000000..b8add6b5 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandNote.cs @@ -0,0 +1,286 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandNote : SynthesizedAudioCommand + { + private bool mvarProtected = false; + private int mvarPosition = 0; + private string mvarPhoneme = null; + private string mvarLyric = null; + private double mvarFrequency = 0; + private int mvarPreUtterance = 0; + private int mvarVoiceOverlap = 0; + private int mvarIntensity = 0; + private int mvarModulation = 0; + private int mvarPBType = 0; + private double[] mvarPitches = new double[0]; + private string[] mvarEnvelope = new string[0]; + private double[] mvarVBR = new double[0]; + private int mvarAccent = 50; + private int mvarPitchBendDepth = 8; + private int mvarPitchBendLength = 0; + private int mvarDecay = 50; + private bool mvarPortamentoFalling = false; + private int mvarOpening = 127; + private bool mvarPortamentoRising = false; + private int mvarVibratoLength = 0; + private SynthesizedAudioVibratoType mvarVibratoType = SynthesizedAudioVibratoType.None; + public bool Protected + { + get + { + return this.mvarProtected; + } + set + { + this.mvarProtected = value; + } + } + public int Position + { + get + { + return this.mvarPosition; + } + set + { + this.mvarPosition = value; + } + } + private double mvarLength = 0; + public double Length + { + get { return mvarLength; } + set { mvarLength = value; } + } + public string Phoneme + { + get { return mvarPhoneme; } + set { mvarPhoneme = value; } + } + public string Lyric + { + get { return mvarLyric; } + set { mvarLyric = value; } + } + public double Frequency + { + get + { + return this.mvarFrequency; + } + set + { + this.mvarFrequency = value; + } + } + public int PreUtterance + { + get + { + return this.mvarPreUtterance; + } + set + { + this.mvarPreUtterance = value; + } + } + public int VoiceOverlap + { + get + { + return this.mvarVoiceOverlap; + } + set + { + this.mvarVoiceOverlap = value; + } + } + public int Intensity + { + get + { + return this.mvarIntensity; + } + set + { + this.mvarIntensity = value; + } + } + public int Modulation + { + get + { + return this.mvarModulation; + } + set + { + this.mvarModulation = value; + } + } + public int PBType + { + get + { + return this.mvarPBType; + } + set + { + this.mvarPBType = value; + } + } + public double[] Pitches + { + get + { + return this.mvarPitches; + } + set + { + this.mvarPitches = value; + } + } + public string[] Envelope + { + get + { + return this.mvarEnvelope; + } + set + { + this.mvarEnvelope = value; + } + } + public double[] VBR + { + get + { + return this.mvarVBR; + } + set + { + this.mvarVBR = value; + } + } + public int Accent + { + get + { + return this.mvarAccent; + } + set + { + this.mvarAccent = value; + } + } + public int PitchBendDepth + { + get + { + return this.mvarPitchBendDepth; + } + set + { + this.mvarPitchBendDepth = value; + } + } + public int PitchBendLength + { + get + { + return this.mvarPitchBendLength; + } + set + { + this.mvarPitchBendLength = value; + } + } + public int Decay + { + get + { + return this.mvarDecay; + } + set + { + this.mvarDecay = value; + } + } + public bool PortamentoFalling + { + get + { + return this.mvarPortamentoFalling; + } + set + { + this.mvarPortamentoFalling = value; + } + } + public int Opening + { + get + { + return this.mvarOpening; + } + set + { + this.mvarOpening = value; + } + } + public bool PortamentoRising + { + get + { + return this.mvarPortamentoRising; + } + set + { + this.mvarPortamentoRising = value; + } + } + public int VibratoLength + { + get + { + return this.mvarVibratoLength; + } + set + { + this.mvarVibratoLength = value; + } + } + public SynthesizedAudioVibratoType VibratoType + { + get + { + return this.mvarVibratoType; + } + set + { + this.mvarVibratoType = value; + } + } + public override object Clone() + { + return new SynthesizedAudioCommandNote + { + Envelope = this.mvarEnvelope.Clone() as string[], + Intensity = this.mvarIntensity, + Length = this.mvarLength, + Lyric = this.mvarLyric, + Modulation = this.mvarModulation, + PBType = this.mvarPBType, + Phoneme = this.mvarPhoneme, + Pitches = this.mvarPitches.Clone() as double[], + PortamentoFalling = this.mvarPortamentoFalling, + PortamentoRising = this.mvarPortamentoRising, + PreUtterance = this.mvarPreUtterance, + Protected = this.mvarProtected, + Frequency = this.mvarFrequency, + VBR = this.mvarVBR.Clone() as double[], + VoiceOverlap = this.mvarVoiceOverlap + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandRest.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandRest.cs new file mode 100644 index 00000000..2411b5d8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandRest.cs @@ -0,0 +1,7 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandRest : SynthesizedAudioCommandNote + { + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTempo.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTempo.cs new file mode 100644 index 00000000..f3490dc5 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTempo.cs @@ -0,0 +1,37 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandTempo : SynthesizedAudioCommand + { + private double mvarTempo = 0.0; + public double Tempo + { + get + { + return this.mvarTempo; + } + set + { + this.mvarTempo = value; + } + } + public SynthesizedAudioCommandTempo() + { + } + public SynthesizedAudioCommandTempo(double tempo) + { + this.mvarTempo = tempo; + } + public override string ToString() + { + return "MM = " + this.mvarTempo.ToString() + " BPM"; + } + public override object Clone() + { + return new SynthesizedAudioCommandTempo + { + Tempo = this.mvarTempo + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandText.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandText.cs new file mode 100644 index 00000000..b8adde07 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandText.cs @@ -0,0 +1,37 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandText : SynthesizedAudioCommand + { + private string mvarText = string.Empty; + public string Text + { + get + { + return this.mvarText; + } + set + { + this.mvarText = value; + } + } + public SynthesizedAudioCommandText() + { + } + public SynthesizedAudioCommandText(string text) + { + this.mvarText = text; + } + public override string ToString() + { + return "\"" + this.mvarText + "\""; + } + public override object Clone() + { + return new SynthesizedAudioCommandText + { + Text = this.mvarText.Clone() as string + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs new file mode 100644 index 00000000..327d55ed --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioCommandTimeSignature.cs @@ -0,0 +1,87 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioCommandTimeSignature : SynthesizedAudioCommand + { + private byte mvarNumerator = 0; + private byte mvarDenominator = 0; + private byte mvarTicksPerMetronomeClick = 0; + private byte mvarNumberOf32ndNotesPerQuarterNote = 0; + public byte Numerator + { + get + { + return this.mvarNumerator; + } + set + { + this.mvarNumerator = value; + } + } + public byte Denominator + { + get + { + return this.mvarDenominator; + } + set + { + this.mvarDenominator = value; + } + } + public byte TicksPerMetronomeClick + { + get + { + return this.mvarTicksPerMetronomeClick; + } + set + { + this.mvarTicksPerMetronomeClick = value; + } + } + public byte NumberOf32ndNotesPerQuarterNote + { + get + { + return this.mvarNumberOf32ndNotesPerQuarterNote; + } + set + { + this.mvarNumberOf32ndNotesPerQuarterNote = value; + } + } + public SynthesizedAudioCommandTimeSignature() + { + } + public SynthesizedAudioCommandTimeSignature(byte numerator, byte denominator, byte ticksPerMetronomeClick, byte numberOf32ndNotesPerQuarterNote) + { + this.mvarNumerator = numerator; + this.mvarDenominator = denominator; + this.mvarTicksPerMetronomeClick = ticksPerMetronomeClick; + this.mvarNumberOf32ndNotesPerQuarterNote = numberOf32ndNotesPerQuarterNote; + } + public override string ToString() + { + return string.Concat(new string[] + { + "TS = ", + this.mvarNumerator.ToString(), + "/", + this.mvarDenominator.ToString(), + "; ♪ = ", + this.mvarNumberOf32ndNotesPerQuarterNote.ToString() + }); + } + public override object Clone() + { + return new SynthesizedAudioCommandTimeSignature + { + Denominator = this.mvarDenominator, + NumberOf32ndNotesPerQuarterNote = this.mvarNumberOf32ndNotesPerQuarterNote, + Numerator = this.mvarNumerator, + TicksPerMetronomeClick = this.mvarTicksPerMetronomeClick + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioObjectModel.cs new file mode 100644 index 00000000..17e5fd55 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioObjectModel.cs @@ -0,0 +1,47 @@ +using System; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioObjectModel : AudioObjectModel + { + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Synthesized audio sequence"; + omr.Path = new string[] { "Multimedia", "Audio", "Synthesized Audio" }; + return omr; + } + + private short mvarChannelCount = 2; + public short ChannelCount { get { return mvarChannelCount; } set { mvarChannelCount = value; } } + + private string mvarName = string.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private double mvarTempo = 120.0; + public double Tempo { get { return mvarTempo; } set { mvarTempo = value; } } + + private SynthesizedAudioTrack.SynthesizedAudioTrackCollection mvarTracks = new SynthesizedAudioTrack.SynthesizedAudioTrackCollection(); + public SynthesizedAudioTrack.SynthesizedAudioTrackCollection Tracks { get { return mvarTracks; } } + + private VoicebankObjectModel.VoicebankObjectModelCollection mvarVoices = new VoicebankObjectModel.VoicebankObjectModelCollection(); + public VoicebankObjectModel.VoicebankObjectModelCollection Voices { get { return mvarVoices; } } + + public override void CopyTo(ObjectModel destination) + { + SynthesizedAudioObjectModel clone = destination as SynthesizedAudioObjectModel; + clone.Name = (this.mvarName.Clone() as string); + clone.Tempo = this.mvarTempo; + foreach (SynthesizedAudioTrack track in this.mvarTracks) + { + clone.Tracks.Add(track.Clone() as SynthesizedAudioTrack); + } + } + public override void Clear() + { + this.mvarName = string.Empty; + this.mvarTempo = 120.0; + this.mvarTracks.Clear(); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs new file mode 100644 index 00000000..926ae631 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioPredefinedNote.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public enum SynthesizedAudioPredefinedNote + { + A = 0, + ASharp, + BFlat = ASharp, + B, + C, + CSharp, + DFlat = CSharp, + D, + DSharp, + EFlat = DSharp, + E, + F, + FSharp, + GFlat = FSharp, + G, + GSharp, + AFlat = GSharp + } + public static class SynthesizedAudioPredefinedNoteConverter + { + public static double GetFrequency(SynthesizedAudioPredefinedNote note, int octave) + { + return GetFrequency((int)note, octave); + } + public static double GetFrequency(int note, int octave) + { + return GetFrequency(note + ((octave - 4) * 12)); + } + public static double GetFrequency(int note) + { + /* + C5 = the C an octave above middle C. This is 3 half steps above A4 and so the frequency is + f3 = 440 * (1.059463..)^3 = 523.3 Hz + If your calculator does not have the ability to raise to powers, then use the fact that + (1.059463..)3 = (1.059463..)*(1.059463..)*(1.059463..) + That is, you multiply it by itself 3 times. + + Middle C is 9 half steps below A4 and the frequency is: + f -9 = 440 * (1.059463..)-9 = 261.6 Hz + If you don't have powers on your calculator, remember that the negative sign on the power means you divide instead of multiply. For this example, you divide by (1.059463..) 9 times. + */ + + double d = Math.Pow(2, (double)1 / 12); + int halfSteps = note; + double value = 440 * Math.Pow(d, halfSteps); + return value; + } + + public static int GetNote(double frequency) + { + double d = Math.Pow(2, (double)1 / 12); + double halfSteps = Math.Pow(frequency / 440, (1 / d)); + int note = (int)Math.Round((halfSteps - 1) * 12) + 1; + return note; + } + + public static double ChangeFrequency(double oldFrequency, int detuneBy) + { + if (detuneBy == 0) return oldFrequency; + + int note = GetNote(oldFrequency); + double freq = GetFrequency(note + detuneBy); + return freq; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioStylePlugin.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioStylePlugin.cs new file mode 100644 index 00000000..8fdb6f13 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioStylePlugin.cs @@ -0,0 +1,43 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioStylePlugin + { + private Guid mvarID = Guid.Empty; + private string mvarName = string.Empty; + private Version mvarVersion = new Version(1, 0); + public Guid ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public Version Version + { + get + { + return this.mvarVersion; + } + set + { + this.mvarVersion = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioTrack.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioTrack.cs new file mode 100644 index 00000000..ddcb9766 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioTrack.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public class SynthesizedAudioTrack : ICloneable + { + public class SynthesizedAudioTrackCollection : Collection + { + private Dictionary tracksByID = new Dictionary(); + public SynthesizedAudioTrack this[string ID] + { + get + { + SynthesizedAudioTrack result; + if (this.tracksByID.ContainsKey(ID)) + { + result = this.tracksByID[ID]; + } + else + { + result = null; + } + return result; + } + } + public new void Add(SynthesizedAudioTrack item) + { + if (!string.IsNullOrEmpty(item.Name)) + { + this.tracksByID.Add(item.Name, item); + } + base.Add(item); + } + } + private string mvarID = string.Empty; + private string mvarName = string.Empty; + private string mvarComment = string.Empty; + private SynthesizedAudioCommand.SynthesizedAudioCommandCollection mvarCommands = new SynthesizedAudioCommand.SynthesizedAudioCommandCollection(); + private VoicebankObjectModel mvarSynthesizer = null; + private bool mvarIsMuted = false; + private bool mvarIsSolo = false; + private byte mvarPanpot = 64; + private byte mvarVolume = 0; + public string ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public string Name + { + get + { + return this.mvarName; + } + set + { + this.mvarName = value; + } + } + public string Comment + { + get + { + return this.mvarComment; + } + set + { + this.mvarComment = value; + } + } + public SynthesizedAudioCommand.SynthesizedAudioCommandCollection Commands + { + get + { + return this.mvarCommands; + } + } + public VoicebankObjectModel Synthesizer + { + get + { + return this.mvarSynthesizer; + } + set + { + this.mvarSynthesizer = value; + } + } + public bool IsMuted + { + get + { + return this.mvarIsMuted; + } + set + { + this.mvarIsMuted = value; + } + } + public bool IsSolo + { + get + { + return this.mvarIsSolo; + } + set + { + this.mvarIsSolo = value; + } + } + public byte Panpot + { + get + { + return this.mvarPanpot; + } + set + { + this.mvarPanpot = value; + } + } + public byte Volume + { + get + { + return this.mvarVolume; + } + set + { + this.mvarVolume = value; + } + } + public object Clone() + { + SynthesizedAudioTrack clone = new SynthesizedAudioTrack(); + foreach (SynthesizedAudioCommand command in this.mvarCommands) + { + clone.Commands.Add(command.Clone() as SynthesizedAudioCommand); + } + clone.ID = (this.mvarID.Clone() as string); + clone.Name = (this.mvarName.Clone() as string); + return clone; + } + + private double mvarTempo = 120; + public double Tempo { get { return mvarTempo; } set { mvarTempo = value; } } + + private Color mvarColor = Color.Empty; + public Color Color { get { return mvarColor; } set { mvarColor = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioVibratoType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioVibratoType.cs new file mode 100644 index 00000000..5836948b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Synthesized/SynthesizedAudioVibratoType.cs @@ -0,0 +1,8 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized +{ + public enum SynthesizedAudioVibratoType + { + None + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs new file mode 100644 index 00000000..381f9b07 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/Phoneme.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class Phoneme : ICloneable + { + public class PhonemeCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + public object Clone() + { + Phoneme clone = new Phoneme(); + clone.Title = (mvarTitle.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs new file mode 100644 index 00000000..95c77bc1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/PhonemeGroup.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class PhonemeGroup : ICloneable + { + public class PhonemeGroupCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private Phoneme.PhonemeCollection mvarPhonemes = new Phoneme.PhonemeCollection(); + public Phoneme.PhonemeCollection Phonemes { get { return mvarPhonemes; } } + + public object Clone() + { + PhonemeGroup clone = new PhonemeGroup(); + clone.Title = (mvarTitle.Clone() as string); + foreach (Phoneme p in mvarPhonemes) + { + clone.Phonemes.Add(p); + } + return clone; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs new file mode 100644 index 00000000..7710ccdb --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankObjectModel.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class VoicebankObjectModel : ObjectModel + { + public class VoicebankObjectModelCollection : Collection + { + } + + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Synthesized audio voice bank"; + _omr.Path = new string[] { "Multimedia", "Audio", "Voicebank" }; + } + return _omr; + } + + public override void Clear() + { + mvarBankSelect = 0; + mvarCreatorVersion = new Version(1, 0); + mvarID = String.Empty; + mvarInstallationPath = String.Empty; + mvarProgramChange = 0; + mvarSamples.Clear(); + mvarSynthesisParameters.Clear(); + } + + private int mvarBankSelect = 0; + public int BankSelect { get { return mvarBankSelect; } set { mvarBankSelect = value; } } + + private int mvarProgramChange = 0; + public int ProgramChange { get { return mvarProgramChange; } set { mvarProgramChange = value; } } + + private string mvarID = string.Empty; + public string ID { get { return mvarID; } set { mvarID = value; } } + + private PhonemeGroup.PhonemeGroupCollection mvarPhonemeGroups = new PhonemeGroup.PhonemeGroupCollection(); + public PhonemeGroup.PhonemeGroupCollection PhonemeGroups { get { return mvarPhonemeGroups; } } + + private VoicebankSynthesisParameters mvarSynthesisParameters = new VoicebankSynthesisParameters(); + public VoicebankSynthesisParameters SynthesisParameters { get { return mvarSynthesisParameters; } } + + private VoicebankSample.VoicebankSampleCollection mvarSamples = new VoicebankSample.VoicebankSampleCollection(); + public VoicebankSample.VoicebankSampleCollection Samples { get { return mvarSamples; } } + + private Version mvarCreatorVersion = new Version(1, 0); + public Version CreatorVersion { get { return mvarCreatorVersion; } set { mvarCreatorVersion = value; } } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private string mvarInstallationPath = string.Empty; + public string InstallationPath { get { return mvarInstallationPath; } set { mvarInstallationPath = value; } } + + public override void CopyTo(ObjectModel destination) + { + VoicebankObjectModel clone = (destination as VoicebankObjectModel); + if (clone == null) return; + + foreach (VoicebankSample phoneme in this.mvarSamples) + { + if (!clone.Samples.Contains(phoneme.Name)) clone.Samples.Add(phoneme.Clone() as VoicebankSample); + } + clone.CreatorVersion = (this.mvarCreatorVersion.Clone() as Version); + clone.InstallationPath = this.mvarInstallationPath; + } + + public VoicebankSample GetSampleFromPhoneme(string phoneme, double frequency) + { + foreach (VoicebankSample sample in mvarSamples) + { + if ((sample.Phoneme == phoneme) && (sample.MaximumFrequency == -1 || frequency < sample.MaximumFrequency) && (sample.MinimumFrequency == -1 || frequency > sample.MinimumFrequency)) + { + return sample; + } + } + return null; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSample.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSample.cs new file mode 100644 index 00000000..63acf275 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSample.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using UniversalEditor.ObjectModels.Multimedia.Audio.Waveform; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class VoicebankSample : ICloneable + { + public class VoicebankSampleCollection : Collection + { + private Dictionary phonemesByName = new Dictionary(); + public VoicebankSample this[string Name] { get { return phonemesByName[Name]; } } + + public VoicebankSample Add(string Name, byte[] data) + { + VoicebankSample vp = new VoicebankSample(); + vp.Name = Name; + vp.Data = data; + this.Add(vp); + return vp; + } + public bool Contains(string Name) + { + return this.phonemesByName.ContainsKey(Name); + } + protected override void InsertItem(int index, VoicebankSample item) + { + base.InsertItem(index, item); + if (!this.phonemesByName.ContainsKey(item.Name)) + { + this.phonemesByName.Add(item.Name, item); + } + } + } + + private string mvarName = string.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private int mvarFrequency = 0; + /// + /// The frequency at which this sample was recorded. Used to pitch-shift the sample. + /// + public int Frequency { get { return mvarFrequency; } set { mvarFrequency = value; } } + + private short mvarChannelCount = 0; + public short ChannelCount { get { return mvarChannelCount; } set { mvarChannelCount = value; } } + private int mvarDummy = 0; + public int Dummy { get { return mvarDummy; } set { mvarDummy = value; } } + + + private WaveformAudioObjectModel mvarWaveform = null; + /// + /// The waveform audio data for this sample. + /// + public WaveformAudioObjectModel Waveform { get { return mvarWaveform; } set { mvarWaveform = value; } } + + private int mvarMaximumFrequency = -1; // 440? + /// + /// The maximum frequency in which to use this particular sample. + /// + /// To use the sample for exactly one note, ensure that both MaximumFrequency and MinimumFrequency are set to the same value, matching the desired note's frequency. + public int MaximumFrequency { get { return mvarMaximumFrequency; } set { mvarMaximumFrequency = value; } } + private int mvarMinimumFrequency = -1; // 440? + /// + /// The maximum frequency in which to use this particular sample. + /// + /// To use the sample for exactly one note, ensure that both MaximumFrequency and MinimumFrequency are set to the same value, matching the desired note's frequency. + public int MinimumFrequency { get { return mvarMinimumFrequency; } set { mvarMinimumFrequency = value; } } + + private string mvarPhoneme = null; + /// + /// The phoneme that is represented by this sample. May be null for non-vocal samples. + /// + public string Phoneme { get { return mvarPhoneme; } set { mvarPhoneme = value; } } + + + private byte[] mvarData = new byte[0]; + public byte[] Data { get { return mvarData; } set { mvarData = value; } } + + private string mvarFileName = string.Empty; + public string FileName + { + get { return mvarFileName; } + set { mvarFileName = value; } + } + public object Clone() + { + return new VoicebankSample + { + Name = this.mvarName, + FileName = this.mvarFileName, + Data = this.mvarData + }; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSynthesisParameters.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSynthesisParameters.cs new file mode 100644 index 00000000..7a73ebe1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Voicebank/VoicebankSynthesisParameters.cs @@ -0,0 +1,30 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank +{ + public class VoicebankSynthesisParameters + { + private byte mvarBreathiness = 0; + public byte Breathiness { get { return mvarBreathiness; } set { mvarBreathiness = value; } } + + private byte mvarBrightness = 0; + public byte Brightness { get { return mvarBrightness; } set { mvarBrightness = value; } } + + private byte mvarClearness = 0; + public byte Clearness { get { return mvarClearness; } set { mvarClearness = value; } } + + private byte mvarGenderFactor = 0; + public byte GenderFactor { get { return mvarGenderFactor; } set { mvarGenderFactor = value; } } + + private byte mvarOpenness = 0; + public byte Openness { get { return mvarOpenness; } set { mvarOpenness = value; } } + + public void Clear() + { + mvarBreathiness = 0; + mvarBrightness = 0; + mvarClearness = 0; + mvarGenderFactor = 0; + mvarOpenness = 0; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankIndex/VoicebankIndexObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankIndex/VoicebankIndexObjectModel.cs new file mode 100644 index 00000000..5949ca25 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankIndex/VoicebankIndexObjectModel.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Audio.Voicebank; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankIndex +{ + public class VoicebankIndexObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Path = new string[] { "Multimedia", "Audio", "Voicebank index" }; + _omr.Title = "Voicebank index"; + } + return _omr; + } + + private string mvarTitle = String.Empty; + public string Title { get { return mvarTitle; } set { mvarTitle = value; } } + + private Phoneme.PhonemeCollection mvarPhonemes = new Phoneme.PhonemeCollection(); + public Phoneme.PhonemeCollection Phonemes { get { return mvarPhonemes; } } + + private PhonemeGroup.PhonemeGroupCollection mvarGroups = new PhonemeGroup.PhonemeGroupCollection(); + public PhonemeGroup.PhonemeGroupCollection Groups { get { return mvarGroups; } } + + public override void Clear() + { + mvarTitle = String.Empty; + mvarPhonemes.Clear(); + mvarGroups.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + VoicebankIndexObjectModel clone = (where as VoicebankIndexObjectModel); + clone.Title = (mvarTitle.Clone() as string); + foreach (Phoneme p in mvarPhonemes) + { + clone.Phonemes.Add(p.Clone() as Phoneme); + } + foreach (PhonemeGroup pg in mvarGroups) + { + clone.Groups.Add(pg.Clone() as PhonemeGroup); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/Phoneme.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/Phoneme.cs new file mode 100644 index 00000000..f6830ad8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/Phoneme.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary +{ + public class Phoneme : ICloneable + { + public class PhonemeCollection + : System.Collections.ObjectModel.Collection + { + } + + private string mvarValue = String.Empty; + public string Value + { + get { return mvarValue; } + set { mvarValue = value; } + } + + private System.Collections.Specialized.StringCollection mvarMappings = new System.Collections.Specialized.StringCollection(); + public System.Collections.Specialized.StringCollection Mappings + { + get { return mvarMappings; } + } + + public object Clone() + { + Phoneme clone = new Phoneme(); + clone.Value = (mvarValue.Clone() as string); + foreach (string mapping in mvarMappings) + { + clone.Mappings.Add(mapping.Clone() as string); + } + return clone; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryObjectModel.cs new file mode 100644 index 00000000..8c3bfb98 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeDictionaryObjectModel.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary +{ + public class PhonemeDictionaryObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Phoneme dictionary"; + } + return _omr; + } + public override void Clear() + { + mvarPhonemeLists.Clear(); + } + public override void CopyTo(ObjectModel where) + { + PhonemeDictionaryObjectModel clone = (where as PhonemeDictionaryObjectModel); + if (clone == null) return; + + foreach (PhonemeList list in mvarPhonemeLists) + { + clone.PhonemeLists.Add(list.Clone() as PhonemeList); + } + } + + private PhonemeList.PhonemeListCollection mvarPhonemeLists = new PhonemeList.PhonemeListCollection(); + public PhonemeList.PhonemeListCollection PhonemeLists { get { return mvarPhonemeLists; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeList.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeList.cs new file mode 100644 index 00000000..9719ece1 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/VoicebankPhonemeDictionary/PhonemeList.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.VoicebankPhonemeDictionary +{ + public class PhonemeList : ICloneable + { + public class PhonemeListCollection + : System.Collections.ObjectModel.Collection + { + } + + private int mvarLanguageID = 1033; + public int LanguageID { get { return mvarLanguageID; } set { mvarLanguageID = value; } } + + private Phoneme.PhonemeCollection mvarPhonemes = new Phoneme.PhonemeCollection(); + public Phoneme.PhonemeCollection Phonemes { get { return mvarPhonemes; } } + + public object Clone() + { + PhonemeList clone = new PhonemeList(); + clone.LanguageID = mvarLanguageID; + foreach (Phoneme phoneme in mvarPhonemes) + { + clone.Phonemes.Add(phoneme.Clone() as Phoneme); + } + return clone; + } + + public Phoneme GetPhonemeFromMapping(string mapping) + { + foreach (Phoneme p in mvarPhonemes) + { + if (p.Mappings.Contains(mapping.ToLower())) return p; + } + return null; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioExtendedHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioExtendedHeader.cs new file mode 100644 index 00000000..8852de14 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioExtendedHeader.cs @@ -0,0 +1,55 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public class WaveformAudioExtendedHeader + { + private bool mvarEnabled = false; + private short mvarValidBitsPerSample = 0; + private int mvarChannelMask = 0; + private Guid mvarSubFormatGUID = Guid.Empty; + public bool Enabled + { + get + { + return this.mvarEnabled; + } + set + { + this.mvarEnabled = value; + } + } + public short ValidBitsPerSample + { + get + { + return this.mvarValidBitsPerSample; + } + set + { + this.mvarValidBitsPerSample = value; + } + } + public int ChannelMask + { + get + { + return this.mvarChannelMask; + } + set + { + this.mvarChannelMask = value; + } + } + public Guid SubFormatGUID + { + get + { + return this.mvarSubFormatGUID; + } + set + { + this.mvarSubFormatGUID = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioHeader.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioHeader.cs new file mode 100644 index 00000000..c0c747fd --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioHeader.cs @@ -0,0 +1,59 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public class WaveformAudioHeader + { + private ushort mvarFormatTag = 1; + private short mvarChannelCount = 1; + private int mvarDataRate = 88200; + private short mvarBlockAlignment = 2; + public ushort FormatTag + { + get + { + return this.mvarFormatTag; + } + set + { + this.mvarFormatTag = value; + } + } + + public WaveformAudioKnownFormat Format + { + get { return (WaveformAudioKnownFormat)mvarFormatTag; } + set { mvarFormatTag = (ushort)value; } + } + + + public short ChannelCount + { + get + { + return this.mvarChannelCount; + } + set + { + this.mvarChannelCount = value; + } + } + private int mvarSampleRate = 44100; + public int SampleRate { get { return mvarSampleRate; } set { mvarSampleRate = value; } } + public int DataRate { get { return mvarDataRate; } set { mvarDataRate = value; } } + + public short BlockAlignment + { + get + { + return this.mvarBlockAlignment; + } + set + { + this.mvarBlockAlignment = value; + } + } + + private short mvarBitsPerSample = 16; + public short BitsPerSample { get { return mvarBitsPerSample; } set { mvarBitsPerSample = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioKnownFormat.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioKnownFormat.cs new file mode 100644 index 00000000..10c4f828 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioKnownFormat.cs @@ -0,0 +1,843 @@ +// Based on code found at: +// http://www.koders.com/csharp/fidF004FB228F831C6703D8750BFA87599AA6FD245E.aspx?s=cdef%3Afile +// +// The license for the code is as follows: +// +// WaveFormatEx.cs: +// +// Author: +// Brian Nickel (brian.nickel@gmail.com) +// +// Copyright (C) 2007 Brian Nickel +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License version +// 2.1 as published by the Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public enum WaveformAudioKnownFormat + { + /// + /// Unknown Wave Format + /// + Unknown = 0x0000, + /// + /// PCM Audio + /// + PCM = 0x0001, + /// + /// Microsoft Adaptive PCM Audio + /// + MicrosoftAdaptivePCM = 0x0002, + /// + /// PCM Audio in IEEE floating-point format + /// + IEEEFloatingPointPCM = 0x0003, + /// + /// Compaq VSELP Audio + /// + CompaqVSELP = 0x0004, + /// + /// IBM CVSD Audio + /// + IBMCVSD = 0x0005, + /// + /// Microsoft ALAW Audio + /// + MicrosoftALAW = 0x0006, + /// + /// Microsoft MULAW Audio + /// + MicrosoftMULAW = 0x0007, + /// + /// Microsoft DTS Audio + /// + MicrosoftDTS = 0x0008, + /// + /// Microsoft DRM Encrypted Audio + /// + MicrosoftDRMEncrypted = 0x0009, + /// + /// Microsoft Speech Audio + /// + MicrosoftSpeech = 0x000A, + /// + /// Microsoft Windows Media RT Voice Audio + /// + MicrosoftWindowsMediaRTVoice = 0x000B, + /// + /// OKI ADPCM Audio + /// + OKIADPCM = 0x0010, + /// + /// Intel ADPCM Audio + /// + IntelADPCM = 0x0011, + /// + /// VideoLogic ADPCM Audio + /// + VideoLogicADPCM = 0x0012, + /// + /// Sierra ADPCM Audio + /// + SierraADPCM = 0x0013, + /// + /// Antex ADPCM Audio + /// + AntexADPCM = 0x0014, + /// + /// DSP DIGISTD Audio + /// + DSPDIGISTD = 0x0015, + /// + /// DSP DIGIFIX Audio + /// + DSPDIGIFIX = 0x0016, + /// + /// Dialogic OKI ADPCM Audio + /// + DialogicOKIADPCM = 0x0017, + /// + /// Media Vision ADPCM Audio for Jazz 16 + /// + MediaVisionADPCM = 0x0018, + /// + /// Hewlett-Packard CU Audio + /// + HewlettPackardCU = 0x0019, + /// + /// Hewlett-Packard Dynamic Voice Audio + /// + HewlettPackardDynamicVoice = 0x001A, + /// + /// Yamaha ADPCM Audio + /// + YamahaADPCM = 0x0020, + /// + /// Speech Compression Audio + /// + SpeechCompression = 0x0021, + /// + /// DSP Group True Speech Audio + /// + DSPGroupTrueSpeech = 0x0022, + /// + /// Echo Speech Audio + /// + EchoSpeech = 0x0023, + /// + /// Ahead AF36 Audio + /// + AheadAF36 = 0x0024, + /// + /// Audio Processing Technology Audio + /// + AudioProcessingTechnology = 0x0025, + /// + /// Ahead AF10 Audio + /// + AheadAF10 = 0x0026, + /// + /// Aculab Prosody CTI Speech Card Audio (format 39) + /// + AculabProsodyCTISpeechCard_39 = 0x0027, + /// + /// Merging Technologies LRC Audio + /// + MergingTechnologiesLRC = 0x0028, + /// + /// Dolby AC2 Audio + /// + DolbyAC2 = 0x0030, + /// + /// Microsoft GSM6.10 Audio + /// + MicrosoftGSM610 = 0x0031, + /// + /// Microsoft MSN Audio + /// + MicrosoftMSN = 0x0032, + /// + /// Antex ADPCME Audio + /// + AntexADPCME = 0x0033, + /// + /// Control Resources VQLPC + /// + ControlResourcesVQLPC = 0x0034, + /// + /// DSP REAL Audio + /// + DSPREAL = 0x0035, + /// + /// DSP ADPCM Audio + /// + DSPADPCM = 0x0036, + /// + /// Control Resources CR10 Audio + /// + ControlResourcesCR10 = 0x0037, + /// + /// Natural MicroSystems VBXADPCM Audio + /// + NaturalMicroSystemsVBXADPCM = 0x0038, + /// + /// Roland RDAC Proprietary Audio Format + /// + RolandRDACProprietaryAudioFormat = 0x0039, + /// + /// Echo Speech Proprietary Audio Compression Format + /// + EchoSpeechProprietaryAudioCompressionFormat = 0x003A, + /// + /// Rockwell ADPCM Audio + /// + RockwellADPCM = 0x003B, + /// + /// Rockwell DIGITALK Audio + /// + RockwellDIGITALK = 0x003C, + /// + /// Xebec Proprietary Audio Compression Format + /// + XebecProprietaryAudioCompressionFormat = 0x003D, + /// + /// Antex G721 ADPCM Audio + /// + AntexG721ADPCM = 0x0040, + /// + /// Antex G728 CELP Audio + /// + AntexG728CELP = 0x0041, + /// + /// Microsoft MSG723 Audio + /// + MicrosoftMSG723 = 0x0042, + /// + /// Microsoft MSG723.1 Audio + /// + MicrosoftMSG7231 = 0x0043, + /// + /// Microsoft MSG729 Audio + /// + MicrosoftMSG729 = 0x0044, + /// + /// Microsoft SPG726 Audio + /// + MicrosoftSPG726 = 0x0045, + /// + /// Microsoft MPEG Audio + /// + MicrosoftMPEG = 0x0050, + /// + /// InSoft RT24 Audio + /// + InSoftRT24 = 0x0052, + /// + /// InSoft PAC Audio + /// + InSoftPAC = 0x0053, + /// + /// ISO/MPEG Layer 3 Audio + /// + ISOMPEGLayer3 = 0x0055, + /// + /// Lucent G723 Audio + /// + LucentG723 = 0x0059, + /// + /// Cirrus Logic Audio + /// + CirrusLogic = 0x0060, + /// + /// ESS Technology PCM Audio + /// + ESSTechnologyPCM = 0x0061, + /// + /// Voxware Audio + /// + Voxware = 0x0062, + /// + /// Canopus ATRAC Audio + /// + CanopusATRAC = 0x0063, + /// + /// APICOM G726 ADPCM Audio + /// + APICOMG726ADPCM = 0x0064, + /// + /// APICOM G722 ADPCM Audio + /// + APICOMG722ADPCM = 0x0065, + /// + /// Microsoft DSAT Display Audio + /// + MicrosoftDSATDisplay = 0x0067, + /// + /// Voxware Byte Aligned Audio + /// + VoxwareByteAligned = 0x0069, + /// + /// Voxware AC8 Audio + /// + VoxwareAC8 = 0x0070, + /// + /// Voxware AC10 Audio + /// + VoxwareAC10 = 0x0071, + /// + /// Voxware AC16 Audio + /// + VoxwareAC16 = 0x0072, + /// + /// Voxware AC20 Audio + /// + VoxwareAC20 = 0x0073, + /// + /// Voxware RT24 Audio + /// + VoxwareRT24 = 0x0074, + /// + /// Voxware RT29 Audio + /// + VoxwareRT29 = 0x0075, + /// + /// Voxware RT29HW Audio + /// + VoxwareRT29HW = 0x0076, + /// + /// Voxware VR12 Audio + /// + VoxwareVR12 = 0x0077, + /// + /// Voxware VR18 Audio + /// + VoxwareVR18 = 0x0078, + /// + /// Voxware TQ40 Audio + /// + VoxwareTQ40 = 0x0079, + /// + /// Voxware SC3 Audio (122) + /// + VoxwareSC3_122 = 0x007A, + /// + /// Voxware SC3 Audio (123) + /// + VoxwareSC3_123 = 0x007B, + /// + /// SoftSound Audio + /// + SoftSound = 0x0080, + /// + /// Voxware TQ60 Audio + /// + VoxwareTQ60 = 0x0081, + /// + /// Microsoft RT24 Audio + /// + MicrosoftRT24 = 0x0082, + /// + /// AT&T G729A Audio + /// + ATTG729A = 0x0083, + /// + /// Motion Pixels MVI2 Audio + /// + MotionPixelsMVI2 = 0x0084, + /// + /// Datafusion Systems G726 Audio + /// + DatafusionSystemsG726 = 0x0085, + /// + /// Datafusion Systems G610 Audio + /// + DatafusionSystemsG610 = 0x0086, + /// + /// Iterated Systems Audio + /// + IteratedSystems = 0x0088, + /// + /// OnLive! Audio + /// + OnLive = 0x0089, + /// + /// Multitude FT SX20 Audio + /// + MultitudeFTSX20 = 0x008A, + /// + /// InfoCom ITS ACM G721 Audio + /// + InfoComITSACMG721 = 0x008B, + /// + /// Convedia G729 Audio + /// + ConvediaG729 = 0x008C, + /// + /// Congruency Audio + /// + Congruency = 0x008D, + /// + /// Siemens Business Communications 24 Audio + /// + SiemensBusinessCommunications24 = 0x0091, + /// + /// Sonic Foundary Dolby AC3 Audio + /// + SonicFoundryDolbyAC3 = 0x0092, + /// + /// MediaSonic G723 Audio + /// + MediaSonicG723 = 0x0093, + /// + /// Aculab Prosody CTI Speech Card Audio (format 148) + /// + AculabProsodyCTISpeechCard_148 = 0x0094, + /// + /// ZyXEL ADPCM + /// + ZyXELADPCM = 0x0097, + /// + /// Philips Speech Processing LPCBB Audio + /// + PhilipsSpeechProcessingLPCBB = 0x0098, + /// + /// Studer Professional PACKED Audio + /// + StuderProfessionalPACKED = 0x0099, + /// + /// Malden Electronics Phony Talk Audio + /// + MaldenElectronicsPhonyTalk = 0x00A0, + /// + /// Racal Recorder GSM Audio + /// + RacalRecorderGSM = 0x00A1, + /// + /// Racal Recorder G720.a Audio + /// + RacalRecorderG720a = 0x00A2, + /// + /// Racal G723.1 Audio + /// + RacalG7231 = 0x00A3, + /// + /// Racal Tetra ACELP Audio + /// + RacalTetraACELP = 0x00A4, + /// + /// NEC AAC Audio + /// + NECAAC = 0x00B0, + /// + /// Rhetorex ADPCM Audio + /// + RhetorexADPCM = 0x0100, + /// + /// BeCubed IRAT Audio + /// + BeCubedIRAT = 0x0101, + /// + /// Vivo G723 Audio + /// + VivoG723 = 0x0111, + /// + /// Vivo Siren Audio + /// + VivoSiren = 0x0112, + /// + /// Philips Speech Processing CELP Audio + /// + PhilipsSpeechProcessingCELP = 0x0120, + /// + /// Philips Speech Processing GRUNDIG Audio + /// + PhilipsSpeechProcessingGRUNDIG = 0x0121, + /// + /// Digital Equipment Corporation G723 Audio + /// + DigitalEquipmentCorporationG723 = 0x0123, + /// + /// Sanyo LD-ADPCM Audio + /// + SanyoLDADPCM = 0x0125, + /// + /// Sipro Lab ACELPNET Audio + /// + SiproLabACELPNET = 0x0130, + /// + /// Sipro Lab ACELP4800 Audio + /// + SiproLabACELP4800 = 0x0131, + /// + /// Sipro Lab ACELP8v3 Audio + /// + SiproLabACELP8v3 = 0x0132, + /// + /// Sipro Lab G729 Audio + /// + SiproLabG729 = 0x0133, + /// + /// Sipro Lab G729A Audio + /// + SiproLabG729A = 0x0134, + /// + /// Sipro Lab KELVIN Audio + /// + SiproLabKELVIN = 0x0135, + /// + /// VoiceAge AMR Audio + /// + VoiceAgeAMR = 0x0136, + /// + /// Dictaphone G726 ADPCM Audio + /// + DictaphoneG726ADPCM = 0x0140, + /// + /// Dictaphone CELP68 Audio + /// + DictaphoneCELP68 = 0x0141, + /// + /// Dictaphone CELP54 Audio + /// + DictaphoneCELP54 = 0x0142, + /// + /// QUALCOMM Pure Voice Audio + /// + QUALCOMMPureVoice = 0x0150, + /// + /// QUALCOMM Half Rate Audio + /// + QUALCOMMHalfRate = 0x0151, + /// + /// Ring Zero TUBGSM Audio + /// + RingZeroTUBGSM = 0x0155, + /// + /// Microsoft WMA1 Audio + /// + MicrosoftWMA1 = 0x0160, + /// + /// Microsoft WMA2 Audio + /// + MicrosoftWMA2 = 0x0161, + /// + /// Microsoft Multichannel WMA Audio + /// + MicrosoftWMAMultichannel = 0x0162, + /// + /// Microsoft Lossless WMA Audio + /// + MicrosoftWMALossless = 0x0163, + /// + /// Unisys NAP ADPCM Audio + /// + UnisysNAPADPCM = 0x0170, + /// + /// Unisys NAP ULAW Audio + /// + UnisysNAPULAW = 0x0171, + /// + /// Unisys NAP ALAW Audio + /// + UnisysNAPALAW = 0x0172, + /// + /// Unisys NAP 16K Audio + /// + UnisysNAP16K = 0x0173, + /// + /// SysCom ACM SYC008 Audio + /// + SysComACMSYC008 = 0X0174, + /// + /// SysCom ACM SYC701 G726L Audio + /// + SysComACMSYC701G726L = 0x0175, + /// + /// SysCom ACM SYC701 CELP54 Audio + /// + SysComACMSYC701CELP54 = 0x0176, + /// + /// SysCom ACM SYC701 CELP68 Audio + /// + SysComACMSYC701CELP68 = 0x0177, + /// + /// Knowledge Adventure ADPCM Audio + /// + KnowledgeAdventureADPCM = 0x0178, + /// + /// MPEG2 AAC Audio + /// + MPEG2AAC = 0x0180, + /// + /// Digital Theater Systems DTS DS Audio + /// + DigitalTheaterSystemsDTSDS = 0x0190, + /// + /// Innings ADPCM Audio + /// + InningsADPCM = 0x1979, + /// + /// Creative ADPCM Audio + /// + CreativeADPCM = 0x0200, + /// + /// Creative FastSpeech8 Audio + /// + CreativeFastSpeech8 = 0x0202, + /// + /// Creative FastSpeech10 Audio + /// + CreativeFastSpeech10 = 0x0203, + /// + /// UHER ADPCM Audio + /// + UHERADPCM = 0x0210, + /// + /// Quarterdeck Audio + /// + Quarterdeck = 0x0220, + /// + /// I-Link VC Audio + /// + ILinkVC = 0x0230, + /// + /// Aureal RAW SPORT Audio + /// + AurealRAWSPORT = 0x0240, + /// + /// Interactive Products HSX Audio + /// + InteractiveProductsHSX = 0x0250, + /// + /// Interactive Products RPELP Audio + /// + InteractiveProductsRPELP = 0x0251, + /// + /// Consistens Software CS2 Audio + /// + ConsistensSoftwareCS2 = 0x0260, + /// + /// Sony SCX Audio + /// + SonySCX = 0x0270, + /// + /// Sony SCY Audio + /// + SonySCY = 0x0271, + /// + /// Sony ATRAC3 Audio + /// + SonyATRAC3 = 0x0272, + /// + /// Sony SPC Audio + /// + SonySPC = 0x0273, + /// + /// Telum Audio + /// + Telum = 0x0280, + /// + /// Telum IA Audio + /// + TelumIA = 0x0281, + /// + /// Norcom Voice Systems ADPCM Audio + /// + NorcomVoiceSystemsADPCM = 0x0285, + /// + /// Fujitsu FM TOWNS SND Audio + /// + FujitsuFMTOWNSSND = 0x0300, + /// + /// Unknown Fujitsu Audio (format 769) + /// + UnknownFujitsu_769 = 0x0301, + /// + /// Unknown Fujitsu Audio (format 770) + /// + UnknownFujitsu_770 = 0x0302, + /// + /// Unknown Fujitsu Audio (format 771) + /// + UnknownFujitsu_771 = 0x0303, + /// + /// Unknown Fujitsu Audio (format 772) + /// + UnknownFujitsu_772 = 0x0304, + /// + /// Unknown Fujitsu Audio (format 773) + /// + UnknownFujitsu_773 = 0x0305, + /// + /// Unknown Fujitsu Audio (format 774) + /// + UnknownFujitsu_774 = 0x0306, + /// + /// Unknown Fujitsu Audio (format 775) + /// + UnknownFujitsu_775 = 0x0307, + /// + /// Unknown Fujitsu Audio (format 776) + /// + UnknownFujitsu_776 = 0x0308, + /// + /// Micronas Semiconductors Development Audio + /// + MicronasSemiconductorsDevelopment = 0x0350, + /// + /// Micronas Semiconductors CELP833 Audio + /// + MicronasSemiconductorsCELP833 = 0x0351, + /// + /// Brooktree Digital Audio + /// + BrooktreeDigital = 0x0400, + /// + /// QDesign Audio + /// + QDesign = 0x0450, + /// + /// AT&T VME VMPCM Audio + /// + ATTVMEVMPCM = 0x0680, + /// + /// AT&T TPC Audio + /// + ATTTPC = 0x0681, + /// + /// Ing. C. Olivetti & C., S.p.A. GSM Audio + /// + OlivettiGSM = 0x1000, + /// + /// Ing. C. Olivetti & C., S.p.A. ADPCM Audio + /// + OlivettiADPCM = 0x1001, + /// + /// Ing. C. Olivetti & C., S.p.A. CELP Audio + /// + OlivettiCELP = 0x1002, + /// + /// Ing. C. Olivetti & C., S.p.A. SBC Audio + /// + OlivettiSBC = 0x1003, + /// + /// Ing. C. Olivetti & C., S.p.A. OPR Audio + /// + OlivettiOPR = 0x1004, + /// + /// Lernout & Hauspie Audio + /// + LernoutHauspie = 0x1100, + /// + /// Lernout & Hauspie CELP Audio + /// + LernoutHauspieCELP = 0x1101, + /// + /// Lernout & Hauspie SB8 Audio + /// + LernoutHauspieSB8 = 0x1102, + /// + /// Lernout & Hauspie SB12 Audio + /// + LernoutHauspieSB12 = 0x1103, + /// + /// Lernout & Hauspie SB16 Audio + /// + LernoutHauspieSB16 = 0x1104, + /// + /// Norris Audio + /// + Norris = 0x1400, + /// + /// AT&T Soundspace Musicompress Audio + /// + ATTSoundspaceMusicompress = 0x1500, + /// + /// Sonic Foundry Lossless Audio + /// + SonicFoundryLossless = 0x1971, + /// + /// FAST Multimedia DVM Audio + /// + FASTMultimediaDVM = 0x2000, + /// + /// Divio AAC + /// + DivioAAC = 0x4143, + /// + /// Nokia Adaptive Multirate Audio + /// + NokiaAdaptiveMultirate = 0x4201, + /// + /// Divio G726 Audio + /// + DivioG726 = 0x4243, + /// + /// 3Com NBX Audio + /// + ThreeComNBX = 0x7000, + /// + /// Microsoft Adaptive Multirate Audio + /// + MicrosoftAdaptiveMultirate = 0x7A21, + /// + /// Microsoft Adaptive Multirate Audio with silence detection + /// + MicrosoftAdaptiveMultirateSilenceDetect = 0x7A22, + /// + /// Comverse Infosys G723 1 Audio + /// + ComverseInfosysG7231 = 0xA100, + /// + /// Comverse Infosys AVQSBC Audio + /// + ComverseInfosysAVQSBC = 0xA101, + /// + /// Comverse Infosys OLDSBC Audio + /// + ComverseInfosysOLDSBC = 0xA102, + /// + /// Symbol Technology G729A Audio + /// + SymbolTechnologyG729A = 0xA103, + /// + /// VoiceAge AMR WB Audio + /// + VoiceAgeAMRWB = 0xA104, + /// + /// Ingenient G726 Audio + /// + IngenientG726 = 0xA105, + /// + /// ISO/MPEG-4 Advanced Audio Coding + /// + ISOMPEG4AdvancedAudioCoding = 0xA106, + /// + /// Encore G726 Audio + /// + EncoreG726 = 0xA107, + /// + /// Extensible or custom format. + /// + /// When the format is WAVE_FORMAT_EXTENSIBLE (0xFFFE or 65534) then one should refer to the sub format for how to read the WAV. + Extensible = 0xFFFE + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioObjectModel.cs new file mode 100644 index 00000000..6d495da8 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Audio/Waveform/WaveformAudioObjectModel.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.PropertyList; +namespace UniversalEditor.ObjectModels.Multimedia.Audio.Waveform +{ + public class WaveformAudioObjectModel : AudioObjectModel + { + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Waveform (raw) audio"; + omr.Path = new string[] { "Multimedia", "Audio", "Waveform Audio" }; + return omr; + } + + private WaveformAudioHeader mvarHeader = new WaveformAudioHeader(); + private WaveformAudioExtendedHeader mvarExtendedHeader = new WaveformAudioExtendedHeader(); + private byte[] mvarRawData = null; + private short[] mvarRawSamples = new short[0]; + public WaveformAudioHeader Header + { + get + { + return this.mvarHeader; + } + } + public WaveformAudioExtendedHeader ExtendedHeader + { + get + { + return this.mvarExtendedHeader; + } + } + public byte[] RawData + { + get { return mvarRawData; } + set + { + this.mvarRawData = value; + + IO.Reader br = new IO.Reader(new MemoryAccessor(value)); + List samples = new List(); + while (!br.EndOfStream) + { + try + { + short sample = 0; + switch (mvarHeader.BitsPerSample) + { + case 8: + { + sample = br.ReadByte(); + break; + } + case 16: + { + sample = br.ReadInt16(); + break; + } + default: + { + throw new ArgumentException("Bad BitsPerSample value: " + mvarHeader.BitsPerSample.ToString() + "; must be 8 or 16!"); + } + } + samples.Add(sample); + } + catch (System.IO.IOException ex) + { + break; + } + } + mvarRawSamples = samples.ToArray(); + } + } + public short[] RawSamples + { + get { return mvarRawSamples; } + set { mvarRawSamples = value; } + } + public override void CopyTo(ObjectModel destination) + { + WaveformAudioObjectModel clone = destination as WaveformAudioObjectModel; + clone.ExtendedHeader.ChannelMask = this.mvarExtendedHeader.ChannelMask; + clone.ExtendedHeader.Enabled = this.mvarExtendedHeader.Enabled; + clone.ExtendedHeader.SubFormatGUID = this.mvarExtendedHeader.SubFormatGUID; + clone.ExtendedHeader.ValidBitsPerSample = this.mvarExtendedHeader.ValidBitsPerSample; + clone.Header.BitsPerSample = this.mvarHeader.BitsPerSample; + clone.Header.BlockAlignment = this.mvarHeader.BlockAlignment; + clone.Header.ChannelCount = this.mvarHeader.ChannelCount; + clone.Header.DataRate = this.mvarHeader.DataRate; + clone.Header.FormatTag = this.mvarHeader.FormatTag; + clone.Header.SampleRate = this.mvarHeader.SampleRate; + clone.RawData = (this.mvarRawData.Clone() as byte[]); + clone.RawSamples = (this.mvarRawSamples.Clone() as short[]); + + clone.Information.AlbumTitle = (Information.AlbumTitle.Clone() as string); + clone.Information.Comments = (Information.Comments.Clone() as string); + clone.Information.Creator = (Information.Creator.Clone() as string); + foreach (Property property in Information.CustomProperties) + { + clone.Information.CustomProperties.Add(property.Clone() as Property); + } + clone.Information.DateCreated = Information.DateCreated; + clone.Information.FadeOutDelay = Information.FadeOutDelay; + clone.Information.FadeOutLength = Information.FadeOutLength; + clone.Information.Genre = (Information.Genre.Clone() as string); + clone.Information.SongArtist = (Information.SongArtist.Clone() as string); + clone.Information.SongTitle = (Information.SongTitle.Clone() as string); + clone.Information.TrackNumber = Information.TrackNumber; + } + public override void Clear() + { + mvarRawData = new byte[0]; + mvarHeader = new WaveformAudioHeader(); + mvarExtendedHeader = new WaveformAudioExtendedHeader(); + + Information.Clear(); + + mvarRawSamples = new short[0]; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs new file mode 100644 index 00000000..8859f280 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionObjectModel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.ObjectModels.Multimedia.AudioCollection.Synthesized +{ + public class SynthesizedAudioCollectionObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Synthesized audio collection"; + } + return _omr; + } + + private SynthesizedAudioCollectionTrack.SynthesizedAudioCollectionTrackCollection mvarTracks = new SynthesizedAudioCollectionTrack.SynthesizedAudioCollectionTrackCollection(); + public SynthesizedAudioCollectionTrack.SynthesizedAudioCollectionTrackCollection Tracks { get { return mvarTracks; } } + + public override void Clear() + { + mvarTracks.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + SynthesizedAudioCollectionObjectModel clone = (where as SynthesizedAudioCollectionObjectModel); + foreach (SynthesizedAudioCollectionTrack track in mvarTracks) + { + clone.Tracks.Add(track.Clone() as SynthesizedAudioCollectionTrack); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs new file mode 100644 index 00000000..87ad8305 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/AudioCollection/Synthesized/SynthesizedAudioCollectionTrack.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.ObjectModels.Multimedia.Audio.Synthesized; + +namespace UniversalEditor.ObjectModels.Multimedia.AudioCollection.Synthesized +{ + public class SynthesizedAudioCollectionTrack : ICloneable + { + public class SynthesizedAudioCollectionTrackCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarSongTitle = String.Empty; + public string SongTitle { get { return mvarSongTitle; } set { mvarSongTitle = value; } } + + private string mvarGameTitle = String.Empty; + public string GameTitle { get { return mvarGameTitle; } set { mvarGameTitle = value; } } + + private string mvarArtistName = String.Empty; + public string ArtistName { get { return mvarArtistName; } set { mvarArtistName = value; } } + + private string mvarDumperName = String.Empty; + public string DumperName { get { return mvarDumperName; } set { mvarDumperName = value; } } + + private string mvarComments = String.Empty; + public string Comments { get { return mvarComments; } set { mvarComments = value; } } + + private string mvarAlbumTitle = String.Empty; + public string AlbumTitle { get { return mvarAlbumTitle; } set { mvarAlbumTitle = value; } } + + private string mvarPublisherName = String.Empty; + public string PublisherName { get { return mvarPublisherName; } set { mvarPublisherName = value; } } + + private string mvarOriginalFileName = String.Empty; + public string OriginalFileName { get { return mvarOriginalFileName; } set { mvarOriginalFileName = value; } } + + private SynthesizedAudioObjectModel mvarObjectModel = null; + public SynthesizedAudioObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; } } + + public object Clone() + { + SynthesizedAudioCollectionTrack clone = new SynthesizedAudioCollectionTrack(); + clone.AlbumTitle = (mvarAlbumTitle.Clone() as string); + clone.ArtistName = (mvarArtistName.Clone() as string); + clone.Comments = (mvarComments.Clone() as string); + clone.DumperName = (mvarDumperName.Clone() as string); + clone.GameTitle = (mvarGameTitle.Clone() as string); + clone.ObjectModel = (mvarObjectModel.Clone() as SynthesizedAudioObjectModel); + clone.OriginalFileName = (mvarOriginalFileName.Clone() as string); + clone.PublisherName = (mvarPublisherName.Clone() as string); + clone.SongTitle = (mvarSongTitle.Clone() as string); + return clone; + } + + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteEntry.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteEntry.cs new file mode 100644 index 00000000..27de2486 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteEntry.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Palette +{ + public class PaletteEntry : ICloneable + { + public class PaletteEntryCollection + : System.Collections.ObjectModel.Collection + { + public PaletteEntry Add(Color color, string colorName = "") + { + PaletteEntry entry = new PaletteEntry(); + entry.Name = colorName; + entry.Color = color; + + Add(entry); + return entry; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private Color mvarColor = Color.Empty; + public Color Color { get { return mvarColor; } set { mvarColor = value; } } + + public object Clone() + { + PaletteEntry clone = new PaletteEntry(); + clone.Name = mvarName; + clone.Color = mvarColor; + return clone; + } + + private bool mvarSelected = false; + public bool Selected { get { return mvarSelected; } set { mvarSelected = value; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteObjectModel.cs new file mode 100644 index 00000000..f9561e1d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Palette/PaletteObjectModel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Palette +{ + public class PaletteObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Color palette"; + _omr.Path = new string[] { "Multimedia", "Color palette" }; + } + return _omr; + } + + public override void Clear() + { + mvarEntries.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + PaletteObjectModel clone = (where as PaletteObjectModel); + foreach (PaletteEntry entry in mvarEntries) + { + clone.Entries.Add(entry.Clone() as PaletteEntry); + } + } + + private PaletteEntry.PaletteEntryCollection mvarEntries = new PaletteEntry.PaletteEntryCollection(); + public PaletteEntry.PaletteEntryCollection Entries { get { return mvarEntries; } } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/Collection/PictureCollectionObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/Collection/PictureCollectionObjectModel.cs new file mode 100644 index 00000000..02f15282 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/Collection/PictureCollectionObjectModel.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Picture.Collection +{ + public class PictureCollectionObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + protected override ObjectModelReference MakeReferenceInternal() + { + if (_omr == null) + { + _omr = base.MakeReferenceInternal(); + _omr.Title = "Picture collection"; + _omr.Description = "Store multiple pictures in a single file"; + _omr.Path = new string[] { "Multimedia", "Picture", "Picture Collection" }; + } + return _omr; + } + + private PictureObjectModel.PictureObjectModelCollection mvarPictures = new PictureObjectModel.PictureObjectModelCollection(); + public PictureObjectModel.PictureObjectModelCollection Pictures { get { return mvarPictures; } } + + public int MaximumPictureWidth + { + get + { + int value = 0; + foreach (PictureObjectModel pic in mvarPictures) + { + if (pic.Width > value) value = pic.Width; + } + return value; + } + } + public int MaximumPictureHeight + { + get + { + int value = 0; + foreach (PictureObjectModel pic in mvarPictures) + { + if (pic.Height > value) value = pic.Height; + } + return value; + } + } + + public override void Clear() + { + mvarPictures.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + PictureCollectionObjectModel clone = (where as PictureCollectionObjectModel); + if (clone == null) return; + + foreach (PictureObjectModel pic in mvarPictures) + { + clone.Pictures.Add(pic.Clone() as PictureObjectModel); + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItem.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItem.cs new file mode 100644 index 00000000..d309635e --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItem.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.ObjectModel; +using System.Windows.Forms; +namespace UniversalEditor.ObjectModels.Multimedia.Picture +{ + public abstract class PictureItem + { + public class PictureItemCollection : Collection + { + } + private int mvarLeft = 0; + private int mvarTop = 0; + private int mvarWidth = 0; + private int mvarHeight = 0; + public int Left + { + get + { + return this.mvarLeft; + } + set + { + this.mvarLeft = value; + } + } + public int Top + { + get + { + return this.mvarTop; + } + set + { + this.mvarTop = value; + } + } + public int Width + { + get + { + return this.mvarWidth; + } + set + { + this.mvarWidth = value; + } + } + public int Height + { + get + { + return this.mvarHeight; + } + set + { + this.mvarHeight = value; + } + } + public int Right + { + get + { + return this.mvarLeft + this.mvarWidth; + } + } + public int Bottom + { + get + { + return this.mvarTop + this.mvarHeight; + } + } + protected internal abstract void OnRender(PaintEventArgs e); + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItemType.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItemType.cs new file mode 100644 index 00000000..83c262ba --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureItemType.cs @@ -0,0 +1,10 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Picture +{ + public enum PictureItemType + { + Rectangle, + Oval, + Line + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureObjectModel.cs new file mode 100644 index 00000000..924954df --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PictureObjectModel.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Generic; + +namespace UniversalEditor.ObjectModels.Multimedia.Picture +{ + public class PictureObjectModel : ObjectModel + { + public class PictureObjectModelCollection + : System.Collections.ObjectModel.Collection + { + } + + private PositionVector2 lastAddedLocation = new PositionVector2(0, 0); + + private List mvarColorMap = new List(); + public List ColorMap { get { return mvarColorMap; } } + + public void SetPixel(Color color) + { + if (lastAddedLocation.X >= mvarWidth && lastAddedLocation.Y >= mvarHeight) + { + throw new InvalidOperationException("Out of image space. Try resizing the image"); + } + + if (lastAddedLocation.X >= mvarWidth) + { + lastAddedLocation.X = 0; + lastAddedLocation.Y++; + } + + SetPixel(color, (int)lastAddedLocation.X, (int)lastAddedLocation.Y); + lastAddedLocation.X++; + } + public void SetPixel(Color color, int x, int y) + { + if (x >= mvarWidth || y >= mvarHeight) + { + throw new InvalidOperationException("Out of image space. Try resizing the image"); + } + + int index = (x + (y * mvarWidth)) * 4; + bitmapData[index] = (byte)(color.Red * 255); + bitmapData[index + 1] = (byte)(color.Green * 255); + bitmapData[index + 2] = (byte)(color.Blue * 255); + bitmapData[index + 3] = (byte)(color.Alpha * 255); + + int realIndex = (int)(index / 4); + bitmapDataSet[realIndex] = true; + } + public void ClearPixel(int x, int y) + { + int index = (int)((lastAddedLocation.X + (lastAddedLocation.Y * mvarWidth)) * 4); + bitmapData[index] = 0; + bitmapData[index + 1] = 0; + bitmapData[index + 2] = 0; + bitmapData[index + 3] = 0; + + int realIndex = (int)(index / 4); + bitmapDataSet[realIndex] = false; + } + public Color GetPixel(int x, int y) + { + if (x >= mvarWidth || y >= mvarHeight) + { + throw new InvalidOperationException("Out of image space. Try resizing the image"); + } + + int index = (x + (y * mvarWidth)) * 4; + int realIndex = (int)(index / 4); + if (bitmapDataSet[realIndex]) + { + byte a = bitmapData[index + 0]; + byte r = bitmapData[index + 1]; + byte g = bitmapData[index + 2]; + byte b = bitmapData[index + 3]; + + Color color = Color.FromRGBA(a, r, g, b); + return color; + } + return Color.Empty; + } + public Color GetPixel(PositionVector2 point) + { + return GetPixel((int)point.X, (int)point.Y); + } + + private byte[] bitmapData = new byte[] { 0, 0, 0, 0 }; + private bool[] bitmapDataSet = new bool[] { false }; + + public PictureObjectModel() + { + } + public PictureObjectModel(int width, int height) + { + bitmapData = new byte[(width * height) * 4]; + bitmapDataSet = new bool[(width * height) * 4]; + + mvarWidth = width; + mvarHeight = height; + } + + private int mvarWidth = 1; + public int Width + { + get { return mvarWidth; } + set + { + mvarWidth = value; + bitmapData = new byte[mvarWidth * mvarHeight * 4]; + bitmapDataSet = new bool[mvarWidth * mvarHeight]; + } + } + private int mvarHeight = 1; + public int Height + { + get { return mvarHeight; } + set + { + mvarHeight = value; + bitmapData = new byte[mvarWidth * mvarHeight * 4]; + bitmapDataSet = new bool[mvarWidth * mvarHeight]; + } + } + + + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Picture"; + omr.Path = new string[] { "Multimedia", "Picture", "Single Picture" }; + return omr; + } + + public override void Clear() + { + mvarColorMap = new List(); + Width = 1; + Height = 1; + } + public override void CopyTo(ObjectModel destination) + { + PictureObjectModel clone = (destination as PictureObjectModel); + clone.Width = mvarWidth; + clone.Height = mvarHeight; + clone.bitmapData = (bitmapData.Clone() as byte[]); + clone.bitmapDataSet = (bitmapDataSet.Clone() as bool[]); + } + + public byte[] ToByteArray() + { + // memory goes from left to right, top to bottom + byte[] data = new byte[mvarWidth * mvarHeight * 4]; + int i = 0; + for (int h = 0; h < mvarHeight; h++) + { + for (int w = 0; w < mvarWidth; w++) + { + int index = (w + (h * mvarWidth)) * 4; + int realIndex = (int)(index / 4); + if (bitmapDataSet[realIndex]) + { + data[i + 3] = bitmapData[index + 3]; + data[i + 2] = bitmapData[index + 0]; + data[i + 1] = bitmapData[index + 1]; + data[i + 0] = bitmapData[index + 2]; + } + i += 4; + } + } + return data; + } + public static PictureObjectModel FromByteArray(byte[] data, int width, int height) + { + if (width == 0 || height == 0) return null; + + PictureObjectModel pic = new PictureObjectModel(); + pic.Width = width; + pic.Height = height; + + // memory goes from left to right, top to bottom + int i = 0; + for (int h = 0; h < height; h++) + { + for (int w = 0; w < width; w++) + { + byte b = data[i]; + byte g = data[i + 1]; + byte r = data[i + 2]; + byte a = data[i + 3]; + + Color color = Color.FromRGBA(a, r, g, b); + pic.SetPixel(color, w, h); + + i += 4; + } + } + return pic; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PicturePathItem.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PicturePathItem.cs new file mode 100644 index 00000000..c097a63d --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Picture/PicturePathItem.cs @@ -0,0 +1,50 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +namespace UniversalEditor.ObjectModels.Multimedia.Picture +{ + public class PicturePathItem : PictureItem + { + private Color mvarColor = Color.Empty; + private GraphicsPath mvarPath = null; + private int mvarSize = 1; + public Color Color + { + get + { + return this.mvarColor; + } + set + { + this.mvarColor = value; + } + } + public GraphicsPath Path + { + get + { + return this.mvarPath; + } + set + { + this.mvarPath = value; + } + } + public int Size + { + get + { + return this.mvarSize; + } + set + { + this.mvarSize = value; + } + } + protected internal override void OnRender(PaintEventArgs e) + { + e.Graphics.DrawPath(new Pen(this.mvarColor, (float)this.mvarSize), this.mvarPath); + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistAlbumInformation.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistAlbumInformation.cs new file mode 100644 index 00000000..bd0e074c --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistAlbumInformation.cs @@ -0,0 +1,31 @@ +using System; +namespace UniversalEditor.ObjectModels.Multimedia.Playlist +{ + public class PlaylistAlbumInformation + { + private string mvarTitle = string.Empty; + private string mvarArtist = string.Empty; + public string Title + { + get + { + return this.mvarTitle; + } + set + { + this.mvarTitle = value; + } + } + public string Artist + { + get + { + return this.mvarArtist; + } + set + { + this.mvarArtist = value; + } + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistEntry.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistEntry.cs new file mode 100644 index 00000000..a1f03827 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistEntry.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +namespace UniversalEditor.ObjectModels.Multimedia.Playlist +{ + public class PlaylistEntry + { + public class PlaylistEntryCollection : Collection + { + } + private string mvarTitle = string.Empty; + private string mvarAuthor = string.Empty; + private PlaylistAlbumInformation mvarAlbum = new PlaylistAlbumInformation(); + private int mvarTrackNumber = 0; + private string mvarAlbumArtImageURL = string.Empty; + private string mvarAbstract = string.Empty; + private string mvarCopyright = string.Empty; + private long mvarOffset = 0L; + private long mvarLength = 0L; + private string mvarFileName = string.Empty; + private Dictionary mvarCustomInformation = new Dictionary(); + public string Title + { + get + { + return this.mvarTitle; + } + set + { + this.mvarTitle = value; + } + } + public string Author + { + get + { + return this.mvarAuthor; + } + set + { + this.mvarAuthor = value; + } + } + public PlaylistAlbumInformation Album + { + get + { + return this.mvarAlbum; + } + } + public int TrackNumber + { + get + { + return this.mvarTrackNumber; + } + set + { + this.mvarTrackNumber = value; + } + } + public string AlbumArtImageURL + { + get + { + return this.mvarAlbumArtImageURL; + } + set + { + this.mvarAlbumArtImageURL = value; + } + } + public string Abstract + { + get + { + return this.mvarAbstract; + } + set + { + this.mvarAbstract = value; + } + } + public string Copyright + { + get + { + return this.mvarCopyright; + } + set + { + this.mvarCopyright = value; + } + } + public long Offset + { + get + { + return this.mvarOffset; + } + set + { + this.mvarOffset = value; + } + } + public long Length + { + get + { + return this.mvarLength; + } + set + { + this.mvarLength = value; + } + } + public string FileName + { + get + { + return this.mvarFileName; + } + set + { + this.mvarFileName = value; + } + } + public Dictionary CustomInformation + { + get + { + return this.mvarCustomInformation; + } + } + public object Clone() + { + PlaylistEntry clone = new PlaylistEntry(); + clone.Abstract = this.mvarAbstract; + clone.Album.Artist = this.mvarAlbum.Artist; + clone.Album.Title = this.mvarAlbum.Title; + clone.AlbumArtImageURL = this.mvarAlbumArtImageURL; + clone.Author = this.mvarAuthor; + clone.Copyright = this.mvarCopyright; + foreach (KeyValuePair kvp in this.mvarCustomInformation) + { + clone.CustomInformation.Add(kvp.Key, kvp.Value); + } + clone.FileName = this.mvarFileName; + clone.Title = this.mvarTitle; + clone.TrackNumber = this.mvarTrackNumber; + return clone; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistObjectModel.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistObjectModel.cs new file mode 100644 index 00000000..f0f6bd4b --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Playlist/PlaylistObjectModel.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +namespace UniversalEditor.ObjectModels.Multimedia.Playlist +{ + public class PlaylistObjectModel : ObjectModel + { + protected override ObjectModelReference MakeReferenceInternal() + { + ObjectModelReference omr = base.MakeReferenceInternal(); + omr.Title = "Multimedia playlist"; + omr.Path = new string[] { "Multimedia", "Playlist" }; + return omr; + } + private Guid mvarID = Guid.Empty; + private Dictionary mvarCustomInformation = new Dictionary(); + private string mvarTitle = string.Empty; + private string mvarAuthor = string.Empty; + private string mvarAbstract = string.Empty; + private string mvarCopyright = string.Empty; + private PlaylistEntry.PlaylistEntryCollection mvarEntries = new PlaylistEntry.PlaylistEntryCollection(); + + public Guid ID + { + get + { + return this.mvarID; + } + set + { + this.mvarID = value; + } + } + public Dictionary CustomInformation + { + get + { + return this.mvarCustomInformation; + } + } + public string Title + { + get + { + return this.mvarTitle; + } + set + { + this.mvarTitle = value; + } + } + public string Author + { + get + { + return this.mvarAuthor; + } + set + { + this.mvarAuthor = value; + } + } + public string Abstract + { + get + { + return this.mvarAbstract; + } + set + { + this.mvarAbstract = value; + } + } + public string Copyright + { + get + { + return this.mvarCopyright; + } + set + { + this.mvarCopyright = value; + } + } + public PlaylistEntry.PlaylistEntryCollection Entries + { + get + { + return this.mvarEntries; + } + } + public override void Clear() + { + this.mvarAbstract = string.Empty; + this.mvarAuthor = string.Empty; + this.mvarCopyright = string.Empty; + this.mvarCustomInformation.Clear(); + this.mvarEntries.Clear(); + this.mvarID = Guid.Empty; + this.mvarTitle = string.Empty; + } + public override void CopyTo(ObjectModel destination) + { + PlaylistObjectModel clone = destination as PlaylistObjectModel; + clone.Abstract = (this.mvarAbstract.Clone() as string); + clone.Author = (this.mvarAuthor.Clone() as string); + clone.Copyright = (this.mvarCopyright.Clone() as string); + foreach (KeyValuePair kvp in this.mvarCustomInformation) + { + clone.CustomInformation.Add(kvp.Key, kvp.Value); + } + foreach (PlaylistEntry entry in this.mvarEntries) + { + clone.Entries.Add(entry.Clone() as PlaylistEntry); + } + clone.ID = this.mvarID; + clone.Title = this.mvarTitle; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Actor.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Actor.cs new file mode 100644 index 00000000..7775f9ed --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Actor.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Subtitle +{ + public class Actor : ICloneable + { + public class ActorCollection + : System.Collections.ObjectModel.Collection + { + + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + public object Clone() + { + Actor clone = new Actor(); + clone.Name = (mvarName.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Event.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Event.cs new file mode 100644 index 00000000..f29f8b43 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Event.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Subtitle +{ + public class Event : ICloneable + { + public class EventCollection + : System.Collections.ObjectModel.Collection + { + } + + private Actor mvarActor = null; + public Actor Actor { get { return mvarActor; } set { mvarActor = value; } } + + private Style mvarStyle = null; + public Style Style { get { return mvarStyle; } set { mvarStyle = value; } } + + private DateTime mvarStartTimestamp = new DateTime(); + public DateTime StartTimestamp { get { return mvarStartTimestamp; } set { mvarStartTimestamp = value; } } + + private DateTime mvarEndTimestamp = new DateTime(); + public DateTime EndTimestamp { get { return mvarEndTimestamp; } set { mvarEndTimestamp = value; } } + + private PositionVector2 mvarPosition = PositionVector2.Empty; + public PositionVector2 Position { get { return mvarPosition; } set { mvarPosition = value; } } + + private string mvarText = String.Empty; + public string Text { get { return mvarText; } set { mvarText = value; } } + + public object Clone() + { + Event clone = new Event(); + clone.Actor = mvarActor; + clone.EndTimestamp = mvarEndTimestamp; + clone.Position = (PositionVector2)(mvarPosition.Clone()); + clone.StartTimestamp = mvarStartTimestamp; + clone.Style = mvarStyle; + clone.Text = (mvarText.Clone() as string); + return clone; + } + } +} diff --git a/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Style.cs b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Style.cs new file mode 100644 index 00000000..9724a657 --- /dev/null +++ b/CSharp/V5/Plugins/UniversalEditor.Plugins.Multimedia/ObjectModels/Multimedia/Subtitle/Style.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.Multimedia.Subtitle +{ + public class Style : ICloneable + { + public class StyleCollection + : System.Collections.ObjectModel.Collection

+zD5zQ(i#QJLJ#I@6q#Iq2@O-#C|?Ac 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 + + + UniversalEditor.Plugins.Multimedia.Fakes + + + +

H#2i#2j*NcLF`O*cB+X(Eq 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library.xcf b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library.xcf new file mode 100644 index 0000000000000000000000000000000000000000..42d44b503d6c1cb75ccfff4959203eed95e8f0ae GIT binary patch literal 173596 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 Yeq*M1`e@p>4E{U#=$~GDAN@1_KaC{_&Hw-a literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9e25932c0132726e16abc40cca44371413c610 GIT binary patch literal 896 zcmV-`1AqL9P)WFU8GbZ8()Nlj2>E@cM*00QJmL_t(I%Z-y=h}2aW z#((em|7XUXX+LMS$!T+!!M1fb-846~-3T)i%G_e}!tH}tFo^IbZ-j0Fg$Rspq5|0~ zr4(bu#8^wai2_B_3{fU#X0=WH=wsHI+4=gP|J%jX;tG8{SBLXH&+|TQ%~yH)<>8;JtKQQ&yu||LsNKxmpb}Z0Kf%s9H(;j(vNiHLwt4OxI7aMaC0We ztw@6L)4uFH@dW{6SP%>n3bi?hH~KzWE)t0+c(5? z&*Vc%kD%GGaYS}*f1RV>ozsYvq&s;py-OY-n@On&MC7+W3XG0!dH&?7QtES@ zKQkAHrTpt~E_Y+7QmIgyEwW7ic0000 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/Concertroid/Images/Library_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..15631ccb6f0c14768097b2d2f802a75c71d5036c GIT binary patch literal 2314 zcmV+l3HA1gP)WFU8GbZ8()Nlj2>E@cM*00?eLL_t(o!|j)8j8)|s z$A9lR=bn4-?3bCjv%qY?;D9J1B2&O3R#`M!%VG%#Ninh3Hm$WyBcVwXTN_;Khc-5v zRBDS=F|Caj3}x4*EJdYJU>3Gnn2}*-?!9y8Zs(l$>4$q~WD$tQkA2REcRP8W|NDRb z&pGc4|F zDcAGvTW`>Dcpno(HnZ=T&G_pliBcX$Fd&C^9OUpjJ9u+To2tHPuA05%9@gGB`w7>{ zoU(l3qc=bBf^+Z>4hNW{hPai*d**6#5C7mtD)uDX{ShnaM?wC897w^9t*B2yU^r4DN zaROu5`F;y-{SESsWsB8)^Xq7uR4hnPC0&C}+j@9?+X+r|M6e7%6qaG0IP&&m6D|v& z_TI1k8O16~83ZFP4SD5cG8tlLd--;mMJ(fyNM#syGjybEjQQ(WQX9w4Hwl*caSDU{ zb?;fW?*EiLTcNe!Gc7DbVHzf;VV*el_PPrISQjfoDFp(Epp+s%KcA$}2O^*}S_!W9 z(AuS|caUc~lccnV=QA0M^y9c-83t+B#8L*H)+lA5w4l(J$m~J@NDf5~jpSxUM!6CM zazop;K|7?<2?qM3IO1Vh0Yn6?HJ*`mX^6s88bdDCxpDDO&Ih9|hL;5>xsd`ipfE5j z8~p4M4FB3A~W)QJ1fcAujFB-`ZjGrFvh+> zd3jpX`LPk@7#uHFlp$$PPjS>S- z1SN8{D#!+uk*%ILXPFA^sGQ^!N*SY>5dnRkbFBrfG+O6$r4`kD)XuM`Icguo0hR3$dd;LhZzo zEPzdqEacF;JN?bK&0G8QsdMwY#Kg9&tnhQYQYb{b=uDcDhRIabH_|+ziA*|8BIP1t z;(0;hahL9{9y&Wam{Ad8LPH&O^>svsJ^F_|)!jQ#SvP0hlh6O|@pj;)QEk8W(>o;) zEF_7K_LS!1-gC5_=%d&!Ash}onb69SkRu zjIFLFTv3IH;CUXIjDz+(v(qu_yZ5iN08&GPBx3`J)>LbU@ugu7 z`zAAH(sZWZID=#=MIs(2ofyVY5C{ZmZE4~3>2`X1dMF8nsIID}s;ZK7I*seOqYNsg z$T$wkWD*e7*VoJY@9kk~O?cd>1}sbAd7w-S#3UMx@zfu8fqoURC@ZUA(&THYs3^y0 zTXY<6r92#_tSrQ=<~i85MLLsVD4xXgT##(Vq*7^O(IH&V!!QhX@7_yKPd9}{h13-L zZ#XytKs>=`Kwf&i0V0s$^V9(Xr=w63I9%tw%^FQ`vvMWl=G%ma)}gN<$$| zA3sKUsEB0?Z)EGK~5H9tR=>C}EOb5}nex@vVg!u6-6a;J%i5O?P&k)QDQd1G4zpt0{a1?*0my$7K z`OhaUfTAQchQh)ET3Xw7&wHv96Tlw`p0rHE6@%K6pzTKsADu}`EG5de0~m%${rE}T zwP-QFd~6;6J=R7%K8#s21ACy2j?UA}m_Ci_>IzKLWMD7?O5^wYi6(?-Y#3i4NHiLk z>!wao>({TJJgKqq+}`)z%QEoBzmLBHypsFwP5t4*rls}O<+sPsbG0(?1qz7{XQ-;3 zNKs)Ct5&Sy@eQZwZ~u^zys=z6HNZfBA1$qIEMLBiR4T>Rty|EZM`dLdrq80iwVl$^ z5;fz-nYS-ly6o6zN9{}P?Ed5D_Iz@(>*blvx2!b$MPnMSnXbwz#>!y-8C6qL&xZ&0 z%A1>ht8_^{rMj1vBOlQ)VLVk;6@2i)AtKQs(y0W7>7zVcDQzuBmE(ATu0>>G7^ad{r)_nLlL5bgO~==+ + + + + + Asset Library + Creates a library that can hold different types of Concertroid assets, like models, animations, and songs. + + + Concertroid + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyFileSystem.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyFileSystem.xml new file mode 100644 index 00000000..90cdad22 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyFileSystem.xml @@ -0,0 +1,18 @@ + + + + + + Empty File System + FileSystem + Creates an empty FileSystem project for packaging files in various archive formats. + + + File Distribution + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyTorrent.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyTorrent.xml new file mode 100644 index 00000000..1f6acf89 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/EmptyTorrent.xml @@ -0,0 +1,18 @@ + + + + + + Empty Torrent + Torrent + Creates an empty Torrent project for distributing files over peer-to-peer networks. + + + File Distribution + + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/FileSystem_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/FileSystem_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce3d58cf2f526872748537608972721be30bb2a GIT binary patch literal 647 zcmV;20(kw2P)WFU8GbZ8()Nlj2>E@cM*00HYsL_t(I%dL{JYLrnB zg}=FX?)^6*o45*gh7`df`WAw%r9z4&FQ6dUSXia9P_(mAVr3NcS%MI2QzXQsFtVF9 z``@`^u|_uFT6vmbit{mZW`y6mb^8t*{q_D*uh(yyMsm(1RdUW~jA&Als-K;Ww?4f8 zw6(eU7yw~P@3ud_=ytpJQ`1b0sx&E)QbIMNs+3|cZ{E26;M}9r0C(2h9e1bJin~*4 zCDe+TAYy>8O?xf?z*lOmc&*f0F*8C4m>Dq$W&-%iOn}w8YGzb3YK&N|1T#d0AcCsk z`07l+*S$TOoPDm-k<>JFnoNih5Q0FE;F^-m1bjO@q`R;n!<5KP1_@|NVbOo)-w;gG0`SwTb&W&+NBo(;?l(}Gz>wVk!An@002ovPDHLkV1jl-9q#}D literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/FileSystem_32x32.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Templates/Project/File Distribution/FileSystem_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e393e1c6696ef821d689244da9659b14b6819021 GIT binary patch literal 1473 zcmV;y1wQ(TP)WFU8GbZ8()Nlj2>E@cM*00kvUL_t(o!_}5gh#kci z#(#Bh-+{oLx^KD)D77s<2f-7+$f-86a3+O27QcxG7 zYmJGbLFFk54@KsM%-p%%U3LDrsOmqH4B{jUv7out=XUq`>O0^0s)D;S9*@6xx(~F; zSwxuE#=LgsjWe%}MGLKLfA3;PwNvoe@ng7yDwsQJVCtxYn&(R$Q80(3hFbp56vWDV z>X_wc+;eO^KK%4+COZKL01hFXze)!OJmBRycPHdGfE)+MojzLL+;L3)kRLBVdQ_v| zK3Vy=Z%-9C|9SuOB{+TR%fC(oH|_f$|9<4b3(4?Iw*%hS)iKK49CJ#|eYp2Q2WnvE zeeCIHpC@!(FyB}|{O!s2&V=a{Oi_tQYLHly(t^~~h}5VwNJ<>L{|OErI-bQvNn!<5 z0g(ZXfY}iH>E|DL>D9M01M`jb!{49&;LPgvw=tQ{a`M<9sV22s#C9wH#x10s6Pr0F zKY9*(;3*CqI*warzzZAWRgYOQ&zVE3>7`aTAytR5KjI zOqsbu>4*t1t@f~d+0}gY=}V|S%7H_749U8Sfejx6DnL~gQ>FUvsrSz8KX5zJ)@W=2 z$J}sJ+?DCHf~Cu-mS!w1Ux7*j0)YwFUUv&0tUbfOo_u%cb;~X2=BVenj>_O3P%}gf zHKkf!UPd)>?F~mrbxjDNAkF|xBj$!_!b~tpsN}iEEt;fRn5E`jLht4ULZ_aKxqSq|+uGb6Gz&v1P zeR)(YYaq8+t~G#}@c4foW4d?sf>u0o^e*nZqe7)&^V~07weLDo(q8d>;&CU8Yd;dC zs9{y^4f`aE&#B$b^?t*BB^GA<8H*%^?W$50|o(hz3Bh^pYOs4D8A2$yY1h87(3(9cz~2C~g5s)B07H1hC6caqu~>1rMq z*#qJhDMnNyB7&Ksrg@bXcBJ3QNwtWtVt1FlZAvmrHwi!?71-T@HF%7`-GuaEwj4FhHs$|Mjw%>o;c#s(PA?<2uzXg(N zG_|NSmTXBUbGWRsxe)HZo}!5v&{p#)o*K6b4(34r}C0?w@&CTm>CXycJhl{ z3U}1XrSQghk06Lu8imwGA=;G|tUA>>+LDuOByh;7`p6RJeqt*_-p z1DH&}B<

wG>u})t5 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 literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebForm.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebForm.ico new file mode 100644 index 0000000000000000000000000000000000000000..d331d7b79de28c704d2954af6f5847efd7e70edf GIT binary patch literal 4150 zcmeHKYfzNu75>unXMf~pes!GAr0rzVnRePZnIz*ST1`L`FCYji8i^1u2qh|4xd|fR zr2#95BoGO#0z!6?JBTdqvfM$g3xbyzBbw@7kfdeL>GQp>d~P&DrkPG>I@52?x4V3t zJ?DMTbDrnCt0>PYKT}?KLBacrO7QcF@@qv=7A%l|>wcjq$MEd8cm@{*kA)xJ{!>>` zMpQ(A=RW_p!#Dmp%;&AWUQ70@TeNGuE14>o zN|=g;d3D)$u6aZH>vN8b((E8}4^umn*-(6msg9|N=?kV(VO#qhA?p`Q|Ej!WljN$* zJ!&|e)=RS{z0Sncd_K>RlU|e_m7B0v&$N5Q5$3yG`q!U5d7J14^EmS`Q=388$u#4z zP2IRQ)@{m5469*^7fZb#H^dv!={q zIA^LTG?wN!pF7j|`Kh{sOju50nDqa*UYQjo{<)uatKU_5wgC4M+$tacfBobN6d#RA z4c&Y=WOGW0fASu`L%TO7?eakvCj@)P2YJQqSby+?b+Oym#%x~`{r-DVTUSR0tcnO& zbzrl{{!Q{F(4EI~{7vJS!zRN-(OWsREU~{C$s&pp~e$5OWO1(9ma&!97b!Wn) z^WcOtdVKo8m^0i8WpeBuat04N0E6n!gCfkx$ z+oD$cn?kfgyq0MDE%`X%o}d>RA3TO&OfZ3Dr{hD1n65JQF?Ta{Fj<%&IiNL&(8Sch z3hn&q{vQmE zhlmf61{PsHk3||;D)Wxng^*wu?m(Q)h@E7Dcw3o|pyZs}-725jii?X4$Pt_moRF<8F zfdC+6JB_JR4(+7kJD)MF@3impU#Z1!I-mC~^CM;_vjhTF!Y(RukAo3kGDfJn1q=kV z6H*}fJowf#`E)x#Z7u%gvV1u%Fv^fZ06|D$_%sW=R`->el8?R;{WJPw{fQy$-)rB$ z*+YxpT2YAj*uo4Gb|HZP*41aT(N0Jqcn#7Kwg9Z>D^6bAC8n+Y_J}Q>T6~j1H~UQe zv5VT`GXm=;qyrG5om8yRP8zT0u;vyVSeOC_9MC{5zNM^(qU%4!qmbXJmiGTYVkX3%Mo9u_)Zi`V%>b95WEHuf^;e)WIN4Y zAEekb?1Bz||J0sTPCs1kO86lhnZXwmCXC7A;4ssS;7|9}x;qfSf;ZT)@C)rkL8 z|06}~#WG<1)N|}&{`fe}?Xx;#wm*q~)mSV08CyV=unXBv=9+SJtV2i#fDqE5?qdG> z0PDyxr*`PWE(T4FGQO;m1Oh4A>h!3RNTF6qVm&t|)JZglHR1FM^_y!aj+vOoNY&~y zY;M-#yQgSxsB~*5a>H6Zu?nndQk;%QA4>=KsfTfnpP0tf*5Z$}qo-JT$p*7#1dbkg zeLkE@4nb|y;1LWAMof3U)dhI%(7>(`NKD^1ifYq{8P)eKQwRoU6cRI zjlREW*zi)l_pj>KEvQ}l%cSd091OJh*3K)4|I{Uc(Ar5>Nk|8PpgCTv!xZ!S+V?b^ zQ*JurgT1x*<6U3|*B1V*^i(Q7WX9||61D{&-~$w3vST4lz#3J8bZ8omVG1CGz^c+A zd5v?3c1TB-YdvjzDBn^Vv&w?6cA#+DWYvQb-L)ib)k~5-B)om#=$#q=1cenXDbg5zFNv zQ`10eeSdRJPg7-QeTAjE6dGu(C~PjvZ#tKYc~t#bR^=zh^|=}4*{K&!CYOAis5=pd ebKvJ0QH5y{(zN*h(;wVx9 + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.ico new file mode 100644 index 0000000000000000000000000000000000000000..1aa23046995fc02cbcb8b6e6503bedbffad38b13 GIT binary patch literal 4150 zcmc(iX;4#H7RS@$hpw9Hs`kTtu&df?OM9jj$95S96l@Ry7hF)07HLFw7ZedhP(ehI z#Q+Mj69^Cj2}!`Phb;t5gBVDFge8CkPz2cm*+U3(!n2tG-Ou?jQ}gOB@7?!*zjNPt z_nvzn2J;2xPnh-VF;H*7Tv>;~{0)P_Y}$lelfJ@WVxes-w1ETz%}Y9{{#!@c4x*}{vCuT9e3 zGRJ4n@>t^5no2^#vL4}=aRrL$F|*(!M&717oea00-W7lD=U@v}M zJv(Wh>!?vIEGidwIvGI;Da7iqM9`$KU*@Z2b2gOAh#ssU`UHD>iLg~)zs%>Ar#uL< zq50d@q=Y%03f}SkjV<4}e!Jd5HrT1JNBDCMw64%od(-~x61th`xQ&?n1mSPnbXh(u zT&tI4_=iU9aVYw#>GAh=K?WA-e?|00Kl&@j2G{CI$*${4x29+A*9I7Q6nNm-JzXg>-BbUreXOJ)GZf&UleR<8r zt>g8%;jKQnxApY?y28F1 zYF~9hFN4%mLF_3bbeCjz(eYg`aeP`DpOV~BkkmnX!OM%|s>X+vOD5zaLfKH4>@8mgCWNgz69U8p zOU$jC0TV5ZndS;^HWrdMny5{Gm)w2_wjg=j&avrm^t%lC2Dr%{qHkXoqEhfGy z%3)D6>&WS~c`4O|L`L?D3VfWHQw?vy%ZWkfYov4X;T|Y8lIeNzgnDXBJ^5Za4pDPZ z@vdJ!+$$gIlE3Yg_4A~?;HVaOi`mXsx(M3F6mx3eTdd_%Mm|u5eN--&#%9r~N@;X* zVF6wvoiz_XYZhu_9B_2+wS#*+f7<1C;KxhGI~?~tI(+25`Jq5lvpWZV@-sHMwQv6% zm}mzRb?td^Yx(+Lc|j#tj=qIbqmWoe+Z~FqJrI1t@TTQnFY`T@&33yV*y(H>Zhbt& z(h4!*zhnaZGuP1wCOXLfUIbwLP{az#M==%p-z%hX+o(wYi%HP`1*QB1&e=NUqJFs9 z=WAu?ZK2=t(CTpTAqy$2GlHhMj#r(OB=r7kHEI}^P-@l6Q`v4OGo1BlCV@xy`yJMA zd2-A;^zadBZ>yyHwS@mGpPIUgPyHyS43AQD{%@nP>%sqp#o+%;h>NxbSI*>l>eCK} zoi=@NQokkU^qHq8Pl11=LJpV^6sE7@>pLILA)uDG6Fh3C;I-pbhfLK#CdjOCh=-B*3C7_#)fEOonYj9%cAUt zRiullr=xjFVg&LP{=Vh*){QrG0cxm6KFIH_AfoegV;{hZ+DwRjpLur(cPBW?!<%mB zS!^AdZp;m_z2#$Z($mu1e@oD9JA}W-05%c+5Cb7V$%ndyjC^!{UR)@Qd?qgP1Nli{ z)a^jB`<*HWe1VM!>mqn;f6nKGY52~6M1OnT%M#)5+a0lI`vdTgZre2??5iq3=NBY| zX;sR`?AX-g`;K&1?|Nq(-g`77VD!0X-;?uhSq7GPgOe!+zP`s0zU9GmGvj#W$6@7| z2;Ksg40JvY_(D|^()M_-X?3a=BN0)oC2_xB&?+6*ZctWPr)C*@(^aTfs zp>M(|-_S76YaOocZ!S7D+Fz&!|EQN1ivboLolnQbENU0zvRMKXhiy+~Pcrxt&V)ih z9mxrabL>jCqQ;$w$N5Z7jV$f0q!4CdJnJI4ZasQG*ieGbFUfp{ICgZrue33@<_$?O z%!;7;-Q!~&^R6XC{!*LzXt}V)!VCC0V=M)ts zrjw&%@*WmtK4ceWty;e{a;Zi(J1?11izh@)mFRrfr7rW)PGFy?)xdUAt5(5yeqBng zB_t{{N$vG(ex&qv1kt+q-oamqtVW)sybJzJq6)g{vglL$!%ubnr~0?{-+SgWZC}FuuOWX2*-U5qUlk5% Ai~s-t literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.xml new file mode 100644 index 00000000..8725f44f --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebService.xml @@ -0,0 +1,68 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.ico new file mode 100644 index 0000000000000000000000000000000000000000..455d76c830cc2870415abe0bd004d2b9bbf40196 GIT binary patch literal 3638 zcmeH}2~^E_6vuCbO31!MvL;)Wlp>K9Q6!~(Bk57JA{C)R5fLRzGL5CsqGD!@3=>IF z+EA1jvdz?cuVF@d^Zh-Z`4`TdGv_#S<{bB&&-vbazyJ5|_x` zM>L#>l$GDr$7P73&>MjsE+MqV*FioR`!%FV#Y~OHI%txbqXvz4(xPKF>ZIv8jWkzG zBkh&bNq3zQ-Sp8Xy%1y4NwlG+T@Ivw)R9b5+{hG|r}Bsn-6#7jA94WFhpWly>?-oe z2_a9$#SjY0+fD`NPE*OHb5wri0?48JMc1jitdQ!eE2-{5CDp%tM#n_Wlnhe9NpK3J zfpm}o&VWpi4bFk@z*&)qzK5O%KZ1(4O>_Zz5&Q%$gL~**#&uVb=R)(K`JlL2M33O* zp?3|GH#buu`Zqusyh8Mf#I=ZSA}>LH3t9!Q1X>23HaAfP^fstPzY1syljWIQu7S;w6wHX?Wmxvq$oYfY>uw3 z9;=;t;C?dNxS#PXR=f1U{W{LDu{1X~W%Xk5{pLH^T3Ia+*X~Q*mbfl*wzsvmW;OTi zpl%iH>lGsP?_jTGb58zEXzYYmu=7ck#kM}x#zAYul#WGFWg2Ur7@&^sev|?@1+^J4Wxgifef$m z$taIc#$e7hKAGk>(7b#;nO*18&U=Zppny*ng#xO*aha@c2*?`P74gZwNI=fT;1-`; zO9bRvDj@eVP%b17;8`IcuR8+rz9S^xyF&5@t1E>R0G{0~rogI3dQnwMLH8Re1ccTI zDZI9kwmfX42q1i1L$97cqUOeW620P!XZ{bEqioja0Lh%s!9U~@>YqWbSl`WiHtVmz zy9T`qWpn>JVDr8JDw+2MsBfZ{%==>GZ06sBvbkT3ycEjjf0?+4eE}^+T>)jg;5M`z zdI!pOLM8MLvLlvk-&UQo%lY=Hi-*t$&___VJ060^$R9!34*3OI z2W7kD33!IQ4*C?lK>iH+9Q=x$?U>)7FU2*>-|ZU#dJV{hP(HK~%Jz>?oQvpp=pX2@ zee@czo%9AYfw$o6e)`QspP}4ZKgHfX zJIi-yXFZnVr>4N4-`&tqZc}iukMA;`%OczH96#;U(Cqn$dELS{y!Rc{IevPor#P|OC*)9BW!-pUS4NUnq z>6?TDu`xR%OZEVXyBKk^&k5S|4L3! literal 0 HcmV?d00001 diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.xml new file mode 100644 index 00000000..9cbba705 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Document/Web/WebUserControl.xml @@ -0,0 +1,35 @@ + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ASP.NET/IronPython/Images/Website_16x16.png b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ASP.NET/IronPython/Images/Website_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3479109ab88fa4a76bd0bcb1fc577c5238f09377 GIT binary patch literal 886 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 + + + + + + IronPython Web Project + + + Website Development + ASP.NET + IronPython + + + + + + ]]> + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/ColdFusion Project.xml b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/ColdFusion Project.xml new file mode 100644 index 00000000..54d486b3 --- /dev/null +++ b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/ColdFusion Project.xml @@ -0,0 +1,30 @@ + + + + + + + Basic Project + + + Website Development + ColdFusion + + + + + + + + Hello World + + + #ucase("hello world")# + +]]> + + + + + + \ No newline at end of file diff --git a/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project.ico b/CSharp/V5/Content/UniversalEditor.Content.PlatformIndependent/Extensions/WebsiteDeveloper/Templates/Project/Website Development/ColdFusion/Images/Project.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ce3a3b28135efc1b83ee87230c0f2643b92b951 GIT binary patch literal 135607 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%0Ar^dApf6PSx^?l27dJT&us!`So1*{q!Hzj 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