4444import java .io .StringWriter ;
4545import java .util .ArrayList ;
4646import java .util .Iterator ;
47+ import java .util .List ;
4748import java .util .Vector ;
4849import java .util .Map ;
4950import java .util .HashMap ;
5455
5556import edu .rice .cs .drjava .model .OpenDefinitionsDocument ;
5657import edu .rice .cs .drjava .model .SingleDisplayModel ;
58+ import edu .rice .cs .drjava .model .compiler .CompilerListener ;
59+ import edu .rice .cs .drjava .model .compiler .DummyCompilerListener ;
5760import edu .rice .cs .drjava .model .definitions .ClassNameNotFoundException ;
5861import edu .rice .cs .drjava .config .Option ;
5962import edu .rice .cs .drjava .config .OptionParser ;
7376import edu .rice .cs .util .swing .DirectorySelectorComponent ;
7477import edu .rice .cs .util .swing .DirectoryChooser ;
7578import edu .rice .cs .util .swing .FileChooser ;
79+ import edu .rice .cs .util .swing .HighlightManager .HighlightInfo ;
7680import edu .rice .cs .util .swing .SwingFrame ;
7781import edu .rice .cs .util .swing .Utilities ;
7882
@@ -210,12 +214,12 @@ public boolean generateReport(){
210214 if (_useCurrentFile .isSelected ()){
211215 final ReportGenerator generator = new ReportGenerator (_model , _model .getDocumentNavigator ().getSelectedDocuments (), _outputDirSelector .getFileFromField ());
212216 generator .create ();
213- highlight (generator );
217+ highlight (generator , true );
214218
215219 }else {
216220 final ReportGenerator generator = new ReportGenerator (_model , _srcRootSelector .getFileFromField (), _mainDocumentSelector .getText (), _outputDirSelector .getFileFromField ());
217221 generator .create ();
218- highlight (generator );
222+ highlight (generator , false );
219223 }
220224
221225 } catch (Exception e ){
@@ -227,12 +231,18 @@ public boolean generateReport(){
227231 }
228232
229233
230- private void highlight (ReportGenerator generator ) {
234+ private void highlight (ReportGenerator generator , boolean selOnly ) {
231235
232- Iterator <OpenDefinitionsDocument > iter = _model .getDocumentNavigator ().getDocuments ().iterator ();
236+ Iterator <OpenDefinitionsDocument > iter ;
237+ if (!selOnly ) {
238+ iter = _model .getDocumentNavigator ().getDocuments ().iterator ();
239+ }
240+ else {
241+ iter = _model .getDocumentNavigator ().getSelectedDocuments ().iterator ();
242+ }
233243 while (iter .hasNext ()) {
234244 OpenDefinitionsDocument o = iter .next ();
235- DefinitionsPane pane = _mainFrame .getDefPaneGivenODD (o );
245+ final DefinitionsPane pane = _mainFrame .getDefPaneGivenODD (o );
236246 try {
237247 ArrayList <String > colors = generator .getLineColorsForClass (o .getQualifiedClassName ());
238248
@@ -253,9 +263,42 @@ private void highlight(ReportGenerator generator) {
253263 c = Color .yellow ;
254264 }
255265
256-
257- pane .getHighlightManager ().
266+ final HighlightInfo info = pane .getHighlightManager ().
258267 addHighlight (o ._getOffset (i ), o ._getOffset (i +1 ), new ReverseHighlighter .DrJavaHighlightPainter (c ));
268+
269+
270+
271+
272+ CompilerListener removeHighlight = new DummyCompilerListener () {
273+ @ Override public void compileAborted (Exception e ) {
274+ // gets called if there are modified files and the user chooses NOT to save the files
275+ // see bug report 2582488: Hangs If Testing Modified File, But Choose "No" for Saving
276+ final CompilerListener listenerThis = this ;
277+ _model .getCompilerModel ().removeListener (listenerThis );
278+ }
279+
280+ @ Override public void compileEnded (File workDir , List <? extends File > excludedFiles ) {
281+ final CompilerListener listenerThis = this ;
282+ try {
283+ if (_model .hasOutOfSyncDocuments () || _model .getNumCompilerErrors () > 0 ) {
284+ return ;
285+ }
286+ EventQueue .invokeLater (new Runnable () { // defer running this code; would prefer to waitForInterpreter
287+ public void run () {pane .getHighlightManager ().removeHighlight (info );}
288+ });
289+ }
290+ finally { // always remove this listener after its first execution
291+ EventQueue .invokeLater (new Runnable () {
292+ public void run () { _model .getCompilerModel ().removeListener (listenerThis ); }
293+ });
294+ }
295+ }
296+
297+
298+ }; //end coverage listener
299+
300+
301+ _model .getCompilerModel ().addListener (removeHighlight );
259302 }
260303 }
261304 catch (ClassNameNotFoundException e ) {
0 commit comments