#include "dialog.h"
#include "ui_dialog.h"
#include <QPushButton>
#include <QMessageBox>
#include <QFileDialog>
#include <QLabel>
#include <cstdio>
#include <cstring>
#include <string>
#include <QFileInfoList>
#include <QDir>
#include <QFileInfo>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QWidget>
int get_file_line_num(const char* filename);
int get_file_black_num(const char* filename);
const char* int_to_str(int i);
const char* int_to_str(double);
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
Hlayout();
QObject::connect(ui->brower,SIGNAL(clicked()),this,SLOT(address()));
QObject::connect(ui->start, SIGNAL(clicked()),this,SLOT(go()));
setWindowTitle(tr("Get Lines-num of Files in Special Directory"));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::Hlayout()
{
QHBoxLayout *toplayout=new QHBoxLayout;
toplayout->addWidget(ui->label1);
toplayout->addWidget(ui->text);
toplayout->addWidget(ui->brower);
toplayout->addWidget(ui->start);
QHBoxLayout *rightlayout=new QHBoxLayout;
rightlayout->addWidget(ui->progressBar);
rightlayout->addWidget(ui->label2);
rightlayout->addWidget(ui->total);
rightlayout->addWidget(ui->label3);
QVBoxLayout *leftLayout=new QVBoxLayout;
leftLayout->addLayout(toplayout);
leftLayout->addLayout(rightlayout);
QVBoxLayout *mainLayout=new QVBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(toplayout);
mainLayout->addLayout(rightlayout);
mainLayout->addWidget(ui->display);
setLayout(mainLayout);
}
void Dialog::address()
{
ui->text->setText(QFileDialog::getExistingDirectory(this, "select directory", "d:\\"));//打开一个文件对话框,选择文件系统中存在的目录;
}
void Dialog::go()
{
file_num=total_num = 0;
detail_info = "";
if(ui->text->text().trimmed().length() > 0) //判定目录是否正确;
{
if(get_all_file_linenum(ui->text->text().toStdString().c_str())==true) //得到text里面的文件目录;
{
ui->display->setText(tr(detail_info.c_str()));
//ui->file->setText(tr(int_to_str(file_num)));
ui->total->setText(tr(int_to_str(total_num)));
QMessageBox::information(this, QString::fromLocal8Bit("统计信息!"), QString::fromLocal8Bit("所有文件代码行数、空白行、注释行统计完毕"));
}
}
}
bool Dialog::get_all_file_linenum(const char* dir_or_file)
{
line_num=0;black_num=0;
std::string d(dir_or_file);
QString s(d.c_str());
QDir p(s);
if (!p.exists())
return false;
p.setFilter(QDir::Files|QDir::Dirs);
p.setSorting(QDir::DirsFirst);
QFileInfoList list=p.entryInfoList();
ui->progressBar->setRange(0,list.size()-1);
ui->progressBar->setValue(0);
for(int i=0;i<list.size();i++)
{
QFileInfo fi=list.at(i);
ui->progressBar->setValue(i);
if(fi.fileName()=="."||fi.fileName()=="..")
{
i++;
continue;
}
bool bisDir=fi.isDir();
if(bisDir)
{
++file_num;
get_all_file_linenum(fi.filePath().toAscii().data());
}
else
{
++file_num;
line_num=get_file_line_num(fi.filePath().toAscii().data());
memset(cur_info,0,MAX_LENGTH_ONE_LINE);
sprintf(cur_info,"'%s':\t\t%d lines",fi.path().toAscii().data(),line_num);
detail_info += cur_info;
black_num=get_file_black_num(fi.filePath().toAscii().data());
memset(cur_info,0,MAX_LENGTH_ONE_LINE);
sprintf(cur_info,",%d blacklines",black_num);
detail_info += cur_info;
note_num=get_file_black_num(fi.filePath().toAscii().data());
memset(cur_info,0,MAX_LENGTH_ONE_LINE);
sprintf(cur_info,",%d notelines\n",note_num);
detail_info += cur_info;
total_num +=line_num;
}
}
return true;
}