|
// =====================================================================================
|
|
//
|
|
// 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;
|
|
}
|