📄 removetab.cc
字号:
//=======================================================================// RemoveTab.cc//-----------------------------------------------------------------------// This file is part of the package paco// Copyright (C) 2004-2007 David Rosal <david.3r@gmail.com>// For more information visit http://paco.sourceforge.net//=======================================================================#include "config.h"#include "globals.h"#include "Lock.h"#include "Config.h"#include "util.h"#include "RemoveTab.h"#include "paco/File.h"#include "PkgWindow.h"#include "MainWindow.h"#include <gtkmm/stock.h>#include <gtkmm/table.h>#include <gtkmm/scrolledwindow.h>#include <gtkmm/sizegroup.h>#include <gtkmm/separator.h>#include <gtkmm/tooltips.h>#define CHECK_PKG_WINDOW \ if (!mPkg.window() || mPkg.window()->deleting()) returnusing Glib::ustring;using std::string;using sigc::mem_fun;using namespace Gpaco;RemoveTab::RemoveTab(Pkg& pkg): Gtk::VBox(), mPkg(pkg), mPkgSet(gpMainWindow->treeView().pkgSet()), mLabel("", 0.02, 0.5), mRemoveShared(false), mButtonShared("Remove _shared", true), mButtonRemove(Gtk::Stock::DELETE, "_Remove"), mButtonStop(Gtk::Stock::STOP, "_Stop"), mButtonResume(Gtk::Stock::DELETE, "_Resume"), mTextView(), mpTextBuffer(mTextView.get_buffer()), mpTagSuccess(mpTextBuffer->create_tag()), mpTagError(mpTextBuffer->create_tag()), mpTagShared(mpTextBuffer->create_tag()), mStop(false){ mButtonShared.signal_clicked().connect(mem_fun (*this, &RemoveTab::onSwitchRemoveShared)); gpTips->set_tip(mButtonShared, "Remove the shared files (those files " "which are also owned by other packages)"); mButtonRemove.signal_clicked().connect(mem_fun (*this, &RemoveTab::onRemove)); mButtonStop.signal_clicked().connect(mem_fun (*this, &RemoveTab::onStop)); mButtonResume.signal_clicked().connect(mem_fun (*this, &RemoveTab::onResume)); Gtk::Table* pTable(Gtk::manage(new Gtk::Table(1, 1))); pTable->attach(mButtonRemove, 0, 1, 0, 1); pTable->attach(mButtonStop, 0, 1, 0, 1); pTable->attach(mButtonResume, 0, 1, 0, 1); Glib::RefPtr<Gtk::SizeGroup> pSizeGroup(Gtk::SizeGroup::create (Gtk::SIZE_GROUP_HORIZONTAL)); pSizeGroup->add_widget(mButtonRemove); pSizeGroup->add_widget(mButtonStop); pSizeGroup->add_widget(mButtonResume); Gtk::ScrolledWindow* pScrolledWindow(Gtk::manage(new Gtk::ScrolledWindow())); pScrolledWindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); pScrolledWindow->add(mTextView); mTextView.set_editable(false); mTextView.set_cursor_visible(false); mTextView.set_left_margin(4); mTextView.set_right_margin(4); mTextView.modify_base(Gtk::STATE_NORMAL, Gdk::Color("black")); mpTagSuccess->property_foreground() = "white"; mpTagSuccess->property_weight() = Pango::WEIGHT_BOLD; mpTagSuccess->property_family() = "courier"; mpTagError->property_foreground() = "red"; mpTagError->property_weight() = Pango::WEIGHT_BOLD; mpTagError->property_family() = "courier"; mpTagShared->property_foreground() = "lightgreen"; mpTagShared->property_weight() = Pango::WEIGHT_BOLD; mpTagShared->property_family() = "courier"; Gtk::HBox* pHBox(Gtk::manage(new Gtk::HBox())); pHBox->set_border_width(2); pHBox->pack_start(mButtonShared, Gtk::PACK_SHRINK); pHBox->pack_end(*pTable, Gtk::PACK_SHRINK); pack_start(*pHBox, Gtk::PACK_SHRINK); pack_start(*pScrolledWindow); pack_start(*(Gtk::manage(new Gtk::HSeparator())), Gtk::PACK_SHRINK); pack_start(mLabel, Gtk::PACK_SHRINK); checkLock(); Glib::signal_timeout().connect(mem_fun(*this, &RemoveTab::checkLock), 500, Glib::PRIORITY_HIGH); show_all();}RemoveTab::~RemoveTab(){ }bool RemoveTab::checkLock(){ mButtonRemove.set_sensitive (!Lock::locked() && Config::logdirWritable() && mPkg.filesInst()); return true;}//---------//// private ////---------//void RemoveTab::report(std::string const& path, int code){ CHECK_PKG_WINDOW; Glib::RefPtr<Gtk::TextTag>* tag = &mpTagSuccess; ustring msg; switch (code) { case REPORT_REGULAR: msg = "Removed " + path; break; case REPORT_SYMLINK: msg = "Removed symlink " + path; break; case REPORT_DIR: msg = "Removed directory " + path; break; case REPORT_ERROR: tag = &mpTagError; msg = "ERROR: " + path + ": " + Glib::strerror(errno); break; case REPORT_SHARED: tag = &mpTagShared; msg = path + ": shared"; break; case REPORT_UNLOG: msg = "\nPackage " + mPkg.name() + " removed from database"; break; default: g_assert_not_reached(); } CHECK_PKG_WINDOW; mpTextBuffer->insert_with_tag(mpTextBuffer->end(), msg + "\n", *tag); Gtk::TextIter end = mpTextBuffer->end(); mTextView.scroll_to(end); refreshMainLoop();}bool RemoveTab::removeFile(File* file){ g_assert(file != NULL); struct stat s; bool ret = false; if (!lstat(file->name().c_str(), &s)) { if (!mRemoveShared && mPkg.shares(file, mPkgSet)) report(file->name(), REPORT_SHARED); else if (!unlink(file->name().c_str())) { report(file->name(), S_ISLNK(s.st_mode) ? REPORT_SYMLINK : REPORT_REGULAR); ret = true; } else report(file->name(), REPORT_ERROR); } return ret;}void RemoveTab::removeDir(string const& dir){ if (dir.find("/", 1) == string::npos) return; else if (!rmdir(dir.c_str())) { report(dir, REPORT_DIR); removeDir(Glib::path_get_dirname(dir)); } else if (errno != ENOTDIR && errno != ENOENT && errno != ENOTEMPTY) report(dir, REPORT_ERROR);}void RemoveTab::onRemove(){ g_assert(Config::logdirWritable()); g_assert(mStop == false); if (!questionDialog(mPkg.window(), "Remove the package " + mPkg.name() + " ?")) return; mpTextBuffer->erase(mpTextBuffer->begin(), mpTextBuffer->end()); mpTextBuffer->insert(mpTextBuffer->end(), "\n"); mButtonRemove.hide(); mButtonStop.show(); long files = 0, size = 0;____loop: for (Pkg::iterator f = mPkg.begin(); f != mPkg.end(); ++f) { if (mStop && mPkg.window()) { while (mStop && mPkg.window()) { Glib::usleep(3000); refreshMainLoop(); } goto ____loop; } if (removeFile(*f)) { ++files; size += (*f)->size(); std::ostringstream txt; txt << "Removed " << files << " file" << (files > 1 ? "s" : "") << " (" << Paco::sizeStr(Config::sizeUnit(), size) << ")"; CHECK_PKG_WINDOW; mLabel.set_text(txt.str()); removeDir(Glib::path_get_dirname((*f)->name())); } } if (!mPkg.update()) report("", REPORT_UNLOG); else if (!mPkg.filesInst()) { // all files removed if (!unlink(mPkg.log().c_str())) report("", REPORT_UNLOG); else report(mPkg.log(), REPORT_ERROR); } CHECK_PKG_WINDOW; mButtonStop.hide(); mButtonRemove.show(); mButtonRemove.set_sensitive(false);}void RemoveTab::onStop(){ g_assert(mStop == false); mStop = true; mPkg.update(); mButtonStop.hide(); mButtonResume.show();}void RemoveTab::onResume(){ g_assert(mStop == true); mStop = false; mButtonStop.show(); mButtonResume.hide();}void RemoveTab::onSwitchRemoveShared(){ mRemoveShared = !mRemoveShared;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -