diff options
Diffstat (limited to 'filesharing/advanced/kcm_sambaconf/hiddenfileview.cpp')
-rw-r--r-- | filesharing/advanced/kcm_sambaconf/hiddenfileview.cpp | 610 |
1 files changed, 610 insertions, 0 deletions
diff --git a/filesharing/advanced/kcm_sambaconf/hiddenfileview.cpp b/filesharing/advanced/kcm_sambaconf/hiddenfileview.cpp new file mode 100644 index 00000000..988e2594 --- /dev/null +++ b/filesharing/advanced/kcm_sambaconf/hiddenfileview.cpp @@ -0,0 +1,610 @@ +/*************************************************************************** + hiddenfileview.cpp - description + ------------------- + begin : Wed Jan 1 2003 + copyright : (C) 2003 by Jan Sch�er + email : [email protected] + ***************************************************************************/ + +/****************************************************************************** + * * + * This file is part of KSambaPlugin. * + * * + * KSambaPlugin 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. * + * * + * KSambaPlugin is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with KSambaPlugin; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * * + ******************************************************************************/ + +#include <assert.h> + +#include <qcheckbox.h> +#include <qlineedit.h> +#include <qregexp.h> +#include <qstringlist.h> +#include <qgroupbox.h> +#include <qcursor.h> + + +#include <kpopupmenu.h> +#include <kaction.h> +#include <krestrictedline.h> +#include <klocale.h> +#include <kfiledetailview.h> +#include <kdirlister.h> +#include <kmessagebox.h> +#include <kurlrequester.h> + +#include "hiddenfileview.h" +#include "sharedlgimpl.h" +#include "sambashare.h" + + +#define COL_NAME 0 +#define COL_HIDDEN 1 +#define COL_VETO 2 +#define COL_VETO_OPLOCK 3 +#define COL_SIZE 4 +#define COL_DATE 5 +#define COL_PERM 6 +#define COL_OWNER 7 +#define COL_GROUP 8 + +#define HIDDENTABINDEX 5 + +HiddenListViewItem::HiddenListViewItem( QListView *parent, KFileItem *fi, bool hidden=false, bool veto=false, bool vetoOplock=false ) + : QMultiCheckListItem( parent ) +{ + setPixmap( COL_NAME, fi->pixmap(KIcon::SizeSmall)); + + setText( COL_NAME, fi->text() ); + setText( COL_SIZE, KGlobal::locale()->formatNumber( fi->size(), 0)); + setText( COL_DATE, fi->timeString() ); + setText( COL_PERM, fi->permissionsString() ); + setText( COL_OWNER, fi->user() ); + setText( COL_GROUP, fi->group() ); + + setOn(COL_HIDDEN,hidden); + setOn(COL_VETO,veto); + setOn(COL_VETO_OPLOCK,vetoOplock); + + _fileItem = fi; +} + +HiddenListViewItem::~HiddenListViewItem() +{ +} + +KFileItem* HiddenListViewItem::getFileItem() +{ + return _fileItem; +} + + +void HiddenListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) +{ + QColorGroup _cg = cg; + + if (isOn(COL_VETO)) + _cg.setColor(QColorGroup::Base,lightGray); + + if (isOn(COL_HIDDEN)) + _cg.setColor(QColorGroup::Text,gray); + + QMultiCheckListItem::paintCell(p, _cg, column, width, alignment); +} + + + + +HiddenFileView::HiddenFileView(ShareDlgImpl* shareDlg, SambaShare* share) +{ + _share = share; + _dlg = shareDlg; + + _hiddenActn = new KToggleAction(i18n("&Hide")); + _vetoActn = new KToggleAction(i18n("&Veto")); + _vetoOplockActn = new KToggleAction(i18n("&Veto Oplock")); + + initListView(); + + _dlg->hiddenChk->setTristate(true); + _dlg->vetoChk->setTristate(true); + + connect( _dlg->hiddenChk, SIGNAL(toggled(bool)), this, SLOT( hiddenChkClicked(bool) )); + connect( _dlg->vetoChk, SIGNAL(toggled(bool)), this, SLOT( vetoChkClicked(bool) )); + connect( _dlg->vetoOplockChk, SIGNAL(toggled(bool)), this, SLOT( vetoOplockChkClicked(bool) )); + + _dlg->hiddenEdit->setText( _share->getValue("hide files") ); + connect( _dlg->hiddenEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateView())); + + _dlg->vetoEdit->setText( _share->getValue("veto files") ); + connect( _dlg->vetoEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateView())); + + _dlg->vetoOplockEdit->setText( _share->getValue("veto oplock files") ); + connect( _dlg->vetoOplockEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateView())); + +// new QLabel(i18n("Hint")+" : ",grid); +// new QLabel(i18n("You have to separate the entries with a '/'. You can use the wildcards '*' and '?'"),grid); +// new QLabel(i18n("Example")+" : ",grid); +// new QLabel(i18n("*.tmp/*SECRET*/.*/file?.*/"),grid); + + _dir = new KDirLister(true); + _dir->setShowingDotFiles(true); + + connect( _dir, SIGNAL(newItems(const KFileItemList &)), + this, SLOT(insertNewFiles(const KFileItemList &))); + + connect( _dir, SIGNAL(deleteItem(KFileItem*)), + this, SLOT(deleteItem(KFileItem*))); + + connect( _dir, SIGNAL(refreshItems(const KFileItemList &)), + this, SLOT(refreshItems(const KFileItemList &))); + + connect( _hiddenActn, SIGNAL(toggled(bool)), this, SLOT(hiddenChkClicked(bool))); + connect( _vetoActn, SIGNAL(toggled(bool)), this, SLOT(vetoChkClicked(bool))); + connect( _vetoOplockActn, SIGNAL(toggled(bool)), this, SLOT(vetoOplockChkClicked(bool))); +} + +void HiddenFileView::initListView() +{ + _dlg->hiddenListView->setMultiSelection(true); + _dlg->hiddenListView->setSelectionMode(QListView::Extended); + _dlg->hiddenListView->setAllColumnsShowFocus(true); + + _hiddenList = createRegExpList(_share->getValue("hide files")); + _vetoList = createRegExpList(_share->getValue("veto files")); + _vetoOplockList = createRegExpList(_share->getValue("veto oplock files")); + + _popup = new KPopupMenu(_dlg->hiddenListView); + + _hiddenActn->plug(_popup); + _vetoActn->plug(_popup); + _vetoOplockActn->plug(_popup); + + connect( _dlg->hiddenListView, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); + connect( _dlg->hiddenListView, SIGNAL(contextMenu(KListView*,QListViewItem*,const QPoint&)), + this, SLOT(showContextMenu())); + + connect( _dlg->hideDotFilesChk, SIGNAL(toggled(bool)), this, SLOT(hideDotFilesChkClicked(bool))); + connect( _dlg->hideUnreadableChk, SIGNAL(toggled(bool)), this, SLOT(hideUnreadableChkClicked(bool))); + + connect( _dlg->hiddenListView, SIGNAL(mouseButtonPressed(int,QListViewItem*,const QPoint &,int)), + this, SLOT(slotMouseButtonPressed(int,QListViewItem*,const QPoint &,int))); +} + +HiddenFileView::~HiddenFileView() +{ + delete _dir; +} + +void HiddenFileView::load() +{ + if (_dlg->hiddenListView) + _dlg->hiddenListView->clear(); + + _dir->openURL( _dlg->pathUrlRq->url() ); +} + +void HiddenFileView::save() +{ + QString s = _dlg->hiddenEdit->text().stripWhiteSpace(); + // its important that the string ends with an '/' + // otherwise Samba won't recognize the last entry + if ( (!s.isEmpty()) && (s.right(1)!="/")) + s+="/"; + _share->setValue("hide files", s); + + s = _dlg->vetoEdit->text().stripWhiteSpace(); + // its important that the string ends with an '/' + // otherwise Samba won't recognize the last entry + if ( (!s.isEmpty()) && (s.right(1)!="/")) + s+="/"; + _share->setValue("veto files", s); + + s = _dlg->vetoOplockEdit->text().stripWhiteSpace(); + // its important that the string ends with an '/' + // otherwise Samba won't recognize the last entry + if ( (!s.isEmpty()) && (s.right(1)!="/")) + s+="/"; + _share->setValue("veto oplock files", s); + +} + +void HiddenFileView::insertNewFiles(const KFileItemList &newone) +{ + if ( newone.isEmpty() ) + return; + + KFileItem *tmp; + + int j=0; + + for (KFileItemListIterator it(newone); (tmp = it.current()); ++it) + { + j++; + + bool hidden = matchHidden(tmp->text()); + bool veto = matchVeto(tmp->text()); + bool vetoOplock = matchVetoOplock(tmp->text()); + + new HiddenListViewItem( _dlg->hiddenListView, tmp, hidden, veto, vetoOplock ); + + } +} + + + +void HiddenFileView::columnClicked(int column) { + + + switch (column) { + case COL_HIDDEN : hiddenChkClicked( !_dlg->hiddenChk->isOn() );break; + case COL_VETO : vetoChkClicked( !_dlg->vetoChk->isOn() );break; + case COL_VETO_OPLOCK : vetoOplockChkClicked( !_dlg->vetoOplockChk->isOn() );break; + default : break; + } +} + +void HiddenFileView::deleteItem( KFileItem *fileItem ) +{ + HiddenListViewItem* item; + for (item = dynamic_cast<HiddenListViewItem*>(_dlg->hiddenListView->firstChild());item; + item = dynamic_cast<HiddenListViewItem*>(item->nextSibling())) + { + if (item->getFileItem() == fileItem) + { + delete item; + break; + } + } + +} + +void HiddenFileView::refreshItems( const KFileItemList& /*items*/ ) +{ + updateView(); +} + + +void HiddenFileView::showContextMenu() +{ + _popup->exec(QCursor::pos()); +} + + +void HiddenFileView::selectionChanged() +{ + bool veto = false; + bool noVeto = false; + bool hide = false; + bool noHide = false; + bool vetoOplock = false; + bool noVetoOplock = false; + + int n = 0; + + HiddenListViewItem* item; + for (item = static_cast<HiddenListViewItem*>(_dlg->hiddenListView->firstChild());item; + item = static_cast<HiddenListViewItem*>(item->nextSibling())) + { + if (!item->isSelected()) + continue; + + n++; + + if (item->isOn(COL_VETO)) + veto = true; + else + noVeto = true; + + if (item->isOn(COL_VETO_OPLOCK)) + vetoOplock = true; + else + noVetoOplock = true; + + if (item->isOn(COL_HIDDEN)) + hide = true; + else + noHide = true; + } + + + _dlg->selGrpBx->setEnabled(n>0); + + if (veto && noVeto) + { + _dlg->vetoChk->setTristate(true); + _dlg->vetoChk->setNoChange(); + _dlg->vetoChk->update(); + } + else + { + _dlg->vetoChk->setTristate(false); + _dlg->vetoChk->setChecked(veto); + } + + if (vetoOplock && noVetoOplock) + { + _dlg->vetoOplockChk->setTristate(true); + _dlg->vetoOplockChk->setNoChange(); + _dlg->vetoOplockChk->update(); + } + else + { + _dlg->vetoOplockChk->setTristate(false); + _dlg->vetoOplockChk->setChecked(vetoOplock); + } + + + if (hide && noHide) + { + _dlg->hiddenChk->setTristate(true); + _dlg->hiddenChk->setNoChange(); + _dlg->hiddenChk->update(); + } + else + { + _dlg->hiddenChk->setTristate(false); + _dlg->hiddenChk->setChecked(hide); + } +} + +void HiddenFileView::checkBoxClicked(QCheckBox* chkBox,KToggleAction* action,QLineEdit* edit, int column,QPtrList<QRegExp> & reqExpList,bool b) { + // We don't save the old state so + // disable the tristate mode + chkBox->setTristate(false); + action->setChecked(b); + chkBox->setChecked(b); + + HiddenListViewItem* item; + for (item = static_cast<HiddenListViewItem*>(_dlg->hiddenListView->firstChild());item; + item = static_cast<HiddenListViewItem*>(item->nextSibling())) + { + if (!item->isSelected()) + continue; + + if (b == item->isOn(column)) + continue; + + if (!b) { + QRegExp* rx = getRegExpListMatch(item->text(0),reqExpList); + + // Perhaps the file was hidden because it started with a dot + if (!rx && item->text(0)[0]=='.' && _dlg->hideDotFilesChk->isChecked()) { + int result = KMessageBox::questionYesNo(_dlg,i18n( + "<qt>Some files you have selected are hidden because they start with a dot; " + "do you want to uncheck all files starting with a dot?</qt>"),i18n("Files Starting With Dot"),i18n("Uncheck Hidden"), i18n("Keep Hidden")); + + if (result == KMessageBox::No) { + QPtrList<HiddenListViewItem> lst = getMatchingItems(QRegExp(".*",false,true)); + deselect(lst); + } else { + _dlg->hideDotFilesChk->setChecked(false); + } + continue; + } else { + if (rx) { + // perhaps it is matched by a wildcard string + QString p = rx->pattern(); + if ( p.find("*") > -1 || + p.find("?") > -1 ) + { + // TODO after message freeze: why show three times the wildcard string? Once should be enough. + // TODO remove <b></b> and use <qt> instead + int result = KMessageBox::questionYesNo(_dlg,i18n( + "<b></b>Some files you have selected are matched by the wildcarded string <b>'%1'</b>; " + "do you want to uncheck all files matching <b>'%1'</b>?").arg(rx->pattern()).arg(rx->pattern()).arg(rx->pattern()), + i18n("Wildcarded String"),i18n("Uncheck Matches"),i18n("Keep Selected")); + + QPtrList<HiddenListViewItem> lst = getMatchingItems( *rx ); + + if (result == KMessageBox::No) { + deselect(lst); + } else { + setState(lst,column,false); + reqExpList.remove(rx); + updateEdit(edit, reqExpList); + } + continue; + } else { + reqExpList.remove(rx); + updateEdit(edit, reqExpList); + } + } + } + } + else { + reqExpList.append( new QRegExp(item->text(0)) ); + updateEdit(edit, reqExpList); + } + + item->setOn(column,b); + } + + _dlg->hiddenListView->update(); +} + +void HiddenFileView::hiddenChkClicked(bool b) +{ + checkBoxClicked(_dlg->hiddenChk, _hiddenActn, _dlg->hiddenEdit, COL_HIDDEN,_hiddenList,b); + +} + +void HiddenFileView::vetoOplockChkClicked(bool b) { + checkBoxClicked(_dlg->vetoOplockChk, _vetoOplockActn, _dlg->vetoOplockEdit, COL_VETO_OPLOCK,_vetoOplockList,b); +} + +void HiddenFileView::vetoChkClicked(bool b) +{ + checkBoxClicked(_dlg->vetoChk, _vetoActn, _dlg->vetoEdit, COL_VETO,_vetoList,b); +} + +/** + * Sets the text of the QLineEdit edit to the entries of the passed QRegExp-List + **/ +void HiddenFileView::updateEdit(QLineEdit* edit, QPtrList<QRegExp> & lst) +{ + QString s=""; + + QRegExp* rx; + for(rx = static_cast<QRegExp*>(lst.first()); rx; + rx = static_cast<QRegExp*>(lst.next()) ) + { + s+= rx->pattern()+QString("/"); + } + + edit->setText(s); +} + + +void HiddenFileView::setState(QPtrList<HiddenListViewItem> & lst, int column, bool b) { + HiddenListViewItem* item; + for(item = static_cast<HiddenListViewItem*>(lst.first()); item; + item = static_cast<HiddenListViewItem*>(lst.next()) ) + { + item->setOn(column,b); + } +} + + +void HiddenFileView::deselect(QPtrList<HiddenListViewItem> & lst) +{ + HiddenListViewItem* item; + for(item = static_cast<HiddenListViewItem*>(lst.first()); item; + item = static_cast<HiddenListViewItem*>(lst.next()) ) + { + item->setSelected(false); + } +} + + +QPtrList<HiddenListViewItem> HiddenFileView::getMatchingItems(const QRegExp & rx) +{ + QPtrList<HiddenListViewItem> lst; + + HiddenListViewItem* item; + for (item = static_cast<HiddenListViewItem*>(_dlg->hiddenListView->firstChild());item; + item = static_cast<HiddenListViewItem*>(item->nextSibling())) + { + if (rx.exactMatch(item->text(0))) + lst.append(item); + } + + return lst; +} + +void HiddenFileView::updateView() +{ + _hiddenList = createRegExpList(_dlg->hiddenEdit->text()); + _vetoList = createRegExpList(_dlg->vetoEdit->text()); + _vetoOplockList = createRegExpList(_dlg->vetoOplockEdit->text()); + + HiddenListViewItem* item; + for (item = static_cast<HiddenListViewItem*>(_dlg->hiddenListView->firstChild());item; + item = static_cast<HiddenListViewItem*>(item->nextSibling())) + { + item->setOn(COL_HIDDEN,matchHidden(item->text(0))); + item->setOn(COL_VETO,matchVeto(item->text(0))); + item->setOn(COL_VETO_OPLOCK,matchVetoOplock(item->text(0))); + } + + _dlg->hiddenListView->repaint(); +} + + +QPtrList<QRegExp> HiddenFileView::createRegExpList(const QString & s) +{ + QPtrList<QRegExp> lst; + bool cs = _share->getBoolValue("case sensitive"); + + if (!s.isEmpty()) + { + QStringList l = QStringList::split("/",s); + + for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it ) { + lst.append( new QRegExp(*it,cs,true) ); + } + } + + return lst; +} + +bool HiddenFileView::matchHidden(const QString & s) +{ + QPtrList<QRegExp> hiddenList(_hiddenList); + + if (_dlg->hideDotFilesChk->isChecked()) + hiddenList.append( new QRegExp(".*",false,true) ); + + return matchRegExpList(s,hiddenList); +} + +bool HiddenFileView::matchVeto(const QString & s) +{ + return matchRegExpList(s,_vetoList); +} + +bool HiddenFileView::matchVetoOplock(const QString & s) +{ + return matchRegExpList(s,_vetoOplockList); +} + +bool HiddenFileView::matchRegExpList(const QString & s, QPtrList<QRegExp> & lst) +{ + if (getRegExpListMatch(s,lst)) + return true; + else + return false; +} + + +QRegExp* HiddenFileView::getHiddenMatch(const QString & s) +{ + return getRegExpListMatch(s,_hiddenList); +} + +QRegExp* HiddenFileView::getVetoMatch(const QString & s) +{ + return getRegExpListMatch(s,_vetoList); +} + +QRegExp* HiddenFileView::getRegExpListMatch(const QString & s, QPtrList<QRegExp> & lst) +{ + QRegExp* rx; + + for ( rx = lst.first(); rx; rx = lst.next() ) + { + if (rx->exactMatch(s)) + return rx; + } + + return 0L; +} + +void HiddenFileView::hideDotFilesChkClicked(bool) +{ + updateView(); +} + +void HiddenFileView::hideUnreadableChkClicked(bool) +{ + updateView(); +} + +void HiddenFileView::slotMouseButtonPressed( int, QListViewItem*, const QPoint&, int c ) { + columnClicked(c); +} + + +#include "hiddenfileview.moc" |