00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <qptrlist.h>
00022
#include <qstringlist.h>
00023
00024
#include <kdebug.h>
00025
#include <kglobal.h>
00026
#include <kiconloader.h>
00027
#include <klocale.h>
00028
#include <kstandarddirs.h>
00029
00030
#include <koDocument.h>
00031
00032
#include "contextstyle.h"
00033
#include "creationstrategy.h"
00034
#include "kformulacontainer.h"
00035
#include "kformuladocument.h"
00036
#include "sequenceelement.h"
00037
#include "symboltable.h"
00038
#include "symbolaction.h"
00039
00040 KFORMULA_NAMESPACE_BEGIN
00041
00042
00043
static const int CURRENT_SYNTAX_VERSION = 1;
00044
00045
static const char * CURRENT_DTD_VERSION =
"1.3";
00046
00050
static OrdinaryCreationStrategy creationStrategy;
00051
00052
00053
int FormulaList::compareItems( QPtrCollection::Item a, QPtrCollection::Item b )
00054 {
00055
double ya = static_cast<Container*>( a )->getDocumentY();
00056
double yb = static_cast<Container*>( b )->getDocumentY();
00057
if ( fabs( ya-yb ) < 1e-4 ) {
00058
double xa = static_cast<Container*>( a )->getDocumentX();
00059
double xb = static_cast<Container*>( b )->getDocumentX();
00060
if ( xa < xb )
return -1;
00061
if ( xa > xb )
return 1;
00062
return 0;
00063 }
00064
if ( ya < yb )
return -1;
00065
return 1;
00066 }
00067
00068
00069 Document::Document(
QObject *parent,
const char *name,
00070
const QStringList & )
00071 :
QObject( parent, name ), m_wrapper( 0 ), m_formula( 0 )
00072 {
00073 m_contextStyle =
new ContextStyle;
00074 SequenceElement::setCreationStrategy( &creationStrategy );
00075 formulae.setAutoDelete(
false );
00076 }
00077
00078
00079 Document::~Document()
00080 {
00081
00082
00083
00084
int count = formulae.count();
00085
for (
int i=count-1; i>=0; --i ) {
00086
delete formulae.at( i );
00087 }
00088
delete m_contextStyle;
00089 }
00090
00091
00092
bool Document::hasFormula()
00093 {
00094
return ( m_formula != 0 ) && ( m_formula->
activeCursor() != 0 );
00095 }
00096
00097
00098 Container*
Document::createFormula(
int pos,
bool registerMe )
00099 {
00100
Container* formula =
new Container(
this, pos, registerMe );
00101 formula->
initialize();
00102
return formula;
00103 }
00104
00105
00106 QPtrListIterator<Container> Document::formulas()
00107 {
00108
return QPtrListIterator<Container>( formulae );
00109 }
00110
00111
00112 int Document::formulaPos(
Container* formula )
00113 {
00114
return formulae.find( formula );
00115 }
00116
00117
00118 Container*
Document::formulaAt( uint pos )
00119 {
00120
return formulae.at( pos );
00121 }
00122
00123
00124 int Document::formulaCount()
00125 {
00126
return formulae.count();
00127 }
00128
00129
00130 bool Document::loadXML(
QDomDocument doc )
00131 {
00132
00133
QDomElement root = doc.documentElement();
00134
00135
00136
if ( root.tagName() ==
"FORMULA" ) {
00137
Container* formula = newFormula( 0 );
00138
return formula->
load( root );
00139 }
00140
00141
QDomNode node = root.firstChild();
00142
if ( node.isElement() ) {
00143
QDomElement element = node.toElement();
00144
if ( element.tagName() ==
"FORMULASETTINGS" ) {
00145
if ( !
loadDocumentPart( element ) ) {
00146
return false;
00147 }
00148 }
00149 node = node.nextSibling();
00150 }
00151 uint number = 0;
00152
while ( !node.isNull() ) {
00153
if ( node.isElement() ) {
00154
QDomElement element = node.toElement();
00155
Container* formula = newFormula( number );
00156
if ( !formula->
load( element ) ) {
00157
return false;
00158 }
00159 number += 1;
00160 }
00161 node = node.nextSibling();
00162 }
00163
return formulae.count() > 0;
00164 }
00165
00166 bool Document::loadDocumentPart(
QDomElement )
00167 {
00168
return true;
00169 }
00170
00171 QDomDocument Document::saveXML()
00172 {
00173
QDomDocument doc =
createDomDocument();
00174
QDomElement root = doc.documentElement();
00175 root.appendChild(
saveDocumentPart( doc ) );
00176 uint count = formulae.count();
00177
for ( uint i=0; i<count; ++i ) {
00178 formulae.at( i )->save( root );
00179 }
00180
return doc;
00181 }
00182
00183
00184 QDomElement Document::saveDocumentPart(
QDomDocument doc )
00185 {
00186
QDomElement settings = doc.createElement(
"FORMULASETTINGS" );
00187
return settings;
00188 }
00189
00190
00191 QDomDocument Document::createDomDocument()
00192 {
00193
return KoDocument::createDomDocument(
"kformula",
"KFORMULA",
00194 CURRENT_DTD_VERSION );
00195 }
00196
00197 void Document::registerFormula(
Container* f,
int pos )
00198 {
00199
if ( ( pos > -1 ) &&
00200 ( static_cast<uint>( pos ) < formulae.count() ) ) {
00201 formulae.insert( pos, f );
00202
00203 }
00204
else {
00205 formulae.append( f );
00206
00207 }
00208 }
00209
00210 void Document::unregisterFormula(
Container* f )
00211 {
00212
if ( m_formula == f ) {
00213 m_formula = 0;
00214 }
00215 formulae.removeRef( f );
00216 }
00217
00218 void Document::activate(
Container* f)
00219 {
00220 m_formula = f;
00221 }
00222
00223
00224 void Document::sortFormulaList()
00225 {
00226 formulae.sort();
00227 }
00228
00229
00230
Container* Document::newFormula( uint number )
00231 {
00232
if ( number < formulae.count() ) {
00233
return formulae.at( number );
00234 }
00235
return createFormula();
00236 }
00237
00238
00239
double Document::getXResolution()
const
00240
{
00241
return m_contextStyle->
zoomedResolutionX();
00242 }
00243
double Document::getYResolution()
const
00244
{
00245
return m_contextStyle->
zoomedResolutionY();
00246 }
00247
00248 const SymbolTable&
Document::getSymbolTable()
const
00249
{
00250
return m_contextStyle->
symbolTable();
00251 }
00252
00253 ContextStyle&
Document::getContextStyle(
bool edit )
00254 {
00255 m_contextStyle->
setEdit( edit );
00256
return *m_contextStyle;
00257 }
00258
00259 void Document::setZoomAndResolution(
int zoom,
int dpiX,
int dpiY )
00260 {
00261 m_contextStyle->
setZoomAndResolution( zoom, dpiX, dpiY );
00262 }
00263
00264
void Document::newZoomAndResolution(
bool updateViews,
bool )
00265 {
00266
if ( updateViews ) {
00267 recalc();
00268 }
00269 }
00270
00271 void Document::setZoomAndResolution(
int zoom,
00272
double zoomX,
double zoomY,
00273
bool updateViews,
bool forPrint )
00274 {
00275
if (
getContextStyle( !forPrint ).
setZoomAndResolution( zoom, zoomX, zoomY, updateViews, forPrint ) && updateViews ) {
00276 recalc();
00277 }
00278 }
00279
00280
00281 SymbolType Document::leftBracketChar()
00282 {
00283
return m_wrapper->
leftBracketChar();
00284 }
00285
00286 SymbolType Document::rightBracketChar()
00287 {
00288
return m_wrapper->
rightBracketChar();
00289 }
00290
00291
00292 void Document::setEnabled(
bool enabled )
00293 {
00294
00295 m_wrapper->
getAddNegThinSpaceAction()->setEnabled( enabled );
00296 m_wrapper->
getMakeGreekAction()->setEnabled( enabled );
00297 m_wrapper->
getAddGenericUpperAction()->setEnabled( enabled );
00298 m_wrapper->
getAddGenericLowerAction()->setEnabled( enabled );
00299 m_wrapper->
getAddOverlineAction()->setEnabled( enabled );
00300 m_wrapper->
getAddUnderlineAction()->setEnabled( enabled );
00301 m_wrapper->
getRemoveEnclosingAction()->setEnabled( enabled );
00302 m_wrapper->
getInsertSymbolAction()->setEnabled( enabled );
00303 m_wrapper->
getAddThinSpaceAction()->setEnabled( enabled );
00304 m_wrapper->
getAddMediumSpaceAction()->setEnabled( enabled );
00305 m_wrapper->
getAddThickSpaceAction()->setEnabled( enabled );
00306 m_wrapper->
getAddQuadSpaceAction()->setEnabled( enabled );
00307 m_wrapper->
getAddBracketAction()->setEnabled( enabled );
00308 m_wrapper->
getAddSBracketAction()->setEnabled( enabled );
00309 m_wrapper->
getAddCBracketAction()->setEnabled( enabled );
00310 m_wrapper->
getAddAbsAction()->setEnabled(enabled);
00311 m_wrapper->
getAddFractionAction()->setEnabled( enabled );
00312 m_wrapper->
getAddRootAction()->setEnabled( enabled );
00313 m_wrapper->
getAddSumAction()->setEnabled( enabled );
00314 m_wrapper->
getAddProductAction()->setEnabled( enabled );
00315 m_wrapper->
getAddIntegralAction()->setEnabled( enabled );
00316 m_wrapper->
getAddMatrixAction()->setEnabled( enabled );
00317 m_wrapper->
getAddOneByTwoMatrixAction()->setEnabled( enabled );
00318 m_wrapper->
getAddUpperLeftAction()->setEnabled( enabled );
00319 m_wrapper->
getAddLowerLeftAction()->setEnabled( enabled );
00320 m_wrapper->
getAddUpperRightAction()->setEnabled( enabled );
00321 m_wrapper->
getAddLowerRightAction()->setEnabled( enabled );
00322 m_wrapper->
getAppendColumnAction()->setEnabled( enabled );
00323 m_wrapper->
getInsertColumnAction()->setEnabled( enabled );
00324 m_wrapper->
getRemoveColumnAction()->setEnabled( enabled );
00325 m_wrapper->
getAppendRowAction()->setEnabled( enabled );
00326 m_wrapper->
getInsertRowAction()->setEnabled( enabled );
00327 m_wrapper->
getRemoveRowAction()->setEnabled( enabled );
00328
00329
if ( enabled ) {
00330 m_wrapper->
getAddGenericUpperAction()->
00331 setShortcut( KShortcut( CTRL + Key_U ) );
00332 m_wrapper->
getAddGenericLowerAction()->
00333 setShortcut( KShortcut( CTRL + Key_L ) );
00334 m_wrapper->
getRemoveEnclosingAction()->
00335 setShortcut( KShortcut( CTRL + Key_R ) );
00336 m_wrapper->
getMakeGreekAction()->
00337 setShortcut( KShortcut( CTRL + Key_G ) );
00338 m_wrapper->
getInsertSymbolAction()->
00339 setShortcut( KShortcut( CTRL + Key_I ) );
00340 }
00341
else {
00342 m_wrapper->
getAddGenericUpperAction()->setShortcut( KShortcut() );
00343 m_wrapper->
getAddGenericLowerAction()->setShortcut( KShortcut() );
00344 m_wrapper->
getRemoveEnclosingAction()->setShortcut( KShortcut() );
00345 m_wrapper->
getMakeGreekAction()->setShortcut( KShortcut() );
00346 m_wrapper->
getInsertSymbolAction()->setShortcut( KShortcut() );
00347 }
00348 }
00349
00350
00351 KoCommandHistory*
Document::getHistory()
const
00352
{
00353
return m_wrapper->
getHistory();
00354 }
00355
00356
00357
void Document::recalc()
00358 {
00359
for (
Container* f = formulae.first();
00360 f != 0;
00361 f=formulae.next() ) {
00362 f->
recalc();
00363 }
00364 }
00365
00366
00367 void Document::updateConfig()
00368 {
00369 m_wrapper->
updateConfig();
00370 recalc();
00371 }
00372
00373
00374
void Document::introduceWrapper(
DocumentWrapper* wrapper )
00375 {
00376 m_wrapper = wrapper;
00377 m_contextStyle->
readConfig( wrapper->config() );
00378 m_contextStyle->
init();
00379 }
00380
00381
00383
00384 DocumentWrapper::DocumentWrapper( KConfig* config,
00385 KActionCollection* collection,
00386
KoCommandHistory* history )
00387 : m_document( 0 ),
00388 m_leftBracketChar( LeftRoundBracket ),
00389 m_rightBracketChar( RightRoundBracket ),
00390 m_config( config ),
00391 m_hasActions( collection != 0 )
00392 {
00393
if ( m_hasActions ) {
00394 createActions( collection );
00395 }
00396 setCommandStack( history );
00397 }
00398
00399
00400 DocumentWrapper::~DocumentWrapper()
00401 {
00402
delete m_document;
00403
if ( m_ownHistory ) {
00404
delete m_history;
00405 }
00406 }
00407
00408
00409 void DocumentWrapper::document(
Document* document )
00410 {
00411 m_document = document;
00412 m_document->
introduceWrapper(
this );
00413 initSymbolNamesAction();
00414 }
00415
00416
00417
void DocumentWrapper::setCommandStack(
KoCommandHistory* history )
00418 {
00419
if ( history == 0 ) {
00420 m_history =
new KoCommandHistory;
00421 m_ownHistory =
true;
00422 }
00423
else {
00424 m_history = history;
00425 m_ownHistory =
false;
00426 }
00427 }
00428
00429
00430
void DocumentWrapper::createActions( KActionCollection* collection )
00431 {
00432 KGlobal::dirs()->addResourceType(
"toolbar",
00433 KStandardDirs::kde_default(
"data") +
00434
"kformula/pics/" );
00435
00436 m_addNegThinSpaceAction =
new KAction( i18n(
"Add Negative Thin Space" ),
00437 0,
00438
this, SLOT( addNegThinSpace() ),
00439 collection,
"formula_addnegthinspace") ;
00440 m_addThinSpaceAction =
new KAction( i18n(
"Add Thin Space" ),
00441 0,
00442
this, SLOT( addThinSpace() ),
00443 collection,
"formula_addthinspace") ;
00444 m_addMediumSpaceAction =
new KAction( i18n(
"Add Medium Space" ),
00445 0,
00446
this, SLOT( addMediumSpace() ),
00447 collection,
"formula_addmediumspace" );
00448 m_addThickSpaceAction =
new KAction( i18n(
"Add Thick Space" ),
00449 0,
00450
this, SLOT( addThickSpace() ),
00451 collection,
"formula_addthickspace" );
00452 m_addQuadSpaceAction =
new KAction( i18n(
"Add Quad Space" ),
00453 0,
00454
this, SLOT( addQuadSpace() ),
00455 collection,
"formula_addquadspace" );
00456
00457 m_addIntegralAction =
new KAction(i18n(
"Add Integral"),
00458
"int",
00459 0,
00460
this, SLOT(addIntegral()),
00461 collection,
"formula_addintegral");
00462 m_addSumAction =
new KAction(i18n(
"Add Sum"),
00463
"sum",
00464 0,
00465
this, SLOT(addSum()),
00466 collection,
"formula_addsum");
00467 m_addProductAction =
new KAction(i18n(
"Add Product"),
00468
"prod",
00469 0,
00470
this, SLOT(addProduct()),
00471 collection,
"formula_addproduct");
00472 m_addRootAction =
new KAction(i18n(
"Add Root"),
00473
"sqrt",
00474 0,
00475
this, SLOT(addRoot()),
00476 collection,
"formula_addroot");
00477 m_addFractionAction =
new KAction(i18n(
"Add Fraction"),
00478
"frac",
00479 0,
00480
this, SLOT(addFraction()),
00481 collection,
"formula_addfrac");
00482 m_addBracketAction =
new KAction(i18n(
"Add Bracket"),
00483
"paren",
00484 0,
00485
this, SLOT(addDefaultBracket()),
00486 collection,
"formula_addbra");
00487 m_addSBracketAction =
new KAction(i18n(
"Add Square Bracket"),
00488
"brackets",
00489 0,
00490
this, SLOT(addSquareBracket()),
00491 collection,
"formula_addsqrbra");
00492 m_addCBracketAction =
new KAction(i18n(
"Add Curly Bracket"),
00493
"math_brace",
00494 0,
00495
this, SLOT(addCurlyBracket()),
00496 collection,
"formula_addcurbra");
00497 m_addAbsAction =
new KAction(i18n(
"Add Abs"),
00498
"abs",
00499 0,
00500
this, SLOT(addLineBracket()),
00501 collection,
"formula_addabsbra");
00502
00503 m_addMatrixAction =
new KAction(i18n(
"Add Matrix..."),
00504
"matrix",
00505 0,
00506
this, SLOT(addMatrix()),
00507 collection,
"formula_addmatrix");
00508
00509 m_addOneByTwoMatrixAction =
new KAction(i18n(
"Add 1x2 Matrix"),
00510
"onetwomatrix",
00511 0,
00512
this, SLOT(addOneByTwoMatrix()),
00513 collection,
"formula_add_one_by_two_matrix");
00514
00515
00516 m_addUpperLeftAction =
new KAction(i18n(
"Add Upper Left Index"),
00517
"lsup",
00518 0,
00519
this, SLOT(addUpperLeftIndex()),
00520 collection,
"formula_addupperleft");
00521 m_addLowerLeftAction =
new KAction(i18n(
"Add Lower Left Index"),
00522
"lsub",
00523 0,
00524
this, SLOT(addLowerLeftIndex()),
00525 collection,
"formula_addlowerleft");
00526 m_addUpperRightAction =
new KAction(i18n(
"Add Upper Right Index"),
00527
"rsup",
00528 0,
00529
this, SLOT(addUpperRightIndex()),
00530 collection,
"formula_addupperright");
00531 m_addLowerRightAction =
new KAction(i18n(
"Add Lower Right Index"),
00532
"rsub",
00533 0,
00534
this, SLOT(addLowerRightIndex()),
00535 collection,
"formula_addlowerright");
00536
00537 m_addGenericUpperAction =
new KAction(i18n(
"Add Upper Index"),
00538 0,
00539
this, SLOT(addGenericUpperIndex()),
00540 collection,
"formula_addupperindex");
00541 m_addGenericLowerAction =
new KAction(i18n(
"Add Lower Index"),
00542 0,
00543
this, SLOT(addGenericLowerIndex()),
00544 collection,
"formula_addlowerindex");
00545
00546 m_addOverlineAction =
new KAction(i18n(
"Add Overline"),
00547
"over",
00548 0,
00549
this, SLOT(addOverline()),
00550 collection,
"formula_addoverline");
00551 m_addUnderlineAction =
new KAction(i18n(
"Add Underline"),
00552
"under",
00553 0,
00554
this, SLOT(addUnderline()),
00555 collection,
"formula_addunderline");
00556
00557 m_addMultilineAction =
new KAction(i18n(
"Add Multiline"),
00558
"multiline",
00559 0,
00560
this, SLOT(addMultiline()),
00561 collection,
"formula_addmultiline");
00562
00563 m_removeEnclosingAction =
new KAction(i18n(
"Remove Enclosing Element"),
00564 0,
00565
this, SLOT(removeEnclosing()),
00566 collection,
"formula_removeenclosing");
00567
00568 m_makeGreekAction =
new KAction(i18n(
"Convert to Greek"),
00569 0,
00570
this, SLOT(makeGreek()),
00571 collection,
"formula_makegreek");
00572
00573 m_appendColumnAction =
new KAction( i18n(
"Append Column" ),
00574
"inscol",
00575 0,
00576
this, SLOT( appendColumn() ),
00577 collection,
"formula_appendcolumn" );
00578 m_insertColumnAction =
new KAction( i18n(
"Insert Column" ),
00579
"inscol",
00580 0,
00581
this, SLOT( insertColumn() ),
00582 collection,
"formula_insertcolumn" );
00583 m_removeColumnAction =
new KAction( i18n(
"Remove Column" ),
00584
"remcol",
00585 0,
00586
this, SLOT( removeColumn() ),
00587 collection,
"formula_removecolumn" );
00588 m_appendRowAction =
new KAction( i18n(
"Append Row" ),
00589
"insrow",
00590 0,
00591
this, SLOT( appendRow() ),
00592 collection,
"formula_appendrow" );
00593 m_insertRowAction =
new KAction( i18n(
"Insert Row" ),
00594
"insrow",
00595 0,
00596
this, SLOT( insertRow() ),
00597 collection,
"formula_insertrow" );
00598 m_removeRowAction =
new KAction( i18n(
"Remove Row" ),
00599
"remrow",
00600 0,
00601
this, SLOT( removeRow() ),
00602 collection,
"formula_removerow" );
00603
00604 m_syntaxHighlightingAction =
new KToggleAction(i18n(
"Syntax Highlighting"),
00605 0,
00606
this, SLOT(toggleSyntaxHighlighting()),
00607 collection,
"formula_syntaxhighlighting");
00608
00609
00610 m_formatBoldAction =
new KToggleAction( i18n(
"&Bold" ),
"text_bold",
00611 0,
00612
this, SLOT( textBold() ),
00613 collection,
"formula_format_bold" );
00614 m_formatItalicAction =
new KToggleAction( i18n(
"&Italic" ),
"text_italic",
00615 0,
00616
this, SLOT( textItalic() ),
00617 collection,
"formula_format_italic" );
00618 m_formatBoldAction->setEnabled(
false );
00619 m_formatItalicAction->setEnabled(
false );
00620
00621
QStringList delimiter;
00622 delimiter.append(
QString(
"("));
00623 delimiter.append(
QString(
"["));
00624 delimiter.append(
QString(
"{"));
00625 delimiter.append(
QString(
"<"));
00626 delimiter.append(
QString(
"/"));
00627 delimiter.append(
QString(
"\\"));
00628 delimiter.append(
QString(
"|"));
00629 delimiter.append(
QString(
" "));
00630 delimiter.append(
QString(
")"));
00631 delimiter.append(
QString(
"]"));
00632 delimiter.append(
QString(
"}"));
00633 delimiter.append(
QString(
">"));
00634 m_leftBracket =
new KSelectAction(i18n(
"Left Delimiter"),
00635 0,
this, SLOT(delimiterLeft()),
00636 collection,
"formula_typeleft");
00637 m_leftBracket->setItems(delimiter);
00638
00639
00640 delimiter.clear();
00641 delimiter.append(
QString(
")"));
00642 delimiter.append(
QString(
"]"));
00643 delimiter.append(
QString(
"}"));
00644 delimiter.append(
QString(
">"));
00645 delimiter.append(
QString(
"/"));
00646 delimiter.append(
QString(
"\\"));
00647 delimiter.append(
QString(
"|"));
00648 delimiter.append(
QString(
" "));
00649 delimiter.append(
QString(
"("));
00650 delimiter.append(
QString(
"["));
00651 delimiter.append(
QString(
"{"));
00652 delimiter.append(
QString(
"<"));
00653 m_rightBracket =
new KSelectAction(i18n(
"Right Delimiter"),
00654 0,
this, SLOT(delimiterRight()),
00655 collection,
"formula_typeright");
00656 m_rightBracket->setItems(delimiter);
00657
00658
00659 m_insertSymbolAction =
new KAction(i18n(
"Insert Symbol"),
00660
"key_enter",
00661 0,
00662
this, SLOT(insertSymbol()),
00663 collection,
"formula_insertsymbol");
00664 m_symbolNamesAction =
new SymbolAction(i18n(
"Symbol Names"),
00665 0,
this, SLOT(symbolNames()),
00666 collection,
"formula_symbolnames");
00667
00668
QStringList ff;
00669 ff.append( i18n(
"Normal" ) );
00670 ff.append( i18n(
"Script" ) );
00671 ff.append( i18n(
"Fraktur" ) );
00672 ff.append( i18n(
"Double Struck" ) );
00673 m_fontFamily =
new KSelectAction(i18n(
"Font Family"),
00674 0,
this, SLOT(fontFamily()),
00675 collection,
"formula_fontfamily");
00676 m_fontFamily->setItems( ff );
00677 m_fontFamily->setEnabled(
false );
00678 }
00679
00680
00681
void DocumentWrapper::paste()
00682 {
00683
if (hasFormula()) {
00684 formula()->
paste();
00685 }
00686 }
00687
00688
void DocumentWrapper::copy()
00689 {
00690
if (hasFormula()) {
00691 formula()->
copy();
00692 }
00693 }
00694
00695
void DocumentWrapper::cut()
00696 {
00697
if (hasFormula()) {
00698 formula()->
cut();
00699 }
00700 }
00701
00702
void DocumentWrapper::undo()
00703 {
00704 m_history->
undo();
00705 }
00706
00707
void DocumentWrapper::redo()
00708 {
00709 m_history->
redo();
00710 }
00711
00712
void DocumentWrapper::addNegThinSpace()
00713 {
00714
if (hasFormula()) {
00715 SpaceRequest r( NEGTHIN );
00716 formula()->
performRequest( &r );
00717 }
00718 }
00719
void DocumentWrapper::addThinSpace()
00720 {
00721
if (hasFormula()) {
00722 SpaceRequest r( THIN );
00723 formula()->
performRequest( &r );
00724 }
00725 }
00726
void DocumentWrapper::addMediumSpace()
00727 {
00728
if (hasFormula()) {
00729 SpaceRequest r( MEDIUM );
00730 formula()->
performRequest( &r );
00731 }
00732 }
00733
void DocumentWrapper::addThickSpace()
00734 {
00735
if (hasFormula()) {
00736 SpaceRequest r( THICK );
00737 formula()->
performRequest( &r );
00738 }
00739 }
00740
void DocumentWrapper::addQuadSpace()
00741 {
00742
if (hasFormula()) {
00743 SpaceRequest r( QUAD );
00744 formula()->
performRequest( &r );
00745 }
00746 }
00747
00748
void DocumentWrapper::addDefaultBracket()
00749 {
00750
if (hasFormula()) {
00751 BracketRequest r( m_leftBracketChar, m_rightBracketChar );
00752 formula()->
performRequest( &r );
00753 }
00754 }
00755
00756
void DocumentWrapper::addBracket( SymbolType left, SymbolType right )
00757 {
00758
if (hasFormula()) {
00759 BracketRequest r( left, right );
00760 formula()->
performRequest( &r );
00761 }
00762 }
00763
00764
void DocumentWrapper::addParenthesis()
00765 {
00766
if (hasFormula()) {
00767 BracketRequest r( LeftRoundBracket, RightRoundBracket );
00768 formula()->
performRequest( &r );
00769 }
00770 }
00771
00772
void DocumentWrapper::addSquareBracket()
00773 {
00774
if (hasFormula()) {
00775 BracketRequest r( LeftSquareBracket, RightSquareBracket );
00776 formula()->
performRequest( &r );
00777 }
00778 }
00779
00780
void DocumentWrapper::addCurlyBracket()
00781 {
00782
if (hasFormula()) {
00783 BracketRequest r( LeftCurlyBracket, RightCurlyBracket );
00784 formula()->
performRequest( &r );
00785 }
00786 }
00787
00788
void DocumentWrapper::addLineBracket()
00789 {
00790
if (hasFormula()) {
00791 BracketRequest r( LeftLineBracket, RightLineBracket );
00792 formula()->
performRequest( &r );
00793 }
00794 }
00795
00796
void DocumentWrapper::addFraction()
00797 {
00798
if (hasFormula()) {
00799 Request r( req_addFraction );
00800 formula()->
performRequest( &r );
00801 }
00802 }
00803
00804
void DocumentWrapper::addRoot()
00805 {
00806
if (hasFormula()) {
00807 Request r( req_addRoot );
00808 formula()->
performRequest( &r );
00809 }
00810 }
00811
00812
void DocumentWrapper::addIntegral()
00813 {
00814
if (hasFormula()) {
00815 SymbolRequest r( Integral );
00816 formula()->
performRequest( &r );
00817 }
00818 }
00819
00820
void DocumentWrapper::addProduct()
00821 {
00822
if (hasFormula()) {
00823 SymbolRequest r( Product );
00824 formula()->
performRequest( &r );
00825 }
00826 }
00827
00828
void DocumentWrapper::addSum()
00829 {
00830
if (hasFormula()) {
00831 SymbolRequest r( Sum );
00832 formula()->
performRequest( &r );
00833 }
00834 }
00835
00836
void DocumentWrapper::addMatrix( uint rows, uint columns )
00837 {
00838
if (hasFormula()) {
00839 MatrixRequest r( rows, columns );
00840 formula()->
performRequest( &r );
00841 }
00842 }
00843
00844
void DocumentWrapper::addOneByTwoMatrix()
00845 {
00846
if (hasFormula()) {
00847 Request r( req_addOneByTwoMatrix );
00848 formula()->
performRequest( &r );
00849 }
00850 }
00851
00852
void DocumentWrapper::addNameSequence()
00853 {
00854
if (hasFormula()) {
00855 Request r( req_addNameSequence );
00856 formula()->
performRequest( &r );
00857 }
00858 }
00859
00860
void DocumentWrapper::addLowerLeftIndex()
00861 {
00862
if (hasFormula()) {
00863 IndexRequest r( lowerLeftPos );
00864 formula()->
performRequest( &r );
00865 }
00866 }
00867
00868
void DocumentWrapper::addUpperLeftIndex()
00869 {
00870
if (hasFormula()) {
00871 IndexRequest r( upperLeftPos );
00872 formula()->
performRequest( &r );
00873 }
00874 }
00875
00876
void DocumentWrapper::addLowerRightIndex()
00877 {
00878
if (hasFormula()) {
00879 IndexRequest r( lowerRightPos );
00880 formula()->
performRequest( &r );
00881 }
00882 }
00883
00884
void DocumentWrapper::addUpperRightIndex()
00885 {
00886
if (hasFormula()) {
00887 IndexRequest r( upperRightPos );
00888 formula()->
performRequest( &r );
00889 }
00890 }
00891
00892
void DocumentWrapper::addGenericLowerIndex()
00893 {
00894
if (hasFormula()) {
00895 IndexRequest r( lowerMiddlePos );
00896 formula()->
performRequest( &r );
00897 }
00898 }
00899
00900
void DocumentWrapper::addGenericUpperIndex()
00901 {
00902
if (hasFormula()) {
00903 IndexRequest r( upperMiddlePos );
00904 formula()->
performRequest( &r );
00905 }
00906 }
00907
00908
void DocumentWrapper::addOverline()
00909 {
00910
if (hasFormula()) {
00911 Request r( req_addOverline );
00912 formula()->
performRequest( &r );
00913 }
00914 }
00915
00916
void DocumentWrapper::addUnderline()
00917 {
00918
if (hasFormula()) {
00919 Request r( req_addUnderline );
00920 formula()->
performRequest( &r );
00921 }
00922 }
00923
00924
void DocumentWrapper::addMultiline()
00925 {
00926
if (hasFormula()) {
00927 Request r( req_addMultiline );
00928 formula()->
performRequest( &r );
00929 }
00930 }
00931
00932
void DocumentWrapper::removeEnclosing()
00933 {
00934
if (hasFormula()) {
00935 DirectedRemove r( req_removeEnclosing, beforeCursor );
00936 formula()->
performRequest( &r );
00937 }
00938 }
00939
00940
void DocumentWrapper::makeGreek()
00941 {
00942
if (hasFormula()) {
00943 Request r( req_makeGreek );
00944 formula()->
performRequest( &r );
00945 }
00946 }
00947
00948
void DocumentWrapper::insertSymbol()
00949 {
00950
if ( hasFormula() &&
00951 m_document->
m_contextStyle->
symbolTable().
contains( m_selectedName ) ) {
00952
QChar ch = m_document->
m_contextStyle->
symbolTable().
unicode( m_selectedName );
00953
if ( ch != QChar::null ) {
00954 TextCharRequest r( ch,
true );
00955 formula()->
performRequest( &r );
00956 }
00957
else {
00958 TextRequest r( m_selectedName );
00959 formula()->
performRequest( &r );
00960 }
00961 }
00962 }
00963
00964
void DocumentWrapper::insertSymbol(
QString name )
00965 {
00966
if ( hasFormula() ) {
00967
if ( m_document->
m_contextStyle->
symbolTable().
contains( name ) ) {
00968
QChar ch = m_document->
m_contextStyle->
symbolTable().
unicode( name );
00969
if ( ch != QChar::null ) {
00970 TextCharRequest r( ch,
true );
00971 formula()->
performRequest( &r );
00972
return;
00973 }
00974 }
00975 TextRequest r( name );
00976 formula()->
performRequest( &r );
00977 }
00978 }
00979
00980
void DocumentWrapper::appendColumn()
00981 {
00982
if ( hasFormula() ) {
00983 Request r( req_appendColumn );
00984 formula()->
performRequest( &r );
00985 }
00986 }
00987
00988
void DocumentWrapper::insertColumn()
00989 {
00990
if ( hasFormula() ) {
00991 Request r( req_insertColumn );
00992 formula()->
performRequest( &r );
00993 }
00994 }
00995
00996
void DocumentWrapper::removeColumn()
00997 {
00998
if ( hasFormula() ) {
00999 Request r( req_removeColumn );
01000 formula()->
performRequest( &r );
01001 }
01002 }
01003
01004
void DocumentWrapper::appendRow()
01005 {
01006
if ( hasFormula() ) {
01007 Request r( req_appendRow );
01008 formula()->
performRequest( &r );
01009 }
01010 }
01011
01012
void DocumentWrapper::insertRow()
01013 {
01014
if ( hasFormula() ) {
01015 Request r( req_insertRow );
01016 formula()->
performRequest( &r );
01017 }
01018 }
01019
01020
void DocumentWrapper::removeRow()
01021 {
01022
if ( hasFormula() ) {
01023 Request r( req_removeRow );
01024 formula()->
performRequest( &r );
01025 }
01026 }
01027
01028
void DocumentWrapper::toggleSyntaxHighlighting()
01029 {
01030 m_document->
m_contextStyle->
setSyntaxHighlighting( m_syntaxHighlightingAction->isChecked() );
01031
01032 m_document->
recalc();
01033 }
01034
01035
void DocumentWrapper::textBold()
01036 {
01037
if ( hasFormula() ) {
01038 CharStyleRequest r( req_formatBold,
01039 getFormatBoldAction()->isChecked(),
01040 getFormatItalicAction()->isChecked() );
01041 formula()->
performRequest( &r );
01042 }
01043 }
01044
01045
void DocumentWrapper::textItalic()
01046 {
01047
if ( hasFormula() ) {
01048 CharStyleRequest r( req_formatItalic,
01049 getFormatBoldAction()->isChecked(),
01050 getFormatItalicAction()->isChecked() );
01051 formula()->
performRequest( &r );
01052 }
01053 }
01054
01055
void DocumentWrapper::delimiterLeft()
01056 {
01057
QString left = m_leftBracket->currentText();
01058
switch ( left.at(0).latin1() ) {
01059
case '[':
01060
case ']':
01061
case '{':
01062
case '}':
01063
case '<':
01064
case '>':
01065
case '(':
01066
case ')':
01067
case '/':
01068
case '\\':
01069 m_leftBracketChar = static_cast<SymbolType>( left.at(0).latin1() );
01070
break;
01071
case '|':
01072 m_leftBracketChar = LeftLineBracket;
01073
break;
01074
case ' ':
01075 m_leftBracketChar = EmptyBracket;
01076
break;
01077 }
01078 }
01079
01080
void DocumentWrapper::delimiterRight()
01081 {
01082
QString right = m_rightBracket->currentText();
01083
switch ( right.at(0).latin1() ) {
01084
case '[':
01085
case ']':
01086
case '{':
01087
case '}':
01088
case '<':
01089
case '>':
01090
case '(':
01091
case ')':
01092
case '/':
01093
case '\\':
01094 m_rightBracketChar = static_cast<SymbolType>( right.at(0).latin1() );
01095
break;
01096
case '|':
01097 m_rightBracketChar = RightLineBracket;
01098
break;
01099
case ' ':
01100 m_rightBracketChar = EmptyBracket;
01101
break;
01102 }
01103 }
01104
01105
void DocumentWrapper::symbolNames()
01106 {
01107 m_selectedName = m_symbolNamesAction->currentText();
01108 }
01109
01110
01111
void DocumentWrapper::fontFamily()
01112 {
01113
if ( hasFormula() ) {
01114
int i = m_fontFamily->currentItem();
01115 CharFamily cf = anyFamily;
01116
switch( i ) {
01117
case 0: cf = normalFamily;
break;
01118
case 1: cf = scriptFamily;
break;
01119
case 2: cf = frakturFamily;
break;
01120
case 3: cf = doubleStruckFamily;
break;
01121 }
01122 CharFamilyRequest r( cf );
01123 formula()->
performRequest( &r );
01124 }
01125 }
01126
01127
01128
void DocumentWrapper::initSymbolNamesAction()
01129 {
01130
if ( m_hasActions ) {
01131
const SymbolTable& st = m_document->
m_contextStyle->
symbolTable();
01132
01133
QStringList names = st.
allNames();
01134
01135
QValueList<QFont> fonts;
01136
QMemArray<uchar> chars( names.count() );
01137
01138
int i = 0;
01139
for ( QStringList::Iterator it = names.begin();
01140 it != names.end();
01141 ++it, ++i ) {
01142
QChar ch = st.
unicode( *it );
01143
01144
01145 fonts.append( st.
font( ch ) );
01146 chars[ i ] = st.
character( ch );
01147 }
01148 m_symbolNamesAction->setSymbols( names, fonts, chars );
01149 m_selectedName = names[0];
01150 }
01151 }
01152
01153
01154
void DocumentWrapper::updateConfig()
01155 {
01156 m_syntaxHighlightingAction->
01157 setChecked( m_document->
m_contextStyle->
syntaxHighlighting() );
01158 initSymbolNamesAction();
01159 }
01160
01161
01162 KFORMULA_NAMESPACE_END
01163
01164
using namespace KFormula;
01165
#include "kformuladocument.moc"