From: <sa...@us...> - 2009-04-07 19:03:28
|
Revision: 2766 http://mp-plugins.svn.sourceforge.net/mp-plugins/?rev=2766&view=rev Author: saamand Date: 2009-04-07 19:03:23 +0000 (Tue, 07 Apr 2009) Log Message: ----------- Modified Paths: -------------- trunk/plugins/MyLyrics/LyricsEngine/LyricSearch.cs trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/LyricsLibrary.cs trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.Designer.cs trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.cs trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj Modified: trunk/plugins/MyLyrics/LyricsEngine/LyricSearch.cs =================================================================== (Binary files differ) Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/LyricsLibrary.cs =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/LyricsLibrary.cs 2009-04-07 18:24:32 UTC (rev 2765) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/LyricsLibrary.cs 2009-04-07 19:03:23 UTC (rev 2766) @@ -285,7 +285,7 @@ tbLyrics.Text = m_OriginalLyric; tbLyrics.Enabled = true; - lbTitle.Text = "\"" + m_CurrentArtist + " - " + m_CurrentTitle + "\"" + (!item.Source.Equals("") ? " found in " + item.Source : ""); + lbTitle.Text = "\"" + m_CurrentArtist + " - " + m_CurrentTitle + "\"" + (!item.Source.Equals("") ? " found at " + item.Source : ""); btSearchSingle.Enabled = true; } Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.Designer.cs =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.Designer.cs 2009-04-07 18:24:32 UTC (rev 2765) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.Designer.cs 2009-04-07 19:03:23 UTC (rev 2766) @@ -115,6 +115,8 @@ this.tabPageAbout = new System.Windows.Forms.TabPage(); this.btClose = new MediaPortal.UserInterface.Controls.MPButton(); this.bgWorkerSearch = new System.ComponentModel.BackgroundWorker(); + this.gbLrc = new MediaPortal.UserInterface.Controls.MPGroupBox(); + this.cbUploadLrcAutomatically = new MediaPortal.UserInterface.Controls.MPCheckBox(); this.tabControl.SuspendLayout(); this.tabPageDatabase.SuspendLayout(); this.gbGenerel.SuspendLayout(); @@ -134,6 +136,7 @@ this.tabPageReplace.SuspendLayout(); this.mpGroupBox4.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dbGridView)).BeginInit(); + this.gbLrc.SuspendLayout(); this.SuspendLayout(); // // tabControl @@ -605,6 +608,7 @@ // // tabPageSetup // + this.tabPageSetup.Controls.Add(this.gbLrc); this.tabPageSetup.Controls.Add(this.gbGUI); this.tabPageSetup.Controls.Add(this.gbTag); this.tabPageSetup.Controls.Add(this.mpGroupBox3); @@ -625,7 +629,7 @@ this.gbGUI.Controls.Add(this.lblyricLengthLimit); this.gbGUI.Controls.Add(this.cbUseAutoScrollAsDefault); this.gbGUI.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.gbGUI.Location = new System.Drawing.Point(5, 235); + this.gbGUI.Location = new System.Drawing.Point(5, 211); this.gbGUI.Name = "gbGUI"; this.gbGUI.Size = new System.Drawing.Size(538, 83); this.gbGUI.TabIndex = 33; @@ -688,9 +692,9 @@ this.gbTag.Controls.Add(this.cbMusicTagAlwaysCheck); this.gbTag.Controls.Add(this.cbMusicTagWrite); this.gbTag.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.gbTag.Location = new System.Drawing.Point(5, 324); + this.gbTag.Location = new System.Drawing.Point(5, 347); this.gbTag.Name = "gbTag"; - this.gbTag.Size = new System.Drawing.Size(538, 52); + this.gbTag.Size = new System.Drawing.Size(538, 45); this.gbTag.TabIndex = 31; this.gbTag.TabStop = false; this.gbTag.Text = "Music tags"; @@ -725,9 +729,9 @@ this.mpGroupBox3.Controls.Add(this.cbMoveSongFrom); this.mpGroupBox3.Controls.Add(this.cbAutoFetch); this.mpGroupBox3.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.mpGroupBox3.Location = new System.Drawing.Point(5, 382); + this.mpGroupBox3.Location = new System.Drawing.Point(5, 398); this.mpGroupBox3.Name = "mpGroupBox3"; - this.mpGroupBox3.Size = new System.Drawing.Size(538, 92); + this.mpGroupBox3.Size = new System.Drawing.Size(538, 69); this.mpGroupBox3.TabIndex = 30; this.mpGroupBox3.TabStop = false; this.mpGroupBox3.Text = "Find lyric dialog settings"; @@ -736,7 +740,7 @@ // this.cbAutomaticUpdate.AutoSize = true; this.cbAutomaticUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbAutomaticUpdate.Location = new System.Drawing.Point(16, 45); + this.cbAutomaticUpdate.Location = new System.Drawing.Point(274, 23); this.cbAutomaticUpdate.Name = "cbAutomaticUpdate"; this.cbAutomaticUpdate.Size = new System.Drawing.Size(222, 17); this.cbAutomaticUpdate.TabIndex = 8; @@ -750,7 +754,7 @@ this.cbMoveSongFrom.Checked = true; this.cbMoveSongFrom.CheckState = System.Windows.Forms.CheckState.Checked; this.cbMoveSongFrom.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbMoveSongFrom.Location = new System.Drawing.Point(16, 68); + this.cbMoveSongFrom.Location = new System.Drawing.Point(16, 46); this.cbMoveSongFrom.Name = "cbMoveSongFrom"; this.cbMoveSongFrom.Size = new System.Drawing.Size(341, 17); this.cbMoveSongFrom.TabIndex = 7; @@ -779,7 +783,7 @@ this.mpGroupBox2.FlatStyle = System.Windows.Forms.FlatStyle.Popup; this.mpGroupBox2.Location = new System.Drawing.Point(5, 5); this.mpGroupBox2.Name = "mpGroupBox2"; - this.mpGroupBox2.Size = new System.Drawing.Size(538, 59); + this.mpGroupBox2.Size = new System.Drawing.Size(538, 50); this.mpGroupBox2.TabIndex = 29; this.mpGroupBox2.TabStop = false; this.mpGroupBox2.Text = "Basic settings"; @@ -787,7 +791,7 @@ // tbPluginName // this.tbPluginName.BorderColor = System.Drawing.Color.Empty; - this.tbPluginName.Location = new System.Drawing.Point(96, 24); + this.tbPluginName.Location = new System.Drawing.Point(94, 19); this.tbPluginName.MaxLength = 30; this.tbPluginName.Name = "tbPluginName"; this.tbPluginName.Size = new System.Drawing.Size(144, 20); @@ -798,7 +802,7 @@ // lbPluginName // this.lbPluginName.AutoSize = true; - this.lbPluginName.Location = new System.Drawing.Point(13, 27); + this.lbPluginName.Location = new System.Drawing.Point(13, 22); this.lbPluginName.Name = "lbPluginName"; this.lbPluginName.Size = new System.Drawing.Size(68, 13); this.lbPluginName.TabIndex = 14; @@ -812,9 +816,9 @@ this.gbLyricSites.Controls.Add(this.rdLyricsMode); this.gbLyricSites.Controls.Add(this.rbUserSelectMode); this.gbLyricSites.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.gbLyricSites.Location = new System.Drawing.Point(5, 70); + this.gbLyricSites.Location = new System.Drawing.Point(5, 61); this.gbLyricSites.Name = "gbLyricSites"; - this.gbLyricSites.Size = new System.Drawing.Size(538, 159); + this.gbLyricSites.Size = new System.Drawing.Size(538, 144); this.gbLyricSites.TabIndex = 28; this.gbLyricSites.TabStop = false; this.gbLyricSites.Text = "Lyrics search mode"; @@ -844,7 +848,7 @@ this.groupBox2.Controls.Add(this.cbSeekLyrics); this.groupBox2.Location = new System.Drawing.Point(229, 48); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(301, 100); + this.groupBox2.Size = new System.Drawing.Size(301, 90); this.groupBox2.TabIndex = 28; this.groupBox2.TabStop = false; this.groupBox2.Text = "Selected lyric sites to search"; @@ -855,7 +859,7 @@ this.cbLrcFinder.Checked = true; this.cbLrcFinder.CheckState = System.Windows.Forms.CheckState.Checked; this.cbLrcFinder.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbLrcFinder.Location = new System.Drawing.Point(20, 70); + this.cbLrcFinder.Location = new System.Drawing.Point(20, 61); this.cbLrcFinder.Name = "cbLrcFinder"; this.cbLrcFinder.Size = new System.Drawing.Size(68, 17); this.cbLrcFinder.TabIndex = 10; @@ -868,7 +872,7 @@ this.cbLyrDB.Checked = true; this.cbLyrDB.CheckState = System.Windows.Forms.CheckState.Checked; this.cbLyrDB.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbLyrDB.Location = new System.Drawing.Point(216, 26); + this.cbLyrDB.Location = new System.Drawing.Point(216, 17); this.cbLyrDB.Name = "cbLyrDB"; this.cbLyrDB.Size = new System.Drawing.Size(53, 17); this.cbLyrDB.TabIndex = 9; @@ -882,7 +886,7 @@ this.cbActionext.Checked = true; this.cbActionext.CheckState = System.Windows.Forms.CheckState.Checked; this.cbActionext.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbActionext.Location = new System.Drawing.Point(131, 70); + this.cbActionext.Location = new System.Drawing.Point(131, 61); this.cbActionext.Name = "cbActionext"; this.cbActionext.Size = new System.Drawing.Size(68, 17); this.cbActionext.TabIndex = 8; @@ -896,7 +900,7 @@ this.cbLyrics007.Checked = true; this.cbLyrics007.CheckState = System.Windows.Forms.CheckState.Checked; this.cbLyrics007.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbLyrics007.Location = new System.Drawing.Point(20, 49); + this.cbLyrics007.Location = new System.Drawing.Point(20, 40); this.cbLyrics007.Name = "cbLyrics007"; this.cbLyrics007.Size = new System.Drawing.Size(72, 17); this.cbLyrics007.TabIndex = 4; @@ -910,7 +914,7 @@ this.cbLyricWiki.Checked = true; this.cbLyricWiki.CheckState = System.Windows.Forms.CheckState.Checked; this.cbLyricWiki.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbLyricWiki.Location = new System.Drawing.Point(131, 26); + this.cbLyricWiki.Location = new System.Drawing.Point(131, 17); this.cbLyricWiki.Name = "cbLyricWiki"; this.cbLyricWiki.Size = new System.Drawing.Size(67, 17); this.cbLyricWiki.TabIndex = 2; @@ -924,7 +928,7 @@ this.cbLyricsOnDemand.Checked = true; this.cbLyricsOnDemand.CheckState = System.Windows.Forms.CheckState.Checked; this.cbLyricsOnDemand.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbLyricsOnDemand.Location = new System.Drawing.Point(20, 26); + this.cbLyricsOnDemand.Location = new System.Drawing.Point(20, 17); this.cbLyricsOnDemand.Name = "cbLyricsOnDemand"; this.cbLyricsOnDemand.Size = new System.Drawing.Size(108, 17); this.cbLyricsOnDemand.TabIndex = 5; @@ -938,7 +942,7 @@ this.cbHotLyrics.Checked = true; this.cbHotLyrics.CheckState = System.Windows.Forms.CheckState.Checked; this.cbHotLyrics.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbHotLyrics.Location = new System.Drawing.Point(131, 48); + this.cbHotLyrics.Location = new System.Drawing.Point(131, 39); this.cbHotLyrics.Name = "cbHotLyrics"; this.cbHotLyrics.Size = new System.Drawing.Size(71, 17); this.cbHotLyrics.TabIndex = 7; @@ -952,7 +956,7 @@ this.cbSeekLyrics.Checked = true; this.cbSeekLyrics.CheckState = System.Windows.Forms.CheckState.Checked; this.cbSeekLyrics.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.cbSeekLyrics.Location = new System.Drawing.Point(216, 49); + this.cbSeekLyrics.Location = new System.Drawing.Point(216, 40); this.cbSeekLyrics.Name = "cbSeekLyrics"; this.cbSeekLyrics.Size = new System.Drawing.Size(79, 17); this.cbSeekLyrics.TabIndex = 6; @@ -967,16 +971,16 @@ this.groupBox1.Controls.Add(this.lbSpeed); this.groupBox1.Location = new System.Drawing.Point(6, 48); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(217, 100); + this.groupBox1.Size = new System.Drawing.Size(217, 90); this.groupBox1.TabIndex = 27; this.groupBox1.TabStop = false; - this.groupBox1.Text = "Default select mode"; + this.groupBox1.Text = "Search priority"; // // mpLabel2 // this.mpLabel2.AutoSize = true; this.mpLabel2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.mpLabel2.Location = new System.Drawing.Point(151, 25); + this.mpLabel2.Location = new System.Drawing.Point(151, 21); this.mpLabel2.Name = "mpLabel2"; this.mpLabel2.Size = new System.Drawing.Size(43, 13); this.mpLabel2.TabIndex = 26; @@ -986,7 +990,7 @@ // this.trackBar.BackColor = System.Drawing.SystemColors.Control; this.trackBar.LargeChange = 3; - this.trackBar.Location = new System.Drawing.Point(36, 42); + this.trackBar.Location = new System.Drawing.Point(35, 37); this.trackBar.Maximum = 3; this.trackBar.Name = "trackBar"; this.trackBar.Size = new System.Drawing.Size(158, 45); @@ -1000,7 +1004,7 @@ // this.lbSpeed.AutoSize = true; this.lbSpeed.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbSpeed.Location = new System.Drawing.Point(29, 25); + this.lbSpeed.Location = new System.Drawing.Point(29, 21); this.lbSpeed.Name = "lbSpeed"; this.lbSpeed.Size = new System.Drawing.Size(38, 13); this.lbSpeed.TabIndex = 24; @@ -1114,6 +1118,29 @@ this.bgWorkerSearch.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bgWorkerSearch_RunWorkerCompleted); this.bgWorkerSearch.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgWorkerSearch_ProgressChanged); // + // gbLrc + // + this.gbLrc.Controls.Add(this.cbUploadLrcAutomatically); + this.gbLrc.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.gbLrc.Location = new System.Drawing.Point(5, 296); + this.gbLrc.Name = "gbLrc"; + this.gbLrc.Size = new System.Drawing.Size(538, 45); + this.gbLrc.TabIndex = 32; + this.gbLrc.TabStop = false; + this.gbLrc.Text = "LRC settings"; + // + // cbUploadLrcAutomatically + // + this.cbUploadLrcAutomatically.AutoSize = true; + this.cbUploadLrcAutomatically.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.cbUploadLrcAutomatically.Location = new System.Drawing.Point(17, 20); + this.cbUploadLrcAutomatically.Name = "cbUploadLrcAutomatically"; + this.cbUploadLrcAutomatically.Size = new System.Drawing.Size(275, 17); + this.cbUploadLrcAutomatically.TabIndex = 7; + this.cbUploadLrcAutomatically.Text = "Upload manual added LRC to LrcFinder automatically"; + this.cbUploadLrcAutomatically.UseVisualStyleBackColor = true; + this.cbUploadLrcAutomatically.MouseLeave += new System.EventHandler(this.WriteMediaPortalXML); + // // MyLyricsSetup // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -1160,6 +1187,8 @@ this.mpGroupBox4.ResumeLayout(false); this.mpGroupBox4.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.dbGridView)).EndInit(); + this.gbLrc.ResumeLayout(false); + this.gbLrc.PerformLayout(); this.ResumeLayout(false); } @@ -1253,5 +1282,7 @@ internal MediaPortal.UserInterface.Controls.MPCheckBox cbUseAutoScrollAsDefault; internal MediaPortal.UserInterface.Controls.MPCheckBox cbLrcFinder; private System.Windows.Forms.RadioButton rbLrcMode; + private MediaPortal.UserInterface.Controls.MPGroupBox gbLrc; + internal MediaPortal.UserInterface.Controls.MPCheckBox cbUploadLrcAutomatically; } } \ No newline at end of file Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.cs =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.cs 2009-04-07 18:24:32 UTC (rev 2765) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics Configuration/MyLyricsSetup.cs 2009-04-07 19:03:23 UTC (rev 2766) @@ -280,6 +280,8 @@ cbAutoChangeToLineLimit.Checked = xmlreader.GetValue("myLyrics", "useAutoOnLyricLength").Equals("yes"); tbLyricsLimit.Text = xmlreader.GetValueAsString("myLyrics", "AutoLyricLength", "45"); + cbUploadLrcAutomatically.Checked = xmlreader.GetValue("myLyrics", "uploadLrcToLrcFinder").Equals("yes"); + lbSongsLimitNote.Text = ("(You have currently " + m_TotalTitles.ToString() + " titles in your music database)"); trackBar.Value = ((int)xmlreader.GetValueAsInt("myLyrics", "defaultSitesModeValue", 2)); @@ -1182,6 +1184,7 @@ xmlwriter.SetValueAsBool("myLyrics", "useAutoscroll", cbUseAutoScrollAsDefault.Checked); xmlwriter.SetValueAsBool("myLyrics", "useAutoOnLyricLength", cbAutoChangeToLineLimit.Checked); xmlwriter.SetValue("myLyrics", "AutoLyricLength", tbLyricsLimit.Text); + xmlwriter.SetValueAsBool("myLyrics", "uploadLrcToLrcFinder", cbUploadLrcAutomatically.Checked); xmlwriter.SetValueAsBool("myLyrics", "automaticFetch", cbAutoFetch.Checked); xmlwriter.SetValueAsBool("myLyrics", "automaticUpdateWhenFirstFound", cbAutomaticUpdate.Checked); xmlwriter.SetValueAsBool("myLyrics", "moveLyricFromMarkedDatabase", cbMoveSongFrom.Checked); Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs 2009-04-07 18:24:32 UTC (rev 2765) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs 2009-04-07 19:03:23 UTC (rev 2766) @@ -167,6 +167,8 @@ internal bool m_useAutoOnLyricLength = false; internal int m_basicWideLimit = 45; + internal bool m_uploadLrcToLrcFinder = false; + SimpleLRC lrc; SimpleLRCTimeAndLineCollection lrcTimeCollection; Stopwatch stopwatch; @@ -371,6 +373,8 @@ m_useAutoOnLyricLength = ((string)xmlreader.GetValueAsString("myLyrics", "useAutoOnLyricLength", "False")).ToString().Equals("yes") ? true : false; m_basicWideLimit = xmlreader.GetValueAsInt("myLyrics", "AutoLyricLength", 45); + m_uploadLrcToLrcFinder = ((string)xmlreader.GetValueAsString("myLyrics", "uploadLrcToLrcFinder", "False")).ToString().Equals("yes") ? true : false; + skin = ((string)xmlreader.GetValueAsString("skin", "name", "Blue3")); m_crossfade = xmlreader.GetValueAsInt("audioplayer", "crossfade", 2000); @@ -895,16 +899,22 @@ dlg.SetLine(3, String.Empty); dlg.DoModal(GUIWindowManager.ActiveWindow); + StringBuilder lyric = new StringBuilder(); + + string artist = LyricUtil.CapatalizeString(m_artist); + string title = LyricUtil.CapatalizeString(m_title); - StringBuilder lyric = new StringBuilder(); + lyric.Append(string.Format("[ar:{0}]\n", artist)); + lyric.Append(string.Format("[ti:{0}]\n", title)); + lyric.Append(string.Format("[by:{0}]\n", "MediaPortal")); + lyric.Append(string.Format("[offset:{0}]\n", "500")); + for (int i = 0; i < lines.Length; i++) { lyric.Append(lines[i] + "\n"); } lyric.Replace("\r", ""); - string artist = LyricUtil.CapatalizeString(m_artist); - string title = LyricUtil.CapatalizeString(m_title); string lyricAsString = lyric.ToString(); int lastLineShift = lyricAsString.LastIndexOf("\n"); @@ -925,6 +935,13 @@ m_LyricText = lyricAsString; m_ValidLrcLyric = true; + // Upload LRC to LrcFinder if user has accepted in configuration + if (m_uploadLrcToLrcFinder) + { + LyricsEngine.LyricSites.LrcFinder lrcFinder = new LyricsEngine.LyricSites.LrcFinder(); + lrcFinder.SaveLyric(m_LyricText); + } + } } } Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj 2009-04-07 18:24:32 UTC (rev 2765) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj 2009-04-07 19:03:23 UTC (rev 2766) @@ -5,7 +5,7 @@ <ProductVersion>9.0.21022</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{BBB2DAE2-0D83-4B4B-85B6-D1B5A7E10039}</ProjectGuid> - <OutputType>WinExe</OutputType> + <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>MyLyrics</RootNamespace> <AssemblyName>MyLyrics</AssemblyName> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |