2009-04-19 18:07:22 +00:00
#region = = = = = = = = = = = = = = = = = = Copyright ( c ) 2007 Pascal vd Heiden
/ *
* Copyright ( c ) 2007 Pascal vd Heiden , www . codeimp . com
* This program is released under GNU General Public License
*
* 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 .
*
* /
#endregion
#region = = = = = = = = = = = = = = = = = = Namespaces
using System ;
using System.Collections.Generic ;
using System.Drawing ;
using System.Text ;
using System.Windows.Forms ;
2015-01-12 12:27:10 +00:00
using CodeImp.DoomBuilder.Editing ;
2009-04-19 18:07:22 +00:00
using CodeImp.DoomBuilder.Map ;
using CodeImp.DoomBuilder.Windows ;
using System.Reflection ;
using System.Globalization ;
using System.Threading ;
#endregion
namespace CodeImp.DoomBuilder.BuilderModes
{
public partial class ErrorCheckForm : DelayedForm
{
#region = = = = = = = = = = = = = = = = = = Constants
#endregion
#region = = = = = = = = = = = = = = = = = = Delegates
private delegate void CallVoidMethodDeletage ( ) ;
private delegate void CallIntMethodDelegate ( int i ) ;
private delegate void CallResultMethodDelegate ( ErrorResult r ) ;
#endregion
#region = = = = = = = = = = = = = = = = = = Variables
2014-02-21 14:42:12 +00:00
private volatile bool running ;
2009-04-19 18:07:22 +00:00
private Thread checksthread ;
2009-08-14 10:45:22 +00:00
private BlockMap < BlockEntry > blockmap ;
2014-08-19 21:58:53 +00:00
private Size initialsize ; //mxd
2014-09-12 14:58:00 +00:00
private List < ErrorResult > resultslist ; //mxd
private List < Type > hiddentresulttypes ; //mxd
2015-02-14 18:15:11 +00:00
private bool bathselectioninprogress ; //mxd
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Properties
2015-01-12 12:27:10 +00:00
public List < ErrorResult > SelectedResults {
get
{
List < ErrorResult > selection = new List < ErrorResult > ( ) ;
foreach ( Object ro in results . SelectedItems )
{
ErrorResult result = ro as ErrorResult ;
if ( result = = null ) continue ;
selection . Add ( result ) ;
}
return selection ;
}
}
2009-08-14 10:45:22 +00:00
public BlockMap < BlockEntry > BlockMap { get { return blockmap ; } }
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor / Show
// Constructor
public ErrorCheckForm ( )
{
// Initialize
InitializeComponent ( ) ;
// Find all error checkers
Type [ ] checkertypes = BuilderPlug . Me . FindClasses ( typeof ( ErrorChecker ) ) ;
foreach ( Type t in checkertypes )
{
object [ ] attr = t . GetCustomAttributes ( typeof ( ErrorCheckerAttribute ) , true ) ;
if ( attr . Length > 0 )
{
ErrorCheckerAttribute checkerattr = ( attr [ 0 ] as ErrorCheckerAttribute ) ;
// Add the type to the checkbox list
CheckBox c = checks . Add ( checkerattr . DisplayName , t ) ;
c . Checked = checkerattr . DefaultChecked ;
}
}
2014-09-29 08:41:12 +00:00
checks . Sort ( ) ; //mxd
2014-08-19 21:58:53 +00:00
//mxd. Store initial height
initialsize = this . Size ;
2014-09-12 14:58:00 +00:00
resultslist = new List < ErrorResult > ( ) ;
hiddentresulttypes = new List < Type > ( ) ;
2009-04-19 18:07:22 +00:00
}
// This shows the window
public void Show ( Form owner )
{
2010-08-12 09:01:22 +00:00
// Move controls according to the height of the checkers box
checks . PerformLayout ( ) ;
buttoncheck . Top = checks . Bottom + 14 ;
resultspanel . Top = buttoncheck . Bottom + 14 ;
2014-08-11 10:30:52 +00:00
this . Text = "Map Analysis" ; //mxd
2012-11-30 14:43:11 +00:00
// Position at left-top of owner
this . Location = new Point ( owner . Location . X + 20 , owner . Location . Y + 90 ) ;
2009-04-19 18:07:22 +00:00
// Close results part
resultspanel . Visible = false ;
2014-08-19 21:58:53 +00:00
this . Size = new Size ( initialsize . Width , this . Height - this . ClientSize . Height + resultspanel . Top ) ;
this . MinimumSize = this . Size ; //mxd
this . MaximumSize = this . Size ; //mxd
2009-04-19 18:07:22 +00:00
// Show window
base . Show ( owner ) ;
}
#endregion
#region = = = = = = = = = = = = = = = = = = Thread Calls
public void SubmitResult ( ErrorResult result )
{
if ( results . InvokeRequired )
{
2014-02-21 14:42:12 +00:00
CallResultMethodDelegate d = SubmitResult ;
2009-04-19 18:07:22 +00:00
try { progress . Invoke ( d , result ) ; }
catch ( ThreadInterruptedException ) { }
}
else
{
2014-09-12 21:08:11 +00:00
if ( ! result . IsHidden & & ! hiddentresulttypes . Contains ( result . GetType ( ) ) ) //mxd
2014-09-12 14:58:00 +00:00
{
results . Items . Add ( result ) ;
}
resultslist . Add ( result ) ; //mxd
UpdateTitle ( ) ;
2009-04-19 18:07:22 +00:00
}
}
private void SetProgressMaximum ( int maximum )
{
if ( progress . InvokeRequired )
{
2014-02-21 14:42:12 +00:00
CallIntMethodDelegate d = SetProgressMaximum ;
2009-04-19 18:07:22 +00:00
try { progress . Invoke ( d , maximum ) ; }
catch ( ThreadInterruptedException ) { }
}
else
{
progress . Maximum = maximum ;
}
}
public void AddProgressValue ( int value )
{
if ( progress . InvokeRequired )
{
2014-02-21 14:42:12 +00:00
CallIntMethodDelegate d = AddProgressValue ;
2009-04-19 18:07:22 +00:00
try { progress . Invoke ( d , value ) ; }
catch ( ThreadInterruptedException ) { }
}
else
{
progress . Value + = value ;
}
}
2014-09-12 14:58:00 +00:00
//mxd
private void UpdateTitle ( )
{
int hiddencount = resultslist . Count - results . Items . Count ;
2015-02-14 18:15:11 +00:00
string title = "Map Analysis [" + resultslist . Count + " results" ;
if ( hiddencount > 0 ) title + = hiddencount + " hidden" ;
title + = ", " + results . SelectedItems . Count + " selected" ;
this . Text = title + @"]" ;
2014-09-12 14:58:00 +00:00
}
2009-04-19 18:07:22 +00:00
// This stops checking (only called from the checking management thread)
private void StopChecking ( )
{
if ( this . InvokeRequired )
{
2014-02-21 14:42:12 +00:00
CallVoidMethodDeletage d = StopChecking ;
2009-04-19 18:07:22 +00:00
this . Invoke ( d ) ;
}
else
{
checksthread = null ;
progress . Value = 0 ;
buttoncheck . Text = "Start Analysis" ;
Cursor . Current = Cursors . Default ;
running = false ;
blockmap . Dispose ( ) ;
blockmap = null ;
2009-04-28 07:51:23 +00:00
// When no results found, show "no results" and disable the list
2014-12-03 23:15:26 +00:00
if ( resultslist . Count = = 0 )
{
2013-09-11 09:47:53 +00:00
results . Items . Add ( new ResultNoErrors ( ) ) ;
results . Enabled = false ;
2015-02-14 18:15:11 +00:00
UpdateTitle ( ) ; //mxd
2014-12-03 23:15:26 +00:00
}
else
{
2014-09-12 21:36:52 +00:00
ClearSelectedResult ( ) ; //mxd
2013-09-11 09:47:53 +00:00
}
2009-04-19 18:07:22 +00:00
}
}
// This starts checking
private void StartChecking ( )
{
if ( running ) return ;
Cursor . Current = Cursors . WaitCursor ;
// Make blockmap
RectangleF area = MapSet . CreateArea ( General . Map . Map . Vertices ) ;
area = MapSet . IncreaseArea ( area , General . Map . Map . Things ) ;
2009-08-14 10:45:22 +00:00
blockmap = new BlockMap < BlockEntry > ( area ) ;
2009-04-19 18:07:22 +00:00
blockmap . AddLinedefsSet ( General . Map . Map . Linedefs ) ;
blockmap . AddSectorsSet ( General . Map . Map . Sectors ) ;
blockmap . AddThingsSet ( General . Map . Map . Things ) ;
2014-02-07 09:10:55 +00:00
blockmap . AddVerticesSet ( General . Map . Map . Vertices ) ; //mxd
2009-04-19 18:07:22 +00:00
2014-08-19 21:58:53 +00:00
//mxd. Open the results panel
2014-12-03 23:15:26 +00:00
if ( ! resultspanel . Visible )
{
2014-08-19 21:58:53 +00:00
this . MinimumSize = new Size ( ) ;
this . MaximumSize = new Size ( ) ;
this . Size = initialsize ;
resultspanel . Size = new Size ( resultspanel . Width , this . ClientSize . Height - resultspanel . Top ) ;
resultspanel . Visible = true ;
}
2009-04-19 18:07:22 +00:00
progress . Value = 0 ;
results . Items . Clear ( ) ;
2009-04-28 07:51:23 +00:00
results . Enabled = true ;
2014-09-12 14:58:00 +00:00
resultslist = new List < ErrorResult > ( ) ; //mxd
2009-04-19 18:07:22 +00:00
ClearSelectedResult ( ) ;
buttoncheck . Text = "Abort Analysis" ;
General . Interface . RedrawDisplay ( ) ;
// Start checking
running = true ;
2014-02-21 14:42:12 +00:00
checksthread = new Thread ( RunChecks ) ;
2009-04-19 18:07:22 +00:00
checksthread . Name = "Error Checking Management" ;
checksthread . Priority = ThreadPriority . Normal ;
checksthread . Start ( ) ;
Cursor . Current = Cursors . Default ;
}
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
// This stops the checking
public void CloseWindow ( )
{
// Currently running?
if ( running )
{
Cursor . Current = Cursors . WaitCursor ;
checksthread . Interrupt ( ) ;
}
ClearSelectedResult ( ) ;
2014-09-29 08:41:12 +00:00
//mxd. Clear results
resultslist . Clear ( ) ;
results . Items . Clear ( ) ;
2012-11-30 14:43:11 +00:00
2009-04-19 18:07:22 +00:00
this . Hide ( ) ;
}
// This clears the selected result
private void ClearSelectedResult ( )
{
2015-01-12 12:27:10 +00:00
results . SelectedItems . Clear ( ) ; //mxd
2014-09-12 21:36:52 +00:00
if ( results . Items . Count = = 0 & & resultslist . Count > 0 ) //mxd
resultinfo . Text = "All results are hidden. Use context menu to show them." ;
2015-01-12 12:27:10 +00:00
else
resultinfo . Text = "Select a result from the list to see more information.\r\nHold 'Ctrl' to select several results.\r\nHold 'Shift' to select a range of results.\r\nRight-click on a result to show context menu." ;
2009-04-19 18:07:22 +00:00
resultinfo . Enabled = false ;
fix1 . Visible = false ;
fix2 . Visible = false ;
fix3 . Visible = false ;
2015-02-14 18:15:11 +00:00
UpdateTitle ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
// This runs in a seperate thread to manage the checking threads
private void RunChecks ( )
{
List < ErrorChecker > checkers = new List < ErrorChecker > ( ) ;
List < Thread > threads = new List < Thread > ( ) ;
int maxthreads = Environment . ProcessorCount ;
int totalprogress = 0 ;
int nextchecker = 0 ;
// Initiate all checkers
foreach ( CheckBox c in checks . Checkboxes )
{
// Include this one?
if ( c . Checked )
{
Type t = ( c . Tag as Type ) ;
2014-02-21 14:42:12 +00:00
ErrorChecker checker ;
2009-04-19 18:07:22 +00:00
try
{
// Create instance
checker = ( ErrorChecker ) Assembly . GetExecutingAssembly ( ) . CreateInstance ( t . FullName , false , BindingFlags . Default , null , null , CultureInfo . CurrentCulture , new object [ 0 ] ) ;
}
catch ( TargetInvocationException ex )
{
// Error!
General . ErrorLogger . Add ( ErrorType . Error , "Failed to create class instance '" + t . Name + "'" ) ;
General . WriteLogLine ( ex . InnerException . GetType ( ) . Name + ": " + ex . InnerException . Message ) ;
throw ex ;
}
catch ( Exception ex )
{
// Error!
General . ErrorLogger . Add ( ErrorType . Error , "Failed to create class instance '" + t . Name + "'" ) ;
General . WriteLogLine ( ex . GetType ( ) . Name + ": " + ex . Message ) ;
throw ex ;
}
// Add to list
if ( checker ! = null )
{
checkers . Add ( checker ) ;
totalprogress + = checker . TotalProgress ;
}
}
}
// Sort the checkers with highest cost first
// See CompareTo method in ErrorChecker for sorting comparison
checkers . Sort ( ) ;
// Setup
SetProgressMaximum ( totalprogress ) ;
// Continue while threads are running or checks are to be done
while ( ( nextchecker < checkers . Count ) | | ( threads . Count > 0 ) )
{
// Start new thread when less than maximum number of
// threads running and there is more work to be done
while ( ( threads . Count < maxthreads ) & & ( nextchecker < checkers . Count ) )
{
ErrorChecker c = checkers [ nextchecker + + ] ;
2014-02-21 14:42:12 +00:00
Thread t = new Thread ( c . Run ) ;
2009-04-19 18:07:22 +00:00
t . Name = "Error Checker '" + c . GetType ( ) . Name + "'" ;
t . Priority = ThreadPriority . BelowNormal ;
t . Start ( ) ;
threads . Add ( t ) ;
}
// Remove threads that are done
for ( int i = threads . Count - 1 ; i > = 0 ; i - - )
if ( ! threads [ i ] . IsAlive ) threads . RemoveAt ( i ) ;
// Handle thread interruption
try { Thread . Sleep ( 1 ) ; }
catch ( ThreadInterruptedException ) { break ; }
}
// Stop all running threads
foreach ( Thread t in threads )
{
while ( t . IsAlive )
{
try
{
t . Interrupt ( ) ;
t . Join ( 1 ) ;
}
catch ( ThreadInterruptedException )
{
// We have to continue, we can't just leave the other threads running!
}
}
}
// Done
StopChecking ( ) ;
}
2015-01-12 12:27:10 +00:00
//mxd
private Dictionary < Type , bool > GetSelectedTypes ( )
{
Dictionary < Type , bool > selectedtypes = new Dictionary < Type , bool > ( ) ;
foreach ( var ro in results . SelectedItems )
{
ErrorResult r = ro as ErrorResult ;
if ( r = = null ) continue ;
Type t = r . GetType ( ) ;
if ( ! selectedtypes . ContainsKey ( t ) ) selectedtypes . Add ( t , false ) ;
}
return selectedtypes ;
}
2009-04-19 18:07:22 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Events
// Window closing
private void ErrorCheckForm_FormClosing ( object sender , FormClosingEventArgs e )
{
2014-09-29 08:41:12 +00:00
//mxd. Clear results
2014-09-12 14:58:00 +00:00
resultslist . Clear ( ) ;
2014-09-29 08:41:12 +00:00
results . Items . Clear ( ) ;
2014-09-12 12:19:58 +00:00
2009-04-19 18:07:22 +00:00
// If the user closes the form, then just cancel the mode
if ( e . CloseReason = = CloseReason . UserClosing )
{
e . Cancel = true ;
General . Interface . Focus ( ) ;
General . Editing . CancelMode ( ) ;
}
}
// Start/stop
private void buttoncheck_Click ( object sender , EventArgs e )
{
// Currently running?
if ( running )
{
Cursor . Current = Cursors . WaitCursor ;
checksthread . Interrupt ( ) ;
}
else
{
2013-09-11 09:47:53 +00:00
StartChecking ( ) ;
2009-04-19 18:07:22 +00:00
}
}
// Close
private void closebutton_Click ( object sender , EventArgs e )
{
General . Interface . Focus ( ) ;
General . Editing . CancelMode ( ) ;
}
// Results selection changed
private void results_SelectedIndexChanged ( object sender , EventArgs e )
{
2015-02-14 18:15:11 +00:00
//mxd
if ( bathselectioninprogress ) return ;
2009-04-19 18:07:22 +00:00
// Anything selected?
2015-01-12 12:27:10 +00:00
if ( results . SelectedItems . Count > 0 )
2009-04-19 18:07:22 +00:00
{
2015-01-12 12:27:10 +00:00
ErrorResult firstresult = ( results . SelectedItems [ 0 ] as ErrorResult ) ;
if ( firstresult = = null )
{
ClearSelectedResult ( ) ;
}
else
{
bool sametype = true ;
List < ErrorResult > validresults = new List < ErrorResult > ( ) ;
// Selected results have the same fixes?
foreach ( var ri in results . SelectedItems )
{
ErrorResult result = ri as ErrorResult ;
if ( result = = null ) continue ;
validresults . Add ( result ) ;
if ( result . Buttons ! = firstresult . Buttons | | result . Button1Text ! = firstresult . Button1Text
| | result . Button2Text ! = firstresult . Button2Text | | result . Button3Text ! = firstresult . Button3Text )
{
sametype = false ;
break ;
}
}
resultinfo . Enabled = true ;
if ( sametype )
{
resultinfo . Text = firstresult . Description ;
fix1 . Text = firstresult . Button1Text ;
fix2 . Text = firstresult . Button2Text ;
fix3 . Text = firstresult . Button3Text ;
fix1 . Visible = ( firstresult . Buttons > 0 ) ;
fix2 . Visible = ( firstresult . Buttons > 1 ) ;
fix3 . Visible = ( firstresult . Buttons > 2 ) ;
}
else
{
resultinfo . Text = "Several types of map analysis results are selected. To display fixes, make sure that only a single result type is selected." ;
fix1 . Visible = false ;
fix2 . Visible = false ;
fix3 . Visible = false ;
}
// Zoom to area
if ( validresults . Count > 0 )
{
RectangleF zoomarea = validresults [ 0 ] . GetZoomArea ( ) ;
foreach ( ErrorResult result in validresults )
{
zoomarea = RectangleF . Union ( zoomarea , result . GetZoomArea ( ) ) ;
}
ClassicMode editmode = ( General . Editing . Mode as ClassicMode ) ;
editmode . CenterOnArea ( zoomarea , 0.6f ) ;
}
}
2015-02-14 18:15:11 +00:00
UpdateTitle ( ) ; //mxd
2009-04-19 18:07:22 +00:00
}
else
{
ClearSelectedResult ( ) ;
}
General . Interface . RedrawDisplay ( ) ;
}
// First button
private void fix1_Click ( object sender , EventArgs e )
{
// Anything selected?
2015-01-12 12:27:10 +00:00
if ( results . SelectedItems . Count > 0 )
2009-04-19 18:07:22 +00:00
{
if ( running )
{
General . ShowWarningMessage ( "You must stop the analysis before you can make changes to your map!" , MessageBoxButtons . OK ) ;
}
else
{
ErrorResult r = ( results . SelectedItem as ErrorResult ) ;
2014-12-03 23:15:26 +00:00
if ( r . Button1Click ( false ) )
{
2015-01-12 12:27:10 +00:00
if ( results . SelectedItems . Count > 1 ) FixSimilarErrors ( r . GetType ( ) , 1 ) ; //mxd
2013-09-11 09:47:53 +00:00
StartChecking ( ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-09-11 09:47:53 +00:00
General . Interface . RedrawDisplay ( ) ;
}
2009-04-19 18:07:22 +00:00
}
}
}
// Second button
private void fix2_Click ( object sender , EventArgs e )
{
// Anything selected?
if ( results . SelectedIndex > = 0 )
{
if ( running )
{
General . ShowWarningMessage ( "You must stop the analysis before you can make changes to your map!" , MessageBoxButtons . OK ) ;
}
else
{
ErrorResult r = ( results . SelectedItem as ErrorResult ) ;
2014-12-03 23:15:26 +00:00
if ( r . Button2Click ( false ) )
{
2015-01-12 12:27:10 +00:00
if ( results . SelectedItems . Count > 1 ) FixSimilarErrors ( r . GetType ( ) , 2 ) ; //mxd
2013-09-11 09:47:53 +00:00
StartChecking ( ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-09-11 09:47:53 +00:00
General . Interface . RedrawDisplay ( ) ;
}
2009-04-19 18:07:22 +00:00
}
}
}
// Third button
private void fix3_Click ( object sender , EventArgs e )
{
// Anything selected?
if ( results . SelectedIndex > = 0 )
{
if ( running )
{
General . ShowWarningMessage ( "You must stop the analysis before you can make changes to your map!" , MessageBoxButtons . OK ) ;
}
else
{
ErrorResult r = ( results . SelectedItem as ErrorResult ) ;
2014-12-03 23:15:26 +00:00
if ( r . Button3Click ( false ) )
{
2015-01-12 12:27:10 +00:00
if ( results . SelectedItems . Count > 1 ) FixSimilarErrors ( r . GetType ( ) , 3 ) ; //mxd
2013-09-11 09:47:53 +00:00
StartChecking ( ) ;
2014-12-03 23:15:26 +00:00
}
else
{
2013-09-11 09:47:53 +00:00
General . Interface . RedrawDisplay ( ) ;
}
2009-04-19 18:07:22 +00:00
}
}
}
2013-09-11 09:47:53 +00:00
//mxd
2014-12-03 23:15:26 +00:00
private void FixSimilarErrors ( Type type , int fixIndex )
{
2015-01-12 12:27:10 +00:00
foreach ( Object item in results . SelectedItems )
2014-12-03 23:15:26 +00:00
{
2013-09-11 09:47:53 +00:00
if ( item = = results . SelectedItem ) continue ;
if ( item . GetType ( ) ! = type ) continue ;
2012-11-30 14:43:11 +00:00
2013-09-11 09:47:53 +00:00
ErrorResult r = item as ErrorResult ;
2012-11-30 14:43:11 +00:00
2015-01-07 18:32:48 +00:00
if ( fixIndex = = 1 & & ! r . Button1Click ( true ) ) break ;
if ( fixIndex = = 2 & & ! r . Button2Click ( true ) ) break ;
if ( fixIndex = = 3 & & ! r . Button3Click ( true ) ) break ;
2013-09-11 09:47:53 +00:00
}
}
2012-11-30 14:43:11 +00:00
2014-09-29 08:41:12 +00:00
//mxd
private void toggleall_CheckedChanged ( object sender , EventArgs e )
{
foreach ( CheckBox cb in checks . Checkboxes ) cb . Checked = toggleall . Checked ;
}
2009-04-19 18:07:22 +00:00
private void ErrorCheckForm_HelpRequested ( object sender , HelpEventArgs hlpevent )
{
General . ShowHelp ( "e_mapanalysis.html" ) ;
}
#endregion
2014-09-12 12:19:58 +00:00
2014-09-12 21:08:11 +00:00
#region = = = = = = = = = = = = = = = = = = Results Context Menu ( mxd )
2014-09-12 14:58:00 +00:00
private void resultcontextmenustrip_Opening ( object sender , System . ComponentModel . CancelEventArgs e )
{
//disable or enable stuff
2015-01-12 12:27:10 +00:00
bool haveresult = resultslist . Count > 0 & & results . SelectedItems . Count > 0 ;
2014-09-12 14:58:00 +00:00
resultshowall . Enabled = ( resultslist . Count > 0 & & resultslist . Count > results . Items . Count ) ;
2015-01-12 12:27:10 +00:00
resultselectcurrenttype . Enabled = haveresult ;
2014-09-12 14:58:00 +00:00
resultcopytoclipboard . Enabled = haveresult ;
resulthidecurrent . Enabled = haveresult ;
2014-09-12 21:08:11 +00:00
resulthidecurrenttype . Enabled = haveresult ;
2014-09-12 14:58:00 +00:00
resultshowonlycurrent . Enabled = haveresult ;
}
private void resultshowall_Click ( object sender , EventArgs e )
{
2014-09-12 21:08:11 +00:00
// Reset ignored items
foreach ( ErrorResult result in resultslist ) result . Hide ( false ) ;
2014-09-12 14:58:00 +00:00
// Restore items
results . Items . Clear ( ) ;
results . Items . AddRange ( resultslist . ToArray ( ) ) ;
hiddentresulttypes . Clear ( ) ;
// Do the obvious
2014-09-12 21:36:52 +00:00
ClearSelectedResult ( ) ;
2014-09-12 14:58:00 +00:00
}
2014-09-12 21:08:11 +00:00
private void resulthidecurrent_Click ( object sender , EventArgs e )
{
2015-01-12 12:27:10 +00:00
// Collect results to hide
List < ErrorResult > tohide = new List < ErrorResult > ( ) ;
foreach ( var ro in results . SelectedItems )
{
ErrorResult r = ro as ErrorResult ;
if ( r = = null ) return ;
r . Hide ( true ) ;
tohide . Add ( r ) ;
}
// Remove from the list
2015-02-14 18:15:11 +00:00
results . BeginUpdate ( ) ;
2015-01-12 12:27:10 +00:00
foreach ( ErrorResult r in tohide ) results . Items . Remove ( r ) ;
2015-02-14 18:15:11 +00:00
results . EndUpdate ( ) ;
2014-09-12 21:08:11 +00:00
// Do the obvious
2014-09-12 21:36:52 +00:00
ClearSelectedResult ( ) ;
2014-09-12 21:08:11 +00:00
}
private void resulthidecurrenttype_Click ( object sender , EventArgs e )
2014-09-12 14:58:00 +00:00
{
2015-01-12 12:27:10 +00:00
Dictionary < Type , bool > tohide = GetSelectedTypes ( ) ;
2014-09-12 14:58:00 +00:00
List < ErrorResult > filtered = new List < ErrorResult > ( ) ;
2015-01-12 12:27:10 +00:00
hiddentresulttypes . AddRange ( tohide . Keys ) ;
2014-09-12 14:58:00 +00:00
// Apply filtering
foreach ( ErrorResult result in results . Items )
{
2015-01-12 12:27:10 +00:00
if ( ! tohide . ContainsKey ( result . GetType ( ) ) ) filtered . Add ( result ) ;
2014-09-12 14:58:00 +00:00
}
// Replace items
results . Items . Clear ( ) ;
results . Items . AddRange ( filtered . ToArray ( ) ) ;
// Do the obvious
2014-09-12 21:36:52 +00:00
ClearSelectedResult ( ) ;
2014-09-12 14:58:00 +00:00
}
private void resultshowonlycurrent_Click ( object sender , EventArgs e )
{
2015-01-12 12:27:10 +00:00
Dictionary < Type , bool > toshow = GetSelectedTypes ( ) ;
2014-09-12 14:58:00 +00:00
List < ErrorResult > filtered = new List < ErrorResult > ( ) ;
hiddentresulttypes . Clear ( ) ;
// Apply filtering
foreach ( ErrorResult result in results . Items )
{
Type curresulttype = result . GetType ( ) ;
2015-01-12 12:27:10 +00:00
if ( ! toshow . ContainsKey ( curresulttype ) )
2014-09-12 14:58:00 +00:00
{
hiddentresulttypes . Add ( curresulttype ) ;
}
else
{
filtered . Add ( result ) ;
}
}
// Replace items
results . Items . Clear ( ) ;
results . Items . AddRange ( filtered . ToArray ( ) ) ;
// Do the obvious
2014-09-12 21:36:52 +00:00
ClearSelectedResult ( ) ;
2014-09-12 14:58:00 +00:00
}
2015-01-12 12:27:10 +00:00
private void resultcopytoclipboard_Click ( object sender , EventArgs e )
2014-09-12 14:58:00 +00:00
{
2015-01-12 12:27:10 +00:00
// Get results
StringBuilder sb = new StringBuilder ( ) ;
foreach ( ErrorResult result in results . SelectedItems ) sb . AppendLine ( result . ToString ( ) ) ;
// Set on clipboard
Clipboard . SetText ( sb . ToString ( ) ) ;
// Inform the user
General . Interface . DisplayStatus ( StatusType . Info , "Analysis results copied to clipboard." ) ;
2014-09-12 14:58:00 +00:00
}
private void results_KeyUp ( object sender , KeyEventArgs e )
{
2015-01-12 12:27:10 +00:00
// Copy descriptions to clipboard?
2014-09-12 14:58:00 +00:00
if ( e . Control & & e . KeyCode = = Keys . C )
{
resultcopytoclipboard_Click ( sender , EventArgs . Empty ) ;
2015-01-12 12:27:10 +00:00
}
// Select all?
else if ( e . Control & & e . KeyCode = = Keys . A )
{
results . SelectedItems . Clear ( ) ;
2015-02-14 18:15:11 +00:00
bathselectioninprogress = true ; //mxd
results . BeginUpdate ( ) ; //mxd
2015-01-12 12:27:10 +00:00
for ( int i = 0 ; i < results . Items . Count ; i + + ) results . SelectedItems . Add ( results . Items [ i ] ) ;
2015-02-14 18:15:11 +00:00
results . EndUpdate ( ) ; //mxd
bathselectioninprogress = false ; //mxd
results_SelectedIndexChanged ( this , EventArgs . Empty ) ; //trigger update manually
2015-01-12 12:27:10 +00:00
}
}
private void resultselectcurrenttype_Click ( object sender , EventArgs e )
{
Dictionary < Type , bool > toselect = GetSelectedTypes ( ) ;
results . SelectedItems . Clear ( ) ;
2015-02-14 18:15:11 +00:00
bathselectioninprogress = true ; //mxd
results . BeginUpdate ( ) ; //mxd
2015-01-12 12:27:10 +00:00
for ( int i = 0 ; i < results . Items . Count ; i + + )
{
if ( toselect . ContainsKey ( results . Items [ i ] . GetType ( ) ) ) results . SelectedItems . Add ( results . Items [ i ] ) ;
2014-09-12 14:58:00 +00:00
}
2015-02-14 18:15:11 +00:00
results . EndUpdate ( ) ; //mxd
bathselectioninprogress = false ; //mxd
results_SelectedIndexChanged ( this , EventArgs . Empty ) ; //trigger update manually
2014-09-12 14:58:00 +00:00
}
#endregion
2009-04-19 18:07:22 +00:00
}
}