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/kbibtexshell.cpp

388 lines
12 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 <ntqprocess.h>
#include <kkeydialog.h>
#include <kencodingfiledialog.h>
#include <tdeconfig.h>
#include <kurl.h>
#include <tdeactionclasses.h>
#include <kedittoolbar.h>
#include <kdebug.h>
#include <tdeaction.h>
#include <kstdaction.h>
#include <tdeio/netaccess.h>
#include <klibloader.h>
#include <tdemessagebox.h>
#include <kstatusbar.h>
#include <tdelocale.h>
#include <kbibtex_part.h>
#include "kbibtexshell.h"
KBibTeXShell::KBibTeXShell( TQWidget* parentWidget, const char* name )
: KParts::MainWindow( parentWidget, name ), m_part( NULL ), m_parentWidget( parentWidget )
{
// set the shell's ui resource file
setXMLFile( "kbibtex_shell.rc" );
// then, setup our actions
setupActions();
// and a status bar
statusBar() ->show();
// this routine will find and load our Part. it finds the Part by
// name which is a bad idea usually.. but it's alright in this
// case since our Part is made for this Shell
KLibFactory *factory = KLibLoader::self() ->factory( "libkbibtexpart" );
if ( factory )
{
// now that the Part is loaded, we cast it to a Part to get
// our hands on it
m_part = static_cast<KParts::ReadWritePart *>( factory->create( this, "kbibtex_part", "KParts::ReadWritePart" ) );
if ( m_part )
{
// tell the KParts::MainWindow that this is indeed the main widget
setCentralWidget( m_part->widget() );
// and integrate the part's GUI with the shell's
createGUI( m_part );
}
}
else
{
// if we couldn't find our Part, we exit since the Shell by
// itself can't do anything useful
KMessageBox::error( this, i18n( "Could not find our part!" ) );
kapp->quit();
// we return here, cause kapp->quit() only means "exit the
// next time we enter the event loop...
return ;
}
// apply the saved mainwindow settings, if any, and ask the mainwindow
// to automatically save settings if changed: window size, toolbar
// position, icon size, etc.
setAutoSaveSettings();
readConfig();
#ifdef HAVE_YAZ
kdDebug() << "Using YAZ to access Z39.50 databases" << endl;
#else // HAVE_YAZ
kdDebug() << "YAZ not linked to KBibTeX. No access to Z39.50 databases possible" << endl;
#endif // HAVE_YAZ
}
KBibTeXShell::~KBibTeXShell()
{
// nothing
}
bool KBibTeXShell::openURL( const KURL& url )
{
if ( url.isEmpty() )
return false;
// About this function, the style guide (
// http://developer.kde.org/documentation/standards/kde/style/basics/index.html )
// says that it should open a new window if the document is _not_
// in its initial state. This is what we do here.
// If there is no part yet created, create new one...
if ( m_part->url().isEmpty() && !m_part->isModified() )
{
if ( !m_part->openURL( url ) )
return FALSE;
}
else
{
KBibTeXShell *shell = new KBibTeXShell();
if ( !shell->part() ->openURL( url ) )
return FALSE;
else
initializePart( shell->part() );
shell->show();
}
m_recentFiles->addURL( url );
return TRUE;
}
KParts::ReadWritePart * KBibTeXShell::part()
{
return m_part;
}
void KBibTeXShell::readConfig( TDEConfig *config )
{
config->setGroup( "Session" );
m_recentFiles->loadEntries( config );
m_recentFiles->setEnabled( true ); // force enabling
m_recentFiles->setToolTip( i18n( "Click to open a file\nClick and hold to open a recent file" ) );
}
void KBibTeXShell::writeConfig( TDEConfig *config )
{
config->setGroup( "Session" );
m_recentFiles->saveEntries( config );
config->sync();
}
void KBibTeXShell::readConfig()
{
TDEConfig * config = kapp->config();
readConfig( config );
}
void KBibTeXShell::writeConfig()
{
TDEConfig * config = kapp->config();
writeConfig( config );
}
TQString KBibTeXShell::encoding()
{
return "utf8";
}
void KBibTeXShell::slotAddRecentURL( const KURL&url )
{
m_recentFiles->addURL( url );
}
void KBibTeXShell::setupActions()
{
TDEAction * action;
action = KStdAction::openNew( this, SLOT( slotFileNew() ), actionCollection() );
action ->setToolTip( i18n( "Create a new window for a new BibTeX file" ) );
TDEAction *actionOpen = KStdAction::open( this, SLOT( slotFileOpen() ), actionCollection() );
actionOpen->setToolTip( i18n( "Open an existing BibTeX file" ) );
m_recentFiles = KStdAction::openRecent( this, SLOT( slotFileOpen( const KURL& ) ), actionCollection() );
m_recentFiles->setWhatsThis( i18n( "This lists files which you have opened recently, and allows you to easily open them again." ) );
connect( m_recentFiles, SIGNAL( activated() ), actionOpen, SLOT( activate() ) );
action = KStdAction::close( this, SLOT( slotFileClose() ), actionCollection() );
action->setToolTip( i18n( "Close this KBibTeX window" ) );
// action = KStdAction::quit( kapp, SLOT( closeAllWindows() ), actionCollection() );
// action->setToolTip( i18n( "Close all windows and quit KBibTeX" ) );
m_statusbarAction = KStdAction::showStatusbar( this, SLOT( optionsShowStatusbar() ), actionCollection() );
m_statusbarAction->setToolTip( i18n( "Show or hide the window's status bar" ) );
KStdAction::keyBindings( this, SLOT( optionsConfigureKeys() ), actionCollection() ) ->setToolTip( i18n( "Configure key bindings for KBibTeX" ) );
KStdAction::configureToolbars( this, SLOT( optionsConfigureToolbars() ), actionCollection() ) ->setToolTip( i18n( "Configure the tool bar for KBibTeX" ) );
connect( actionCollection(), SIGNAL( actionStatusText( const TQString & ) ), this, SLOT( slotActionStatusText( const TQString & ) ) );
connect( actionCollection(), SIGNAL( clearStatusText( ) ), statusBar(), SLOT( clear() ) );
}
void KBibTeXShell::slotActionStatusText( const TQString &text )
{
KStatusBar * stb = statusBar();
if ( stb )
stb->message( text );
}
void KBibTeXShell::saveProperties( TDEConfig* /*config*/ )
{
// the 'config' object points to the session managed
// config file. anything you write here will be available
// later when this app is restored
}
void KBibTeXShell::readProperties( TDEConfig* /*config*/ )
{
// the 'config' object points to the session managed
// config file. this function is automatically called whenever
// the app is being restored. read in here whatever you wrote
// in 'saveProperties'
}
void KBibTeXShell::optionsShowStatusbar()
{
// this is all very cut and paste code for showing/hiding the
// statusbar
if ( m_statusbarAction->isChecked() )
statusBar() ->show();
else
statusBar() ->hide();
}
void KBibTeXShell::optionsConfigureKeys()
{
KKeyDialog dlg( false, this );
TQPtrList<KXMLGUIClient> clients = guiFactory()->clients();
for ( TQPtrListIterator<KXMLGUIClient> it( clients ); it.current(); ++it )
{
dlg.insert(( *it )->actionCollection() );
}
dlg.configure();
}
void KBibTeXShell::optionsConfigureToolbars()
{
#if defined(TDE_MAKE_VERSION)
# if TDE_VERSION >= TDE_MAKE_VERSION(3,1,0)
saveMainWindowSettings( TDEGlobal::config(), autoSaveGroup() );
# else
saveMainWindowSettings( TDEGlobal::config() );
# endif
#else
saveMainWindowSettings( TDEGlobal::config() );
#endif
// use the standard toolbar editor
KEditToolbar dlg( factory() );
connect( &dlg, SIGNAL( newToolbarConfig() ),
this, SLOT( applyNewToolbarConfig() ) );
dlg.exec();
}
void KBibTeXShell::applyNewToolbarConfig()
{
#if defined(TDE_MAKE_VERSION)
# if TDE_VERSION >= TDE_MAKE_VERSION(3,1,0)
applyMainWindowSettings( TDEGlobal::config(), autoSaveGroup() );
# else
applyMainWindowSettings( TDEGlobal::config() );
# endif
#else
applyMainWindowSettings( TDEGlobal::config() );
#endif
}
bool KBibTeXShell::queryClose()
{
if ( m_part && !m_part ->closeURL() )
return FALSE;
writeConfig();
return KParts::MainWindow::queryClose();
}
void KBibTeXShell::slotFileNew()
{
// this slot is called whenever the File->New menu is selected,
// the New shortcut is pressed (usually CTRL+N) or the New toolbar
// button is clicked
// About this function, the style guide (
// http://developer.kde.org/documentation/standards/kde/style/basics/index.html )
// says that it should open a new window if the document is _not_
// in its initial state. This is what we do here..
if ( ! m_part->url().isEmpty() || m_part->isModified() )
{
( new KBibTeXShell() ) ->show();
};
}
/**
* Show a file open dialog where a user can select one or several
* files for opening.
*/
void KBibTeXShell::slotFileOpen()
{
bool bibUtilsAvailable = checkExternalToolAvailable( "xml2bib" ) && checkExternalToolAvailable( "end2xml" );
TQString startDir = ! m_part->url().isEmpty() ? m_part->url().url() : TQDir::currentDirPath();
KURL mergeURL = KFileDialog::getOpenURL( startDir, TQString( "*.bib *.ris" ) +
( bibUtilsAvailable ? " *.xml *.ref *.refer *.rfr *.txt *.isi *.cgi" : "" ) + "|" + i18n( "Supported Bibliographies" ) + "\n*.bib|" + i18n( "BibTeX (*.bib)" ) + "\n*.ris|" + i18n( "Reference Manager (*.ris)" ) + ( bibUtilsAvailable ? "\n*.ref *.refer *.rfr *.txt|" + i18n( "EndNote (Refer format) (*.ref *.refer *.rfr *.txt)" ) + "\n*.isi *.cgi|" + i18n( "ISI Web of Knowledge (*.isi *.cgi)" ) + "\n*.xml|" + i18n( "MODS or EndNote XML (*.xml)" ) : "" ) + "\n*|" + i18n( "All files (*.*)" )
, widget() );
slotFileOpen( mergeURL );
}
/**
* Open a given url in a new window.
*/
void KBibTeXShell::slotFileOpen( const KURL& url )
{
if ( url.isEmpty() ) return ;
if ( !TDEIO::NetAccess::exists( url, TRUE, this ) )
{
m_recentFiles->removeURL( url );
KMessageBox::error( this, i18n( "The given file could not be read, check if it exists or if it is readable for the current user." ) );
return ;
}
if ( m_part->url().isEmpty() && !m_part->isModified() )
// we open the file in this window...
openURL( url );
else
{
// we open the file in a new window...
KBibTeXShell * shell = new KBibTeXShell();
if ( shell->openURL( url ) )
{
initializePart( shell->part() );
shell->show();
}
else
{
KMessageBox::error( this, i18n( "Could not open file '%1'." ).arg( url.path() ) );
}
}
}
/**
* Close currrent window
*/
void KBibTeXShell::slotFileClose()
{
close();
}
void KBibTeXShell::initializePart( KParts::ReadWritePart* part )
{
if ( part )
{
connect( static_cast<KBibTeXPart*>( part ), SIGNAL( signalAddRecentURL( const KURL & ) ), this, SLOT( slotAddRecentURL( const KURL& ) ) );
}
}
bool KBibTeXShell::checkExternalToolAvailable( const TQString &binary )
{
TQProcess *process = new TQProcess( binary );
bool ok = process->start();
ok &= process->normalExit();
if ( process->isRunning() )
{
process->kill();
ok = true;
}
delete process;
return ok;
}
#include "kbibtexshell.moc"