00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "kovariable.h"
00021
#include "kovariable.moc"
00022
#include <koDocumentInfo.h>
00023
#include <kozoomhandler.h>
00024
#include <klocale.h>
00025
#include <kdebug.h>
00026
#include <kglobal.h>
00027
#include <qdom.h>
00028
#include <koDocument.h>
00029
#include <kdialogbase.h>
00030
#include <kconfig.h>
00031
#include <kinstance.h>
00032
#include <kaboutdata.h>
00033
#include <qstringlist.h>
00034
#include <qcombobox.h>
00035
#include <qvaluelist.h>
00036
#include <qradiobutton.h>
00037
#include "timeformatwidget_impl.h"
00038
#include "dateformatwidget_impl.h"
00039
#include "kocommand.h"
00040
#include "kotextobject.h"
00041
00042
class KoVariableSettings::KoVariableSettingPrivate
00043 {
00044
public:
00045 KoVariableSettingPrivate()
00046 {
00047 m_lastPrintingDate.setTime_t(0);
00048 }
00049
QDateTime m_lastPrintingDate;
00050
QDateTime m_creationDate;
00051
QDateTime m_modificationDate;
00052 };
00053
00054
00055 KoVariableSettings::KoVariableSettings()
00056 {
00057 d =
new KoVariableSettingPrivate;
00058 m_startingPageNumber = 1;
00059 m_displayLink =
true;
00060 m_displayComment =
true;
00061 m_underlineLink =
true;
00062 m_displayFieldCode =
false;
00063 }
00064
00065 KoVariableSettings::~KoVariableSettings()
00066 {
00067
delete d;
00068 d = 0;
00069 }
00070
00071
QDateTime KoVariableSettings::lastPrintingDate()
const
00072
{
00073
return d->m_lastPrintingDate;
00074 }
00075
00076
void KoVariableSettings::setLastPrintingDate(
const QDateTime & _date)
00077 {
00078 d->m_lastPrintingDate = _date;
00079 }
00080
00081
QDateTime KoVariableSettings::creationDate()
const
00082
{
00083
return d->m_creationDate;
00084 }
00085
00086
void KoVariableSettings::setCreationDate(
const QDateTime & _date)
00087 {
00088
if ( !d->m_creationDate.isValid() )
00089 d->m_creationDate = _date;
00090 }
00091
00092
QDateTime KoVariableSettings::modificationDate()
const
00093
{
00094
return d->m_modificationDate;
00095 }
00096
00097
void KoVariableSettings::setModificationDate(
const QDateTime & _date)
00098 {
00099 d->m_modificationDate = _date;
00100 }
00101
00102
00103
void KoVariableSettings::save(
QDomElement &parentElem )
00104 {
00105
QDomElement elem = parentElem.ownerDocument().createElement(
"VARIABLESETTINGS" );
00106 parentElem.appendChild( elem );
00107
if(m_startingPageNumber!=1)
00108 {
00109 elem.setAttribute(
"startingPageNumber", m_startingPageNumber );
00110 }
00111 elem.setAttribute(
"displaylink",(
int)m_displayLink);
00112 elem.setAttribute(
"underlinelink",(
int)m_underlineLink);
00113 elem.setAttribute(
"displaycomment",(
int)m_displayComment);
00114 elem.setAttribute(
"displayfieldcode", (
int)m_displayFieldCode);
00115
00116
if ( d->m_lastPrintingDate.isValid())
00117 elem.setAttribute(
"lastPrintingDate", d->m_lastPrintingDate.toString(Qt::ISODate));
00118
00119
if ( d->m_creationDate.isValid())
00120 elem.setAttribute(
"creationDate", d->m_creationDate.toString(Qt::ISODate));
00121
00122
if ( d->m_modificationDate.isValid())
00123 elem.setAttribute(
"modificationDate", d->m_modificationDate.toString(Qt::ISODate));
00124 }
00125
00126
void KoVariableSettings::load(
QDomElement &elem )
00127 {
00128
QDomElement e = elem.namedItem(
"VARIABLESETTINGS" ).toElement();
00129
if (!e.isNull())
00130 {
00131
if(e.hasAttribute(
"startingPageNumber"))
00132 m_startingPageNumber = e.attribute(
"startingPageNumber").toInt();
00133
if(e.hasAttribute(
"displaylink"))
00134 m_displayLink=(
bool)e.attribute(
"displaylink").toInt();
00135
if(e.hasAttribute(
"underlinelink"))
00136 m_underlineLink=(
bool)e.attribute(
"underlinelink").toInt();
00137
if(e.hasAttribute(
"displaycomment"))
00138 m_displayComment=(
bool)e.attribute(
"displaycomment").toInt();
00139
if (e.hasAttribute(
"displayfieldcode"))
00140 m_displayFieldCode=(
bool)e.attribute(
"displayfieldcode").toInt();
00141
00142
if (e.hasAttribute(
"lastPrintingDate"))
00143 d->m_lastPrintingDate = QDateTime::fromString( e.attribute(
"lastPrintingDate" ), Qt::ISODate );
00144
else
00145 d->m_lastPrintingDate.setTime_t(0);
00146
00147
if (e.hasAttribute(
"creationDate"))
00148 d->m_creationDate = QDateTime::fromString( e.attribute(
"creationDate" ), Qt::ISODate );
00149
00150
if (e.hasAttribute(
"modificationDate"))
00151 d->m_modificationDate = QDateTime::fromString( e.attribute(
"modificationDate" ), Qt::ISODate );
00152 }
00153 }
00154
00155 KoVariableDateFormat::KoVariableDateFormat() :
KoVariableFormat()
00156 {
00157 }
00158
00159 QString KoVariableDateFormat::convert(
const QVariant& data )
const
00160
{
00161
if ( data.type() != QVariant::Date && data.type() != QVariant::DateTime )
00162 {
00163 kdWarning(32500)<<
" Error in KoVariableDateFormat::convert. Value is a "
00164 << data.typeName() <<
"(" << data.type() <<
")" << endl;
00165
00166 }
00167
QDateTime dateTime ( data.toDateTime() );
00168
if ( !dateTime.isValid() )
00169
return i18n(
"No date set");
00170
00171
if (m_strFormat.lower() ==
"locale" || m_strFormat.isEmpty())
00172
return KGlobal::locale()->formatDate( dateTime.date(),
false );
00173
else if ( m_strFormat.lower() ==
"localeshort" )
00174
return KGlobal::locale()->formatDate( dateTime.date(),
true );
00175
else if ( m_strFormat.lower() ==
"localedatetime" )
00176
return KGlobal::locale()->formatDateTime( dateTime,
false );
00177
else if ( m_strFormat.lower() ==
"localedatetimeshort" )
00178
return KGlobal::locale()->formatDateTime( dateTime,
true );
00179
00180
QString tmp ( dateTime.toString(m_strFormat) );
00181
const int month = dateTime.date().month();
00182 tmp.replace(
"PPPP", KGlobal::locale()->monthNamePossessive(month,
false));
00183 tmp.replace(
"PPP", KGlobal::locale()->monthNamePossessive(month,
true));
00184
return tmp;
00185 }
00186
00187 QCString KoVariableDateFormat::key()
const
00188
{
00189
return getKey( m_strFormat );
00190 }
00191
00192 QCString KoVariableDateFormat::getKey(
const QString& props )
const
00193
{
00194
return QCString(
"DATE") + props.utf8();
00195 }
00196
00197 void KoVariableDateFormat::load(
const QCString &key )
00198 {
00199
QCString params( key.mid( 4 ) );
00200
if ( !params.isEmpty() )
00201 {
00202
if (params[0] ==
'1' || params[0] ==
'0')
00203 params = params.mid(1);
00204 m_strFormat = QString::fromUtf8( params );
00205 }
00206 }
00207
00208
00209
00210
QStringList KoVariableDateFormat::staticFormatPropsList()
00211 {
00212
QStringList listDateFormat;
00213 listDateFormat<<
"locale";
00214 listDateFormat<<
"localeshort";
00215 listDateFormat<<
"localedatetime";
00216 listDateFormat<<
"localedatetimeshort";
00217 listDateFormat<<
"dd/MM/yy";
00218 listDateFormat<<
"dd/MM/yyyy";
00219 listDateFormat<<
"MMM dd,yy";
00220 listDateFormat<<
"MMM dd,yyyy";
00221 listDateFormat<<
"dd.MMM.yyyy";
00222 listDateFormat<<
"MMMM dd, yyyy";
00223 listDateFormat<<
"ddd, MMM dd,yy";
00224 listDateFormat<<
"dddd, MMM dd,yy";
00225 listDateFormat<<
"MM-dd";
00226 listDateFormat<<
"yyyy-MM-dd";
00227 listDateFormat<<
"dd/yy";
00228 listDateFormat<<
"MMMM";
00229 listDateFormat<<
"yyyy-MM-dd hh:mm";
00230 listDateFormat<<
"dd.MMM.yyyy hh:mm";
00231 listDateFormat<<
"MMM dd,yyyy h:mm AP";
00232 listDateFormat<<
"yyyy-MM-ddThh:mm:ss";
00233
return listDateFormat;
00234 }
00235
00236
00237
00238
QStringList KoVariableDateFormat::staticTranslatedFormatPropsList()
00239 {
00240
QStringList listDateFormat;
00241 listDateFormat<<i18n(
"Locale date format");
00242 listDateFormat<<i18n(
"Short locale date format");
00243 listDateFormat<<i18n(
"Locale date & time format");
00244 listDateFormat<<i18n(
"Short locale date & time format");
00245 listDateFormat<<
"dd/MM/yy";
00246 listDateFormat<<
"dd/MM/yyyy";
00247 listDateFormat<<
"MMM dd,yy";
00248 listDateFormat<<
"MMM dd,yyyy";
00249 listDateFormat<<
"dd.MMM.yyyy";
00250 listDateFormat<<
"MMMM dd, yyyy";
00251 listDateFormat<<
"ddd, MMM dd,yy";
00252 listDateFormat<<
"dddd, MMM dd,yy";
00253 listDateFormat<<
"MM-dd";
00254 listDateFormat<<
"yyyy-MM-dd";
00255 listDateFormat<<
"dd/yy";
00256 listDateFormat<<
"MMMM";
00257 listDateFormat<<
"yyyy-MM-dd hh:mm";
00258 listDateFormat<<
"dd.MMM.yyyy hh:mm";
00259 listDateFormat<<
"MMM dd,yyyy h:mm AP";
00260 listDateFormat<<
"yyyy-MM-ddThh:mm:ss";
00261
return listDateFormat;
00262 }
00263
00265
00266 KoVariableTimeFormat::KoVariableTimeFormat() :
KoVariableFormat()
00267 {
00268 }
00269
00270 void KoVariableTimeFormat::load(
const QCString &key )
00271 {
00272
QCString params( key.mid( 4 ) );
00273
if ( !params.isEmpty() )
00274 m_strFormat = QString::fromUtf8(params);
00275 }
00276
00277 QString KoVariableTimeFormat::convert(
const QVariant & time )
const
00278
{
00279
if ( time.type() != QVariant::Time )
00280 {
00281 kdDebug(32500)<<
" Error in KoVariableTimeFormat::convert. Value is a "
00282 << time.typeName() <<
"(" << time.type() <<
")" << endl;
00283
return QString::null;
00284 }
00285
00286
if( m_strFormat.lower() ==
"locale" || m_strFormat.isEmpty() )
00287
return KGlobal::locale()->formatTime( time.toTime() );
00288
return time.toTime().toString(m_strFormat);
00289 }
00290
00291 QCString KoVariableTimeFormat::key()
const
00292
{
00293
return getKey( m_strFormat );
00294 }
00295
00296 QCString KoVariableTimeFormat::getKey(
const QString& props )
const
00297
{
00298
return QCString(
"TIME") + props.utf8();
00299 }
00300
00301
00302
00303
QStringList KoVariableTimeFormat::staticFormatPropsList()
00304 {
00305
QStringList listTimeFormat;
00306 listTimeFormat<<
"locale";
00307 listTimeFormat<<
"hh:mm";
00308 listTimeFormat<<
"hh:mm:ss";
00309 listTimeFormat<<
"hh:mm AP";
00310 listTimeFormat<<
"hh:mm:ss AP";
00311 listTimeFormat<<
"mm:ss.zzz";
00312
return listTimeFormat;
00313 }
00314
00315
00316
QStringList KoVariableTimeFormat::staticTranslatedFormatPropsList()
00317 {
00318
QStringList listTimeFormat;
00319 listTimeFormat<<i18n(
"Locale format");
00320 listTimeFormat<<
"hh:mm";
00321 listTimeFormat<<
"hh:mm:ss";
00322 listTimeFormat<<
"hh:mm AP";
00323 listTimeFormat<<
"hh:mm:ss AP";
00324 listTimeFormat<<
"mm:ss.zzz";
00325
return listTimeFormat;
00326 }
00327
00329
00330 QString KoVariableStringFormat::convert(
const QVariant & string )
const
00331
{
00332
if ( string.type() != QVariant::String )
00333 {
00334 kdDebug(32500)<<
" Error in KoVariableStringFormat::convert. Value is a " << string.typeName() << endl;
00335
return QString::null;
00336 }
00337
00338
return string.toString();
00339 }
00340
00341 QCString KoVariableStringFormat::key()
const
00342
{
00343
return getKey( QString::null );
00344
00345 }
00346
00347 QCString KoVariableStringFormat::getKey(
const QString& props )
const
00348
{
00349
return QCString(
"STRING") + props.utf8();
00350 }
00351
00353
00354
QString KoVariableNumberFormat::convert(
const QVariant &value )
const
00355
{
00356
if ( value.type() != QVariant::Int )
00357 {
00358 kdDebug(32500)<<
" Error in KoVariableNumberFormat::convert. Value is a " << value.typeName() << endl;
00359
return QString::null;
00360 }
00361
00362
return QString::number( value.toInt() );
00363 }
00364
00365
QCString KoVariableNumberFormat::key()
const
00366
{
00367
return getKey(QString::null);
00368 }
00369
00370
QCString KoVariableNumberFormat::getKey(
const QString& props )
const
00371
{
00372
return QCString(
"NUMB") + props.utf8();
00373 }
00374
00376
00377 KoVariableFormatCollection::KoVariableFormatCollection()
00378 {
00379 m_dict.setAutoDelete(
true );
00380 }
00381
00382 KoVariableFormat *
KoVariableFormatCollection::format(
const QCString &key )
00383 {
00384
KoVariableFormat *f = m_dict[ key.data() ];
00385
if (f)
00386
return f;
00387
else
00388
return createFormat( key );
00389 }
00390
00391
KoVariableFormat * KoVariableFormatCollection::createFormat(
const QCString &key )
00392 {
00393 kdDebug(32500) <<
"KoVariableFormatCollection: creating format for key=" << key << endl;
00394
KoVariableFormat * format = 0L;
00395
00396
QCString type = key.left(4);
00397
if ( type ==
"DATE" )
00398 format =
new KoVariableDateFormat();
00399
else if ( type ==
"TIME" )
00400 format =
new KoVariableTimeFormat();
00401
else if ( type ==
"NUMB" )
00402 format =
new KoVariableNumberFormat();
00403
else if ( type ==
"STRI" )
00404 format =
new KoVariableStringFormat();
00405
00406
if ( format )
00407 {
00408 format->load( key );
00409 m_dict.insert( format->
key() , format );
00410 }
00411
return format;
00412 }
00413
00414
00415
00416
00417 KoVariableCollection::KoVariableCollection(KoVariableSettings *_settings,
KoVariableFormatCollection *formatCollection)
00418 {
00419 m_variableSettings = _settings;
00420 m_varSelected = 0L;
00421 m_formatCollection = formatCollection;
00422 }
00423
00424 KoVariableCollection::~KoVariableCollection()
00425 {
00426
delete m_variableSettings;
00427 }
00428
00429
void KoVariableCollection::registerVariable(
KoVariable *var )
00430 {
00431
if ( !var )
00432
return;
00433 variables.append( var );
00434 }
00435
00436
void KoVariableCollection::unregisterVariable(
KoVariable *var )
00437 {
00438 variables.take( variables.findRef( var ) );
00439 }
00440
00441
void KoVariableCollection::recalcVariables(
int type)
00442 {
00443
bool update =
false;
00444
QPtrListIterator<KoVariable> it( variables );
00445
for ( ; it.current() ; ++it )
00446 {
00447
if ( it.current()->isDeleted() )
00448
continue;
00449
if ( it.current()->type() == type || type == VT_ALL )
00450 {
00451 update =
true;
00452 it.current()->recalc();
00453 KoTextParag * parag = it.current()->paragraph();
00454
if ( parag )
00455 {
00456
00457 parag->invalidate( 0 );
00458 parag->setChanged(
true );
00459 }
00460 }
00461 }
00462
00463
00464
if(update)
00465 emit repaintVariable();
00466 }
00467
00468
00469
void KoVariableCollection::setVariableValue(
const QString &name,
const QString &value )
00470 {
00471 varValues[ name ] = value;
00472 }
00473
00474
QString KoVariableCollection::getVariableValue(
const QString &name )
const
00475
{
00476
if ( !varValues.contains( name ) )
00477
return i18n(
"No value" );
00478
return varValues[ name ];
00479 }
00480
00481
bool KoVariableCollection::customVariableExist(
const QString &varname)
const
00482
{
00483
return varValues.contains( varname );
00484 }
00485
00486
void KoVariableCollection::recalcVariables(
KoVariable *var)
00487 {
00488
if( var )
00489 {
00490 var->recalc();
00491 KoTextParag * parag = var->paragraph();
00492
if ( parag )
00493 {
00494 parag->invalidate( 0 );
00495 parag->setChanged(
true );
00496 }
00497 emit repaintVariable();
00498 }
00499 }
00500
00501
void KoVariableCollection::setVariableSelected(
KoVariable * var)
00502 {
00503 m_varSelected=var;
00504 }
00505
00506
QPtrList<KAction> KoVariableCollection::popupActionList()
00507 {
00508
QPtrList<KAction> listAction;
00509
00510
QStringList list = m_varSelected->
subTypeText();
00511 QStringList::ConstIterator it = list.begin();
00512
for (
int i = 0; it != list.end() ; ++it, ++i )
00513 {
00514
if ( !(*it).isEmpty() )
00515 {
00516
00517
QCString name; name.setNum(i);
00518 KToggleAction * act =
new KToggleAction( *it, KShortcut(), 0, name );
00519 connect( act, SIGNAL(activated()),
this, SLOT(slotChangeSubType()) );
00520
if ( i == m_varSelected->subType() )
00521 act->setChecked(
true );
00522
00523 listAction.append( act );
00524 }
00525 }
00526
00527
KoVariableFormat*
format = m_varSelected->variableFormat();
00528
QString currentFormat = format->formatProperties();
00529
00530 list = format->formatPropsList();
00531 it = list.begin();
00532
for (
int i = 0; it != list.end() ; ++it, ++i )
00533 {
00534
if( i == 0 )
00535 listAction.append(
new KActionSeparator() );
00536
00537
if ( !(*it).isEmpty() )
00538 {
00539 format->setFormatProperties( *it );
00540
QString text = format->convert( m_varSelected->varValue() );
00541
00542 KToggleAction * act =
new KToggleAction(text, KShortcut(), 0, (*it).utf8());
00543 connect( act, SIGNAL(activated()),
this, SLOT(slotChangeFormat()) );
00544
if ( (*it) == currentFormat )
00545 act->setChecked(
true );
00546 listAction.append( act );
00547 }
00548 }
00549
00550
00551 format->setFormatProperties( currentFormat );
00552
return listAction;
00553 }
00554
00555
void KoVariableCollection::slotChangeSubType()
00556 {
00557 KAction * act = (KAction *)(sender());
00558
int menuNumber =
QCString(act->name()).toInt();
00559
int newSubType = m_varSelected->variableSubType(menuNumber);
00560 kdDebug(32500) <<
"slotChangeSubType: menuNumber=" << menuNumber <<
" newSubType=" << newSubType << endl;
00561
if ( m_varSelected->subType() != newSubType )
00562 {
00563
KoChangeVariableSubType *cmd=
new KoChangeVariableSubType(
00564 m_varSelected->subType(), newSubType, m_varSelected );
00565 cmd->
execute();
00566 m_varSelected->textDocument()->emitNewCommand(cmd);
00567 }
00568 }
00569
00570
void KoVariableCollection::slotChangeFormat()
00571 {
00572 KAction * act = (KAction *)(sender());
00573
QString newFormat = QString::fromUtf8(act->name());
00574
QString oldFormat = m_varSelected->variableFormat()->formatProperties();
00575
if (oldFormat != newFormat )
00576 {
00577 KCommand *cmd=
new KoChangeVariableFormatProperties(
00578 oldFormat, newFormat, m_varSelected );
00579 cmd->execute();
00580 m_varSelected->textDocument()->emitNewCommand(cmd);
00581 }
00582 }
00583
00584
00585
00586
00587 KoVariable::KoVariable( KoTextDocument *textdoc,
KoVariableFormat *varFormat, KoVariableCollection *_varColl)
00588 : KoTextCustomItem( textdoc )
00589 {
00590
00591 m_varColl=_varColl;
00592 m_varFormat = varFormat;
00593 m_varColl->registerVariable(
this );
00594 m_ascent = 0;
00595 }
00596
00597 KoVariable::~KoVariable()
00598 {
00599
00600 m_varColl->unregisterVariable(
this );
00601
00602 }
00603
00604 QStringList KoVariable::subTypeText()
00605 {
00606
return QStringList();
00607 }
00608
00609
void KoVariable::resize()
00610 {
00611
if ( m_deleted )
00612
return;
00613
KoTextFormat *fmt = format();
00614
QFontMetrics fm = fmt->
refFontMetrics();
00615
QString txt = text();
00616
00617 width = 0;
00618
for (
int i = 0 ; i < (
int)txt.length() ; ++i )
00619 width += fm.charWidth( txt, i );
00620
00621 width = qRound( KoTextZoomHandler::ptToLayoutUnitPt( width ) );
00622 height = fmt->
height();
00623 m_ascent = fmt->
ascent();
00624
00625 }
00626
00627 void KoVariable::recalcAndRepaint()
00628 {
00629 recalc();
00630 KoTextParag * parag = paragraph();
00631
if ( parag )
00632 {
00633
00634 parag->invalidate( 0 );
00635 parag->setChanged(
true );
00636 }
00637 textDocument()->emitRepaintChanged();
00638 }
00639
00640
QString KoVariable::fieldCode()
00641 {
00642
return i18n(
"Variable");
00643 }
00644
00645 QString KoVariable::text(
bool realValue)
00646 {
00647
KoTextFormat *fmt = format();
00648
QString str;
00649
if (m_varColl->variableSetting()->displayFieldCode()&&!realValue)
00650 str = fieldCode();
00651
else
00652 str = m_varFormat->
convert( m_varValue );
00653
00654
return fmt->
displayedString( str);
00655 }
00656
00657
void KoVariable::drawCustomItem(
QPainter* p,
int x,
int y,
int wpix,
int hpix,
int ascentpix,
int ,
int ,
int ,
int ,
const QColorGroup& cg,
bool selected,
int offset,
bool drawingShadow )
00658 {
00659
KoTextFormat * fmt = format();
00660
KoZoomHandler * zh = textDocument()->paintingZoomHandler();
00661
QFont font( fmt->
screenFont( zh ) );
00662 drawCustomItemHelper( p, x, y, wpix, hpix, ascentpix, cg, selected, offset, fmt, font, fmt->
color(), drawingShadow );
00663 }
00664
00665 void KoVariable::drawCustomItemHelper(
QPainter* p,
int x,
int y,
int wpix,
int hpix,
int ascentpix,
const QColorGroup& cg,
bool selected,
int offset,
KoTextFormat* fmt,
const QFont& font,
QColor textColor,
bool drawingShadow )
00666 {
00667
00668
00669
00670
KoZoomHandler * zh = textDocument()->paintingZoomHandler();
00671
00672 p->save();
00673
00674
if ( fmt->
textBackgroundColor().isValid() )
00675 p->fillRect( x, y, wpix, hpix, fmt->
textBackgroundColor() );
00676
00677
if ( drawingShadow )
00678 {
00679 textColor = fmt->
shadowColor();
00680 p->setPen( textColor );
00681 }
00682
else if ( selected )
00683 {
00684 textColor = cg.color( QColorGroup::HighlightedText );
00685 p->setPen(
QPen( textColor ) );
00686 p->fillRect( x, y, wpix, hpix, cg.color( QColorGroup::Highlight ) );
00687 }
00688
else if ( textDocument() && textDocument()->drawFormattingChars()
00689 && p->device()->devType() != QInternal::Printer )
00690 {
00691 textColor = cg.color( QColorGroup::Highlight );
00692 p->setPen(
QPen ( textColor, 0, Qt::DotLine ) );
00693 p->drawRect( x, y, wpix, hpix );
00694 }
00695
else {
00696
if ( !textColor.isValid() )
00697 textColor = KoTextFormat::defaultTextColor( p );
00698 p->setPen(
QPen( textColor ) );
00699 }
00700
00701 p->setFont( font );
00702
00703
QString str = text();
00704 KoTextParag::drawFontEffects( p, fmt, zh, font, textColor, x, ascentpix, wpix, y, hpix, str[0] );
00705
int posY = y + ascentpix + offset;
00706
if ( fmt->
vAlign() == KoTextFormat::AlignSubScript )
00707 posY +=p->fontMetrics().height() / 6;
00708
if ( fmt->
vAlign() != KoTextFormat::AlignSuperScript )
00709 posY -= fmt->
offsetFromBaseLine();
00710
else if ( fmt->
offsetFromBaseLine() < 0 )
00711 posY -= 2*fmt->
offsetFromBaseLine();
00712
00713 p->drawText( x, posY, str );
00714 p->restore();
00715 }
00716
00717 void KoVariable::save(
QDomElement &parentElem )
00718 {
00719
00720
QDomElement variableElem = parentElem.ownerDocument().createElement(
"VARIABLE" );
00721 parentElem.appendChild( variableElem );
00722
QDomElement typeElem = parentElem.ownerDocument().createElement(
"TYPE" );
00723 variableElem.appendChild( typeElem );
00724 typeElem.setAttribute(
"type", static_cast<int>( type() ) );
00726 typeElem.setAttribute(
"key", m_varFormat->
key() );
00727 typeElem.setAttribute(
"text", text(
true) );
00728
if ( correctValue() != 0)
00729 typeElem.setAttribute(
"correct", correctValue() );
00730
saveVariable( variableElem );
00731 }
00732
00733
void KoVariable::load(
QDomElement & )
00734 {
00735 }
00736
00737
KoVariable * KoVariableCollection::createVariable(
int type,
short int subtype,
KoVariableFormatCollection * coll,
KoVariableFormat *varFormat,KoTextDocument *textdoc,
KoDocument * doc,
int _correct,
bool _forceDefaultFormat )
00738 {
00739
QCString string;
00740
QStringList stringList;
00741
if ( varFormat == 0L )
00742 {
00743
00744
switch ( type ) {
00745
case VT_DATE:
00746
case VT_DATE_VAR_KWORD10:
00747 {
00748
if ( _forceDefaultFormat )
00749 varFormat = coll->
format( KoDateVariable::defaultFormat() );
00750
else
00751 {
00752
QCString result =
KoDateVariable::formatStr(_correct);
00753
if ( result == 0 )
00754
return 0L;
00755 varFormat = coll->
format( result );
00756 }
00757
break;
00758 }
00759
case VT_TIME:
00760
case VT_TIME_VAR_KWORD10:
00761 {
00762
if ( _forceDefaultFormat )
00763 varFormat = coll->
format( KoTimeVariable::defaultFormat() );
00764
else
00765 varFormat = coll->
format( KoTimeVariable::formatStr(_correct) );
00766
break;
00767 }
00768
case VT_PGNUM:
00769 varFormat = coll->
format(
"NUMBER" );
00770
break;
00771
case VT_FIELD:
00772
case VT_CUSTOM:
00773
case VT_MAILMERGE:
00774
case VT_LINK:
00775
case VT_NOTE:
00776 varFormat = coll->
format(
"STRING" );
00777
break;
00778
case VT_FOOTNOTE:
00779 kdError() <<
"Footnote type not handled in KoVariableCollection: VT_FOOTNOTE" << endl;
00780
return 0L;
00781 }
00782 }
00783 Q_ASSERT( varFormat );
00784
if ( varFormat == 0L )
00785
return 0L ;
00786
00787 kdDebug(32500) <<
"Creating variable. Format=" << varFormat->
key() <<
" type=" << type << endl;
00788
KoVariable * var = 0L;
00789
switch ( type ) {
00790
case VT_DATE:
00791
case VT_DATE_VAR_KWORD10:
00792 var =
new KoDateVariable( textdoc, subtype, varFormat,
this, _correct );
00793
break;
00794
case VT_TIME:
00795
case VT_TIME_VAR_KWORD10:
00796 var =
new KoTimeVariable( textdoc, subtype, varFormat,
this, _correct );
00797
break;
00798
case VT_PGNUM:
00799 kdError() <<
"VT_PGNUM must be handled by the application's reimplementation of KoVariableCollection::createVariable" << endl;
00800
00801
break;
00802
case VT_FIELD:
00803 var =
new KoFieldVariable( textdoc, subtype, varFormat,
this,doc );
00804
break;
00805
case VT_CUSTOM:
00806 var =
new KoCustomVariable( textdoc, QString::null, varFormat,
this);
00807
break;
00808
case VT_MAILMERGE:
00809 var =
new KoMailMergeVariable( textdoc, QString::null, varFormat ,
this);
00810
break;
00811
case VT_LINK:
00812 var =
new KoLinkVariable( textdoc,QString::null, QString::null, varFormat ,
this);
00813
break;
00814
case VT_NOTE:
00815 var =
new KoNoteVariable( textdoc, QString::null, varFormat ,
this);
00816
break;
00817 }
00818 Q_ASSERT( var );
00819
return var;
00820 }
00821
00822
void KoVariable::setVariableFormat(
KoVariableFormat *_varFormat )
00823 {
00824
00825 m_varFormat = _varFormat;
00826
00827 }
00828
00829
00830
00831
00832 KoDateVariable::KoDateVariable( KoTextDocument *textdoc,
short int subtype,
KoVariableFormat *_varFormat, KoVariableCollection *_varColl,
int _correctDate)
00833 :
KoVariable( textdoc, _varFormat,_varColl ), m_subtype( subtype ), m_correctDate( _correctDate)
00834 {
00835 }
00836
00837
QString KoDateVariable::fieldCode()
00838 {
00839
if ( m_subtype == VST_DATE_FIX )
00840
return i18n(
"Date (Fixed)");
00841
else if ( m_subtype == VST_DATE_CURRENT)
00842
return i18n(
"Date");
00843
else if ( m_subtype == VST_DATE_LAST_PRINTING)
00844
return i18n(
"Last Printing");
00845
else if ( m_subtype == VST_DATE_CREATE_FILE )
00846
return i18n(
"File Creation");
00847
else if ( m_subtype == VST_DATE_MODIFY_FILE )
00848
return i18n(
"File Modification");
00849
else
00850
return i18n(
"Date");
00851 }
00852
00853
void KoDateVariable::resize()
00854 {
00855
KoTextFormat * fmt = format();
00856
QString oldLanguage;
00857
if ( !fmt->
language().isEmpty())
00858 {
00859 oldLanguage=KGlobal::locale()->language();
00860
bool changeLanguage = KGlobal::locale()->setLanguage( fmt->
language() );
00861 KoVariable::resize();
00862
if ( changeLanguage )
00863 KGlobal::locale()->setLanguage( oldLanguage );
00864 }
00865
else
00866 KoVariable::resize();
00867 }
00868
00869
void KoDateVariable::recalc()
00870 {
00871
if ( m_subtype == VST_DATE_CURRENT )
00872 m_varValue = QDateTime::currentDateTime().addDays(m_correctDate);
00873
else if ( m_subtype == VST_DATE_LAST_PRINTING )
00874 m_varValue = m_varColl->variableSetting()->lastPrintingDate();
00875
else if ( m_subtype == VST_DATE_CREATE_FILE )
00876 m_varValue = m_varColl->variableSetting()->creationDate();
00877
else if ( m_subtype == VST_DATE_MODIFY_FILE )
00878 m_varValue = m_varColl->variableSetting()->modificationDate();
00879
else
00880 {
00881
00882
if ( m_varValue.isNull() )
00883 m_varValue = QDateTime::currentDateTime().addDays(m_correctDate);
00884 }
00885 resize();
00886 }
00887
00888 void KoDateVariable::saveVariable(
QDomElement& varElem )
00889 {
00890
QDomElement elem = varElem.ownerDocument().createElement(
"DATE" );
00891 varElem.appendChild( elem );
00892
QDate date = m_varValue.toDate();
00893 date = date.addDays( -m_correctDate );
00894 elem.setAttribute(
"year", date.year() );
00895 elem.setAttribute(
"month", date.month() );
00896 elem.setAttribute(
"day", date.day() );
00897 elem.setAttribute(
"fix", m_subtype == VST_DATE_FIX );
00898 elem.setAttribute(
"correct", m_correctDate);
00899 elem.setAttribute(
"subtype", m_subtype);
00900
if ( m_varValue.type() == QVariant::DateTime )
00901 {
00902
QTime time = m_varValue.toTime();
00903 elem.setAttribute(
"hour", time.hour() );
00904 elem.setAttribute(
"minute", time.minute() );
00905 elem.setAttribute(
"second", time.second() );
00906 }
00907 }
00908
00909
void KoDateVariable::load(
QDomElement& elem )
00910 {
00911 KoVariable::load( elem );
00912
00913
QDomElement e = elem.namedItem(
"DATE" ).toElement();
00914
if (!e.isNull())
00915 {
00916
const int y = e.attribute(
"year").toInt();
00917
const int month = e.attribute(
"month").toInt();
00918
const int d = e.attribute(
"day").toInt();
00919
const int h = e.attribute(
"hour").toInt();
00920
const int min = e.attribute(
"minute").toInt();
00921
const int s = e.attribute(
"second").toInt();
00922
const int ms = e.attribute(
"msecond").toInt();
00923
const bool fix = e.attribute(
"fix").toInt() == 1;
00924
if ( e.hasAttribute(
"correct"))
00925 m_correctDate = e.attribute(
"correct").toInt();
00926
if ( fix )
00927 {
00928
QDate date( y, month, d );
00929 date = date.addDays( m_correctDate );
00930
const QTime time( h, min, s, ms );
00931
if (time.isValid())
00932 m_varValue =
QVariant (
QDateTime( date, time ) );
00933
else
00934 m_varValue = QVariant( date );
00935 }
00936
00937 m_subtype = fix ? VST_DATE_FIX : VST_DATE_CURRENT;
00938
if ( e.hasAttribute(
"subtype" ))
00939 m_subtype = e.attribute(
"subtype").toInt();
00940 }
00941 }
00942
00943
QStringList KoDateVariable::actionTexts()
00944 {
00945
QStringList lst;
00946 lst << i18n(
"Current Date (fixed)" );
00947 lst << i18n(
"Current Date (variable)" );
00948 lst << i18n(
"Date of Last Printing" );
00949 lst << i18n(
"Date of File Creation" );
00950 lst << i18n(
"Date of File Modification" );
00951
return lst;
00952 }
00953
00954 QStringList KoDateVariable::subTypeText()
00955 {
00956
return KoDateVariable::actionTexts();
00957 }
00958
00959 QCString KoDateVariable::defaultFormat()
00960 {
00961
return QCString(
"DATE") +
"locale";
00962 }
00963
00964 QCString KoDateVariable::formatStr(
int & correct)
00965 {
00966
QCString string;
00967
QStringList stringList;
00968 KDialogBase* dialog=
new KDialogBase(0, 0,
true, i18n(
"Date Format"), KDialogBase::Ok|KDialogBase::Cancel);
00969 DateFormatWidget* widget=
new DateFormatWidget(dialog);
00970
int count=0;
00971 dialog->setMainWidget(widget);
00972 KConfig* config = KoGlobal::kofficeConfig();
00973
if( config->hasGroup(
"Date format history") )
00974 {
00975 KConfigGroupSaver cgs( config,
"Date format history");
00976
const int noe=config->readNumEntry(
"Number Of Entries", 5);
00977
for(
int i=0;i<noe;i++)
00978 {
00979
QString num;
00980 num.setNum(i);
00981
const QString tmpString(config->readEntry(
"Last Used"+num));
00982
if(tmpString.startsWith(
"locale"))
00983
continue;
00984
else if(stringList.contains(tmpString))
00985
continue;
00986
else if(!tmpString.isEmpty())
00987 {
00988 stringList.append(tmpString);
00989 count++;
00990 }
00991 }
00992
00993 }
00994
if(!stringList.isEmpty())
00995 {
00996 widget->combo1->insertItem(
"---");
00997 widget->combo1->insertStringList(stringList);
00998 }
00999
if(
false) {
01000
QComboBox *combo= widget->combo1;
01001 combo->setCurrentItem(combo->count() -1);
01002 widget->updateLabel();
01003 }
01004
01005
if(dialog->exec()==QDialog::Accepted)
01006 {
01007 string = widget->resultString().utf8();
01008 correct = widget->correctValue();
01009 }
01010
else
01011 {
01012
return 0;
01013 }
01014 config->setGroup(
"Date format history");
01015 stringList.remove(string);
01016 stringList.prepend(string);
01017
for(
int i=0;i<=count;i++)
01018 {
01019
QString num;
01020 num.setNum(i);
01021 config->writeEntry(
"Last Used"+num, stringList[i]);
01022 }
01023 config->sync();
01024
delete dialog;
01025
return QCString(
QCString(
"DATE") + string );
01026 }
01027
01028
01029
01030
01031 KoTimeVariable::KoTimeVariable( KoTextDocument *textdoc,
short int subtype,
KoVariableFormat *varFormat, KoVariableCollection *_varColl,
int _correct)
01032 :
KoVariable( textdoc, varFormat,_varColl ), m_subtype( subtype ), m_correctTime( _correct)
01033 {
01034 }
01035
01036
QString KoTimeVariable::fieldCode()
01037 {
01038
return (m_subtype == VST_TIME_FIX)?i18n(
"Time (Fixed)"):i18n("Time");
01039 }
01040
01041
01042
void KoTimeVariable::resize()
01043 {
01044
KoTextFormat * fmt = format();
01045
if ( !fmt->
language().isEmpty() )
01046 {
01047
QString oldLanguage = KGlobal::locale()->language();
01048
bool changeLanguage = KGlobal::locale()->setLanguage( fmt->
language() );
01049 KoVariable::resize();
01050
if ( changeLanguage )
01051 KGlobal::locale()->setLanguage( oldLanguage );
01052 }
01053
else
01054 KoVariable::resize();
01055 }
01056
01057
void KoTimeVariable::recalc()
01058 {
01059
if ( m_subtype == VST_TIME_CURRENT )
01060 m_varValue =
QVariant( QTime::currentTime().addSecs(60*m_correctTime));
01061
else
01062 {
01063
01064
if ( m_varValue.toTime().isNull() )
01065 m_varValue = QVariant( QTime::currentTime().addSecs(60*m_correctTime));
01066 }
01067 resize();
01068 }
01069
01070
01071 void KoTimeVariable::saveVariable(
QDomElement& parentElem )
01072 {
01073
QDomElement elem = parentElem.ownerDocument().createElement(
"TIME" );
01074 parentElem.appendChild( elem );
01075
QTime time = m_varValue.toTime();
01076 time = time.addSecs(-60*m_correctTime);
01077 elem.setAttribute(
"hour", time.hour() );
01078 elem.setAttribute(
"minute", time.minute() );
01079 elem.setAttribute(
"second", time.second() );
01080 elem.setAttribute(
"msecond", time.msec() );
01081 elem.setAttribute(
"fix", m_subtype == VST_TIME_FIX );
01082 elem.setAttribute(
"correct", m_correctTime );
01083 }
01084
01085
void KoTimeVariable::load(
QDomElement& elem )
01086 {
01087 KoVariable::load( elem );
01088
01089
QDomElement e = elem.namedItem(
"TIME" ).toElement();
01090
if (!e.isNull())
01091 {
01092
int h = e.attribute(
"hour").toInt();
01093
int m = e.attribute(
"minute").toInt();
01094
int s = e.attribute(
"second").toInt();
01095
int ms = e.attribute(
"msecond").toInt();
01096
int correct = 0;
01097
if ( e.hasAttribute(
"correct"))
01098 correct=e.attribute(
"correct").toInt();
01099
bool fix = static_cast<bool>( e.attribute(
"fix").toInt() );
01100
if ( fix )
01101 {
01102
QTime time;
01103 time.setHMS( h, m, s, ms );
01104 time = time.addSecs( 60*m_correctTime );
01105 m_varValue = QVariant( time);
01106
01107 }
01108 m_subtype = fix ? VST_TIME_FIX : VST_TIME_CURRENT;
01109 m_correctTime = correct;
01110 }
01111 }
01112
01113
QStringList KoTimeVariable::actionTexts()
01114 {
01115
QStringList lst;
01116 lst << i18n(
"Current Time (fixed)" );
01117 lst << i18n(
"Current Time (variable)" );
01118
return lst;
01119 }
01120
01121 QStringList KoTimeVariable::subTypeText()
01122 {
01123
return KoTimeVariable::actionTexts();
01124 }
01125
01126 QCString KoTimeVariable::formatStr(
int & _correct)
01127 {
01128
QCString string;
01129
QStringList stringList;
01130 KDialogBase* dialog=
new KDialogBase(0, 0,
true, i18n(
"Time Format"), KDialogBase::Ok|KDialogBase::Cancel);
01131 TimeFormatWidget* widget=
new TimeFormatWidget(dialog);
01132 dialog->setMainWidget(widget);
01133 KConfig* config = KoGlobal::kofficeConfig();
01134
int count=0;
01135
if( config->hasGroup(
"Time format history") )
01136 {
01137 KConfigGroupSaver cgs( config,
"Time format history" );
01138
const int noe=config->readNumEntry(
"Number Of Entries", 5);
01139
for(
int i=0;i<noe;i++)
01140 {
01141
QString num;
01142 num.setNum(i);
01143
QString tmpString(config->readEntry(
"Last Used"+num));
01144
if(tmpString.startsWith(
"locale"))
01145
continue;
01146
else if(stringList.contains(tmpString))
01147
continue;
01148
else if(!tmpString.isEmpty())
01149 {
01150 stringList.append(tmpString);
01151 count++;
01152 }
01153 }
01154 }
01155
if(!stringList.isEmpty())
01156 {
01157 widget->combo1->insertItem(
"---");
01158 widget->combo1->insertStringList(stringList);
01159 }
01160
if(
false)
01161 {
01162
QComboBox *combo= widget->combo1;
01163 combo->setCurrentItem(combo->count() -1);
01164 }
01165
if(dialog->exec()==QDialog::Accepted)
01166 {
01167 string = widget->resultString().utf8();
01168 _correct = widget->correctValue();
01169 }
01170
else
01171 {
01172
return 0;
01173 }
01174 config->setGroup(
"Time format history");
01175 stringList.remove(string);
01176 stringList.prepend(string);
01177
for(
int i=0;i<=count;i++)
01178 {
01179
QString num;
01180 num.setNum(i);
01181 config->writeEntry(
"Last Used"+num, stringList[i]);
01182 }
01183 config->sync();
01184
delete dialog;
01185
return QCString(
"TIME"+string );
01186 }
01187
01188 QCString KoTimeVariable::defaultFormat()
01189 {
01190
return QCString(
QCString(
"TIME")+
QCString(
"locale") );
01191 }
01192
01193
01194
01195
01196
01197 KoCustomVariable::KoCustomVariable( KoTextDocument *textdoc,
const QString &name,
KoVariableFormat *varFormat, KoVariableCollection *_varColl )
01198 :
KoVariable( textdoc, varFormat,_varColl )
01199 {
01200 m_varValue = QVariant( name );
01201 }
01202
01203
QString KoCustomVariable::fieldCode()
01204 {
01205
return i18n(
"Custom Variable");
01206 }
01207
01208 QString KoCustomVariable::text(
bool realValue)
01209 {
01210
if (m_varColl->variableSetting()->displayFieldCode()&&!realValue)
01211
return fieldCode();
01212
else
01213
return value();
01214 }
01215
01216
01217
01218 void KoCustomVariable::saveVariable(
QDomElement& parentElem )
01219 {
01220
QDomElement elem = parentElem.ownerDocument().createElement(
"CUSTOM" );
01221 parentElem.appendChild( elem );
01222 elem.setAttribute(
"name", m_varValue.toString() );
01223 elem.setAttribute(
"value", value() );
01224 }
01225
01226
void KoCustomVariable::load(
QDomElement& elem )
01227 {
01228 KoVariable::load( elem );
01229
QDomElement e = elem.namedItem(
"CUSTOM" ).toElement();
01230
if (!e.isNull())
01231 {
01232 m_varValue = QVariant (e.attribute(
"name" ));
01233 setValue( e.attribute(
"value" ) );
01234 }
01235 }
01236
01237
QString KoCustomVariable::value()
const
01238
{
01239
return m_varColl->getVariableValue( m_varValue.toString() );
01240 }
01241
01242
void KoCustomVariable::setValue(
const QString &v )
01243 {
01244 m_varColl->setVariableValue( m_varValue.toString(), v );
01245 }
01246
01247
QStringList KoCustomVariable::actionTexts()
01248 {
01249
return QStringList( i18n(
"Custom..." ) );
01250 }
01251
01252
void KoCustomVariable::recalc()
01253 {
01254 resize();
01255 }
01256
01257
01258
01259
01260 KoMailMergeVariable::KoMailMergeVariable( KoTextDocument *textdoc,
const QString &name,
KoVariableFormat *varFormat,KoVariableCollection *_varColl )
01261 :
KoVariable( textdoc, varFormat, _varColl )
01262 {
01263 m_varValue = QVariant ( name );
01264 }
01265
01266
QString KoMailMergeVariable::fieldCode()
01267 {
01268
return i18n(
"Mail Merge");
01269 }
01270
01271
01272
void KoMailMergeVariable::saveVariable(
QDomElement& parentElem )
01273 {
01274
QDomElement elem = parentElem.ownerDocument().createElement(
"MAILMERGE" );
01275 parentElem.appendChild( elem );
01276 elem.setAttribute(
"name", m_varValue.toString() );
01277 }
01278
01279
void KoMailMergeVariable::load(
QDomElement& elem )
01280 {
01281 KoVariable::load( elem );
01282
QDomElement e = elem.namedItem(
"MAILMERGE" ).toElement();
01283
if (!e.isNull())
01284 m_varValue = QVariant( e.attribute(
"name" ) );
01285 }
01286
01287
QString KoMailMergeVariable::value()
const
01288
{
01289
return QString();
01290 }
01291
01292
QString KoMailMergeVariable::text(
bool )
01293 {
01294
01295
QString v = value();
01296
if ( v == name() )
01297
return "<" + v +
">";
01298
return v;
01299 }
01300
01301
QStringList KoMailMergeVariable::actionTexts()
01302 {
01303
return QStringList( i18n(
"&Mail Merge..." ) );
01304 }
01305
01306
01307
01308
01309 KoPgNumVariable::KoPgNumVariable( KoTextDocument *textdoc,
short int subtype,
KoVariableFormat *varFormat,KoVariableCollection *_varColl )
01310 :
KoVariable( textdoc, varFormat, _varColl ), m_subtype( subtype )
01311 {
01312 }
01313
01314
QString KoPgNumVariable::fieldCode()
01315 {
01316
if ( m_subtype == VST_PGNUM_CURRENT )
01317
return i18n(
"Page Current Num");
01318
else if ( m_subtype == VST_PGNUM_TOTAL )
01319
return i18n(
"Total Page Num");
01320
else if ( m_subtype == VST_CURRENT_SECTION )
01321
return i18n(
"Current Section");
01322
else if ( m_subtype == VST_PGNUM_PREVIOUS )
01323
return i18n(
"Previous Page Number");
01324
else if ( m_subtype == VST_PGNUM_NEXT )
01325
return i18n(
"Next Page Number");
01326
01327
else
01328
return i18n(
"Current Section");
01329 }
01330
01331
01332 void KoPgNumVariable::saveVariable(
QDomElement& parentElem )
01333 {
01334
QDomElement pgNumElem = parentElem.ownerDocument().createElement(
"PGNUM" );
01335 parentElem.appendChild( pgNumElem );
01336 pgNumElem.setAttribute(
"subtype", m_subtype );
01337
if ( m_subtype != VST_CURRENT_SECTION )
01338 pgNumElem.setAttribute(
"value", m_varValue.toInt() );
01339
else
01340 pgNumElem.setAttribute(
"value", m_varValue.toString() );
01341 }
01342
01343
void KoPgNumVariable::load(
QDomElement& elem )
01344 {
01345 KoVariable::load( elem );
01346
QDomElement pgNumElem = elem.namedItem(
"PGNUM" ).toElement();
01347
if (!pgNumElem.isNull())
01348 {
01349 m_subtype = pgNumElem.attribute(
"subtype").toInt();
01350
01351
if ( m_subtype != VST_CURRENT_SECTION )
01352 m_varValue = QVariant(pgNumElem.attribute(
"value").toInt());
01353
else
01354 m_varValue = QVariant(pgNumElem.attribute(
"value"));
01355 }
01356 }
01357
01358
QStringList KoPgNumVariable::actionTexts()
01359 {
01360
QStringList lst;
01361 lst << i18n(
"Page Number" );
01362 lst << i18n(
"Number of Pages" );
01363 lst << i18n(
"Section Title" );
01364 lst << i18n(
"Previous Page" );
01365 lst << i18n(
"Next Page" );
01366
return lst;
01367 }
01368
01369 QStringList KoPgNumVariable::subTypeText()
01370 {
01371
return KoPgNumVariable::actionTexts();
01372 }
01373
01374 void KoPgNumVariable::setVariableSubType(
short int type )
01375 {
01376 m_subtype = type;
01377 Q_ASSERT( m_varColl );
01378
KoVariableFormatCollection* fc = m_varColl->formatCollection();
01379 setVariableFormat((m_subtype == VST_CURRENT_SECTION) ? fc->
format(
"STRING") : fc->
format(
"NUMBER"));
01380 }
01381
01382
01383
01384
01385 KoFieldVariable::KoFieldVariable( KoTextDocument *textdoc,
short int subtype,
KoVariableFormat *varFormat, KoVariableCollection *_varColl ,
KoDocument *_doc )
01386 :
KoVariable( textdoc, varFormat,_varColl ), m_subtype( subtype ), m_doc(_doc)
01387 {
01388 }
01389
01390
QString KoFieldVariable::fieldCode()
01391 {
01392
switch( m_subtype ) {
01393
case VST_FILENAME:
01394
return i18n(
"Filename");
01395
break;
01396
case VST_DIRECTORYNAME:
01397
return i18n(
"Directory Name");
01398
break;
01399
case VST_PATHFILENAME:
01400
return i18n(
"Path Filename");
01401
break;
01402
case VST_FILENAMEWITHOUTEXTENSION:
01403
return i18n(
"Filename Without Extension");
01404
break;
01405
case VST_AUTHORNAME:
01406
return i18n(
"Author Name");
01407
break;
01408
case VST_EMAIL:
01409
return i18n(
"Email");
01410
break;
01411
case VST_COMPANYNAME:
01412
return i18n(
"Company Name");
01413
break;
01414
case VST_TELEPHONE:
01415
return i18n(
"Telephone");
01416
break;
01417
case VST_FAX:
01418
return i18n(
"Fax");
01419
break;
01420
case VST_COUNTRY:
01421
return i18n(
"Country");
01422
break;
01423
case VST_POSTAL_CODE:
01424
return i18n(
"Postal Code");
01425
break;
01426
case VST_CITY:
01427
return i18n(
"City");
01428
break;
01429
case VST_STREET:
01430
return i18n(
"Street");
01431
break;
01432
case VST_AUTHORTITLE:
01433
return i18n(
"Author Title");
01434
break;
01435
case VST_TITLE:
01436
return i18n(
"Title");
01437
break;
01438
case VST_ABSTRACT:
01439
return i18n(
"Abstract");
01440
break;
01441
case VST_INITIAL:
01442
return i18n(
"Initials");
01443
break;
01444 }
01445
return i18n(
"Field");
01446 }
01447
01448 QString KoFieldVariable::text(
bool realValue)
01449 {
01450
if (m_varColl->variableSetting()->displayFieldCode()&&!realValue)
01451
return fieldCode();
01452
else
01453
return value();
01454 }
01455
01456
01457 void KoFieldVariable::saveVariable(
QDomElement& parentElem )
01458 {
01459
01460
QDomElement elem = parentElem.ownerDocument().createElement(
"FIELD" );
01461 parentElem.appendChild( elem );
01462 elem.setAttribute(
"subtype", m_subtype );
01463 elem.setAttribute(
"value", m_varValue.toString() );
01464 }
01465
01466
void KoFieldVariable::load(
QDomElement& elem )
01467 {
01468 KoVariable::load( elem );
01469
QDomElement e = elem.namedItem(
"FIELD" ).toElement();
01470
if (!e.isNull())
01471 {
01472 m_subtype = e.attribute(
"subtype" ).toInt();
01473
if ( m_subtype == VST_NONE )
01474 kdWarning() <<
"Field subtype of -1 found in the file !" << endl;
01475 m_varValue = QVariant( e.attribute(
"value" ) );
01476 }
else
01477 kdWarning() <<
"FIELD element not found !" << endl;
01478 }
01479
01480
void KoFieldVariable::recalc()
01481 {
01482
QString value;
01483
switch( m_subtype ) {
01484
case VST_NONE:
01485 kdWarning() <<
"KoFieldVariable::recalc() called with m_subtype = VST_NONE !" << endl;
01486
break;
01487
case VST_FILENAME:
01488 value = m_doc->url().fileName();
01489
break;
01490
case VST_DIRECTORYNAME:
01491 value = m_doc->url().directory();
01492
break;
01493
case VST_PATHFILENAME:
01494 value=m_doc->url().path();
01495
break;
01496
case VST_FILENAMEWITHOUTEXTENSION:
01497 {
01498
QString file=m_doc->url().fileName();
01499
int pos=file.findRev(
".");
01500
if(pos !=-1)
01501 value=file.mid(0,pos);
01502
else
01503 value=file;
01504 }
01505
break;
01506
case VST_AUTHORNAME:
01507
case VST_EMAIL:
01508
case VST_COMPANYNAME:
01509
case VST_TELEPHONE:
01510
case VST_FAX:
01511
case VST_COUNTRY:
01512
case VST_POSTAL_CODE:
01513
case VST_CITY:
01514
case VST_STREET:
01515
case VST_AUTHORTITLE:
01516
case VST_INITIAL:
01517 {
01518 KoDocumentInfo * info = m_doc->
documentInfo();
01519 KoDocumentInfoAuthor * authorPage = static_cast<KoDocumentInfoAuthor *>(info->page(
"author" ));
01520
if ( !authorPage )
01521 kdWarning() <<
"Author information not found in documentInfo !" << endl;
01522
else
01523 {
01524
if ( m_subtype == VST_AUTHORNAME )
01525 value = authorPage->fullName();
01526
else if ( m_subtype == VST_EMAIL )
01527 value = authorPage->email();
01528
else if ( m_subtype == VST_COMPANYNAME )
01529 value = authorPage->company();
01530
else if ( m_subtype == VST_TELEPHONE )
01531 value = authorPage->telephone();
01532
else if ( m_subtype == VST_FAX )
01533 value = authorPage->fax();
01534
else if ( m_subtype == VST_COUNTRY )
01535 value = authorPage->country();
01536
else if ( m_subtype == VST_POSTAL_CODE )
01537 value = authorPage->postalCode();
01538
else if ( m_subtype == VST_CITY )
01539 value = authorPage->city();
01540
else if ( m_subtype == VST_STREET )
01541 value = authorPage->street();
01542
else if ( m_subtype == VST_AUTHORTITLE )
01543 value = authorPage->title();
01544
else if ( m_subtype == VST_INITIAL )
01545 value = authorPage->initial();
01546 }
01547 }
01548
break;
01549
case VST_TITLE:
01550
case VST_ABSTRACT:
01551 {
01552 KoDocumentInfo * info = m_doc->
documentInfo();
01553 KoDocumentInfoAbout * aboutPage = static_cast<KoDocumentInfoAbout *>(info->page(
"about" ));
01554
if ( !aboutPage )
01555 kdWarning() <<
"'About' page not found in documentInfo !" << endl;
01556
else
01557 {
01558
if ( m_subtype == VST_TITLE )
01559 value = aboutPage->title();
01560
else
01561 value = aboutPage->abstract();
01562 }
01563 }
01564
break;
01565 }
01566
01567
if (value.isEmpty())
01568 value = m_varValue.toString();
01569
01570
if (value.isEmpty())
01571 value = i18n(
"<None>");
01572
01573 m_varValue = QVariant( value );
01574
01575 resize();
01576 }
01577
01578
QStringList KoFieldVariable::actionTexts()
01579 {
01580
01581
QStringList lst;
01582 lst << i18n(
"Author Name" );
01583 lst << i18n(
"Title" );
01584 lst << i18n(
"Company" );
01585 lst << i18n(
"Email" );
01586 lst << i18n(
"Telephone");
01587 lst << i18n(
"Fax");
01588 lst << i18n(
"Street" );
01589 lst << i18n(
"Postal Code" );
01590 lst << i18n(
"City" );
01591 lst << i18n(
"Country");
01592
01593 lst << i18n(
"Document Title" );
01594 lst << i18n(
"Document Abstract" );
01595
01596 lst << i18n(
"File Name" );
01597 lst << i18n(
"File Name without Extension" );
01598 lst << i18n(
"Directory Name" );
01599 lst << i18n(
"Directory && File Name" );
01600 lst << i18n(
"Initials" );
01601
return lst;
01602 }
01603
01604 short int KoFieldVariable::variableSubType(
short int menuNumber )
01605 {
01606
return fieldSubType(menuNumber);
01607 }
01608
01609 KoFieldVariable::FieldSubType
KoFieldVariable::fieldSubType(
short int menuNumber)
01610 {
01611
01612 FieldSubType v;
01613
switch (menuNumber)
01614 {
01615
case 0: v = VST_AUTHORNAME;
01616
break;
01617
case 1: v = VST_AUTHORTITLE;
01618
break;
01619
case 2: v = VST_COMPANYNAME;
01620
break;
01621
case 3: v = VST_EMAIL;
01622
break;
01623
case 4: v = VST_TELEPHONE;
01624
break;
01625
case 5: v = VST_FAX;
01626
break;
01627
case 6: v = VST_STREET;
01628
break;
01629
case 7: v = VST_POSTAL_CODE;
01630
break;
01631
case 8: v = VST_CITY;
01632
break;
01633
case 9: v = VST_COUNTRY;
01634
break;
01635
case 10: v = VST_TITLE;
01636
break;
01637
case 11: v = VST_ABSTRACT;
01638
break;
01639
case 12: v = VST_FILENAME;
01640
break;
01641
case 13: v = VST_FILENAMEWITHOUTEXTENSION;
01642
break;
01643
case 14: v = VST_DIRECTORYNAME;
01644
break;
01645
case 15: v = VST_PATHFILENAME;
01646
break;
01647
case 16: v = VST_INITIAL;
01648
break;
01649
default:
01650 v = VST_NONE;
01651
break;
01652 }
01653
return v;
01654 }
01655
01656 QStringList KoFieldVariable::subTypeText()
01657 {
01658
return KoFieldVariable::actionTexts();
01659 }
01660
01661
01662
01663
01664 KoLinkVariable::KoLinkVariable( KoTextDocument *textdoc,
const QString & _linkName,
const QString & _ulr,
KoVariableFormat *varFormat,KoVariableCollection *_varColl )
01665 :
KoVariable( textdoc, varFormat,_varColl )
01666 ,m_url(_ulr)
01667 {
01668 m_varValue = QVariant( _linkName );
01669 }
01670
01671
QString KoLinkVariable::fieldCode()
01672 {
01673
return i18n(
"Link");
01674 }
01675
01676
QString KoLinkVariable::text(
bool realValue)
01677 {
01678
if (m_varColl->variableSetting()->displayFieldCode()&&!realValue)
01679
return fieldCode();
01680
else
01681
return value();
01682 }
01683
01684
void KoLinkVariable::saveVariable(
QDomElement& parentElem )
01685 {
01686
QDomElement linkElem = parentElem.ownerDocument().createElement(
"LINK" );
01687 parentElem.appendChild( linkElem );
01688 linkElem.setAttribute(
"linkName", m_varValue.toString() );
01689 linkElem.setAttribute(
"hrefName", m_url );
01690 }
01691
01692
void KoLinkVariable::load(
QDomElement& elem )
01693 {
01694 KoVariable::load( elem );
01695
QDomElement linkElem = elem.namedItem(
"LINK" ).toElement();
01696
if (!linkElem.isNull())
01697 {
01698 m_varValue = QVariant(linkElem.attribute(
"linkName"));
01699 m_url = linkElem.attribute(
"hrefName");
01700 }
01701 }
01702
01703
void KoLinkVariable::recalc()
01704 {
01705 resize();
01706 }
01707
01708
QStringList KoLinkVariable::actionTexts()
01709 {
01710
return QStringList( i18n(
"Link..." ) );
01711 }
01712
01713
01714
void KoLinkVariable::drawCustomItem(
QPainter* p,
int x,
int y,
int wpix,
int hpix,
int ascentpix,
int ,
int ,
int ,
int ,
const QColorGroup& cg,
bool selected,
int offset,
bool drawingShadow )
01715 {
01716
KoTextFormat * fmt = format();
01717
KoZoomHandler * zh = textDocument()->paintingZoomHandler();
01718
01719
bool displayLink = m_varColl->variableSetting()->displayLink();
01720
QFont font( fmt->
screenFont( zh ) );
01721
if ( m_varColl->variableSetting()->underlineLink() )
01722 font.setUnderline(
true );
01723
QColor textColor = displayLink ? cg.color( QColorGroup::Link ) : fmt->color();
01724
01725
drawCustomItemHelper( p, x, y, wpix, hpix, ascentpix, cg, selected, offset, fmt, font, textColor, drawingShadow );
01726 }
01727
01728
01729
01730
01731
01732 KoNoteVariable::KoNoteVariable( KoTextDocument *textdoc,
const QString & _note,
KoVariableFormat *varFormat,KoVariableCollection *_varColl )
01733 :
KoVariable( textdoc, varFormat,_varColl )
01734 {
01735 m_varValue = QVariant( _note );
01736 }
01737
01738
QString KoNoteVariable::fieldCode()
01739 {
01740
return i18n(
"Note");
01741 }
01742
01743
void KoNoteVariable::saveVariable(
QDomElement& parentElem )
01744 {
01745
QDomElement linkElem = parentElem.ownerDocument().createElement(
"NOTE" );
01746 parentElem.appendChild( linkElem );
01747 linkElem.setAttribute(
"note", m_varValue.toString() );
01748 }
01749
01750
void KoNoteVariable::load(
QDomElement& elem )
01751 {
01752 KoVariable::load( elem );
01753
QDomElement linkElem = elem.namedItem(
"NOTE" ).toElement();
01754
if (!linkElem.isNull())
01755 {
01756 m_varValue = QVariant(linkElem.attribute(
"note"));
01757 }
01758 }
01759
01760
void KoNoteVariable::recalc()
01761 {
01762 resize();
01763 }
01764
01765
QStringList KoNoteVariable::actionTexts()
01766 {
01767
return QStringList( i18n(
"Note..." ) );
01768 }
01769
01770
QString KoNoteVariable::text(
bool realValue)
01771 {
01772
if (m_varColl->variableSetting()->displayComment() &&
01773 m_varColl->variableSetting()->displayFieldCode()&&!realValue)
01774
return fieldCode();
01775
else
01776
01777
01778
return QString(
" ");
01779
01780 }
01781
01782
void KoNoteVariable::drawCustomItem(
QPainter* p,
int x,
int y,
int wpix,
int hpix,
int ascentpix,
int cx,
int cy,
int cw,
int ch,
const QColorGroup& cg,
bool selected,
int offset,
bool drawingShadow )
01783 {
01784
if ( !m_varColl->variableSetting()->displayComment())
01785
return;
01786
01787
KoTextFormat * fmt = format();
01788
01789
01790 p->save();
01791 p->setPen(
QPen( fmt->
color() ) );
01792
if ( fmt->
textBackgroundColor().isValid() )
01793 p->fillRect( x, y, wpix, hpix, fmt->
textBackgroundColor() );
01794
if ( selected )
01795 {
01796 p->setPen(
QPen( cg.color( QColorGroup::HighlightedText ) ) );
01797 p->fillRect( x, y, wpix, hpix, cg.color( QColorGroup::Highlight ) );
01798 }
01799
else if ( textDocument() && p->device()->devType() != QInternal::Printer
01800 && !textDocument()->dontDrawingNoteVariable())
01801 {
01802 p->fillRect( x, y, wpix, hpix, Qt::yellow);
01803 p->setPen(
QPen( cg.color( QColorGroup::Highlight ), 0, Qt::DotLine ) );
01804 p->drawRect( x, y, wpix, hpix );
01805 }
01806
01807 KoVariable::drawCustomItem( p, x, y, wpix, hpix, ascentpix, cx, cy, cw, ch, cg, selected, offset, drawingShadow );
01808
01809 p->restore();
01810 }
01811
01812
void KoPgNumVariable::setSectionTitle(
const QString& _title )
01813 {
01814
QString title( _title );
01815
if ( title.isEmpty() )
01816 {
01817 title = i18n(
"<None>");
01818 }
01819 m_varValue = QVariant( title );
01820 }
01821