/*----------------------------------------------------------------------
Prof-It for C#
Copyright (c) 2004 Klaus Lehner, University of Linz
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, 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 at.jku.ssw.ProfIt.Components;
namespace at.jku.ssw.ProfIt.Controls{
/// <summary>
/// This class controls all opened source files.
/// </summary>
public class CSharpDocumentManager : DocumentManager.DocumentManager {
private bool selectBlocks = false;
public CSharpDocumentManager() {
this.CloseButtonPressed +=new DocumentManager.DocumentManager.CloseButtonPressedEventHandler(CSharpDocumentManager_CloseButtonPressed);
this.FocusedDocumentChanged += new System.EventHandler(CSharpDocumentManager_FocusedDocumentChanged);
}
public bool SelectBlocks {
get { return this.selectBlocks; }
set { this.selectBlocks = value; }
}
public CSharpDocument ShowDocument(SourceFile file) {
CSharpDocument doc = findDocument(file);
if (doc != null) {
this.FocusedDocument = doc;
return doc;
} else {
CSharpDocument newDoc = new CSharpDocument(file, this);
this.AddDocument(newDoc);
this.FocusedDocument = newDoc;
return newDoc;
}
}
public new CSharpDocument FocusedDocument {
get { return (CSharpDocument)base.FocusedDocument; }
set { base.FocusedDocument = value; }
}
public void SelectBlock(AbstractListView sender, BlockChangedArgs args) {
//sender.BeginUpdate();
CSharpDocument doc = ShowDocument(SolutionManager.CurrentSolution.FindFile(args.FileName));
doc.TextBox.Select(args.Pos);
//sender.EndUpdate();
}
/// <summary>
/// Removes all documents and all tabstrips from the DocumentManager
/// </summary>
public void CloseAllDocuments() {
while (this.TabStrips.Count != 0) {
DocumentManager.MdiTabStrip tabstrip = this.TabStrips[0];
while (tabstrip.Documents.Count != 0) {
this.RemoveDocument(tabstrip.Documents[0]);
}
}
SelectedDocumentChanged(null);
}
public event DocumentChangedHandler SelectedDocumentChanged;
/// <summary>
/// This method is necessary because this.Controls.Contains(textBox) doesn't work
/// </summary>
/// <param name="textBox"></param>
/// <returns>true if the documentmanager already displays the textbox</returns>
private CSharpDocument findDocument(SourceFile sourceFile) {
if (this.TabStrips.Count == 0) return null;
foreach (DocumentManager.MdiTabStrip tabstrip in this.TabStrips) {
foreach (CSharpDocument document in tabstrip.Documents) {
if (document.FileName.Equals(sourceFile.FileName)) return document;
}
}
return null;
}
private void CSharpDocumentManager_CloseButtonPressed(object sender, DocumentManager.CloseButtonPressedEventArgs e) {
this.RemoveDocument(e.TabStrip.SelectedDocument);
}
private void CSharpDocumentManager_FocusedDocumentChanged(object sender, System.EventArgs e) {
CSharpDocument doc = this.FocusedDocument;
if (doc==null) SelectedDocumentChanged(null);
else {
SelectedDocumentChanged(doc.TextBox.Source.FileName);
doc.TextBox.UpdateColorRanges();
}
}
public void SolutionChanged(Action action, object eventObj) {
switch (action) {
case Action.FileRemoved:
SourceFile file = (SourceFile)eventObj;
CSharpDocument doc = findDocument(file);
if (doc != null) RemoveDocument(doc);
break;
case Action.BlocksMerged:
case Action.CountersImported:
case Action.CounterReset:
if (eventObj == null || eventObj is ProfilingResult) {
updateAllDocuments();
} else if (eventObj is SourceFile) {
updateDocument((SourceFile)eventObj);
}
break;
case Action.RangedColorsChanged:
if (FocusedDocument != null) {
FocusedDocument.TextBox.UpdateColorRanges();
}
break;
default: break;
}
}
private void updateAllDocuments() {
foreach (DocumentManager.MdiTabStrip tabStrip in this.TabStrips) {
foreach (CSharpDocument document in tabStrip.Documents) {
document.Update();
}
}
}
private void updateDocument(SourceFile file) {
CSharpDocument doc = findDocument(file);
if (doc != null) {
doc.Update();
}
}
}
public delegate void DocumentChangedHandler(string fileName);
}
|