Encapsulate hidden file detection into a class that can be used to generalize
and replace hard-coded "dotfile" detection. This starts to address issue # 273. Hidden files can be identified using one or more match strings, with matching governed either by wildcard (default) or regexp (optional). Matching is either case-sensitive (default) or case-INsensitive (optional). A user interface for inspecting and modifying match criteria is provided. Match criteria is passed from/to applications or views as TQString that starts with a single character: 'w' - match strings are wildcards, match is case-sensitive 'W' - match strings are wildcards, match is case-INsensitive 'r' - match strings are regexps, match is case-sensitive 'R' - match strings are regexps, match is case-INsensitive The remainder of the string is a '/'-separated list of one or more match strings. The TDEHiddenFileMatcher class is derived from a more general TDEStringMatcher class which is available to applications to conduct other string matching tasks. Signed-off-by: Vincent Reher <tde@4reher.org>pull/178/head
parent
682b8acae4
commit
42fd81138d
@ -0,0 +1,234 @@
|
||||
#include "tdestringmatcher-dialog.h"
|
||||
#include "tdestringmatcher.h"
|
||||
|
||||
#include "tdeglobal.h"
|
||||
#include "tdelocale.h"
|
||||
#include "kdebug.h"
|
||||
|
||||
Customize_TDEStringMatcher_Dialog::Customize_TDEStringMatcher_Dialog(
|
||||
TQStringList initPatternList,
|
||||
bool initPatternIsRegex,
|
||||
bool initPatternIsCaseInsensitive,
|
||||
TQString callerTitle
|
||||
)
|
||||
{
|
||||
// Initialize our "output" variables
|
||||
patternList.clear();
|
||||
patternIsRegex = false;
|
||||
patternIsCaseInsensitive = false;
|
||||
dialogResult = CriteriaApplied;
|
||||
|
||||
setModal( TRUE );
|
||||
setCaption( i18n( "Specify string match criteria" ) );
|
||||
|
||||
// Create main layout and subordinate grid to position the widgets
|
||||
|
||||
TQHBoxLayout *topLayout = new TQHBoxLayout( this, 10 );
|
||||
TQGridLayout *grid = new TQGridLayout( 0, 2 ); // 2 wide and autodetect number of rows
|
||||
topLayout->addLayout( grid, 1 );
|
||||
int gridrow = 1;
|
||||
|
||||
//=== Set up dialog title ===//
|
||||
|
||||
//TQString titleGeneral = i18n( "Define 'Hidden' files for" ) ;
|
||||
//setCaption( titleGeneral + " " + callerTitle );
|
||||
TQLabel *dialogTitle = new TQLabel( this );
|
||||
dialogTitle->setText( "<b>" + callerTitle );
|
||||
dialogTitle->setFrameStyle( TQFrame::Box | TQFrame::Plain );
|
||||
dialogTitle->setAlignment( TQt::AlignHCenter | TQt::AlignVCenter );
|
||||
grid->addMultiCellWidget( dialogTitle, gridrow, gridrow, 0, 1 );
|
||||
gridrow++;
|
||||
|
||||
//=== Set up match pattern edit boxes ===/
|
||||
|
||||
TQLabel *patterns_label = new TQLabel( this );
|
||||
patterns_label->setText( i18n( "Match any of these patterns" ) );
|
||||
patterns_label->setAlignment( TQt::AlignHCenter );
|
||||
grid->addMultiCellWidget( patterns_label, gridrow, gridrow, 0, 1 );
|
||||
gridrow++;
|
||||
|
||||
// Limit the number of patterns to display to something reasonable
|
||||
maxPatterns = initPatternList.size() + 2;
|
||||
if ( maxPatterns > MAX_PATTERNS )
|
||||
maxPatterns = MAX_PATTERNS;
|
||||
|
||||
// Set up edit boxes with initial patterns
|
||||
short i = 0 ;
|
||||
for (
|
||||
TQStringList::iterator it = initPatternList.begin();
|
||||
i < maxPatterns, it != initPatternList.end() ;
|
||||
++it, i++, gridrow++
|
||||
) {
|
||||
le_Patterns[i] = new TQLineEdit( this );
|
||||
le_Patterns[i]->setText(it->latin1()) ;
|
||||
grid->addMultiCellWidget( le_Patterns[i], gridrow, gridrow, 0, 1 );
|
||||
}
|
||||
short first_empty_editbox = i;
|
||||
for ( ; i < maxPatterns; i++, gridrow++ ) {
|
||||
le_Patterns[i] = new TQLineEdit( this );
|
||||
grid->addMultiCellWidget( le_Patterns[i], gridrow, gridrow, 0, 1 );
|
||||
}
|
||||
le_Patterns[first_empty_editbox]->setFocus();
|
||||
|
||||
//=== Set up match option check boxes ===//
|
||||
|
||||
// Create a group of check boxes
|
||||
bg_Options = new TQButtonGroup( this, "checkGroup" );
|
||||
bg_Options->setTitle( i18n( "Match options" ) );
|
||||
grid->addMultiCellWidget( bg_Options, gridrow, gridrow, 0, 1 );
|
||||
gridrow++;
|
||||
|
||||
// Create a layout for the check boxes
|
||||
TQVBoxLayout *vbox = new TQVBoxLayout(bg_Options, 10);
|
||||
vbox->addSpacing( bg_Options->fontMetrics().height() );
|
||||
|
||||
// Set up first checkbox
|
||||
cb_patternIsRegex = new TQCheckBox( bg_Options );
|
||||
cb_patternIsRegex->setChecked( initPatternIsRegex );
|
||||
cb_patternIsRegex->setText( i18n( "&Regex (vs Wildcard)" ) );
|
||||
TQToolTip::add( cb_patternIsRegex, i18n( "Regex (vs Wildcard)" ) );
|
||||
vbox->addWidget( cb_patternIsRegex );
|
||||
|
||||
// Set up second checkbox
|
||||
cb_patternIsCaseInsensitive = new TQCheckBox( bg_Options );
|
||||
cb_patternIsCaseInsensitive->setChecked( initPatternIsCaseInsensitive );
|
||||
cb_patternIsCaseInsensitive->setText( i18n( "&Case insensitive" ) );
|
||||
TQToolTip::add( cb_patternIsCaseInsensitive, i18n( "Case insensitive" ) );
|
||||
vbox->addWidget( cb_patternIsCaseInsensitive );
|
||||
|
||||
//=== Set up final dispostion radio buttons ===//
|
||||
|
||||
// Create a group of radio buttons
|
||||
bg_Disposition = new TQButtonGroup( this, "radioGroup" );
|
||||
bg_Disposition->setTitle( i18n( "Disposition of Match Criteria:" ) );
|
||||
bg_Disposition->setRadioButtonExclusive(true);
|
||||
grid->addMultiCellWidget( bg_Disposition, gridrow, gridrow, 0, 1 );
|
||||
gridrow++;
|
||||
|
||||
// Create a layout for the radio buttons
|
||||
TQVBoxLayout *vbox2 = new TQVBoxLayout(bg_Disposition, 10);
|
||||
vbox2->addSpacing( bg_Disposition->fontMetrics().height() );
|
||||
|
||||
// Set up radio button 0
|
||||
rb_Disposition = new TQRadioButton( bg_Disposition );
|
||||
rb_Disposition->setText( i18n( "&Apply but do not save" ) );
|
||||
rb_Disposition->setChecked( TRUE );
|
||||
TQToolTip::add( rb_Disposition, i18n( "Changes will be applied temporarily" ) );
|
||||
vbox2->addWidget( rb_Disposition );
|
||||
|
||||
// Set up radio button 1
|
||||
rb_Disposition = new TQRadioButton( bg_Disposition );
|
||||
rb_Disposition->setText( i18n( "Apply and &save as default" ) );
|
||||
TQToolTip::add( rb_Disposition, i18n( "Changes will be applied and saved to disk" ) );
|
||||
vbox2->addWidget( rb_Disposition );
|
||||
|
||||
// Set up radio button 2
|
||||
rb_Disposition = new TQRadioButton( bg_Disposition );
|
||||
rb_Disposition->setText( i18n( "Ignore and restore &default" ) );
|
||||
TQToolTip::add( rb_Disposition, i18n( "Changes will be ignored and saved default restored" ) );
|
||||
vbox2->addWidget( rb_Disposition );
|
||||
|
||||
connect( bg_Disposition, SIGNAL(clicked(int)), SLOT(setExitDisposition(int)) );
|
||||
|
||||
//=== Set up dialog exit buttons ===/
|
||||
|
||||
pb_OK = new TQPushButton( this, "pb_OK" );
|
||||
pb_OK->setDefault( FALSE );
|
||||
pb_OK->setText( i18n( "&OK" ) );
|
||||
TQToolTip::add( pb_OK, i18n( "Save settings as default" ) );
|
||||
pb_OK->setAccel( TQKeySequence( "Return" ) );
|
||||
|
||||
grid->addWidget( pb_OK, gridrow, 0 );
|
||||
|
||||
pb_Cancel = new TQPushButton( this, "pb_Cancel" );
|
||||
pb_Cancel->setDefault( FALSE );
|
||||
pb_Cancel->setText( i18n( "&Cancel" ) );
|
||||
pb_Cancel->setAccel( TQKeySequence( "Esc" ) );
|
||||
|
||||
grid->addWidget( pb_Cancel, gridrow, 1 );
|
||||
|
||||
connect( pb_OK, SIGNAL( clicked() ), this, SLOT( exitOK() ) );
|
||||
connect( pb_Cancel, SIGNAL( clicked() ), this, SLOT( exitCancel() ) );
|
||||
}
|
||||
|
||||
//=== Dialog event handlers ===/
|
||||
|
||||
bool Customize_TDEStringMatcher_Dialog::event( TQEvent * e ) {
|
||||
if ( e->type() != TQEvent::KeyPress ) {
|
||||
TQKeyEvent * ke = (TQKeyEvent*) e;
|
||||
if ( ke->key() == Key_Escape ) {
|
||||
ke->accept();
|
||||
exitCancel();
|
||||
return TRUE;
|
||||
}
|
||||
else if ( ke->key() == Key_Return ) {
|
||||
ke->accept();
|
||||
exitOK();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return TQWidget::event( e );
|
||||
}
|
||||
|
||||
void Customize_TDEStringMatcher_Dialog::setExitDisposition(int buttonNum )
|
||||
{
|
||||
switch( buttonNum ) {
|
||||
case 0:
|
||||
dialogResult = CriteriaApplied;
|
||||
break;
|
||||
case 1:
|
||||
dialogResult = SaveCriteria;
|
||||
break;
|
||||
case 2:
|
||||
dialogResult = ReloadCriteria;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//=== Dialog exit functions ===//
|
||||
|
||||
void Customize_TDEStringMatcher_Dialog::exitOK()
|
||||
{
|
||||
if ( dialogResult > CriteriaUnchanged ) {
|
||||
patternList.clear();
|
||||
for ( int i = 0; i < maxPatterns; i++ ) {
|
||||
TQString pattern = le_Patterns[i]->text();
|
||||
if ( ! ( pattern.isEmpty() ) ) {
|
||||
patternList += pattern;
|
||||
}
|
||||
}
|
||||
patternIsRegex = cb_patternIsRegex->isChecked();
|
||||
patternIsCaseInsensitive = cb_patternIsCaseInsensitive->isChecked();
|
||||
}
|
||||
close();
|
||||
}
|
||||
|
||||
void Customize_TDEStringMatcher_Dialog::exitCancel()
|
||||
{
|
||||
dialogResult = CriteriaUnchanged;
|
||||
close();
|
||||
}
|
||||
|
||||
//=== Object property accessors ===//
|
||||
|
||||
int Customize_TDEStringMatcher_Dialog::result()
|
||||
{
|
||||
return dialogResult;
|
||||
}
|
||||
|
||||
bool Customize_TDEStringMatcher_Dialog::isPatternRegex()
|
||||
{
|
||||
return patternIsRegex;
|
||||
}
|
||||
|
||||
bool Customize_TDEStringMatcher_Dialog::isPatternCaseInsensitive()
|
||||
{
|
||||
return patternIsCaseInsensitive;
|
||||
}
|
||||
|
||||
TQStringList Customize_TDEStringMatcher_Dialog::getPatternList()
|
||||
{
|
||||
return patternList;
|
||||
}
|
||||
|
||||
#include "tdestringmatcher-dialog.moc"
|
@ -0,0 +1,74 @@
|
||||
#ifndef HIDDEN_FILE_DIALOG_H
|
||||
#define HIDDEN_FILE_DIALOG_H
|
||||
|
||||
#include <tqapplication.h>
|
||||
#include <tqdialog.h>
|
||||
#include <tqlayout.h>
|
||||
#include <tqvbox.h>
|
||||
#include <tqbuttongroup.h>
|
||||
#include <tqlabel.h>
|
||||
#include <tqlineedit.h>
|
||||
#include <tqcheckbox.h>
|
||||
#include <tqradiobutton.h>
|
||||
#include <tqpushbutton.h>
|
||||
#include <tqtooltip.h>
|
||||
|
||||
#include "tdeglobal.h"
|
||||
|
||||
class TDECORE_EXPORT Customize_TDEStringMatcher_Dialog : public TQDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
Customize_TDEStringMatcher_Dialog (
|
||||
TQStringList initPatternList,
|
||||
bool initPatternIsRegex,
|
||||
bool initPatternIsCaseInsensitive,
|
||||
TQString dialogTitle = TQString("Define String Matching Criteria")
|
||||
);
|
||||
|
||||
int result();
|
||||
|
||||
TQStringList getPatternList();
|
||||
bool isPatternRegex();
|
||||
bool isPatternCaseInsensitive();
|
||||
|
||||
protected:
|
||||
|
||||
bool event( TQEvent * e );
|
||||
|
||||
private slots:
|
||||
|
||||
void setExitDisposition(int buttonNum );
|
||||
void exitOK();
|
||||
void exitCancel();
|
||||
|
||||
private:
|
||||
|
||||
TQLabel *patterns_label;
|
||||
#define MAX_PATTERNS 10
|
||||
TQLineEdit *le_Patterns[MAX_PATTERNS] ;
|
||||
|
||||
TQButtonGroup *bg_Options;
|
||||
TQCheckBox *cb_patternIsRegex;
|
||||
TQCheckBox *cb_patternIsCaseInsensitive;
|
||||
|
||||
TQButtonGroup *bg_Disposition;
|
||||
TQRadioButton *rb_Disposition;
|
||||
|
||||
TQPushButton *pb_OK;
|
||||
TQPushButton *pb_Apply;
|
||||
TQPushButton *pb_Reload;
|
||||
TQPushButton *pb_Cancel;
|
||||
|
||||
unsigned short maxPatterns ;
|
||||
TQStringList patternList;
|
||||
bool patternIsRegex;
|
||||
bool patternIsCaseInsensitive;
|
||||
|
||||
int dialogResult;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
@ -0,0 +1,128 @@
|
||||
#include "tdestringmatcher.h"
|
||||
#include "tdestringmatcher-dialog.h"
|
||||
|
||||
#include <tqregexp.h>
|
||||
#include "tdeconfig.h"
|
||||
#include "kdebug.h"
|
||||
|
||||
TDEStringMatcher::TDEStringMatcher()
|
||||
{
|
||||
patternsDivider = patternsDividerDefault;
|
||||
setCriteria( criteriaMatchNothing );
|
||||
}
|
||||
|
||||
TDEStringMatcher::~TDEStringMatcher()
|
||||
{
|
||||
}
|
||||
|
||||
bool TDEStringMatcher::match( const TQString& filename )
|
||||
{
|
||||
TQRegExp rxMatcher;
|
||||
if ( filename.isEmpty() )
|
||||
return FALSE;
|
||||
rxMatcher.setWildcard( ! isRegex );
|
||||
rxMatcher.setCaseSensitive( ! isCaseInsensitive );
|
||||
for ( TQStringList::iterator it = patternList.begin(); it != patternList.end() ; ++it )
|
||||
{
|
||||
rxMatcher.setPattern( *it );
|
||||
if ( rxMatcher.exactMatch( filename ) ) {
|
||||
return( TRUE ) ;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
TQString TDEStringMatcher::getCriteria()
|
||||
{
|
||||
return Criteria;
|
||||
}
|
||||
|
||||
void TDEStringMatcher::generateCriteria()
|
||||
{
|
||||
TQString newCriteria = patternList.join( TQString ( patternsDivider ) ) ;
|
||||
TQChar leadingChar;
|
||||
if ( isRegex )
|
||||
leadingChar = 'r';
|
||||
else
|
||||
leadingChar = 'w' ;
|
||||
if ( isCaseInsensitive )
|
||||
leadingChar = leadingChar.upper();
|
||||
newCriteria.prepend( leadingChar );
|
||||
Criteria = newCriteria;
|
||||
}
|
||||
|
||||
bool TDEStringMatcher::setCriteria( TQString newCriteria )
|
||||
{
|
||||
if ( newCriteria.length() == 0 ) {
|
||||
return TRUE; // We always succeed when asked to do nothing!
|
||||
}
|
||||
|
||||
TQChar optionsChar = newCriteria[0];
|
||||
switch( optionsChar ) {
|
||||
case 'w': isRegex = FALSE; isCaseInsensitive = FALSE; break;
|
||||
case 'W': isRegex = FALSE; isCaseInsensitive = TRUE; break;
|
||||
case 'r': isRegex = TRUE; isCaseInsensitive = FALSE; break;
|
||||
case 'R': isRegex = TRUE; isCaseInsensitive = TRUE; break;
|
||||
default :
|
||||
kdWarning(7077)
|
||||
<< "TDEStringMatcher::setCriteria: invalid leading character in criteria string: '"
|
||||
<< newCriteria << "'" << endl;
|
||||
return FALSE;
|
||||
};
|
||||
|
||||
patternList.clear();
|
||||
patternList = TQStringList::split( patternsDivider, newCriteria.mid(1), TRUE );
|
||||
Criteria = newCriteria;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int TDEStringMatcher::getMatchPropertiesFromUser( TQString dialogTitle )
|
||||
{
|
||||
Customize_TDEStringMatcher_Dialog defineHiddenUI =
|
||||
Customize_TDEStringMatcher_Dialog( patternList, isRegex, isCaseInsensitive, dialogTitle );
|
||||
|
||||
defineHiddenUI.exec();
|
||||
if ( defineHiddenUI.result() > CriteriaUnchanged ) {
|
||||
patternList = defineHiddenUI.getPatternList();
|
||||
isRegex = defineHiddenUI.isPatternRegex();
|
||||
isCaseInsensitive = defineHiddenUI.isPatternCaseInsensitive();
|
||||
generateCriteria();
|
||||
kdDebug(7077)
|
||||
<< "TDEStringMatcher::getMatchPropertiesFromUser: updated criteria string: '"
|
||||
<< Criteria << "'" << endl;
|
||||
}
|
||||
return defineHiddenUI.result();
|
||||
}
|
||||
|
||||
void TDEStringMatcher::setPatternsDivider( TQChar newPatternsDivider )
|
||||
{
|
||||
patternsDivider = newPatternsDivider;
|
||||
}
|
||||
|
||||
|
||||
|
||||
TDEHiddenFileMatcher::TDEHiddenFileMatcher()
|
||||
{
|
||||
setPatternsDivider( patternsDivider4fileNames );
|
||||
setCriteria( getGlobalCriteria() );
|
||||
}
|
||||
|
||||
TDEHiddenFileMatcher::~TDEHiddenFileMatcher()
|
||||
{
|
||||
}
|
||||
|
||||
TQString TDEHiddenFileMatcher::getGlobalCriteria()
|
||||
{
|
||||
TDEConfig *config = TDEGlobal::config();
|
||||
TDEConfigGroupSaver saver( config, globalSettingsGroup );
|
||||
TQString defaultCriteria = config->readEntry( globalSettingsKey, criteriaMatchDotfiles );
|
||||
return defaultCriteria;
|
||||
}
|
||||
|
||||
void TDEHiddenFileMatcher::setGlobalCriteria()
|
||||
{
|
||||
TDEConfig *config = TDEGlobal::config();
|
||||
TDEConfigGroupSaver saver( config, globalSettingsGroup );
|
||||
config->writeEntry( globalSettingsKey, Criteria );
|
||||
}
|
||||
|
@ -0,0 +1,150 @@
|
||||
#ifndef TDESTRINGMATCHER_H
|
||||
#define TDESTRINGMATCHER_H
|
||||
|
||||
#include <tqstring.h>
|
||||
#include <tqstringlist.h>
|
||||
|
||||
#include "tdeglobal.h"
|
||||
|
||||
/************
|
||||
*
|
||||
* Generic string matcher class.
|
||||
*/
|
||||
class TDECORE_EXPORT TDEStringMatcher
|
||||
{
|
||||
public:
|
||||
|
||||
TDEStringMatcher();
|
||||
~TDEStringMatcher();
|
||||
|
||||
/**
|
||||
Perform string matching based on the match-controlling
|
||||
@properties described below.
|
||||
*/
|
||||
bool match( const TQString& );
|
||||
|
||||
/**
|
||||
@return value of @property Criteria described below.
|
||||
*/
|
||||
TQString getCriteria();
|
||||
|
||||
/**
|
||||
Process @param newCriteria to initialize / update the
|
||||
@property patternsDivider described below.
|
||||
*/
|
||||
bool setCriteria(TQString newCriteria);
|
||||
|
||||
/**
|
||||
Present dialog that allows user to view/update current match-
|
||||
controlling @properties described below. @return one of the
|
||||
values of @enum UpdateResult listed below. @param dialogTitle
|
||||
can be used to describe the application/ the software component that is using
|
||||
the TDEStringMatcher. Examples:
|
||||
"Hidden File Definition<b>for Konqueror Listview"
|
||||
"Global Default Hidden File Definition"
|
||||
*/
|
||||
int getMatchPropertiesFromUser( TQString dialogTitle = TQString("Define String Matching Criteria") );
|
||||
|
||||
enum class Status : int {
|
||||
reloadCriteria = -1, // Criteria was not changed, request reloading default
|
||||
criteriaUnchanged = 0, // Criteria was not changed
|
||||
criteriaApplied = 1, // New criteria applied, should not be saved
|
||||
saveCriteria = 2 // New criteria applied, request saving as default
|
||||
};
|
||||
#define ReloadCriteria -1
|
||||
#define CriteriaUnchanged 0
|
||||
#define CriteriaApplied 1
|
||||
#define SaveCriteria 2
|
||||
|
||||
/**
|
||||
Process @param newPatternsDivider to initialize / update
|
||||
the match-controlling @properties that are described below.
|
||||
*/
|
||||
void setPatternsDivider(TQChar newPatternsDivider);
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
Derive value of @property Criteria from the current values
|
||||
of the match-controlling @properties described below
|
||||
*/
|
||||
void generateCriteria();
|
||||
|
||||
/**
|
||||
Match-controlling properties:
|
||||
|
||||
@property patternList is a list of zero or more string patterns each
|
||||
of which will be used as a wildcard or regex to match a string. If
|
||||
the list is empty, then no strings will match.
|
||||
@property isCaseInsensitive determines whether or not matching
|
||||
will be done in "case insensitive" fashion.
|
||||
@property isRegex determines whether or not the matching will
|
||||
be regex-based (versus wildcard/globbing-based).
|
||||
|
||||
*/
|
||||
bool isCaseInsensitive = FALSE;
|
||||
bool isRegex = FALSE;
|
||||
TQStringList patternList; // FIXME: Use STL?
|
||||
|
||||
/**
|
||||
@property patternsDivider is a character used to separate multiple
|
||||
match patterns in @property Criteria described below. This should be
|
||||
a character that will not be used in a match pattern.
|
||||
*/
|
||||
TQChar patternsDivider;
|
||||
|
||||
/**
|
||||
@property Criteria is a string which encodes the match-controlling
|
||||
@properties described above. It has the format ^([wWrR])(.+). The
|
||||
leading character's case determines @property isCaseInsensitive and
|
||||
its value determines @property isRegex (rR: TRUE, wW: FALSE).
|
||||
Remainder of string is a @property patternsDivider separated list of
|
||||
match patterns that determines the content of @property patternList.
|
||||
|
||||
*/
|
||||
TQString Criteria;
|
||||
|
||||
private:
|
||||
|
||||
static constexpr const char patternsDividerDefault = ',';
|
||||
static constexpr const char * criteriaMatchNothing = "w";
|
||||
};
|
||||
|
||||
/************
|
||||
*
|
||||
* Hidden file matcher class.
|
||||
*/
|
||||
|
||||
class TDECORE_EXPORT TDEHiddenFileMatcher : public TDEStringMatcher {
|
||||
friend class TDEGlobal; // for initInstance()
|
||||
|
||||
public:
|
||||
|
||||
TDEHiddenFileMatcher();
|
||||
~TDEHiddenFileMatcher();
|
||||
|
||||
private:
|
||||
|
||||
TQString getGlobalCriteria();
|
||||
void setGlobalCriteria();
|
||||
|
||||
/**
|
||||
@property patternsDivider4fileNames specifies a reasonable
|
||||
default for separating multiple file name match patterns.
|
||||
*/
|
||||
static constexpr const char patternsDivider4fileNames = '/';
|
||||
|
||||
/**
|
||||
@property criteriaMatchDotfiles encodes the traditional
|
||||
unix-style hidden file matching of so-called dotfiles.
|
||||
It is default value of @property Criteria unless overridden.
|
||||
*/
|
||||
static constexpr const char * criteriaMatchDotfiles = "w.*";
|
||||
|
||||
// Default Criteria setting location in kdeglobals
|
||||
static constexpr const char * globalSettingsGroup = "General";
|
||||
static constexpr const char * globalSettingsKey = "globalHiddenFileSpec";
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue