22 #include <tqdrawutil.h>
24 #include <tqsizegrip.h>
27 #include <tqpainter.h>
28 #include <tqpaintdevicemetrics.h>
29 #include <tqsimplerichtext.h>
30 #include <tqobjectlist.h>
32 #include <tqcheckbox.h>
35 #include <tdeapplication.h>
37 #include <tdeaction.h>
38 #include <kstdaction.h>
39 #include <kcombobox.h>
40 #include <tdetoolbar.h>
41 #include <tdepopupmenu.h>
42 #include <kxmlguibuilder.h>
43 #include <kxmlguifactory.h>
44 #include <kcolordrag.h>
45 #include <kiconeffect.h>
46 #include <tdelocale.h>
47 #include <kstandarddirs.h>
48 #include <tdemessagebox.h>
51 #include <kinputdialog.h>
53 #include <tdeglobalsettings.h>
54 #include <tdefiledialog.h>
55 #include <tdeio/netaccess.h>
57 #include <libkcal/journal.h>
60 #include "knotebutton.h"
61 #include "knoteedit.h"
62 #include "knoteconfig.h"
63 #include "knotesglobalconfig.h"
64 #include "knoteconfigdlg.h"
65 #include "knotealarmdlg.h"
66 #include "knotehostdlg.h"
67 #include "knotesnetsend.h"
68 #include "knoteprinter.h"
71 #include "pushpin.xpm"
80 int KNote::s_ppOffset = 0;
82 KNote::KNote( TQDomDocument buildDoc, Journal *j, TQWidget *parent,
const char *name )
83 : TQFrame( parent, name, WStyle_Customize | WStyle_NoBorder | WDestructiveClose ),
84 m_label( 0 ), m_pushpin( 0 ), m_fold( 0 ), m_button( 0 ), m_tool( 0 ), m_editor( 0 ),
85 m_config( 0 ), m_journal( j ), m_find( 0 ),
86 m_twinConf( TDESharedConfig::openConfig(
"twinrc", true ) ),
87 m_busy( 0 ), m_deleteWhenIdle( false ), m_blockEmitDataChanged( false )
89 setAcceptDrops(
true );
90 actionCollection()->setWidget(
this );
92 setDOMDocument( buildDoc );
95 setXMLFile( instance()->instanceName() +
"ui.rc",
false,
false );
99 if ( m_journal->summary().isNull() && m_journal->dtStart().isValid() )
101 TQString s = TDEGlobal::locale()->formatDateTime( m_journal->dtStart() );
102 m_journal->setSummary( s );
107 new TDEAction( i18n(
"New"),
"document-new", 0,
108 TQT_TQOBJECT(
this),TQT_SLOT(slotRequestNewNote()) , actionCollection(),
"new_note" );
109 new TDEAction( i18n(
"Rename..."),
"text", 0,
110 TQT_TQOBJECT(
this), TQT_SLOT(slotRename()), actionCollection(),
"rename_note" );
111 m_readOnly =
new TDEToggleAction( i18n(
"Lock"),
"system-lock-screen" , 0,
112 TQT_TQOBJECT(
this), TQT_SLOT(slotUpdateReadOnly()), actionCollection(),
"lock_note" );
113 m_readOnly->setCheckedState( KGuiItem( i18n(
"Unlock"),
"unlock" ) );
114 new TDEAction( i18n(
"Hide"),
"window-close" , Key_Escape,
115 TQT_TQOBJECT(
this), TQT_SLOT(slotClose()), actionCollection(),
"hide_note" );
116 new TDEAction( i18n(
"Delete"),
"knotes_delete", 0,
117 TQT_TQOBJECT(
this), TQT_SLOT(slotKill()), actionCollection(),
"delete_note" );
119 new TDEAction( i18n(
"Insert Date"),
"knotes_date", 0 ,
120 TQT_TQOBJECT(
this), TQT_SLOT(slotInsDate()), actionCollection(),
"insert_date" );
121 new TDEAction( i18n(
"Set Alarm..."),
"knotes_alarm", 0 ,
122 TQT_TQOBJECT(
this), TQT_SLOT(slotSetAlarm()), actionCollection(),
"set_alarm" );
124 new TDEAction( i18n(
"Send..."),
"network", 0,
125 TQT_TQOBJECT(
this), TQT_SLOT(slotSend()), actionCollection(),
"send_note" );
126 new TDEAction( i18n(
"Mail..."),
"mail-send", 0,
127 TQT_TQOBJECT(
this), TQT_SLOT(slotMail()), actionCollection(),
"mail_note" );
128 new TDEAction( i18n(
"Save As..."),
"document-save-as", 0,
129 TQT_TQOBJECT(
this), TQT_SLOT(slotSaveAs()), actionCollection(),
"save_note" );
130 KStdAction::print( TQT_TQOBJECT(
this), TQT_SLOT(slotPrint()), actionCollection(),
"print_note" );
131 new TDEAction( i18n(
"Preferences..."),
"configure", 0,
132 TQT_TQOBJECT(
this), TQT_SLOT(slotPreferences()), actionCollection(),
"configure_note" );
134 m_keepAbove =
new TDEToggleAction( i18n(
"Keep Above Others"),
"go-up", 0,
135 TQT_TQOBJECT(
this), TQT_SLOT(slotUpdateKeepAboveBelow()), actionCollection(),
"keep_above" );
136 m_keepAbove->setExclusiveGroup(
"keepAB" );
138 m_keepBelow =
new TDEToggleAction( i18n(
"Keep Below Others"),
"go-down", 0,
139 TQT_TQOBJECT(
this), TQT_SLOT(slotUpdateKeepAboveBelow()), actionCollection(),
"keep_below" );
140 m_keepBelow->setExclusiveGroup(
"keepAB" );
142 m_toDesktop =
new TDEListAction( i18n(
"To Desktop"), 0,
143 TQT_TQOBJECT(
this), TQT_SLOT(slotPopupActionToDesktop(
int)), actionCollection(),
"to_desktop" );
144 connect( m_toDesktop->popupMenu(), TQT_SIGNAL(aboutToShow()), TQT_TQOBJECT(
this), TQT_SLOT(slotUpdateDesktopActions()) );
147 new TDEAction( i18n(
"Walk Through Notes"), 0, SHIFT+Key_BackTab,
148 TQT_TQOBJECT(
this), TQT_SIGNAL(sigShowNextNote()), actionCollection(),
"walk_notes" );
151 m_label =
new TQLabel(
this );
152 m_label->setFrameStyle( NoFrame );
153 m_label->setLineWidth( 0 );
154 m_label->installEventFilter(
this );
155 setName( m_journal->summary() );
157 m_button =
new KNoteButton(
"knotes_close",
this );
158 connect( m_button, TQT_SIGNAL(clicked()), TQT_TQOBJECT(
this), TQT_SLOT(slotClose()) );
161 m_editor =
new KNoteEdit( actionCollection(),
this );
162 m_editor->setNote(
this );
163 m_editor->installEventFilter(
this );
164 m_editor->viewport()->installEventFilter(
this );
165 connect( m_editor, TQT_SIGNAL(contentsMoving(
int,
int )), TQT_TQOBJECT(
this), TQT_SLOT(slotUpdateViewport(
int,
int )));
167 KXMLGUIBuilder builder(
this );
168 KXMLGUIFactory factory( &builder, TQT_TQOBJECT(
this) );
169 factory.addClient(
this );
171 m_menu =
dynamic_cast<TDEPopupMenu*
>(factory.container(
"note_context",
this ));
172 m_edit_menu =
dynamic_cast<TDEPopupMenu*
>(factory.container(
"note_edit",
this ));
173 m_tool =
dynamic_cast<TDEToolBar*
>(factory.container(
"note_tool",
this ));
176 m_tool->setIconSize( 10 );
177 m_tool->setFixedHeight( 16 );
178 m_tool->setIconText( TDEToolBar::IconOnly );
181 TQObjectList *list = m_tool->queryList(
"KComboBox" );
182 TQObjectListIt it( *list );
183 while ( it.current() != 0 )
185 KComboBox *combo = (KComboBox *)it.current();
186 TQFont font = combo->font();
187 font.setPointSize( 7 );
188 combo->setFont( font );
189 combo->setFixedHeight( 14 );
197 setFocusProxy( m_editor );
200 m_editor->setCornerWidget(
new TQSizeGrip(
this ) );
201 uint width = m_editor->cornerWidget()->width();
202 uint height = m_editor->cornerWidget()->height();
204 mask.resize( width, height );
207 array.setPoints( 3, 0, height, width, height, width, 0 );
210 p.setBrush( color1 );
211 p.drawPolygon( array );
213 m_editor->cornerWidget()->setMask( mask );
214 m_editor->cornerWidget()->setBackgroundMode( PaletteBase );
217 TQString configFile = TDEGlobal::dirs()->saveLocation(
"appdata",
"notes/" );
218 configFile += m_journal->uid();
222 bool newNote = !TDEIO::NetAccess::exists( KURL::fromPathOrURL( configFile ),
false, 0 );
224 m_config =
new KNoteConfig( TDESharedConfig::openConfig( configFile,
false,
false ) );
225 m_config->readConfig();
226 m_config->setVersion( KNOTES_VERSION );
231 KNotesGlobalConfig *globalConfig = KNotesGlobalConfig::self();
232 m_config->setBgColor( globalConfig->bgColor() );
233 m_config->setFgColor( globalConfig->fgColor() );
234 m_config->setWidth( globalConfig->width() );
235 m_config->setHeight( globalConfig->height() );
237 m_config->setFont( globalConfig->font() );
238 m_config->setTitleFont( globalConfig->titleFont() );
239 m_config->setAutoIndent( globalConfig->autoIndent() );
240 m_config->setRichText( globalConfig->richText() );
241 m_config->setTabSize( globalConfig->tabSize() );
242 m_config->setReadOnly( globalConfig->readOnly() );
244 m_config->setDesktop( globalConfig->desktop() );
245 m_config->setHideNote( globalConfig->hideNote() );
246 m_config->setPosition( globalConfig->position() );
247 m_config->setShowInTaskbar( globalConfig->showInTaskbar() );
248 m_config->setKeepAbove( globalConfig->keepAbove() );
249 m_config->setKeepBelow( globalConfig->keepBelow() );
251 m_config->writeConfig();
255 setMinimumSize( 20, 20 );
259 m_editor->setMargin( 0 );
260 m_editor->setFrameStyle( NoFrame );
261 m_editor->setBackgroundOrigin( WindowOrigin );
264 bool closeLeft =
false;
265 m_twinConf->setGroup(
"Style" );
266 if ( m_twinConf->readBoolEntry(
"CustomButtonPositions" ) )
267 closeLeft = m_twinConf->readEntry(
"ButtonsOnLeft" ).find(
'X' ) > -1;
269 TQPixmap pushpin_pix;
271 pushpin_pix = TQPixmap( TQPixmap( pushpin_xpm ).convertToImage().mirror(
true,
false ) );
273 pushpin_pix = TQPixmap( pushpin_xpm );
276 m_pushpin =
new TQLabel(
this );
277 m_pushpin->setScaledContents(
true );
278 m_pushpin->setBackgroundMode( NoBackground );
279 m_pushpin->setPixmap( pushpin_pix );
280 m_pushpin->resize( pushpin_pix.size() );
283 m_fold =
new TQLabel(
this );
284 m_fold->setScaledContents(
true );
285 m_fold->setBackgroundMode( NoBackground );
288 width = m_config->width();
289 height = m_config->height();
290 resize( width, height );
294 const TQPoint& position = m_config->position();
295 TQRect desk = kapp->desktop()->rect();
296 desk.addCoords( 10, 10, -10, -10 );
297 if ( desk.intersects( TQRect( position, TQSize( width, height ) ) ) )
301 TQString
property = m_journal->customProperty(
"KNotes",
"FgColor" );
302 if ( !property.isNull() )
303 m_config->setFgColor( TQColor( property ) );
305 m_journal->setCustomProperty(
"KNotes",
"FgColor", m_config->fgColor().name() );
307 property = m_journal->customProperty(
"KNotes",
"BgColor" );
308 if ( !property.isNull() )
309 m_config->setBgColor( TQColor( property ) );
311 m_journal->setCustomProperty(
"KNotes",
"BgColor", m_config->bgColor().name() );
313 property = m_journal->customProperty(
"KNotes",
"RichText" );
314 if ( !property.isNull() )
315 m_config->setRichText( property ==
"true" ?
true :
false );
317 m_journal->setCustomProperty(
"KNotes",
"RichText", m_config->richText() ?
"true" :
"false" );
324 m_fold->setMask( TQRegion( m_fold->pixmap()->createHeuristicMask() ) );
328 int desktop = m_config->desktop();
329 if ( desktop < 0 && desktop != NETWinInfo::OnAllDesktops )
330 desktop = KWin::currentDesktop();
333 if ( desktop != 0 && !m_config->hideNote() )
336 toDesktop( desktop );
340 if ( desktop == NETWinInfo::OnAllDesktops )
341 toDesktop( desktop );
344 m_editor->setText( m_journal->description() );
345 m_editor->setModified(
false );
347 m_readOnly->setChecked( m_config->readOnly() );
348 slotUpdateReadOnly();
350 if ( m_config->keepAbove() )
351 m_keepAbove->setChecked(
true );
352 else if ( m_config->keepBelow() )
353 m_keepBelow->setChecked(
true );
356 m_keepAbove->setChecked(
false );
357 m_keepBelow->setChecked(
false );
359 slotUpdateKeepAboveBelow();
362 TDEIconEffect effect;
363 TQPixmap icon = effect.apply( kapp->icon(), TDEIconEffect::Colorize, 1, m_config->bgColor(),
false );
364 TQPixmap miniIcon = effect.apply( kapp->miniIcon(), TDEIconEffect::Colorize, 1, m_config->bgColor(),
false );
365 KWin::setIcons( winId(), icon, miniIcon );
373 void KNote::slotRequestNewNote()
378 emit sigRequestNewNote();
381 void KNote::changeJournal(KCal::Journal *journal)
384 m_editor->setText( m_journal->description() );
385 m_label->setText( m_journal->summary() );
386 updateLabelAlignment();
391 void KNote::slotKill(
bool force )
393 m_blockEmitDataChanged =
true;
395 KMessageBox::warningContinueCancel(
this,
396 i18n(
"<qt>Do you really want to delete note <b>%1</b>?</qt>").arg( m_label->text() ),
397 i18n(
"Confirm Delete"), KGuiItem( i18n(
"&Delete"),
"edit-delete" ),
400 != KMessageBox::Continue )
402 m_blockEmitDataChanged =
false;
405 aboutToEnterEventLoop();
410 TQString configFile = TDEGlobal::dirs()->saveLocation(
"appdata",
"notes/" );
411 configFile += m_journal->uid();
413 if ( !TDEIO::NetAccess::del( KURL::fromPathOrURL( configFile ),
this ) )
414 kdError(5500) <<
"Can't remove the note config: " << configFile << endl;
416 emit sigKillNote( m_journal );
424 void KNote::saveData(
bool update)
426 m_journal->setSummary( m_label->text() );
427 m_journal->setDescription( m_editor->text() );
428 m_journal->setCustomProperty(
"KNotes",
"FgColor", m_config->fgColor().name() );
429 m_journal->setCustomProperty(
"KNotes",
"BgColor", m_config->bgColor().name() );
430 m_journal->setCustomProperty(
"KNotes",
"RichText", m_config->richText() ?
"true" :
"false" );
432 emit sigDataChanged( noteId() );
433 m_editor->setModified(
false );
437 void KNote::saveConfig()
const
439 m_config->setWidth( width() );
440 m_config->setHeight( height() );
441 m_config->setPosition( pos() );
443 NETWinInfo wm_client( tqt_xdisplay(), winId(), tqt_xrootwin(), NET::WMDesktop );
444 if ( wm_client.desktop() == NETWinInfo::OnAllDesktops || wm_client.desktop() > 0 )
445 m_config->setDesktop( wm_client.desktop() );
448 m_config->writeConfig();
451 TQString KNote::noteId()
const
453 return m_journal->uid();
456 TQString KNote::name()
const
458 return m_label->text();
461 TQString KNote::text()
const
463 return m_editor->text();
466 TQString KNote::plainText()
const
468 if ( m_editor->textFormat() == RichText )
471 conv.setTextFormat( RichText );
472 conv.setText( m_editor->text() );
473 conv.setTextFormat( PlainText );
477 return m_editor->text();
480 void KNote::setName(
const TQString& name )
482 m_label->setText( name );
483 updateLabelAlignment();
489 NETWinInfo note_win( tqt_xdisplay(), winId(), tqt_xrootwin(), NET::WMDesktop );
490 note_win.setName( name.utf8() );
492 emit sigNameChanged();
495 void KNote::setText(
const TQString& text )
497 m_editor->setText( text );
501 TQColor KNote::fgColor()
const
503 return m_config->fgColor();
506 TQColor KNote::bgColor()
const
508 return m_config->bgColor();
511 void KNote::setColor(
const TQColor& fg,
const TQColor& bg )
513 bool updateJournal =
false;
514 TQString journalFg = m_journal->customProperty(
"KNotes",
"FgColor" );
515 if ( journalFg.isEmpty() || journalFg != fg.name() )
517 m_journal->setCustomProperty(
"KNotes",
"FgColor", fg.name() );
518 updateJournal =
true;
520 TQString journalbg = m_journal->customProperty(
"KNotes",
"BgColor" );
521 if ( journalbg.isEmpty() || journalbg != bg.name() )
523 m_journal->setCustomProperty(
"KNotes",
"BgColor", bg.name() );
524 updateJournal =
true;
527 m_config->setFgColor( fg );
528 m_config->setBgColor( bg );
535 m_journal->updated();
536 emit sigDataChanged(noteId());
538 m_config->writeConfig();
540 TQPalette newpalette = palette();
541 newpalette.setColor( TQColorGroup::Background, bg );
542 newpalette.setColor( TQColorGroup::Foreground, fg );
543 newpalette.setColor( TQColorGroup::Base, bg );
544 newpalette.setColor( TQColorGroup::Text, fg );
545 newpalette.setColor( TQColorGroup::Button, bg );
546 newpalette.setColor( TQColorGroup::ButtonText, fg );
552 newpalette.setColor( TQColorGroup::Midlight, bg.light(150) );
553 newpalette.setColor( TQColorGroup::Shadow, bg.dark(116) );
554 newpalette.setColor( TQColorGroup::Light, bg.light(180) );
556 newpalette.setColor( TQColorGroup::Dark, bg.dark(200) );
558 newpalette.setColor( TQColorGroup::Dark, bg.dark(108) );
559 setPalette( newpalette );
562 m_editor->setTextColor( fg );
568 TQPalette darker = palette();
569 darker.setColor( TQColorGroup::Button, bg.dark(116) );
570 m_button->setPalette( darker );
573 TDEIconEffect effect;
574 TQPixmap icon = effect.apply( kapp->icon(), TDEIconEffect::Colorize, 1, bg,
false );
575 TQPixmap miniIcon = effect.apply( kapp->miniIcon(), TDEIconEffect::Colorize, 1, bg,
false );
576 KWin::setIcons( winId(), icon, miniIcon );
579 TQColor sel = palette().color( TQPalette::Active, TQColorGroup::Base ).dark();
580 if ( sel == TQt::black )
581 sel = palette().color( TQPalette::Active, TQColorGroup::Base ).light();
583 m_editor->setSelectionAttributes( 1, sel,
true );
590 emit sigColorChanged();
593 void KNote::find(
const TQString& pattern,
long options )
596 m_find =
new KFind( pattern, options,
this );
598 connect( m_find, TQT_SIGNAL(highlight(
const TQString &,
int,
int )),
599 TQT_TQOBJECT(
this), TQT_SLOT(slotHighlight(
const TQString &,
int,
int )) );
600 connect( m_find, TQT_SIGNAL(findNext()), TQT_TQOBJECT(
this), TQT_SLOT(slotFindNext()) );
602 m_find->setData( plainText() );
606 void KNote::slotFindNext()
612 KFind::Result res = m_find->find();
614 if ( res == KFind::NoMatch )
616 m_editor->removeSelection( 1 );
617 emit sigFindFinished();
624 KWin::setCurrentDesktop( KWin::windowInfo( winId() ).desktop() );
628 void KNote::slotHighlight(
const TQString& str,
int idx,
int len )
630 int paraFrom = 0, idxFrom = 0, p = 0;
631 for ( ; p < idx; ++p )
632 if ( str[p] ==
'\n' )
640 int paraTo = paraFrom, idxTo = idxFrom;
642 for ( ; p < idx + len; ++p )
644 if ( str[p] ==
'\n' )
653 m_editor->setSelection( paraFrom, idxFrom, paraTo, idxTo, 1 );
656 bool KNote::isModified()
const
658 return m_editor->isModified();
662 void KNote::sync(
const TQString& app )
664 TQByteArray sep( 1 );
670 hash.update( m_label->text().utf8() );
672 hash.update( m_editor->text().utf8() );
673 hash.hexDigest( result );
676 TDEConfig *config = m_config->config();
677 config->setGroup(
"Synchronisation" );
678 config->writeEntry( app, result.data() );
681 bool KNote::isNew(
const TQString& app )
const
683 TDEConfig *config = m_config->config();
684 config->setGroup(
"Synchronisation" );
685 TQString hash = config->readEntry( app );
686 return hash.isEmpty();
689 bool KNote::isModified(
const TQString& app )
const
691 TQByteArray sep( 1 );
695 hash.update( m_label->text().utf8() );
697 hash.update( m_editor->text().utf8() );
700 TDEConfig *config = m_config->config();
701 config->setGroup(
"Synchronisation" );
702 TQString orig = config->readEntry( app );
704 if ( hash.verify( orig.utf8() ) )
710 void KNote::setStyle(
int style )
712 if ( style == KNotesGlobalConfig::EnumStyle::Plain )
721 void KNote::slotRename()
723 m_blockEmitDataChanged =
true;
726 aboutToEnterEventLoop();
727 TQString oldName = m_label->text();
728 TQString newName = KInputDialog::getText( TQString(),
729 i18n(
"Please enter the new name:"), m_label->text(), &ok,
this );
731 m_blockEmitDataChanged =
false;
732 if ( !ok || ( oldName == newName) )
738 void KNote::slotUpdateReadOnly()
740 const bool readOnly = m_readOnly->isChecked();
742 m_editor->setReadOnly( readOnly );
743 m_config->setReadOnly( readOnly );
746 actionCollection()->action(
"configure_note" )->setEnabled( !readOnly );
747 actionCollection()->action(
"insert_date" )->setEnabled( !readOnly );
748 actionCollection()->action(
"delete_note" )->setEnabled( !readOnly );
750 actionCollection()->action(
"edit_undo" )->setEnabled( !readOnly && m_editor->isUndoAvailable() );
751 actionCollection()->action(
"edit_redo" )->setEnabled( !readOnly && m_editor->isRedoAvailable() );
752 actionCollection()->action(
"edit_cut" )->setEnabled( !readOnly && m_editor->hasSelectedText() );
753 actionCollection()->action(
"edit_paste" )->setEnabled( !readOnly );
754 actionCollection()->action(
"edit_clear" )->setEnabled( !readOnly );
755 actionCollection()->action(
"rename_note" )->setEnabled( !readOnly );
757 actionCollection()->action(
"format_bold" )->setEnabled( !readOnly );
758 actionCollection()->action(
"format_italic" )->setEnabled( !readOnly );
759 actionCollection()->action(
"format_underline" )->setEnabled( !readOnly );
760 actionCollection()->action(
"format_strikeout" )->setEnabled( !readOnly );
761 actionCollection()->action(
"format_alignleft" )->setEnabled( !readOnly );
762 actionCollection()->action(
"format_aligncenter" )->setEnabled( !readOnly );
763 actionCollection()->action(
"format_alignright" )->setEnabled( !readOnly );
764 actionCollection()->action(
"format_alignblock" )->setEnabled( !readOnly );
765 actionCollection()->action(
"format_list" )->setEnabled( !readOnly );
766 actionCollection()->action(
"format_super" )->setEnabled( !readOnly );
767 actionCollection()->action(
"format_sub" )->setEnabled( !readOnly );
768 actionCollection()->action(
"format_size" )->setEnabled( !readOnly );
769 actionCollection()->action(
"format_color" )->setEnabled( !readOnly );
774 void KNote::slotClose()
776 NETWinInfo wm_client( tqt_xdisplay(), winId(), tqt_xrootwin(), NET::WMDesktop );
777 if ( wm_client.desktop() == NETWinInfo::OnAllDesktops || wm_client.desktop() > 0 )
778 m_config->setDesktop( wm_client.desktop() );
780 m_editor->clearFocus();
781 m_config->setHideNote(
true );
782 m_config->setPosition( pos() );
788 void KNote::slotInsDate()
790 m_editor->insert( TDEGlobal::locale()->formatDateTime(TQDateTime::currentDateTime()) );
793 void KNote::slotSetAlarm()
795 m_blockEmitDataChanged =
true;
796 KNoteAlarmDlg dlg( name(),
this );
797 dlg.setIncidence( m_journal );
799 aboutToEnterEventLoop();
800 if ( dlg.exec() == TQDialog::Accepted )
801 emit sigDataChanged(noteId());
803 m_blockEmitDataChanged =
false;
806 void KNote::slotPreferences()
809 if ( KNoteConfigDlg::showDialog( noteId().utf8() ) )
813 KNoteConfigDlg *dialog =
new KNoteConfigDlg( m_config, name(),
this, noteId().utf8() );
814 connect( dialog, TQT_SIGNAL(settingsChanged()), TQT_TQOBJECT(
this), TQT_SLOT(slotApplyConfig()) );
815 connect(
this, TQT_SIGNAL(sigNameChanged()), dialog, TQT_SLOT(slotUpdateCaption()) );
819 void KNote::slotSend()
822 KNoteHostDlg hostDlg( i18n(
"Send \"%1\"").arg( name() ),
this );
823 aboutToEnterEventLoop();
824 bool ok = (hostDlg.exec() == TQDialog::Accepted);
828 TQString host = hostDlg.host();
830 if ( host.isEmpty() )
832 KMessageBox::sorry(
this, i18n(
"The host cannot be empty.") );
837 KNotesNetworkSender *sender =
new KNotesNetworkSender( host, KNotesGlobalConfig::port() );
838 sender->setSenderId( KNotesGlobalConfig::senderID() );
839 sender->setNote( name(), text() );
843 void KNote::slotMail()
846 const TQStringList cmd_list = TQStringList::split( TQChar(
' '), KNotesGlobalConfig::mailAction() );
849 for ( TQStringList::ConstIterator it = cmd_list.constBegin();
850 it != cmd_list.constEnd(); ++it )
853 mail << plainText().local8Bit();
854 else if ( *it ==
"%t" )
855 mail << m_label->text().local8Bit();
857 mail << (*it).local8Bit();
860 if ( !mail.start( TDEProcess::DontCare ) )
861 KMessageBox::sorry(
this, i18n(
"Unable to start the mail process.") );
864 void KNote::slotPrint()
867 if ( m_editor->textFormat() == PlainText )
868 content = TQStyleSheet::convertFromPlainText( m_editor->text() );
870 content = m_editor->text();
872 KNotePrinter printer;
873 printer.setMimeSourceFactory( m_editor->mimeSourceFactory() );
874 printer.setFont( m_config->font() );
875 printer.setContext( m_editor->context() );
876 printer.setStyleSheet( m_editor->styleSheet() );
877 printer.setColorGroup( colorGroup() );
878 printer.printNote( TQString(), content );
881 void KNote::slotSaveAs()
883 m_blockEmitDataChanged =
true;
884 TQCheckBox *convert = 0;
886 if ( m_editor->textFormat() == RichText )
888 convert =
new TQCheckBox( 0 );
889 convert->setText( i18n(
"Save note as plain text") );
892 KFileDialog dlg( TQString(), TQString(),
this,
"filedialog",
true, convert );
893 dlg.setOperationMode( KFileDialog::Saving );
894 dlg.setCaption( i18n(
"Save As") );
895 aboutToEnterEventLoop();
899 TQString fileName = dlg.selectedFile();
900 if ( fileName.isEmpty() )
902 m_blockEmitDataChanged =
false;
905 TQFile file( fileName );
907 if ( file.exists() &&
908 KMessageBox::warningContinueCancel(
this, i18n(
"<qt>A file named <b>%1</b> already exists.<br>"
909 "Are you sure you want to overwrite it?</qt>").arg( TQFileInfo(file).fileName() ) )
910 != KMessageBox::Continue )
912 m_blockEmitDataChanged =
false;
916 if ( file.open( IO_WriteOnly ) )
918 TQTextStream stream( &file );
920 if ( convert && convert->isChecked() )
921 stream << plainText();
925 m_blockEmitDataChanged =
false;
928 void KNote::slotPopupActionToDesktop(
int id )
936 void KNote::slotApplyConfig()
938 if ( m_config->richText() )
939 m_editor->setTextFormat( RichText );
941 m_editor->setTextFormat( PlainText );
943 m_label->setFont( m_config->titleFont() );
944 m_editor->setTextFont( m_config->font() );
945 m_editor->setTabStop( m_config->tabSize() );
946 m_editor->setAutoIndentMode( m_config->autoIndent() );
953 setColor( m_config->fgColor(), m_config->bgColor() );
955 updateLabelAlignment();
956 slotUpdateShowInTaskbar();
959 void KNote::slotUpdateKeepAboveBelow()
961 KWin::WindowInfo info( KWin::windowInfo( winId() ) );
963 if ( m_keepAbove->isChecked() )
965 m_config->setKeepAbove(
true );
966 m_config->setKeepBelow(
false );
967 KWin::setState( winId(), info.state() | NET::KeepAbove );
969 else if ( m_keepBelow->isChecked() )
971 m_config->setKeepAbove(
false );
972 m_config->setKeepBelow(
true );
973 KWin::setState( winId(), info.state() | NET::KeepBelow );
977 m_config->setKeepAbove(
false );
978 KWin::clearState( winId(), NET::KeepAbove );
980 m_config->setKeepBelow(
false );
981 KWin::clearState( winId(), NET::KeepBelow );
985 void KNote::slotUpdateShowInTaskbar()
987 if ( !m_config->showInTaskbar() )
988 KWin::setState( winId(), KWin::windowInfo(winId()).state() | NET::SkipTaskbar );
990 KWin::clearState( winId(), NET::SkipTaskbar );
993 void KNote::slotUpdateDesktopActions()
995 NETRootInfo wm_root( tqt_xdisplay(), NET::NumberOfDesktops | NET::DesktopNames );
996 NETWinInfo wm_client( tqt_xdisplay(), winId(), tqt_xrootwin(), NET::WMDesktop );
998 TQStringList desktops;
999 desktops.append( i18n(
"&All Desktops") );
1000 desktops.append( TQString() );
1002 int count = wm_root.numberOfDesktops();
1003 for (
int n = 1; n <= count; n++ )
1004 desktops.append( TQString(
"&%1 %2").arg( n ).arg( TQString::fromUtf8(wm_root.desktopName( n )) ) );
1006 m_toDesktop->setItems( desktops );
1008 if ( wm_client.desktop() == NETWinInfo::OnAllDesktops )
1009 m_toDesktop->setCurrentItem( 0 );
1011 m_toDesktop->setCurrentItem( wm_client.desktop() + 1 );
1014 void KNote::slotUpdateViewport(
int ,
int y )
1017 updateBackground( y );
1022 void KNote::toDesktop(
int desktop )
1027 if ( desktop == NETWinInfo::OnAllDesktops )
1028 KWin::setOnAllDesktops( winId(),
true );
1030 KWin::setOnDesktop( winId(), desktop );
1033 void KNote::createFold()
1035 TQPixmap fold( 15, 15 );
1036 TQPainter foldp( &fold );
1037 foldp.setPen( TQt::NoPen );
1038 foldp.setBrush( palette().active().dark() );
1039 TQPointArray foldpoints( 3 );
1040 foldpoints.putPoints( 0, 3, 0, 0, 14, 0, 0, 14 );
1041 foldp.drawPolygon( foldpoints );
1043 m_fold->setPixmap( fold );
1046 void KNote::updateLabelAlignment()
1049 TQString labelText = m_label->text();
1050 if ( m_label->fontMetrics().boundingRect( labelText ).width() > m_label->width() )
1051 m_label->setAlignment( AlignLeft );
1053 m_label->setAlignment( AlignHCenter );
1056 void KNote::updateFocus()
1060 m_label->setBackgroundColor( palette().active().shadow() );
1063 if ( !m_editor->isReadOnly() )
1065 if ( m_tool && m_tool->isHidden() && m_editor->textFormat() == TQTextEdit::RichText )
1070 m_editor->cornerWidget()->show();
1074 if ( m_tool && !m_tool->isHidden() )
1079 m_editor->cornerWidget()->hide();
1087 m_editor->cornerWidget()->hide();
1089 if ( m_tool && !m_tool->isHidden() )
1097 m_label->setBackgroundColor( palette().active().midlight() );
1101 m_label->setBackgroundColor( palette().active().background() );
1105 void KNote::updateMask()
1115 TQRegion reg( 0, s_ppOffset, w, h - s_ppOffset );
1117 const TQBitmap *pushpin_bitmap = m_pushpin->pixmap()->mask();
1118 TQRegion pushpin_reg( *pushpin_bitmap );
1119 m_pushpin->setMask( pushpin_reg );
1120 pushpin_reg.translate( m_pushpin->x(), m_pushpin->y() );
1124 TQPointArray foldpoints( 3 );
1125 foldpoints.putPoints( 0, 3, w-15, h, w, h-15, w, h );
1126 TQRegion fold( foldpoints,
false );
1127 setMask( reg.unite( pushpin_reg ).subtract( fold ) );
1130 setMask( reg.unite( pushpin_reg ) );
1133 void KNote::updateBackground(
int y_offset )
1137 m_editor->setPaper( TQBrush( colorGroup().background() ) );
1141 int w = m_editor->visibleWidth();
1142 int h = m_editor->visibleHeight();
1147 if ( y_offset == -1 )
1148 y_offset = m_editor->contentsY();
1150 y_offset = y_offset % h;
1152 TQImage grad_img( w, h, 32 );
1154 TQColor bg = palette().active().background();
1156 for (
int i = 0; i < h; ++i )
1165 int i_1 = 150 - 75 * ((i - y_offset + h) % h) / h;
1166 rgbcol = bg.light( i_1 ).rgb();
1167 for (
int j = 0; j < w; ++j )
1168 grad_img.setPixel( j, i, rgbcol );
1172 m_editor->setPaper( TQBrush( TQt::black, TQPixmap( grad_img ) ) );
1175 void KNote::updateLayout()
1177 const int headerHeight = m_label->sizeHint().height();
1178 const int margin = m_editor->margin();
1179 bool closeLeft =
false;
1181 m_twinConf->setGroup(
"Style" );
1182 if ( m_twinConf->readBoolEntry(
"CustomButtonPositions" ) )
1183 closeLeft = m_twinConf->readEntry(
"ButtonsOnLeft" ).find(
'X' ) > -1;
1187 if ( !m_editor->paper().pixmap() )
1188 setColor( palette().active().foreground(), palette().active().background() );
1191 setFrameStyle( Panel | Raised );
1194 m_pushpin->move( width() - m_pushpin->width(), 0 );
1196 m_pushpin->move( 0, 0 );
1200 if ( m_editor->paper().pixmap() )
1201 setColor( palette().active().foreground(), palette().active().background() );
1203 setFrameStyle( WinPanel | Raised );
1208 m_button->setGeometry(
1209 closeLeft ? contentsRect().x() : contentsRect().width() - headerHeight,
1210 contentsRect().y() + s_ppOffset,
1215 m_label->setGeometry(
1216 contentsRect().x(), contentsRect().y() + s_ppOffset,
1217 contentsRect().width(), headerHeight
1220 m_editor->setGeometry( TQRect(
1221 TQPoint( contentsRect().x(),
1222 contentsRect().y() + headerHeight + s_ppOffset ),
1223 TQPoint( contentsRect().right(),
1224 contentsRect().bottom() - ( m_tool ? (m_tool->isHidden() ? 0 : m_tool->height()) : 0 ) )
1228 m_tool->setGeometry(
1230 contentsRect().bottom() - m_tool->height() + 1,
1231 contentsRect().width(),
1237 m_fold->move( width() - 15, height() - 15 );
1240 m_editor->cornerWidget()->width() + margin*2,
1241 headerHeight + s_ppOffset + ( m_tool ? m_tool->height() : 0 ) +
1242 m_editor->cornerWidget()->height() + margin*2
1245 updateLabelAlignment();
1252 void KNote::drawFrame( TQPainter *p )
1254 TQRect r = frameRect();
1255 r.setTop( s_ppOffset );
1257 qDrawShadePanel( p, r, colorGroup(),
false, lineWidth() );
1259 qDrawWinPanel( p, r, colorGroup(),
false );
1262 void KNote::showEvent( TQShowEvent * )
1264 if ( m_config->hideNote() )
1267 slotUpdateKeepAboveBelow();
1268 slotUpdateShowInTaskbar();
1269 toDesktop( m_config->desktop() );
1270 move( m_config->position() );
1271 m_config->setHideNote(
false );
1275 void KNote::resizeEvent( TQResizeEvent *qre )
1277 TQFrame::resizeEvent( qre );
1281 void KNote::closeEvent( TQCloseEvent *event )
1283 if(kapp->sessionSaving())
1289 void KNote::dragEnterEvent( TQDragEnterEvent *e )
1291 if ( !m_config->readOnly() )
1292 e->accept( KColorDrag::canDecode( e ) );
1295 void KNote::dropEvent( TQDropEvent *e )
1297 if ( m_config->readOnly() )
1301 if ( KColorDrag::decode( e, bg ) )
1302 setColor( paletteForegroundColor(), bg );
1305 bool KNote::focusNextPrevChild(
bool )
1310 bool KNote::event( TQEvent *ev )
1312 if ( ev->type() == TQEvent::LayoutHint )
1318 return TQFrame::event( ev );
1321 bool KNote::eventFilter( TQObject *o, TQEvent *ev )
1323 if ( ev->type() == TQEvent::DragEnter &&
1324 KColorDrag::canDecode(
static_cast<TQDragEnterEvent *
>(ev) ) )
1326 dragEnterEvent(
static_cast<TQDragEnterEvent *
>(ev) );
1330 if ( ev->type() == TQEvent::Drop &&
1331 KColorDrag::canDecode(
static_cast<TQDropEvent *
>(ev) ) )
1333 dropEvent(
static_cast<TQDropEvent *
>(ev) );
1337 if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(m_label) )
1339 TQMouseEvent *e = (TQMouseEvent *)ev;
1341 if ( ev->type() == TQEvent::MouseButtonDblClick )
1343 if( !m_editor->isReadOnly())
1346 if ( ev->type() == TQEvent::MouseButtonPress &&
1347 (e->button() == Qt::LeftButton || e->button() == Qt::MidButton))
1349 e->button() == Qt::LeftButton ? KWin::raiseWindow( winId() )
1350 : KWin::lowerWindow( winId() );
1352 XUngrabPointer( tqt_xdisplay(), GET_QT_X_TIME() );
1353 NETRootInfo wm_root( tqt_xdisplay(), NET::WMMoveResize );
1354 wm_root.moveResizeRequest( winId(), e->globalX(), e->globalY(), NET::Move );
1358 #if KDE_IS_VERSION( 3, 5, 1 )
1359 if ( ev->type() == TQEvent::MouseButtonRelease )
1361 NETRootInfo wm_root( tqt_xdisplay(), NET::WMMoveResize );
1362 wm_root.moveResizeRequest( winId(), e->globalX(), e->globalY(), NET::MoveResizeCancel );
1367 if ( m_menu && ( ev->type() == TQEvent::MouseButtonPress )
1368 && ( e->button() == Qt::RightButton ) )
1370 m_menu->popup( TQCursor::pos() );
1377 if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(m_editor) ) {
1378 if ( ev->type() == TQEvent::FocusOut ) {
1379 TQFocusEvent *fe = TQT_TQFOCUSEVENT(ev);
1380 if ( fe->reason() != TQFocusEvent::Popup &&
1381 fe->reason() != TQFocusEvent::Mouse ) {
1383 if ( isModified() ) {
1385 if ( !m_blockEmitDataChanged )
1389 }
else if ( ev->type() == TQEvent::FocusIn ) {
1396 if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(m_editor->viewport()) )
1399 ev->type() == TQEvent::MouseButtonPress &&
1400 ((TQMouseEvent *)ev)->button() == Qt::RightButton )
1402 m_edit_menu->popup( TQCursor::pos() );
1410 void KNote::slotSaveData()
1415 void KNote::deleteWhenIdle()
1420 m_deleteWhenIdle =
true;
1423 void KNote::aboutToEnterEventLoop()
1428 void KNote::eventLoopLeft()
1431 if ( m_busy <= 0 && m_deleteWhenIdle )
1436 #include "knote.moc"
1437 #include "knotebutton.moc"