00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <qdragobject.h>
00022 #include <qfont.h>
00023
00024 #include <kdebug.h>
00025 #include <klocale.h>
00026 #include <kaction.h>
00027 #include <kurldrag.h>
00028 #include <kstdaction.h>
00029 #include <kcolordialog.h>
00030 #include <kxmlguiclient.h>
00031
00032 #include "knoteedit.h"
00033 #include "knotebutton.h"
00034
00035 static const short SEP = 5;
00036 static const short ICON_SIZE = 10;
00037
00038
00039 KNoteEdit::KNoteEdit( QWidget *parent, const char *name )
00040 : KTextEdit( parent, name )
00041 {
00042 setAcceptDrops( true );
00043 setWordWrap( WidgetWidth );
00044 setWrapPolicy( AtWhiteSpace );
00045 setLinkUnderline( true );
00046
00047 KXMLGUIClient* client = dynamic_cast<KXMLGUIClient*>(parent);
00048 KActionCollection* actions = client->actionCollection();
00049
00050
00051 KAction* undo = KStdAction::undo( this, SLOT(undo()), actions );
00052 KAction* redo = KStdAction::redo( this, SLOT(redo()), actions );
00053 undo->setEnabled( isUndoAvailable() );
00054 redo->setEnabled( isRedoAvailable() );
00055
00056 m_cut = KStdAction::cut( this, SLOT(cut()), actions );
00057 m_copy = KStdAction::copy( this, SLOT(copy()), actions );
00058 m_paste = KStdAction::paste( this, SLOT(paste()), actions );
00059
00060 m_cut->setEnabled( false );
00061 m_copy->setEnabled( false );
00062 m_paste->setEnabled( true );
00063
00064 connect( this, SIGNAL(undoAvailable(bool)), undo, SLOT(setEnabled(bool)) );
00065 connect( this, SIGNAL(redoAvailable(bool)), redo, SLOT(setEnabled(bool)) );
00066
00067 connect( this, SIGNAL(copyAvailable(bool)), m_cut, SLOT(setEnabled(bool)) );
00068 connect( this, SIGNAL(copyAvailable(bool)), m_copy, SLOT(setEnabled(bool)) );
00069
00070 new KAction( i18n("Clear"), "editclear", 0, this, SLOT(clear()), actions, "edit_clear" );
00071 KStdAction::selectAll( this, SLOT(selectAll()), actions );
00072
00073
00074 m_textBold = new KToggleAction( QString::null, "text_bold", CTRL + Key_B, 0, 0,
00075 actions, "format_bold" );
00076 m_textItalic = new KToggleAction( QString::null, "text_italic", CTRL + Key_I, 0, 0,
00077 actions, "format_italic" );
00078 m_textUnderline = new KToggleAction( QString::null, "text_under", CTRL + Key_U, 0, 0,
00079 actions, "format_underline" );
00080 m_textStrikeOut = new KToggleAction( QString::null, "text_strike", CTRL + Key_S, 0, 0,
00081 actions, "format_strikeout" );
00082
00083 connect( m_textBold, SIGNAL(toggled(bool)), SLOT(setBold(bool)) );
00084 connect( m_textItalic, SIGNAL(toggled(bool)), SLOT(setItalic(bool)) );
00085 connect( m_textUnderline, SIGNAL(toggled(bool)), SLOT(setUnderline(bool)) );
00086 connect( m_textStrikeOut, SIGNAL(toggled(bool)), SLOT(textStrikeOut(bool)) );
00087
00088 m_textAlignLeft = new KToggleAction( QString::null, "text_left", CTRL + Key_L,
00089 this, SLOT(textAlignLeft()),
00090 actions, "format_alignleft" );
00091 m_textAlignLeft->setChecked( true );
00092 m_textAlignCenter = new KToggleAction( QString::null, "text_center", CTRL + ALT + Key_C,
00093 this, SLOT(textAlignCenter()),
00094 actions, "format_aligncenter" );
00095 m_textAlignRight = new KToggleAction( QString::null, "text_right", CTRL + ALT + Key_R,
00096 this, SLOT(textAlignRight()),
00097 actions, "format_alignright" );
00098 m_textAlignBlock = new KToggleAction( QString::null, "text_block", CTRL + Key_J,
00099 this, SLOT(textAlignBlock()),
00100 actions, "format_alignblock" );
00101
00102 m_textAlignLeft->setExclusiveGroup( "align" );
00103 m_textAlignCenter->setExclusiveGroup( "align" );
00104 m_textAlignRight->setExclusiveGroup( "align" );
00105 m_textAlignBlock->setExclusiveGroup( "align" );
00106
00107 m_textList = new KToggleAction( QString::null, "enum_list", 0,
00108 this, SLOT(textList()),
00109 actions, "format_list" );
00110
00111 m_textList->setExclusiveGroup( "style" );
00112
00113 m_textSuper = new KToggleAction( QString::null, "text_super", 0,
00114 this, SLOT(textSuperScript()),
00115 actions, "format_super" );
00116 m_textSub = new KToggleAction( QString::null, "text_sub", 0,
00117 this, SLOT(textSubScript()),
00118 actions, "format_sub" );
00119
00120 m_textSuper->setExclusiveGroup( "valign" );
00121 m_textSub->setExclusiveGroup( "valign" );
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 QPixmap pix( ICON_SIZE, ICON_SIZE );
00134 pix.fill( black );
00135 m_textColor = new KAction( QString::null, pix, 0, this,
00136 SLOT(textColor()), actions, "format_color" );
00137
00138 m_textFont = new KFontAction( QString::null, "text", KKey(),
00139 actions, "format_font" );
00140 connect( m_textFont, SIGNAL(activated( const QString & )),
00141 this, SLOT(setFamily( const QString & )) );
00142
00143 m_textSize = new KFontSizeAction( QString::null, KKey(),
00144 actions, "format_size" );
00145 connect( m_textSize, SIGNAL(fontSizeChanged( int )),
00146 this, SLOT(setPointSize( int )) );
00147
00148
00149 connect( this, SIGNAL(returnPressed()), SLOT(slotReturnPressed()) );
00150 connect( this, SIGNAL(currentFontChanged( const QFont & )),
00151 this, SLOT(fontChanged( const QFont & )) );
00152 connect( this, SIGNAL(currentColorChanged( const QColor & )),
00153 this, SLOT(colorChanged( const QColor & )) );
00154 connect( this, SIGNAL(currentAlignmentChanged( int )),
00155 this, SLOT(alignmentChanged( int )) );
00156 connect( this, SIGNAL(currentVerticalAlignmentChanged( VerticalAlignment )),
00157 this, SLOT(verticalAlignmentChanged( VerticalAlignment )) );
00158 }
00159
00160 KNoteEdit::~KNoteEdit()
00161 {
00162 }
00163
00164 void KNoteEdit::setText( const QString& text )
00165 {
00166
00167
00168 KTextEdit::setText( text );
00169 fontChanged( currentFont() );
00170 }
00171
00172 void KNoteEdit::setTextFont( const QFont& font )
00173 {
00174 if ( textFormat() == PlainText )
00175 setFont( font );
00176 else
00177 setCurrentFont( font );
00178 }
00179
00180 void KNoteEdit::setTextColor( const QColor& color )
00181 {
00182 setColor( color );
00183 colorChanged( color );
00184 }
00185
00186 void KNoteEdit::setTabStop( int tabs )
00187 {
00188 QFontMetrics fm( font() );
00189 setTabStopWidth( fm.width( 'x' ) * tabs );
00190 }
00191
00192 void KNoteEdit::setAutoIndentMode( bool newmode )
00193 {
00194 m_autoIndentMode = newmode;
00195 }
00196
00197
00200 void KNoteEdit::setTextFormat( TextFormat f )
00201 {
00202 if ( f == textFormat() )
00203 return;
00204
00205 if ( f == RichText )
00206 {
00207 QString t = text();
00208 KTextEdit::setTextFormat( f );
00209 setText( t );
00210
00211 enableRichTextActions();
00212 }
00213 else
00214 {
00215 KTextEdit::setTextFormat( f );
00216 QString t = text();
00217 setText( t );
00218
00219 disableRichTextActions();
00220 }
00221 }
00222
00223 void KNoteEdit::textStrikeOut( bool s )
00224 {
00225
00226
00227 QFont font;
00228
00229 if ( !hasSelectedText() )
00230 {
00231 font = currentFont();
00232 font.setStrikeOut( s );
00233 setCurrentFont( font );
00234 }
00235 else
00236 {
00237 int pFrom, pTo, iFrom, iTo;
00238 int cp, ci;
00239
00240 getSelection( &pFrom, &iFrom, &pTo, &iTo );
00241 getCursorPosition( &cp, &ci );
00242
00243 for ( int p = pFrom; p <= pTo; p++ )
00244 for ( int i = iFrom; i < iTo; i++ )
00245 {
00246 setCursorPosition( p, i + 1 );
00247 setSelection( p, i, p, i + 1 );
00248 font = currentFont();
00249 font.setStrikeOut( s );
00250 setCurrentFont( font );
00251 }
00252
00253 setSelection( pFrom, iFrom, pTo, iTo );
00254 setCursorPosition( cp, ci );
00255 }
00256 }
00257
00258 void KNoteEdit::textColor()
00259 {
00260 QColor c = color();
00261 int ret = KColorDialog::getColor( c, this );
00262 if ( ret == QDialog::Accepted )
00263 setTextColor( c );
00264 }
00265
00266 void KNoteEdit::textAlignLeft()
00267 {
00268 setAlignment( AlignLeft );
00269 }
00270
00271 void KNoteEdit::textAlignCenter()
00272 {
00273 setAlignment( AlignCenter );
00274 }
00275
00276 void KNoteEdit::textAlignRight()
00277 {
00278 setAlignment( AlignRight );
00279 }
00280
00281 void KNoteEdit::textAlignBlock()
00282 {
00283 setAlignment( AlignJustify );
00284 }
00285
00286 void KNoteEdit::textList()
00287 {
00288 if ( m_textList->isChecked() )
00289 setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDisc );
00290 else
00291 setParagType( QStyleSheetItem::DisplayBlock, QStyleSheetItem::ListDisc );
00292 }
00293
00294 void KNoteEdit::textSuperScript()
00295 {
00296 if ( m_textSuper->isChecked() )
00297 setVerticalAlignment( AlignSuperScript );
00298 else
00299 setVerticalAlignment( AlignNormal );
00300 }
00301
00302 void KNoteEdit::textSubScript()
00303 {
00304 if ( m_textSub->isChecked() )
00305 setVerticalAlignment( AlignSubScript );
00306 else
00307 setVerticalAlignment( AlignNormal );
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00321 void KNoteEdit::contentsDragEnterEvent( QDragEnterEvent* event )
00322 {
00323 if ( KURLDrag::canDecode( event ) )
00324 event->accept();
00325 else
00326 KTextEdit::contentsDragEnterEvent( event );
00327 }
00328
00329 void KNoteEdit::contentsDragMoveEvent( QDragMoveEvent* event )
00330 {
00331 if ( KURLDrag::canDecode( event ) )
00332 event->accept();
00333 else
00334 KTextEdit::contentsDragMoveEvent( event );
00335 }
00336
00337 void KNoteEdit::contentsDropEvent( QDropEvent* event )
00338 {
00339 KURL::List list;
00340
00341 if ( KURLDrag::decode( event, list ) )
00342 for ( KURL::List::Iterator it = list.begin(); it != list.end(); ++it )
00343 {
00344 if ( it != list.begin() )
00345 insert( ", " );
00346
00347 insert( (*it).prettyURL() );
00348 }
00349 else
00350 KTextEdit::contentsDropEvent( event );
00351 }
00352
00355 void KNoteEdit::slotReturnPressed()
00356 {
00357 if ( m_autoIndentMode )
00358 autoIndent();
00359 }
00360
00361 void KNoteEdit::fontChanged( const QFont &f )
00362 {
00363 m_textFont->setFont( f.family() );
00364 m_textSize->setFontSize( f.pointSize() );
00365
00366 m_textBold->setChecked( f.bold() );
00367 m_textItalic->setChecked( f.italic() );
00368 m_textUnderline->setChecked( f.underline() );
00369 m_textStrikeOut->setChecked( f.strikeOut() );
00370 }
00371
00372 void KNoteEdit::colorChanged( const QColor &c )
00373 {
00374 QPixmap pix( ICON_SIZE, ICON_SIZE );
00375 pix.fill( c );
00376 m_textColor->setIconSet( pix );
00377 }
00378
00379 void KNoteEdit::alignmentChanged( int a )
00380 {
00381
00382 if ( ( a == AlignAuto ) || ( a & AlignLeft ) )
00383 m_textAlignLeft->setChecked( true );
00384 else if ( ( a & AlignHCenter ) )
00385 m_textAlignCenter->setChecked( true );
00386 else if ( ( a & AlignRight ) )
00387 m_textAlignRight->setChecked( true );
00388 else if ( ( a & AlignJustify ) )
00389 m_textAlignBlock->setChecked( true );
00390 }
00391
00392 void KNoteEdit::verticalAlignmentChanged( VerticalAlignment a )
00393 {
00394 if ( a == AlignNormal )
00395 {
00396 m_textSuper->setChecked( false );
00397 m_textSub->setChecked( false );
00398 }
00399 else if ( a == AlignSuperScript )
00400 m_textSuper->setChecked( true );
00401 else if ( a == AlignSubScript )
00402 m_textSub->setChecked( true );
00403 }
00404
00405
00408 void KNoteEdit::autoIndent()
00409 {
00410 int para, index;
00411 QString string;
00412 getCursorPosition( ¶, &index );
00413 while ( para > 0 && string.stripWhiteSpace().isEmpty() )
00414 string = text( --para );
00415
00416 if ( string.stripWhiteSpace().isEmpty() )
00417 return;
00418
00419
00420
00421
00422
00423 QString indentString;
00424
00425 int len = string.length();
00426 int i = 0;
00427 while ( i < len && string.at(i).isSpace() )
00428 indentString += string.at( i++ );
00429
00430 if ( !indentString.isEmpty() )
00431 insert( indentString );
00432 }
00433
00434 void KNoteEdit::emitLinkClicked( const QString &s )
00435 {
00436 kdDebug(5500) << k_funcinfo << s << endl;
00437 }
00438
00439 void KNoteEdit::enableRichTextActions()
00440 {
00441 m_textColor->setEnabled( true );
00442
00443 m_textBold->setEnabled( true );
00444 m_textItalic->setEnabled( true );
00445 m_textUnderline->setEnabled( true );
00446 m_textStrikeOut->setEnabled( true );
00447
00448 m_textAlignLeft->setEnabled( true );
00449 m_textAlignCenter->setEnabled( true );
00450 m_textAlignRight->setEnabled( true );
00451 m_textAlignBlock->setEnabled( true );
00452
00453 m_textList->setEnabled( true );
00454 m_textSuper->setEnabled( true );
00455 m_textSub->setEnabled( true );
00456
00457
00458
00459 }
00460
00461 void KNoteEdit::disableRichTextActions()
00462 {
00463 m_textColor->setEnabled( false );
00464
00465 m_textBold->setEnabled( false );
00466 m_textItalic->setEnabled( false );
00467 m_textUnderline->setEnabled( false );
00468 m_textStrikeOut->setEnabled( false );
00469
00470 m_textAlignLeft->setEnabled( false );
00471 m_textAlignCenter->setEnabled( false );
00472 m_textAlignRight->setEnabled( false );
00473 m_textAlignBlock->setEnabled( false );
00474
00475 m_textList->setEnabled( false );
00476 m_textSuper->setEnabled( false );
00477 m_textSub->setEnabled( false );
00478
00479
00480
00481 }
00482
00483 #include "knoteedit.moc"