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.
kile/src/kile/userhelpdialog.cpp

468 lines
13 KiB

/***************************************************************************
userhelpdialog.cpp
----------------------------------------------------------------------------
date : Jul 22 2005
version : 0.20
copyright : (C) 2005 by Holger Danielsson
email : holger.danielsson@t-online.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. *
* *
***************************************************************************/
#include "userhelpdialog.h"
#include <tqlayout.h>
#include <tqvgroupbox.h>
#include <tqlabel.h>
#include <tqinputdialog.h>
#include <tqfileinfo.h>
#include <tqwhatsthis.h>
#include <tdelocale.h>
#include <tdefiledialog.h>
#include <kiconloader.h>
#include <tdemessagebox.h>
#include <krun.h>
#include <kurl.h>
#include "kiledebug.h"
namespace KileDialog
{
//////////////////// UserHelpDialog ////////////////////
//BEGIN UserHelpDialog
UserHelpDialog::UserHelpDialog(TQWidget *parent, const char *name)
: KDialogBase( parent, name, true, i18n("Configure User Help"), Cancel | Ok, Ok, true )
{
KILE_DEBUG() << "==UserHelpDialog::UserHelpDialog()===================" << endl;
TQWidget *page = new TQWidget(this);
setMainWidget(page);
// layout
TQVBoxLayout *vbox = new TQVBoxLayout(page, 6,6 );
TQVGroupBox* group= new TQVGroupBox(i18n("User Help"),page );
TQWidget *widget = new TQWidget(group);
TQGridLayout *grid = new TQGridLayout( widget, 5,3, 5,5, "" );
grid->setRowStretch(1,1);
grid->setColStretch(0,1);
grid->setRowSpacing(2,12);
grid->setColSpacing(1,20);
// listbox
TQLabel *label1 = new TQLabel(i18n("&Menu item:"),widget);
grid->addWidget( label1,0,0 );
m_menulistbox = new TDEListBox(widget);
grid->addWidget( m_menulistbox, 1,0 );
label1->setBuddy(m_menulistbox);
// action widget
TQWidget *actionwidget = new TQWidget(widget);
TQVBoxLayout *actions = new TQVBoxLayout(actionwidget);
m_add = new KPushButton(i18n("&Add..."),actionwidget);
m_remove = new KPushButton(i18n("&Remove"),actionwidget);
m_addsep = new KPushButton(i18n("&Separator"),actionwidget);
m_up = new KPushButton(i18n("Move &Up"),actionwidget);
m_down = new KPushButton(i18n("Move &Down"),actionwidget);
int wmax = m_add->sizeHint().width();
int w = m_remove->sizeHint().width();
if ( w > wmax ) wmax = w;
w = m_addsep->sizeHint().width();
if ( w > wmax ) wmax = w;
w = m_up->sizeHint().width();
if ( w > wmax ) wmax = w;
w = m_down->sizeHint().width();
if ( w > wmax ) wmax = w;
m_add->setFixedWidth(wmax);
m_remove->setFixedWidth(wmax);
m_addsep->setFixedWidth(wmax);
m_up->setFixedWidth(wmax);
m_down->setFixedWidth(wmax);
actions->addStretch(1);
actions->addWidget(m_add);
actions->addWidget(m_remove);
actions->addSpacing(20);
actions->addWidget(m_addsep);
actions->addSpacing(20);
actions->addWidget(m_up);
actions->addWidget(m_down);
actions->addStretch(1);
// inserta ction widget
grid->addWidget( actionwidget,1,2, TQt::AlignTop );
// file
TQLabel *label2 = new TQLabel(i18n("File:"),widget);
grid->addWidget( label2, 3,0 );
m_fileedit = new KLineEdit("",widget);
m_fileedit->setReadOnly(true);
grid->addMultiCellWidget( m_fileedit, 4,4,0,2 );
// fill vbox
vbox->addWidget(group);
connect( m_menulistbox, TQ_SIGNAL(highlighted(int)),this,TQ_SLOT(slotChange(int)));
connect( m_add, TQ_SIGNAL(clicked()), TQ_SLOT(slotAdd()) );
connect( m_remove, TQ_SIGNAL(clicked()), TQ_SLOT(slotRemove()) );
connect( m_addsep, TQ_SIGNAL(clicked()), TQ_SLOT(slotAddSep()) );
connect( m_up, TQ_SIGNAL(clicked()), TQ_SLOT(slotUp()) );
connect( m_down, TQ_SIGNAL(clicked()), TQ_SLOT(slotDown()) );
resize(400,sizeHint().height());
updateButton();
}
void UserHelpDialog::setParameter(const TQStringList &menuentries, const TQStringList &helpfiles)
{
for (uint i=0; i<menuentries.count(); ++i)
{
m_menulistbox->insertItem(menuentries[i]);
if ( m_menulistbox->text(i) != "-" )
m_filelist << helpfiles[i];
else
m_filelist << TQString() ;
}
updateButton();
}
void UserHelpDialog::getParameter(TQStringList &userhelpmenulist, TQStringList &userhelpfilelist)
{
// clear result
userhelpmenulist.clear();
userhelpfilelist.clear();
bool separator = false;
// now get all entries
for (uint i=0; i<m_menulistbox->count(); ++i)
{
if ( m_menulistbox->text(i) != "-" )
{
userhelpmenulist << m_menulistbox->text(i);
userhelpfilelist << m_filelist[i];
separator = false;
}
else if ( !separator )
{
userhelpmenulist << m_menulistbox->text(i);
userhelpfilelist << TQString();
separator = true;
}
}
}
void UserHelpDialog::slotChange(int index)
{
if ( index >= 0 )
{
m_fileedit->setText( m_filelist[index] );
}
else
{
m_fileedit->clear();
}
updateButton();
}
void UserHelpDialog::slotAdd()
{
KileDialog::UserHelpAddDialog *dialog = new KileDialog::UserHelpAddDialog(m_menulistbox,this);
if ( dialog->exec() )
{
// insert into listbox
m_menulistbox->insertItem( dialog->getMenuitem() );
m_menulistbox->setCurrentItem( m_menulistbox->count()-1 );
// with corresponding filename
TQString helpfile = dialog->getHelpfile();
m_filelist.append(helpfile);
m_fileedit->setText(helpfile);
updateButton();
}
}
void UserHelpDialog::slotRemove()
{
// get current index
int index = m_menulistbox->currentItem();
if ( index >= 0 )
{
// remove item
m_menulistbox->removeItem(index);
m_filelist.remove( m_filelist.at(index) );
// select a new index: first we try to take the old index. When
// this index is too big now, index is decremented.
// If the list is empty now, index is set to -1.
int entries = (int)m_menulistbox->count();
if ( entries > 0 )
{
if ( index >= entries )
index--;
m_menulistbox->setSelected(index,true);
}
else
{
m_menulistbox->setCurrentItem(-1);
}
}
updateButton();
}
void UserHelpDialog::slotAddSep()
{
// get current index
int index = m_menulistbox->currentItem();
if ( index == -1 ) return;
// insert separator
m_menulistbox->insertItem("-",index);
m_filelist.insert( m_filelist.at(index) ,TQString() );
updateButton();
}
void UserHelpDialog::slotUp()
{
// get current index
int index = m_menulistbox->currentItem();
if ( index <= 0 ) return;
// insert current entry before current
m_menulistbox->insertItem(m_menulistbox->currentText(),index-1);
m_filelist.insert( m_filelist.at(index-1) , m_filelist[index] );
// then remove the old entry
m_menulistbox->removeItem(index+1);
m_filelist.remove( m_filelist.at(index+1) );
// select current entry
m_menulistbox->setSelected(index-1,true);
updateButton();
}
void UserHelpDialog::slotDown()
{
int entries = (int)m_menulistbox->count();
// get current index
int index = m_menulistbox->currentItem();
if ( index<0 || index==entries-1 ) return;
// insert current entry after current
if ( index < entries-2 )
{
m_menulistbox->insertItem(m_menulistbox->currentText(),index+2); // index + 2
m_filelist.insert( m_filelist.at(index+2) , m_filelist[index] );
}
else
{
m_menulistbox->insertItem(m_menulistbox->currentText()); // at the end
m_filelist.append( m_filelist[index] );
}
// then remove the old entry
m_menulistbox->removeItem(index);
m_filelist.remove( m_filelist.at(index) );
// select current entry
m_menulistbox->setSelected(index+1,true);
updateButton();
}
void UserHelpDialog::updateButton()
{
// default states
bool rem_state = false;
bool sep_state = false;
bool up_state = false;
bool down_state = false;
// change button states, if there are entries
int index = m_menulistbox->currentItem();
int entries = (int)m_menulistbox->count();
if ( entries == 1 )
{
rem_state = true;
}
else if ( entries >= 2 )
{
rem_state = true;
if ( index == 0 )
{
down_state = true; // index = 0
}
else if ( index == entries-1 )
{
sep_state = true; // index = entries-1
up_state = true;
}
else
{ // 0 < index < entries-1
sep_state = true;
up_state = true;
down_state = true;
}
}
// don't allow two continuous spearators
if ( m_menulistbox->currentText() == "-" )
sep_state = false;
// set button states
m_remove->setEnabled(rem_state);
m_addsep->setEnabled(sep_state);
m_up->setEnabled(up_state);
m_down->setEnabled(down_state);
}
//END UserHelpDialog
//////////////////// UserHelpAddDialog ////////////////////
//BEGIN UserHelpAddDialog
UserHelpAddDialog::UserHelpAddDialog(TDEListBox *menulistbox, TQWidget *parent, const char *name)
: KDialogBase( parent, name, true, i18n("Add User Helpfile"), Cancel | Ok, Ok, true ),
m_menulistbox(menulistbox)
{
KILE_DEBUG() << "==UserHelpAddDialog::UserHelpAddDialog()===================" << endl;
TQWidget *page = new TQWidget(this);
setMainWidget(page);
// layout
TQVBoxLayout *vbox = new TQVBoxLayout(page, 6,6 );
TQVGroupBox* group= new TQVGroupBox(i18n("User Help"),page );
TQWidget *widget = new TQWidget(group);
TQGridLayout *grid = new TQGridLayout( widget, 2,6, 5,5, "" );
grid->setColSpacing(2,8);
grid->setColSpacing(4,8);
// menu entry
TQLabel *label1 = new TQLabel(i18n("&Menu entry:"),widget);
grid->addWidget( label1,0,0 );
m_leMenuEntry = new KLineEdit("",widget);
grid->addWidget( m_leMenuEntry, 0,1 );
label1->setBuddy(m_leMenuEntry);
// help file
TQLabel *label2 = new TQLabel(i18n("&Help file:"),widget);
grid->addWidget( label2, 1,0 );
m_leHelpFile = new KLineEdit("",widget);
m_leHelpFile->setReadOnly(false);
grid->addWidget( m_leHelpFile, 1,1 );
m_pbChooseFile = new KPushButton("", widget, "filechooser_button" );
m_pbChooseFile->setPixmap( SmallIcon("document-open") );
grid->addRowSpacing( 1, m_pbChooseFile->sizeHint().height()+5 );
grid->addWidget(m_pbChooseFile,1,3);
m_pbChooseHtml = new KPushButton("", widget, "htmlchooser_button" );
m_pbChooseHtml->setPixmap( SmallIcon("viewhtml") );
grid->addWidget(m_pbChooseHtml,1,5);
grid->setColSpacing(3, m_pbChooseFile->sizeHint().width()+5 );
grid->setColSpacing(5, m_pbChooseHtml->sizeHint().width()+5 );
label2->setBuddy(m_pbChooseFile);
// fill vbox
vbox->addWidget(group);
vbox->addStretch();
TQWhatsThis::add(m_leMenuEntry,i18n("The menu entry for this help file."));
TQWhatsThis::add(m_leHelpFile,i18n("The name of the local help file or a valid WEB url."));
TQWhatsThis::add(m_pbChooseFile,i18n("Start a file dialog to choose a local help file."));
TQWhatsThis::add(m_pbChooseHtml,i18n("Start the konqueror to choose a WEB url as help file. This url should be copied inzo the edit widget."));
connect( m_pbChooseFile, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotChooseFile() ) );
connect( m_pbChooseHtml, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotChooseHtml() ) );
setFocusProxy( m_leMenuEntry );
resize(500,sizeHint().height());
}
void UserHelpAddDialog::slotChooseFile()
{
TQString directory = TQDir::currentDirPath();
TQString filter = "*.*|All Files\n*.dvi|DVI Files\n*.ps|PS Files\n*.pdf|PDF Files\n*.html *.htm|HTML Files";
TQString filename = KFileDialog::getOpenFileName( directory,filter,this,i18n("Select File") );
if ( filename.isEmpty() )
return;
TQFileInfo fi(filename);
if ( ! fi.exists() )
{
KMessageBox::error(0,TQString(i18n("File '%1' does not exist.")).arg(filename));
return;
}
m_leHelpFile->setText( filename );
}
void UserHelpAddDialog::slotChooseHtml()
{
KURL url;
url.setPath("about:blank");
KRun::runURL(url,"text/html");
}
void UserHelpAddDialog::slotOk()
{
m_leMenuEntry->setText( m_leMenuEntry->text().stripWhiteSpace() );
TQString filename = m_leHelpFile->text().stripWhiteSpace();
m_leHelpFile->setText( filename );
if ( m_leMenuEntry->text().isEmpty() )
{
KMessageBox::error(this,i18n("No menuitem was given."));
return;
}
if ( m_menulistbox->findItem(m_leMenuEntry->text(),TQt::ExactMatch) )
{
KMessageBox::error(this,i18n("This menuitem already exists."));
return;
}
if ( filename.isEmpty() )
{
KMessageBox::error(this,i18n("No help file was chosen."));
return;
}
TQFileInfo fi(filename);
if ( filename.find("http://",0)!=0 && !fi.exists() )
{
KMessageBox::error(this,TQString(i18n("File '%1' doesn't exist.")).arg(filename));
return;
}
accept();
}
//END UserHelpAddDialog
}
#include "userhelpdialog.moc"