You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kbibtex/src/documentsourceview.cpp

381 lines
13 KiB

/***************************************************************************
* Copyright (C) 2004-2009 by Thomas Fischer *
* fischer@unix-ag.uni-kl.de *
* *
* 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., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <ntqbuffer.h>
#include <ntqlayout.h>
#include <ntqfile.h>
#include <klibloader.h>
#include <kxmlguifactory.h>
#include <tdeapplication.h>
#include <klibloader.h>
#include <kfinddialog.h>
#include <kdebug.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <ktrader.h>
#include <kmimetype.h>
#include <kservice.h>
#include <kprogress.h>
#include <tdeparts/componentfactory.h>
#include <tdetexteditor/configinterface.h>
#include <tdetexteditor/editorchooser.h>
#include <tdetexteditor/undointerface.h>
#include <fileexporterbibtex.h>
#include <fileimporterbibtex.h>
#include <settings.h>
#include "documentsourceview.h"
namespace KBibTeX
{
DocumentSourceView::DocumentSourceView( KBibTeX::DocumentWidget *docWidget, bool isReadOnly, TQWidget *parent, const char *name )
: TQWidget( parent, name ), m_isReadOnly( isReadOnly ), m_docWidget( docWidget ), m_bibtexFile( NULL ), m_document( NULL ), m_view( NULL ), m_progDlg( NULL )
{
setupGUI();
readConfig();
}
DocumentSourceView::~DocumentSourceView()
{
kapp->config() ->sync();
}
/**
* Copy the selected text to the clipboard
*/
void DocumentSourceView::copy()
{
KTextEditor::ClipboardInterface * clip = dynamic_cast<KTextEditor::ClipboardInterface*>( m_view );
if ( clip )
clip->copy();
}
/**
* Cut the selected text to the clipboard
*/
void DocumentSourceView::cut()
{
KTextEditor::ClipboardInterface * clip = dynamic_cast<KTextEditor::ClipboardInterface*>( m_view );
if ( clip )
clip->cut();
}
/**
* Paste the clipboard's content into the document
*/
bool DocumentSourceView::paste()
{
KTextEditor::ClipboardInterface * clip = dynamic_cast<KTextEditor::ClipboardInterface*>( m_view );
if ( clip )
{
clip->paste();
return TRUE;
}
else
return FALSE;
}
/**
* Paste a line of text into the document at the designated position
*/
void DocumentSourceView::insertLines( const TQString& text, int line )
{
m_editInterface->insertLine( line < 0 ? m_editInterface->numLines() : ( uint ) line, text );
KTextEditor::ViewCursorInterface * cursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>( m_view );
if ( cursorIf )
cursorIf->setCursorPosition( line < 0 ? m_editInterface->numLines() - 1 : ( uint ) line, 0 );
}
void DocumentSourceView::selectAll()
{
KTextEditor::SelectionInterface * selI = dynamic_cast<KTextEditor::SelectionInterface*>( m_view );
if ( selI )
selI->selectAll();
}
void DocumentSourceView::setReadOnly( bool isReadOnly )
{
m_isReadOnly = isReadOnly;
m_document->setReadWrite( !m_isReadOnly );
}
void DocumentSourceView::setFactory( KXMLGUIFactory *factory, KXMLGUIClient * client )
{
KTextEditor::PopupMenuInterface * popupInterface = dynamic_cast<KTextEditor::PopupMenuInterface*>( m_view );
popupInterface->installPopup(( TQPopupMenu* )( factory ->container( "tdetexteditor_popup", client ) ) );
}
void DocumentSourceView::configureEditor()
{
KTextEditor::ConfigInterface * conf = KTextEditor::configInterface( m_document );
if ( !conf )
{
kdDebug() << "*** No KTextEditor::ConfigInterface for part!" << endl;
return ;
}
// show the modal config dialog for this part if it has a ConfigInterface
conf->configDialog();
conf->writeConfig();
}
void DocumentSourceView::undo()
{
KTextEditor::UndoInterface * undoIf = dynamic_cast<KTextEditor::UndoInterface*>( m_document );
if ( undoIf != NULL )
undoIf->undo();
else
kdDebug() << "Cannot determine undo interface" << endl;
}
void DocumentSourceView::find()
{
KFindDialog dlg( TRUE, this );
dlg.setFindHistory( m_findHistory );
dlg.setHasSelection( FALSE );
#if KDE_IS_VERSION(3,4,0)
dlg.setSupportsWholeWordsFind( FALSE );
dlg.setSupportsBackwardsFind( FALSE );
dlg.setSupportsCaseSensitiveFind( FALSE );
dlg.setSupportsRegularExpressionFind( FALSE );
#endif
if ( dlg.exec() == TQDialog::Accepted )
{
m_lastSearchTerm = dlg.pattern();
m_findHistory = dlg.findHistory();
KTextEditor::ViewCursorInterface * cursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>( m_view );
if ( cursorIf )
{
unsigned int fromLine = 0;
unsigned int fromCol = 0;
if ( dlg.options() && KFindDialog::FromCursor )
{
cursorIf->cursorPosition( &fromLine, &fromCol );
fromCol++;
}
search( fromLine, fromCol );
}
else
kdDebug() << "Failed to instantiate ViewCursorInterface, SearchInterface, or SelectionInterface" << endl;
}
}
void DocumentSourceView::findNext()
{
if ( m_lastSearchTerm.isEmpty() )
find();
else
{
KTextEditor::ViewCursorInterface * cursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>( m_view );
if ( cursorIf )
{
unsigned int fromLine = 0;
unsigned int fromCol = 0;
cursorIf->cursorPosition( &fromLine, &fromCol );
search( fromLine, fromCol );
}
else
kdDebug() << "Failed to instantiate ViewCursorInterface, SearchInterface, or SelectionInterface" << endl;
}
}
bool DocumentSourceView::setBibTeXFile( BibTeX::File *bibtexFile )
{
Settings * settings = Settings::self();
bool result = FALSE;
m_progDlg = new KProgressDialog( this, NULL, i18n( "Source View" ), i18n( "Converting BibTeX document to plain text ..." ), true );
m_progDlg->setAllowCancel( false );
kapp->processEvents();
TQBuffer buffer;
buffer.open( IO_WriteOnly );
BibTeX::FileExporterBibTeX * exporter = new BibTeX::FileExporterBibTeX();
connect( exporter, SIGNAL( progress( int, int ) ), this, SLOT( updateProgress( int, int ) ) );
exporter->setStringDelimiter( settings->fileIO_BibtexStringOpenDelimiter, settings->fileIO_BibtexStringCloseDelimiter );
exporter->setKeywordCasing( settings->fileIO_KeywordCasing );
exporter->setEncoding( "latex" );
exporter->setEnclosingCurlyBrackets( settings->fileIO_EnclosingCurlyBrackets );
result = exporter->save( &buffer, bibtexFile );
delete exporter;
buffer.close();
if ( result )
{
kapp->processEvents();
buffer.open( IO_ReadOnly );
TQTextStream in( &buffer );
in.setEncoding( TQTextStream::UnicodeUTF8 );
TQString text = in.read();
buffer.close();
if ( m_editInterface )
{
kapp->processEvents();
// very strange: to set the text, you have to set
// readwrite to TRUE...
m_document->setReadWrite( TRUE );
m_editInterface->setText( text );
m_document->setReadWrite( !m_isReadOnly );
}
m_bibtexFile = bibtexFile;
}
kapp->processEvents();
delete m_progDlg;
return result;
}
BibTeX::File* DocumentSourceView::getBibTeXFile()
{
if ( m_editInterface )
{
TQBuffer buffer;
buffer.open( IO_WriteOnly );
TQTextStream stream( &buffer );
stream.setEncoding( TQTextStream::UnicodeUTF8 );
stream << m_editInterface->text();
buffer.close();
Settings * settings = Settings::self( m_bibtexFile );
buffer.open( IO_ReadOnly );
BibTeX::FileImporter *importer = new BibTeX::FileImporterBibTeX( settings->editing_FirstNameFirst );
BibTeX::File *result = importer->load( &buffer );
delete importer;
buffer.close();
return result;
}
return NULL;
}
void DocumentSourceView::focusInEvent( TQFocusEvent* /*event*/ )
{
if ( m_view != NULL )
m_view->setFocus();
}
void DocumentSourceView::setupGUI()
{
// create the Kate::Document
m_document = Kate::createDocument( this, "Kate::Document" );
m_view = ( Kate::View * ) m_document->createView( this, 0L );
m_editInterface = editInterface( m_document );
m_document->setReadWrite( !m_isReadOnly );
if ( !m_isReadOnly )
connect( m_document, SIGNAL( textChanged() ), this, SIGNAL( modified() ) );
TQBoxLayout * layout = new TQVBoxLayout( this );
layout->addWidget( static_cast<TQWidget*>( m_view ) );
int c = m_document->hlModeCount() ;
int hlIdx = -1;
for ( int i = 0; i < c; i++ )
if ( m_document->hlModeName( i ) .compare( "BibTeX" ) == 0 )
{
hlIdx = i;
break;
}
if ( hlIdx > -1 )
m_document-> setHlMode( hlIdx );
}
void DocumentSourceView::readConfig()
{
TDEConfig * config = kapp->config();
readConfig( config );
}
void DocumentSourceView::writeConfig()
{
TDEConfig * config = kapp->config();
writeConfig( config );
}
void DocumentSourceView::readConfig( TDEConfig *config )
{
if ( m_view )
{
KTextEditor::ConfigInterface * conf = KTextEditor::configInterface( m_document );
if ( conf )
conf->readConfig( config );
}
}
void DocumentSourceView::writeConfig( TDEConfig *config )
{
if ( m_view )
{
KTextEditor::ConfigInterface * conf = KTextEditor::configInterface( m_document );
if ( conf )
conf->writeConfig( config );
}
config->sync();
}
void DocumentSourceView::search( int fromLine, int fromCol )
{
unsigned int foundAtLine, foundAtCol, matchLen;
KTextEditor::SearchInterface * searchIf = KTextEditor::searchInterface( m_document );
KTextEditor::SelectionInterface *selectionIf = KTextEditor::selectionInterface( m_document );
KTextEditor::ViewCursorInterface * cursorIf = dynamic_cast<KTextEditor::ViewCursorInterface*>( m_view );
do
{
bool result = searchIf->searchText( fromLine, fromCol, m_lastSearchTerm, &foundAtLine, &foundAtCol, &matchLen, FALSE );
if ( result )
{
selectionIf->setSelection( foundAtLine, foundAtCol, foundAtLine, foundAtCol + matchLen );
cursorIf->setCursorPositionReal( foundAtLine, foundAtCol + matchLen );
break;
}
fromLine = 0;
fromCol = 0;
}
while ( KMessageBox::questionYesNo( this, TQString( i18n( "Could not find text '%1' in the document.\nStart from the beginning?" ) ).arg( m_lastSearchTerm ), i18n( "Find text in source view" ), KGuiItem( i18n( "Restart search" ) ) ) == KMessageBox::Yes );
}
void DocumentSourceView::updateProgress( int current, int total )
{
m_progDlg->progressBar()->setTotalSteps( total );
m_progDlg->progressBar()->setValue( current );
kapp->processEvents();
}
}
#include "documentsourceview.moc"