/*************************************************************************** begin : Tuesday Nov 1 2005 copyright : (C) 2005 by Thomas Braun email : braun@physik.fu-berlin.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "kilestatsdlg.h" // A dialog that displays statistical information about the active project/file KileStatsDlg::KileStatsDlg(KileProject *project, KileDocument::TextInfo* docinfo, TQWidget* parent, const char* name, const TQString &caption) : KDialogBase(KDialogBase::Tabbed,0,parent,name,true,caption, KDialogBase::Help | KDialogBase::Ok | KDialogBase::User1 | KDialogBase::User2 , KDialogBase::Ok, false), m_project(project), m_docinfo(docinfo) { setButtonText(KDialogBase::User1,i18n("Copy")); setButtonText(KDialogBase::User2,i18n("Copy as LaTeX")); setHelp("statistics"); m_summarystats = new long[SIZE_STAT_ARRAY]; m_summarystats[0]=m_summarystats[1]=m_summarystats[2]=m_summarystats[3]=m_summarystats[4]=m_summarystats[5]=0; const long* stats; TQString tempName; uint index=0; KileWidgetStatistics* tempWidget; KileWidgetStatistics* summary; KileDocument::TextInfo* tempDocinfo; m_hasSelection=false; // class variable, if the user has selected text, summary = new KileWidgetStatistics( addPage( i18n("Summary") ) ); summary->m_commentAboutHelp->setText(i18n("For information about the accuracy see the Help.")); // we have in every case a summary tab m_pagetowidget[index]=summary; m_pagetoname[index]=i18n("Summary"); index++; // used with activePageIndex() to get the active widget and the tabname, arrays would be more efficient, but Maps are less dangerous if(m_docinfo->getDoc()->hasSelection()) // the user should really have that doc as active in which the selection is m_hasSelection=true; if(!m_project) // the active doc doesn't belong to a project { setCaption(i18n("Statistics for %1").arg(m_docinfo->getDoc()->url().fileName())); stats = m_docinfo->getStatistics(); fillWidget(stats,summary); } else // active doc belongs to a project { setCaption(i18n("Statistics for the Project %1").arg(m_project->name())); KILE_DEBUG() << "Project file is " << project->baseURL() << endl; KileProjectItemList *items = project->items(); if(m_hasSelection) // if the active doc has a selection { stats = m_docinfo->getStatistics(); fillWidget(stats,summary); // if yes we fill the summary widget and are finished } else { for(uint k = 0; k < items->count() ; k++) { if(items->at(k)->type() == KileProjectItem::ProjectFile) // ignore project files continue; tempDocinfo = items->at(k)->getInfo(); if(tempDocinfo && tempDocinfo->getDoc()) // closed items don't have a doc { tempName = tempDocinfo->getDoc()->url().fileName(); stats = tempDocinfo->getStatistics(); for(uint j = 0; j < SIZE_STAT_ARRAY; j++) m_summarystats[j]+=stats[j]; tempWidget = new KileWidgetStatistics( addPage(tempName) ); KILE_DEBUG() << "TempName is " << tempName << endl; m_pagetowidget[index]=tempWidget; m_pagetoname[index]=tempName; index++; fillWidget(stats, tempWidget); } else m_notAllFilesOpenWarning=true; // print warning } fillWidget(m_summarystats,summary); if(m_notAllFilesOpenWarning) summary->m_warning->setText(i18n("To get statistics for all project files, you have to open them all.")); #if TDE_VERSION >= KDE_MAKE_VERSION(3,3,0) KILE_DEBUG() << "All keys in name " << m_pagetoname.keys() << " Nr. of keys " << m_pagetowidget.count() << endl; KILE_DEBUG() << "All keys in widget " << m_pagetowidget.keys() << " Nr. of keys " << m_pagetowidget.count() << endl; #endif } } // setInitialSize( TQSize(550,560), true); } KileStatsDlg::~KileStatsDlg() { delete [] m_summarystats; } void KileStatsDlg::fillWidget(const long* stats, KileWidgetStatistics* widget) { // we don't have to write 0's in the number labels because this is the default value if (!stats || !widget) return; if(m_hasSelection) widget->m_warning->setText(i18n("WARNING: These are the statistics for the selected text only.")); widget->m_wordChar->setText(TQString::number(stats[0])); widget->m_commandChar->setText(TQString::number(stats[1])); widget->m_whitespaceChar->setText(TQString::number(stats[2])); widget->m_totalChar->setText(TQString::number(stats[0]+stats[1]+stats[2])); widget->m_wordString->setText(TQString::number(stats[3])); widget->m_commandString->setText(TQString::number(stats[4])); widget->m_environmentString->setText(TQString::number(stats[5])); widget->m_totalString->setText(TQString::number(stats[3]+stats[4]+stats[5])); widget->updateColumns(); } void KileStatsDlg::slotUser1() // Copy { KILE_DEBUG() << "Copy Button was clicked" << endl; KILE_DEBUG() << "Open tab is " << activePageIndex() << ' ' + ( m_pagetoname.contains(activePageIndex()) ? m_pagetoname[activePageIndex()] : "No such entry" )<< endl; TQClipboard *clip = KApplication::tqclipboard(); TQString text; convertText(&text,false); clip->setText(text,TQClipboard::Selection); // the text will be available with the middle mouse button } void KileStatsDlg::slotUser2() // CopyAsLaTeX { KILE_DEBUG() << "CopyAsLateX Button was clicked" << endl; KILE_DEBUG() << "Open tab is " << activePageIndex() << ' ' + ( m_pagetoname.contains(activePageIndex()) ? m_pagetoname[activePageIndex()] : "No such entry" )<< endl; TQClipboard *clip = KApplication::tqclipboard(); TQString text; convertText(&text,true); clip->setText(text,TQClipboard::Selection); } void KileStatsDlg::convertText(TQString* text, bool forLaTeX) // the bool determines if we want plainText or LaTeXCode { KileWidgetStatistics* widget = m_pagetowidget[activePageIndex()]; TQString name = m_pagetoname[activePageIndex()]; TQString charGroupName = i18n("Characters"); // always ensure that these are the same than in kilestatswidget.ui, there is no way to get the label of a button group, so this ugly hack is needed TQString stringGroupName = i18n("Strings"); if (forLaTeX) text->append("\\begin{tabular}{ll}\n"); if(m_project && activePageIndex()) text->append(i18n("Statistics for project %1, file %2").arg(m_project->name()).arg(name)); else if(m_project) text->append(i18n("Statistics for project %1").arg(m_project->name())); else if(m_docinfo->getDoc()->url().isValid()) text->append(i18n("Statistics for %1").arg(m_docinfo->getDoc()->url().fileName())); else text->append(i18n("Statistics for Untitled")); if (forLaTeX) text->append(" & \\\\\\hline\n"); else text->append("\n\n"); text->append(charGroupName + ( forLaTeX ? " & \\\\\n" : "\n") ); text->append(widget->m_wordCharText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_wordChar->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append(widget->m_commandCharText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_commandChar->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append(widget->m_whitespaceCharText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_whitespaceChar->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append(widget->m_totalCharText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_totalChar->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append( ( forLaTeX ? " & \\\\\n" : "\n") ); text->append(stringGroupName + ( forLaTeX ? " & \\\\\n" : "\n") ); text->append(widget->m_wordStringText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_wordString->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append(widget->m_commandStringText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_commandString->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append(widget->m_environmentStringText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_environmentString->text() + ( forLaTeX ? " \\\\\n" : "\n")); text->append(widget->m_totalStringText->text() + ( forLaTeX ? " & " : "\t" ) + widget->m_totalString->text() + ( forLaTeX ? " \\\\\\hline\n": "\n")); if (forLaTeX) text->append("\\end{tabular}\n"); if(m_hasSelection) // we can't have both cases text->append( ( forLaTeX? "\\par\\bigskip\n": "\n") + widget->m_warning->text() + '\n'); else if(m_notAllFilesOpenWarning) text->append( ( forLaTeX? "\\par\\bigskip\n": "\n") + widget->m_warning->text() + '\n'); }