Project

General

Profile

Bug #663 » FilesUpload.C

Zhimin Song, 01/01/2011 10:36 AM

 
// =====================================================================================
//
// Filename: FilesUpload.C
//
// Description:
//
//
// Version: 1.0
// Created: 2010年07月19日 17时06分17秒
// Revision: none
// Compiler: g++
//
// Author: 宋志民 (Song Zhi-Min), cszhmsong@gmail.com
// Company: 希科系统开发小组(CxServer Development Team)
//
// =====================================================================================

//#include <boost/lexical_cast.hpp>
//#include <iostream>

#include <WLineEdit>
#include <WLogger>
#include <WApplication>

#include "FilesUpload.h"
#include "TrString.h"
#include "ComUtil.h"

FilesUpload::FilesUpload(int min, int max, WContainerWidget *parent)
: min_(min),
max_(max),
layout_(),
edits_(),
uploadFile_(),
uploadOtherFile_(),
filesPending_(0),
filesFailed_(0),
files_(),
WCompositeWidget(parent) {

setImplementation(layout_ = new WContainerWidget());
createUi();
}

FilesUpload::~FilesUpload() {
deltmp();
}

void FilesUpload::deltmp() {

if(files_.size() > 0) {
std::vector<File> tmp_files = files();
for(unsigned int i = 0; i < tmp_files.size(); ++i)
unlink(tmp_files[i].spoolFileName.c_str());
files_.clear();
}
}

void FilesUpload::createUi() {

deltmp();
layout_->clear();

edits_ = new WTable(layout_);
edits_->resize(WLength(100, WLength::Percentage), WLength());

files_.push_back(new FileUploadItem(this, edits_->elementAt(0, 0)));
files_.back()->hide();

uploadFile_ = new Option("b_upload_one", edits_->elementAt(0, 0));
uploadFile_->hide();

uploadOtherFile_ = new Text("b_upload_another", "option", edits_->elementAt(0, 0));
uploadOtherFile_->setText(TrString("b_upload_another") + ComUtil::toString(max_-1));
uploadOtherFile_->hide();

uploadFile_->item()->clicked().connect(SLOT(uploadFile_, WWidget::hide));
uploadFile_->item()->clicked().connect(SLOT(files_.back(),WWidget::show));
uploadFile_->item()->clicked().connect(SLOT(uploadOtherFile_, WWidget::show));
uploadFile_->item()->clicked().connect(SLOT(this, FilesUpload::uploadMore));
uploadOtherFile_->clicked().connect(SLOT(this, FilesUpload::uploadMore));

if(min_ > 0) { //min_ >= 1

uploadOtherFile_->show();

// show first file upload item
files_.back()->show();
files_.back()->hideCancel();

// show rest of (min_-1) items
for(unsigned int i = 0; i < (min_-1); ++i) {
FileUploadItem *edit = new FileUploadItem(this);
edits_->elementAt(0, 0)->insertBefore(edit, uploadOtherFile_);
files_.push_back(edit);
// as mandatory, so hide cancel button
// default show when created.
files_.back()->hideCancel();
}
// prepare another one in order to fast show if necessary, but does not hideCancel
FileUploadItem *edit = new FileUploadItem(this);
edits_->elementAt(0, 0)->insertBefore(edit, uploadOtherFile_);
files_.push_back(edit);
files_.back()->hide();
uploadOtherFile_->clicked().connect(SLOT(files_.back(), WWidget::show));

if(max_-min_ > 0)
uploadOtherFile_->setText(TrString("b_upload_another") + ComUtil::toString(max_-min_));
else
uploadOtherFile_->hide();
}
else // min_ = 0
uploadFile_->show();
}

void FilesUpload::uploadMore() {

if(files_.size() <= max_) {

// prepare another one as latter
FileUploadItem *edit = new FileUploadItem(this);
edits_->elementAt(0, 0)->insertBefore(edit, uploadOtherFile_);
files_.push_back(edit);
files_.back()->hide();

// show the last second one
uploadOtherFile_->clicked().connect(SLOT(files_.back(), WWidget::show));
int rest = max_-(files_.size()-1);
uploadOtherFile_->setText(TrString("b_upload_another") + ComUtil::toString(rest));
}
// notice this is not "else if"
if(files_.size() == (max_+1)) {
files_.back()->hide();
uploadOtherFile_->hide();
}
}

std::vector<File> FilesUpload::files() const {

std::vector<File> files;

// should minus 1, because we always created one more.
for (unsigned int i = 0; i < (files_.size()-1); ++i)
files.push_back(files_[i]->file());

return files;
}

void FilesUpload::cancelFileItem(FileUploadItem *fileItem) {

std::vector<FileUploadItem *>::iterator i
= std::find(files_.begin(), files_.end(), fileItem);

if(i != files_.end()) {

files_.erase(i);
delete fileItem;

update();
}
}

void FilesUpload::removeFileItem(FileUploadItem *fileItem) {

std::vector<FileUploadItem *>::iterator i
= std::find(files_.begin(), files_.end(), fileItem);

if(i != files_.end()) {

unlink(fileItem->file().spoolFileName.c_str());

files_.erase(i);
delete fileItem;

update();
}
}

void FilesUpload::update() {

if(min_ == 0) {

if(files_.size() == 1) {
uploadOtherFile_->hide();
uploadFile_->show();
uploadFile_->item()->clicked().connect(SLOT(files_.back(),WWidget::show));
}
else {
uploadOtherFile_->show();
int rest = max_-(files_.size()-1);
uploadOtherFile_->setText(TrString("b_upload_another") + ComUtil::toString(rest));
}
}

if(min_ > 0) {

if(files_.size() == min_) {
files_.back()->show();
files_.back()->hideCancel();
uploadMore();
}
else {
uploadOtherFile_->show();
int rest = max_-(files_.size()-1);
uploadOtherFile_->setText(TrString("b_upload_another") + ComUtil::toString(rest));
}
}
}

bool FilesUpload::uploadDone() {

filesPending_ = 0;
filesFailed_ = 0;

for(unsigned int i = 0; i < files_.size() - 1; ++i) {
if(files_[i]->uploadNow())
++filesPending_;
if(files_[i]->uploadFailed())
++filesFailed_;
}

if(filesPending_ == 0 and filesFailed_ == 0)
return true;
else
return false;
}
(1-1/5)