kspread

kspread_genvalidationstyle.cc

00001 /* This file is part of the KDE project
00002 
00003    Copyright 2004 Laurent Montel <montel@kde.org>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include "kspread_genvalidationstyle.h"
00022 #include "kspread_cell.h"
00023 #include <KoXmlWriter.h>
00024 
00025 using namespace KSpread;
00026 
00027 GenValidationStyles::GenValidationStyles()
00028 {
00029 
00030 }
00031 
00032 GenValidationStyles::~GenValidationStyles()
00033 {
00034 
00035 }
00036 
00037 QString GenValidationStyles::lookup( const GenValidationStyle& style )
00038 {
00039     StyleMap::iterator it = m_styles.find( style );
00040     if ( it == m_styles.end() ) {
00041 
00042         QString styleName( "val" );
00043         styleName = makeUniqueName( styleName );
00044         m_names.insert( styleName, true );
00045         it = m_styles.insert( style, styleName );
00046     }
00047     return it.data();
00048 }
00049 
00050 QString GenValidationStyles::makeUniqueName( const QString& base ) const
00051 {
00052     int num = 1;
00053     QString name;
00054     do {
00055         name = base;
00056         name += QString::number( num++ );
00057     } while ( m_names.find( name ) != m_names.end() );
00058     return name;
00059 }
00060 
00061 void GenValidationStyles::writeStyle( KoXmlWriter& writer )
00062 {
00063     if ( m_styles.count()>0 )
00064     {
00065         writer.startElement( "table:content-validations" );
00066         StyleMap::Iterator it;
00067         for ( it = m_styles.begin(); it != m_styles.end(); ++it )
00068         {
00069             writer.startElement( "table:content-validation" );
00070             writer.addAttribute( "table:name", it.data() );
00071             writer.addAttribute( "table:allow-empty-cell", it.key().allowEmptyCell );
00072             writer.addAttribute( "table:condition", it.key().condition );
00073 
00074             writer.startElement( "table:help-message" );
00075             writer.addAttribute( "table:title", it.key().title );
00076             writer.addAttribute( "table:display", it.key().displayValidationInformation );
00077 
00078             QStringList text = QStringList::split( "\n", it.key().messageInfo );
00079             for ( QStringList::Iterator it2 = text.begin(); it2 != text.end(); ++it2 ) {
00080                 writer.startElement( "text:p" );
00081                 writer.addTextNode( *it2 );
00082                 writer.endElement();
00083             }
00084             writer.endElement();
00085 
00086             writer.startElement( "table:error-message" );
00087             writer.addAttribute( "table:message-type", it.key().messageType );
00088 
00089             writer.addAttribute("table:title", it.key().titleInfo);
00090             writer.addAttribute("table:display", it.key().displayMessage);
00091             text = QStringList::split( "\n", it.key().message );
00092             for ( QStringList::Iterator it3 = text.begin(); it3 != text.end(); ++it3 ) {
00093                 writer.startElement( "text:p" );
00094                 writer.addTextNode( *it3 );
00095                 writer.endElement();
00096             }
00097             writer.endElement();
00098 
00099             writer.endElement();
00100         }
00101         writer.endElement();//close sheet:content-validation
00102     }
00103 }
00104 
00105 void GenValidationStyle::initVal( Validity *_val )
00106 {
00107     if ( _val )
00108     {
00109         allowEmptyCell = ( _val->allowEmptyCell ? "true" : "false" );
00110         condition = createValidationCondition( _val );
00111         title = _val->title;
00112         displayValidationInformation = ( _val->displayValidationInformation ? "true" : "false" );
00113         messageInfo = _val->messageInfo;
00114 
00115         switch( _val->m_action )
00116         {
00117           case Action::Warning:
00118             messageType = "warning";
00119             break;
00120           case Action::Information:
00121             messageType = "information";
00122             break;
00123           case Action::Stop:
00124             messageType = "stop";
00125             break;
00126         }
00127 
00128         titleInfo = _val->titleInfo;
00129         displayMessage = ( _val->displayMessage ? "true" : "false" );
00130         message = _val->message;
00131     }
00132 }
00133 
00134 QString GenValidationStyle::createValidationCondition( Validity* _val )
00135 {
00136     QString result;
00137     switch( _val->m_restriction )
00138     {
00139     case Restriction::None:
00140         //nothing
00141         break;
00142     case Restriction::Text:
00143         //doesn't exist into oo spec
00144         result = "cell-content-is-text()";
00145         break;
00146     case Restriction::Time:
00147         result = createTimeValidationCondition( _val );
00148         break;
00149     case Restriction::Date:
00150         result = createDateValidationCondition( _val );
00151         break;
00152     case Restriction::Integer:
00153     case Restriction::Number:
00154         result = createNumberValidationCondition( _val );
00155         break;
00156     case Restriction::TextLength:
00157         result = createTextValidationCondition( _val );
00158          break;
00159     case Restriction::List:
00160         result = createListValidationCondition( _val );
00161         break;
00162     }
00163     return result;
00164 }
00165 
00166 QString GenValidationStyle::createListValidationCondition( Validity* _val )
00167 {
00168     QString result = "oooc:cell-content-is-in-list(";
00169     result = _val->listValidity.join( ";" );
00170     result +=")";
00171     return result;
00172 }
00173 
00174 QString GenValidationStyle::createNumberValidationCondition( Validity* _val )
00175 {
00176     QString result;
00177     if ( _val->m_restriction == Restriction::Number )
00178         result = "oooc:cell-content-is-whole-number() and ";
00179     else if ( _val->m_restriction == Restriction::Integer )
00180         result = "oooc:cell-content-is-decimal-number() and ";
00181     switch( _val->m_cond )
00182     {
00183       case Conditional::None:
00184         //nothing
00185         break;
00186       case Conditional::Equal:
00187         result+="cell-content()";
00188         result+="=";
00189         result+=QString::number( _val->valMin );
00190         break;
00191       case Conditional::Superior:
00192         result+="cell-content()";
00193         result+=">";
00194         result+=QString::number( _val->valMin );
00195         break;
00196       case Conditional::Inferior:
00197         result+="cell-content()";
00198         result+="<";
00199         result+=QString::number( _val->valMin );
00200         break;
00201       case Conditional::SuperiorEqual:
00202         result+="cell-content()";
00203         result+=">=";
00204         result+=QString::number( _val->valMin );
00205         break;
00206       case Conditional::InferiorEqual:
00207         result+="cell-content()";
00208         result+="<=";
00209         result+=QString::number( _val->valMin );
00210         break;
00211       case Conditional::Different:
00212         result+="cell-content()";
00213         result+="!=";
00214         result+=QString::number( _val->valMin );
00215         break;
00216       case Conditional::Between:
00217         result+="cell-content-is-between(";
00218         result+=QString::number( _val->valMin );
00219         result+=",";
00220         result+=QString::number( _val->valMax );
00221         result+=")";
00222         break;
00223       case Conditional::DifferentTo:
00224         result+="cell-content-is-not-between(";
00225         result+=QString::number( _val->valMin );
00226         result+=",";
00227         result+=QString::number( _val->valMax );
00228         result+=")";
00229         break;
00230     }
00231     return result;
00232 }
00233 
00234 
00235 QString GenValidationStyle::createTimeValidationCondition( Validity* _val )
00236 {
00237     QString result( "oooc:cell-content-is-time() and " );
00238     switch( _val->m_cond )
00239     {
00240       case Conditional::None:
00241         //nothing
00242         break;
00243       case Conditional::Equal:
00244         result+="cell-content()";
00245         result+="=";
00246         result+=_val->timeMin.toString( );
00247         break;
00248       case Conditional::Superior:
00249         result+="cell-content()";
00250         result+=">";
00251         result+=_val->timeMin.toString( );
00252         break;
00253       case Conditional::Inferior:
00254         result+="cell-content()";
00255         result+="<";
00256         result+=_val->timeMin.toString( );
00257         break;
00258       case Conditional::SuperiorEqual:
00259         result+="cell-content()";
00260         result+=">=";
00261         result+=_val->timeMin.toString( );
00262         break;
00263       case Conditional::InferiorEqual:
00264         result+="cell-content()";
00265         result+="<=";
00266         result+=_val->timeMin.toString( );
00267         break;
00268       case Conditional::Different:
00269         result+="cell-content()";
00270         result+="!=";
00271         result+=_val->timeMin.toString( );
00272         break;
00273       case Conditional::Between:
00274         result+="cell-content-is-between(";
00275         result+=_val->timeMin.toString( );
00276         result+=",";
00277         result+=_val->timeMax.toString( );
00278         result+=")";
00279         break;
00280       case Conditional::DifferentTo:
00281         result+="cell-content-is-not-between(";
00282         result+=_val->timeMin.toString( );
00283         result+=",";
00284         result+=_val->timeMax.toString( );
00285         result+=")";
00286         break;
00287     }
00288     return result;
00289 }
00290 
00291 QString GenValidationStyle::createDateValidationCondition( Validity* _val )
00292 {
00293     QString result( "oooc:cell-content-is-date() and " );
00294     switch( _val->m_cond )
00295     {
00296       case Conditional::None:
00297         //nothing
00298         break;
00299       case Conditional::Equal:
00300         result+="cell-content()";
00301         result+="=";
00302         result+=_val->dateMin.toString();
00303         break;
00304       case Conditional::Superior:
00305         result+="cell-content()";
00306         result+=">";
00307         result+=_val->dateMin.toString();
00308         break;
00309       case Conditional::Inferior:
00310         result+="cell-content()";
00311         result+="<";
00312         result+=_val->dateMin.toString();
00313         break;
00314       case Conditional::SuperiorEqual:
00315         result+="cell-content()";
00316         result+=">=";
00317         result+=_val->dateMin.toString();
00318         break;
00319       case Conditional::InferiorEqual:
00320         result+="cell-content()";
00321         result+="<=";
00322         result+=_val->dateMin.toString();
00323         break;
00324       case Conditional::Different:
00325         result+="cell-content()";
00326         result+="!=";
00327         result+=_val->dateMin.toString();
00328         break;
00329       case Conditional::Between:
00330         result+="cell-content-is-between(";
00331         result+=_val->dateMin.toString();
00332         result+=",";
00333         result+=_val->dateMax.toString();
00334         result+=")";
00335         break;
00336       case Conditional::DifferentTo:
00337         result+="cell-content-is-not-between(";
00338         result+=_val->dateMin.toString();
00339         result+=",";
00340         result+=_val->dateMax.toString();
00341         result+=")";
00342         break;
00343     }
00344     return result;
00345 }
00346 
00347 QString GenValidationStyle::createTextValidationCondition( Validity* _val )
00348 {
00349     QString result;
00350     switch( _val->m_cond )
00351     {
00352       case Conditional::None:
00353         //nothing
00354         break;
00355       case Conditional::Equal:
00356         result+="oooc:cell-content-text-length()";
00357         result+="=";
00358         result+=QString::number( _val->valMin );
00359         break;
00360       case Conditional::Superior:
00361         result+="oooc:cell-content-text-length()";
00362         result+=">";
00363         result+=QString::number( _val->valMin );
00364         break;
00365       case Conditional::Inferior:
00366         result+="oooc:cell-content-text-length()";
00367         result+="<";
00368         result+=QString::number( _val->valMin );
00369         break;
00370       case Conditional::SuperiorEqual:
00371         result+="oooc:cell-content-text-length()";
00372         result+=">=";
00373         result+=QString::number( _val->valMin );
00374         break;
00375       case Conditional::InferiorEqual:
00376         result+="oooc:cell-content-text-length()";
00377         result+="<=";
00378         result+=QString::number( _val->valMin );
00379         break;
00380       case Conditional::Different:
00381         result+="oooc:cell-content-text-length()";
00382         result+="!=";
00383         result+=QString::number( _val->valMin );
00384         break;
00385       case Conditional::Between:
00386         result+="oooc:cell-content-text-length-is-between(";
00387         result+=QString::number( _val->valMin );
00388         result+=",";
00389         result+=QString::number( _val->valMax );
00390         result+=")";
00391         break;
00392       case Conditional::DifferentTo:
00393         result+="oooc:cell-content-text-length-is-not-between(";
00394         result+=QString::number( _val->valMin );
00395         result+=",";
00396         result+=QString::number( _val->valMax );
00397         result+=")";
00398         break;
00399     }
00400     return result;
00401 }
KDE Home | KDE Accessibility Home | Description of Access Keys