/***************************************************************************
* Copyright ( C ) 2003 by S é bastien Lao û t *
* slaout @ linux62 . org *
* *
* This program is free software ; you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation ; either version 2 of the License , or *
* ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program ; if not , write to the *
* Free Software Foundation , Inc . , *
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA . *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <tqstring.h>
# include <tqdir.h>
# include <kstandarddirs.h>
# include <tdelocale.h>
# include <tdefiledialog.h>
# include <tqptrstack.h>
# include <tqlayout.h>
# include <tqvbuttongroup.h>
# include <tqradiobutton.h>
# include <tdemessagebox.h>
# include <tqtextedit.h>
# include "softwareimporters.h"
# include "basket.h"
# include "basketfactory.h"
# include "notefactory.h"
# include "global.h"
# include "bnpview.h"
# include "xmlwork.h"
# include "tools.h"
/** class TreeImportDialog: */
TreeImportDialog : : TreeImportDialog ( TQWidget * parent )
: KDialogBase ( KDialogBase : : Swallow , i18n ( " Import Hierarchy " ) , KDialogBase : : Ok | KDialogBase : : Cancel ,
KDialogBase : : Ok , parent , /*name=*/ " ImportHierarchy " , /*modal=*/ true , /*separator=*/ false )
{
TQWidget * page = new TQWidget ( this ) ;
TQVBoxLayout * topLayout = new TQVBoxLayout ( page , /*margin=*/ 0 , spacingHint ( ) ) ;
m_choices = new TQVButtonGroup ( i18n ( " How to Import the Notes? " ) , page ) ;
new TQRadioButton ( i18n ( " &Keep original hierarchy (all notes in separate baskets) " ), m_choices) ;
new TQRadioButton ( i18n ( " &First level notes in separate baskets " ) , m_choices ) ;
new TQRadioButton ( i18n ( " &All notes in one basket " ) , m_choices ) ;
m_choices - > setButton ( 0 ) ;
topLayout - > addWidget ( m_choices ) ;
topLayout - > addStretch ( 10 ) ;
setMainWidget ( page ) ;
}
TreeImportDialog : : ~ TreeImportDialog ( )
{
}
int TreeImportDialog : : choice ( )
{
return m_choices - > selectedId ( ) ;
}
/** class TextFileImportDialog: */
TextFileImportDialog : : TextFileImportDialog ( TQWidget * parent )
: KDialogBase ( KDialogBase : : Swallow , i18n ( " Import Text File " ) , KDialogBase : : Ok | KDialogBase : : Cancel ,
KDialogBase : : Ok , parent , /*name=*/ " ImportTextFile " , /*modal=*/ true , /*separator=*/ false )
{
TQWidget * page = new TQWidget ( this ) ;
TQVBoxLayout * topLayout = new TQVBoxLayout ( page , /*margin=*/ 0 , spacingHint ( ) ) ;
m_choices = new TQVButtonGroup ( i18n ( " Format of the Text File " ) , page ) ;
new TQRadioButton ( i18n ( " Notes separated by an &empty line " ) , m_choices ) ;
new TQRadioButton ( i18n ( " One ¬e per line " ) , m_choices ) ;
new TQRadioButton ( i18n ( " Notes begin with a &dash (-) " ), m_choices) ;
new TQRadioButton ( i18n ( " Notes begin with a &star (*) " ), m_choices) ;
m_anotherSeparator = new TQRadioButton ( i18n ( " &Use another separator: " ) , m_choices ) ;
TQWidget * indentedTextEdit = new TQWidget ( m_choices ) ;
TQHBoxLayout * hLayout = new TQHBoxLayout ( indentedTextEdit , /*margin=*/ 0 , spacingHint ( ) ) ;
hLayout - > addSpacing ( 20 ) ;
m_customSeparator = new TQTextEdit ( indentedTextEdit ) ;
m_customSeparator - > setTextFormat ( TQt : : PlainText ) ;
hLayout - > addWidget ( m_customSeparator ) ;
m_choices - > insertChild ( TQT_TQOBJECT ( indentedTextEdit ) ) ;
new TQRadioButton ( i18n ( " &All in one note " ) , m_choices ) ;
m_choices - > setButton ( 0 ) ;
topLayout - > addWidget ( m_choices ) ;
connect ( m_customSeparator , TQT_SIGNAL ( textChanged ( ) ) , this , TQT_SLOT ( customSeparatorChanged ( ) ) ) ;
setMainWidget ( page ) ;
}
TextFileImportDialog : : ~ TextFileImportDialog ( )
{
}
TQString TextFileImportDialog : : separator ( )
{
switch ( m_choices - > selectedId ( ) ) {
default :
case 0 : return " \n \n " ;
case 1 : return " \n " ;
case 2 : return " \n - " ;
case 3 : return " \n * " ;
case 4 : return m_customSeparator - > text ( ) ;
case 5 : return " " ;
}
}
void TextFileImportDialog : : customSeparatorChanged ( )
{
if ( ! m_anotherSeparator - > isOn ( ) )
m_anotherSeparator - > toggle ( ) ;
}
/** namespace SoftwareImporters: */
TQString SoftwareImporters : : fromICS ( const TQString & ics )
{
TQString result = ics ;
// Remove escaped '\' characters and append the text to the body
int pos = 0 ;
while ( ( pos = result . find ( ' \\ ' , pos ) ) ! = - 1 ) {
if ( ( uint ) pos = = result . length ( ) - 1 ) // End of string
break ;
if ( result [ pos + 1 ] = = ' n ' ) {
result . replace ( pos , 2 , ' \n ' ) ;
} else if ( result [ pos + 1 ] = = ' r ' ) {
result . replace ( pos , 2 , ' \r ' ) ;
} else if ( result [ pos + 1 ] = = ' t ' ) {
result . replace ( pos , 2 , ' \t ' ) ;
} else if ( result [ pos ] = = ' \\ ' ) {
result . remove ( pos , 1 ) ; // Take care of "\\", "\,", "\;" and other escaped characters I haven't noticed
+ + pos ;
}
}
return result ;
}
TQString SoftwareImporters : : fromTomboy ( TQString tomboy )
{
// The first line is the note title, and we already have it, so we remove it (yes, that's pretty stupid to duplicate it in the content...):
tomboy = tomboy . mid ( tomboy . find ( " \n " ) ) . stripWhiteSpace ( ) ;
// Font styles and decorations:
tomboy . replace ( " <bold> " , " <b> " ) ;
tomboy . replace ( " </bold> " , " </b> " ) ;
tomboy . replace ( " <italic> " , " <i> " ) ;
tomboy . replace ( " </italic> " , " </i> " ) ;
tomboy . replace ( " <strikethrough> " , " <span style='text-decoration: line-through'> " ) ;
tomboy . replace ( " </strikethrough> " , " </span> " ) ;
// Highlight not supported by TQTextEdit:
tomboy . replace ( " <highlight> " , " <span style='color:#ff0080'> " ) ;
tomboy . replace ( " </highlight> " , " </span> " ) ;
// Font sizes:
tomboy . replace ( " <size:small> " , " <span style='font-size: 7pt'> " ) ;
tomboy . replace ( " </size:small> " , " </span> " ) ;
tomboy . replace ( " <size:large> " , " <span style='font-size: 16pt'> " ) ;
tomboy . replace ( " </size:large> " , " </span> " ) ;
tomboy . replace ( " <size:huge> " , " <span style='font-size: 20pt'> " ) ;
tomboy . replace ( " </size:huge> " , " </span> " ) ;
// Internal links to other notes aren't supported yet by BasKet Note Pads:
tomboy . replace ( " <link:internal> " , " " ) ;
tomboy . replace ( " </link:internal> " , " " ) ;
// In the Tomboy file, new lines are "\n" and not "<br>":
tomboy . replace ( " \n " , " <br> \n " ) ;
// Preserve consecutive spaces:
return " <html><head><meta name= \" qrichtext \" content= \" 1 \" /></head><body> " + tomboy + " </body></html> " ;
}
Note * SoftwareImporters : : insertTitledNote ( Basket * parent , const TQString & title , const TQString & content , TQt : : TextFormat format /* = TQt::PlainText*/ , Note * parentNote /* = 0*/ )
{
Note * nGroup = new Note ( parent ) ;
Note * nTitle = NoteFactory : : createNoteText ( title , parent ) ;
nTitle - > addState ( Tag : : stateForId ( " title " ) ) ;
Note * nContent ;
if ( format = = TQt : : PlainText )
nContent = NoteFactory : : createNoteText ( content , parent ) ;
else
nContent = NoteFactory : : createNoteHtml ( content , parent ) ;
if ( parentNote = = 0 )
parentNote = parent - > firstNote ( ) ; // In the first column!
parent - > insertNote ( nGroup , parentNote , Note : : BottomColumn , TQPoint ( ) , /*animate=*/ false ) ;
parent - > insertNote ( nTitle , nGroup , Note : : BottomColumn , TQPoint ( ) , /*animate=*/ false ) ;
parent - > insertNote ( nContent , nTitle , Note : : BottomInsert , TQPoint ( ) , /*animate=*/ false ) ;
return nGroup ;
}
void SoftwareImporters : : finishImport ( Basket * basket )
{
// Unselect the last inserted group:
basket - > unselectAll ( ) ;
// Focus the FIRST note (the last inserted note is currently focused!):
basket - > setFocusedNote ( basket - > firstNoteShownInStack ( ) ) ;
// Relayout every notes at theire new place and simulate a load animation (because already loaded just after the creation).
// Without a relayouting, notes on the bottom would comes from the top (because they were inserted on top) and clutter the animation load:
basket - > relayoutNotes ( /*animate=*/ false ) ;
basket - > animateLoad ( ) ;
basket - > save ( ) ;
}
void SoftwareImporters : : importKJots ( )
{
TQString dirPath = locateLocal ( " appdata " , " " ) + " /../kjots/ " ; // I think the assumption is good
TQDir dir ( dirPath , TQString ( ) , TQDir : : Name | TQDir : : IgnoreCase , TQDir : : Files | TQDir : : NoSymLinks ) ;
TQStringList list = dir . entryList ( ) ;
if ( list . isEmpty ( ) )
return ;
BasketFactory : : newBasket ( /*icon=*/ " kjots " , /*name=*/ i18n ( " From KJots " ) , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ 0 ) ;
Basket * kjotsBasket = Global : : bnpView - > currentBasket ( ) ;
for ( TQStringList : : Iterator it = list . begin ( ) ; it ! = list . end ( ) ; + + it ) { // For each file
TQFile file ( dirPath + * it ) ;
if ( file . open ( IO_ReadOnly ) ) {
TQTextStream stream ( & file ) ;
stream . setEncoding ( TQTextStream : : Locale ) ;
TQString buf = stream . readLine ( ) ;
// IT IS A NOTEBOOK FILE, AT THE VERION 0.6.x and older:
if ( ! buf . isNull ( ) & & buf . left ( 9 ) = = " \\ NewEntry " ) {
// First create a basket for it:
BasketFactory : : newBasket ( /*icon=*/ " kjots " , /*name=*/ KURL ( file . name ( ) ) . fileName ( ) , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ kjotsBasket ) ;
Basket * basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
TQString title , body ;
bool haveAnEntry = false ;
while ( 1 ) {
if ( buf . left ( 9 ) = = " \\ NewEntry " ) {
if ( haveAnEntry ) // Do not add note the first time
insertTitledNote ( basket , title , Tools : : stripEndWhiteSpaces ( body ) ) ;
title = buf . mid ( 10 , buf . length ( ) ) ; // Problem : basket will be saved
body = " " ; // New note will then be created // EACH time a note is imported
haveAnEntry = true ;
} else if ( buf . left ( 3 ) ! = " \\ ID " ) { // Don't care of the ID
// Remove escaped '\' characters and append the text to the body
int pos = 0 ;
while ( ( pos = buf . find ( ' \\ ' , pos ) ) ! = - 1 )
if ( buf [ + + pos ] = = ' \\ ' )
buf . remove ( pos , 1 ) ;
body . append ( buf + " \n " ) ;
}
buf = stream . readLine ( ) ;
if ( buf . isNull ( ) ) // OEF
break ;
}
// Add the ending note (there isn't any other "\\NewEntry" to do it):
if ( haveAnEntry )
insertTitledNote ( basket , title , Tools : : stripEndWhiteSpaces ( body ) ) ;
finishImport ( basket ) ;
// IT IS A NOTEBOOK XML FILE, AT THE VERION 0.7.0 and later:
} else if ( ( * it ) . endsWith ( " .book " ) /*&& !buf.isNull() && (buf.left(2) == "<!" / *<!DOCTYPE...* / || buf.left(2) == "<?" / *<?xml...* /)*/ ) {
TQDomDocument * doc = XMLWork : : openFile ( " KJots " , dirPath + * it ) ;
if ( doc = = 0 )
continue ;
TQString bookTitle = XMLWork : : getElementText ( doc - > documentElement ( ) , " KJotsBook/Title " ) ;
// First create a basket for it:
BasketFactory : : newBasket ( /*icon=*/ " kjots " , /*name=*/ bookTitle , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ kjotsBasket ) ;
Basket * basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
TQDomElement docElem = XMLWork : : getElement ( doc - > documentElement ( ) , " KJotsBook " ) ;
for ( TQDomNode n = docElem . firstChild ( ) ; ! n . isNull ( ) ; n = n . nextSibling ( ) ) {
TQDomElement e = n . toElement ( ) ;
if ( ( ! e . isNull ( ) ) & & e . tagName ( ) = = " KJotsPage " )
insertTitledNote ( basket , XMLWork : : getElementText ( e , " Title " ) , XMLWork : : getElementText ( e , " Text " ) ) ;
}
finishImport ( basket ) ;
}
file . close ( ) ;
}
}
}
void SoftwareImporters : : importKNotes ( )
{
TQString dirPath = locateLocal ( " appdata " , " " ) + " /../knotes/ " ; // I thing the assumption is good
TQDir dir ( dirPath , TQString ( ) , TQDir : : Name | TQDir : : IgnoreCase , TQDir : : Files | TQDir : : NoSymLinks ) ;
TQStringList list = dir . entryList ( ) ;
for ( TQStringList : : Iterator it = list . begin ( ) ; it ! = list . end ( ) ; + + it ) { // For each file
if ( ! ( * it ) . endsWith ( " .ics " ) ) // Don't process *.ics~ and otehr files
continue ;
TQFile file ( dirPath + * it ) ;
if ( file . open ( IO_ReadOnly ) ) {
TQTextStream stream ( & file ) ;
stream . setEncoding ( TQTextStream : : UnicodeUTF8 ) ;
// First create a basket for it:
BasketFactory : : newBasket ( /*icon=*/ " knotes " , /*name=*/ i18n ( " From KNotes " ) , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ 0 ) ;
Basket * basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
bool inVJournal = false ;
bool inDescription = false ;
bool isRichText = false ;
TQString title , body ;
TQString buf ;
while ( 1 ) {
buf = stream . readLine ( ) ;
if ( buf . isNull ( ) ) // OEF
break ;
if ( ! buf . isNull ( ) & & buf = = " BEGIN:VJOURNAL " ) {
inVJournal = true ;
} else if ( inVJournal & & buf . startsWith ( " SUMMARY: " ) ) {
title = buf . mid ( 8 , buf . length ( ) ) ;
} else if ( inVJournal & & buf . startsWith ( " DESCRIPTION: " ) ) {
body = buf . mid ( 12 , buf . length ( ) ) ;
inDescription = true ;
} else if ( inDescription & & buf . startsWith ( " " ) ) {
body + = buf . mid ( 1 , buf . length ( ) ) ;
} else if ( buf . startsWith ( " X-TDE-KNotes-RichText: " ) ) {
isRichText = XMLWork : : trueOrFalse ( buf . mid ( 22 , buf . length ( ) - 22 ) . stripWhiteSpace ( ) , " false " ) ;
} else if ( buf = = " END:VJOURNAL " ) {
insertTitledNote ( basket , fromICS ( title ) , fromICS ( body ) , ( isRichText ? TQt : : RichText : TQt : : PlainText ) ) ;
inVJournal = false ;
inDescription = false ;
isRichText = false ;
title = " " ;
body = " " ;
} else
inDescription = false ;
}
// Bouh : duplicate code
// In case of unvalide ICAL file!
if ( ! body . isEmpty ( ) ) // Add the ending note
insertTitledNote ( basket , fromICS ( title ) , fromICS ( body ) , ( isRichText ? TQt : : RichText : TQt : : PlainText ) ) ;
file . close ( ) ;
finishImport ( basket ) ;
}
}
}
void SoftwareImporters : : importStickyNotes ( )
{
// Sticky Notes file is usually located in ~/.gnome2/stickynotes_applet
// We will search all directories in "~/" that contain "gnome" in the name,
// and will search for "stickynotes_applet" file (that should be XML file with <stickynotes> root.
TQDir dir ( TQDir : : home ( ) . absPath ( ) , TQString ( ) , TQDir : : Name | TQDir : : IgnoreCase ,
TQDir : : Dirs | TQDir : : NoSymLinks | TQDir : : Hidden ) ;
TQStringList founds ;
TQStringList list = dir . entryList ( ) ;
for ( TQStringList : : Iterator it = list . begin ( ) ; it ! = list . end ( ) ; + + it ) { // For each folder
if ( ( * it ) . contains ( " gnome " , false ) ) {
TQString fullPath = TQDir : : home ( ) . absPath ( ) + " / " + ( * it ) + " /stickynotes_applet " ;
if ( dir . exists ( fullPath ) )
founds + = fullPath ;
}
}
for ( TQStringList : : Iterator it = founds . begin ( ) ; it ! = founds . end ( ) ; + + it ) { // For each file
TQFile file ( * it ) ;
TQDomDocument * doc = XMLWork : : openFile ( " stickynotes " , * it ) ;
if ( doc = = 0 )
continue ;
// First create a basket for it:
BasketFactory : : newBasket ( /*icon=*/ " gnome " , /*name=*/ i18n ( " From Sticky Notes " ) , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ 0 ) ;
Basket * basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
TQDomElement docElem = doc - > documentElement ( ) ;
for ( TQDomNode n = docElem . firstChild ( ) ; ! n . isNull ( ) ; n = n . nextSibling ( ) ) {
TQDomElement e = n . toElement ( ) ;
if ( ( ! e . isNull ( ) ) & & e . tagName ( ) = = " note " )
insertTitledNote ( basket , e . attribute ( " title " ) , e . text ( ) ) ;
}
finishImport ( basket ) ;
}
}
// TODO: FIXME: Code duplicated from notecontent.cpp but with UTF-8 encoding.
// TODO: FIXME: Later, merge!
TQString loadUtf8FileToString ( const TQString & fileName )
{
TQFile file ( fileName ) ;
if ( file . open ( IO_ReadOnly ) ) {
TQTextStream stream ( & file ) ;
stream . setEncoding ( TQTextStream : : UnicodeUTF8 ) ;
TQString text ;
text = stream . read ( ) ;
file . close ( ) ;
return text ;
} else
return " " ;
}
void SoftwareImporters : : importTomboy ( )
{
TQString dirPath = TQDir : : home ( ) . absPath ( ) + " /.tomboy/ " ; // I thing the assumption is good
TQDir dir ( dirPath , TQString ( ) , TQDir : : Name | TQDir : : IgnoreCase , TQDir : : Files | TQDir : : NoSymLinks ) ;
Basket * basket = 0 ; // Create the basket ONLY if we found at least one note to add!
TQStringList list = dir . entryList ( ) ;
for ( TQStringList : : Iterator it = list . begin ( ) ; it ! = list . end ( ) ; + + it ) { // For each file
if ( ! ( * it ) . endsWith ( " .note " ) )
continue ;
TQDomDocument * doc = XMLWork : : openFile ( " note " , dirPath + * it ) ;
if ( doc = = 0 )
continue ;
if ( basket = = 0 ) {
// First create a basket for it:
BasketFactory : : newBasket ( /*icon=*/ " tomboy " , /*name=*/ i18n ( " From Tomboy " ) , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ 0 ) ;
basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
}
TQDomElement docElem = doc - > documentElement ( ) ;
TQString title = XMLWork : : getElementText ( docElem , " title " ) ;
// DOES NOT REALLY WORKS:
//TQDomElement contentElement = XMLWork::getElement(docElem, "text/note-content");
//TQString content = XMLWork::innerXml(contentElement);
// Isolate "<note-content version="0.1">CONTENT</note-content>"!
TQString xml = loadUtf8FileToString ( dirPath + * it ) ;
xml = xml . mid ( xml . find ( " <note-content " ) ) ;
xml = xml . mid ( xml . find ( " > " ) + 1 ) ;
xml = xml . mid ( 0 , xml . find ( " </note-content> " ) ) ;
if ( ! title . isEmpty ( ) & & ! /*content*/ xml . isEmpty ( ) )
insertTitledNote ( basket , title , fromTomboy ( xml /*content*/ ) , TQt : : RichText ) ;
}
if ( basket )
finishImport ( basket ) ;
}
void SoftwareImporters : : importTextFile ( )
{
TQString fileName = KFileDialog : : getOpenFileName ( " :ImportTextFile " , " *|All files " ) ;
if ( fileName . isEmpty ( ) )
return ;
TextFileImportDialog dialog ;
if ( dialog . exec ( ) = = TQDialog : : Rejected )
return ;
TQString separator = dialog . separator ( ) ;
TQFile file ( fileName ) ;
if ( file . open ( IO_ReadOnly ) ) {
TQTextStream stream ( & file ) ;
stream . setEncoding ( TQTextStream : : Locale ) ;
TQString content = stream . read ( ) ;
TQStringList list = ( separator . isEmpty ( )
? TQStringList ( content )
: TQStringList : : split ( separator , content , /*allowEmptyEntries=*/ false )
) ;
// First create a basket for it:
TQString title = i18n ( " From TextFile.txt " , " From %1 " ) . arg ( KURL ( fileName ) . fileName ( ) ) ;
BasketFactory : : newBasket ( /*icon=*/ " txt " , title , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , /*createIn=*/ 0 ) ;
Basket * basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
// Import every notes:
for ( TQStringList : : Iterator it = list . begin ( ) ; it ! = list . end ( ) ; + + it ) {
Note * note = NoteFactory : : createNoteFromText ( ( * it ) . stripWhiteSpace ( ) , basket ) ;
basket - > insertNote ( note , basket - > firstNote ( ) , Note : : BottomColumn , TQPoint ( ) , /*animate=*/ false ) ;
}
// Finish the export:
finishImport ( basket ) ;
}
}
/** @author Petri Damsten <petri.damsten@iki.fi>
*/
void SoftwareImporters : : importKnowIt ( )
{
KURL url = KFileDialog : : getOpenURL ( " :ImportKnowIt " ,
" *.kno|KnowIt files \n *|All files " ) ;
if ( ! url . isEmpty ( ) )
{
TQFile file ( url . path ( ) ) ;
TQFileInfo info ( url . path ( ) ) ;
Basket * basket = 0 ;
TQPtrStack < Basket > baskets ;
TQString text ;
int hierarchy = 0 ;
TreeImportDialog dialog ;
if ( dialog . exec ( ) = = TQDialog : : Rejected )
return ;
hierarchy = dialog . choice ( ) ;
BasketFactory : : newBasket ( /*icon=*/ " knowit " ,
/*name=*/ info . baseName ( ) ,
/*backgroundImage=*/ " " ,
/*backgroundColor=*/ TQColor ( ) ,
/*textColor=*/ TQColor ( ) ,
/*templateName=*/ " 1column " ,
/*createIn=*/ 0 ) ;
basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
baskets . push ( basket ) ;
if ( file . open ( IO_ReadOnly ) )
{
TQTextStream stream ( & file ) ;
uint level = 0 ;
TQString name ;
TQString line ;
TQStringList links ;
TQStringList descriptions ;
stream . setEncoding ( TQTextStream : : UnicodeUTF8 ) ;
while ( 1 )
{
line = stream . readLine ( ) ;
if ( line . startsWith ( " \\ NewEntry " ) | |
line . startsWith ( " \\ CurrentEntry " ) | | stream . atEnd ( ) )
{
while ( level + 1 < baskets . count ( ) )
baskets . pop ( ) ;
if ( level + 1 > baskets . count ( ) )
baskets . push ( basket ) ;
if ( ! name . isEmpty ( ) )
{
if ( ( level = = 0 & & hierarchy = = 1 ) | |
( hierarchy = = 0 ) )
{
BasketFactory : : newBasket ( /*icon=*/ " knowit " ,
/*name=*/ name ,
/*backgroundImage=*/ " " ,
/*backgroundColor=*/ TQColor ( ) ,
/*textColor=*/ TQColor ( ) ,
/*templateName=*/ " 1column " ,
/*createIn=*/ baskets . top ( ) ) ;
basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
}
if ( ! text . stripWhiteSpace ( ) . isEmpty ( ) | |
hierarchy = = 2 | |
( hierarchy = = 1 & & level > 0 ) )
{
insertTitledNote ( basket , name , text , TQt : : RichText ) ;
}
for ( uint j = 0 ; j < links . count ( ) ; + + j )
{
Note * link ;
if ( descriptions . count ( ) < j + 1 | | descriptions [ j ] . isEmpty ( ) )
link = NoteFactory : : createNoteLink ( links [ j ] , basket ) ;
else
link = NoteFactory : : createNoteLink ( links [ j ] ,
descriptions [ j ] , basket ) ;
basket - > insertCreatedNote ( link ) ;
}
finishImport ( basket ) ;
}
if ( stream . atEnd ( ) )
break ;
int i = line . find ( " Entry " ) + 6 ;
int n = line . find ( ' ' , i ) ;
level = line . mid ( i , n - i ) . toInt ( ) ;
name = line . mid ( n + 1 ) ;
text = " " ;
links . clear ( ) ;
descriptions . clear ( ) ;
}
else if ( line . startsWith ( " \\ Link " ) )
{
links . append ( line . mid ( 6 ) ) ;
}
else if ( line . startsWith ( " \\ Descr " ) )
{
while ( descriptions . count ( ) < links . count ( ) - 1 )
descriptions . append ( " " ) ;
descriptions . append ( line . mid ( 7 ) ) ;
}
else
{
text + = line + " \n " ;
}
}
file . close ( ) ;
}
}
}
void SoftwareImporters : : importTuxCards ( )
{
TQString fileName = KFileDialog : : getOpenFileName ( " :ImportTuxCards " , " *|All files " ) ;
if ( fileName . isEmpty ( ) )
return ;
TreeImportDialog dialog ;
if ( dialog . exec ( ) = = TQDialog : : Rejected )
return ;
int hierarchy = dialog . choice ( ) ;
TQDomDocument * document = XMLWork : : openFile ( " tuxcards_data_file " /*"InformationCollection"*/ , fileName ) ;
if ( document = = 0 ) {
KMessageBox : : error ( 0 , i18n ( " Can not import that file. It is either corrupted or not a TuxCards file. " ) , i18n ( " Bad File Format " ) ) ;
return ;
}
TQDomElement collection = document - > documentElement ( ) ;
int remainingHierarchy = ( hierarchy = = 0 ? 65000 : 3 - hierarchy ) ;
importTuxCardsNode ( collection , /*parentBasket=*/ 0 , /*parentNote=*/ 0 , remainingHierarchy ) ;
}
// TODO: <InformationElement isOpen="true" isEncripted="false"
void SoftwareImporters : : importTuxCardsNode ( const TQDomElement & element , Basket * parentBasket , Note * parentNote , int remainingHierarchy )
{
for ( TQDomNode n = element . firstChild ( ) ; ! n . isNull ( ) ; n = n . nextSibling ( ) ) {
TQDomElement e = n . toElement ( ) ;
if ( e . isNull ( ) | | e . tagName ( ) ! = " InformationElement " ) // Cannot handle that!
continue ;
TQString icon = e . attribute ( " iconFileName " ) ;
TQString name = XMLWork : : getElementText ( e , " Description " ) ;
TQString content = XMLWork : : getElementText ( e , " Information " ) ;
bool isRichText = ( e . attribute ( " informationFormat " ) = = " RTF " ) ;
bool isEncrypted = ( e . attribute ( " isEncripted " ) = = " true " ) ;
if ( icon . isEmpty ( ) | | icon = = " none " )
icon = " tuxcards " ;
Note * nContent ;
if ( isEncrypted ) {
KMessageBox : : information ( 0 , i18n ( " A note is encrypted. The importer does not yet support encrypted notes. Please remove the encryption with TuxCards and re-import the file. " ) , i18n ( " Encrypted Notes not Supported Yet " ) ) ;
isRichText = true ;
content = i18n ( " <font color='red'><b>Encrypted note.</b><br>The importer do not support encrypted notes yet. Please remove the encryption with TuxCards and re-import the file.</font> " ) ;
}
if ( remainingHierarchy > 0 ) {
BasketFactory : : newBasket ( icon , name , /*backgroundImage=*/ " " , /*backgroundColor=*/ TQColor ( ) , /*textColor=*/ TQColor ( ) , /*templateName=*/ " 1column " , parentBasket ) ;
Basket * basket = Global : : bnpView - > currentBasket ( ) ;
basket - > load ( ) ;
if ( isRichText )
nContent = NoteFactory : : createNoteHtml ( content , basket ) ;
else
nContent = NoteFactory : : createNoteText ( content , basket ) ;
basket - > insertNote ( nContent , basket - > firstNote ( ) , Note : : BottomColumn , TQPoint ( ) , /*animate=*/ false ) ;
importTuxCardsNode ( e , basket , 0 , remainingHierarchy - 1 ) ;
finishImport ( basket ) ;
} else {
Note * nGroup = insertTitledNote ( parentBasket , name , content , ( isRichText ? TQt : : RichText : TQt : : PlainText ) , parentNote ) ;
importTuxCardsNode ( e , parentBasket , nGroup , remainingHierarchy - 1 ) ;
}
}
}
# include "softwareimporters.moc"