summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/applets/multikeyapplet/multikey.cpp2
-rw-r--r--core/apps/taboapp/main.cpp4
-rw-r--r--core/launcher/inputmethods.cpp6
-rw-r--r--core/launcher/irserver.cpp4
-rw-r--r--core/launcher/startmenu.cpp4
-rw-r--r--core/launcher/systray.cpp4
-rw-r--r--core/multimedia/opieplayer/mediaplayerstate.cpp2
-rw-r--r--core/multimedia/opieplayer/playlistwidget.cpp2
-rw-r--r--core/multimedia/opieplayer/videowidget.cpp2
-rw-r--r--core/opie-login/main.cpp2
-rw-r--r--core/settings/launcher/menusettings.cpp4
-rw-r--r--core/settings/launcher/taskbarsettings.cpp4
-rw-r--r--core/settings/security/multiauthconfig.cpp8
-rw-r--r--core/tools/quicklauncher/dropins.h4
-rw-r--r--inputmethods/multikey/configdlg.cpp4
-rw-r--r--inputmethods/multikey/keyboard.cpp4
-rw-r--r--libopie2/opiecore/opluginloader.cpp4
-rw-r--r--libopie2/opienet/omanufacturerdb.cpp2
-rw-r--r--libopie2/opiesecurity/multiauthcommon.cpp2
-rw-r--r--library/fontdatabase.cpp2
-rw-r--r--library/network.cpp6
-rw-r--r--library/qpedecoration_qws.cpp2
-rw-r--r--libslcompat/slmisc.h2
-rw-r--r--noncore/applets/zkbapplet/applet/zkbwidget.cpp2
-rw-r--r--noncore/applets/zkbapplet/keyzcfg/cfgdlg.cpp4
-rw-r--r--noncore/applets/zkbapplet/keyzcfg/main.cpp2
-rw-r--r--noncore/apps/opie-bartender/bartender.cpp2
-rw-r--r--noncore/apps/opie-console/fixit.cpp6
-rw-r--r--noncore/apps/opie-gutenbrowser/LibraryDialog.cpp6
-rw-r--r--noncore/apps/opie-gutenbrowser/ftpsitedlg.cpp2
-rw-r--r--noncore/apps/opie-gutenbrowser/gutenbrowser.cpp4
-rw-r--r--noncore/apps/opie-gutenbrowser/helpme.cpp2
-rw-r--r--noncore/apps/zsafe/zsafe.cpp10
-rw-r--r--noncore/games/backgammon/backgammon.cpp14
-rw-r--r--noncore/games/backgammon/filedialog.cpp2
-rw-r--r--noncore/games/backgammon/themedialog.cpp2
-rw-r--r--noncore/multimedia/opieplayer2/playlistwidget.cpp2
-rw-r--r--noncore/settings/language/language.cpp2
-rw-r--r--noncore/settings/networksettings/mainwindow/mainwindowimp.cpp2
-rw-r--r--noncore/settings/sysinfo/benchmarkinfo.cpp2
-rw-r--r--noncore/settings/tabmanager/tabmanager.cpp4
-rw-r--r--noncore/styles/theme/othemebase.cpp2
-rw-r--r--noncore/styles/theme/themeset.cpp2
-rw-r--r--noncore/tools/calc2/calc.cpp2
-rw-r--r--x11/libqpe-x11/qpe/qpeapplication.cpp4
45 files changed, 80 insertions, 80 deletions
diff --git a/core/applets/multikeyapplet/multikey.cpp b/core/applets/multikeyapplet/multikey.cpp
index 195d8a4..8cb9083 100644
--- a/core/applets/multikeyapplet/multikey.cpp
+++ b/core/applets/multikeyapplet/multikey.cpp
@@ -1,142 +1,142 @@
/**********************************************************************
** Copyright (C) 2004 Anton Kachalov mouse@altlinux.ru
** All rights reserved.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "multikey.h"
/* OPIE */
#include <opie2/otaskbarapplet.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpeapplication.h>
/* QT */
#include <qdir.h>
using namespace Opie::Ui;
Multikey::Multikey(QWidget *parent) : QLabel(parent), popupMenu(this), current("EN")
{
QCopChannel* swChannel = new QCopChannel("MultiKey/Switcher", this);
connect( swChannel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(message(const QCString&,const QByteArray&)));
setFont( QFont( "Helvetica", 10, QFont::Normal ) );
QPEApplication::setStylusOperation(this, QPEApplication::RightOnHold);
lang = 0;
QCopEnvelope e("MultiKey/Keyboard", "getmultikey()");
setText("EN");
popupMenu.insertItem("EN", 0);
show();
}
void Multikey::mousePressEvent(QMouseEvent *ev)
{
if (!sw_maps.count())
return;
if (ev->button() == RightButton) {
QPoint p = mapToGlobal(QPoint(0, 0));
QSize s = popupMenu.sizeHint();
int opt = popupMenu.exec(QPoint(p.x() + (width() / 2) - (s.width() / 2),
p.y() - s.height()), 0);
if (opt == -1)
return;
lang = opt;
QCopEnvelope e("MultiKey/Keyboard", "setmultikey(QString)");
e << sw_maps[lang];
setText(labels[lang]);
}
QWidget::mousePressEvent(ev);
}
void Multikey::mouseReleaseEvent(QMouseEvent *ev)
{
if (!sw_maps.count())
return;
lang = lang < sw_maps.count()-1 ? lang+1 : 0;
QCopEnvelope e("MultiKey/Keyboard", "setmultikey(QString)");
//odebug << "Lang=" << lang << ", count=" << sw_maps.count() << ", lab=" << labels[lang].ascii() << "" << oendl;
e << sw_maps[lang];
setText(labels[lang]);
}
void Multikey::message(const QCString &message, const QByteArray &data)
{
if ( message == "setsw(QString,QString)" ) {
QDataStream stream(data, IO_ReadOnly);
QString maps, current_map;
stream >> maps >> current_map;
QStringList sw = QStringList::split(QChar('|'), maps);
sw.append(current_map);
- QDir map_dir(QPEApplication::qpeDir() + "/share/multikey/", "*.keymap");
+ QDir map_dir(QPEApplication::qpeDir() + "share/multikey/", "*.keymap");
lang = 0;
labels.clear();
sw_maps.clear();
popupMenu.clear();
for (uint i = 0; i < sw.count(); ++i) {
QString keymap_map;
if (sw[i][0] != '/') {
keymap_map = map_dir.absPath() + "/" + sw[i];
} else {
if ((map_dir.exists(QFileInfo(sw[i]).fileName(), false)
&& i != sw.count()-1) || !QFile::exists(sw[i])) {
continue;
}
keymap_map = sw[i];
}
QFile map(keymap_map);
if (map.open(IO_ReadOnly)) {
QString line;
map.readLine(line, 1024);
while (!map.atEnd()) {
if (line.find(QRegExp("^sw\\s*=\\s*")) != -1) {
if (i != sw.count()-1) {
if (keymap_map == current_map) {
lang = i;
}
sw_maps.append(keymap_map);
labels.append(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
popupMenu.insertItem(labels[labels.count()-1], labels.count()-1);
} else {
current = line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace();
}
break;
}
map.readLine(line, 1024);
}
map.close();
}
}
setText(current);
}
}
int Multikey::position()
{
return 10;
}
EXPORT_OPIE_APPLET_v1( Multikey )
diff --git a/core/apps/taboapp/main.cpp b/core/apps/taboapp/main.cpp
index e43f118..e999803 100644
--- a/core/apps/taboapp/main.cpp
+++ b/core/apps/taboapp/main.cpp
@@ -1,57 +1,57 @@
/* OPIE */
#include <oappinterface.h>
#include <oappplugin.h>
#include <opie2/odebug.h>
#include <opie2/otabwidget.h>
#include <qpe/qpeapplication.h>
#include <qpe/qlibrary.h>
using namespace Opie::Core;
using namespace Opie::Ui;
/* QT */
#include <qdir.h>
int main( int argc, char **argv )
{
QPEApplication a( argc, argv );
OTabWidget *tabwidget = new OTabWidget(0, "tab widget");
- QString path = QPEApplication::qpeDir() + "/plugins/app";
+ QString path = QPEApplication::qpeDir() + "plugins/app";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
QInterfacePtr<OAppInterface> iface;
for ( it = list.begin(); it != list.end(); ++it ) {
QLibrary *lib = new QLibrary( path + "/" + *it );
odebug << "querying: " << QString( path + "/" + *it ) << "" << oendl;
if ( lib->queryInterface( IID_OAppInterface, (QUnknownInterface**)&iface ) == QS_OK ) {
odebug << "accepted: " << QString( path + "/" + *it ) << "" << oendl;
QList<QWidget> list = iface->widgets();
QWidget *widget;
for ( widget = list.first(); widget != 0; widget = list.next() )
tabwidget->addTab(widget, QString(*it), QString(*it));
QString lang = getenv( "LANG" );
if (lang.isNull())
lang = "en";
QTranslator *trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
if (type.left(3) == "lib")
type = type.mid(3);
type = type.right( type.find("lib") );
- QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
+ QString tfn = QPEApplication::qpeDir()+"i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
}
}
a.showMainDocumentWidget(tabwidget);
return a.exec();
}
diff --git a/core/launcher/inputmethods.cpp b/core/launcher/inputmethods.cpp
index 586628b..24669ac 100644
--- a/core/launcher/inputmethods.cpp
+++ b/core/launcher/inputmethods.cpp
@@ -1,631 +1,631 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#define QTOPIA_INTERNAL_LANGLIST
#include "inputmethods.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/config.h>
#include <qpe/global.h>
#include <qpe/qpeapplication.h>
using namespace Opie::Core;
/* QT */
#include <qpopupmenu.h>
#include <qtoolbutton.h>
#include <qwidgetstack.h>
#include <qlayout.h>
#include <qdir.h>
#include <qtl.h>
#ifdef Q_WS_QWS
#include <qwindowsystem_qws.h>
#include <qwsevent_qws.h>
#include <qcopchannel_qws.h>
#endif
/* STD */
#include <stdlib.h>
/* XPM */
static const char * tri_xpm[]={
"9 9 2 1",
"a c #000000",
". c None",
".........",
".........",
".........",
"....a....",
"...aaa...",
"..aaaaa..",
".aaaaaaa.",
".........",
"........."};
int InputMethod::operator <(const InputMethod& o) const
{
return name() < o.name();
}
int InputMethod::operator >(const InputMethod& o) const
{
return name() > o.name();
}
int InputMethod::operator <=(const InputMethod& o) const
{
return name() <= o.name();
}
/*
Slightly hacky: We use WStyle_Tool as a flag to say "this widget
belongs to the IM system, so clicking it should not cause a reset".
*/
class IMToolButton : public QToolButton
{
public:
IMToolButton::IMToolButton( QWidget *parent ) : QToolButton( parent )
{ setWFlags( WStyle_Tool );
setBackgroundOrigin( ParentOrigin );
setBackgroundMode( PaletteBackground );
}
};
InputMethods::InputMethods( QWidget *parent ) :
QWidget( parent, "InputMethods", WStyle_Tool | WStyle_Customize ),
mkeyboard(0), imethod(0)
{
readConfig();
setBackgroundOrigin( ParentOrigin );
setBackgroundMode( PaletteBackground );
QHBoxLayout *hbox = new QHBoxLayout( this );
kbdButton = new IMToolButton( this);
kbdButton->setFocusPolicy(NoFocus);
kbdButton->setToggleButton( TRUE );
if (parent->sizeHint().height() > 0)
kbdButton->setFixedHeight( parent->sizeHint().height() );
kbdButton->setFixedWidth( 32 );
kbdButton->setAutoRaise( TRUE );
kbdButton->setUsesBigPixmap( TRUE );
hbox->addWidget( kbdButton );
connect( kbdButton, SIGNAL(toggled(bool)), this, SLOT(showKbd(bool)) );
kbdChoice = new IMToolButton( this );
kbdChoice->setFocusPolicy(NoFocus);
kbdChoice->setPixmap( QPixmap( (const char **)tri_xpm ) );
if (parent->sizeHint().height() > 0)
kbdChoice->setFixedHeight( parent->sizeHint().height() );
kbdChoice->setFixedWidth( 13 );
kbdChoice->setAutoRaise( TRUE );
hbox->addWidget( kbdChoice );
connect( kbdChoice, SIGNAL(clicked()), this, SLOT(chooseKbd()) );
connect( (QPEApplication*)qApp, SIGNAL(clientMoused()),
this, SLOT(resetStates()) );
imButton = new QWidgetStack( this ); // later a widget stack
imButton->setFocusPolicy(NoFocus);
if (parent->sizeHint().height() > 0)
imButton->setFixedHeight( parent->sizeHint().height() );
hbox->addWidget(imButton);
imChoice = new QToolButton( this );
imChoice->setFocusPolicy(NoFocus);
imChoice->setPixmap( QPixmap( (const char **)tri_xpm ) );
if (parent->sizeHint().height() > 0)
imChoice->setFixedHeight( parent->sizeHint().height() );
imChoice->setFixedWidth( 13 );
imChoice->setAutoRaise( TRUE );
hbox->addWidget( imChoice );
connect( imChoice, SIGNAL(clicked()), this, SLOT(chooseIm()) );
loadInputMethods();
QCopChannel *channel = new QCopChannel( "QPE/IME", this );
connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(qcopReceive(const QCString&,const QByteArray&)) );
}
InputMethods::~InputMethods()
{
Config cfg("qpe");
cfg.setGroup("InputMethod");
if (imethod)
cfg.writeEntry("im", imethod->name() );
if (mkeyboard)
cfg.writeEntry("current", mkeyboard->name() );
unloadInputMethods();
}
void InputMethods::hideInputMethod()
{
kbdButton->setOn( FALSE );
}
void InputMethods::showInputMethod()
{
kbdButton->setOn( TRUE );
}
void InputMethods::showInputMethod(const QString& name)
{
int i = 0;
QValueList<InputMethod>::Iterator it;
InputMethod *im = 0;
for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) {
QString lname = (*it).libName.mid((*it).libName.findRev('/') + 1);
if ( (*it).name() == name || lname == name ) {
im = &(*it);
break;
}
}
if ( im )
chooseKeyboard(im);
}
void InputMethods::resetStates()
{
if ( mkeyboard && !mkeyboard->newIM )
mkeyboard->interface->resetState();
}
QRect InputMethods::inputRect() const
{
if ( !mkeyboard || !mkeyboard->widget || !mkeyboard->widget->isVisible() )
return QRect();
else
return mkeyboard->widget->geometry();
}
void InputMethods::unloadInputMethods()
{
unloadMethod( inputMethodList );
unloadMethod( inputModifierList );
inputMethodList.clear();
inputModifierList.clear();
}
void InputMethods::unloadMethod( QValueList<InputMethod>& list ) {
QValueList<InputMethod>::Iterator it;
for (it = list.begin(); it != list.end(); ++it )
(*it).releaseInterface();
}
QStringList InputMethods::plugins()const {
- QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
+ QString path = QPEApplication::qpeDir() + "plugins/inputmethods";
#ifdef Q_OS_MACX
QDir dir( path, "lib*.dylib" );
#else
QDir dir( path, "lib*.so" );
#endif /* Q_OS_MACX */
return dir.entryList();
}
void InputMethods::installTranslator( const QString& type ) {
QStringList langs = Global::languageList();
QStringList::ConstIterator lit;
for ( lit= langs.begin(); lit!=langs.end(); ++lit) {
QString lang = *lit;
QTranslator * trans = new QTranslator(qApp);
- QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
+ QString tfn = QPEApplication::qpeDir()+"i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
}
}
void InputMethods::setPreferedHandlers() {
Config cfg("qpe");
cfg.setGroup("InputMethod");
QString current = cfg.readEntry("current");
QString im = cfg.readEntry("im");
QValueList<InputMethod>::Iterator it;
if (!inputModifierList.isEmpty() && !im.isEmpty() ) {
for (it = inputModifierList.begin(); it != inputModifierList.end(); ++it )
if ( (*it).name() == im ) {
imethod = &(*it); break;
}
}
if (!inputMethodList.isEmpty() && !current.isEmpty() ) {
for (it = inputMethodList.begin(); it != inputMethodList.end(); ++it )
if ( (*it).name() == current ) {
owarn << "preferred keyboard is " << current << "" << oendl;
mkeyboard = &(*it);
kbdButton->setPixmap( *mkeyboard->icon() );
break;
}
}
}
void InputMethods::loadInputMethods()
{
#ifndef QT_NO_COMPONENT
hideInputMethod();
mkeyboard = 0;
unloadInputMethods();
- QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
+ QString path = QPEApplication::qpeDir() + "plugins/inputmethods";
QStringList list = plugins();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
InputMethodInterface *iface = 0;
ExtInputMethodInterface *eface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if ( lib->queryInterface( IID_InputMethod, (QUnknownInterface**)&iface ) == QS_OK ) {
InputMethod input;
input.newIM = FALSE;
input.library = lib;
input.libName = *it;
input.interface = iface;
input.widget = input.interface->inputMethod( 0, inputWidgetStyle );
input.interface->onKeyPress( this, SLOT(sendKey(ushort,ushort,ushort,bool,bool)) );
inputMethodList.append( input );
} else if ( lib->queryInterface( IID_ExtInputMethod, (QUnknownInterface**)&eface ) == QS_OK ) {
InputMethod input;
input.newIM = TRUE;
input.library = lib;
input.libName = *it;
input.extInterface = eface;
input.widget = input.extInterface->keyboardWidget( 0, inputWidgetStyle );
// may be either a simple, or advanced.
if (input.widget) {
//odebug << "its a keyboard" << oendl;
inputMethodList.append( input );
} else {
//odebug << "its a real im" << oendl;
input.widget = input.extInterface->statusWidget( 0, 0 );
if (input.widget) {
//odebug << "blah" << oendl;
inputModifierList.append( input );
imButton->addWidget(input.widget, inputModifierList.count());
}
}
}else{
delete lib;
lib = 0l;
}
installTranslator( (*it).left( (*it).find(".") ) );
}
qHeapSort( inputMethodList );
#endif /* killed BUILT in cause they would not compile */
QWSServer::setCurrentInputMethod( 0 );
/* set the prefered IM + handler */
setPreferedHandlers();
if ( !inputModifierList.isEmpty() ) {
if (!imethod)
imethod = &inputModifierList[0];
imButton->raiseWidget(imethod->widget);
QWSServer::setCurrentInputMethod( imethod->extInterface->inputMethod() );
} else {
imethod = 0;
}
// we need to update keyboards afterwards, as some of them may not be compatible with
// the current input method
updateKeyboards(imethod);
if ( !inputModifierList.isEmpty() )
imButton->show();
else
imButton->hide();
if ( inputModifierList.count() > 1 )
imChoice->show();
else
imChoice->hide();
}
void InputMethods::chooseKbd()
{
QPopupMenu pop( this );
pop.setFocusPolicy( NoFocus ); //don't reset IM
QString imname;
if (imethod)
imname = imethod->libName.mid(imethod->libName.findRev('/') + 1);
int i = 0;
int firstDepKbd = 0;
QValueList<InputMethod>::Iterator it;
for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) {
// add empty new items, all old items.
if (!(*it).newIM || (*it).extInterface->compatible().count() == 0 ) {
pop.insertItem( (*it).name(), i, firstDepKbd);
if ( mkeyboard == &(*it) )
pop.setItemChecked( i, TRUE );
firstDepKbd++;
} else if ( (*it).extInterface->compatible().contains(imname)) {
// check if we need to insert a sep.
if (firstDepKbd == i)
pop.insertSeparator();
pop.insertItem( (*it).name(), i, -1);
if ( mkeyboard == &(*it) )
pop.setItemChecked( i, TRUE );
}
}
QPoint pt = mapToGlobal(kbdChoice->geometry().topRight());
QSize s = pop.sizeHint();
pt.ry() -= s.height();
pt.rx() -= s.width();
i = pop.exec( pt );
if ( i == -1 )
return;
InputMethod *im = &inputMethodList[i];
chooseKeyboard(im);
}
void InputMethods::chooseIm()
{
QPopupMenu pop( this );
int i = 0;
QValueList<InputMethod>::Iterator it;
for ( it = inputModifierList.begin(); it != inputModifierList.end(); ++it, i++ ) {
pop.insertItem( (*it).name(), i );
if ( imethod == &(*it) )
pop.setItemChecked( i, TRUE );
}
QPoint pt = mapToGlobal(imChoice->geometry().topRight());
QSize s = pop.sizeHint();
pt.ry() -= s.height();
pt.rx() -= s.width();
i = pop.exec( pt );
if ( i == -1 )
return;
InputMethod *im = &inputModifierList[i];
chooseMethod(im);
}
void InputMethods::chooseKeyboard(InputMethod* im)
{
if ( im != mkeyboard ) {
if ( mkeyboard && mkeyboard->widget->isVisible() )
mkeyboard->widget->hide();
mkeyboard = im;
kbdButton->setPixmap( *mkeyboard->icon() );
}
if ( !kbdButton->isOn() )
kbdButton->setOn( TRUE );
else
showKbd( TRUE );
}
static bool keyboardCompatible(InputMethod *keyb, const QString &imname )
{
if ( !keyb || !keyb->newIM || !keyb->extInterface->compatible().count() )
return TRUE;
if ( keyb->extInterface->compatible().contains(imname) )
return TRUE;
return FALSE;
}
// Updates the display of the soft keyboards available to the current input method
void InputMethods::updateKeyboards(InputMethod *im )
{
uint count;
if ( im ) {
QString imname = im->libName.mid(im->libName.findRev('/') + 1);
if ( mkeyboard && !keyboardCompatible(mkeyboard, imname) ) {
kbdButton->setOn( FALSE );
showKbd( FALSE );
mkeyboard = 0;
}
count = 0;
QValueList<InputMethod>::Iterator it;
for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it ) {
if ( keyboardCompatible( &(*it), imname ) ) {
if ( !mkeyboard ) {
mkeyboard = &(*it);
kbdButton->setPixmap( *mkeyboard->icon() );
}
count++;
}
}
} else {
count = inputMethodList.count();
if ( count && !mkeyboard ) {
mkeyboard = &inputMethodList[0];
kbdButton->setPixmap( *mkeyboard->icon() );
} else if (!count){
mkeyboard = 0; //might be redundant
}
}
if ( count > 1 )
kbdChoice->show();
else
kbdChoice->hide();
if ( count )
kbdButton->show();
else
kbdButton->hide();
}
void InputMethods::chooseMethod(InputMethod* im)
{
if ( im != imethod ) {
updateKeyboards( im );
Config cfg("qpe");
cfg.setGroup("InputMethod");
if (im )
cfg.writeEntry("im", im->name() );
if (mkeyboard)
cfg.writeEntry("current", mkeyboard->name() );
QWSServer::setCurrentInputMethod( 0 );
imethod = im;
if ( imethod && imethod->newIM )
QWSServer::setCurrentInputMethod( imethod->extInterface->inputMethod() );
else
QWSServer::setCurrentInputMethod( 0 );
if ( im )
imButton->raiseWidget(im->widget);
else
imButton->hide(); //### good UI? make sure it is shown again!
}
}
void InputMethods::qcopReceive( const QCString &msg, const QByteArray &data )
{
if ( imethod && imethod->newIM )
imethod->extInterface->qcopReceive( msg, data );
}
void InputMethods::showKbd( bool on )
{
if ( !mkeyboard )
return;
if ( on )
{
mkeyboard->resetState();
int height = QMIN( mkeyboard->widget->sizeHint().height(), 134 );
int width = static_cast<int>( qApp->desktop()->width() * (inputWidgetWidth*0.01) );
int left = 0;
int top = mapToGlobal( QPoint() ).y() - height;
if ( inputWidgetStyle & QWidget::WStyle_DialogBorder )
{
odebug << "InputMethods: reading geometry." << oendl;
Config cfg( "Launcher" );
cfg.setGroup( "InputMethods" );
int l = cfg.readNumEntry( "absX", -1 );
int t = cfg.readNumEntry( "absY", -1 );
int w = cfg.readNumEntry( "absWidth", -1 );
int h = cfg.readNumEntry( "absHeight", -1 );
if ( l > -1 && t > -1 && w > -1 && h > -1 )
{
odebug << "InputMethods: config values ( " << l << ", " << t << ", " << w << ", " << h << " ) are ok." << oendl;
left = l;
top = t;
width = w;
height = h;
}
else
{
odebug << "InputMethods: config values are new or not ok." << oendl;
}
}
else
{
odebug << "InputMethods: no floating selected." << oendl;
}
mkeyboard->widget->resize( width, height );
mkeyboard->widget->move( left, top );
mkeyboard->widget->show();
mkeyboard->widget->installEventFilter( this );
}
else
{
if ( inputWidgetStyle & QWidget::WStyle_DialogBorder )
{
QPoint pos = mkeyboard->widget->pos();
QSize siz = mkeyboard->widget->size();
odebug << "InputMethods: saving geometry." << oendl;
Config cfg( "Launcher" );
cfg.setGroup( "InputMethods" );
cfg.writeEntry( "absX", pos.x() );
cfg.writeEntry( "absY", pos.y() );
cfg.writeEntry( "absWidth", siz.width() );
cfg.writeEntry( "absHeight", siz.height() );
cfg.write();
mkeyboard->widget->removeEventFilter( this );
}
mkeyboard->widget->hide();
}
emit inputToggled( on );
}
bool InputMethods::shown() const
{
return mkeyboard && mkeyboard->widget->isVisible();
}
QString InputMethods::currentShown() const
{
return mkeyboard && mkeyboard->widget->isVisible()
? mkeyboard->name() : QString::null;
}
void InputMethods::sendKey( ushort unicode, ushort scancode, ushort mod, bool press, bool repeat )
{
#if defined(Q_WS_QWS)
QWSServer::sendKeyEvent( unicode, scancode, mod, press, repeat );
#endif
}
bool InputMethods::eventFilter( QObject* , QEvent* e )
{
if ( e->type() == QEvent::Close )
{
( (QCloseEvent*) e )->ignore();
showKbd( false );
kbdButton->setOn( false );
return true;
}
return false;
}
void InputMethods::readConfig() {
Config cfg( "Launcher" );
cfg.setGroup( "InputMethods" );
inputWidgetStyle = QWidget::WStyle_Customize | QWidget::WStyle_StaysOnTop | QWidget::WGroupLeader | QWidget::WStyle_Tool;
inputWidgetStyle |= cfg.readBoolEntry( "Float", false ) ?
QWidget::WStyle_DialogBorder : 0;
inputWidgetWidth = cfg.readNumEntry( "Width", 100 );
}
diff --git a/core/launcher/irserver.cpp b/core/launcher/irserver.cpp
index 092eb0c..19cf904 100644
--- a/core/launcher/irserver.cpp
+++ b/core/launcher/irserver.cpp
@@ -1,76 +1,76 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "irserver.h"
#include "obexinterface.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qtopia/qlibrary.h>
#include <qtopia/qpeapplication.h>
/* QT */
#include <qdir.h>
IrServer::IrServer( QObject *parent, const char *name )
: QObject( parent, name ), obexIface(0)
{
lib = 0;
obexIface = 0;
- QString path = QPEApplication::qpeDir() + "/plugins/obex/";
+ QString path = QPEApplication::qpeDir() + "plugins/obex/";
#ifdef Q_OS_MACX
QDir dir( path, "lib*.dylib" );
#else
QDir dir( path, "lib*.so" );
#endif /* Q_OS_MACX */
QStringList list = dir.entryList();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
QLibrary *trylib = new QLibrary( path + *it );
//odebug << "trying lib " << (path + (*it)) << "" << oendl;
if ( trylib->queryInterface( IID_ObexInterface, (QUnknownInterface**)&obexIface ) == QS_OK ) {
lib = trylib;
//odebug << "found obex lib" << oendl;
QString lang = getenv( "LANG" );
QTranslator * trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
- QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
+ QString tfn = QPEApplication::qpeDir()+"i18n/"+lang+"/"+type+".qm";
//odebug << "tr fpr obex: " << tfn << "" << oendl;
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
break;
} else {
delete lib;
}
}
if ( !lib )
odebug << "could not load IR plugin" << oendl;
}
IrServer::~IrServer()
{
if ( obexIface )
obexIface->release();
delete lib;
}
diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp
index f3a7651..66f665f 100644
--- a/core/launcher/startmenu.cpp
+++ b/core/launcher/startmenu.cpp
@@ -1,390 +1,390 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
// TODO. During startup
// Launcher::typeAdded
// is called for each new tab and calls then each time the refresh of startmenu
// suboptimal
#define INCLUDE_MENUITEM_DEF
#include "startmenu.h"
#include <qtopia/qpeapplication.h>
#include <qtopia/config.h>
#include <qtopia/resource.h>
#include <qtopia/mimetype.h>
#include <qtopia/qlibrary.h>
//#include <qpainter.h>
//#include <stdlib.h>
#define APPLNK_ID_OFFSET 250
#define NO_ID -1
void StartPopupMenu::keyPressEvent( QKeyEvent *e )
{
if ( e->key() == Key_F33 || e->key() == Key_Space ) {
// "OK" button, little hacky
QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0);
QPopupMenu::keyPressEvent( &ke );
} else {
QPopupMenu::keyPressEvent( e );
}
}
//---------------------------------------------------------------------------
StartMenu::StartMenu(QWidget *parent) : QLabel( parent )
{
startButtonPixmap = "go"; // No tr
int sz = AppLnk::smallIconSize()+3;
QPixmap pm;
pm.convertFromImage(Resource::loadImage( startButtonPixmap).smoothScale( sz,sz) );
setPixmap(pm);
setFocusPolicy( NoFocus );
useWidePopupMenu = true;
launchMenu = 0;
refreshMenu();
}
void StartMenu::mousePressEvent( QMouseEvent * )
{
launch();
}
StartMenu::~StartMenu()
{
clearApplets();
}
void StartMenu::createMenu()
{
clearApplets();
delete launchMenu;
launchMenu = new StartPopupMenu( this );
loadMenu( launchMenu );
loadApplets();
bool result = currentItem || menuApplets.count();
if ( result )
connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
}
void StartMenu::refreshMenu()
{
Config cfg( "StartMenu" );
cfg.setGroup( "Menu" );
bool ltabs = cfg.readBoolEntry( "LauncherTabs", TRUE );
bool lot = cfg.readBoolEntry( "LauncherOther", TRUE );
useWidePopupMenu = cfg.readBoolEntry( "LauncherSubPopup", TRUE );
if ( launchMenu && !(ltabs || lot) ) return; // nothing to do
createMenu();
}
void StartMenu::itemSelected( int id )
{
if ( id == NO_ID ) return;
if ( id < 0 ) {
MenuApplet *applet = menuApplets.find( id );
if ( applet ) {
applet->iface->activated();
}
} else if ( id >= APPLNK_ID_OFFSET ) {
AppLnk * appLnk = appLnks.find( id );
if ( appLnk ) {
appLnk->execute();
}
} else {
QString *tabName = tabNames.find( id );
if ( tabName ) {
emit tabSelected( *tabName );
}
}
}
void StartMenu::createAppEntry( QPopupMenu *menu, QDir dir, QString file )
{
if ( file.right(8) == ".desktop" ) {
AppLnk* applnk = new AppLnk( dir.path() + "/" + file );
if ( !applnk->isValid() ) {
delete applnk;
return;
}
if ( applnk->type() == "Separator" ) { // No tr
menu->insertSeparator();
delete applnk;
} else {
QPixmap test;
QImage img = Resource::loadImage( applnk->icon() );
if(!img.isNull() )
test.convertFromImage(
img.smoothScale(
AppLnk::smallIconSize(), AppLnk::smallIconSize() ), 0 );
menu->insertItem( test, applnk->name(),
currentItem + APPLNK_ID_OFFSET );
appLnks.insert( currentItem + APPLNK_ID_OFFSET, applnk );
currentItem++;
}
}
}
void StartMenu::createDirEntry( QPopupMenu *menu, QDir dir, QString file, bool lot )
{
// do some sanity checks and collect information
if ( file == "." || file == ".." ) return;
Config cfg( dir.path() + "/" + file + "/.directory", Config::File );
if ( !cfg.isValid() ) return;
QString name = cfg.readEntry( "Name" );
QString icon = cfg.readEntry( "Icon" );
if ( !name || !icon ) return;
QDir subdir = QDir( dir );
subdir.cd( file );
subdir.setFilter( QDir::Files );
subdir.setNameFilter( "*.desktop" );
// we don' t show the menu if there are no entries
// perhaps one should check if there exist subsubdirs with entries...
if ( subdir.entryList().isEmpty() ) return;
// checks were ok
QPixmap test;
test.convertFromImage( Resource::loadImage( icon ).smoothScale(
AppLnk::smallIconSize(), AppLnk::smallIconSize() ), 0 );
if ( useWidePopupMenu ) {
// generate submenu
QPopupMenu *submenu = new QPopupMenu( menu );
connect( submenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
menu->insertItem( test, name, submenu, NO_ID );
// ltabs is true cause else we wouldn't stuck around..
createMenuEntries( submenu, subdir, true, lot );
} else {
// no submenus - just bring corresponding tab to front
menu->insertItem( test, name, currentItem );
tabNames.insert( currentItem, new QString( file ) );
currentItem++;
}
}
void StartMenu::createMenuEntries( QPopupMenu *menu, QDir dir, bool ltabs, bool lot )
{
if ( lot ) {
dir.setFilter( QDir::Files );
dir.setNameFilter( "*.desktop" );
QStringList files = dir.entryList();
files.sort();
for ( QStringList::Iterator it = files.begin(); it != files.end(); it++ ) {
createAppEntry( menu, dir, *it );
}
}
if ( ltabs ) {
dir.setNameFilter( "*" );
dir.setFilter( QDir::Dirs );
QStringList dirs = dir.entryList();
dirs.sort();
for ( QStringList::Iterator it = dirs.begin(); it != dirs.end(); it++ ) {
createDirEntry( menu, dir, *it, lot );
}
}
}
bool StartMenu::loadMenu( QPopupMenu *menu )
{
Config cfg("StartMenu");
cfg.setGroup("Menu");
bool ltabs = cfg.readBoolEntry("LauncherTabs", TRUE);
bool lot = cfg.readBoolEntry("LauncherOther", TRUE);
useWidePopupMenu = cfg.readBoolEntry( "LauncherSubPopup", TRUE );
bool sepfirst = !ltabs && !lot;
currentItem = 0;
launchMenu->clear();
appLnks.setAutoDelete( true );
tabNames.setAutoDelete( true );
appLnks.clear();
tabNames.clear();
appLnks.setAutoDelete( false );
tabNames.setAutoDelete( false );
QDir dir( MimeType::appsFolderName(), QString::null, QDir::Name );
createMenuEntries( menu, dir, ltabs, lot );
if ( !menu->count() ) sepfirst = TRUE;
launchMenu->setName( sepfirst ? "accessories" : "accessories_need_sep" ); // No tr
return currentItem;
}
void StartMenu::launch()
{
int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height();
if ( launchMenu->isVisible() )
launchMenu->hide();
else
launchMenu->popup( QPoint( 1, y ) );
}
static int compareAppletPositions(const void *b, const void *a)
{
const MenuApplet* aa = *(const MenuApplet**)a;
const MenuApplet* ab = *(const MenuApplet**)b;
int d = aa->iface->position() - ab->iface->position();
if ( d ) return d;
return QString::compare(aa->library->library(),ab->library->library());
}
void StartMenu::clearApplets()
{
if ( launchMenu )
launchMenu-> hide();
for ( QIntDictIterator<MenuApplet> it( menuApplets ); it.current(); ++it ) {
MenuApplet *applet = it.current();
if ( launchMenu ) {
launchMenu->removeItem( applet-> id );
delete applet->popup;
}
applet->iface->release();
applet->library->unload();
delete applet-> library;
}
menuApplets.clear();
}
void StartMenu::loadApplets()
{
Config cfg( "StartMenu" );
cfg.setGroup( "Applets" );
// SafeMode causes too much problems, so we disable it for now --
// maybe we should reenable it for OPIE 1.0 - sandman 26.09.02
// removed in the remerge PluginManager could handle it
// we don't currently use it -zecke
QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
QString lang = getenv( "LANG" );
- QString path = QPEApplication::qpeDir() + "/plugins/applets";
+ QString path = QPEApplication::qpeDir() + "plugins/applets";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
int napplets = 0;
MenuApplet* *xapplets = new MenuApplet*[list.count()];
for ( it = list.begin(); it != list.end(); ++it ) {
if ( exclude.find( *it ) != exclude.end() )
continue;
MenuAppletInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
MenuApplet *applet = new MenuApplet;
xapplets[napplets++] = applet;
applet->library = lib;
applet->iface = iface;
QTranslator *trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
- QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
+ QString tfn = QPEApplication::qpeDir()+"i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
} else {
exclude += *it;
delete lib;
}
}
cfg.writeEntry( "ExcludeApplets", exclude, ',' );
qsort(xapplets, napplets, sizeof(menuApplets[0]), compareAppletPositions);
while ( napplets-- ) {
MenuApplet *applet = xapplets[napplets];
applet->popup = applet->iface->popup( this );
// menuApplets got an id < -1
menuApplets.insert( -( currentItem + 2 ), new MenuApplet( *applet ) );
currentItem++;
}
delete [] xapplets;
addApplets( launchMenu );
}
/*
* Launcher calls loadMenu too often fix that
*/
void StartMenu::addApplets(QPopupMenu* pop) {
QIntDict<MenuApplet> dict;
if( pop-> count ( ))
pop-> insertSeparator ( );
for ( QIntDictIterator<MenuApplet> it( menuApplets ); it.current(); ++it ) {
MenuApplet *applet = it.current();
if ( applet->popup )
applet->id = pop->insertItem( applet->iface->icon(),
applet->iface->text(), applet->popup );
else
applet->id = pop->insertItem( applet->iface->icon(),
applet->iface->text() );
dict.insert( applet->id, new MenuApplet( *applet ) );
}
/* need to update the key */
menuApplets.setAutoDelete( true );
menuApplets.clear();
menuApplets.setAutoDelete( false );
menuApplets = dict;
}
diff --git a/core/launcher/systray.cpp b/core/launcher/systray.cpp
index 3c72d25..d0f1808 100644
--- a/core/launcher/systray.cpp
+++ b/core/launcher/systray.cpp
@@ -1,150 +1,150 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "systray.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qtopia/qpeapplication.h>
#include <qtopia/qlibrary.h>
#include <qtopia/config.h>
using namespace Opie::Core;
/* QT */
#include <qlayout.h>
#include <qdir.h>
/* STD */
#include <stdlib.h>
SysTray::SysTray( QWidget *parent ) : QFrame( parent ), layout(0)
{
//setFrameStyle( QFrame::Panel | QFrame::Sunken );
loadApplets();
}
SysTray::~SysTray()
{
clearApplets();
}
static int compareAppletPositions(const void *a, const void *b)
{
const TaskbarApplet* aa = *(const TaskbarApplet**)a;
const TaskbarApplet* ab = *(const TaskbarApplet**)b;
int d = ab->iface->position() - aa->iface->position();
if ( d ) return d;
return QString::compare(ab->name,aa->name);
}
void SysTray::loadApplets()
{
hide();
clearApplets();
addApplets();
}
void SysTray::clearApplets()
{
#ifndef QT_NO_COMPONENTS
/*
* Note on clearing. SOme applets delete their
* applets themselves some don't do it
* and on restart this can crash. If we delete it
* here we might end up in a double deletion. We could
* use QGuardedPtr but that would be one QOBject
* for every applet more but only useful for restart
*/
QValueList<TaskbarApplet>::Iterator mit;
for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) {
(*mit).iface->release();
(*mit).library->unload();
delete (*mit).library;
}
#endif
appletList.clear();
if ( layout )
delete layout;
layout = new QHBoxLayout( this, 0, 1 );
layout->setAutoAdd(TRUE);
}
void SysTray::addApplets()
{
hide();
#ifndef QT_NO_COMPONENTS
Config cfg( "Taskbar" );
cfg.setGroup( "Applets" );
QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
QString lang = getenv( "LANG" );
- QString path = QPEApplication::qpeDir() + "/plugins/applets";
+ QString path = QPEApplication::qpeDir() + "plugins/applets";
#ifdef Q_OS_MACX
QDir dir( path, "lib*.dylib" );
#else
QDir dir( path, "lib*.so" );
#endif /* Q_OS_MACX */
QStringList list = dir.entryList();
QStringList::Iterator it;
int napplets=0;
TaskbarApplet* *applets = new TaskbarApplet*[list.count()];
for ( it = list.begin(); it != list.end(); ++it ) {
if ( exclude.find( *it ) != exclude.end() )
continue;
owarn << "Found Applet: " << (*it) << "" << oendl;
TaskbarAppletInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if (( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
TaskbarApplet *applet = new TaskbarApplet;
applets[napplets++] = applet;
applet->library = lib;
applet->iface = iface;
QTranslator *trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
- QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
+ QString tfn = QPEApplication::qpeDir()+"i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
} else {
exclude += *it;
delete lib;
}
}
cfg.writeEntry( "ExcludeApplets", exclude, ',' );
qsort(applets,napplets,sizeof(applets[0]),compareAppletPositions);
while (napplets--) {
TaskbarApplet *applet = applets[napplets];
applet->applet = applet->iface->applet( this );
appletList.append(*applet);
}
delete [] applets;
#else /* ## FIXME single app */
TaskbarApplet * const applet = new TaskbarApplet();
applet->iface = new ClockAppletImpl();
applet->applet = applet->iface->applet( this );
appletList.append( applet );
#endif
show();
}
diff --git a/core/multimedia/opieplayer/mediaplayerstate.cpp b/core/multimedia/opieplayer/mediaplayerstate.cpp
index b700cd1..8b0fbbc 100644
--- a/core/multimedia/opieplayer/mediaplayerstate.cpp
+++ b/core/multimedia/opieplayer/mediaplayerstate.cpp
@@ -1,197 +1,197 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifdef QT_NO_COMPONENT
// Plugins which are compiled in when no plugin architecture available
#include "libmad/libmadpluginimpl.h"
#include "libmpeg3/libmpeg3pluginimpl.h"
#include "wavplugin/wavpluginimpl.h"
#endif
#include "mediaplayerstate.h"
/* OPIE */
#include <qpe/qpeapplication.h>
#include <qpe/qlibrary.h>
#include <qpe/config.h>
#include <qpe/mediaplayerplugininterface.h>
#include <opie2/odebug.h>
/* QT */
#include <qdir.h>
//#define MediaPlayerDebug(x) qDebug x
#define MediaPlayerDebug(x)
MediaPlayerState::MediaPlayerState( QObject *parent, const char *name )
: QObject( parent, name ), decoder( NULL ), libmpeg3decoder( NULL ) {
Config cfg( "OpiePlayer" );
readConfig( cfg );
loadPlugins();
}
MediaPlayerState::~MediaPlayerState() {
Config cfg( "OpiePlayer" );
writeConfig( cfg );
}
void MediaPlayerState::readConfig( Config& cfg ) {
cfg.setGroup("Options");
isFullscreen = cfg.readBoolEntry( "FullScreen" );
isScaled = cfg.readBoolEntry( "Scaling" );
isLooping = cfg.readBoolEntry( "Looping" );
isShuffled = cfg.readBoolEntry( "Shuffle" );
usePlaylist = cfg.readBoolEntry( "UsePlayList" );
usePlaylist = TRUE;
isPlaying = FALSE;
isPaused = FALSE;
curPosition = 0;
curLength = 0;
curView = 'l';
}
void MediaPlayerState::writeConfig( Config& cfg ) const {
cfg.setGroup("Options");
cfg.writeEntry("FullScreen", isFullscreen );
cfg.writeEntry("Scaling", isScaled );
cfg.writeEntry("Looping", isLooping );
cfg.writeEntry("Shuffle", isShuffled );
cfg.writeEntry("UsePlayList", usePlaylist );
}
struct MediaPlayerPlugin {
#ifndef QT_NO_COMPONENT
QLibrary *library;
#endif
MediaPlayerPluginInterface *iface;
MediaPlayerDecoder *decoder;
MediaPlayerEncoder *encoder;
};
static QValueList<MediaPlayerPlugin> pluginList;
// Find the first decoder which supports this type of file
MediaPlayerDecoder *MediaPlayerState::newDecoder( const QString& file ) {
MediaPlayerDecoder *tmpDecoder = NULL;
QValueList<MediaPlayerPlugin>::Iterator it;
for ( it = pluginList.begin(); it != pluginList.end(); ++it ) {
if ( (*it).decoder->isFileSupported( file ) ) {
tmpDecoder = (*it).decoder;
break;
}
}
if(file.left(4)=="http")
isStreaming = TRUE;
else
isStreaming = FALSE;
return decoder = tmpDecoder;
}
MediaPlayerDecoder *MediaPlayerState::curDecoder() {
return decoder;
}
// ### hack to get true sample count
MediaPlayerDecoder *MediaPlayerState::libMpeg3Decoder() {
return libmpeg3decoder;
}
// ### hack to get true sample count
// MediaPlayerDecoder *MediaPlayerState::libWavDecoder() {
// return libwavdecoder;
// }
void MediaPlayerState::loadPlugins() {
// odebug << "load plugins" << oendl;
#ifndef QT_NO_COMPONENT
QValueList<MediaPlayerPlugin>::Iterator mit;
for ( mit = pluginList.begin(); mit != pluginList.end(); ++mit ) {
(*mit).iface->release();
(*mit).library->unload();
delete (*mit).library;
}
pluginList.clear();
- QString path = QPEApplication::qpeDir() + "/plugins/codecs";
+ QString path = QPEApplication::qpeDir() + "plugins/codecs";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
MediaPlayerPluginInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
// odebug << "querying: " << QString( path + "/" + *it ) << "" << oendl;
if ( lib->queryInterface( IID_MediaPlayerPlugin, (QUnknownInterface**)&iface ) == QS_OK ) {
// odebug << "loading: " << QString( path + "/" + *it ) << "" << oendl;
MediaPlayerPlugin plugin;
plugin.library = lib;
plugin.iface = iface;
plugin.decoder = plugin.iface->decoder();
plugin.encoder = plugin.iface->encoder();
pluginList.append( plugin );
// ### hack to get true sample count
if ( plugin.decoder->pluginName() == QString("LibMpeg3Plugin") )
libmpeg3decoder = plugin.decoder;
} else {
delete lib;
}
}
#else
pluginList.clear();
MediaPlayerPlugin plugin0;
plugin0.iface = new LibMpeg3PluginImpl;
plugin0.decoder = plugin0.iface->decoder();
plugin0.encoder = plugin0.iface->encoder();
pluginList.append( plugin0 );
MediaPlayerPlugin plugin1;
plugin1.iface = new LibMadPluginImpl;
plugin1.decoder = plugin1.iface->decoder();
plugin1.encoder = plugin1.iface->encoder();
pluginList.append( plugin1 );
MediaPlayerPlugin plugin2;
plugin2.iface = new WavPluginImpl;
plugin2.decoder = plugin2.iface->decoder();
plugin2.encoder = plugin2.iface->encoder();
pluginList.append( plugin2 );
#endif
if ( pluginList.count() )
MediaPlayerDebug(( "%i decoders found", pluginList.count() ));
else
MediaPlayerDebug(( "No decoders found" ));
}
diff --git a/core/multimedia/opieplayer/playlistwidget.cpp b/core/multimedia/opieplayer/playlistwidget.cpp
index 46aeff2..db2bf1b 100644
--- a/core/multimedia/opieplayer/playlistwidget.cpp
+++ b/core/multimedia/opieplayer/playlistwidget.cpp
@@ -1,1459 +1,1459 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
// code added by L. J. Potter Sat 03-02-2002 06:17:54
#define QTOPIA_INTERNAL_FSLP
#include "playlistselection.h"
#include "playlistwidget.h"
#include "mediaplayerstate.h"
#include "inputDialog.h"
#include "audiowidget.h"
#include "videowidget.h"
/* OPIE */
#include <qpe/qpemenubar.h>
#include <qpe/lnkproperties.h>
#include <opie2/odebug.h>
/* QT */
#include <qtoolbar.h>
#include <qaction.h>
#include <qlayout.h>
#include <qmessagebox.h>
//#include <qtimer.h>
/* STD */
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
// for setBacklight()
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#define BUTTONS_ON_TOOLBAR
#define SIDE_BUTTONS
#define CAN_SAVE_LOAD_PLAYLISTS
extern AudioWidget *audioUI;
extern VideoWidget *videoUI;
extern MediaPlayerState *mediaPlayerState;
static inline QString fullBaseName ( const QFileInfo &fi )
{
QString str = fi. fileName ( );
return str. left ( str. findRev ( '.' ));
}
QString audioMimes ="audio/mpeg;audio/x-wav;audio/x-ogg;audio/x-mod";
// class myFileSelector {
// };
class PlayListWidgetPrivate {
public:
QToolButton *tbPlay, *tbFull, *tbLoop, *tbScale, *tbShuffle, *tbAddToList, *tbRemoveFromList, *tbMoveUp, *tbMoveDown, *tbRemove;
QFrame *playListFrame;
FileSelector *files;
PlayListSelection *selectedFiles;
bool setDocumentUsed;
DocLnk *current;
};
class ToolButton : public QToolButton {
public:
ToolButton( QWidget *parent, const char *name, const QString& icon, QObject *handler, const QString& slot, bool t = FALSE )
: QToolButton( parent, name ) {
setTextLabel( name );
setPixmap( Resource::loadPixmap( icon ) );
setAutoRaise( TRUE );
setFocusPolicy( QWidget::NoFocus );
setToggleButton( t );
connect( this, t ? SIGNAL( toggled(bool) ) : SIGNAL( clicked() ), handler, slot );
QPEMenuToolFocusManager::manager()->addWidget( this );
}
};
class MenuItem : public QAction {
public:
MenuItem( QWidget *parent, const QString& text, QObject *handler, const QString& slot )
: QAction( text, QString::null, 0, 0 ) {
connect( this, SIGNAL( activated() ), handler, slot );
addTo( parent );
}
};
PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
: QMainWindow( parent, name, fl ) {
d = new PlayListWidgetPrivate;
d->setDocumentUsed = FALSE;
d->current = NULL;
fromSetDocument = FALSE;
insanityBool=FALSE;
audioScan = FALSE;
videoScan = FALSE;
// menuTimer = new QTimer( this ,"menu timer"),
// connect( menuTimer, SIGNAL( timeout() ), SLOT( addSelected() ) );
channel = new QCopChannel( "QPE/Application/opieplayer", this );
connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT( qcopReceive(const QCString&,const QByteArray&)) );
setBackgroundMode( PaletteButton );
setCaption( tr("OpiePlayer") );
setIcon( Resource::loadPixmap( "opieplayer/MPEGPlayer" ) );
setToolBarsMovable( FALSE );
// Create Toolbar
QToolBar *toolbar = new QToolBar( this );
toolbar->setHorizontalStretchable( TRUE );
// Create Menubar
QMenuBar *menu = new QMenuBar( toolbar );
menu->setMargin( 0 );
QToolBar *bar = new QToolBar( this );
bar->setLabel( tr( "Play Operations" ) );
// d->tbPlayCurList = new ToolButton( bar, tr( "play List" ), "opieplayer/play_current_list",
// this , SLOT( addSelected()) );
tbDeletePlaylist = new QPushButton( Resource::loadIconSet("trash"),"",bar,"close");
tbDeletePlaylist->setFlat(TRUE);
tbDeletePlaylist->setFixedSize(20,20);
d->tbAddToList = new ToolButton( bar, tr( "Add to Playlist" ), "opieplayer/add_to_playlist",
this , SLOT(addSelected()) );
d->tbRemoveFromList = new ToolButton( bar, tr( "Remove from Playlist" ), "opieplayer/remove_from_playlist",
this , SLOT(removeSelected()) );
// d->tbPlay = new ToolButton( bar, tr( "Play" ), "opieplayer/play", /*this */mediaPlayerState , SLOT(setPlaying(bool)/*btnPlay()*/), TRUE );
d->tbPlay = new ToolButton( bar, tr( "Play" ), "opieplayer/play",
this , SLOT( btnPlay(bool) ), TRUE );
d->tbShuffle = new ToolButton( bar, tr( "Randomize" ),"opieplayer/shuffle",
mediaPlayerState, SLOT(setShuffled(bool)), TRUE );
d->tbLoop = new ToolButton( bar, tr( "Loop" ),"opieplayer/loop",
mediaPlayerState, SLOT(setLooping(bool)), TRUE );
tbDeletePlaylist->hide();
QPopupMenu *pmPlayList = new QPopupMenu( this );
menu->insertItem( tr( "File" ), pmPlayList );
new MenuItem( pmPlayList, tr( "Clear List" ), this, SLOT( clearList() ) );
new MenuItem( pmPlayList, tr( "Add all audio files" ), this, SLOT( addAllMusicToList() ) );
new MenuItem( pmPlayList, tr( "Add all video files" ), this, SLOT( addAllVideoToList() ) );
new MenuItem( pmPlayList, tr( "Add all files" ), this, SLOT( addAllToList() ) );
pmPlayList->insertSeparator(-1);
new MenuItem( pmPlayList, tr( "Save PlayList" ), this, SLOT( saveList() ) );
new MenuItem( pmPlayList, tr( "Open File or URL" ), this,SLOT( openFile() ) );
pmPlayList->insertSeparator(-1);
new MenuItem( pmPlayList, tr( "Rescan for Audio Files" ), this,SLOT( scanForAudio() ) );
new MenuItem( pmPlayList, tr( "Rescan for Video Files" ), this,SLOT( scanForVideo() ) );
QPopupMenu *pmView = new QPopupMenu( this );
menu->insertItem( tr( "View" ), pmView );
fullScreenButton = new QAction(tr("Full Screen"), Resource::loadPixmap("fullscreen"), QString::null, 0, this, 0);
fullScreenButton->addTo(pmView);
scaleButton = new QAction(tr("Scale"), Resource::loadPixmap("opieplayer/scale"), QString::null, 0, this, 0);
scaleButton->addTo(pmView);
skinsMenu = new QPopupMenu( this );
menu->insertItem( tr( "Skins" ), skinsMenu );
skinsMenu->isCheckable();
connect( skinsMenu, SIGNAL( activated(int) ) ,
this, SLOT( skinsMenuActivated(int) ) );
populateSkinsMenu();
QVBox *vbox5 = new QVBox( this ); vbox5->setBackgroundMode( PaletteButton );
QVBox *vbox4 = new QVBox( vbox5 ); vbox4->setBackgroundMode( PaletteButton );
QHBox *hbox6 = new QHBox( vbox4 ); hbox6->setBackgroundMode( PaletteButton );
tabWidget = new QTabWidget( hbox6, "tabWidget" );
// tabWidget->setTabShape(QTabWidget::Triangular);
QWidget *pTab;
pTab = new QWidget( tabWidget, "pTab" );
// playlistView = new QListView( pTab, "playlistview" );
// playlistView->setMinimumSize(236,260);
tabWidget->insertTab( pTab,"Playlist");
// Add the playlist area
QVBox *vbox3 = new QVBox( pTab ); vbox3->setBackgroundMode( PaletteButton );
d->playListFrame = vbox3;
QGridLayout *layoutF = new QGridLayout( pTab );
layoutF->setSpacing( 2);
layoutF->setMargin( 2);
layoutF->addMultiCellWidget( d->playListFrame , 0, 0, 0, 1 );
QHBox *hbox2 = new QHBox( vbox3 ); hbox2->setBackgroundMode( PaletteButton );
d->selectedFiles = new PlayListSelection( hbox2);
QVBox *vbox1 = new QVBox( hbox2 ); vbox1->setBackgroundMode( PaletteButton );
QPEApplication::setStylusOperation( d->selectedFiles->viewport(),QPEApplication::RightOnHold);
QVBox *stretch1 = new QVBox( vbox1 ); stretch1->setBackgroundMode( PaletteButton ); // add stretch
new ToolButton( vbox1, tr( "Move Up" ), "opieplayer/up", d->selectedFiles, SLOT(moveSelectedUp()) );
new ToolButton( vbox1, tr( "Remove" ), "opieplayer/cut", d->selectedFiles, SLOT(removeSelected()) );
new ToolButton( vbox1, tr( "Move Down" ), "opieplayer/down", d->selectedFiles, SLOT(moveSelectedDown()) );
QVBox *stretch2 = new QVBox( vbox1 ); stretch2->setBackgroundMode( PaletteButton ); // add stretch
QWidget *aTab;
aTab = new QWidget( tabWidget, "aTab" );
audioView = new QListView( aTab, "Audioview" );
QGridLayout *layoutA = new QGridLayout( aTab );
layoutA->setSpacing( 2);
layoutA->setMargin( 2);
layoutA->addMultiCellWidget( audioView, 0, 0, 0, 1 );
audioView->addColumn( tr("Title"),-1);
audioView->addColumn(tr("Size"), -1);
audioView->addColumn(tr("Media"),-1);
audioView->addColumn( tr( "Path" ), -1 );
audioView->setColumnAlignment(1, Qt::AlignRight);
audioView->setColumnAlignment(2, Qt::AlignRight);
audioView->setAllColumnsShowFocus(TRUE);
audioView->setMultiSelection( TRUE );
audioView->setSelectionMode( QListView::Extended);
audioView->setSorting( 3, TRUE );
tabWidget->insertTab(aTab,tr("Audio"));
QPEApplication::setStylusOperation( audioView->viewport(),QPEApplication::RightOnHold);
// audioView
// populateAudioView();
// videowidget
QWidget *vTab;
vTab = new QWidget( tabWidget, "vTab" );
videoView = new QListView( vTab, "Videoview" );
QGridLayout *layoutV = new QGridLayout( vTab );
layoutV->setSpacing( 2);
layoutV->setMargin( 2);
layoutV->addMultiCellWidget( videoView, 0, 0, 0, 1 );
videoView->addColumn(tr("Title"),-1);
videoView->addColumn(tr("Size"),-1);
videoView->addColumn(tr("Media"),-1);
videoView->addColumn(tr( "Path" ), -1 );
videoView->setColumnAlignment(1, Qt::AlignRight);
videoView->setColumnAlignment(2, Qt::AlignRight);
videoView->setAllColumnsShowFocus(TRUE);
videoView->setMultiSelection( TRUE );
videoView->setSelectionMode( QListView::Extended);
QPEApplication::setStylusOperation( videoView->viewport(),QPEApplication::RightOnHold);
tabWidget->insertTab( vTab,tr("Video"));
QWidget *LTab;
LTab = new QWidget( tabWidget, "LTab" );
playLists = new FileSelector( "playlist/plain;audio/x-mpegurl", LTab, "fileselector" , FALSE, FALSE);
QGridLayout *layoutL = new QGridLayout( LTab );
layoutL->setSpacing( 2);
layoutL->setMargin( 2);
layoutL->addMultiCellWidget( playLists, 0, 0, 0, 1 );
tabWidget->insertTab(LTab,tr("Lists"));
connect(tbDeletePlaylist,(SIGNAL(released())),SLOT( deletePlaylist()));
connect( fullScreenButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleFullscreen()) );
connect( scaleButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleScaled()) );
connect( d->selectedFiles, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int)),
this,SLOT( playlistViewPressed(int,QListViewItem*,const QPoint&,int)) );
///audioView
connect( audioView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int)),
this,SLOT( viewPressed(int,QListViewItem*,const QPoint&,int)) );
connect( audioView, SIGNAL( returnPressed(QListViewItem*)),
this,SLOT( playIt(QListViewItem*)) );
connect( audioView, SIGNAL( doubleClicked(QListViewItem*) ), this, SLOT( addToSelection(QListViewItem*) ) );
//videoView
connect( videoView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int)),
this,SLOT( viewPressed(int,QListViewItem*,const QPoint&,int)) );
connect( videoView, SIGNAL( returnPressed(QListViewItem*)),
this,SLOT( playIt(QListViewItem*)) );
connect( videoView, SIGNAL( doubleClicked(QListViewItem*) ), this, SLOT( addToSelection(QListViewItem*) ) );
//playlists
connect( playLists, SIGNAL( fileSelected(const DocLnk&) ), this, SLOT( loadList(const DocLnk&) ) );
connect( tabWidget, SIGNAL (currentChanged(QWidget*)),this,SLOT(tabChanged(QWidget*)));
connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), d->tbPlay, SLOT( setOn(bool) ) );
connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), d->tbLoop, SLOT( setOn(bool) ) );
connect( mediaPlayerState, SIGNAL( shuffledToggled(bool) ), d->tbShuffle, SLOT( setOn(bool) ) );
connect( mediaPlayerState, SIGNAL( playlistToggled(bool) ), this, SLOT( setPlaylist(bool) ) );
connect( d->selectedFiles, SIGNAL( doubleClicked(QListViewItem*) ), this, SLOT( playIt(QListViewItem*) ) );
setCentralWidget( vbox5 );
Config cfg( "OpiePlayer" );
readConfig( cfg );
currentPlayList = cfg.readEntry("CurrentPlaylist","default");
loadList(DocLnk( currentPlayList));
setCaption(tr("OpiePlayer: ")+ fullBaseName ( QFileInfo(currentPlayList)));
initializeStates();
}
PlayListWidget::~PlayListWidget() {
Config cfg( "OpiePlayer" );
writeConfig( cfg );
if ( d->current )
delete d->current;
if(d) delete d;
}
void PlayListWidget::initializeStates() {
d->tbPlay->setOn( mediaPlayerState->playing() );
d->tbLoop->setOn( mediaPlayerState->looping() );
d->tbShuffle->setOn( mediaPlayerState->shuffled() );
setPlaylist( true);
}
void PlayListWidget::readConfig( Config& cfg ) {
cfg.setGroup("PlayList");
QString currentString = cfg.readEntry("current", "" );
int noOfFiles = cfg.readNumEntry("NumberOfFiles", 0 );
for ( int i = 0; i < noOfFiles; i++ ) {
QString entryName;
entryName.sprintf( "File%i", i + 1 );
QString linkFile = cfg.readEntry( entryName );
DocLnk lnk( linkFile );
if ( lnk.isValid() ) {
d->selectedFiles->addToSelection( lnk );
}
}
d->selectedFiles->setSelectedItem( currentString);
}
void PlayListWidget::writeConfig( Config& cfg ) const {
d->selectedFiles->writeCurrent( cfg);
cfg.setGroup("PlayList");
int noOfFiles = 0;
d->selectedFiles->first();
do {
const DocLnk *lnk = d->selectedFiles->current();
if ( lnk ) {
QString entryName;
entryName.sprintf( "File%i", noOfFiles + 1 );
// odebug << entryName << oendl;
cfg.writeEntry( entryName, lnk->linkFile() );
// if this link does exist, add it so we have the file
// next time...
if ( !QFile::exists( lnk->linkFile() ) ) {
// the way writing lnks doesn't really check for out
// of disk space, but check it anyway.
// if ( !lnk->writeLink() ) {
// QMessageBox::critical( 0, tr("Out of space"),
// tr( "There was a problem saving "
// "the playlist.\n"
// "Your playlist "
// "may be missing some entries\n"
// "the next time you start it." )
// );
// }
}
noOfFiles++;
}
}
while ( d->selectedFiles->next() );
cfg.writeEntry("NumberOfFiles", noOfFiles );
}
void PlayListWidget::addToSelection( const DocLnk& lnk ) {
d->setDocumentUsed = false;
if ( mediaPlayerState->playlist() ) {
if(QFileInfo(lnk.file()).exists() || lnk.file().left(4) == "http" )
d->selectedFiles->addToSelection( lnk );
}
else
mediaPlayerState->setPlaying( true);
}
void PlayListWidget::clearList() {
while ( first() )
d->selectedFiles->removeSelected();
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
cfg.writeEntry("CurrentPlaylist","");
currentPlayList="";
}
void PlayListWidget::addAllToList() {
DocLnkSet filesAll;
Global::findDocuments(&filesAll, "video/*;audio/*");
QListIterator<DocLnk> Adit( filesAll.children() );
for ( ; Adit.current(); ++Adit )
if(QFileInfo(Adit.current()->file()).exists())
d->selectedFiles->addToSelection( **Adit );
tabWidget->setCurrentPage(0);
writeCurrentM3u();
d->selectedFiles->first();
}
void PlayListWidget::addAllMusicToList() {
QListIterator<DocLnk> dit( files.children() );
for ( ; dit.current(); ++dit )
if(QFileInfo(dit.current()->file()).exists())
d->selectedFiles->addToSelection( **dit );
tabWidget->setCurrentPage(0);
writeCurrentM3u();
d->selectedFiles->first();
}
void PlayListWidget::addAllVideoToList() {
QListIterator<DocLnk> dit( vFiles.children() );
for ( ; dit.current(); ++dit )
if(QFileInfo( dit.current()->file()).exists())
d->selectedFiles->addToSelection( **dit );
tabWidget->setCurrentPage(0);
writeCurrentM3u();
d->selectedFiles->first();
}
void PlayListWidget::setDocument(const QString& fileref) {
fromSetDocument = true;
d->setDocumentUsed = TRUE;
setDocumentEx(fileref);
}
void PlayListWidget::setDocumentEx(const QString& fileref) {
odebug << "opieplayer receive "+fileref << oendl;
clearList();
DocLnk lnk;
QFileInfo fileInfo(fileref);
if ( !fileInfo.exists() ) {
QMessageBox::critical( 0, tr( "Invalid File" ),
tr( "There was a problem in getting the file." ) );
return;
}
// odebug << "<<<<<<<<<<<<<<<<<<<<<<setDocument "+fileref << oendl;
QString extension = fileInfo.extension(false);
if( extension.find( "m3u", 0, false) != -1) { //is m3u
readm3u( fileref);
}
else if( extension.find( "pls", 0, false) != -1 ) { //is pls
readPls( fileref);
}
else if( fileref.find("playlist",0,TRUE) != -1) {//is playlist
clearList();
lnk.setName( fileInfo.baseName() ); //sets name
lnk.setFile( fileref ); //sets file name
lnk.setIcon("Sound");
//addToSelection( lnk );
loadList( lnk);
d->selectedFiles->first();
} else {
if( fileref.find(".desktop",0,TRUE) != -1) {
lnk = DocLnk(fileref);
} else {
lnk.setName( fileInfo.baseName() ); //sets name
lnk.setFile( fileref ); //sets file name
lnk.setIcon("Sound");
}
addToSelection( lnk );
// addToSelection( DocLnk( fileref ) );
lnk.removeLinkFile();
// qApp->processEvents();
}
setCaption(tr("OpiePlayer"));
d->setDocumentUsed = TRUE;
d->selectedFiles->setSelected(d->selectedFiles->firstChild(),true );
mediaPlayerState->setPlaying( FALSE );
qApp->processEvents();
mediaPlayerState->setPlaying( TRUE );
}
void PlayListWidget::setActiveWindow() {
// odebug << "SETTING active window" << oendl;
// When we get raised we need to ensure that it switches views
char origView = mediaPlayerState->view();
mediaPlayerState->setView( 'l' ); // invalidate
mediaPlayerState->setView( origView ); // now switch back
}
void PlayListWidget::useSelectedDocument() {
d->setDocumentUsed = FALSE;
}
const DocLnk *PlayListWidget::current() { // this is fugly
switch (tabWidget->currentPageIndex()) {
case 0: //playlist
{
// odebug << "playlist" << oendl;
if ( mediaPlayerState->playlist() ) {
return d->selectedFiles->current();
}
else if ( d->setDocumentUsed && d->current ) {
return d->current;
} else {
return &(d->files->selectedDocument());
}
}
break;
case 1://audio
{
// odebug << "audioView" << oendl;
QListIterator<DocLnk> dit( files.children() );
for ( ; dit.current(); ++dit ) {
if( dit.current()->name() == audioView->currentItem()->text(0) && !insanityBool) {
insanityBool=TRUE;
return dit;
}
}
}
break;
case 2: // video
{
QListIterator<DocLnk> Vdit( vFiles.children() );
for ( ; Vdit.current(); ++Vdit ) {
if( Vdit.current()->name() == videoView->currentItem()->text(0) && !insanityBool) {
insanityBool=TRUE;
return Vdit;
}
}
}
break;
};
return 0;
}
bool PlayListWidget::prev() {
if ( mediaPlayerState->playlist() ) {
if ( mediaPlayerState->shuffled() ) {
const DocLnk *cur = current();
int j = 1 + (int)(97.0 * rand() / (RAND_MAX + 1.0));
for ( int i = 0; i < j; i++ ) {
if ( !d->selectedFiles->next() )
d->selectedFiles->first();
}
if ( cur == current() )
if ( !d->selectedFiles->next() )
d->selectedFiles->first();
return TRUE;
} else {
if ( !d->selectedFiles->prev() ) {
if ( mediaPlayerState->looping() ) {
return d->selectedFiles->last();
} else {
return FALSE;
}
}
return TRUE;
}
} else {
return mediaPlayerState->looping();
}
}
bool PlayListWidget::next() {
if ( mediaPlayerState->playlist() ) {
if ( mediaPlayerState->shuffled() ) {
return prev();
} else {
if ( !d->selectedFiles->next() ) {
if ( mediaPlayerState->looping() ) {
return d->selectedFiles->first();
} else {
return FALSE;
}
}
return TRUE;
}
} else {
return mediaPlayerState->looping();
}
}
bool PlayListWidget::first() {
if ( mediaPlayerState->playlist() )
return d->selectedFiles->first();
else
return mediaPlayerState->looping();
}
bool PlayListWidget::last() {
if ( mediaPlayerState->playlist() )
return d->selectedFiles->last();
else
return mediaPlayerState->looping();
}
void PlayListWidget::saveList() {
writem3u();
}
void PlayListWidget::loadList( const DocLnk & lnk) {
QString name = lnk.name();
// odebug << "<<<<<<<<<<<<<<<<<<<<<<<<currentList is "+name << oendl;
if( name.length()>0) {
setCaption("OpiePlayer: "+name);
// odebug << "<<<<<<<<<<<<load list "+ lnk.file() << oendl;
clearList();
readm3u(lnk.file());
tabWidget->setCurrentPage(0);
}
}
void PlayListWidget::setPlaylist( bool shown ) {
if ( shown )
d->playListFrame->show();
else
d->playListFrame->hide();
}
void PlayListWidget::setView( char view ) {
if ( view == 'l' )
QPEApplication::showWidget( this );
else
hide();
}
void PlayListWidget::addSelected() {
DocLnk lnk;
QString filename;
switch (tabWidget->currentPageIndex()) {
case 0: //playlist
return;
break;
case 1: { //audio
QListViewItemIterator it( audioView );
for ( ; it.current(); ++it ) {
if ( it.current()->isSelected() ) {
filename = it.current()->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
}
}
audioView->clearSelection();
// d->selectedFiles->next();
}
break;
case 2: { // video
QListViewItemIterator it( videoView );
for ( ; it.current(); ++it ) {
if ( it.current()->isSelected() ) {
filename = it.current()->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
}
}
videoView->clearSelection();
}
break;
};
// tabWidget->setCurrentPage(0);
writeCurrentM3u();
}
void PlayListWidget::removeSelected() {
d->selectedFiles->removeSelected( );
}
void PlayListWidget::playIt( QListViewItem *) {
// d->setDocumentUsed = FALSE;
// mediaPlayerState->curPosition =0;
// mediaPlayerState->setPlaying(FALSE);
mediaPlayerState->setPlaying(TRUE);
d->selectedFiles->unSelect();
}
void PlayListWidget::addToSelection( QListViewItem *it) {
d->setDocumentUsed = FALSE;
if(it) {
switch ( tabWidget->currentPageIndex()) {
case 0: //playlist
return;
break;
};
// case 1: {
DocLnk lnk;
QString filename;
filename=it->text(3);
lnk.setName( fullBaseName ( QFileInfo(filename)) ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
if(tabWidget->currentPageIndex() == 0)
writeCurrentM3u();
// tabWidget->setCurrentPage(0);
}
}
void PlayListWidget::tabChanged(QWidget *) {
switch ( tabWidget->currentPageIndex()) {
case 0:
{
if( !tbDeletePlaylist->isHidden())
tbDeletePlaylist->hide();
d->tbRemoveFromList->setEnabled(TRUE);
d->tbAddToList->setEnabled(FALSE);
}
break;
case 1:
{
audioView->clear();
populateAudioView();
if( !tbDeletePlaylist->isHidden())
tbDeletePlaylist->hide();
d->tbRemoveFromList->setEnabled(FALSE);
d->tbAddToList->setEnabled(TRUE);
}
break;
case 2:
{
videoView->clear();
populateVideoView();
if( !tbDeletePlaylist->isHidden())
tbDeletePlaylist->hide();
d->tbRemoveFromList->setEnabled(FALSE);
d->tbAddToList->setEnabled(TRUE);
}
break;
case 3:
{
if( tbDeletePlaylist->isHidden())
tbDeletePlaylist->show();
playLists->reread();
}
break;
};
}
void PlayListWidget::btnPlay(bool b) {
// mediaPlayerState->setPlaying(b);
switch ( tabWidget->currentPageIndex()) {
case 0:
{
// if( d->selectedFiles->current()->file().find(" ",0,TRUE) != -1
// if( d->selectedFiles->current()->file().find("%20",0,TRUE) != -1) {
// QMessageBox::message("Note","You are trying to play\na malformed url.");
// } else {
mediaPlayerState->setPlaying(b);
insanityBool=FALSE;
odebug << "insanity" << oendl;
// }
}
break;
case 1:
{
// d->selectedFiles->unSelect();
addToSelection( audioView->currentItem() );
mediaPlayerState->setPlaying( b);
d->selectedFiles->removeSelected( );
d->selectedFiles->unSelect();
tabWidget->setCurrentPage(1);
insanityBool=FALSE;
}// audioView->clearSelection();
break;
case 2:
{
addToSelection( videoView->currentItem() );
mediaPlayerState->setPlaying( b);
// qApp->processEvents();
d->selectedFiles->removeSelected( );
d->selectedFiles->unSelect();
tabWidget->setCurrentPage(2);
insanityBool=FALSE;
}// videoView->clearSelection();
break;
};
}
void PlayListWidget::deletePlaylist() {
switch( QMessageBox::information( this, (tr("Remove Playlist?")),
(tr("You really want to delete\nthis playlist?")),
(tr("Yes")), (tr("No")), 0 )){
case 0: // Yes clicked,
QFile().remove(playLists->selectedDocument().file());
QFile().remove(playLists->selectedDocument().linkFile());
playLists->reread();
break;
case 1: // Cancel
break;
};
}
void PlayListWidget::viewPressed( int mouse, QListViewItem *, const QPoint&, int )
{
switch (mouse) {
case 1:
break;
case 2:{
QPopupMenu m;
m.insertItem( tr( "Play" ), this, SLOT( playSelected() ));
m.insertItem( tr( "Add to Playlist" ), this, SLOT( addSelected() ));
m.insertSeparator();
if( QFile(QPEApplication::qpeDir()+"lib/libopie.so").exists() )
m.insertItem( tr( "Properties" ), this, SLOT( listDelete() ));
m.exec( QCursor::pos() );
}
break;
};
}
void PlayListWidget::playSelected()
{
btnPlay( true);
// d->selectedFiles->unSelect();
}
void PlayListWidget::playlistViewPressed( int mouse, QListViewItem *, const QPoint&, int)
{
switch (mouse) {
case 1:
break;
case 2:{
QPopupMenu m;
m.insertItem( tr( "Play Selected" ), this, SLOT( playSelected() ));
m.insertItem( tr( "Remove" ), this, SLOT( removeSelected() ));
// m.insertSeparator();
// m.insertItem( tr( "Properties" ), this, SLOT( listDelete() ));
m.exec( QCursor::pos() );
}
break;
};
}
void PlayListWidget::listDelete() {
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
currentPlayList = cfg.readEntry("CurrentPlaylist","");
QString file;
// int noOfFiles = cfg.readNumEntry("NumberOfFiles", 0 );
switch ( tabWidget->currentPageIndex()) {
case 0:
break;
case 1:
{
file = audioView->currentItem()->text(0);
QListIterator<DocLnk> Pdit( files.children() );
for ( ; Pdit.current(); ++Pdit ) {
if( Pdit.current()->name() == file) {
LnkProperties prop( Pdit.current() );
QPEApplication::execDialog( &prop );
}
}
populateAudioView();
}
break;
case 2:
{
// file = videoView->selectedItem()->text(0);
// for ( int i = 0; i < noOfFiles; i++ ) {
// QString entryName;
// entryName.sprintf( "File%i", i + 1 );
// QString linkFile = cfg.readEntry( entryName );
// AppLnk lnk( AppLnk(linkFile));
// if( lnk.name() == file ) {
// LnkProperties prop( &lnk);
// // connect(&prop, SIGNAL(select(const AppLnk*)), this, SLOT(externalSelected(const AppLnk*)));
// prop.showMaximized();
// prop.exec();
// }
// }
}
break;
};
}
void PlayListWidget::scanForAudio() {
// odebug << "scan for audio" << oendl;
files.detachChildren();
QListIterator<DocLnk> sdit( files.children() );
for ( ; sdit.current(); ++sdit ) {
delete sdit.current();
}
Global::findDocuments( &files, audioMimes);
audioScan = true;
}
void PlayListWidget::scanForVideo() {
// odebug << "scan for video" << oendl;
vFiles.detachChildren();
QListIterator<DocLnk> sdit( vFiles.children() );
for ( ; sdit.current(); ++sdit ) {
delete sdit.current();
}
Global::findDocuments(&vFiles, "video/*");
videoScan = true;
}
void PlayListWidget::populateAudioView() {
audioView->clear();
StorageInfo storageInfo;
const QList<FileSystem> &fs = storageInfo.fileSystems();
if(!audioScan) scanForAudio();
QListIterator<DocLnk> dit( files.children() );
QListIterator<FileSystem> it ( fs );
QString storage;
for ( ; dit.current(); ++dit ) {
for( ; it.current(); ++it ){
const QString name = (*it)->name();
const QString path = (*it)->path();
if(dit.current()->file().find(path) != -1 ) storage=name;
}
QListViewItem * newItem;
if ( QFile( dit.current()->file()).exists() || dit.current()->file().left(4) == "http" ) {
long size;
if( dit.current()->file().left(4) == "http" )
size=0;
else
size = QFile( dit.current()->file() ).size();
// odebug << dit.current()->name() << oendl;
newItem= /*(void)*/ new QListViewItem( audioView, dit.current()->name(),
QString::number(size ), storage, dit.current()->file());
newItem->setPixmap(0, Resource::loadPixmap( "opieplayer/musicfile" ));
}
}
}
void PlayListWidget::populateVideoView() {
videoView->clear();
StorageInfo storageInfo;
const QList<FileSystem> &fs = storageInfo.fileSystems();
if(!videoScan ) scanForVideo();
QListIterator<DocLnk> Vdit( vFiles.children() );
QListIterator<FileSystem> it ( fs );
videoView->clear();
QString storage;
for ( ; Vdit.current(); ++Vdit ) {
for( ; it.current(); ++it ){
const QString name = (*it)->name();
const QString path = (*it)->path();
if( Vdit.current()->file().find(path) != -1 ) storage=name;
}
QListViewItem * newItem;
if ( QFile( Vdit.current()->file()).exists() ) {
newItem= /*(void)*/ new QListViewItem( videoView, Vdit.current()->name(),
QString::number( QFile( Vdit.current()->file() ).size() ),
storage, Vdit.current()->file());
newItem->setPixmap(0, Resource::loadPixmap( "opieplayer/videofile" ));
}
}
}
void PlayListWidget::openFile() {
QString filename, name;
InputDialog *fileDlg;
fileDlg = new InputDialog(this,tr("Open file or URL"),TRUE, 0);
fileDlg->exec();
if( fileDlg->result() == 1 ) {
filename = fileDlg->text();
// odebug << "Selected filename is " + filename << oendl;
DocLnk lnk;
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
QString m3uFile;
m3uFile = filename;
if(filename.left(4) == "http") {
if(filename.find(":",8,TRUE) != -1) { //found a port
m3uFile = filename;
if( m3uFile.right( 1 ).find( '/' ) == -1) {
m3uFile += "/";
}
filename = m3uFile;
}
lnk.setName( m3uFile ); //sets name
lnk.setFile( filename ); //sets file name
lnk.setIcon("opieplayer2/musicfile");
d->selectedFiles->addToSelection( lnk );
writeCurrentM3u();
}
else if( filename.right( 3) == "m3u" ) {
readm3u( filename );
} else if( filename.right(3) == "pls" ) {
readPls( filename );
} else {
lnk.setName( fullBaseName ( QFileInfo(filename)) ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
lnk.removeLinkFile();
writeCurrentM3u();
}
}
if( fileDlg ) {
delete fileDlg;
}
}
/*
reads m3u and shows files/urls to playlist widget */
void PlayListWidget::readm3u( const QString &filename ) {
// odebug << "read m3u filename " + filename << oendl;
Om3u *m3uList;
QString s, name;
m3uList = new Om3u( filename, IO_ReadOnly );
m3uList->readM3u();
DocLnk lnk;
for ( QStringList::ConstIterator it = m3uList->begin(); it != m3uList->end(); ++it ) {
s = *it;
// odebug << "reading "+ s << oendl;
if(s.left(4)=="http") {
lnk.setName( s ); //sets file name
lnk.setIcon("opieplayer2/musicfile");
// if(s.right(4) != '.' || s.right(5) != '.')
if(s.right(4) != '.' || s.right(5) != '.' )
if( s.right(1) != "/")
lnk.setFile( s+"/"); //if url with no extension
else
lnk.setFile( s ); //sets file name
} else {
// if( QFileInfo( s ).exists() ) {
lnk.setName( fullBaseName ( QFileInfo(s)));
// if(s.right(4) == '.') {//if regular file
if(s.left(1) != "/") {
// odebug << "set link "+QFileInfo(filename).dirPath()+"/"+s << oendl;
lnk.setFile( QFileInfo(filename).dirPath()+"/"+s);
lnk.setIcon("SoundPlayer");
} else {
// odebug << "set link2 "+s << oendl;
lnk.setFile( s);
lnk.setIcon("SoundPlayer");
}
}
d->selectedFiles->addToSelection( lnk );
}
Config config( "OpiePlayer" );
config.setGroup( "PlayList" );
config.writeEntry("CurrentPlaylist",filename);
config.write();
currentPlayList=filename;
// m3uList->write();
m3uList->close();
if(m3uList) delete m3uList;
d->selectedFiles->setSelectedItem( s);
setCaption(tr("OpiePlayer: ")+ fullBaseName ( QFileInfo(filename)));
}
/*
reads pls and adds files/urls to playlist */
void PlayListWidget::readPls( const QString &filename ) {
// odebug << "pls filename is " + filename << oendl;
Om3u *m3uList;
QString s, name;
m3uList = new Om3u( filename, IO_ReadOnly );
m3uList->readPls();
for ( QStringList::ConstIterator it = m3uList->begin(); it != m3uList->end(); ++it ) {
s = *it;
// s.replace( QRegExp( "%20" )," " );
DocLnk lnk( s );
QFileInfo f( s );
QString name = fullBaseName ( f);
if( name.left( 4 ) == "http" ) {
name = s.right( s.length() - 7);
} else {
name = s;
}
name = name.right( name.length() - name.findRev( "\\", -1, TRUE) - 1 );
lnk.setName( name );
if( s.at( s.length() - 4) == '.') {// if this is probably a file
lnk.setFile( s );
} else { //if its a url
if( name.right( 1 ).find( '/' ) == -1) {
s += "/";
}
lnk.setFile( s );
}
lnk.setType( "audio/x-mpegurl" );
lnk.writeLink();
d->selectedFiles->addToSelection( lnk );
}
m3uList->close();
if(m3uList) delete m3uList;
}
/*
writes current playlist to current m3u file */
void PlayListWidget::writeCurrentM3u() {
// odebug << "writing to current m3u" << oendl;
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
currentPlayList = cfg.readEntry("CurrentPlaylist","");
Om3u *m3uList;
m3uList = new Om3u( currentPlayList, IO_ReadWrite | IO_Truncate );
if( d->selectedFiles->first()) {
do {
// odebug << "writeCurrentM3u " +d->selectedFiles->current()->file() << oendl;
m3uList->add( d->selectedFiles->current()->file() );
}
while ( d->selectedFiles->next() );
// odebug << "<<<<<<<<<<<<>>>>>>>>>>>>>>>>>" << oendl;
m3uList->write();
m3uList->close();
if(m3uList) delete m3uList;
}
}
/*
writes current playlist to m3u file */
void PlayListWidget::writem3u() {
InputDialog *fileDlg;
fileDlg = new InputDialog( this, tr( "Save m3u Playlist " ), TRUE, 0);
fileDlg->exec();
QString name, filename, list;
Om3u *m3uList;
if( fileDlg->result() == 1 ) {
name = fileDlg->text();
// odebug << filename << oendl;
if( name.find("/",0,true) != -1) {// assume they specify a file path
filename = name;
name = name.right(name.length()- name.findRev("/",-1,true) - 1 );
}
else //otherwise dump it somewhere noticable
filename = QPEApplication::documentDir() + "/" + name;
if( filename.right( 3 ) != "m3u" ) //needs filename extension
filename += ".m3u";
if( d->selectedFiles->first()) {
m3uList = new Om3u(filename, IO_ReadWrite | IO_Truncate);
do {
m3uList->add( d->selectedFiles->current()->file());
}
while ( d->selectedFiles->next() );
// odebug << list << oendl;
m3uList->write();
m3uList->close();
if(m3uList) delete m3uList;
if(fileDlg) delete fileDlg;
DocLnk lnk;
lnk.setFile( filename);
lnk.setIcon("opieplayer2/playlist2");
lnk.setName( name); //sets file name
// odebug << filename << oendl;
Config config( "OpiePlayer" );
config.setGroup( "PlayList" );
config.writeEntry("CurrentPlaylist",filename);
currentPlayList=filename;
if(!lnk.writeLink()) {
// odebug << "Writing doclink did not work" << oendl;
}
setCaption(tr("OpiePlayer: ") + name);
}
}
}
void PlayListWidget::keyReleaseEvent( QKeyEvent *e)
{
switch ( e->key() ) {
////////////////////////////// Zaurus keys
case Key_F9: //activity
// if(audioUI->isHidden())
// audioUI->showMaximized();
break;
case Key_F10: //contacts
// if( videoUI->isHidden())
// videoUI->showMaximized();
break;
case Key_F11: //menu
break;
case Key_F12: //home
// doBlank();
break;
case Key_F13: //mail
// doUnblank();
break;
case Key_Q: //add to playlist
addSelected();
break;
case Key_R: //remove from playlist
removeSelected();
break;
// case Key_P: //play
// odebug << "Play" << oendl;
// playSelected();
// break;
case Key_Space:
// playSelected(); puh
break;
case Key_1:
tabWidget->setCurrentPage(0);
break;
case Key_2:
tabWidget->setCurrentPage(1);
break;
case Key_3:
tabWidget->setCurrentPage(2);
break;
case Key_4:
tabWidget->setCurrentPage(3);
break;
case Key_Down:
if ( !d->selectedFiles->next() )
d->selectedFiles->first();
break;
case Key_Up:
if ( !d->selectedFiles->prev() )
// d->selectedFiles->last();
break;
}
}
void PlayListWidget::keyPressEvent( QKeyEvent *)
{
// odebug << "Key press" << oendl;
// switch ( e->key() ) {
// ////////////////////////////// Zaurus keys
// case Key_A: //add to playlist
// odebug << "Add" << oendl;
// addSelected();
// break;
// case Key_R: //remove from playlist
// removeSelected();
// break;
// case Key_P: //play
// odebug << "Play" << oendl;
// playSelected();
// break;
// case Key_Space:
// odebug << "Play" << oendl;
// playSelected();
// break;
// }
}
void PlayListWidget::doBlank() {
// odebug << "do blanking" << oendl;
#ifdef QT_QWS_DEVFS
fd=open("/dev/fb/0",O_RDWR);
#else
fd=open("/dev/fb0",O_RDWR);
#endif
if (fd != -1) {
ioctl(fd,FBIOBLANK,1);
// close(fd);
}
}
void PlayListWidget::doUnblank() {
// this crashes opieplayer with a segfault
// int fd;
// fd=open("/dev/fb0",O_RDWR);
// odebug << "do unblanking" << oendl;
if (fd != -1) {
ioctl(fd,FBIOBLANK,0);
close(fd);
}
QCopEnvelope h("QPE/System", "setBacklight(int)");
h <<-3;// v[1]; // -3 Force on
}
void PlayListWidget::populateSkinsMenu() {
int item = 0;
defaultSkinIndex = 0;
QString skinName;
Config cfg( "OpiePlayer" );
cfg.setGroup("Options" );
QString skin = cfg.readEntry( "Skin", "default" );
- QDir skinsDir( QPEApplication::qpeDir() + "/pics/opieplayer2/skins" );
+ QDir skinsDir( QPEApplication::qpeDir() + "pics/opieplayer2/skins" );
skinsDir.setFilter( QDir::Dirs );
skinsDir.setSorting(QDir::Name );
const QFileInfoList *skinslist = skinsDir.entryInfoList();
QFileInfoListIterator it( *skinslist );
QFileInfo *fi;
while ( ( fi = it.current() ) ) {
skinName = fi->fileName();
// odebug << fi->fileName() << oendl;
if( skinName != "." && skinName != ".." && skinName !="CVS" ) {
item = skinsMenu->insertItem( fi->fileName() ) ;
}
if( skinName == "default" ) {
defaultSkinIndex = item;
}
if( skinName == skin ) {
skinsMenu->setItemChecked( item, TRUE );
}
++it;
}
}
void PlayListWidget::skinsMenuActivated( int item ) {
for( int i = defaultSkinIndex; i > defaultSkinIndex - static_cast<int>(skinsMenu->count()); i-- ) {
skinsMenu->setItemChecked( i, FALSE );
}
skinsMenu->setItemChecked( item, TRUE );
Config cfg( "OpiePlayer" );
cfg.setGroup("Options");
cfg.writeEntry("Skin", skinsMenu->text( item ) );
}
void PlayListWidget::qcopReceive(const QCString &msg, const QByteArray &data) {
// odebug << "qcop message "+msg << oendl;
QDataStream stream ( data, IO_ReadOnly );
if ( msg == "play()" ) { //plays current selection
btnPlay( true);
} else if ( msg == "stop()" ) {
mediaPlayerState->setPlaying( false);
} else if ( msg == "togglePause()" ) {
mediaPlayerState->togglePaused();
} else if ( msg == "next()" ) { //select next in lis
mediaPlayerState->setNext();
} else if ( msg == "prev()" ) { //select previous in list
mediaPlayerState->setPrev();
} else if ( msg == "toggleLooping()" ) { //loop or not loop
mediaPlayerState->toggleLooping();
} else if ( msg == "toggleShuffled()" ) { //shuffled or not shuffled
mediaPlayerState->toggleShuffled();
} else if ( msg == "volUp()" ) { //volume more
// emit moreClicked();
// emit moreReleased();
} else if ( msg == "volDown()" ) { //volume less
// emit lessClicked();
// emit lessReleased();
} else if ( msg == "play(QString)" ) { //play this now
QString file;
stream >> file;
setDocumentEx( (const QString &) file);
} else if ( msg == "add(QString)" ) { //add to playlist
QString file;
stream >> file;
QFileInfo fileInfo(file);
DocLnk lnk;
lnk.setName( fileInfo.baseName() ); //sets name
lnk.setFile( file ); //sets file name
addToSelection( lnk );
} else if ( msg == "rem(QString)" ) { //remove from playlist
QString file;
stream >> file;
} else if ( msg == "setDocument(QString)" ) { //loop or not loop
QCopEnvelope h("QPE/Application/opieplayer", "raise()");
}
}
diff --git a/core/multimedia/opieplayer/videowidget.cpp b/core/multimedia/opieplayer/videowidget.cpp
index 2396ed5..c545511 100644
--- a/core/multimedia/opieplayer/videowidget.cpp
+++ b/core/multimedia/opieplayer/videowidget.cpp
@@ -1,680 +1,680 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "videowidget.h"
#include "mediaplayerstate.h"
/* OPIE */
#include <qpe/resource.h>
#include <qpe/mediaplayerplugininterface.h>
#include <qpe/config.h>
#include <qpe/qpeapplication.h>
#include <opie2/odebug.h>
/* QT */
#include <qdir.h>
#include <qslider.h>
#ifdef Q_WS_QWS
# define USE_DIRECT_PAINTER
# include <qdirectpainter_qws.h>
# include <qgfxraster_qws.h>
#endif
extern MediaPlayerState *mediaPlayerState;
static const int xo = 2; // movable x offset
static const int yo = 0; // movable y offset
struct MediaButton {
// int xPos, yPos;
bool isToggle, isHeld, isDown;
// int controlType;
};
// Layout information for the videoButtons (and if it is a toggle button or not)
MediaButton videoButtons[] = {
{ FALSE, FALSE, FALSE }, // stop
{ FALSE, FALSE, FALSE }, // play
{ FALSE, FALSE, FALSE }, // previous
{ FALSE, FALSE, FALSE }, // next
{ FALSE, FALSE, FALSE }, // volUp
{ FALSE, FALSE, FALSE }, // volDown
{ TRUE, FALSE, FALSE } // fullscreen
};
//static const int numButtons = (sizeof(videoButtons)/sizeof(MediaButton));
const char *skinV_mask_file_names[7] = {
"stop","play","back","fwd","up","down","full"
};
static const int numVButtons = (sizeof(videoButtons)/sizeof(MediaButton));
VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) :
QWidget( parent, name, f ), scaledWidth( 0 ), scaledHeight( 0 )
{
setCaption( tr("OpiePlayer") );
Config cfg("OpiePlayer");
cfg.setGroup("Options");
skin = cfg.readEntry("Skin","default");
QString skinPath;
skinPath = "opieplayer2/skins/" + skin;
if(!QDir(QString(getenv("OPIEDIR")) +"/pics/"+skinPath).exists())
skinPath = "opieplayer2/skins/default";
// QString skinPath = "opieplayer2/skins/" + skin;
pixBg = new QPixmap( Resource::loadPixmap( QString("%1/background").arg(skinPath) ) );
imgUp = new QImage( Resource::loadImage( QString("%1/skinV_up").arg(skinPath) ) );
imgDn = new QImage( Resource::loadImage( QString("%1/skinV_down").arg(skinPath) ) );
imgButtonMask = new QImage( imgUp->width(), imgUp->height(), 8, 255 );
imgButtonMask->fill( 0 );
for ( int i = 0; i < 7; i++ ) {
- QString filename = QString( QPEApplication::qpeDir() + "/pics/" + skinPath +
+ QString filename = QString( QPEApplication::qpeDir() + "pics/" + skinPath +
"/skinV_mask_" + skinV_mask_file_names[i] + ".png" );
// odebug << "loading "+filename << oendl;
masks[i] = new QBitmap( filename );
if ( !masks[i]->isNull() ) {
QImage imgMask = masks[i]->convertToImage();
uchar **dest = imgButtonMask->jumpTable();
for ( int y = 0; y < imgUp->height(); y++ ) {
uchar *line = dest[y];
for ( int x = 0; x < imgUp->width(); x++ ) {
if ( !qRed( imgMask.pixel( x, y ) ) )
line[x] = i + 1;
}
}
}
}
for ( int i = 0; i < 7; i++ ) {
buttonPixUp[i] = NULL;
buttonPixDown[i] = NULL;
}
QWidget *d = QApplication::desktop();
int width = d->width();
int height = d->height();
if( (width != pixBg->width() ) || (height != pixBg->height() ) ) {
QImage img;
img = pixBg->convertToImage();
pixBg->convertFromImage( img.smoothScale( width, height));
}
setBackgroundPixmap( *pixBg );
currentFrame = new QImage( 220 + 2, 160, (QPixmap::defaultDepth() == 16) ? 16 : 32 );
slider = new QSlider( Qt::Horizontal, this );
slider->setMinValue( 0 );
slider->setMaxValue( 1 );
slider->setBackgroundPixmap( *pixBg );
slider->setFocusPolicy( QWidget::NoFocus );
// slider->setGeometry( QRect( 7, 250, 220, 20 ) );
connect(slider,SIGNAL(sliderPressed()),this,SLOT(sliderPressed()));
connect(slider,SIGNAL(sliderReleased()),this,SLOT(sliderReleased()));
connect(mediaPlayerState,SIGNAL(lengthChanged(long)),this,SLOT(setLength(long)));
connect(mediaPlayerState,SIGNAL(positionChanged(long)),this,SLOT(setPosition(long)));
connect(mediaPlayerState,SIGNAL(positionUpdated(long)),this,SLOT(setPosition(long)));
connect(mediaPlayerState,SIGNAL(viewChanged(char)),this,SLOT(setView(char)));
// connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) );
connect(mediaPlayerState,SIGNAL(playingToggled(bool)),this,SLOT(setPlaying(bool)));
// Intialise state
setLength( mediaPlayerState->length() );
setPosition( mediaPlayerState->position() );
setFullscreen( mediaPlayerState->fullscreen() );
// setPlaying( mediaPlayerState->playing() );
// if(this->x() < 0 || this->y() < 0)
// this->move(0,0);
}
VideoWidget::~VideoWidget() {
for ( int i = 0; i < 7; i++ )
{
delete buttonPixUp[i];
delete buttonPixDown[i];
}
delete pixBg;
delete imgUp;
delete imgDn;
delete imgButtonMask;
for ( int i = 0; i < 7; i++ )
{
delete masks[i];
}
// for ( int i = 0; i < 3; i++ )
// delete pixmaps[i];
// delete currentFrame;
}
static bool videoSliderBeingMoved = FALSE;
QPixmap *combineVImageWithBackground( QImage img, QPixmap bg, QPoint offset ) {
QPixmap pix( img.width(), img.height() );
QPainter p( &pix );
p.drawTiledPixmap( pix.rect(), bg, offset );
p.drawImage( 0, 0, img );
return new QPixmap( pix );
}
QPixmap *maskVPixToMask( QPixmap pix, QBitmap mask ) {
QPixmap *pixmap = new QPixmap( pix );
pixmap->setMask( mask );
return pixmap;
}
void VideoWidget::resizeEvent( QResizeEvent * ) {
int h = height();
int w = width();
//int Vh = 160;
//int Vw = 220;
slider->setFixedWidth( w - 20 );
slider->setGeometry( QRect( 15, h - 22, w - 90, 20 ) );
slider->setBackgroundOrigin( QWidget::ParentOrigin );
slider->setFocusPolicy( QWidget::NoFocus );
slider->setBackgroundPixmap( *pixBg );
xoff = 0;// ( imgUp->width() ) / 2;
if(w>h)
yoff = 0;
else
yoff = 185;//(( Vh - imgUp->height() ) / 2) - 10;
QPoint p( xoff, yoff );
QPixmap *pixUp = combineVImageWithBackground( *imgUp, *pixBg, p );
QPixmap *pixDn = combineVImageWithBackground( *imgDn, *pixBg, p );
for ( int i = 0; i < 7; i++ )
{
if ( !masks[i]->isNull() )
{
delete buttonPixUp[i];
delete buttonPixDown[i];
buttonPixUp[i] = maskVPixToMask( *pixUp, *masks[i] );
buttonPixDown[i] = maskVPixToMask( *pixDn, *masks[i] );
}
}
delete pixUp;
delete pixDn;
}
void VideoWidget::sliderPressed() {
videoSliderBeingMoved = TRUE;
}
void VideoWidget::sliderReleased() {
videoSliderBeingMoved = FALSE;
if ( slider->width() == 0 )
return;
long val = long((double)slider->value() * mediaPlayerState->length() / slider->width());
mediaPlayerState->setPosition( val );
}
void VideoWidget::setPosition( long i ) {
updateSlider( i, mediaPlayerState->length() );
}
void VideoWidget::setLength( long max ) {
updateSlider( mediaPlayerState->position(), max );
}
void VideoWidget::setView( char view ) {
if ( view == 'v' )
{
makeVisible();
}
else
{
// Effectively blank the view next time we show it so it looks nicer
scaledWidth = 0;
scaledHeight = 0;
hide();
}
}
void VideoWidget::updateSlider( long i, long max ) {
// Will flicker too much if we don't do this
if ( max == 0 )
return;
int width = slider->width();
int val = int((double)i * width / max);
if ( !mediaPlayerState->fullscreen() && !videoSliderBeingMoved )
{
if ( slider->value() != val )
slider->setValue( val );
if ( slider->maxValue() != width )
slider->setMaxValue( width );
}
}
void VideoWidget::setToggleButton( int i, bool down ) {
if ( down != videoButtons[i].isDown )
toggleButton( i );
}
void VideoWidget::toggleButton( int i ) {
videoButtons[i].isDown = !videoButtons[i].isDown;
QPainter p(this);
paintButton ( &p, i );
}
void VideoWidget::paintButton( QPainter *p, int i ) {
if ( videoButtons[i].isDown )
{
p->drawPixmap( xoff, yoff, *buttonPixDown[i] );
}
else
{
p->drawPixmap( xoff, yoff, *buttonPixUp[i] );
}
}
void VideoWidget::mouseMoveEvent( QMouseEvent *event ) {
for ( int i = 0; i < numVButtons; i++ ) {
if ( event->state() == QMouseEvent::LeftButton ) {
// The test to see if the mouse click is inside the button or not
int x = event->pos().x() - xoff;
int y = event->pos().y() - yoff;
bool isOnButton = ( x > 0 && y > 0 && x < imgButtonMask->width()
&& y < imgButtonMask->height()
&& imgButtonMask->pixelIndex( x, y ) == i + 1 );
if ( isOnButton && !videoButtons[i].isHeld ) {
videoButtons[i].isHeld = TRUE;
toggleButton(i);
switch (i) {
case VideoVolUp:
emit moreClicked();
return;
case VideoVolDown:
emit lessClicked();
return;
}
} else if ( !isOnButton && videoButtons[i].isHeld ) {
videoButtons[i].isHeld = FALSE;
toggleButton(i);
}
} else {
if ( videoButtons[i].isHeld ) {
videoButtons[i].isHeld = FALSE;
if ( !videoButtons[i].isToggle ) {
setToggleButton( i, FALSE );
}
switch(i) {
case VideoPlay: {
// odebug << "play" << oendl;
if( !mediaPlayerState->playing()) {
mediaPlayerState->setPlaying( true);
setToggleButton( i-1, false );
setToggleButton( i, false );
return;
}
if( mediaPlayerState->isPaused ) {
// odebug << "isPaused" << oendl;
setToggleButton( i, FALSE );
mediaPlayerState->setPaused( FALSE );
return;
} else if( !mediaPlayerState->isPaused ) {
// odebug << "is not paused" << oendl;
setToggleButton( i, TRUE );
mediaPlayerState->setPaused( TRUE );
return;
} else {
return;
}
}
case VideoStop: mediaPlayerState->setPlaying( FALSE ); setToggleButton( i+1, true); setToggleButton( i, true ); return;
case VideoNext: mediaPlayerState->setNext(); return;
case VideoPrevious: mediaPlayerState->setPrev(); return;
case VideoVolUp: emit moreReleased(); return;
case VideoVolDown: emit lessReleased(); return;
case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return;
}
}
}
}
}
void VideoWidget::mousePressEvent( QMouseEvent *event ) {
mouseMoveEvent( event );
}
void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) {
if ( mediaPlayerState->fullscreen() )
{
mediaPlayerState->setFullscreen( FALSE );
makeVisible();
}
mouseMoveEvent( event );
// }
}
void VideoWidget::makeVisible() {
if ( mediaPlayerState->fullscreen() )
{
setBackgroundMode( QWidget::NoBackground );
showFullScreen();
resize( qApp->desktop()->size() );
slider->hide();
}
else
{
setBackgroundPixmap( *pixBg );
showNormal();
QPEApplication::showWidget( this );
slider->show();
}
}
void VideoWidget::paintEvent( QPaintEvent * pe) {
QPainter p( this );
if ( mediaPlayerState->fullscreen() ) {
// Clear the background
p.setBrush( QBrush( Qt::black ) );
p.drawRect( rect() );
} else {
if ( !pe->erased() ) {
// Combine with background and double buffer
QPixmap pix( pe->rect().size() );
QPainter p( &pix );
p.translate( -pe->rect().topLeft().x(), -pe->rect().topLeft().y() );
p.drawTiledPixmap( pe->rect(), *pixBg, pe->rect().topLeft() );
for ( int i = 0; i < numVButtons; i++ ) {
paintButton( &p, i );
}
QPainter p2( this );
p2.drawPixmap( pe->rect().topLeft(), pix );
} else {
QPainter p( this );
for ( int i = 0; i < numVButtons; i++ )
paintButton( &p, i );
}
slider->repaint( TRUE );
}
}
void VideoWidget::closeEvent( QCloseEvent* ) {
mediaPlayerState->setList();
}
bool VideoWidget::playVideo() {
bool result = FALSE;
// odebug << "<<<<<<<<<<<<<<<< play video" << oendl;
int stream = 0;
int sw = mediaPlayerState->curDecoder()->videoWidth( stream );
int sh = mediaPlayerState->curDecoder()->videoHeight( stream );
int dd = QPixmap::defaultDepth();
int w = height();
int h = width();
QWidget *d = QApplication::desktop();
int d_width = d->width();
int d_height = d->height();
ColorFormat format = (dd == 16) ? RGB565 : BGRA8888;
if ( mediaPlayerState->fullscreen() )
{
#ifdef USE_DIRECT_PAINTER
QDirectPainter p(this);
if ( ( qt_screen->transformOrientation() == 3 ) &&
( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) )
{
w = d_width; //320;
h = d_height; //240;
if ( mediaPlayerState->scaled() )
{
// maintain aspect ratio
if ( w * sh > sw * h )
w = sw * h / sh;
else
h = sh * w / sw;
}
else
{
w = sw;
h = sh;
}
w--; // we can't allow libmpeg to overwrite.
QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) );
int ox = roff.x() - height() + 2 + (height() - w) / 2;
int oy = roff.y() + (width() - h) / 2;
int sx = 0, sy = 0;
uchar* fp = p.frameBuffer() + p.lineStep() * oy;
fp += dd * ox / 8;
uchar **jt = new uchar*[h];
for ( int i = h; i; i-- )
{
jt[h - i] = fp;
fp += p.lineStep();
}
result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0;
delete [] jt;
}
else
{
#endif
QPainter p(this);
w = d_width; //320;
h = d_height; //240;
if ( mediaPlayerState->scaled() )
{
// maintain aspect ratio
if ( w * sh > sw * h )
w = sw * h / sh;
else
h = sh * w / sw;
}
else
{
w = sw;
h = sh;
}
int bytes = ( dd == 16 ) ? 2 : 4;
QImage tempFrame( w, h, bytes << 3 );
result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(),
0, 0, sw, sh, w, h, format, 0) == 0;
if ( result && mediaPlayerState->fullscreen() )
{
int rw = h, rh = w;
QImage rotatedFrame( rw, rh, bytes << 3 );
ushort* in = (ushort*)tempFrame.bits();
ushort* out = (ushort*)rotatedFrame.bits();
int spl = rotatedFrame.bytesPerLine() / bytes;
for (int x=0; x<h; x++)
{
if ( bytes == 2 )
{
ushort* lout = out++ + (w - 1)*spl;
for (int y=0; y<w; y++) {
*lout=*in++;
lout-=spl;
}
}
else
{
ulong* _out = (ulong *)out;
ulong* lout = _out++ + (w - 1)*spl;
for (int y=0; y<w; y++)
{
ulong *_in = (ulong*)in;
*lout=*_in++;
lout-=spl;
}
}
}
p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh );
}
#ifdef USE_DIRECT_PAINTER
}
#endif
}
else
{
w = 220;
h = 160;
// maintain aspect ratio
if ( w * sh > sw * h )
w = sw * h / sh;
else
h = sh * w / sw;
result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0;
QPainter p( this );
int deskW = qApp->desktop()->width();
// Image changed size, therefore need to blank the possibly unpainted regions first
if ( scaledWidth != w || scaledHeight != h )
{
p.setBrush( QBrush( Qt::black ) );
p.drawRect( ( deskW -scaledWidth)/2, 20, scaledWidth, 160 );
}
scaledWidth = w;
scaledHeight = h;
if ( result )
{
p.drawImage( (deskW - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight );
}
}
return result;
}
void VideoWidget::keyReleaseEvent( QKeyEvent *e)
{
switch ( e->key() )
{
////////////////////////////// Zaurus keys
case Key_Home:
break;
case Key_F9: //activity
break;
case Key_F10: //contacts
// hide();
break;
case Key_F11: //menu
break;
case Key_F12: //home
break;
case Key_F13: //mail
break;
case Key_Space:
{
if(mediaPlayerState->playing())
{
mediaPlayerState->setPlaying(FALSE);
}
else
{
mediaPlayerState->setPlaying(TRUE);
}
}
break;
case Key_Down:
// toggleButton(6);
// emit lessClicked();
// emit lessReleased();
// toggleButton(6);
break;
case Key_Up:
// toggleButton(5);
// emit moreClicked();
// emit moreReleased();
// toggleButton(5);
break;
case Key_Right:
mediaPlayerState->setNext();
break;
case Key_Left:
mediaPlayerState->setPrev();
break;
case Key_Escape:
break;
};
}
diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp
index f0a8ba2..0699d0a 100644
--- a/core/opie-login/main.cpp
+++ b/core/opie-login/main.cpp
@@ -1,383 +1,383 @@
/*
=. This file is part of the OPIE Project
.=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org>
.>+-=
_;:, .> :=|. This file is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This file 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 file;
-_. . . )=. = see the file COPYING. If not, write to the
-- :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "loginapplication.h"
#include "loginwindowimpl.h"
#include "calibrate.h"
/* OPIE */
#include <opie2/odevice.h>
#include <qpe/qpestyle.h>
#include <qpe/power.h>
#include <qpe/config.h>
/* QT */
#include <qwindowsystem_qws.h>
#include <qmessagebox.h>
#include <qlabel.h>
#include <qtimer.h>
#include <qfile.h>
/* STD */
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <getopt.h>
#include <string.h>
using namespace Opie::Core;
int login_main ( int argc, char **argv, pid_t ppid );
void sigterm ( int sig );
void sigint ( int sig );
void exit_closelog ( );
static struct option long_options [] = {
{ "autologin", 1, 0, 'a' },
{ 0, 0, 0, 0 }
};
int main ( int argc, char **argv )
{
int userExited = 0;
pid_t ppid = ::getpid ( );
if ( ::geteuid ( ) != 0 ) {
::fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] );
return 1;
}
if ( ::getuid ( ) != 0 ) // qt doesn't really like SUID and
::setuid ( 0 ); // messes up things like config files
char *autolog = 0;
int c;
while (( c = ::getopt_long ( argc, argv, "a:", long_options, 0 )) != -1 ) {
switch ( c ) {
case 'a':
autolog = optarg;
break;
default:
::fprintf ( stderr, "Usage: %s [-a|--autologin=<user>]\n", argv [0] );
return 2;
}
}
// struct rlimit rl;
// ::getrlimit ( RLIMIT_NOFILE, &rl );
// for ( unsigned int i = 0; i < rl. rlim_cur; i++ )
// ::close ( i );
::setpgid ( 0, 0 );
::setsid ( );
::signal ( SIGTERM, sigterm );
::signal ( SIGINT, sigterm );
::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
::atexit ( exit_closelog );
while ( true ) {
pid_t child = ::fork ( );
if ( child < 0 ) {
::syslog ( LOG_ERR, "Could not fork GUI process\n" );
break;
}
else if ( child > 0 ) {
int status = 0;
time_t started = ::time ( 0 );
while ( ::waitpid ( child, &status, 0 ) < 0 ) { }
LoginApplication::logout ( );
if (( ::time ( 0 ) - started ) < 3 ) {
if ( autolog ) {
::syslog ( LOG_ERR, "Respawning too fast -- disabling auto-login\n" );
autolog = 0;
}
else {
::syslog ( LOG_ERR, "Respawning too fast -- going down\n" );
break;
}
}
int killedbysig = 0;
userExited=0;
if (WIFEXITED(status)!=0 ) {
if (WEXITSTATUS(status)==137) {
userExited=1;
}
}
if ( WIFSIGNALED( status )) {
switch ( WTERMSIG( status )) {
case SIGTERM:
case SIGINT :
case SIGKILL:
break;
default :
killedbysig = WTERMSIG( status );
break;
}
}
if ( killedbysig ) { // qpe was killed by an uncaught signal
qApp = 0;
::syslog ( LOG_ERR, "Opie was killed by a signal #%d", killedbysig );
QWSServer::setDesktopBackground ( QImage ( ));
QApplication *app = new QApplication ( argc, argv, QApplication::GuiServer );
app-> setFont ( QFont ( "Helvetica", 10 ));
app-> setStyle ( new QPEStyle ( ));
// const char *sig = ::strsignal ( killedbysig );
const char *sig = ::sys_siglist[killedbysig];
QLabel *l = new QLabel ( 0, "sig", Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_Tool );
l-> setText ( LoginWindowImpl::tr( "Opie was terminated\nby an uncaught signal\n(%1)\n" ). arg ( sig ));
l-> setAlignment ( Qt::AlignCenter );
l-> move ( 0, 0 );
l-> resize ( app-> desktop ( )-> width ( ), app-> desktop ( )-> height ( ));
l-> show ( );
QTimer::singleShot ( 3000, app, SLOT( quit()));
app-> exec ( );
delete app;
qApp = 0;
}
}
else {
if ( !autolog ) {
- QString confFile=QPEApplication::qpeDir() + "/etc/opie-login.conf";
+ QString confFile=QPEApplication::qpeDir() + "etc/opie-login.conf";
Config cfg ( confFile, Config::File );
cfg. setGroup ( "General" );
QString user = cfg. readEntry ( "AutoLogin" );
if ( !user. isEmpty ( ))
autolog = ::strdup ( user. latin1 ( ));
}
if ( autolog && !userExited ) {
QWSServer::setDesktopBackground( QImage() );
ODevice::inst ( )-> setDisplayStatus ( true );
ODevice::inst ( )-> setSoftSuspend ( false );
LoginApplication *app = new LoginApplication ( argc, argv, ppid );
LoginApplication::setLoginAs ( autolog );
if ( LoginApplication::changeIdentity ( ))
::exit ( LoginApplication::login ( ));
else
::exit ( 0 );
}
else {
::exit ( login_main ( argc, argv, ppid ));
}
}
}
return 0;
}
void sigterm ( int /*sig*/ )
{
::exit ( 0 );
}
void exit_closelog ( )
{
::closelog ( );
}
class LoginScreenSaver : public QWSScreenSaver
{
public:
LoginScreenSaver ( )
{
m_lcd_status = true;
m_backlight_bright = -1;
m_backlight_forcedoff = false;
// Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off)
ODevice::inst ( )-> setDisplayStatus ( true );
}
void restore()
{
if ( !m_lcd_status ) // We must have turned it off
ODevice::inst ( ) -> setDisplayStatus ( true );
setBacklight ( -3 );
}
bool save( int level )
{
switch ( level ) {
case 0:
if ( backlight() > 1 )
setBacklight( 1 ); // lowest non-off
return true;
break;
case 1:
setBacklight( 0 ); // off
return true;
break;
case 2:
// We're going to suspend the whole machine
if ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) {
QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
return true;
}
break;
}
return false;
}
private:
public:
void setIntervals( int i1 = 30, int i2 = 20, int i3 = 60 )
{
int v [4];
v [ 0 ] = QMAX( 1000 * i1, 100 );
v [ 1 ] = QMAX( 1000 * i2, 100 );
v [ 2 ] = QMAX( 1000 * i3, 100 );
v [ 3 ] = 0;
if ( !i1 && !i2 && !i3 )
QWSServer::setScreenSaverInterval ( 0 );
else
QWSServer::setScreenSaverIntervals ( v );
}
int backlight ( )
{
if ( m_backlight_bright == -1 )
m_backlight_bright = 255;
return m_backlight_bright;
}
void setBacklight ( int bright )
{
if ( bright == -3 ) {
// Forced on
m_backlight_forcedoff = false;
bright = -1;
}
if ( m_backlight_forcedoff && bright != -2 )
return ;
if ( bright == -2 ) {
// Toggle between off and on
bright = m_backlight_bright ? 0 : -1;
m_backlight_forcedoff = !bright;
}
m_backlight_bright = bright;
bright = backlight ( );
ODevice::inst ( ) -> setDisplayBrightness ( bright );
m_backlight_bright = bright;
}
private:
bool m_lcd_status;
int m_backlight_bright;
bool m_backlight_forcedoff;
};
namespace Opie { extern int force_appearance; } // HACK to get around the force-style setting
int login_main ( int argc, char **argv, pid_t ppid )
{
QWSServer::setDesktopBackground( QImage() );
LoginApplication *app = new LoginApplication ( argc, argv, ppid );
Opie::force_appearance = 0;
app-> setFont ( QFont ( "Helvetica", 10 ));
app-> setStyle ( new QPEStyle ( ));
ODevice::inst ( )-> setSoftSuspend ( true );
if ( QWSServer::mouseHandler() &&
QWSServer::mouseHandler() ->inherits("QCalibratedMouseHandler") ) {
if ( !QFile::exists ( "/etc/pointercal" )) {
// Make sure calibration widget starts on top.
Calibrate *cal = new Calibrate;
cal-> exec ( );
delete cal;
}
}
LoginScreenSaver *saver = new LoginScreenSaver;
saver-> setIntervals ( );
QWSServer::setScreenSaver ( saver );
saver-> restore ( );
LoginWindowImpl *lw = new LoginWindowImpl ( );
app-> setMainWidget ( lw );
lw-> setGeometry ( 0, 0, app-> desktop ( )-> width ( ), app-> desktop ( )-> height ( ));
lw-> show ( );
int rc = app-> exec ( );
ODevice::inst ( )-> setSoftSuspend ( false );
if ( app-> loginAs ( )) {
if ( app-> changeIdentity ( )) {
app-> login ( );
// if login succeeds, it never comes back
QMessageBox::critical ( 0, LoginWindowImpl::tr( "Failure" ), LoginWindowImpl::tr( "Could not start Opie." ));
rc = 1;
}
else {
QMessageBox::critical ( 0, LoginWindowImpl::tr( "Failure" ), LoginWindowImpl::tr( "Could not switch to new user identity" ));
rc = 2;
}
}
return rc;
}
diff --git a/core/settings/launcher/menusettings.cpp b/core/settings/launcher/menusettings.cpp
index 2b64c47..55bf358 100644
--- a/core/settings/launcher/menusettings.cpp
+++ b/core/settings/launcher/menusettings.cpp
@@ -1,178 +1,178 @@
/*
This file is part of the OPIE Project
=. Copyright (c) 2002 Trolltech AS <info@trolltech.com>
.=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org>
.>+-=
_;:, .> :=|. This file is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This file 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 file;
-_. . . )=. = see the file COPYING. If not, write to the
-- :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "menusettings.h"
#include <qpe/config.h>
#include <qpe/qlibrary.h>
#include <qpe/qpeapplication.h>
#include <qpe/menuappletinterface.h>
#include <qpe/qcopenvelope_qws.h>
#include <qdir.h>
#include <qlistview.h>
#include <qcheckbox.h>
#include <qheader.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qwhatsthis.h>
#include <stdlib.h>
MenuSettings::MenuSettings ( QWidget *parent, const char *name )
: QWidget ( parent, name )
{
m_applets_changed = false;
QBoxLayout *lay = new QVBoxLayout ( this, 4, 4 );
QLabel *l = new QLabel ( tr( "Load applets in O-Menu:" ), this );
lay-> addWidget ( l );
m_list = new QListView ( this );
m_list-> addColumn ( "foobar" );
m_list-> header ( )-> hide ( );
lay-> addWidget ( m_list );
m_menutabs = new QCheckBox ( tr( "Show Launcher tabs in O-Menu" ), this );
lay-> addWidget ( m_menutabs );
m_menusubpopup = new QCheckBox ( tr( "Show Applications in Subpopups" ), this );
lay-> addWidget ( m_menusubpopup );
QWhatsThis::add ( m_list, tr( "Check the applets that you want to have included in the O-Menu." ));
QWhatsThis::add ( m_menutabs, tr( "Adds the contents of the Launcher Tabs as menus in the O-Menu." ));
connect ( m_list, SIGNAL( clicked(QListViewItem*)), this, SLOT( appletChanged()));
init ( );
}
void MenuSettings::init ( )
{
Config cfg ( "StartMenu" );
cfg. setGroup ( "Applets" );
QStringList exclude = cfg. readListEntry ( "ExcludeApplets", ',' );
- QString path = QPEApplication::qpeDir ( ) + "/plugins/applets";
+ QString path = QPEApplication::qpeDir ( ) + "plugins/applets";
#ifdef Q_OS_MACX
QStringList list = QDir ( path, "lib*.dylib" ). entryList ( );
#else
QStringList list = QDir ( path, "lib*.so" ). entryList ( );
#endif /* Q_OS_MACX */
for ( QStringList::Iterator it = list. begin ( ); it != list. end ( ); ++it ) {
QString name;
QPixmap icon;
MenuAppletInterface *iface = 0;
QLibrary *lib = new QLibrary ( path + "/" + *it );
lib-> queryInterface ( IID_MenuApplet, (QUnknownInterface**) &iface );
if ( iface ) {
QString lang = getenv( "LANG" );
QTranslator *trans = new QTranslator ( qApp );
QString type = (*it). left ((*it). find ("."));
- QString tfn = QPEApplication::qpeDir ( ) + "/i18n/" + lang + "/" + type + ".qm";
+ QString tfn = QPEApplication::qpeDir ( ) + "i18n/" + lang + "/" + type + ".qm";
if ( trans-> load ( tfn ))
qApp-> installTranslator ( trans );
else
delete trans;
name = iface-> name ( );
icon = iface-> icon ( ). pixmap ( QIconSet::Small, QIconSet::Normal );
iface-> release ( );
lib-> unload ( );
QCheckListItem *item;
item = new QCheckListItem ( m_list, name, QCheckListItem::CheckBox );
if ( !icon. isNull ( ))
item-> setPixmap ( 0, icon );
item-> setOn ( exclude. find ( *it ) == exclude. end ( ));
m_applets [*it] = item;
} else {
delete lib;
}
}
cfg. setGroup ( "Menu" );
m_menutabs->setChecked( cfg.readBoolEntry( "LauncherTabs", true ) );
m_menusubpopup->setChecked( cfg.readBoolEntry( "LauncherSubPopup", true ) );
m_menusubpopup->setEnabled( m_menutabs->isChecked() );
connect( m_menutabs, SIGNAL( stateChanged(int) ), m_menusubpopup, SLOT( setEnabled(bool) ) );
}
void MenuSettings::appletChanged()
{
m_applets_changed = true;
}
void MenuSettings::accept ( )
{
bool apps_changed = false;
Config cfg ( "StartMenu" );
cfg. setGroup ( "Applets" );
if ( m_applets_changed ) {
QStringList exclude;
QMap <QString, QCheckListItem *>::Iterator it;
for ( it = m_applets. begin ( ); it != m_applets. end ( ); ++it ) {
if ( !(*it)-> isOn ( ))
exclude << it. key ( );
}
cfg. writeEntry ( "ExcludeApplets", exclude, ',' );
}
cfg. writeEntry ( "SafeMode", false );
cfg. setGroup ( "Menu" );
if ( m_menutabs-> isChecked ( ) != cfg. readBoolEntry ( "LauncherTabs", true )) {
apps_changed = true;
cfg. writeEntry ( "LauncherTabs", m_menutabs-> isChecked ( ));
}
if ( m_menusubpopup-> isChecked ( ) != cfg. readBoolEntry ( "LauncherSubPopup", true )) {
apps_changed = true;
cfg. writeEntry ( "LauncherSubPopup", m_menusubpopup-> isChecked ( ));
}
cfg. write ( );
if ( m_applets_changed ) {
QCopEnvelope ( "QPE/TaskBar", "reloadApplets()" );
m_applets_changed = false;
}
if ( apps_changed ) {
// currently use reloadApplets() since reloadApps is now used exclusive for server
// to refresh the tabs. But what we want here is also a refresh of the startmenu entries
QCopEnvelope ( "QPE/TaskBar", "reloadApps()" );
QCopEnvelope ( "QPE/TaskBar", "reloadApplets()" );
}
}
diff --git a/core/settings/launcher/taskbarsettings.cpp b/core/settings/launcher/taskbarsettings.cpp
index 8dd9e97..861ff3a 100644
--- a/core/settings/launcher/taskbarsettings.cpp
+++ b/core/settings/launcher/taskbarsettings.cpp
@@ -1,176 +1,176 @@
/*
This file is part of the OPIE Project
=. Copyright (c) 2002 Trolltech AS <info@trolltech.com>
.=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org>
.>+-=
_;:, .> :=|. This file is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This file 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 file;
-_. . . )=. = see the file COPYING. If not, write to the
-- :-=` Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "taskbarsettings.h"
/* OPIE */
#include <qpe/config.h>
#include <qpe/qlibrary.h>
#include <qpe/qpeapplication.h>
#include <qpe/taskbarappletinterface.h>
#include <qpe/qcopenvelope_qws.h>
#include <opie2/odebug.h>
/* QT */
#include <qdir.h>
#include <qlistview.h>
#include <qheader.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qwhatsthis.h>
/* STD */
#include <stdlib.h>
TaskbarSettings::TaskbarSettings ( QWidget *parent, const char *name )
: QWidget ( parent, name )
{
m_applets_changed = false;
QBoxLayout *lay = new QVBoxLayout ( this, 4, 4 );
QLabel *l = new QLabel ( tr( "Load applets in Taskbar:" ), this );
lay-> addWidget ( l );
m_list = new QListView ( this );
m_list-> addColumn ( "foobar" );
m_list-> header ( )-> hide ( );
lay-> addWidget ( m_list );
QWhatsThis::add ( m_list, tr( "Check the applets that you want displayed in the Taskbar." ));
connect ( m_list, SIGNAL( clicked(QListViewItem*)), this, SLOT( appletChanged()));
init ( );
}
void TaskbarSettings::init ( )
{
Config cfg ( "Taskbar" );
cfg. setGroup ( "Applets" );
QStringList exclude = cfg. readListEntry ( "ExcludeApplets", ',' );
- QString path = QPEApplication::qpeDir ( ) + "/plugins/applets";
+ QString path = QPEApplication::qpeDir ( ) + "plugins/applets";
#ifdef Q_OS_MACX
QStringList list = QDir ( path, "lib*.dylib" ). entryList ( );
#else
QStringList list = QDir ( path, "lib*.so" ). entryList ( );
#endif /* Q_OS_MACX */
for ( QStringList::Iterator it = list. begin ( ); it != list. end ( ); ++it ) {
QString name;
QPixmap icon;
TaskbarNamedAppletInterface *iface = 0;
owarn << "Load applet: " << (*it) << "" << oendl;
QLibrary *lib = new QLibrary ( path + "/" + *it );
lib-> queryInterface ( IID_TaskbarNamedApplet, (QUnknownInterface**) &iface );
owarn << "<1>" << oendl;
if ( iface ) {
owarn << "<2>" << oendl;
QString lang = getenv( "LANG" );
QTranslator *trans = new QTranslator ( qApp );
QString type = (*it). left ((*it). find ("."));
- QString tfn = QPEApplication::qpeDir ( ) + "/i18n/" + lang + "/" + type + ".qm";
+ QString tfn = QPEApplication::qpeDir ( ) + "i18n/" + lang + "/" + type + ".qm";
if ( trans-> load ( tfn ))
qApp-> installTranslator ( trans );
else
delete trans;
name = iface-> name ( );
icon = iface-> icon ( );
iface-> release ( );
}
owarn << "<3>" << oendl;
if ( !iface ) {
owarn << "<4>" << oendl;
lib-> queryInterface ( IID_TaskbarApplet, (QUnknownInterface**) &iface );
if ( iface ) {
owarn << "<5>" << oendl;
name = (*it). mid ( 3 );
owarn << "Found applet: " << name << "" << oendl;
#ifdef Q_OS_MACX
int sep = name. find( ".dylib" );
#else
int sep = name. find( ".so" );
#endif /* Q_OS_MACX */
if ( sep > 0 )
name. truncate ( sep );
sep = name. find ( "applet" );
if ( sep == (int) name.length ( ) - 6 )
name. truncate ( sep );
name[0] = name[0]. upper ( );
iface-> release ( );
}
}
owarn << "<6>" << oendl;
if ( iface ) {
owarn << "<7>" << oendl;
QCheckListItem *item;
item = new QCheckListItem ( m_list, name, QCheckListItem::CheckBox );
if ( !icon. isNull ( ))
item-> setPixmap ( 0, icon );
item-> setOn ( exclude. find ( *it ) == exclude. end ( ));
m_applets [*it] = item;
}
lib-> unload ( );
delete lib;
}
}
void TaskbarSettings::appletChanged()
{
m_applets_changed = true;
}
void TaskbarSettings::accept ( )
{
Config cfg ( "Taskbar" );
cfg. setGroup ( "Applets" );
if ( m_applets_changed ) {
QStringList exclude;
QMap <QString, QCheckListItem *>::Iterator it;
for ( it = m_applets. begin ( ); it != m_applets. end ( ); ++it ) {
if ( !(*it)-> isOn ( ))
exclude << it. key ( );
}
cfg. writeEntry ( "ExcludeApplets", exclude, ',' );
}
cfg. writeEntry ( "SafeMode", false );
cfg. write ( );
if ( m_applets_changed ) {
QCopEnvelope e ( "QPE/TaskBar", "reloadApplets()" );
m_applets_changed = false;
}
}
diff --git a/core/settings/security/multiauthconfig.cpp b/core/settings/security/multiauthconfig.cpp
index e545e17..45d691b 100644
--- a/core/settings/security/multiauthconfig.cpp
+++ b/core/settings/security/multiauthconfig.cpp
@@ -1,756 +1,756 @@
#include <opie2/odebug.h>
#include <opie2/multiauthpassword.h>
#include <qgroupbox.h>
#include <qvgroupbox.h>
#include <qpe/resource.h>
#include <qlayout.h>
#include <qlabel.h>
#include <qhbox.h>
#include <qheader.h>
#include <qvbox.h>
#include <qwhatsthis.h>
#include <qtoolbutton.h>
#include <qstringlist.h>
#include <qdir.h>
#include <qpe/qlibrary.h>
#include <qpe/qpeapplication.h>
#include "multiauthconfig.h"
using Opie::Security::MultiauthPluginInterface;
using Opie::Security::MultiauthPluginObject;
using Opie::Security::MultiauthConfigWidget;
/// keeps information about MultiauthPluginObject plugins
struct MultiauthPlugin {
MultiauthPlugin() : library( 0 ), iface( 0 ), pluginObject( 0 ) {}
/// plugin file
QLibrary *library;
/// the plugin object interface
QInterfacePtr<MultiauthPluginInterface> iface;
/// the plugin object itself
MultiauthPluginObject *pluginObject;
/// name of the plugin file
QString name;
/// should the plugin be launched during authentication or not
bool active;
/// order of the plugin, in the pluginListWidget and during authentication
int pos;
};
/// list of available MultiauthPlugin objects
static QValueList<MultiauthPlugin> pluginList;
/// extension of QToolButton that adds signals, icons and stuff (taken from todayconfig.cpp)
class ToolButton : public QToolButton {
public:
ToolButton( QWidget *parent, const char *name, const QString& icon, QObject *handler, const QString& slot, bool t = FALSE )
: QToolButton( parent, name ) {
setPixmap( Resource::loadPixmap( icon ) );
setAutoRaise( TRUE );
setFocusPolicy( QWidget::NoFocus );
setToggleButton( t );
connect( this, t ? SIGNAL( toggled(bool) ) : SIGNAL( clicked() ), handler, slot );
}
};
MultiauthGeneralConfig::MultiauthGeneralConfig(MultiauthConfig * parentConfig, QWidget * parent, const char * name = "general Opie-multiauthentication config widget")
: QWidget(parent, name), m_onStart(0), m_onResume(0), m_noProtectConfig(0), m_explanScreens(0), m_nbSuccessMin(0), m_tryButton(0)
{
// keep track of the MultiauthConfig parent in one of our attributes
m_parentConfig = parentConfig;
QVBoxLayout *vb = new QVBoxLayout(this);
vb->setSpacing(11);
vb->setMargin(11);
vb->setAlignment( Qt::AlignTop );
QGroupBox *lockBox = new QGroupBox(0, Qt::Vertical, tr("When to lock Opie"), this, "lock box");
vb->addWidget(lockBox);
QGridLayout *boxLayout = new QGridLayout( lockBox->layout() );
m_onStart = new QCheckBox( tr( "on Opie start" ), lockBox, "lock on opie start");
m_onResume = new QCheckBox( tr( "on Opie resume" ), lockBox, "lock on opie resume");
boxLayout->addWidget(m_onStart, 0, 0);
boxLayout->addWidget(m_onResume, 0, 1);
QGroupBox *nbBox = new QGroupBox(0, Qt::Vertical, tr("Multiple plugins authentication"), this, "nb box");
vb->addWidget(nbBox);
QGridLayout *nbBoxLayout = new QGridLayout( nbBox->layout() );
m_nbSuccessMin = new QSpinBox(nbBox);
QLabel *lNbSuccessMin = new QLabel( tr( "Required successes" ), nbBox);
nbBoxLayout->addWidget(m_nbSuccessMin, 0, 0);
nbBoxLayout->addWidget(lNbSuccessMin, 0, 1);
m_nbSuccessMin->setMinValue(1); // the max value is defined in MultiauthConfig constructor
QGroupBox *devBox = new QGroupBox(0, Qt::Vertical, tr("Options"), this, "dev box");
vb->addWidget(devBox);
QGridLayout *devBoxLayout = new QGridLayout( devBox->layout() );
m_noProtectConfig = new QCheckBox( tr("Don't protect this config screen"), devBox, "don't protect config");
m_explanScreens = new QCheckBox( tr("Show explanatory screens"), devBox, "Show explan. screens");
devBoxLayout->addWidget(m_noProtectConfig, 0, 0);
devBoxLayout->addWidget(m_explanScreens, 1, 0);
QVGroupBox *tryBox = new QVGroupBox(tr("Testing"), this, "try box");
vb->addWidget(tryBox);
m_tryButton = new QPushButton( tr("Test the authentication now"), tryBox, "try button");
connect( m_tryButton, SIGNAL(clicked()), this, SLOT(tryAuth()) );
}
/// nothing to do
MultiauthGeneralConfig::~MultiauthGeneralConfig()
{}
/// launches the authentication process, as configured, with the option to bypass it
void MultiauthGeneralConfig::tryAuth()
{
QMessageBox confirmSave(
tr("Attention"),
"<p>" + tr("You must save your current settings before trying to authenticate. Press OK to accept and launch a simulated authentication process.") + "</p><p><em>" +
tr("If you don't like the result of this test, don't forget to change your settings before you exit the configuration application!") + "</em></p>",
QMessageBox::Warning,
QMessageBox::Cancel, QMessageBox::Yes, QMessageBox::NoButton,
0, QString::null, TRUE, WStyle_StaysOnTop);
confirmSave.setButtonText(QMessageBox::Cancel, tr("Cancel"));
confirmSave.setButtonText(QMessageBox::Yes, tr("OK"));
if ( confirmSave.exec() == QMessageBox::Yes)
{
owarn << "writing config as user accepted" << oendl;
m_parentConfig->writeConfigs();
owarn << "testing authentication" << oendl;
// launch the authentication in testing mode
Opie::Security::MultiauthPassword::authenticate(Opie::Security::TestNow);
}
}
/// Builds and displays the Opie multi-authentication configuration dialog
static void test_and_start() {
Config pcfg("Security");
pcfg.setGroup( "Misc" );
bool protectConfigDialog = ! pcfg.readBoolEntry("noProtectConfig", true);
if (protectConfigDialog && Opie::Security::Internal::runPlugins() != 0) {
owarn << "authentication failed, not showing opie-security" << oendl;
exit( -1 );
}
}
MultiauthConfig::MultiauthConfig(QWidget* par, const char* w = "MultiauthConfig dialog", WFlags f = 0)
: QDialog(par, w, TRUE, f),
m_mainTW(0), m_pluginListView(0), m_pluginListWidget(0),
m_generalConfig(0), m_loginWidget(0), m_syncWidget(0),
m_nbSuccessReq(0), m_plugins_changed(false)
{
/* Initializes the global configuration window
*/
test_and_start();
/* Checks (and memorizes) if any authentication plugins are
* installed on the system
*/
- QString path = QPEApplication::qpeDir() + "/plugins/security";
+ QString path = QPEApplication::qpeDir() + "plugins/security";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
m_pluginsInstalled = ! list.isEmpty();
if (m_pluginsInstalled == false)
owarn << "no authentication plugins installed! Talking about it in the last tab..." << oendl;
setCaption( tr( "Security configuration" ) );
QVBoxLayout *layout = new QVBoxLayout( this );
m_mainTW = new Opie::Ui::OTabWidget( this, "main tab widget" );
layout->addWidget(m_mainTW);
if (m_pluginsInstalled)
{
m_pluginListWidget = new QWidget(m_mainTW, "plugin list widget");
QVBoxLayout * pluginListLayout = new QVBoxLayout(m_pluginListWidget);
pluginListLayout->setSpacing(6);
pluginListLayout->setMargin(11);
QLabel * pluginListTitle = new QLabel( tr( "Load which plugins in what order:" ), m_pluginListWidget );
pluginListLayout->addWidget(pluginListTitle);
QHBox * pluginListHB = new QHBox(m_pluginListWidget);
pluginListLayout->addWidget(pluginListHB);
m_pluginListView = new QListView(pluginListHB);
m_pluginListView->addColumn("PluginList");
m_pluginListView->header()->hide();
m_pluginListView->setSorting(-1);
QWhatsThis::add(m_pluginListView, tr( "Check a checkbox to activate/deactivate a plugin or use the arrow buttons on the right to change the order they will appear in" ));
QVBox * pluginListVB = new QVBox(pluginListHB);
new ToolButton( pluginListVB, tr( "Move Up" ), "up", this , SLOT( moveSelectedUp() ) );
new ToolButton( pluginListVB, tr( "Move Down" ), "down", this , SLOT( moveSelectedDown() ) );
m_mainTW->addTab( m_pluginListWidget, "pass", tr( "plugins" ) );
connect ( m_pluginListView , SIGNAL( clicked ( QListViewItem * ) ), this, SLOT( pluginsChanged ( ) ) );
// general Opie multi-authentication configuration tab
m_generalConfig = new MultiauthGeneralConfig(this, m_mainTW);
m_mainTW->addTab(m_generalConfig, "SettingsIcon", tr( "Authentication") );
}
// login settings page
m_loginWidget = new LoginBase(m_mainTW, "login config widget");
m_mainTW->addTab(m_loginWidget, "security/users", tr( "Login") );
// sync settings page
m_syncWidget = new SyncBase( m_mainTW, "sync config widget" );
m_mainTW->addTab(m_syncWidget, "security/sync", tr( "Sync") );
// read the "Security" Config file and update our UI
readConfig();
if (m_pluginsInstalled)
{
/* loads plugins configuration widgets in mainTW tabs and in pluginListView
*/
loadPlugins();
for ( int i = pluginList.count() - 1; i >= 0; i-- ) {
MultiauthPlugin plugin = pluginList[i];
// load the config widgets in the tabs
// (configWidget will return 0l if there is no configuration GUI)
MultiauthConfigWidget* widget = plugin.pluginObject->configWidget(m_mainTW);
if ( widget != 0l ) {
odebug << "plugin " << plugin.name << " has a configuration widget" << oendl;
configWidgetList.append(widget);
m_mainTW->addTab( widget, plugin.pluginObject->pixmapNameConfig(),
plugin.pluginObject->pluginName() );
}
// set the order/activate tab
QPixmap icon = Resource::loadPixmap( plugin.pluginObject->pixmapNameWidget() );
QCheckListItem * item = new QCheckListItem(m_pluginListView, plugin.pluginObject->pluginName(), QCheckListItem::CheckBox );
if ( !icon.isNull() ) {
item->setPixmap( 0, icon );
}
if ( m_excludePlugins.find( plugin.name ) == m_excludePlugins.end() ) {
item->setOn( TRUE );
}
m_plugins[plugin.name] = item;
}
// set the first tab as default.
m_mainTW->setCurrentTab(m_pluginListWidget);
// put the number of plugins as the max number of req. auth.
m_generalConfig->m_nbSuccessMin->setMaxValue( pluginList.count() );
}
else
{
/* we don't have any installed plugin there. Let's tell
* that to the user in a third tab, using the m_pluginListWidget widget
*/
m_pluginListWidget = new QWidget(m_mainTW, "plugin list widget (no plugins warning)");
QVBoxLayout * pluginListLayout = new QVBoxLayout(m_pluginListWidget);
pluginListLayout->setSpacing(11);
pluginListLayout->setMargin(11);
pluginListLayout->setAlignment( Qt::AlignTop );
QVGroupBox *warningBox = new QVGroupBox(tr("Important notice"), m_pluginListWidget, "noPlugins warning box");
pluginListLayout->addWidget(warningBox);
QLabel * warningText = new QLabel( "<p>" + tr("To be able to protect your PDA with one or more authentication plugins (for example, a simple PIN authentication), you must install at least one <em>opie-multiauth-*</em> package! Once you have done that, you will be able to configure your PDA protection here.") + "</p>", warningBox );
m_mainTW->addTab(m_pluginListWidget, "security/Security", tr( "Locking") );
// set the first tab as default.
m_mainTW->setCurrentTab(m_loginWidget);
}
showMaximized();
}
/// nothing to do
MultiauthConfig::~MultiauthConfig()
{
}
/// saves the general and plugin(s) configurations
void MultiauthConfig::writeConfigs() {
writeConfig();
MultiauthConfigWidget* confWidget = 0;
for ( confWidget = configWidgetList.first(); confWidget != 0;
confWidget = configWidgetList.next() )
confWidget->writeConfig();
}
/// on QDialog::accept, we save all the configurations and exit the QDialog normally
void MultiauthConfig::accept() {
writeConfigs();
QDialog::accept();
}
void MultiauthConfig::done( int r ) {
QDialog::done( r );
close();
}
/// moves up the selected plugin
void MultiauthConfig::moveSelectedUp()
{
QListViewItem *item = m_pluginListView->selectedItem();
if ( item && item->itemAbove() ) {
item->itemAbove()->moveItem( item );
}
}
/// moves down the selected plugin
void MultiauthConfig::moveSelectedDown()
{
QListViewItem *item = m_pluginListView->selectedItem();
if ( item && item->itemBelow() ) {
item->moveItem( item->itemBelow() );
}
}
/// reads the <code>Security.conf</code> Config file, and updates parts of the user interface
void MultiauthConfig::readConfig()
{
// pointer, so we release this Config when we want
Config* pcfg = new Config("Security");
if (m_pluginsInstalled)
{
pcfg->setGroup( "Misc" );
m_generalConfig->m_onStart->setChecked( pcfg->readBoolEntry( "onStart", false ) );
m_generalConfig->m_onResume->setChecked( pcfg->readBoolEntry( "onResume", false ) );
m_generalConfig->m_nbSuccessMin->setValue( pcfg->readNumEntry( "nbSuccessMin", 1 ) );
m_generalConfig->m_noProtectConfig->setChecked( pcfg->readBoolEntry( "noProtectConfig", true) );
m_generalConfig->m_explanScreens->setChecked( pcfg->readBoolEntry( "explanScreens", true ) );
pcfg->setGroup( "Plugins" );
m_excludePlugins = pcfg->readListEntry( "ExcludePlugins", ',' );
m_allPlugins = pcfg->readListEntry( "AllPlugins", ',' );
}
/* Login and Sync stuff */
pcfg->setGroup("Sync");
int auth_peer = pcfg->readNumEntry("auth_peer",0xc0a88100);//new default 192.168.129.0/24
int auth_peer_bits = pcfg->readNumEntry("auth_peer_bits",24);
pcfg->setGroup("SyncMode");
int mode = pcfg->readNumEntry("Mode",2); // Default to Sharp
switch( mode ) {
case 0x01:
m_syncWidget->syncModeCombo->setCurrentItem( 0 );
break;
case 0x02:
default:
m_syncWidget->syncModeCombo->setCurrentItem( 1 );
break;
case 0x04:
m_syncWidget->syncModeCombo->setCurrentItem( 2 );
break;
}
/*
cfg.setGroup("Remote");
if ( telnetAvailable() )
telnet->setChecked(cfg.readEntry("allow_telnet"));
else
telnet->hide();
if ( sshAvailable() )
ssh->setChecked(cfg.readEntry("allow_ssh"));
else
ssh->hide();
*/
// release the Config handler
delete pcfg;
// indeed, selectNet will open the config file...
selectNet(auth_peer,auth_peer_bits,TRUE);
connect( m_syncWidget->syncnet, SIGNAL(textChanged(const QString&)),
this, SLOT(setSyncNet(const QString&)));
- QString configFile = QPEApplication::qpeDir() + "/etc/opie-login.conf";
+ QString configFile = QPEApplication::qpeDir() + "etc/opie-login.conf";
Config loginCfg(configFile,Config::File);
loginCfg.setGroup("General");
autoLoginName=loginCfg.readEntry("AutoLogin","");
if (autoLoginName.stripWhiteSpace().isEmpty()) {
autoLogin=false;
} else {
autoLogin=true;
}
connect(m_loginWidget->autologinToggle, SIGNAL(toggled(bool)), this, SLOT(toggleAutoLogin(bool)));
connect(m_loginWidget->userlist, SIGNAL(activated(int)), this, SLOT(changeLoginName(int)));
connect(m_syncWidget->restoredefaults,SIGNAL(clicked()), this, SLOT(restoreDefaults()));
connect(m_syncWidget->deleteentry,SIGNAL(clicked()), this, SLOT(deleteListEntry()));
loadUsers();
updateGUI();
}
void MultiauthConfig::writeConfig()
{
Config* pcfg = new Config("Security");
if (m_pluginsInstalled)
{
pcfg->setGroup( "Plugins" );
QStringList exclude;
QStringList include;
QStringList allPlugins;
QListViewItemIterator list_it( m_pluginListView );
// this makes sure the names get saved in the order selected
for ( ; list_it.current(); ++list_it ) {
QMap <QString, QCheckListItem *>::Iterator it;
for ( it = m_plugins.begin(); it != m_plugins. end (); ++it ) {
if ( list_it.current() == (*it) && !(*it)-> isOn () ) {
exclude << it.key();
} else if ( list_it.current() == (*it) && (*it)-> isOn () ){
include << it.key();
}
if ( list_it.current() == (*it) ) {
allPlugins << it.key();
}
}
}
pcfg->writeEntry( "ExcludePlugins", exclude, ',' );
pcfg->writeEntry( "IncludePlugins", include, ',' );
pcfg->writeEntry( "AllPlugins", allPlugins, ',' );
pcfg->setGroup( "Misc" );
pcfg->writeEntry( "onStart", m_generalConfig->m_onStart->isChecked() );
pcfg->writeEntry( "onResume", m_generalConfig->m_onResume->isChecked() );
pcfg->writeEntry( "nbSuccessMin", m_generalConfig->m_nbSuccessMin->text() );
pcfg->writeEntry( "noProtectConfig", m_generalConfig->m_noProtectConfig->isChecked() );
pcfg->writeEntry( "explanScreens", m_generalConfig->m_explanScreens->isChecked() );
}
/* Login and Sync stuff */
pcfg->setGroup("Sync");
int auth_peer=0;
int auth_peer_bits;
QString sn = m_syncWidget->syncnet->currentText();
parseNet(sn,auth_peer,auth_peer_bits);
//this is the *selected* (active) net range
pcfg->writeEntry("auth_peer",auth_peer);
pcfg->writeEntry("auth_peer_bits",auth_peer_bits);
//write back all other net ranges in *cleartext*
for (int i=0; i<10; i++) {
QString target;
target.sprintf("net%d", i);
if ( i < m_syncWidget->syncnet->count() )
pcfg->writeEntry(target, m_syncWidget->syncnet->text(i));
else // no more entry in the syncnet list -> we clear the line
pcfg->writeEntry(target, "");
}
#ifdef ODP
#error "Use 0,1,2 and use Launcher"
#endif
/* keep the old code so we don't use currentItem directly */
int value = 0x02;
switch( m_syncWidget->syncModeCombo->currentItem() ) {
case 0:
value = 0x01;
break;
case 1:
value = 0x02;
break;
case 2:
value = 0x04;
break;
}
pcfg->setGroup("SyncMode");
pcfg->writeEntry( "Mode", value );
/*
pcfg->setGroup("Remote");
if ( telnetAvailable() )
pcfg->writeEntry("allow_telnet",telnet->isChecked());
if ( sshAvailable() )
pcfg->writeEntry("allow_ssh",ssh->isChecked());
// ### write ssh/telnet sys config files
*/
//release the Config handler
delete pcfg;
- QString configFile = QPEApplication::qpeDir() + "/etc/opie-login.conf";
+ QString configFile = QPEApplication::qpeDir() + "etc/opie-login.conf";
Config loginCfg(configFile,Config::File);
loginCfg.setGroup("General");
if (autoLogin) {
loginCfg.writeEntry("AutoLogin",autoLoginName);
} else {
loginCfg.removeEntry("AutoLogin");
}
}
/// slot used to record the fact plugins order has been modified
void MultiauthConfig::pluginsChanged() {
m_plugins_changed = true;
}
/// loads each multiauth plugin
void MultiauthConfig::loadPlugins() {
- QString path = QPEApplication::qpeDir() + "/plugins/security";
+ QString path = QPEApplication::qpeDir() + "plugins/security";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
// temporary list used to sort plugins
QMap<QString, MultiauthPlugin> sortList;
for ( it = list.begin(); it != list.end(); ++it ) {
QInterfacePtr<MultiauthPluginInterface> iface;
QLibrary *lib = new QLibrary( path + "/" + *it );
QString libPath(path + "/" + *it);
if ( lib->queryInterface( IID_MultiauthPluginInterface, (QUnknownInterface**)&iface ) == QS_OK ) {
MultiauthPlugin plugin;
plugin.library = lib;
plugin.iface = iface;
plugin.name = QString(*it);
// find out if plugins should be launched
if ( m_excludePlugins.grep( *it ).isEmpty() ) {
plugin.active = true;
} else {
plugin.active = false;
}
plugin.pluginObject = plugin.iface->plugin();
// "prebuffer" it in one more list, to get the sorting done
sortList.insert( plugin.name, plugin );
// on first start the list is off course empty
if ( m_allPlugins.isEmpty() ) {
pluginList.append( plugin );
}
// if plugin is not yet in the list, add it to the layout too
else if ( !m_allPlugins.contains( plugin.name ) ) {
pluginList.append( plugin );
}
} else {
delete lib;
}
} // end for
// put m_allPlugins tempPlugin objects into pluginList
if ( !m_allPlugins.isEmpty() ) {
MultiauthPlugin tempPlugin;
QStringList::Iterator stringit;
for( stringit = m_allPlugins.begin(); stringit != m_allPlugins.end(); ++stringit ) {
tempPlugin = ( sortList.find( *stringit ) ).data();
if ( !( (tempPlugin.name).isEmpty() ) ) {
pluginList.append( tempPlugin );
}
}
}
}
void MultiauthConfig::deleteListEntry()
{
m_syncWidget->syncnet->removeItem(m_syncWidget->syncnet->currentItem());
}
void MultiauthConfig::restoreDefaults()
{
QMessageBox unrecbox(
tr("Attention"),
"<p>" + tr("All user-defined net ranges will be lost.") + "</p>",
QMessageBox::Warning,
QMessageBox::Cancel, QMessageBox::Yes, QMessageBox::NoButton,
0, QString::null, TRUE, WStyle_StaysOnTop);
unrecbox.setButtonText(QMessageBox::Cancel, tr("Cancel"));
unrecbox.setButtonText(QMessageBox::Yes, tr("OK"));
if ( unrecbox.exec() == QMessageBox::Yes)
{
m_syncWidget->syncnet->clear();
insertDefaultRanges();
}
m_syncWidget->syncModeCombo->setCurrentItem( 2 );
}
void MultiauthConfig::insertDefaultRanges()
{
m_syncWidget->syncnet->insertItem( "192.168.129.0/24" );
m_syncWidget->syncnet->insertItem( "192.168.1.0/24" );
m_syncWidget->syncnet->insertItem( "192.168.0.0/16" );
m_syncWidget->syncnet->insertItem( "172.16.0.0/12" );
m_syncWidget->syncnet->insertItem( "10.0.0.0/8" );
m_syncWidget->syncnet->insertItem( "1.0.0.0/8" );
m_syncWidget->syncnet->insertItem( tr( "Any" ) );
m_syncWidget->syncnet->insertItem( tr( "None" ) );
}
void MultiauthConfig::updateGUI()
{
m_loginWidget->autologinToggle->setChecked(autoLogin);
m_loginWidget->userlist->setEnabled(autoLogin);
}
void MultiauthConfig::selectNet(int auth_peer,int auth_peer_bits, bool update)
{
QString sn;
if ( auth_peer_bits == 0 && auth_peer == 0 ) {
sn = tr("Any");
} else if ( auth_peer_bits == 32 && auth_peer == 0 ) {
sn = tr("None");
} else {
sn =
QString::number((auth_peer>>24)&0xff) + "."
+ QString::number((auth_peer>>16)&0xff) + "."
+ QString::number((auth_peer>>8)&0xff) + "."
+ QString::number((auth_peer>>0)&0xff) + "/"
+ QString::number(auth_peer_bits);
}
//insert user-defined list of netranges upon start
if (update) {
//User selected/active netrange first
m_syncWidget->syncnet->insertItem( tr(sn) );
Config cfg("Security");
cfg.setGroup("Sync");
//set up defaults if needed, if someone manually deletes net0 he'll get a suprise hehe
QString test = cfg.readEntry("net0","");
if (test.isEmpty()) {
insertDefaultRanges();
} else {
// 10 ought to be enough for everybody... :)
// If you need more, don't forget to edit applySecurity() as well
bool already_there=FALSE;
for (int i=0; i<10; i++) {
QString target, netrange;
target.sprintf("net%d", i);
netrange = cfg.readEntry(target,"");
if (! netrange.isEmpty()){
//make sure we have no "twin" entries
for (int i=0; i<m_syncWidget->syncnet->count(); i++) {
if ( m_syncWidget->syncnet->text(i) == netrange ) {
already_there=TRUE;
}
}
if (! already_there) {
m_syncWidget->syncnet->insertItem( netrange );
} else {
already_there=FALSE;
}
}
}
}
}
for (int i=0; i<m_syncWidget->syncnet->count(); i++) {
if ( m_syncWidget->syncnet->text(i).left(sn.length()) == sn ) {
m_syncWidget->syncnet->setCurrentItem(i);
return;
}
}
odebug << "No match for \"" << sn << "\"" << oendl;
}
void MultiauthConfig::parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits)
{
auth_peer=0;
if ( sn == tr("Any") ) {
auth_peer = 0;
auth_peer_bits = 0;
} else if ( sn == tr("None") ) {
auth_peer = 0;
auth_peer_bits = 32;
} else {
int x=0;
for (int i=0; i<4; i++) {
int nx = sn.find(QChar(i==3 ? '/' : '.'),x);
auth_peer = (auth_peer<<8)|sn.mid(x,nx-x).toInt();
x = nx+1;
}
uint n = (uint)sn.find(' ',x)-x;
auth_peer_bits = sn.mid(x,n).toInt();
}
}
void MultiauthConfig::loadUsers()
{
QFile passwd("/etc/passwd");
if ( passwd.open(IO_ReadOnly) ) {
QTextStream t( &passwd );
QString s;
QStringList account;
while ( !t.eof() ) {
account = QStringList::split(':',t.readLine());
// Hide disabled accounts and some special accounts
if (*account.at(1)!="*" && *account.at(0)!="ppp" && *account.at(0)!="messagebus") {
m_loginWidget->userlist->insertItem(*account.at(0));
// Highlight this item if it is set to m_loginWidget->autologinToggle
if ( *account.at(0) == autoLoginName)
m_loginWidget->userlist->setCurrentItem(m_loginWidget->userlist->count()-1);
}
}
passwd.close();
}
}
void MultiauthConfig::toggleAutoLogin(bool val)
{
autoLogin=val;
m_loginWidget->userlist->setEnabled(val);
// if autoLogin is true, we will set by default the login currently visible in the userlist
if (autoLogin)
autoLoginName=m_loginWidget->userlist->currentText();
}
void MultiauthConfig::setSyncNet(const QString& sn)
{
int auth_peer,auth_peer_bits;
parseNet(sn,auth_peer,auth_peer_bits);
selectNet(auth_peer,auth_peer_bits,FALSE);
}
void MultiauthConfig::changeLoginName( int idx )
{
autoLoginName = m_loginWidget->userlist->text(idx);;
updateGUI();
}
/// \todo do implement that? who? how?
bool MultiauthConfig::telnetAvailable() const
{
return FALSE;
}
/// \todo do implement that? who? how?
bool MultiauthConfig::sshAvailable() const
{
return FALSE;
}
diff --git a/core/tools/quicklauncher/dropins.h b/core/tools/quicklauncher/dropins.h
index a9664f8..df364ce 100644
--- a/core/tools/quicklauncher/dropins.h
+++ b/core/tools/quicklauncher/dropins.h
@@ -1,71 +1,71 @@
/* OPIE */
#include <opie2/owait.h>
using namespace Opie::Ui;
#include <qtopia/qcom.h>
#include <qtopia/qlibrary.h>
#include <qtopia/qpeapplication.h>
#include <qtopia/applicationinterface.h>
#include <qtopia/resource.h>
/* QT */
#include <qmetaobject.h>
#include <qmap.h>
#include <qstring.h>
namespace QuickPrivate {
struct PluginLoader {
PluginLoader( const char* ) {
}
QRESULT queryInterface( const QString& app, const QUuid&, QUnknownInterface** );
void releaseInterface( QUnknownInterface* );
QMap<QUnknownInterface*, QLibrary*> libs;
};
/*
* We can skip installing a Translator here because Opies QPEApplication
* will do that in initApp for us as well
*/
QRESULT PluginLoader::queryInterface( const QString& libFile, const QUuid& uuid, QUnknownInterface** iface ) {
QRESULT res = QS_FALSE;
*iface = 0;
// This code is very platform specific.. We should find better
// solutions to handle names.. Maybe one central function would be
// better than checking this ".so" stuff all around in the sources..
// (eilers)
// Below lines from TT then mine again
QString name = libFile;
if ( libFile.findRev(".so") == (int)libFile.length()-3 ) {
name = libFile.left( libFile.length()-3 );
if ( name.find( "lib" ) == 0 )
name = name.mid( 3 );
}
#ifdef Q_OS_MACX
- QString path = QPEApplication::qpeDir() + "/plugins/application/lib"+name+".dylib";
+ QString path = QPEApplication::qpeDir() + "plugins/application/lib"+name+".dylib";
#else
- QString path = QPEApplication::qpeDir() + "/plugins/application/lib"+name+".so";
+ QString path = QPEApplication::qpeDir() + "plugins/application/lib"+name+".so";
#endif
QLibrary *lib = new QLibrary( path );
if ( lib->queryInterface( uuid, iface ) == QS_OK && iface ) {
libs.insert( *iface, lib );
res = QS_OK;
}
return res;
}
void PluginLoader::releaseInterface( QUnknownInterface* iface ) {
if ( libs.contains( iface ) ) {
iface->release();
delete libs[iface];
libs.remove( iface ); // we only handle pointers so even if the object is not valid the address-space is
}
}
}
diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp
index 1fba9bc..fe5051d 100644
--- a/inputmethods/multikey/configdlg.cpp
+++ b/inputmethods/multikey/configdlg.cpp
@@ -1,508 +1,508 @@
/*
* TODO
* make a font selection thing (size too)
* make a keymap editor
* make keys translucent
* make vertical keys possible
*
*
*/
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <qpe/resource.h>
#include <qlayout.h>
#include <qwidget.h>
#include <qdialog.h>
#include <qtabwidget.h>
#include <qvbox.h>
#include <qgrid.h>
#include <qgroupbox.h>
#include <qlabel.h>
#include <qcheckbox.h>
#include <qsizepolicy.h>
#include <qpushbutton.h>
#include <qlistbox.h>
#include <qstringlist.h>
#include <qtoolbutton.h>
#include <opie2/ofiledialog.h>
#include <opie2/qcolordialog.h>
#include <qdir.h>
#include <qfileinfo.h>
#include "configdlg.h"
#include "keyboard.h"
using namespace Opie;
using namespace Opie::Ui;
// ConfigDlg::ConfigDlg() {{{1
ConfigDlg::ConfigDlg () : QDialog ()
{
setCaption( tr("Multikey Configuration") );
Config config ("multikey");
config.setGroup("keymaps");
QString current_map = config.readEntry("current", 0);
/*
* 'general config' tab
*/
QVBoxLayout *base_lay = new QVBoxLayout(this);
QTabWidget *tabs = new QTabWidget(this, "tabs");
QWidget *gen_box = new QWidget(tabs, "gen_tab");
QVBoxLayout *gen_lay = new QVBoxLayout(gen_box);
gen_lay->setMargin(3);
QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box);
QHBox *hbox1 = new QHBox(map_group);
keymaps = new QListBox(hbox1);
keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
QVBox *vbox1 = new QVBox(hbox1);
QToolButton *tb1 = new QToolButton(vbox1, tr("Move Up"));
tb1->setPixmap(Resource::loadPixmap("up"));
tb1->setAutoRaise(TRUE);
tb1->setFocusPolicy(QWidget::NoFocus);
tb1->setToggleButton(FALSE);
connect(tb1, SIGNAL(clicked()), this, SLOT(moveSelectedUp()));
QToolButton *tb2 = new QToolButton(vbox1, tr("Move Down"));
tb2->setPixmap(Resource::loadPixmap("down"));
tb2->setAutoRaise(TRUE);
tb2->setFocusPolicy(QWidget::NoFocus);
tb2->setToggleButton(FALSE);
connect(tb2, SIGNAL(clicked()), this, SLOT(moveSelectedDown()));
QString cur(tr("Current Language"));
keymaps->insertItem(cur);
keymaps->setSelected(0, true);
- QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
+ QDir map_dir(QPEApplication::qpeDir() + "share/multikey", "*.keymap");
default_maps = map_dir.entryList(); // so i can access it in other places
custom_maps = config.readListEntry("maps", QChar('|'));
sw_maps = ConfigDlg::loadSw();
QStringList sw_copy(sw_maps);
for (uint i = 0; i < sw_copy.count(); i++) {
QString keymap_map;
if (sw_copy[i][0] != '/') { /* share/multikey */
keymap_map = map_dir.absPath() + "/" + sw_copy[i];
} else {
if (map_dir.exists(QFileInfo(sw_copy[i]).fileName(), false)
|| !QFile::exists(sw_copy[i])) {
custom_maps.remove(sw_copy[i]);
sw_maps.remove(sw_copy[i]);
// remove it from the list too
config.writeEntry("maps", custom_maps.join("|"));
continue;
}
keymap_map = sw_copy[i];
}
QFile map(keymap_map);
if (map.open(IO_ReadOnly)) {
QString line; bool found = 0;
map.readLine(line, 1024);
while (!map.atEnd()) {
if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
found = 1;
break;
}
map.readLine(line, 1024);
}
if (!found)
keymaps->insertItem(keymap_map);
map.close();
}
if (keymap_map == current_map) {
keymaps->setSelected(i + 1, true);
}
}
// have to "+1" because the "current language" listItem... remember?
connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int)));
QGrid *add_remove_grid = new QGrid(2, map_group);
add_remove_grid->setMargin(3);
add_remove_grid->setSpacing(3);
add_button = new QPushButton(tr("Add"), add_remove_grid);
add_button->setFlat(TRUE);
connect(add_button, SIGNAL(clicked()), SLOT(addMap()));
remove_button = new QPushButton(tr("Remove"), add_remove_grid);
remove_button->setFlat(TRUE);
if (keymaps->currentItem() == 0 || default_maps.find(QFileInfo(current_map).fileName()) != default_maps.end())
remove_button->setDisabled(true);
connect(remove_button, SIGNAL(clicked()), SLOT(removeMap()));
gen_lay->addWidget(map_group);
// make a box that will contain the buttons on the bottom
QGrid *other_grid = new QGrid(2, gen_box);
pick_button = new QCheckBox(tr("Pickboard"), other_grid);
config.setGroup ("general");
bool pick_open = config.readBoolEntry ("usePickboard", FALSE); // default closed
if (pick_open) {
pick_button->setChecked(true);
}
repeat_button = new QCheckBox(tr("Key Repeat"), other_grid);
bool repeat_on = config.readBoolEntry ("useRepeat", TRUE);
if (repeat_on) {
repeat_button->setChecked(true);
}
gen_lay->addWidget(other_grid);
tabs->addTab(gen_box, tr("General Settings"));
/*
* 'color' tab
*/
QWidget *color_box = new QWidget(tabs, "color_tab");
QGridLayout *color_lay = new QGridLayout(color_box);
QGrid *color_grid = new QGrid(2, color_box);
color_lay->setAlignment(Qt::AlignTop);
color_grid->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
color_grid->layout()->setAlignment(Qt::AlignTop);
color_grid->setMargin(3);
color_grid->setSpacing(3);
QLabel *label;
QStringList color;
config.setGroup("colors");
label = new QLabel(tr("Key Color"), color_grid);
keycolor_button = new QPushButton(color_grid);
connect(keycolor_button, SIGNAL(clicked()), SLOT(keyColorClicked()));
keycolor_button->setFlat(TRUE);
color = config.readListEntry("keycolor", QChar(','));
/*
* hopefully not required
if (color.isEmpty()) {
color = QStringList::split(",", "240,240,240");
config.writeEntry("keycolor", color.join(","));
}
*/
keycolor_button->setPalette(QPalette(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())));
label = new QLabel(tr("Key Pressed Color"), color_grid);
keycolor_pressed_button = new QPushButton(color_grid);
connect(keycolor_pressed_button, SIGNAL(clicked()), SLOT(keyColorPressedClicked()));
keycolor_pressed_button->setFlat(TRUE);
color = config.readListEntry("keycolor_pressed", QChar(','));
keycolor_pressed_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
label = new QLabel(tr("Line Color"), color_grid);
keycolor_lines_button = new QPushButton(color_grid);
connect(keycolor_lines_button, SIGNAL(clicked()), SLOT(keyColorLinesClicked()));
keycolor_lines_button->setFlat(TRUE);
color = config.readListEntry("keycolor_lines", QChar(','));
keycolor_lines_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
label = new QLabel(tr("Text Color"), color_grid);
textcolor_button = new QPushButton(color_grid);
connect(textcolor_button, SIGNAL(clicked()), SLOT(textColorClicked()));
textcolor_button->setFlat(TRUE);
color = config.readListEntry("textcolor", QChar(','));
textcolor_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
label = new QLabel("", color_grid); // a spacer so the above buttons dont expand
label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
/* FIXME: hacked spacer height */
QSpacerItem *spacer = new QSpacerItem(0, 300, QSizePolicy::Expanding, QSizePolicy::Maximum);
color_lay->addWidget(color_grid, 0, 0);
color_lay->addItem(spacer);
tabs->addTab(color_box, tr("Colors"));
base_lay->addWidget(tabs);
}
QStringList ConfigDlg::loadSw()
{
Config *config = new Config("multikey");
config->setGroup("keymaps");
- QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
+ QDir map_dir(QPEApplication::qpeDir() + "share/multikey", "*.keymap");
QStringList d_maps = map_dir.entryList(); // so i can access it in other places
QStringList c_maps = config->readListEntry("maps", QChar('|'));
QStringList s_maps = config->readListEntry("sw", QChar('|'));
delete config;
if (!s_maps.count())
{
s_maps = d_maps+c_maps;
}
else
{
/* Clear non existents entries */
QStringList s_copy(s_maps);
for (uint i = 0; i < s_copy.count(); ++i) {
if (d_maps.find(s_copy[i]) == d_maps.end()
&& c_maps.find(s_copy[i]) == c_maps.end()) {
s_maps.remove(s_copy[i]);
}
}
/* Update sw_maps from default_maps */
for (uint i = 0; i < d_maps.count(); ++i) {
if (s_maps.find(d_maps[i]) == s_maps.end()) {
s_maps.append(d_maps[i]);
}
}
/* Update sw_maps from custom_maps */
for (uint i = 0; i < c_maps.count(); ++i) {
if (s_maps.find(c_maps[i]) == s_maps.end()) {
s_maps.append(c_maps[i]);
}
}
}
return s_maps;
}
void ConfigDlg::accept()
{
/* Writing all stuffs to config */
Config *config = new Config("multikey");
config->setGroup("general");
config->writeEntry("usePickboard", pick_button->isChecked()); // default closed
config->writeEntry("useRepeat", repeat_button->isChecked()); // default closed
config->setGroup("keymaps");
config->writeEntry("sw", sw_maps, QChar('|'));
config->writeEntry("maps", custom_maps, QChar('|'));
delete config;
int index = keymaps->currentItem();
if (index == 0) {
remove_button->setDisabled(true);
emit setMapToDefault();
}
else if (default_maps.find(sw_maps[index-1]) != default_maps.end()) {
remove_button->setDisabled(true);
emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + sw_maps[index - 1]);
} else {
remove_button->setEnabled(true);
emit setMapToFile(sw_maps[index - 1]);
}
emit pickboardToggled(pick_button->isChecked());
emit repeatToggled(repeat_button->isChecked());
emit reloadSw();
QDialog::accept();
emit configDlgClosed();
}
void ConfigDlg::moveSelectedUp()
{
int i = keymaps->currentItem();
/* Ignore Current Language */
if (i > 1) {
QString t = sw_maps[i-1];
sw_maps[i-1] = sw_maps[i-2];
sw_maps[i-2] = t;
QString item = keymaps->currentText();
keymaps->removeItem(i);
keymaps->insertItem(item, i-1);
keymaps->setCurrentItem(i-1);
}
}
void ConfigDlg::moveSelectedDown()
{
int i = keymaps->currentItem();
/* Ignore Current Language */
if (i > 0 && i < (int)keymaps->count() - 1) {
QString t = sw_maps[i-1];
sw_maps[i-1] = sw_maps[i];
sw_maps[i] = t;
QString item = keymaps->currentText();
keymaps->removeItem(i);
keymaps->insertItem(item, i+1);
keymaps->setCurrentItem(i+1);
}
}
void ConfigDlg::closeEvent(QCloseEvent *) {
// tell the parent it was closed, so delete me
emit configDlgClosed();
}
void ConfigDlg::setMap(int index) {
if (index == 0 || default_maps.find(sw_maps[index-1]) != default_maps.end()) {
remove_button->setDisabled(true);
} else {
remove_button->setEnabled(true);
}
}
// ConfigDlg::addMap() {{{1
void ConfigDlg::addMap() {
QString map = OFileDialog::getOpenFileName(1, QDir::home().absPath());
if (map.isNull()) return;
Config config ("multikey");
config.setGroup("keymaps");
QStringList maps = config.readListEntry("maps", QChar('|'));
maps.append(map);
custom_maps.append(map);
if (sw_maps.find(map) == sw_maps.end())
sw_maps.append(map);
QFile map_file (map);
if (map_file.open(IO_ReadOnly)) {
QString line; bool found = 0;
map_file.readLine(line, 1024);
while (!map_file.atEnd()) {
if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
found = 1;
break;
}
map_file.readLine(line, 1024);
}
if (!found) keymaps->insertItem(map);
map_file.close();
}
keymaps->setSelected(keymaps->count() - 1, true);
}
// ConfigDlg::removeMap() {{{1
void ConfigDlg::removeMap() {
// move selection up one
keymaps->setSelected(keymaps->currentItem() - 1, true);
// delete the next selected item cus you just moved it up
keymaps->removeItem(keymaps->currentItem() + 1);
custom_maps.remove(sw_maps[keymaps->currentItem()]);
sw_maps.remove(sw_maps.at(keymaps->currentItem()));
}
/* ConfigDlg::slots for the color buttons {{{1
*
* these four slots are almost the same, except for the names. i was thinking
* of making a map with pointers to the buttons and names of the configEntry
* so it could be one slot, but then there would be no way of telling which
* of the buttons was clicked if they all connect to the same slot.
*
*/
void ConfigDlg::keyColorClicked() {
Config config ("multikey");
config.setGroup ("colors");
QStringList color = config.readListEntry("keycolor", QChar(','));
QColor newcolor = QColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()));
color[0].setNum(newcolor.red());
color[1].setNum(newcolor.green());
color[2].setNum(newcolor.blue());
config.writeEntry("keycolor", color, QChar(','));
config.write();
keycolor_button->setPalette(QPalette(newcolor));
emit reloadKeyboard();
}
void ConfigDlg::keyColorPressedClicked() {
Config config ("multikey");
config.setGroup ("colors");
QStringList color = config.readListEntry("keycolor_pressed", QChar(','));
QColor newcolor = QColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()));
color[0].setNum(newcolor.red());
color[1].setNum(newcolor.green());
color[2].setNum(newcolor.blue());
config.writeEntry("keycolor_pressed", color, QChar(','));
config.write();
keycolor_pressed_button->setPalette(QPalette(newcolor));
emit reloadKeyboard();
}
void ConfigDlg::keyColorLinesClicked() {
Config config ("multikey");
config.setGroup ("colors");
QStringList color = config.readListEntry("keycolor_lines", QChar(','));
QColor newcolor = QColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()));
color[0].setNum(newcolor.red());
color[1].setNum(newcolor.green());
color[2].setNum(newcolor.blue());
config.writeEntry("keycolor_lines", color, QChar(','));
config.write();
keycolor_lines_button->setPalette(QPalette(newcolor));
emit reloadKeyboard();
}
void ConfigDlg::textColorClicked() {
Config config ("multikey");
config.setGroup ("colors");
QStringList color = config.readListEntry("textcolor", QChar(','));
QColor newcolor = QColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()));
color[0].setNum(newcolor.red());
color[1].setNum(newcolor.green());
color[2].setNum(newcolor.blue());
config.writeEntry("textcolor", color, QChar(','));
config.write();
textcolor_button->setPalette(QPalette(newcolor));
emit reloadKeyboard();
}
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 7ddfd3e..f8cafd5 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -1,1710 +1,1710 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "keyboard.h"
#include "configdlg.h"
#include <qpe/global.h>
#include <qpe/qcopenvelope_qws.h>
#include <qwindowsystem_qws.h>
#include <qpainter.h>
#include <qfontmetrics.h>
#include <qtimer.h>
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <ctype.h>
#include <qdir.h>
#include <qtextstream.h>
#include <qstringlist.h>
#include <sys/utsname.h>
using namespace MultiKey;
static const char * const kb_config_xpm[] = {
"13 7 2 1",
" c None",
". c #000000",
" ",
" . ",
" ... ",
" ..... ",
" . ",
" . ",
" "};
/* Keyboard::Keyboard {{{1 */
Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0),
meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0),
useLargeKeys(TRUE), usePicks(0), useRepeat(0),
pressedKeyRow(-1), pressedKeyCol(-1),
unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
configdlg(0)
{
// get the default font
Config *config = new Config( "qpe" );
config->setGroup( "Appearance" );
QString familyStr = config->readEntry( "FontFamily", "smallsmooth" );
delete config;
config = new Config("multikey");
config->setGroup ("general");
usePicks = config->readBoolEntry ("usePickboard", 0); // default closed
useRepeat = config->readBoolEntry ("useRepeat", 1);
delete config;
setFont( QFont( familyStr, 10 ) );
picks = new KeyboardPicks( this );
picks->setFont( QFont( familyStr, 10 ) );
picks->initialise();
if (usePicks) {
QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
} else picks->hide();
loadKeyboardColors();
keys = new Keys();
repeatTimer = new QTimer( this );
connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
QCopChannel* kbdChannel = new QCopChannel("MultiKey/Keyboard", this);
connect(kbdChannel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(receive(const QCString&,const QByteArray&)));
}
Keyboard::~Keyboard() {
if ( configdlg ) {
delete configdlg;
configdlg = 0;
}
}
/* Keyboard::resizeEvent {{{1 */
void Keyboard::resizeEvent(QResizeEvent*)
{
int ph = picks->sizeHint().height();
picks->setGeometry( 0, 0, width(), ph );
keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1);
int nk; // number of keys?
if ( useLargeKeys ) {
nk = 15;
} else {
nk = 19;
}
defaultKeyWidth = (width()/nk)/2;
xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces?
}
/* KeyboardPicks::initialize {{{1 */
void KeyboardPicks::initialise()
{
setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
mode = 0;
dc = new KeyboardConfig(this);
configs.append(dc);
}
/* KeyboardPicks::sizeHint {{{1 */
QSize KeyboardPicks::sizeHint() const
{
return QSize(240,fontMetrics().lineSpacing());
}
/* KeyboardConfig::generateText {{{1 */
void KeyboardConfig::generateText(const QString &s)
{
#if defined(Q_WS_QWS) || defined(_WS_QWS_)
for (int i=0; i<(int)backspaces; i++) {
parent->emitKey( 0, ::Qt::Key_Backspace, 0, true, false );
parent->emitKey( 0, ::Qt::Key_Backspace, 0, false, false );
}
for (int i=0; i<(int)s.length(); i++) {
parent->emitKey( s[i].unicode(), 0, 0, true, false );
parent->emitKey( s[i].unicode(), 0, 0, false, false );
}
parent->emitKey( 0, ::Qt::Key_Space, 0, true, false );
parent->emitKey( 0, ::Qt::Key_Space, 0, false, false );
backspaces = 0;
#endif
}
/* Keyboard::paintEvent {{{1 */
void Keyboard::paintEvent(QPaintEvent* e)
{
QPainter painter(this);
painter.setClipRect(e->rect());
drawKeyboard( painter );
picks->dc->draw( &painter );
}
/* Keyboard::drawKeyboard {{{1 */
void Keyboard::drawKeyboard(QPainter &p, int row, int col)
{
if (row != -1 && col != -1) { //just redraw one key
int x = 0;
for (int i = 0; i < col; i++) {
x += keys->width(row, i) * defaultKeyWidth;
}
int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
int keyWidth = keys->width(row, col);
p.fillRect(x + 1, y + 1,
keyWidth * defaultKeyWidth - 1, keyHeight - 1,
pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor);
QImage *pix = keys->pix(row,col);
ushort c = keys->uni(row, col);
p.setPen(textcolor);
if (!pix) {
if ((shift || lock) && keys->shift(c))
if (circumflex && keys->circumflex(keys->shift(c)))
c = keys->circumflex(keys->shift(c));
else if (diaeresis && keys->diaeresis(keys->shift(c)))
c = keys->diaeresis(keys->shift(c));
else if (baccent && keys->baccent(keys->shift(c)))
c = keys->baccent(keys->shift(c));
else if (accent && keys->accent(keys->shift(c)))
c = keys->accent(keys->shift(c));
else if (meta && keys->meta(keys->shift(c)))
c = keys->meta(keys->shift(c));
else
c = keys->shift(c);
else if (meta && keys->meta(c))
c = keys->meta(c);
else if (circumflex && keys->circumflex(c))
c = keys->circumflex(c);
else if (baccent && keys->baccent(c))
c = keys->baccent(c);
else if (accent && keys->accent(c))
c = keys->accent(c);
else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) {
// the diaeresis key itself has to be in the diaeresisMap,
// or just do this to make it display the diaeresis char.
if (c == 0x2c6)
c = 0xa8;
else
c = keys->diaeresis(c);
}
p.drawText(x, y,
defaultKeyWidth * keyWidth + 3, keyHeight,
AlignCenter, (QChar)c);
}
else
// center the image in the middle of the key
p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2 + 1,
y + (keyHeight - pix->height())/2 + 1,
*pix );
// this fixes the problem that the very right end of the board's vertical line
// gets painted over, because it's one pixel shorter than all other keys
p.setPen(keycolor_lines);
p.drawLine(width() - 1, 0, width() - 1, height());
} else {
p.fillRect(0, 0, width(), height(), keycolor);
for (row = 1; row <= keys->rows(); row++) {
int x = 0;
int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
p.setPen(keycolor_lines);
p.drawLine(x, y, x + width(), y);
for (int col = 0; col < keys->numKeys(row); col++) {
QImage *pix = keys->pix(row, col);
int keyWidth = keys->width(row, col);
int keyWidthPix = defaultKeyWidth * keyWidth;
if (keys->pressed(row, col))
p.fillRect(x+1, y+1, keyWidthPix - 1,
keyHeight - 1, keycolor_pressed);
ushort c = keys->uni(row, col);
p.setPen(textcolor);
if (!pix) {
if ((shift || lock) && keys->shift(c))
if (circumflex && keys->circumflex(keys->shift(c)))
c = keys->circumflex(keys->shift(c));
else if (diaeresis && keys->diaeresis(keys->shift(c)))
c = keys->diaeresis(keys->shift(c));
else if (baccent && keys->baccent(keys->shift(c)))
c = keys->baccent(keys->shift(c));
else if (accent && keys->accent(keys->shift(c)))
c = keys->accent(keys->shift(c));
else if (meta && keys->meta(keys->shift(c)))
c = keys->meta(keys->shift(c));
else
c = keys->shift(c);
else if (meta && keys->meta(c))
c = keys->meta(c);
else if (circumflex && keys->circumflex(c))
c = keys->circumflex(c);
else if (baccent && keys->baccent(c))
c = keys->baccent(c);
else if (accent && keys->accent(c))
c = keys->accent(c);
else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) {
if (c == 0x2c6)
c = 0xa8;
else
c = keys->diaeresis(c);
}
p.drawText(x, y,
keyWidthPix + 3, keyHeight,
AlignCenter, (QChar)c);
}
else {
// center the image in the middle of the key
pix->setColor(1, textcolor.rgb());
p.drawImage( x + (keyWidthPix - pix->width())/2 + 1,
y + (keyHeight - pix->height())/2 + 1,
QImage(*pix) );
}
p.setPen(keycolor_lines);
p.drawLine(x, y, x, y + keyHeight);
x += keyWidthPix;
}
}
p.setPen(keycolor_lines);
p.drawLine(0, height() - 1, width(), height() - 1);
p.drawLine(width() - 1, 0, width() - 1, height());
}
}
/* Keyboard::mousePressEvent {{{1 */
void Keyboard::mousePressEvent(QMouseEvent *e)
{
int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1;
if (row > 5) row = 5;
// figure out the column
int col = 0;
for (int w = 0; e->x() >= w; col++)
if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys
w += keys->width(row,col) * defaultKeyWidth;
else break;
if (col <= 0) return;
col --; // rewind one...
qkeycode = keys->qcode(row, col);
unicode = keys->uni(row, col);
// might need to repaint if two or more of the same keys.
// should be faster if just paint one key even though multiple keys exist.
bool need_repaint = FALSE;
// circumflex and diaeresis support
// messy to have this here, but too hard to implement any other method
if (unicode == 0x2c6) {
unicode = 0;
if (shift || lock) {
// diaeresis
qkeycode = 0x2001;
}
else {
// circumflex
qkeycode = 0x2000;
}
}
// Back accent character support
// the keys from 2c6 ~ 2cf should be used instead of the ascii one
if (unicode == 0x2cb) {
unicode = 0;
if (shift || lock) {
// circumblex
qkeycode = 0x2000;
}
else {
// back accent
qkeycode = 0x2002;
}
}
// Accent character support
if (unicode == 0x2ca) {
unicode = 0;
if (shift || lock) {
// diaeresis
qkeycode = 0x2001;
}
else {
// accent
qkeycode = 0x2003;
}
}
if (unicode == 0) { // either Qt char, or nothing
if (qkeycode == Qt::Key_F1) { // toggle the pickboard
if ( configdlg ) {
delete configdlg;
configdlg = 0;
}
else {
configdlg = new ConfigDlg ();
connect(configdlg, SIGNAL(setMapToDefault()),
this, SLOT(setMapToDefault()));
connect(configdlg, SIGNAL(setMapToFile(QString)),
this, SLOT(setMapToFile(QString)));
connect(configdlg, SIGNAL(pickboardToggled(bool)),
this, SLOT(togglePickboard(bool)));
connect(configdlg, SIGNAL(repeatToggled(bool)),
this, SLOT(toggleRepeat(bool)));
connect(configdlg, SIGNAL(reloadKeyboard()),
this, SLOT(reloadKeyboard()));
connect(configdlg, SIGNAL(configDlgClosed()),
this, SLOT(cleanupConfigDlg()));
connect(configdlg, SIGNAL(reloadSw()),
this, SLOT(reloadSw()));
configdlg->showMaximized();
configdlg->show();
configdlg->raise();
}
} else if (qkeycode == Qt::Key_Control) {
need_repaint = TRUE;
if (ctrl) {
*ctrl = 0;
ctrl = 0;
} else {
ctrl = keys->pressedPtr(row, col);
need_repaint = TRUE;
*ctrl = !keys->pressed(row, col);
}
} else if (qkeycode == Qt::Key_Alt) {
need_repaint = TRUE;
if (alt) {
*alt = 0;
alt = 0;
} else {
alt = keys->pressedPtr(row, col);
need_repaint = TRUE;
*alt = !keys->pressed(row, col);
}
} else if (qkeycode == Qt::Key_Shift) {
need_repaint = TRUE;
if (shift) {
*shift = 0;
shift = 0;
}
else {
shift = keys->pressedPtr(row, col);
*shift = 1;
if (lock) {
*lock = 0;
lock = 0;
}
}
/*
* want to be able to hit circumflex/diaeresis -> shift
* to type in shifted circumflex/diaeresis chars.
* same thing with meta
if (meta) { *meta = 0; meta = 0; }
if (circumflex) { *circumflex = 0; circumflex = 0; }
if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
*/
} else if (qkeycode == Qt::Key_CapsLock) {
need_repaint = TRUE;
if (lock) {
*lock = 0;
lock = 0;
}
else {
lock = keys->pressedPtr(row, col);;
*lock = true;;
if (shift) {
*shift = 0;
shift = 0;
}
}
/*
if (meta) { *meta = 0; meta = 0; }
if (circumflex) { *circumflex = 0; circumflex = 0; }
if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
*/
} else if (qkeycode == Qt::Key_Meta) {
need_repaint = TRUE;
if (meta) {
*meta = 0;
meta = 0;
} else {
meta = keys->pressedPtr(row, col);
*meta = true;
}
// reset all the other keys
if (shift) { *shift = 0; shift = 0; }
if (lock) { *lock = 0; lock = 0; }
if (circumflex) { *circumflex = 0; circumflex = 0; }
if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
if (baccent) { *baccent = 0; baccent = 0; }
if (accent) { *accent = 0; accent = 0; }
// dont need to emit this key... acts same as alt
qkeycode = 0;
// circumflex
} else if (qkeycode == 0x2000) {
need_repaint = TRUE;
if (circumflex) {
*circumflex = 0;
circumflex = 0;
} else {
circumflex = keys->pressedPtr(row, col);
*circumflex = true;
}
/* no need to turn off shift or lock if circumflex
* keys are pressed
if (shift) { *shift = 0; shift = 0; }
if (lock) { *lock = 0; lock = 0; }
*/
// have to reset all the other keys
if (meta) { *meta = 0; meta = 0; }
if (diaeresis) {
// *diaeresis and *circumflex point to the same thing
// when diaeresis is enabled and you hit the circumflex
// since they are the same key, it should turn off the
// key
*diaeresis = 0;
diaeresis = 0;
circumflex = 0;
}
qkeycode = 0;
// diaeresis
} else if (qkeycode == 0x2001) {
need_repaint = TRUE;
if (diaeresis) {
*diaeresis = 0;
diaeresis = 0;
} else {
diaeresis = keys->pressedPtr(row, col);
*diaeresis = true;
}
if (shift) { *shift = 0; shift = 0; }
/*
*
if (lock) { *lock = 0; lock = 0; }
*
*/
if (meta) { *meta = 0; meta = 0; }
if (circumflex) {
// *circumflex = 0;
//
// same thing the diaeresis pointer points too
circumflex = 0;
}
qkeycode = 0;
// Back accent
} else if (qkeycode == 0x2002) {
need_repaint = TRUE;
if (baccent) {
*baccent = 0;
baccent = 0;
} else {
baccent = keys->pressedPtr(row, col);
*baccent = true;
}
if (shift) { *shift = 0; shift = 0; }
if (meta) { *meta = 0; meta = 0; }
if (accent) { *accent = 0; accent = 0; }
qkeycode = 0;
// Accent
} else if (qkeycode == 0x2003) {
need_repaint = TRUE;
if (accent) {
*accent = 0;
accent = 0;
} else {
accent = keys->pressedPtr(row, col);
*accent = true;
}
if (shift) { *shift = 0; shift = 0; }
if (meta) { *meta = 0; meta = 0; }
if (baccent) { *baccent = 0; }
qkeycode = 0;
}
}
else { // normal char
if ((shift || lock) && keys->shift(unicode)) {
// make diaeresis/circumflex -> shift input shifted
// diaeresis/circumflex chars
if (circumflex && keys->circumflex(keys->shift(unicode)))
unicode = keys->circumflex(keys->shift(unicode));
else if (diaeresis && keys->diaeresis(keys->shift(unicode)))
unicode = keys->diaeresis(keys->shift(unicode));
else if (baccent && keys->baccent(keys->shift(unicode)))
unicode = keys->baccent(keys->shift(unicode));
else if (accent && keys->accent(keys->shift(unicode)))
unicode = keys->accent(keys->shift(unicode));
else if (meta && keys->meta(keys->shift(unicode)))
unicode = keys->meta(keys->shift(unicode));
else
unicode = keys->shift(unicode);
}
else if (meta && keys->meta(unicode)) {
unicode = keys->meta(unicode);
}
else if (circumflex && keys->circumflex(unicode)) {
unicode = keys->circumflex(unicode);
}
else if (diaeresis && keys->diaeresis(unicode)) {
unicode = keys->diaeresis(unicode);
}
else if (baccent && keys->baccent(unicode)) {
unicode = keys->baccent(unicode);
}
else if (accent && keys->accent(unicode)) {
unicode = keys->accent(unicode);
}
}
// korean parsing
if (keys->lang == "ko") {
unicode = parseKoreanInput(unicode);
}
modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0);
if ('A' <= unicode && unicode <= 'z' && modifiers) {
qkeycode = QChar(unicode).upper();
unicode = qkeycode - '@';
}
QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false);
// pickboard stuff
if (usePicks) {
KeyboardConfig *dc = picks->dc;
if (dc) {
if (qkeycode == Qt::Key_Backspace) {
dc->input.remove(dc->input.last()); // remove last input
dc->decBackspaces();
} else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) {
dc->input.clear();
dc->resetBackspaces();
} else {
dc->add(QString(QChar(unicode)));
dc->incBackspaces();
}
}
picks->repaint();
}
// painting
pressed = TRUE;
pressedKeyRow = row;
pressedKeyCol = col;
if (need_repaint) repaint(FALSE);
else { // just paint the one key pressed
QPainter p(this);
drawKeyboard(p, row, col);
}
if (useRepeat) repeatTimer->start( 800 );
//pressTid = startTimer(80);
}
void Keyboard::receive(const QCString &msg, const QByteArray &data)
{
if (msg == "setmultikey(QString)") {
QDataStream stream(data, IO_ReadOnly);
QString map;
stream >> map;
setMapToFile(map);
} else if (msg == "getmultikey()") {
reloadSw();
}
}
/* Keyboard::mouseReleaseEvent {{{1 */
void Keyboard::mouseReleaseEvent(QMouseEvent*)
{
pressed = FALSE;
//if ( pressTid == 0 )
#if defined(Q_WS_QWS) || defined(_WS_QWS_)
if ( unicode != -1 ) {
emit key( unicode, qkeycode, modifiers, false, false );
repeatTimer->stop();
}
#endif
if (shift && unicode != 0) {
*shift = 0; // unpress shift key
shift = 0; // reset the shift pointer
repaint(FALSE);
}
if (ctrl && unicode != 0) {
*ctrl = 0;
ctrl = 0;
repaint(FALSE);
}
if (alt && alt != 0) {
*alt = 0;
alt = 0;
repaint(FALSE);
}
/*
* do not make the meta key release after being pressed
*
else if (meta && unicode != 0) {
*meta = 0;
meta = 0;
repaint(FALSE);
}
*/
else clearHighlight();
}
/* Keyboard::timerEvent {{{1 */
/* dont know what this does, but i think it is here so that if your screen
* sticks (like on an ipaq) then it will stop repeating if you click another
* key... but who knows what anything does in this thing anyway?
void Keyboard::timerEvent(QTimerEvent* e)
{
if ( e->timerId() == pressTid ) {
killTimer(pressTid);
pressTid = 0;
if ( !pressed )
cout << "calling clearHighlight from timerEvent\n";
//clearHighlight();
}
}
*/
void Keyboard::repeat()
{
repeatTimer->start( 200 );
emit key( unicode, qkeycode, modifiers, true, true );
}
void Keyboard::clearHighlight()
{
if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) {
int tmpRow = pressedKeyRow;
int tmpCol = pressedKeyCol;
pressedKeyRow = -1;
pressedKeyCol = -1;
QPainter p(this);
drawKeyboard(p, tmpRow, tmpCol);
}
}
/* Keyboard::sizeHint {{{1 */
QSize Keyboard::sizeHint() const
{
QFontMetrics fm=fontMetrics();
int keyHeight = fm.lineSpacing() + 2;
return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1);
}
void Keyboard::resetState()
{
if (shift) { *shift = 0; shift = 0; }
if (lock) {*lock = 0; lock = 0; }
if (meta) { *meta = 0; meta = 0; }
if (circumflex) { *circumflex = 0; circumflex = 0; }
if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
if (baccent) { *baccent = 0; baccent = 0; }
if (accent) { *accent = 0; accent = 0; }
schar = mchar = echar = 0;
picks->resetState();
}
/* Keyboard::togglePickboard {{{1 */
void Keyboard::togglePickboard(bool on_off)
{
usePicks = on_off;
if (usePicks) {
picks->show();
//move(x(), y() - picks->height()); // not required anymore because QCopChannel::send
//adjustSize();
QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
} else {
picks->hide();
picks->resetState();
//move(x(), y() + picks->height());
//adjustSize();
QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
}
/*
* this closes && opens the input method
*/
QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
}
void Keyboard::toggleRepeat(bool on) {
useRepeat = on;
//cout << "setting useRepeat to: " << useRepeat << "\n";
}
void Keyboard::cleanupConfigDlg() {
if ( configdlg ) {
delete configdlg;
configdlg = 0;
}
}
void Keyboard::reloadSw() {
QCopEnvelope e("MultiKey/Switcher", "setsw(QString,QString)");
Config* config = new Config("multikey");
config->setGroup("keymaps");
QString current_map = config->readEntry("current", "en.keymap");
delete config;
e << ConfigDlg::loadSw().join("|") << current_map;
}
/* Keyboard::setMapTo ... {{{1 */
void Keyboard::setMapToDefault() {
/* load current locale language map */
Config *config = new Config("locale");
config->setGroup( "Language" );
QString l = config->readEntry( "Language" , "en" );
delete config;
/* if Language represents as en_US, ru_RU, etc... */
int d = l.find('_');
if (d != -1) {
l.remove(d, l.length()-d);
}
QString key_map = QPEApplication::qpeDir() + "share/multikey/"
+ l + ".keymap";
/* save change to multikey config file */
config = new Config("multikey");
config->setGroup ("keymaps");
config->writeEntry ("current", key_map); // default closed
delete config;
int prevRows = keys->rows();
delete keys;
keys = new Keys(key_map);
// have to repaint the keyboard
if (prevRows != keys->rows()) {
QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
} else repaint(FALSE);
resetState();
}
void Keyboard::setMapToFile(QString map) {
/* save change to multikey config file */
Config *config = new Config("multikey");
config->setGroup ("keymaps");
config->writeEntry ("current", map); // default closed
delete config;
int prevRows = keys->rows();
delete keys;
if (QFile(map).exists())
keys = new Keys(map);
else
keys = new Keys();
if (keys->rows() != prevRows) {
QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
}
else repaint(FALSE);
resetState();
}
/* Keybaord::reloadKeyboard {{{1 */
void Keyboard::reloadKeyboard() {
// reload colors and redraw
loadKeyboardColors();
repaint();
}
void Keyboard::loadKeyboardColors() {
Config config ("multikey");
config.setGroup("colors");
QStringList color;
color = config.readListEntry("keycolor", QChar(','));
if (color.isEmpty()) {
color = QStringList::split(",", "240,240,240");
config.writeEntry("keycolor", color.join(","));
}
keycolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
color = config.readListEntry("keycolor_pressed", QChar(','));
if (color.isEmpty()) {
color = QStringList::split(",", "171,183,198");
config.writeEntry("keycolor_pressed", color.join(","));
}
keycolor_pressed = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
color = config.readListEntry("keycolor_lines", QChar(','));
if (color.isEmpty()) {
color = QStringList::split(",", "138,148,160");
config.writeEntry("keycolor_lines", color.join(","));
}
keycolor_lines = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
color = config.readListEntry("textcolor", QChar(','));
if (color.isEmpty()) {
color = QStringList::split(",", "43,54,68");
config.writeEntry("textcolor", color.join(","));
}
textcolor = QColor(color[0].toInt(), color[1].toInt(), color[2].toInt());
}
/* korean input functions {{{1
*
* TODO
* one major problem with this implementation is that you can't move the
* cursor after inputing korean chars, otherwise it will eat up and replace
* the char before the cursor you move to. fix that
*
* make backspace delete one single char, not the whole thing if still
* editing.
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* how korean input works
*
* all following chars means unicode char value and are in hex
*
* 초음 = schar (start char)
* 중음 = mchar (middle char)
* 끝음 = echar (end char)
*
* there are 19 schars. unicode position is at 1100 - 1112
* there are 21 mchars. unicode position is at 1161 - 1175
* there are 27 echars. unicode position is at 11a8 - 11c2
*
* the map with everything combined is at ac00 - d7a3
*
*/
ushort Keyboard::parseKoreanInput (ushort c) {
if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c))
||
(c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode
&& qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) {
schar = 0, mchar = 0, echar = 0;
return c;
}
if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input
if (schar == 0 || (schar != 0 && mchar == 0)) {
schar = c; mchar = 0; echar = 0;
return c;
}
else if (mchar != 0) {
if (echar == 0) {
if (!(echar = constoe(c))) {
schar = c; mchar = 0; echar = 0;
return c;
}
}
else { // must figure out what the echar is
if (echar == 0x11a8) { // ㄱ
if (c == 0x1100) echar = 0x11a9; // ㄱ + ㄱ
else if (c == 0x1109) echar = 0x11aa; // ㄱ + ㅅ
else {
schar = c; mchar = 0; echar = 0;
return c;
}
} else if (echar == 0x11ab) { // ㄴ
if (c == 0x110c) echar = 0x11ac; // ㄴ + ㅈ
else if (c == 0x1112) echar = 0x11ad; // ㄴ + ㅎ
else {
schar = c; mchar = 0; echar = 0;
return c;
}
} else if (echar == 0x11af) { // ㄹ
if (c == 0x1100) echar = 0x11b0; // ㄹ + ㄱ
else if (c == 0x1106) echar = 0x11b1; // ㄹ + ㅁ
else if (c == 0x1107) echar = 0x11b2; // ㄹ + ㅂ
else if (c == 0x1109) echar = 0x11b3; // ㄹ + ㅅ
else if (c == 0x1110) echar = 0x11b4; // ㄹ + ㅌ
else if (c == 0x1111) echar = 0x11b5; // ㄹ + ㅍ
else if (c == 0x1112) echar = 0x11b6; // ㄹ + ㅎ
else {
schar = c; mchar = 0; echar = 0;
return c;
}
} else if (echar == 0x11b8) { // ㅂ
if (c == 0x1109) echar = 0x11b9; // ㅂ + ㅅ
else {
schar = c; mchar = 0; echar = 0;
return c;
}
} else if (echar == 0x11ba) { // ㅅ
if (c == 0x1109) echar = 0x11bb; // ㅅ + ㅅ
else {
schar = c; mchar = 0; echar = 0;
return c;
}
} else { // if any other char, cannot combine chars
schar = c; mchar = 0; echar = 0;
return c;
}
unicode = echar;
}
}
}
else if (0x1161 <= c && c <= 0x1175) { // mchar was input
if (schar != 0 && mchar == 0) { mchar = c; }
else if (schar != 0 && mchar != 0 && echar == 0) {
switch (mchar) {
case 0x1169:
if (c == 0x1161) mchar = 0x116a;
else if (c == 0x1162) mchar = 0x116b;
else if (c == 0x1175) mchar = 0x116c;
else {
schar = 0; mchar = 0; echar = 0;
return c;
}
break;
case 0x116e:
if (c == 0x1165) mchar = 0x116f;
else if (c == 0x1166) mchar = 0x1170;
else if (c == 0x1175) mchar = 0x1171;
else {
schar = 0; mchar = 0; echar = 0;
return c;
}
break;
case 0x1173:
if (c == 0x1175) mchar = 0x1174;
else {
schar = 0; mchar = 0; echar = 0;
return c;
}
break;
default:
schar = 0; mchar = 0; echar = 0;
return c;
}
}
else if (schar != 0 && mchar != 0 && echar != 0) {
emit key( 8, Qt::Key_Backspace, 0, true, false );
ushort prev = 0;
switch (echar) {
/*
case 0x11a9:
prev = combineKoreanChars(schar, mchar, 0x11a8);
schar = 0x1100;
break;
*/
case 0x11aa:
prev = combineKoreanChars(schar, mchar, 0x11a8);
schar = 0x1109;
break;
case 0x11ac:
prev = combineKoreanChars(schar, mchar, 0x11ab);
schar = 0x110c;
break;
case 0x11ad:
prev = combineKoreanChars(schar, mchar, 0x11ab);
schar = 0x1112;
break;
case 0x11b0:
prev = combineKoreanChars(schar, mchar, 0x11af);
schar = 0x1100;
break;
case 0x11b1:
prev = combineKoreanChars(schar, mchar, 0x11af);
schar = 0x1106;
break;
case 0x11b2:
prev = combineKoreanChars(schar, mchar, 0x11af);
schar = 0x1107;
break;
case 0x11b3:
prev = combineKoreanChars(schar, mchar, 0x11af);
schar = 0x1109;
break;
case 0x11b4:
prev = combineKoreanChars(schar, mchar, 0x11af);
schar = 0x1110;
break;
case 0x11b9:
prev = combineKoreanChars(schar, mchar, 0x11b8);
schar = 0x1109;
break;
/*
case 0x11bb:
prev = combineKoreanChars(schar, mchar, 0x11ba);
schar = 0x1109;
break;
*/
default:
if (constoe(echar)) {
prev = combineKoreanChars(schar, mchar, 0);
schar = constoe(echar);
}
break;
}
emit key( prev, prev, 0, true, false );
mchar = c; echar = 0;
return combineKoreanChars(schar, mchar, 0);
}
else {
schar = 0; mchar = 0; echar = 0;
return c;
}
}
else /*if (c == ' ')*/ return c;
// and now... finally delete previous char, and return new char
emit key( 8, Qt::Key_Backspace, 0, true, false );
return combineKoreanChars( schar, mchar, echar);
}
ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) {
return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00;
}
ushort Keyboard::constoe(const ushort c) {
// converts schars to echars if possible
if (0x1100 <= c && c <= 0x1112) { // schar to echar
switch (c) {
case 0x1100: return 0x11a8;
case 0x1101: return 0x11a9;
case 0x1102: return 0x11ab;
case 0x1103: return 0x11ae;
case 0x1105: return 0x11af;
case 0x1106: return 0x11b7;
case 0x1107: return 0x11b8;
case 0x1109: return 0x11ba;
case 0x110a: return 0x11bb;
case 0x110b: return 0x11bc;
case 0x110c: return 0x11bd;
case 0x110e: return 0x11be;
case 0x110f: return 0x11bf;
case 0x1110: return 0x11c0;
case 0x1111: return 0x11c1;
case 0x1112: return 0x11c2;
default: return 0;
}
} else { //echar to schar
switch (c) {
case 0x11a8: return 0x1100;
case 0x11a9: return 0x1101;
case 0x11ab: return 0x1102;
case 0x11ae: return 0x1103;
case 0x11af: return 0x1105;
case 0x11b7: return 0x1106;
case 0x11b8: return 0x1107;
case 0x11ba: return 0x1109;
case 0x11bb: return 0x110a;
case 0x11bc: return 0x110b;
case 0x11bd: return 0x110c;
case 0x11be: return 0x110e;
case 0x11bf: return 0x110f;
case 0x11c0: return 0x1110;
case 0x11c1: return 0x1111;
case 0x11c2: return 0x1112;
default: return 0;
}
}
}
// Keys::Keys {{{1
Keys::Keys() {
Config *config = new Config ("multikey");
config->setGroup( "keymaps" );
QString map = config->readEntry( "current" );
delete config;
if (map.isNull() || !(QFile(map).exists())) {
Config *config = new Config("locale");
config->setGroup( "Language" );
QString l = config->readEntry( "Language" , "en" );
delete config;
- map = QPEApplication::qpeDir() + "/share/multikey/"
+ map = QPEApplication::qpeDir() + "share/multikey/"
+ l + ".keymap";
}
if (map.isNull() || !(QFile(map).exists())) {
- map = QPEApplication::qpeDir() + "/share/multikey/en.keymap";
+ map = QPEApplication::qpeDir() + "share/multikey/en.keymap";
}
setKeysFromFile(map);
}
Keys::Keys(const char * filename) {
setKeysFromFile(filename);
}
// Keys::setKeysFromFile {{{2
void Keys::setKeysFromFile(const char * filename) {
QFile f(filename);
if (f.open(IO_ReadOnly)) {
QTextStream t(&f);
int row;
int qcode;
ushort unicode;
int width;
QString buf;
QString comment;
char * xpm[256]; //couldnt be larger than that... could it?
QImage *xpm2pix = 0;
buf = t.readLine();
while (buf) {
// get rid of comments
buf.replace(QRegExp("#.*$", FALSE, FALSE), "");
// key definition
if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) {
// no $1 type referencing!!! this implementation of regexp sucks
// dont know of any sscanf() type funcs in Qt lib
QTextStream tmp (buf, IO_ReadOnly);
tmp >> row >> qcode >> unicode >> width >> comment;
buf = t.readLine();
int xpmLineCount = 0;
xpm2pix = 0;
// erase blank space
while (buf.contains(QRegExp("^\\s*$")) && buf) buf = t.readLine();
while (buf.contains(QRegExp("^\\s*\".*\""))) {
QString xpmBuf = buf.stripWhiteSpace();
xpm[xpmLineCount] = new char [xpmBuf.length()];
int j = 0;
for (ushort i = 0; i < xpmBuf.length(); i++) {
if (xpmBuf[i].latin1() != '"') {
((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1();
j++;
}
}
// have to close that facker up
((char *)xpm[xpmLineCount])[j] = '\0';
xpmLineCount++;
buf = t.readLine();
}
if (xpmLineCount) {
xpm2pix = new QImage((const char **)xpm);
for (int i = 0; i < xpmLineCount; i++)
delete [] (xpm[i]);
}
setKey(row, qcode, unicode, width, xpm2pix);
}
// shift map
else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
tmp >> lower >> shift;
shiftMap.insert(lower, shift);
buf = t.readLine();
}
// meta key map
else if (buf.contains(QRegExp("^\\s*m\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar m;
tmp >> m >> lower >> shift;
metaMap.insert(lower, shift);
buf = t.readLine();
}
// circumflex
else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar c;
tmp >> c >> lower >> shift;
circumflexMap.insert(lower, shift);
buf = t.readLine();
}
// diaeresis
else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar d;
tmp >> d >> lower >> shift;
diaeresisMap.insert(lower, shift);
buf = t.readLine();
}
// back accent
else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar d;
tmp >> d >> lower >> shift;
baccentMap.insert(lower, shift);
qDebug ("Estoy aadiendo %i con %i", lower, shift);
buf = t.readLine();
}
// accent
else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar d;
tmp >> d >> lower >> shift;
accentMap.insert(lower, shift);
buf = t.readLine();
}
// other variables like lang & title & sw
else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
QString name, equals, value;
tmp >> name >> equals >> value;
if (name == "lang") {
lang = value;
}
buf = t.readLine();
}
// comments
else if (buf.contains(QRegExp("^\\s*#"))) {
buf = t.readLine();
} else { // blank line, or garbage
buf = t.readLine();
}
}
f.close();
} else {
// We couldnt find the selected keymap, give them a configure button
QImage * btn = new QImage((const char ** )kb_config_xpm);
setKey(1, 0x1030, 0, 2, btn);
}
}
// Keys::setKey {{{2
void Keys::setKey(const int row, const int qcode, const ushort unicode,
const int width, QImage *pix) {
Key * key;
key = new Key;
key->qcode = qcode;
key->unicode = unicode;
key->width = width;
// share key->pressed between same keys
bool found = 0;
for (int i = 1; i <= 5; i++) {
for (unsigned int j = 0; j < keys[i].count(); j++)
if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) {
key->pressed = keys[i].at(j)->pressed;
found = 1;
}
}
if (!found) {
key->pressed = new bool;
*(key->pressed) = 0;
}
key->pix = pix;
keys[row].append(key);
}
// Keys::~Keys {{{2
Keys::~Keys() {
for (int i = 1; i <= 5; i++)
for (unsigned int j = 0; j < keys[i].count(); j++)
delete keys[i].at(j);
}
// Keys:: other functions {{{2
int Keys::width(const int row, const int col) {
return keys[row].at(col)->width;
}
int Keys::rows() {
for (int i = 1; i <= 5; i++) {
if (keys[i].count() == 0)
return i - 1;
}
return 5;
}
ushort Keys::uni(const int row, const int col) {
return keys[row].at(col)->unicode;
}
int Keys::qcode(const int row, const int col) {
return keys[row].at(col)->qcode;
}
QImage *Keys::pix(const int row, const int col) {
return keys[row].at(col)->pix;
}
bool Keys::pressed(const int row, const int col) {
return *(keys[row].at(col)->pressed);
}
int Keys::numKeys(const int row) {
return keys[row].count();
}
void Keys::setPressed(const int row, const int col, const bool pressed) {
*(keys[row].at(col)->pressed) = pressed;
}
ushort Keys::shift(const ushort uni) {
if (shiftMap[uni]) return shiftMap[uni];
else return 0;
}
ushort Keys::meta(const ushort uni) {
if (metaMap[uni]) return metaMap[uni];
else return 0;
}
ushort Keys::circumflex(const ushort uni) {
if (circumflexMap[uni]) return circumflexMap[uni];
else return 0;
}
ushort Keys::diaeresis(const ushort uni) {
if(diaeresisMap[uni]) return diaeresisMap[uni];
else return 0;
}
ushort Keys::baccent(const ushort uni) {
if(baccentMap[uni]) return baccentMap[uni];
else return 0;
}
ushort Keys::accent(const ushort uni) {
if(accentMap[uni]) return accentMap[uni];
else return 0;
}
bool *Keys::pressedPtr(const int row, const int col) {
return keys[row].at(col)->pressed;
}
diff --git a/libopie2/opiecore/opluginloader.cpp b/libopie2/opiecore/opluginloader.cpp
index 2a6e369..d33eac6 100644
--- a/libopie2/opiecore/opluginloader.cpp
+++ b/libopie2/opiecore/opluginloader.cpp
@@ -1,905 +1,905 @@
/*
* LGPLv2 or later
* zecke@handhelds.org
*/
#include "opluginloader.h"
#include "oconfig.h"
#include "odebug.h"
#include <qpe/qpeapplication.h>
#include <qdir.h>
#include <qdict.h>
#include <qtl.h>
#include <qfile.h>
#include <stdlib.h>
namespace Opie {
namespace Core {
namespace Internal {
struct OPluginLibraryHolder {
static OPluginLibraryHolder *self();
QLibrary *ref( const QString& );
void deref( QLibrary* );
private:
OPluginLibraryHolder();
~OPluginLibraryHolder();
QDict<QLibrary> m_libs;
static OPluginLibraryHolder* m_self;
};
OPluginLibraryHolder* OPluginLibraryHolder::m_self = 0;
OPluginLibraryHolder* OPluginLibraryHolder::self() {
if ( !m_self )
m_self = new OPluginLibraryHolder;
return m_self;
}
OPluginLibraryHolder::OPluginLibraryHolder() {}
OPluginLibraryHolder::~OPluginLibraryHolder() {}
/*
* We do simple ref counting... We will add the QLibrary again
* and again to the dictionary and on deref we will pop and pop it
* until there are no more library and we will unload and delete the library
* luckily dlopen does some ref counting as well so we don't need
* to hack QPEApplication
*/
QLibrary* OPluginLibraryHolder::ref(const QString& str) {
QLibrary *lib = m_libs[str];
/* if not in the dict try to load it */
if ( !lib ) {
lib = new QLibrary( str, QLibrary::Immediately );
if ( !lib->isLoaded() ) {
delete lib;
return 0l;
}
}
/* now refcount one up */
m_libs.insert( str, lib );
return lib;
}
/*
* 'unshadow' the items until we're the last then unload and delete
*/
void OPluginLibraryHolder::deref( QLibrary* lib ) {
if ( !lib )
return;
QString str = lib->library();
/* no need to check if the lib was inserted or such */
(void) m_libs.take( str );
if ( !m_libs[str] ) {
lib->unload();
delete lib;
}
}
}
/**
* We want values with 30,29,28 at the beginning of the list
*/
bool operator<( const OPluginItem& l, const OPluginItem& r ) {
return l.position() > r.position();
}
bool operator>( const OPluginItem& l, const OPluginItem& r ) {
return l.position() < r.position();
}
bool operator<=( const OPluginItem& l, const OPluginItem& r ) {
return l.position() >= r.position();
}
/**
* \brief Creates an Empty OPluginItem
*
* create an empty pluginitem. Position is set to -1 and the
* other things are used with the default ctors
*/
OPluginItem::OPluginItem()
: m_pos( -1 ) {
}
/**
* @todo Create Internal name so we can have the plugin names translated. Or only for the gui? I'm not yet sure
* \brief Create an OPluginItem
*
* Create a Plugin Item with all information. If you for some reasons
* need to create your own OPluginItems make sure that 'name' is always the same
* as it if used for positions and exclude list.
*
* @param name The if available translated Name
* @param path The path to the plugin must be absolute.
* @param b If the OPluginItem is enabled or not
* @param pos The position of the plugin if used for sorting
*
*/
OPluginItem::OPluginItem( const QString& name, const QString& path, bool b, int pos )
: m_name( name ), m_path( path ), m_enabled( b ), m_pos( pos )
{}
/**
* \brief simple d'tor
*/
OPluginItem::~OPluginItem() {
}
/**
* \brief Test if this Item is Empty and does not represent a loadable plugin
* Test if a OPluginItem is empty. A OPluginItem is empty if name and path are empty
* ,pos equals -1 and the item is disabled
*
* @see QString::isEmpty()
*
*/
bool OPluginItem::isEmpty()const {
if ( m_pos != -1 ) return false;
if ( m_enabled ) return false;
if ( !m_name.isEmpty() ) return false;
if ( !m_path.isEmpty() ) return false;
return true;
}
/**
* \brief test equality
* operator to test equalness of two OPluginItem
*/
bool OPluginItem::operator==( const OPluginItem& r )const{
if ( m_pos != r.m_pos ) return false;
if ( m_enabled != r.m_enabled) return false;
if ( m_name != r.m_name ) return false;
if ( m_path != r.m_path ) return false;
return true;
}
/**
* \brief test non equality
* operator to test non-equalness of two OPluginItem
*/
bool OPluginItem::operator!=( const OPluginItem& r )const{
return !( *this == r );
}
/**
* \brief returns the name of the plugin
* return the name of this Plugin
*/
QString OPluginItem::name()const {
return m_name;
}
/**
* \brief return the path of the plugin
*/
QString OPluginItem::path()const {
return m_path;
}
/**
* \brief Return if this item is enabled.
*/
bool OPluginItem::isEnabled()const {
return m_enabled;
}
/**
* \brief return the position of a plugin.
* return the position of the item
* -1 is the default value and means normally that the whole items are unsorted.
* Higher numbers belong to an upper position. With plugins with the postions 20,19,5,3
* the item with pos 20 would be the first in the list returned by the OGenericPluginLoader
*
* @see OGenericPluginLoader::allAvailable
* @see OGenericPluginLoader::filtered
*/
int OPluginItem::position()const{
return m_pos;
}
/**
* \brief set the name of a plugin
* Set the name of the Plugin Item
* @param name
*/
void OPluginItem::setName( const QString& name ) {
m_name = name;
}
/**
* \brief set the path of a plugin
* Set the path of Plugin Item. The path must be absolute.
* @param name The path of the plugin
*/
void OPluginItem::setPath( const QString& name ) {
m_path = name;
}
/**
* \brief enable or disable the to load attribute
* Set the Enabled attribute. Such changes won't be saved. If you want to save it
* use a OPluginManager to configure your plugins manually or Opie::Ui::OPluginConfig
* for a graphical frontend.
*
* @param enabled Enable or Disable the Enabled Attribute
*/
void OPluginItem::setEnabled( bool enabled ) {
m_enabled = enabled;
}
/**
* \brief Set the position.
* Set the position
* @param pos The position
*
* @see position()
*/
void OPluginItem::setPosition( int pos ) {
m_pos = pos;
}
/**
* \brief create a PluginLoader
*
* Create a PluginLoader autoDelete is set to false
*
* \code
* Opie::Core::OGenericPluginLoader loader("myapp-plugin");
* Opie::Core::OPluginItem::List lst = loader.filtered();
* for(Opie::Core::OPluginItem::List::Iterator it = lst.begin(); it!=lst.end();++it){
* MyIface* iface = static_cast<MyIface*>(loader.load(*it,IID_MyIface));
* }
* \endcode
*
* \code
* Opie::Core::OGenericPluginLoader loader("myapp-plugin");
* Opie::Core::OPluginItem::List lst = loader.filtered();
* for(Opie::Core::OPluginItem::List::Iterator it = lst.begin(); it!=lst.end();++it){
* MyIface* iface = static_cast<MyIface*>(loader.load(*it,IID_MyIface));
* }
* ...
* loader.clear();
*
* \endcode
*
* @param name The name of the plugin directory.
* @param isSorted Tell the PluginLoader if your Plugins are sorted
*/
OGenericPluginLoader::OGenericPluginLoader( const QString& name, bool isSorted)
: m_dir( name ), m_autoDelete( false ), m_isSafeMode( false ),
m_isSorted( isSorted )
{
setPluginDir( QPEApplication::qpeDir() + "plugins/"+name );
readConfig();
}
/**
* \brief simple d'tor that cleans up depending on autoDelete
*
* calls clear if autoDelete is true. This will release all interfaces
* and remove the library from this process if the refcount falls to zero
*/
OGenericPluginLoader::~OGenericPluginLoader() {
if ( m_autoDelete )
clear();
}
/**
* \brief Enable or disable autoDelete on destruction
*
* enable autoDelete. This will call clear on the d'tor
*
* @see ~OGenericPluginLoader
* @see clear()
*/
void OGenericPluginLoader::setAutoDelete( bool t ) {
m_autoDelete = t;
}
/**
* \brief See if autoDelete is enabled.
*/
bool OGenericPluginLoader::autoDelete()const{
return m_autoDelete;
}
/**
* \brief unload all loaded Plugins
*
* This will unload all returned QUnknownInterfaces by load. Unload
* will be called.
*/
void OGenericPluginLoader::clear() {
QPtrDictIterator<QLibrary> it( m_library );
for ( ;it.current(); )
unload( static_cast<QUnknownInterface*>( it.currentKey() ) );
}
/**
* \brief unload the Plugin and the accompanied Resources.
*
* This will take the iface from the internal QPtrDict, Release it,
* and deref the libray used.
* The visibility depends on the QPtrDict.
* @see QPtrDict::insert
*/
void OGenericPluginLoader::unload( QUnknownInterface* iface ) {
if ( !iface )
return;
iface->release();
Internal::OPluginLibraryHolder::self()->deref( m_library.take( iface ) );
}
/**
* \brief The name of the plugins.
*
* Return the name/type you specified in the constructor.
* This is at least used by the OPluginManager to find the right config
*/
QString OGenericPluginLoader::name()const {
return m_dir;
}
/**
* \brief See if loading of a plugin segfaulted
* This tells you
* if by previous tries to load, loading crashed your application.
* If isInSafeMode you can use the GUI to configure the plugins prior to loading
*
* @return true if prior loading failed
*/
bool OGenericPluginLoader::isInSafeMode()const {
return m_isSafeMode;
}
/**
* \brief Return all Plugins found in the plugins dirs.
* Return the list of all available plugins. This will go through all plugin
* directories and search for your type of plugins ( by subdir )
*
* @param sorted Tell if you want to have the positions sorted. This only makes sense if you
*/
OPluginItem::List OGenericPluginLoader::allAvailable( bool sorted )const {
OPluginItem::List lst;
for ( QStringList::ConstIterator it = m_plugDirs.begin(); it != m_plugDirs.end(); ++it )
lst += plugins( *it, sorted, false );
if ( sorted )
qHeapSort( lst );
return lst;
}
/**
* \brief Return only the enabled plugins
* Return only activated plugins.
*
* @param sorted If the list should be sorted
*/
OPluginItem::List OGenericPluginLoader::filtered( bool sorted )const {
OPluginItem::List lst;
for ( QStringList::ConstIterator it = m_plugDirs.begin(); it != m_plugDirs.end(); ++it )
lst += plugins( *it, sorted, true );
if ( sorted )
qHeapSort( lst );
return lst;
}
/**
* \brief Load a OPluginItem for the specified interface
* This will open the resource of the OPluginItem::path() and then will query
* if the Interface specified in the uuid is available and then will manage the
* resource and Interface.
*
* @param item The OPluginItem that should be loaded
* @param uuid The Interface to query for
*
* @return Either 0 in case of failure or the Plugin as QUnknownInterface*
*/
QUnknownInterface* OGenericPluginLoader::load( const OPluginItem& item, const QUuid& uuid) {
/*
* Check if there could be a library
*/
QString pa = item.path();
if ( pa.isEmpty() )
return 0l;
/*
* See if we get a library
* return if we've none
*/
setSafeMode( pa, true );
QLibrary *lib = Internal::OPluginLibraryHolder::self()->ref( pa );
if ( !lib ) {
setSafeMode();
return 0l;
}
/**
* try to load the plugin and just in case initialize the pointer to a pointer again
*/
QUnknownInterface* iface=0;
if ( lib->queryInterface( uuid, &iface ) == QS_OK ) {
installTranslators( item.name() );
m_library.insert( iface, lib );
}else
iface = 0;
setSafeMode();
return iface;
}
/**
* @internal and reads in the safe mode
*/
void OGenericPluginLoader::readConfig() {
/* read the config for SafeMode */
OConfig conf( m_dir + "-odpplugins" );
conf.setGroup( "General" );
m_isSafeMode = conf.readBoolEntry( "SafeMode", false );
}
/**
* @internal Enter or leave SafeMode
*/
void OGenericPluginLoader::setSafeMode(const QString& str, bool b) {
OConfig conf( m_dir + "-odpplugins" );
conf.setGroup( "General" );
conf.writeEntry( "SafeMode", b );
conf.writeEntry( "CrashedPlugin", str );
}
/**
* @internal
*
- * Set the List of Plugin Dirs to lst. Currently only QPEApplication::qpeDir()+"/plugins/"+mytype
+ * Set the List of Plugin Dirs to lst. Currently only QPEApplication::qpeDir()+"plugins/"+mytype
* is used as plugin dir
*/
void OGenericPluginLoader::setPluginDirs( const QStringList& lst ) {
m_plugDirs = lst;
}
/**
*
* @internal
* Set the Plugin Dir to str. Str will be the only element in the list of plugin dirs
*/
void OGenericPluginLoader::setPluginDir( const QString& str) {
m_plugDirs.clear();
m_plugDirs.append( str );
}
/**
* @internal
*/
bool OGenericPluginLoader::isSorted()const{
return m_isSorted;
}
/*
* make libfoo.so.1.0.0 -> foo on UNIX
* make libfoo.dylib -> foo on MAC OS X Unix
* windows is obviously missing
*/
/**
* @internal
*/
QString OGenericPluginLoader::unlibify( const QString& str ) {
QString st = str.mid( str.find( "lib" )+3 );
#ifdef Q_OS_MACX
return st.left( st.findRev( ".dylib" ) );
#else
return st.left( st.findRev( ".so" ) );
#endif
}
/**
* @internal
*
* \brief method to return available plugins. Internal and for reeimplementations
*
*Return a List of Plugins for a dir and add positions and remove disabled.
* If a plugin is on the excluded list assign position -2
*
* @param _dir The dir to look in
* @param sorted Should positions be read?
* @param disabled Remove excluded from the list
*/
OPluginItem::List OGenericPluginLoader::plugins( const QString& _dir, bool sorted, bool disabled )const {
#ifdef Q_OS_MACX
QDir dir( _dir, "lib*.dylib" );
#else
QDir dir( _dir, "lib*.so" );
#endif
OPluginItem::List lst;
/*
* get excluded list and then iterate over them
* Excluded list contains the name
* Position is a list with 'name.pos.name.pos.name.pos'
*
* For the look up we will create two QMap<QString,pos>
*/
QMap<QString, int> positionMap;
QMap<QString, int> excludedMap;
OConfig cfg( m_dir+"-odpplugins" );
cfg.setGroup( _dir );
QStringList excludes = cfg.readListEntry( "Excluded", ',' );
for ( QStringList::Iterator it = excludes.begin(); it != excludes.end(); ++it )
excludedMap.insert( *it, -2 );
if ( sorted ) {
QStringList pos = cfg.readListEntry( "Positions", '.' );
QStringList::Iterator it = pos.begin();
QString tmp; int i;
while ( it != pos.end() ) {
tmp = *it++; i = (*it++).toInt();
positionMap.insert( tmp, i );
}
}
QStringList list = dir.entryList();
for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
QString str = unlibify( *it );
OPluginItem item( str, _dir + "/" + *it );
bool ex = excludedMap.contains( str );
/*
* if disabled but we should show all mark it as disabled
* else continue because we don't want to add the item
* else if sorted we assign the right position
*/
if ( ex && !disabled)
item.setEnabled( false );
else if ( ex && disabled )
continue;
else if ( sorted )
item.setPosition( positionMap[str] );
lst.append( item );
}
return lst;
}
/**
* @internal generate a list of languages from $LANG
*/
QStringList OGenericPluginLoader::languageList() {
if ( m_languages.isEmpty() ) {
/*
* be_BY.CP1251 We will add, be_BY.CP1251,be_BY,be
* to our list of languages.
* Also for de_DE@euro we will add de_DE@eurp, de_DE, de
* to our list of languages
*/
QString str = ::getenv( "LANG" );
m_languages += str;
int pos = str.find( '@' );
if( pos > 0 )
m_languages += str.left( pos );
pos = str.find( '.' );
if ( pos > 0 )
m_languages += str.left( pos );
int n_pos = str.find( '_' );
if ( n_pos > 0 )
m_languages += str.left( n_pos );
}
return m_languages;
}
/**
* @internal
* Tries to install languages using the languageList for the type
*/
void OGenericPluginLoader::installTranslators(const QString& type) {
QStringList lst = languageList();
/*
* for each language and maybe later for each language dir...
* try to load a Translator
*/
for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
QTranslator* trans = new QTranslator( qApp );
- QString tfn = QPEApplication::qpeDir()+"/i18n/" + *it + "/lib" + type + ".qm" ;
+ QString tfn = QPEApplication::qpeDir()+"i18n/" + *it + "/lib" + type + ".qm" ;
/*
* If loaded then install else clean up and don't leak
*/
if ( trans->load( tfn ) )
qApp->installTranslator( trans );
else
delete trans;
}
}
/**
* \brief Simple c'tor.
*
* Simple C'tor same as the one of the base class. Additional this
* class can cast for you if you nee it.
*
*
* @param name The name of your plugin class
* @param sorted If plugins are sorted
*
* @see OGenericPluginLoader
*/
OPluginLoader::OPluginLoader( const QString& name, bool sorted )
: OGenericPluginLoader( name, sorted )
{
}
/**
* d'tor
* @see OGenericPluginLoader::~OGenericPluginLoader
*/
OPluginLoader::~OPluginLoader() {
}
/**
* \brief C'Tor using a OGenericPluginLoader
* The C'tor. Pass your OGenericPluginLoader to manage
* OGenericPluginLoader::allAvailable plugins.
*
*
* @param loader A Pointer to your OGenericPluginLoader
*/
OPluginManager::OPluginManager( OGenericPluginLoader* loader)
: m_loader( loader ), m_isSorted( false )
{
}
/**
* \brief Overloaded c'tor using a List of Plugins and a type name
* Overloaded Constructor to work with a 'Type' of plugins
* and a correspending list of those. In this case calling load
* is a no operation.
*
* @param name The name of your plugin ('today','inputmethods','applets')
* @param lst A List with plugins of your type to manage
* @param isSorted If the List should be treated sorted
*/
OPluginManager::OPluginManager( const QString& name, const OPluginItem::List& lst, bool isSorted)
: m_loader( 0l ), m_cfgName( name ), m_plugins( lst ), m_isSorted( isSorted )
{
}
/**
* \brief A simple d'tor
*/
OPluginManager::~OPluginManager() {
}
/**
* \brief Return the OPluginItem where loading is likely to have crashed on.
* Return the Item that made the OGenericPluginLoader crash
* the returned OPluginItem could be empty if no crash occured
* which should apply most of the time. It could also be empty if the crashed
* plugin is not in the current list of available/managed plugins
*
* @see OPluginItem::isEmpty
* @return OPluginItem that crashed the loader
*/
OPluginItem OPluginManager::crashedPlugin()const {
return m_crashed;
}
/**
* \brief Return a list of plugins that are managed by this OPluginManager
*
* Return the list of managed plugins. This could either result
* from passing a OGenericPluginLoader and calling load or by
* giving name and a list of plugins.
*/
OPluginItem::List OPluginManager::managedPlugins()const {
return m_plugins;
}
/**
* \brief Set the position of the items
*
* Replace the OPluginItem with the name and path and this way
* apply the new position. The search is linear and this way O(n/2)
* You still need to call save() to make your changes effective. After saving
* a call to OGenericPluginLoader::filtered() returns the newly configured order and items
*
* @param item The OPluginItem to be replaced internall
*
*/
void OPluginManager::setPosition( const OPluginItem& item) {
replace( item );
}
/**
* \brief Enable the item specified as argument
*
* This will make sure that OPluginItem::setEnabled is called and then will replace
* the item with one that matches name and path internally.
* @see setPosition
*
* @param item the Item to enable
*/
void OPluginManager::enable( const OPluginItem& item ) {
setEnabled( item, true );
}
/**
* \brief disable the Item.
*
* Disable the OPluginItem. Same applies as in
* @see setPosition and @see enable
*
* @param item Item to disable
*/
void OPluginManager::disable( const OPluginItem& item) {
setEnabled( item, false );
}
/**
* \brief Enable or disable the OPluginItem.
* Depending on the value of the parameter this will either disable
* or enable the pluginitem.
* Beside that same as in @see disable, @see enable, @see setPosition
* applies.
*
* @param _item The OPluginItem to enable or to disable.
* @param b Enable or disable the plugin.
*
*/
void OPluginManager::setEnabled( const OPluginItem& _item, bool b ) {
OPluginItem item = _item;
item.setEnabled( b );
replace( item );
}
/**
* \brief Load necessary information after constructing the object
* If you speified a OGenericPluginLoader you need to call this method
* so that this manager knows what to manage and have a right value for \sa crashedPlugin
* For the name and the list of plugins this does only try to find out the crashed plugin
*/
void OPluginManager::load() {
OConfig cfg( configName() );
cfg.setGroup( "General" );
QString crashedPath = cfg.readEntry( "CrashedPlugin" );
/* if we've a loader this applies if we were called from the first part */
if ( m_loader )
m_plugins = m_loader->allAvailable( m_loader->isSorted() );
/* fast and normal route if we did not crash... */
if ( crashedPath.isEmpty() )
return;
/* lets try to find the plugin path and this way the associated item */
for ( OPluginItem::List::Iterator it = m_plugins.begin(); it != m_plugins.end(); ++it )
if ( (*it).path() == crashedPath ) {
m_crashed = *it;
break;
}
}
/**
* \brief Save the values and this way make it available.
*
* Save the current set of data. A call to @see OGenericPluginLoader::filtered
* now would return your saved changes.
*/
void OPluginManager::save() {
QMap<QString, QStringList> excluded; // map for path to excluded name
QMap<QString, QStringList> positions; // if positions matter contains splitted up by dirs
bool sorted = m_loader ? m_loader->isSorted() : m_isSorted;
/*
* We will create some maps for the groups to include positions a
*/
for ( OPluginItem::List::Iterator it = m_plugins.begin(); it != m_plugins.end(); ++it ) {
OPluginItem item = *it;
QString path = QFileInfo( item.path() ).dirPath(true);
if ( sorted ) {
positions[path].append( item.name() );
positions[path].append( QString::number( item.position() ) );
}
if ( !item.isEnabled() )
excluded[path].append( item.name() );
if ( !excluded.contains( path ) )
excluded[path] = QString::null;
}
/*
* The code below wouldn't work because we can't delete groups/keys from the config
* ### for ODP make Config right!
*/
// if ( excluded.isEmpty() && positions.isEmpty() ) return;
/*
* Now safe for each path
*/
OConfig cfg( configName() );
/* safe excluded items */
for ( QMap<QString, QStringList>::Iterator it = excluded.begin(); it != excluded.end(); ++it ) {
OConfigGroupSaver saver( &cfg, it.key() );
cfg.writeEntry("Excluded", it.data(), ',' );
}
/* safe positions we could also see if positions.contains(path) and remove/write in the above loop
* ### Write a Test Suite that can profile these runs...
*/
for ( QMap<QString, QStringList>::Iterator it = positions.begin(); it != positions.end(); ++it ) {
OConfigGroupSaver saver( &cfg, it.key() );
cfg.writeEntry("Positions", it.data(), '.' );
}
}
/**
* @internal
*/
QString OPluginManager::configName()const {
QString str = m_loader ? m_loader->name() : m_cfgName;
return str + "-odpplugins";
}
/**
* @internal.. replace in m_plugins by path... this is linear search O(n/2)
*/
void OPluginManager::replace( const OPluginItem& item ) {
OPluginItem _item;
/* for all plugins */
for ( OPluginItem::List::Iterator it=m_plugins.begin();it != m_plugins.end(); ++it ) {
_item = *it;
/* if path and name are the same we will remove, readd and return */
if ( _item.path() == item.path() &&
_item.name() == item.name() ) {
it = m_plugins.remove( it );
m_plugins.append( item );
return;
}
}
}
}
}
diff --git a/libopie2/opienet/omanufacturerdb.cpp b/libopie2/opienet/omanufacturerdb.cpp
index 32bae0a..7e185a2 100644
--- a/libopie2/opienet/omanufacturerdb.cpp
+++ b/libopie2/opienet/omanufacturerdb.cpp
@@ -1,143 +1,143 @@
/*
This file is part of the Opie Project
=. (C) 2003-2004 Michael 'Mickey' Lauer <mickey@Vanille.de>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. 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
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "omanufacturerdb.h"
#define OPIE_IMPROVE_GUI_LATENCY 1
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/qpeapplication.h>
#ifdef OPIE_IMPROVE_GUI_LATENCY
#include <qpe/global.h>
#endif
/* QT */
#include <qapplication.h>
#include <qfile.h>
#include <qtextstream.h>
using namespace Opie::Core;
namespace Opie {
namespace Net {
OManufacturerDB* OManufacturerDB::_instance = 0;
OManufacturerDB* OManufacturerDB::instance()
{
if ( !OManufacturerDB::_instance )
{
odebug << "OManufacturerDB::instance(): creating OManufacturerDB..." << oendl;
_instance = new OManufacturerDB();
}
return _instance;
}
OManufacturerDB::OManufacturerDB()
{
#ifdef OPIE_IMPROVE_GUI_LATENCY
Global::statusMessage( "Reading Manufacturers..." );
#endif
QString filename( "/etc/manufacturers" );
odebug << "OManufacturerDB: trying to read " << filename << oendl;
if ( !QFile::exists( filename ) )
{
- filename = QPEApplication::qpeDir()+"/etc/manufacturers";
+ filename = QPEApplication::qpeDir()+"etc/manufacturers";
odebug << "OManufacturerDB: trying to read " << filename << oendl;
if ( !QFile::exists( filename ) )
{
filename = "/usr/share/wellenreiter/manufacturers";
odebug << "OManufacturerDB: trying to read " << filename << oendl;
}
}
QFile file( filename );
bool hasFile = file.open( IO_ReadOnly );
if (!hasFile)
{
owarn << "OManufacturerDB: no valid manufacturer list found." << oendl;
}
else
{
odebug << "OManufacturerDB: found manufacturer list in " << filename << oendl;
QTextStream s( &file );
QString addr;
QString manu;
QString extManu;
#ifdef OPIE_IMPROVE_GUI_LATENCY
int counter = 0;
#endif
while (!s.atEnd())
{
s >> addr;
s >> manu;
s >> extManu;
manufacturers.insert( addr, manu );
manufacturersExt.insert( addr, extManu );
// odebug << "OmanufacturerDB: parse '" << addr << "' as '" << manu << "' (" << extManu << ")" << oendl;
#ifdef OPIE_IMPROVE_GUI_LATENCY
counter++;
if ( counter == 50 )
{
qApp->processEvents();
counter = 0;
}
#endif
}
odebug << "OManufacturerDB: manufacturer list completed." << oendl;
#ifdef OPIE_IMPROVE_GUI_LATENCY
Global::statusMessage( "Manufacturers Complete..." );
#endif
}
}
OManufacturerDB::~OManufacturerDB()
{
}
const QString& OManufacturerDB::lookup( const QString& macaddr ) const
{
return manufacturers[macaddr.upper().left(8)];
}
const QString& OManufacturerDB::lookupExt( const QString& macaddr ) const
{
QMap<QString,QString>::ConstIterator it = manufacturersExt.find( macaddr.upper().left(8) );
return it == manufacturersExt.end() ? lookup( macaddr ) : *it;
}
}
}
diff --git a/libopie2/opiesecurity/multiauthcommon.cpp b/libopie2/opiesecurity/multiauthcommon.cpp
index 9de62d2..e563193 100644
--- a/libopie2/opiesecurity/multiauthcommon.cpp
+++ b/libopie2/opiesecurity/multiauthcommon.cpp
@@ -1,195 +1,195 @@
#include "multiauthplugininterface.h"
#include "multiauthcommon.h"
/* Opie */
#include <opie2/odebug.h>
#include <opie2/oapplication.h>
/* Qt */
#include <qpe/qpeapplication.h>
#include <qpe/qlibrary.h>
#include <qpe/qcom.h>
#include <qtextview.h>
#include <qdir.h>
/* UNIX */
#include <unistd.h>
#include <qpe/config.h>
namespace Opie {
namespace Security {
SecOwnerDlg::SecOwnerDlg( QWidget *parent, const char * name, Contact c,
bool modal, bool fullscreen = FALSE )
: QDialog( parent, name, modal,
fullscreen ?
WStyle_NoBorder | WStyle_Customize | WStyle_StaysOnTop : 0 )
{
if ( fullscreen ) {
QRect desk = qApp->desktop()->geometry();
setGeometry( 0, 0, desk.width(), desk.height() );
}
// set up contents.
QString text("<H3>" + tr("Please contact the owner (directions follow), or try again clicking of this screen (and waiting for the penalty time) if you are the legitimate owner") + "</H3>");
text += c.toRichText();
tv = new QTextView(this);
tv->setText(text);
tv->viewport()->installEventFilter(this);
}
void SecOwnerDlg::resizeEvent( QResizeEvent * )
{
tv->resize( size() );
}
bool SecOwnerDlg::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QEvent::KeyPress || e->type() == QEvent::MouseButtonPress ) {
accept();
return TRUE;
}
return QWidget::eventFilter(o, e);
}
void SecOwnerDlg::mousePressEvent( QMouseEvent * ) { accept(); }
namespace Internal {
/// run plugins until we reach nbSuccessMin successes
int runPlugins() {
SecOwnerDlg *oi = 0;
// see if there is contact information.
QString vfilename = Global::applicationFileName("addressbook",
"businesscard.vcf");
if (QFile::exists(vfilename)) {
Contact c;
c = Contact::readVCard( vfilename )[0];
oi = new SecOwnerDlg(0, 0, c, TRUE, TRUE);
}
Config config("Security");
config.setGroup("Plugins");
QStringList plugins = config.readListEntry("IncludePlugins", ',');
/* if there are no configured plugins, we simply return 0 to
* let the user in:
*/
if (plugins.isEmpty() == true) {
owarn << "No authentication plugin has been configured yet!" << oendl;
odebug << "Letting the user in..." << oendl;
if(oi) delete oi;
return 0;
}
config.setGroup("Misc");
int nbSuccessMin = config.readNumEntry("nbSuccessMin", 1);
int nbSuccess = 0;
/* tries to launch successively each plugin in $OPIEDIR/plugins/security
* directory which file name is in Security.conf / [Misc] / IncludePlugins
*/
- QString path = QPEApplication::qpeDir() + "/plugins/security";
+ QString path = QPEApplication::qpeDir() + "plugins/security";
QStringList::Iterator libIt;
for ( libIt = plugins.begin(); libIt != plugins.end(); ++libIt ) {
QInterfacePtr<MultiauthPluginInterface> iface;
QLibrary *lib = new QLibrary( path + "/" + *libIt );
if ( lib->queryInterface(
IID_MultiauthPluginInterface,
(QUnknownInterface**)&iface ) == QS_OK )
{
// the plugin is a true Multiauth plugin
odebug << "Accepted plugin: " << QString( path + "/" + *libIt ) << oendl;
odebug << "Plugin name: " << iface->plugin()->pluginName() << oendl;
int resultCode;
int tries = 0;
// perform authentication
resultCode = iface->plugin()->authenticate();
// display the result in command line
QString resultMessage;
switch (resultCode)
{
case MultiauthPluginObject::Success:
resultMessage = "Success!";
nbSuccess++;
break;
case MultiauthPluginObject::Failure:
resultMessage = "Failure...";
break;
case MultiauthPluginObject::Skip:
resultMessage = "Skip";
break;
}
odebug << "Plugin result: " << resultMessage << oendl;
// if failure, wait, reperform, wait, reperform... until right
while (resultCode == MultiauthPluginObject::Failure)
{
tries++;
owarn << "This plugin has failed " << tries << " times already" << oendl;
// displays owner information, if any
if (oi)
{
oi->exec();
odebug << "Contact information displayed" << oendl;
}
/// \todo parametrize the time penalty according to \em mode (exponential,
/// linear or fixed) and \em basetime (time penalty for the first failure)
sleep(2 * tries);
if (oi)
{
oi->hide();
/** \todo fix the focus here: should go back to the current plugin widget
* but it doesn't, so we have to tap once on the widget before e.g. buttons
* are active again
*/
odebug << "Contact information hidden" << oendl;
}
// perform authentication
resultCode = iface->plugin()->authenticate();
// display the result in command line
switch (resultCode)
{
case MultiauthPluginObject::Success:
resultMessage = "Success!";
nbSuccess++;
break;
case MultiauthPluginObject::Failure:
resultMessage = "Failure...";
break;
case MultiauthPluginObject::Skip:
resultMessage = "Skip";
break;
}
odebug << "Plugin result: " << resultMessage << oendl;
}
delete lib;
if (resultCode == MultiauthPluginObject::Success && nbSuccess == nbSuccessMin)
{
if(oi) delete oi;
// we have reached the required number of successes, we can exit the plugin loop
return 0;
}
} else {
owarn << "Could not recognize plugin " << QString( path + "/" + *libIt ) << oendl;
delete lib;
} // end if plugin recognized
} //end for
if(oi) delete oi;
return 1;
}
}
}
}
diff --git a/library/fontdatabase.cpp b/library/fontdatabase.cpp
index d94e338..7934a09 100644
--- a/library/fontdatabase.cpp
+++ b/library/fontdatabase.cpp
@@ -1,251 +1,251 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include <qpe/qpeapplication.h>
#include "fontdatabase.h"
#include <qpe/qlibrary.h>
#include <qfontmanager_qws.h>
#include <qdir.h>
#include <stdio.h>
#include <stdlib.h>
static QString fontDir()
{
QString qtdir = getenv("QTDIR");
if ( qtdir.isEmpty() ) qtdir = "/usr/local/qt-embedded";
return qtdir+"/lib/fonts/";
}
#ifdef QT_NO_FONTDATABASE
static QString fontFamily( const QString& key )
{
int u0 = key.find('_');
int u1 = key.find('_',u0+1);
int u2 = key.find('_',u1+1);
QString family = key.left(u0);
//int pointSize = key.mid(u0+1,u1-u0-1).toInt();
//int weight = key.mid(u1+1,u2-u1-1).toInt();
//bool italic = key.mid(u2-1,1) == "i";
// #### ignores _t and _I fields
return family;
}
#endif
QValueList<FontFactory> *FontDatabase::factoryList = 0;
/*!
\class FontDatabase fontdatabase.h
\brief The FontDatabase class provides information about available fonts.
Most often you will simply want to query the database for the
available font families().
Use FontDatabase rather than QFontDatabase when you may need access
to fonts that are not normally available. For example, if the
freetype library and the Qtopia freetype plugin are installed,
TrueType fonts will be available to your application. Font renderer
plugins have greater resource requirements than system fonts so they
should be used only when necessary. You can force the loading of
font renderer plugins with loadRenderers().
\ingroup qtopiaemb
*/
/*!
Constructs a FontDatabase object.
*/
FontDatabase::FontDatabase()
#ifndef QT_NO_FONTDATABASE
: QFontDatabase()
#endif
{
if ( !factoryList )
loadRenderers();
}
/*!
Returns a list of names of all the available font families.
*/
QStringList FontDatabase::families() const
{
#ifndef QT_NO_FONTDATABASE
return QFontDatabase::families();
#else
#ifndef QWS
QStringList list;
return list;
#else
QStringList list;
QDict<void> familyDict;
QDiskFont *qdf;
for ( qdf=qt_fontmanager->diskfonts.first(); qdf!=0;
qdf=qt_fontmanager->diskfonts.next()) {
QString familyname = qdf->name;
if ( !familyDict.find( familyname ) ) {
familyDict.insert( familyname, (void *)1 );
list.append( familyname );
}
}
QDir dir(fontDir(),"*.qpf");
for (int i=0; i<(int)dir.count(); i++) {
QString familyname = fontFamily(dir[i]);
if ( !familyDict.find( familyname ) ) {
familyDict.insert( familyname, (void *)1 );
list.append( familyname );
}
}
return list;
#endif
#endif
}
#ifdef QT_NO_FONTDATABASE
/*!
Returns a list of standard fontsizes.
*/
QValueList<int> FontDatabase::standardSizes()
{
static int s[]={ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28,
36, 48, 72, 0 };
static bool first = TRUE;
static QValueList<int> sList;
if ( first ) {
first = FALSE;
int i = 0;
while( s[i] )
sList.append( s[i++] );
}
return sList;
}
#endif
/*!
Load any font renderer plugins that are available and make the fonts
that the plugins can read available.
*/
void FontDatabase::loadRenderers()
{
#ifndef QWS
return;
#else
#ifndef QT_NO_COMPONENT
if ( !factoryList )
factoryList = new QValueList<FontFactory>;
QValueList<FontFactory>::Iterator mit;
for ( mit = factoryList->begin(); mit != factoryList->end(); ++mit ) {
qt_fontmanager->factories.setAutoDelete( false );
qt_fontmanager->factories.removeRef( (*mit).factory );
qt_fontmanager->factories.setAutoDelete( true );
(*mit).interface->release();
(*mit).library->unload();
delete (*mit).library;
}
factoryList->clear();
- QString path = QPEApplication::qpeDir() + "/plugins/fontfactories";
+ QString path = QPEApplication::qpeDir() + "plugins/fontfactories";
#ifdef Q_OS_MACX
QDir dir( path, "lib*.dylib" );
#else
QDir dir( path, "lib*.so" );
#endif
if ( !dir.exists())
return;
QStringList list = dir.entryList();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
FontFactoryInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if ( lib->queryInterface( IID_FontFactory, (QUnknownInterface**)&iface ) == QS_OK ) {
FontFactory factory;
factory.library = lib;
factory.interface = iface;
factory.factory = factory.interface->fontFactory();
factoryList->append( factory );
qt_fontmanager->factories.append( factory.factory );
readFonts( factory.factory );
} else {
delete lib;
}
}
#endif
#endif
}
/*!
\internal
*/
void FontDatabase::readFonts( QFontFactory *factory )
{
#ifndef QWS
return;
#else
// Load in font definition file
QString fn = fontDir() + "fontdir";
FILE* fontdef=fopen(fn.local8Bit(),"r");
if(!fontdef) {
QCString temp=fn.local8Bit();
qWarning("Cannot find font definition file %s - is $QTDIR set correctly?",
temp.data());
return;
}
char buf[200]="";
char name[200]="";
char render[200]="";
char file[200]="";
char flags[200]="";
char isitalic[10]="";
fgets(buf,200,fontdef);
while(!feof(fontdef)) {
if ( buf[0] != '#' ) {
int weight=50;
int size=0;
flags[0]=0;
sscanf(buf,"%s %s %s %s %d %d %s",name,file,render,isitalic,&weight,&size,flags);
QString filename;
if ( file[0] != '/' )
filename = fontDir();
filename += file;
if ( QFile::exists(filename) ) {
if( factory->name() == render ) {
QDiskFont * qdf=new QDiskFont(factory,name,isitalic[0]=='y',
weight,size,flags,filename);
qt_fontmanager->diskfonts.append(qdf);
#if QT_VERSION >= 232
QFontDatabase::qwsAddDiskFont( qdf );
#endif
}
}
}
fgets(buf,200,fontdef);
}
fclose(fontdef);
#endif
}
diff --git a/library/network.cpp b/library/network.cpp
index f2a673c..0bbbec1 100644
--- a/library/network.cpp
+++ b/library/network.cpp
@@ -1,448 +1,448 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#define QTOPIA_INTERNAL_LANGLIST
#include <qpe/network.h>
#include <qpe/networkinterface.h>
#include <qpe/global.h>
#include <qpe/config.h>
#include <qpe/resource.h>
#include <qpe/qpeapplication.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qlibrary.h>
#include <qlistbox.h>
#include <qdir.h>
#include <qlayout.h>
#include <qdict.h>
#include <qtranslator.h>
#include <stdlib.h>
#ifndef QT_NO_COP
class NetworkEmitter : public QCopChannel {
Q_OBJECT
public:
NetworkEmitter() : QCopChannel("QPE/Network",qApp)
{
}
void receive(const QCString &msg, const QByteArray&)
{
if ( msg == "choicesChanged()" )
emit changed();
}
signals:
void changed();
};
/*!
\internal
Requests that the service \a choice be started. The \a password is
the password to use if required.
*/
void Network::start(const QString& choice, const QString& password)
{
QCopEnvelope e("QPE/Network", "start(QString,QString)");
e << choice << password;
}
/*!
\class Network network.h
\brief The Network class provides network access functionality.
\internal
*/
// copy the proxy settings of the active config over to the Proxies.conf file
/*!
\internal
*/
void Network::writeProxySettings( Config &cfg )
{
Config proxy( Network::settingsDir() + "/Proxies.conf", Config::File );
proxy.setGroup("Properties");
cfg.setGroup("Proxy");
proxy.writeEntry("type", cfg.readEntry("type") );
proxy.writeEntry("autoconfig", cfg.readEntry("autoconfig") );
proxy.writeEntry("httphost", cfg.readEntry("httphost") );
proxy.writeEntry("httpport", cfg.readEntry("httpport") );
proxy.writeEntry("ftphost", cfg.readEntry("ftphost") );
proxy.writeEntry("ftpport", cfg.readEntry("ftpport") );
proxy.writeEntry("noproxies", cfg.readEntry("noproxies") );
cfg.setGroup("Properties");
}
/*!
\internal
Stops the current network service.
*/
void Network::stop()
{
QCopEnvelope e("QPE/Network", "stop()");
}
static NetworkEmitter *emitter = 0;
/*!
\internal
*/
void Network::connectChoiceChange(QObject* receiver, const char* slot)
{
if ( !emitter )
emitter = new NetworkEmitter;
QObject::connect(emitter,SIGNAL(changed()),receiver,slot);
}
#endif // QT_NO_COP
/*!
\internal
*/
QString Network::settingsDir()
{
return Global::applicationFileName("Network", "modules");
}
#ifndef QT_NO_COP
/*!
\internal
*/
QStringList Network::choices(QListBox* lb, const QString& dir)
{
QStringList list;
if ( lb )
lb->clear();
QString adir = dir.isEmpty() ? settingsDir() : dir;
QDir settingsdir(adir);
settingsdir.mkdir(adir);
QStringList files = settingsdir.entryList("*.conf");
for (QStringList::ConstIterator it=files.begin(); it!=files.end(); ++it ) {
QString filename = settingsdir.filePath(*it);
Config cfg(filename, Config::File);
cfg.setGroup("Info");
if ( lb )
lb->insertItem(Resource::loadPixmap("Network/" + cfg.readEntry("Type")),
cfg.readEntry("Name"));
list.append(filename);
}
return list;
}
class NetworkServer : public QCopChannel {
Q_OBJECT
public:
NetworkServer(QObject* parent) : QCopChannel("QPE/Network",parent), wait(0)
{
up = FALSE;
examineNetworks( TRUE );
QCopChannel* card = new QCopChannel("QPE/Card",parent);
connect(card,SIGNAL(received(const QCString&,const QByteArray&)),
this,SLOT(cardMessage(const QCString&,const QByteArray&)));
}
~NetworkServer()
{
stop();
}
bool networkOnline() const
{
return up;
}
private:
void receive(const QCString &msg, const QByteArray& data)
{
if ( msg == "start(QString,QString)" ) {
QDataStream stream(data,IO_ReadOnly);
QString file,password;
stream >> file >> password;
if ( file.isEmpty() ) {
QStringList l = Network::choices();
for (QStringList::ConstIterator i=l.begin(); i!=l.end(); ++i) {
Config cfg(*i,Config::File);
cfg.setGroup("Info");
QString type = cfg.readEntry("Type");
NetworkInterface* plugin = Network::loadPlugin(type);
cfg.setGroup("Properties");
if ( plugin && plugin->isAvailable(cfg) ) {
file = *i;
break;
}
}
if ( file.isEmpty() ) {
QCopEnvelope("QPE/Network", "failed()");
return;
}
}
start(file,password);
} else if ( msg == "stop()" ) {
stop();
} else if ( msg == "choicesChanged()" ) {
examineNetworks();
}
}
private slots:
void cardMessage(const QCString &msg, const QByteArray&)
{
if ( msg == "stabChanged()" )
examineNetworks();
}
private:
void examineNetworks( bool firstStart = FALSE )
{
QStringList l = Network::choices();
bool wasup = up; up=FALSE;
QStringList pavailable = available;
available.clear();
for (QStringList::ConstIterator it=l.begin(); it!=l.end(); ++it) {
Config cfg(*it,Config::File);
cfg.setGroup("Info");
QString type = cfg.readEntry("Type");
NetworkInterface* plugin = Network::loadPlugin(type);
cfg.setGroup("Properties");
if ( plugin ) {
if ( plugin->isActive(cfg) ) {
up = TRUE;
if ( firstStart )
plugin->start( cfg );
}
if ( plugin->isAvailable(cfg) )
available.append(*it);
}
}
// Try to work around unreproducible bug whereby
// the netmon applet shows wrong state.
bool reannounce = wait<0;
if ( available != pavailable || reannounce ) {
QCopEnvelope e("QPE/Network", "available(QStringList)");
e << available;
}
if ( up != wasup || reannounce ) {
QCopEnvelope("QPE/Network", up ? "up()" : "down()");
}
}
void start( const QString& file, const QString& password )
{
if ( !current.isEmpty() )
stop();
current = QString::null;
Config cfg(file, Config::File);
cfg.setGroup("Info");
QString type = cfg.readEntry("Type");
NetworkInterface* plugin = Network::loadPlugin(type);
bool started = FALSE;
if ( plugin ) {
cfg.setGroup("Properties");
if ( plugin->start(cfg,password) ) {
Network::writeProxySettings( cfg );
current = file;
wait=0;
startTimer(400);
started = TRUE;
}
}
if ( !started ) {
QCopEnvelope("QPE/Network", "failed()");
}
}
void stop()
{
bool stopped = FALSE;
if ( !current.isEmpty() ) {
Config cfg(current, Config::File);
cfg.setGroup("Info");
QString type = cfg.readEntry("Type");
NetworkInterface* plugin = Network::loadPlugin(type);
if ( plugin ) {
cfg.setGroup("Properties");
if ( plugin->stop(cfg) ) {
current = QString::null;
wait=0;
startTimer(400);
stopped = TRUE;
}
}
}
if ( !stopped ) {
QCopEnvelope("QPE/Network", "failed()");
}
}
void timerEvent(QTimerEvent*)
{
examineNetworks();
if ( wait >= 0 ) {
if ( up == !current.isNull() ) {
// done
killTimers();
if ( up ) {
startTimer(3000); // monitor link
wait = -1;
}
} else {
wait++;
if ( wait == 600 ) {
killTimers(); // forget about it after 240 s
QCopEnvelope("QPE/Network", "failed()");
up = !current.isNull();
}
}
} else if ( !up ) {
killTimers();
}
}
private:
QStringList available;
QString current;
bool up;
int wait;
};
static NetworkServer* ns=0;
/*!
\internal
*/
QString Network::serviceName(const QString& service)
{
Config cfg(service, Config::File);
cfg.setGroup("Info");
return cfg.readEntry("Name");
}
/*!
\internal
*/
QString Network::serviceType(const QString& service)
{
Config cfg(service, Config::File);
cfg.setGroup("Info");
return cfg.readEntry("Type");
}
/*!
\internal
*/
bool Network::serviceNeedsPassword(const QString& service)
{
Config cfg(service,Config::File);
cfg.setGroup("Info");
QString type = cfg.readEntry("Type");
NetworkInterface* plugin = Network::loadPlugin(type);
cfg.setGroup("Properties");
return plugin ? plugin->needPassword(cfg) : FALSE;
}
/*!
\internal
*/
bool Network::networkOnline()
{
return ns && ns->networkOnline();
}
/*!
\internal
*/
void Network::createServer(QObject* parent)
{
ns = new NetworkServer(parent);
}
/*!
\internal
*/
int Network::addStateWidgets(QWidget* parent)
{
int n=0;
QStringList l = Network::choices();
QVBoxLayout* vb = new QVBoxLayout(parent);
for (QStringList::ConstIterator it=l.begin(); it!=l.end(); ++it) {
Config cfg(*it,Config::File);
cfg.setGroup("Info");
QString type = cfg.readEntry("Type");
NetworkInterface* plugin = Network::loadPlugin(type);
cfg.setGroup("Properties");
if ( plugin ) {
QWidget* w;
if ( (w=plugin->addStateWidget(parent,cfg)) ) {
n++;
vb->addWidget(w);
}
}
}
return n;
}
static QDict<NetworkInterface> *ifaces;
/*!
\internal
*/
NetworkInterface* Network::loadPlugin(const QString& type)
{
#ifndef QT_NO_COMPONENT
if ( !ifaces ) ifaces = new QDict<NetworkInterface>;
NetworkInterface *iface = ifaces->find(type);
if ( !iface ) {
#ifdef Q_OS_MACX
- QString libfile = QPEApplication::qpeDir() + "/plugins/network/lib" + type + ".dylib";
+ QString libfile = QPEApplication::qpeDir() + "plugins/network/lib" + type + ".dylib";
#else
- QString libfile = QPEApplication::qpeDir() + "/plugins/network/lib" + type + ".so";
+ QString libfile = QPEApplication::qpeDir() + "plugins/network/lib" + type + ".so";
#endif
QLibrary lib(libfile);
if ( !lib.queryInterface( IID_Network, (QUnknownInterface**)&iface ) == QS_OK )
return 0;
ifaces->insert(type,iface);
QStringList langs = Global::languageList();
for (QStringList::ConstIterator it = langs.begin(); it!=langs.end(); ++it) {
QString lang = *it;
QTranslator * trans = new QTranslator(qApp);
- QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/lib"+type+".qm";
+ QString tfn = QPEApplication::qpeDir()+"i18n/"+lang+"/lib"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
}
}
return iface;
#else
return 0;
#endif
}
#include "network.moc"
#endif // QT_NO_COP
diff --git a/library/qpedecoration_qws.cpp b/library/qpedecoration_qws.cpp
index 7842ebd..8b02de6 100644
--- a/library/qpedecoration_qws.cpp
+++ b/library/qpedecoration_qws.cpp
@@ -1,967 +1,967 @@
/**********************************************************************
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifdef QWS
#define QTOPIA_INTERNAL_LANGLIST
#include <qapplication.h>
#include <qstyle.h>
#include <qwidget.h>
#include <qpainter.h>
#include <qtimer.h>
#include <qwhatsthis.h>
#include <qpopupmenu.h>
#include "qcopenvelope_qws.h"
#include "qpedecoration_qws.h"
#include <qdialog.h>
#include <qdrawutil.h>
#include <qgfx_qws.h>
#include "qpeapplication.h"
#include "resource.h"
#include "global.h"
#include "qlibrary.h"
#include "windowdecorationinterface.h"
#include <qpe/qlibrary.h>
#include <qfile.h>
#include <qsignal.h>
#include <stdlib.h>
extern Q_EXPORT QRect qt_maxWindowRect;
#define WHATSTHIS_MODE
#ifndef QT_NO_QWS_QPE_WM_STYLE
#ifndef QT_NO_IMAGEIO_XPM
/* XPM */
static const char * const qpe_close_xpm[] = {
"16 16 3 1",
" c None",
". c #FFFFFF",
"+ c #000000",
" ",
" ",
" ..... ",
" ..+++++.. ",
" .+++++++++. ",
" .+..+++..+. ",
" .++...+...++. ",
" .+++.....+++. ",
" .++++...++++. ",
" .+++.....+++. ",
" .++...+...++. ",
" .+..+++..+. ",
" .+++++++++. ",
" ..+++++.. ",
" ..... ",
" "};
/* XPM */
static const char * const qpe_accept_xpm[] = {
"16 16 3 1",
" c None",
". c #FFFFFF",
"+ c #000000",
" ",
" ",
" ..... ",
" ..+++++.. ",
" .+++++++++. ",
" .+++++++++. ",
" .+++++++..++. ",
" .++.+++...++. ",
" .+...+...+++. ",
" .+......++++. ",
" .++....+++++. ",
" .++..+++++. ",
" .+++++++++. ",
" ..+++++.. ",
" ..... ",
" "};
#endif // QT_NO_IMAGEIO_XPM
class DecorHackWidget : public QWidget
{
public:
bool needsOk() {
return (getWState() & WState_Reserved1 ) ||
(inherits("QDialog") && !inherits("QMessageBox")
&& !inherits("QWizard") );
}
};
static QImage scaleButton( const QImage &img, int height )
{
if ( img.height() != 0 && img.height() != height ) {
return img.smoothScale( img.width()*height/img.height(), height );
} else {
return img;
}
}
class TLWidget : public QWidget
{
public:
QWSManager *manager()
{
return topData()->qwsManager;
}
QTLWExtra *topExtra()
{
return topData();
}
void setWState( uint s ) { QWidget::setWState( s ); }
void clearWState( uint s ) { QWidget::clearWState( s ); }
};
QPEManager::QPEManager( QPEDecoration *d, QObject *parent )
: QObject( parent ), decoration( d ), helpState(0), inWhatsThis(FALSE)
{
wtTimer = new QTimer( this );
connect( wtTimer, SIGNAL(timeout()), this, SLOT(whatsThisTimeout()) );
}
void QPEManager::updateActive()
{
QWidget *newActive = qApp->activeWindow();
if ( newActive && (QWidget*)active == newActive )
return;
if ( active && (!newActive || ((TLWidget *)newActive)->manager()) ) {
((TLWidget *)(QWidget*)active)->manager()->removeEventFilter( this );
}
if ( newActive && ((TLWidget *)newActive)->manager() ) {
active = newActive;
((TLWidget *)(QWidget*)active)->manager()->installEventFilter( this );
} else if ( !newActive ) {
active = 0;
}
}
int QPEManager::pointInQpeRegion( QWidget *w, const QPoint &p )
{
QRect rect(w->geometry());
if ( decoration->region( w, rect,
(QWSDecoration::Region)QPEDecoration::Help ).contains(p) )
return QPEDecoration::Help;
for (int i = QWSDecoration::LastRegion; i >= QWSDecoration::Title; i--) {
if (decoration->region(w, rect, (QWSDecoration::Region)i).contains(p))
return (QWSDecoration::Region)i;
}
return QWSDecoration::None;
}
bool QPEManager::eventFilter( QObject *o, QEvent *e )
{
QWSManager *mgr = (QWSManager *)o;
QWidget *w = mgr->widget();
switch ( e->type() ) {
case QEvent::MouseButtonPress:
{
pressTime = QTime::currentTime();
QPoint p = ((QMouseEvent*)e)->globalPos();
int inRegion = pointInQpeRegion( w, p );
#ifdef WHATSTHIS_MODE
if ( !w->geometry().contains(p) && QWhatsThis::inWhatsThisMode() ) {
QString text;
switch ( inRegion ) {
case QWSDecoration::Close:
if ( ((DecorHackWidget*)w)->needsOk() )
text = tr("Click to close this window, discarding changes.");
else
text = tr("Click to close this window.");
break;
case QWSDecoration::Minimize:
text = tr("Click to close this window and apply changes.");
break;
case QWSDecoration::Maximize:
if ( w->isMaximized() )
text = tr("Click to make this window movable.");
else
text = tr("Click to make this window use all available screen area.");
break;
default:
break;
}
QWhatsThis::leaveWhatsThisMode( text );
whatsThisTimeout();
helpState = 0;
return true;
}
#endif
if ( inRegion == QPEDecoration::Help ) {
#ifdef WHATSTHIS_MODE
wtTimer->start( 400, TRUE );
#endif
helpState = QWSButton::Clicked|QWSButton::MouseOver;
drawButton( w, QPEDecoration::Help, helpState );
return true;
}
}
break;
case QEvent::MouseButtonRelease:
if ( helpState & QWSButton::Clicked ) {
wtTimer->stop();
helpState = 0;
drawButton( w, QPEDecoration::Help, helpState );
QPoint p = ((QMouseEvent*)e)->globalPos();
if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) {
decoration->help( w );
}
return true;
}
break;
case QEvent::MouseMove:
if ( helpState & QWSButton::Clicked ) {
int oldState = helpState;
QPoint p = ((QMouseEvent*)e)->globalPos();
if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) {
helpState = QWSButton::Clicked|QWSButton::MouseOver;
} else {
helpState = 0;
}
if ( helpState != oldState )
drawButton( w, QPEDecoration::Help, helpState );
}
break;
default:
break;
}
return QObject::eventFilter( o, e );
}
void QPEManager::drawButton( QWidget *w, QPEDecoration::QPERegion r, int state )
{
QPainter painter(w);
QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region;
painter.internalGfx()->setWidgetDeviceRegion( rgn );
painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All));
decoration->paintButton( &painter, w, (QWSDecoration::Region)r, state );
}
void QPEManager::drawTitle( QWidget *w )
{
QPainter painter(w);
QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region;
painter.internalGfx()->setWidgetDeviceRegion( rgn );
painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All));
decoration->paint( &painter, w );
decoration->paintButton(&painter, w, QWSDecoration::Menu, 0);
decoration->paintButton(&painter, w, QWSDecoration::Close, 0);
decoration->paintButton(&painter, w, QWSDecoration::Minimize, 0);
decoration->paintButton(&painter, w, QWSDecoration::Maximize, 0);
}
void QPEManager::whatsThisTimeout()
{
if ( !QWhatsThis::inWhatsThisMode() ) {
if ( inWhatsThis ) {
if ( whatsThis ) {
QWidget *w = whatsThis;
whatsThis = 0;
drawTitle( w );
}
wtTimer->stop();
} else {
QWhatsThis::enterWhatsThisMode();
helpState = 0;
updateActive();
if ( active ) {
whatsThis = active;
drawTitle( active );
// check periodically to see if we've left whats this mode
wtTimer->start( 250 );
}
}
inWhatsThis = !inWhatsThis;
}
}
//===========================================================================
static QImage *okImage( int th )
{
static QImage *i = 0;
if ( !i || i->height() != th ) {
delete i;
i = new QImage(scaleButton(Resource::loadImage("OKButton"),th));
}
return i;
}
static QImage *closeImage( int th )
{
static QImage *i = 0;
if ( !i || i->height() != th ) {
delete i;
i = new QImage(scaleButton(Resource::loadImage("CloseButton"),th));
}
return i;
}
static QImage *helpImage( int th )
{
static QImage *i = 0;
if ( !i || i->height() != th ) {
delete i;
i = new QImage(scaleButton(Resource::loadImage("HelpButton"),th));
}
return i;
}
static QImage *maximizeImage( int th )
{
static QImage *i = 0;
if ( !i || i->height() != th ) {
delete i;
i = new QImage(scaleButton(Resource::loadImage("MaximizeButton"),th));
}
return i;
}
int WindowDecorationInterface::metric( Metric m, const WindowData *wd ) const
{
switch ( m ) {
case TitleHeight:
if ( QApplication::desktop()->height() > 320 )
return 19;
else
return 15;
case LeftBorder:
case RightBorder:
case TopBorder:
case BottomBorder:
return 4;
case OKWidth:
return okImage(metric(TitleHeight,wd))->width();
case CloseWidth:
return closeImage(metric(TitleHeight,wd))->width();
case HelpWidth:
return helpImage(metric(TitleHeight,wd))->width();
case MaximizeWidth:
return maximizeImage(metric(TitleHeight,wd))->width();
case CornerGrabSize:
return 16;
}
return 0;
}
void WindowDecorationInterface::drawArea( Area a, QPainter *p, const WindowData *wd ) const
{
int th = metric( TitleHeight, wd );
QRect r = wd->rect;
switch ( a ) {
case Border:
{
const QColorGroup &cg = wd->palette.active();
qDrawWinPanel(p, r.x()-metric(LeftBorder,wd),
r.y()-th-metric(TopBorder,wd),
r.width()+metric(LeftBorder,wd)+metric(RightBorder,wd),
r.height()+th+metric(TopBorder,wd)+metric(BottomBorder,wd),
cg, FALSE, &cg.brush(QColorGroup::Background));
}
break;
case Title:
{
const QColorGroup &cg = wd->palette.active();
QBrush titleBrush;
QPen titleLines;
if ( wd->flags & WindowData::Active ) {
titleBrush = cg.brush(QColorGroup::Highlight);
titleLines = titleBrush.color().dark();
} else {
titleBrush = cg.brush(QColorGroup::Background);
titleLines = titleBrush.color();
}
p->fillRect( r.x(), r.y()-th, r.width(), th, titleBrush);
p->setPen( titleLines );
for ( int i = r.y()-th; i < r.y(); i += 2 )
p->drawLine( r.left(), i, r.right(), i );
}
break;
case TitleText:
p->drawText( r.x()+3+metric(HelpWidth,wd), r.top()-th,
r.width()-metric(OKWidth,wd)-metric(CloseWidth,wd),
th, QPainter::AlignVCenter, wd->caption);
break;
}
}
void WindowDecorationInterface::drawButton( Button b, QPainter *p, const WindowData *wd, int x, int y, int, int, QWSButton::State state ) const
{
QImage *img = 0;
switch ( b ) {
case OK:
img = okImage(metric(TitleHeight,wd));
break;
case Close:
img = closeImage(metric(TitleHeight,wd));
break;
case Help:
img = helpImage(metric(TitleHeight,wd));
break;
case Maximize:
img = maximizeImage(metric(TitleHeight,wd));
break;
}
if ( img ) {
if ((state & QWSButton::MouseOver) && (state & QWSButton::Clicked))
p->drawImage(x+2, y+2, *img);
else
p->drawImage(x+1, y+1, *img);
}
}
QRegion WindowDecorationInterface::mask( const WindowData *wd ) const
{
int th = metric(TitleHeight,wd);
QRect rect( wd->rect );
QRect r(rect.left() - metric(LeftBorder,wd),
rect.top() - th - metric(TopBorder,wd),
rect.width() + metric(LeftBorder,wd) + metric(RightBorder,wd),
rect.height() + th + metric(TopBorder,wd) + metric(BottomBorder,wd));
return QRegion(r) - rect;
}
class DefaultWindowDecoration : public WindowDecorationInterface
{
public:
DefaultWindowDecoration(){}
QString name() const {
return qApp->translate("WindowDecoration", "Default",
"List box text for default window decoration");
}
QPixmap icon() const {
return QPixmap();
}
QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {
*iface = 0;
if ( uuid == IID_QUnknown )
*iface = this;
else if ( uuid == IID_WindowDecoration )
*iface = this;
else
return QS_FALSE;
if ( *iface )
(*iface)->addRef();
return QS_OK;
}
Q_REFCOUNT
};
static WindowDecorationInterface *wdiface = 0;
static QLibrary* wdlib = 0;
static QString libname;
//===========================================================================
bool QPEDecoration::helpExists() const
{
if ( helpFile.isNull() ) {
QStringList helpPath = Global::helpPath();
QString hf = QString(qApp->argv()[0]) + ".html";
bool he = FALSE;
for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !he; ++it)
he = QFile::exists( *it + "/" + hf );
((QPEDecoration*)this)->helpFile = hf;
((QPEDecoration*)this)->helpexists = he;
return he;
}
return helpexists;
}
QPEDecoration::QPEDecoration()
: QWSDefaultDecoration()
{
if ( wdlib ) {
delete wdlib;
wdlib = 0;
} else {
delete wdiface;
}
wdiface = new DefaultWindowDecoration;
helpexists = FALSE; // We don't know (flagged by helpFile being null)
qpeManager = new QPEManager( this );
imageOk = Resource::loadImage( "OKButton" );
imageClose = Resource::loadImage( "CloseButton" );
imageHelp = Resource::loadImage( "HelpButton" );
}
QPEDecoration::QPEDecoration( const QString &plugin )
: QWSDefaultDecoration()
{
libname = plugin;
if ( wdlib ) {
wdiface->release();
wdlib->unload();
delete wdlib;
wdlib = 0;
} else {
delete wdiface;
}
WindowDecorationInterface *iface = 0;
- QString path = QPEApplication::qpeDir() + "/plugins/decorations/";
+ QString path = QPEApplication::qpeDir() + "plugins/decorations/";
#ifdef Q_OS_MACX
if ( plugin.find( ".dylib" ) > 0 ) {
#else
if ( plugin.find( ".so" ) > 0 ) {
#endif
// full library name supplied
path += plugin;
} else {
#ifdef Q_OS_MACX
path += "lib" + plugin.lower() + ".dylib"; // compatibility
#else
path += "lib" + plugin.lower() + ".so"; // compatibility
#endif
}
QLibrary *lib = new QLibrary( path );
if ( lib->queryInterface( IID_WindowDecoration, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
wdiface = iface;
wdlib = lib;
} else {
delete lib;
wdiface = new DefaultWindowDecoration;
}
helpexists = FALSE; // We don't know (flagged by helpFile being null)
qpeManager = new QPEManager( this );
}
QPEDecoration::~QPEDecoration()
{
delete qpeManager;
}
const char **QPEDecoration::menuPixmap()
{
return (const char **)0;
}
const char **QPEDecoration::closePixmap()
{
return (const char **)qpe_close_xpm;
}
const char **QPEDecoration::minimizePixmap()
{
return (const char **)qpe_accept_xpm;
}
const char **QPEDecoration::maximizePixmap()
{
return (const char **)0;
}
const char **QPEDecoration::normalizePixmap()
{
return (const char **)0;
}
int QPEDecoration::getTitleHeight( const QWidget *w )
{
WindowDecorationInterface::WindowData wd;
windowData( w, wd );
return wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
}
/*
If rect is empty, no frame is added. (a hack, really)
*/
QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecoration::Region type)
{
qpeManager->updateActive();
WindowDecorationInterface::WindowData wd;
windowData( widget, wd );
wd.rect = rect;
int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
int okWidth = wdiface->metric(WindowDecorationInterface::OKWidth,&wd);
int closeWidth = wdiface->metric(WindowDecorationInterface::CloseWidth,&wd);
int helpWidth = wdiface->metric(WindowDecorationInterface::HelpWidth,&wd);
int grab = wdiface->metric(WindowDecorationInterface::CornerGrabSize,&wd);
QRegion region;
switch ((int)type) {
case Menu:
break;
case Maximize:
if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) {
int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd);
int left = rect.right() - maximizeWidth - closeWidth;
if ( ((DecorHackWidget *)widget)->needsOk() )
left -= okWidth;
QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
region = r;
}
break;
case Minimize:
if ( ((DecorHackWidget *)widget)->needsOk() ) {
QRect r(rect.right() - okWidth,
rect.top() - titleHeight, okWidth, titleHeight);
if (r.left() > rect.left() + titleHeight)
region = r;
}
break;
case Close:
{
int left = rect.right() - closeWidth;
if ( ((DecorHackWidget *)widget)->needsOk() )
left -= okWidth;
QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight);
region = r;
}
break;
case Title:
if ( !widget->isMaximized() ) {
int width = rect.width() - helpWidth - closeWidth;
if ( ((DecorHackWidget *)widget)->needsOk() )
width -= okWidth;
QRect r(rect.left()+helpWidth, rect.top() - titleHeight,
width, titleHeight);
if (r.width() > 0)
region = r;
}
break;
case Help:
if ( helpExists() || widget->testWFlags(Qt::WStyle_ContextHelp) ) {
QRect r(rect.left(), rect.top() - titleHeight,
helpWidth, titleHeight);
region = r;
}
break;
case Top:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
region = m & QRect( br.left()+grab, br.top(),
br.width()-2*grab, b );
}
break;
case Left:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd);
region = m & QRect( br.left(), br.top()+grab,
b, br.height()-2*grab );
}
break;
case Right:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::RightBorder,&wd);
region = m & QRect( rect.right(), br.top()+grab,
b, br.height()-2*grab );
}
break;
case Bottom:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int b = wdiface->metric(WindowDecorationInterface::BottomBorder,&wd);
region = m & QRect( br.left()+grab, rect.bottom(),
br.width()-2*grab, b );
}
break;
case TopLeft:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
int lb = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd);
QRegion crgn( br.left(), br.top(), grab, tb );
crgn |= QRect( br.left(), br.top(), lb, grab );
region = m & crgn;
}
break;
case TopRight:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd);
int rb = wdiface->metric(WindowDecorationInterface::RightBorder,&wd);
QRegion crgn( br.right()-grab, br.top(), grab, tb );
crgn |= QRect( br.right()-rb, br.top(), rb, grab );
region = m & crgn;
}
break;
case BottomLeft:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
region = m & QRect( br.left(), br.bottom()-grab, grab, grab );
}
break;
case BottomRight:
if ( !widget->isMaximized() ) {
QRegion m = wdiface->mask(&wd);
QRect br = m.boundingRect();
region = m & QRect( br.right()-grab, br.bottom()-grab, grab, grab );
}
break;
case All:
if ( widget->isMaximized() )
region = QWSDefaultDecoration::region(widget, rect, type);
else
region = wdiface->mask(&wd) - rect;
break;
default:
region = QWSDefaultDecoration::region(widget, rect, type);
break;
}
return region;
}
void QPEDecoration::paint(QPainter *painter, const QWidget *widget)
{
WindowDecorationInterface::WindowData wd;
windowData( widget, wd );
int titleWidth = getTitleWidth(widget);
int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
QRect rect(widget->rect());
// title bar rect
QRect tbr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );
#ifndef QT_NO_PALETTE
QRegion oldClip = painter->clipRegion();
painter->setClipRegion( oldClip - QRegion( tbr ) ); // reduce flicker
wdiface->drawArea( WindowDecorationInterface::Border, painter, &wd );
painter->setClipRegion( oldClip );
if (titleWidth > 0) {
const QColorGroup &cg = widget->palette().active();
QBrush titleBrush;
QPen titlePen;
if ( wd.flags & WindowDecorationInterface::WindowData::Active ) {
titleBrush = cg.brush(QColorGroup::Highlight);
titlePen = cg.color(QColorGroup::HighlightedText);
} else {
titleBrush = cg.brush(QColorGroup::Background);
titlePen = cg.color(QColorGroup::Text);
}
wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd );
// Draw caption
painter->setPen(titlePen);
QFont f( QApplication::font() );
f.setWeight( QFont::Bold );
painter->setFont(f);
wdiface->drawArea( WindowDecorationInterface::TitleText, painter, &wd );
}
#endif //QT_NO_PALETTE
paintButton( painter, widget, (QWSDecoration::Region)Help, 0 );
}
void QPEDecoration::paintButton(QPainter *painter, const QWidget *w,
QWSDecoration::Region type, int state)
{
WindowDecorationInterface::Button b;
switch ((int)type) {
case Close:
b = WindowDecorationInterface::Close;
break;
case Minimize:
if ( ((DecorHackWidget *)w)->needsOk() )
b = WindowDecorationInterface::OK;
else if ( helpExists() )
b = WindowDecorationInterface::Help;
else
return;
break;
case Help:
b = WindowDecorationInterface::Help;
break;
case Maximize:
b = WindowDecorationInterface::Maximize;
break;
default:
return;
}
WindowDecorationInterface::WindowData wd;
windowData( w, wd );
int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);
QRect rect(w->rect());
QRect tbr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );
QRect brect(region(w, w->rect(), type).boundingRect());
const QColorGroup &cg = w->palette().active();
if ( wd.flags & WindowDecorationInterface::WindowData::Active )
painter->setPen( cg.color(QColorGroup::HighlightedText) );
else
painter->setPen( cg.color(QColorGroup::Text) );
QRegion oldClip = painter->clipRegion();
painter->setClipRegion( QRect(brect.x(), tbr.y(), brect.width(), tbr.height()) ); // reduce flicker
wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd );
wdiface->drawButton( b, painter, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)state );
painter->setClipRegion( oldClip );
}
//#define QPE_DONT_SHOW_TITLEBAR
void QPEDecoration::maximize( QWidget *widget )
{
#ifdef QPE_DONT_SHOW_TITLEBAR
if ( !widget->inherits( "QDialog" ) ) {
widget->setGeometry( qt_maxWindowRect );
} else
#endif
{
QWSDecoration::maximize( widget );
}
}
QPopupMenu *QPEDecoration::menu( const QWidget *, const QPoint & )
{
QPopupMenu *m = new QPopupMenu();
m->insertItem(QPEManager::tr("Restore"), (int)Normalize);
m->insertItem(QPEManager::tr("Move"), (int)Title);
m->insertItem(QPEManager::tr("Size"), (int)BottomRight);
m->insertItem(QPEManager::tr("Maximize"), (int)Maximize);
m->insertSeparator();
m->insertItem(QPEManager::tr("Close"), (int)Close);
return m;
}
#ifndef QT_NO_DIALOG
class HackDialog : public QDialog
{
public:
void acceptIt() {
if ( isA( "QMessageBox" ) )
qApp->postEvent( this, new QKeyEvent( QEvent::KeyPress, Key_Enter, '\n', 0, "\n" ) );
else
accept();
}
};
#endif
void QPEDecoration::minimize( QWidget *widget )
{
#ifndef QT_NO_DIALOG
// We use the minimize button as an "accept" button.
if ( widget->inherits( "QDialog" ) ) {
HackDialog *d = (HackDialog *)widget;
d->acceptIt();
}
#endif
else if ( ((DecorHackWidget *)widget)->needsOk() ) {
QSignal s;
s.connect( widget, SLOT( accept() ) );
s.activate();
} else {
help( widget );
}
}
void QPEDecoration::help( QWidget *w )
{
if ( helpExists() ) {
QString hf = helpFile;
QString localHelpFile = QString(qApp->argv()[0]) + "-" + w->name() + ".html";
QStringList helpPath = Global::helpPath();
for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end(); ++it) {
if ( QFile::exists( *it + "/" + localHelpFile ) ) {
hf = localHelpFile;
break;
}
}
Global::execute( "helpbrowser", hf );
} else if ( w && w->testWFlags(Qt::WStyle_ContextHelp) ) {
QWhatsThis::enterWhatsThisMode();
QWhatsThis::leaveWhatsThisMode( QObject::tr(
"<Qt>Comprehensive help is not available for this application, "
"however there is context-sensitive help.<p>To use context-sensitive help:<p>"
"<ol><li>click and hold the help button."
"<li>when the title bar shows <b>What's this...</b>, "
"click on any control.</ol></Qt>" ) );
}
}
void QPEDecoration::windowData( const QWidget *w, WindowDecorationInterface::WindowData &wd ) const
{
wd.rect = w->rect();
if ( qpeManager->whatsThisWidget() == w )
wd.caption = QObject::tr( "What's this..." );
else
wd.caption = w->caption();
wd.palette = qApp->palette();
wd.flags = 0;
wd.flags |= w->isMaximized() ? WindowDecorationInterface::WindowData::Maximized : 0;
wd.flags |= w->testWFlags(Qt::WStyle_Dialog) ? WindowDecorationInterface::WindowData::Dialog : 0;
const QWidget *active = qpeManager->activeWidget();
wd.flags |= w == active ? WindowDecorationInterface::WindowData::Active : 0;
wd.reserved = 1;
}
/*
#ifndef QT_NO_POPUPMENU
QPopupMenu *QPEDecoration::menu(QWSManager*, const QWidget*, const QPoint&)
{
return 0;
}
#endif
*/
#endif // QT_NO_QWS_QPE_WM_STYLE
#endif
diff --git a/libslcompat/slmisc.h b/libslcompat/slmisc.h
index 20ba988..442b098 100644
--- a/libslcompat/slmisc.h
+++ b/libslcompat/slmisc.h
@@ -1,135 +1,135 @@
/*
* Copyright (C) 2002 SHARP CORPORATION All rights reserved.
*/
#ifndef _SLMISC_H_INCLUDED
#define _SLMISC_H_INCLUDED
#include <qpe/qpeapplication.h>
#include <qfileinfo.h>
#include <qpe/global.h>
#include <qmessagebox.h>
#define _SLPOWER
class QPopupMenu;
class QListView;
#if !defined(_SLPOWER)
class PowerStatus;
#else
class SlPowerStatus;
#endif
class Config;
typedef ulong SlResolutionScale;
class SlMisc {
public:
static bool isExecutable(const QString &c) {
- QFileInfo exec(QPEApplication::qpeDir() + "/bin/" + c);
+ QFileInfo exec(QPEApplication::qpeDir() + "bin/" + c);
return exec.isExecutable();
};
static ulong availableMemory();
static bool invalidFileName(QString &fName);
static QString getValidFileName(const QString &baseName);
static QString getCanonicalPath(const QString &fName);
static void enableAutoPowerOff(bool isOn);
static void enableAutoPowerOff(bool isOn,bool DimAlso,bool ScreenSaverAlso=FALSE);
static void enableLockApplication(bool);
static bool isTheSmbShareFileHasWriteEntry(const QString &shareFName);
static bool isTheSmbShareFileNowCopy(const QString &shareFName);
static bool checkTheSmbShareFileMode(const QString &shareFName,
char modeMask, char checkMode, bool equality);
static bool isTheFileLockedBySmbd(const QString &fName);
static bool isSambaForked();
static void startSamba();
static void stopSamba();
enum ListType { Pid, CmdLine, Both };
static QStringList procList (const QRegExp& re, uint max = 0, enum ListType type = Pid);
static void dumpMemInfo(bool isShowHeap);
static bool canCreateTheFile(const QString&);
static QString getLanguage();
static QSize getMaximizedWidgetInfo();
static QSize SlMisc::getScrollbarMetrics();
static int getDpi();
static SlResolutionScale getResolutionScale();
static int getMaximizedWidgetContentsWidth();
static bool isLandscape();
static void requestCloseFile(const QString&);
static void requestOpenFile(const QString&);
static void insertStandardFontMenu(QPopupMenu *pm);
static void insertAllFontMenu(QPopupMenu *pm);
static int getLogicalSizeFromMenuId(int id);
static void setFontSizeItemChecked(QPopupMenu *pm,int logicalSize);
static int getFontPointSize(int logicalSize);
static void toggleFontSize(QPopupMenu *pm,int &logicalSize,bool isLarge=true);
static void toggleAllFontSize(QPopupMenu *pm,int *fontSize,bool isLarge=true);
static void SlFontArrange (QWidget* widget);
static void SlLayoutSpaceArrange (QObject* object);
static bool checkBatteryError(const QString &module_name, bool force);
static bool checkBatteryErrorWithoutDialog(const QString &module_name, bool force);
enum InputDeviceType {
BuiltinKeyboard = 1,
SoftwareKeyboard = 2
};
static InputDeviceType defaultInputDevice();
typedef struct SlListColumnInfo {
enum Type {
Fixed = 0,
StringLen,
Scale,
FixedDpiAware
};
Type type;
QString str;
int val;
};
typedef QValueList<SlListColumnInfo> SlListColumnInfos;
static void setListColumnsWidth(QWidget *w,SlListColumnInfos &infos,
Config &config);
static void writeListColumnsWidth(QWidget *w,SlListColumnInfos &infos,
Config &config);
static void writeListColumnsWidth(QWidget *w,SlListColumnInfos &infos,
Config &config,bool isLandscape);
static void rotateListColumnsWidth(QWidget *w,SlListColumnInfos &infos,
Config &config);
static void setListColumnsWidth(QWidget *w,SlListColumnInfos &infos, Config *config=NULL);
static void writeListColumnsWidth(QWidget *w,SlListColumnInfos &infos, Config *config=NULL);
static void writeListColumnsWidth(QWidget *w,SlListColumnInfos &infos, bool isLandscape, Config *config=NULL);
static void rotateListColumnsWidth(QWidget *w,SlListColumnInfos &infos, Config *config=NULL);
static void temporaryMessageBox(const QString &caption, const QString &text, int msec=10000, QMessageBox::Icon icon=QMessageBox::NoIcon, int button0=0, int button1=0, int button2=0, QWidget *parent=0, const char *name=0, QWidget::WFlags f=QWidget::WStyle_DialogBorder);
static QString defaultWallPaper();
typedef enum AppCommand {
NoneCommand = 0,
NewCommand,
ModifyCommand,
DeleteCommand,
ZoomInCommand,
ZoomOutCommand,
CutCommand = 50,
CopyCommand,
PasteCommand
};
static AppCommand appCommandFromKey(const QKeyEvent &e);
typedef enum RequiredSize {
SmallSize = 0,
LargeSize
};
static const char* getTmpPath(RequiredSize);
static const char* getTmpPath(ulong);
static QString getObexTmpPath();
static ulong availableInternalStorage(void);
static QString moduleNameFromPath(const QString &path);
};
#endif
diff --git a/noncore/applets/zkbapplet/applet/zkbwidget.cpp b/noncore/applets/zkbapplet/applet/zkbwidget.cpp
index 8499500..13729ea 100644
--- a/noncore/applets/zkbapplet/applet/zkbwidget.cpp
+++ b/noncore/applets/zkbapplet/applet/zkbwidget.cpp
@@ -1,168 +1,168 @@
#include <opie2/otaskbarapplet.h>
#include <opie2/okeyfilter.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/applnk.h>
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
#include <stdio.h>
#include <unistd.h>
#include "zkbwidget.h"
#include "zkbcfg.h"
using namespace Opie::Ui;
ZkbWidget::ZkbWidget(QWidget* parent)
:QLabel(parent),keymap(0),disabled(Resource::loadPixmap("zkb-disabled")) {
labels = new QPopupMenu();
connect(labels, SIGNAL(activated(int)), this,
SLOT(labelChanged(int)));
loadKeymap();
channel = new QCopChannel("QPE/zkb", this);
connect(channel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(signalReceived(const QCString&,const QByteArray&)));
setFixedWidth ( AppLnk::smallIconSize() );
setFixedHeight ( AppLnk::smallIconSize() );
}
ZkbWidget::~ZkbWidget()
{
if (keymap != 0) {
delete keymap;
keymap = 0;
}
}
int ZkbWidget::position()
{
return 8;
}
bool ZkbWidget::loadKeymap() {
- ZkbConfig c(QPEApplication::qpeDir()+"/share/zkb");
+ ZkbConfig c(QPEApplication::qpeDir()+"share/zkb");
QFontMetrics fm(font());
if (keymap != 0) {
delete keymap;
keymap = 0;
}
Keymap* km = new Keymap();
if (!c.load("zkb.xml", *km, "")) {
delete km;
setPixmap(disabled);
return false;
}
connect(km, SIGNAL(stateChanged(const QString&)),
this, SLOT(stateChanged(const QString&)));
Opie::Core::OKeyFilter::inst()->addHandler(km);
Keymap* oldkm = keymap;
keymap = km;
if (oldkm != 0) {
delete oldkm;
}
QString ltext = keymap->getCurrentLabel();
if (ltext.length()==0) ltext = "??";
setText(ltext);
labels->clear();
QStringList l = keymap->listLabels();
labels->insertItem(disabled, 0, 0);
int n = 1;
w = 0;
for(QStringList::Iterator it = l.begin(); it != l.end();
++it, n++) {
// printf("label: %s\n", (const char*) (*it).utf8());
labels->insertItem(*it, n, n);
int lw = fm.width(*it);
if (lw > w) {
w = lw;
}
}
if (w == 0) {
hide();
} else {
show();
}
return true;
}
QSize ZkbWidget::sizeHint() const {
return QSize(AppLnk::smallIconSize(),AppLnk::smallIconSize());
}
void ZkbWidget::stateChanged(const QString& s) {
// odebug << "stateChanged: " << s.utf8() << "\n" << oendl;
setText(s);
}
void ZkbWidget::labelChanged(int id) {
if (id == 0) {
keymap->disable();
setPixmap(disabled);
return;
}
keymap->enable();
QStringList l = keymap->listLabels();
QString lbl = l[id-1];
// printf("labelChanged: %s\n", (const char*) lbl.utf8());
State* state = keymap->getStateByLabel(lbl);
if (state != 0) {
keymap->setCurrentState(state);
setText(lbl);
}
}
void ZkbWidget::mouseReleaseEvent(QMouseEvent*) {
QSize sh = labels->sizeHint();
QPoint p = mapToGlobal(QPoint((width()-sh.width())/2,-sh.height()));
labels->exec(p);
}
void ZkbWidget::signalReceived(const QCString& msg, const QByteArray& data) {
QDataStream stream(data, IO_ReadOnly);
if (msg == "enable()") {
keymap->enable();
} else if (msg == "disable()") {
keymap->disable();
} else if (msg == "reload()") {
QCopEnvelope("QPE/System", "busy()");
QTimer::singleShot(0, this, SLOT(reload()));
} else if (msg == "switch(QString)") {
QString lbl;
stream >> lbl;
if (keymap != 0) {
State* state = keymap->getStateByLabel(lbl);
if (state != 0) {
keymap->setCurrentState(state);
setText(lbl);
}
}
} else if (msg == "debug(QString)") {
QString flag;
stream >> flag;
}
}
void ZkbWidget::reload() {
loadKeymap();
QCopEnvelope("QPE/System", "notBusy()");
}
EXPORT_OPIE_APPLET_v1( ZkbWidget )
diff --git a/noncore/applets/zkbapplet/keyzcfg/cfgdlg.cpp b/noncore/applets/zkbapplet/keyzcfg/cfgdlg.cpp
index 8d868d4..4190a9e 100644
--- a/noncore/applets/zkbapplet/keyzcfg/cfgdlg.cpp
+++ b/noncore/applets/zkbapplet/keyzcfg/cfgdlg.cpp
@@ -1,132 +1,132 @@
#include <qdir.h>
#include <qpe/qpeapplication.h>
#include <qpe/qcopenvelope_qws.h>
#include <unistd.h>
#include "cfgdlg.h"
CfgDlg::CfgDlg(QWidget* parent, CfgFile* cf, QApplication* app, bool mod):
QDialog(parent, "CfgDlg", mod), cfile(cf), application(app) {
setCaption(tr("keyz configurator"));
QGridLayout* gl = new QGridLayout(this, 7, 5, 5, 5);
QLabel* flabel = new QLabel("Available Keymaps", this);
files = new QListBox(this);
QPushButton* addButton = new QPushButton(">>", this); //add->setText("Add");
connect(addButton, SIGNAL(clicked()), this, SLOT(add()));
QLabel* klabel = new QLabel("Selected Keymaps", this);
keymaps = new QListBox(this);
connect(keymaps, SIGNAL(highlighted(const QString&)), this, SLOT(keymapHighlighted(const QString&)));
QPushButton* delButton = new QPushButton("<<", this); //del->setText("Delete");
connect(delButton, SIGNAL(clicked()), this, SLOT(del()));
QPushButton* slabelButton = new QPushButton("Set Label", this); //apply->setText("Apply");
connect(slabelButton, SIGNAL(clicked()), this, SLOT(setLabel()));
QLabel* l = new QLabel("Label", this);
label = new QLineEdit(this);
QLabel* adlabel = new QLabel("Auto Repeat Delay (ms)", this);
QLabel* aplabel = new QLabel("Auto Repeat Period (ms)", this);
ad = new QSpinBox(50, 5000, 5, this);
ap = new QSpinBox(0, 5000, 5, this);
// QLabel* adms = new QLabel("ms", this);
// QLabel* apms = new QLabel("ms", this);
// QCheckBox* enable = new QCheckBox("Enable", t);
gl->setColStretch(0, 1);
gl->setColStretch(1, 1);
gl->setColStretch(3, 1);
gl->setColStretch(4, 1);
gl->setRowStretch(3, 1);
gl->addMultiCellWidget(flabel, 0, 0, 0, 1);
gl->addMultiCellWidget(klabel, 0, 0, 3, 4);
gl->addMultiCellWidget(files, 1, 3, 0, 1);
gl->addMultiCellWidget(keymaps, 1, 3, 3, 4);
gl->addWidget(addButton, 1, 2);
gl->addWidget(delButton, 2, 2);
gl->addWidget(l, 4, 0);
gl->addWidget(label, 4, 1);
gl->addMultiCellWidget(slabelButton, 4, 4, 3, 4);
gl->addMultiCellWidget(adlabel, 5, 5, 0, 2);
gl->addMultiCellWidget(ad, 5, 5, 3, 4);
// gl->addWidget(adms, 5, 3);
gl->addMultiCellWidget(aplabel, 6, 6, 0, 2);
gl->addMultiCellWidget(ap, 6, 6, 3, 4);
// gl->addWidget(apms, 6, 3);
QList<CfgEntry>& e = cfile->getEntries();
for(uint i = 0; i < e.count(); i++) {
CfgEntry* entry = e.at(i);
keymaps->insertItem(entry->getFile());
m.insert(entry->getFile(), entry->getLabel());
}
- QDir dir(QPEApplication::qpeDir()+"/share/zkb", "*.xml");
+ QDir dir(QPEApplication::qpeDir()+"share/zkb", "*.xml");
QStringList flist = dir.entryList();
QStringList::Iterator sit;
for(sit = flist.begin(); sit != flist.end(); ++sit) {
if (*sit != "common.xml" && *sit != "zkb.xml" && m.find(*sit) == m.end()) {
files->insertItem(*sit);
}
}
ad->setValue(cfile->getAutorepeatDelay());
ap->setValue(cfile->getAutorepeatPeriod());
// gl->addMultiCellWidget(enable, 7, 7, 0, 4);
}
CfgDlg::~CfgDlg() {
}
void CfgDlg::add() {
if (!files->currentText().isEmpty()) {
QString t = files->currentText();
files->removeItem(files->currentItem());
keymaps->insertItem(t);
cfile->replaceEntry(t, "");
m.replace(t, "");
}
}
void CfgDlg::del() {
if (!keymaps->currentText().isEmpty()) {
QString t = keymaps->currentText();
keymaps->removeItem(keymaps->currentItem());
cfile->deleteEntry(t);
files->insertItem(t);
m.remove(files->currentText());
}
}
void CfgDlg::setLabel() {
if (!keymaps->currentText().isEmpty()) {
cfile->replaceEntry(keymaps->currentText(),
label->text());
m.replace(keymaps->currentText(), label->text());
}
}
void CfgDlg::keymapHighlighted(const QString&text) {
label->setText(*m.find(text));
}
void CfgDlg::accept() {
cfile->setAutorepeatDelay(ad->value());
cfile->setAutorepeatPeriod(ap->value());
CfgParser p;
- p.save(QPEApplication::qpeDir()+"/share/zkb/zkb.xml", *cfile);
+ p.save(QPEApplication::qpeDir()+"share/zkb/zkb.xml", *cfile);
QCopEnvelope("QPE/zkb", "reload()");
QDialog::accept();
}
diff --git a/noncore/applets/zkbapplet/keyzcfg/main.cpp b/noncore/applets/zkbapplet/keyzcfg/main.cpp
index 4615562..afd0f6a 100644
--- a/noncore/applets/zkbapplet/keyzcfg/main.cpp
+++ b/noncore/applets/zkbapplet/keyzcfg/main.cpp
@@ -1,22 +1,22 @@
#include <stdio.h>
#include <qpe/qpeapplication.h>
#include <qlayout.h>
#include <qmainwindow.h>
#include "cfgdlg.h"
int main( int argc, char **argv ) {
QPEApplication app(argc, argv);
CfgFile cfile;
CfgParser cp;
- cp.load(QPEApplication::qpeDir()+"/share/zkb/zkb.xml", cfile);
+ cp.load(QPEApplication::qpeDir()+"share/zkb/zkb.xml", cfile);
CfgDlg c(0, &cfile, &app, true);
app.showMainWidget(&c);
int ret = QPEApplication::execDialog(&c);
return ret;
}
diff --git a/noncore/apps/opie-bartender/bartender.cpp b/noncore/apps/opie-bartender/bartender.cpp
index 59fc242..b4958b3 100644
--- a/noncore/apps/opie-bartender/bartender.cpp
+++ b/noncore/apps/opie-bartender/bartender.cpp
@@ -1,435 +1,435 @@
/****************************************************************************
**
** Created: Sat Jul 20 08:10:53 2002
** by: L.J. Potter <ljp@llornkcor.com>
** copyright : (C) 2002 by ljp
email : ljp@llornkcor.com
* 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 "bartender.h"
#include "showdrinks.h"
#include "inputDialog.h"
#include "searchresults.h"
#include "bac.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
using namespace Opie::Core;
/* QT */
#include <qlineedit.h>
#include <qdir.h>
#include <qpushbutton.h>
#include <qlistbox.h>
#include <qmultilineedit.h>
#include <qmessagebox.h>
#include <qtextstream.h>
#include <qaction.h>
#include <qheader.h>
#include <qlistview.h>
#include <qlayout.h>
#include <qtoolbar.h>
#include <qmenubar.h>
/* STD */
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
Bartender::Bartender( QWidget* parent, const char* name, WFlags fl )
: QMainWindow( parent, name, fl ) {
if ( !name )
setName( "Bartender" );
QGridLayout *layout = new QGridLayout( this );
layout->setSpacing( 2);
layout->setMargin( 2);
connect( qApp,SIGNAL( aboutToQuit()),SLOT( cleanUp()) );
setCaption( tr( "Bartender" ) );
ToolBar1 = new QToolBar( this, "ToolBar1" );
ToolBar1->setFixedHeight(22);
layout->addMultiCellWidget( ToolBar1, 0, 0, 0, 4 );
QMenuBar *menuBar = new QMenuBar( ToolBar1 );
QPopupMenu *fileMenu;
fileMenu = new QPopupMenu( this);
menuBar->insertItem( tr("File"), fileMenu );
fileMenu->insertItem(tr("New Drink"));
fileMenu->insertItem(tr("Open Drink"));
fileMenu->insertItem(tr("Find by Drink Name"));
fileMenu->insertItem(tr("Find by Alcohol"));
QPopupMenu *editMenu;
editMenu = new QPopupMenu( this);
menuBar->insertItem( tr("Edit"), editMenu );
editMenu->insertItem(tr("edit"));
connect( fileMenu, SIGNAL( activated(int) ), this, SLOT( fileMenuActivated(int) ));
connect( editMenu, SIGNAL( activated(int) ), this, SLOT( editMenuActivated(int) ));
QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), "New", 0, this, 0 );
connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
a->addTo( ToolBar1 );
a = new QAction( tr( "Open" ), Resource::loadPixmap( "bartender/bartender_sm" ), "open", 0, this, 0 );
connect( a, SIGNAL( activated() ), this, SLOT( openCurrentDrink() ) );
a->addTo( ToolBar1 );
a = new QAction( tr( "Find" ), Resource::loadPixmap( "find" ), "Find", 0, this, 0 );
connect( a, SIGNAL( activated() ), this, SLOT( askSearch() ) );
a->addTo( ToolBar1 );
a = new QAction( tr( "Edit" ), Resource::loadPixmap( "edit" ),"Edit", 0, this, 0 );
connect( a, SIGNAL( activated() ), this, SLOT( doEdit() ) );
a->addTo( ToolBar1 );
QPushButton *t;
t= new QPushButton( "BAC", ToolBar1, "bacButtin");
connect( t, SIGNAL( clicked() ), this, SLOT( doBac() ) );
DrinkView = new QListView( this, "DrinkView" );
DrinkView->addColumn( tr( "Name of Drink" ) );
// DrinkView->setRootIsDecorated( TRUE );
DrinkView->header()->hide();
QPEApplication::setStylusOperation( DrinkView->viewport(),QPEApplication::RightOnHold);
connect(DrinkView, SIGNAL( doubleClicked(QListViewItem*)),this,SLOT(showDrink(QListViewItem*)));
connect(DrinkView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int)),
this,SLOT( showDrink(int,QListViewItem*,const QPoint&,int)));
layout->addMultiCellWidget( DrinkView, 1, 2, 0, 4 );
if(QDir("db").exists()) {
dbFile.setName( "db/drinkdb.txt");
} else
- dbFile.setName( QPEApplication::qpeDir()+"/etc/bartender/drinkdb.txt");
+ dbFile.setName( QPEApplication::qpeDir()+"etc/bartender/drinkdb.txt");
initDrinkDb();
}
Bartender::~Bartender() {
}
/*
this happens right before exit */
void Bartender::cleanUp() {
dbFile.close();
}
void Bartender::initDrinkDb() {
if(!dbFile.isOpen())
if ( !dbFile.open( IO_ReadOnly)) {
QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) );
return;
}
fillList();
}
void Bartender::fillList() {
dbFile.at(1);
DrinkView->clear();
int i=0;
QListViewItem * item ;
QTextStream t( &dbFile);
QString s;
while ( !t.eof()) {
s = t.readLine();
if(s.find("#",0,TRUE) != -1) {
// odebug << s.right(s.length()-2) << oendl;
item= new QListViewItem( DrinkView, 0 );
item->setText( 0, s.right(s.length()-2));
i++;
}
}
odebug << "there are currently " << i << " of drinks" << oendl;
}
void Bartender::fileNew() {
New_Drink *newDrinks;
newDrinks = new New_Drink(this,"New Drink....", TRUE);
QString newName, newIng;
QPEApplication::execDialog( newDrinks );
newName = newDrinks->LineEdit1->text();
newIng= newDrinks->MultiLineEdit1->text();
if(dbFile.isOpen())
dbFile.close();
if ( !dbFile.open( IO_WriteOnly| IO_Append)) {
QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) );
return;
}
if(newDrinks ->result() == 1 ) {
QString newDrink="\n# "+newName+"\n";
newDrink.append(newIng+"\n");
odebug << "writing "+newDrink << oendl;
dbFile.writeBlock( newDrink.latin1(), newDrink.length());
clearList();
dbFile.close();
initDrinkDb();
}
delete newDrinks;
}
void Bartender::showDrink(int mouse, QListViewItem * item, const QPoint&, int) {
switch (mouse) {
case 1:
// showDrink(item);
break;
case 2:
showDrink(item);
break;
}
}
void Bartender::showDrink( QListViewItem *item) {
if(item==NULL) return;
dbFile.at(0);
Show_Drink *showDrinks;
QString myDrink=item->text(0);
showDrinks = new Show_Drink(this, myDrink, TRUE);
QTextStream t( &dbFile);
QString s, s2;
while ( !t.eof()) {
s = t.readLine();
if(s.find( myDrink, 0, TRUE) != -1) {
for(int i=0;s2.find( "#", 0, TRUE) == -1;i++) {
s2 = t.readLine();
if(s2.find("#",0,TRUE) == -1 || dbFile.atEnd() ) {
// odebug << s2 << oendl;
showDrinks->MultiLineEdit1->append(s2);
}
if( dbFile.atEnd() ) break;
}
}
}
QPEApplication::execDialog( showDrinks );
if(showDrinks ->result() ==0) {
doEdit();
}
delete showDrinks;
}
void Bartender::askSearch() {
switch ( QMessageBox::warning(this,tr("Find"),tr("Search by drink name\n")+
"\nor alcohol ?"
,tr("Drink Name"),tr("Alcohol"),0,0,1) ) {
case 0:
doSearchByName();
break;
case 1:
doSearchByDrink();
break;
};
}
/* search by name */
void Bartender::doSearchByName() {
// if( DrinkView->currentItem() == NULL) return;
QStringList searchList;
QString searchForDrinkName;
InputDialog *fileDlg;
fileDlg = new InputDialog(this,tr("Find by Drink Name"),TRUE, 0);
fileDlg->exec();
if( fileDlg->result() == 1 ) {
searchForDrinkName = fileDlg->LineEdit1->text();
QListViewItemIterator it( DrinkView );
for ( ; it.current(); ++it ) {
if ( it.current()->text(0).find( searchForDrinkName, 0, TRUE) != -1 ) {
// odebug << it.current()->text(0) << oendl;
searchList.append(it.current()->text(0));
}
}
if(searchList.count() >0)
showSearchResult(searchList);
else
QMessageBox::message(tr("Search"),tr("Sorry no results for\n")+searchForDrinkName);
}//end Inputdialog
delete fileDlg;
}
void Bartender::doSearchByDrink() {
// if( DrinkView->currentItem() == NULL) return;
QStringList searchList;
QString searchForDrinkName, lastDrinkName, tempName;
InputDialog *fileDlg;
fileDlg = new InputDialog(this,tr("Find by Alcohol"),TRUE, 0);
fileDlg->exec();
if( fileDlg->result() == 1 ) {
searchForDrinkName = fileDlg->LineEdit1->text();
dbFile.at(0);
QTextStream t( &dbFile);
QString s, s2;
while ( !t.eof()) {
s = t.readLine();
if(s.find("#",0,TRUE) != -1) {
lastDrinkName=s.right(s.length()-2);
// odebug << "last drink name "+lastDrinkName << oendl;
}
else if( s.find( searchForDrinkName ,0, FALSE) != -1 && lastDrinkName != tempName ) {
// odebug << "appending "+lastDrinkName << oendl;
searchList.append( lastDrinkName);
tempName=lastDrinkName;
}
// if( dbFile.atEnd() ) break;
} //oef
if(searchList.count() >0)
showSearchResult(searchList);
else
QMessageBox::message(tr("Search"),tr("Sorry no results for\n")+ searchForDrinkName);
}
delete fileDlg;
}
void Bartender::showSearchResult(QStringList &searchList) {
QString result;
Search_Results *searchDlg;
searchList.sort();
searchDlg = new Search_Results(this, "Search Results", TRUE);
searchDlg->ListBox1->insertStringList( searchList,-1);
QPEApplication::execDialog( searchDlg );
if( searchDlg->result() == 1 ) {
result= searchDlg->ListBox1->currentText();
}
QListViewItemIterator it2( DrinkView );
for ( ; it2.current(); ++it2 ) {
if ( it2.current()->text(0)== result ) {
// odebug << it2.current()->text(0) << oendl;
showDrink(it2.current());
}
}
delete searchDlg;
}
void Bartender::doEdit() {
if(DrinkView->currentItem() == NULL) {
fileNew();
}
QString myDrink;
myDrink= DrinkView->currentItem()->text(0);
dbFile.at(0);
int foundAt=0;
New_Drink *newDrinks;
newDrinks = new New_Drink(this,"Edit Drink....", TRUE);
QString newName, newIng;
QPEApplication::showDialog( newDrinks );
QTextStream t( &dbFile);
QString s, s2;
while ( !t.eof()) {
s = t.readLine();
if(s.find( myDrink, 0, TRUE) != -1) {
foundAt = dbFile.at() - (s.length()+1);
for(int i=0;s2.find( "#", 0, TRUE) == -1;i++) {
s2 = t.readLine();
if(s2.find("#",0,TRUE) == -1 || dbFile.atEnd() ) {
// odebug << s2 << oendl;
newDrinks->MultiLineEdit1->append(s2);
newDrinks->LineEdit1->setText(myDrink);
}
if( dbFile.atEnd() ) break;
}
}
}
newDrinks->exec();
newName = newDrinks->LineEdit1->text();
newIng= newDrinks->MultiLineEdit1->text();
if( newDrinks ->result() == 1 ) {
if(dbFile.isOpen())
dbFile.close();
if ( !dbFile.open( IO_ReadWrite )) {
QMessageBox::message( (tr("Note")), (tr("Drink database not opened sucessfully.\n")) );
return;
}
int fd = dbFile.handle();
lseek( fd, foundAt, SEEK_SET);
// dbFile.at( foundAt);
#warning FIXME problems with editing drinks db
////////// FIXME write to user file
QString newDrink="# "+newName+"\n";
newDrink.append(newIng+"\n");
odebug << "writing "+newDrink << oendl;
dbFile.writeBlock( newDrink.latin1(), newDrink.length());
clearList();
dbFile.flush();
initDrinkDb();
}
}
void Bartender::clearList() {
DrinkView->clear();
}
void Bartender::doBac() {
BacDialog *bacDlg;
bacDlg = new BacDialog(this,"BAC",TRUE);
QPEApplication::execDialog( bacDlg );
delete bacDlg;
}
void Bartender::openCurrentDrink() {
if(DrinkView->currentItem() == NULL) return;
showDrink(DrinkView->currentItem());
}
void Bartender::fileMenuActivated( int item) {
odebug << "Item " << item << "" << oendl;
switch(item) {
case -3: // new -3
fileNew();
break;
case -4:// open -4
openCurrentDrink();
break;
case -5:// drink -5
doSearchByName();
break;
case -6:// alcohol -6
doSearchByDrink();
break;
}
}
void Bartender::editMenuActivated(int item) {
odebug << "Item " << item << "" << oendl;
/*
edit -8
*/
switch(item) {
case -8:
doEdit() ;
break;
}
}
diff --git a/noncore/apps/opie-console/fixit.cpp b/noncore/apps/opie-console/fixit.cpp
index 3b0044a..f170074 100644
--- a/noncore/apps/opie-console/fixit.cpp
+++ b/noncore/apps/opie-console/fixit.cpp
@@ -1,94 +1,94 @@
#include "fixit.h"
using namespace Opie::Core;
#ifdef FSCKED_DISTRI
FixIt::FixIt() {
/* the new inittab */
m_file = "#\n# /etc/inittab"
"#"
""
"# 0 - halt (Do NOT set initdefault to this)"
"# 1 - Single user mode"
"# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)"
"# 3 - Full multiuser mode"
"# 4 - JavaVM(Intent) developer mode"
"# 5 - JavaVM(Intent)"
"# 6 - reboot (Do NOT set initdefault to this)"
"#"
"id:5:initdefault:"
""
"# Specify things to do when starting"
"si::sysinit:/etc/rc.d/rc.sysinit"
""
"l0:0:wait:/root/etc/rc.d/rc 0"
"l1:1:wait:/etc/rc.d/rc 1"
"l2:2:wait:/etc/rc.d/rc 2"
"l3:3:wait:/etc/rc.d/rc 3"
"l4:4:wait:/etc/rc.d/rc 4"
"l5:5:wait:/etc/rc.d/rc 5"
"l6:6:wait:/root/etc/rc.d/rc 6"
""
"# Specify things to do before rebooting"
"um::ctrlaltdel:/bin/umount -a -r > /dev/null 2>&1"
"sw::ctrlaltdel:/sbin/swapoff -a > /dev/null 2>&1"
""
"# Specify program to run on ttyS0"
"s0:24:respawn:/sbin/getty 9600 ttyS0"
"#pd:5:respawn:/etc/sync/serialctl"
""
"# Specify program to run on tty1"
"1:2:respawn:/sbin/getty 9600 tty1"
"ln:345:respawn:survive -l 6 /sbin/launch"
"#qt:5:respawn:/sbin/qt"
""
"# collie sp."
"sy::respawn:/sbin/shsync\n";
}
/*
* the retail Zaurus is broken in many ways
* one is that pppd is listening on our port...
* we've to stop it from that and then do kill(SIGHUP,1);
*/
void FixIt::fixIt() {
#ifndef EAST
- ::rename("/etc/inittab", QPEApplication::qpeDir() + "/etc/inittab" );
+ ::rename("/etc/inittab", QPEApplication::qpeDir() + "etc/inittab" );
QFile file( "/etc/inittab" );
if ( file.open(IO_WriteOnly | IO_Raw ) ) {
file.writeBlock(m_file,strlen(m_file) );
}
file.close();
::kill( SIGHUP, 1 );
#else
OProcess m_kill;
- m_kill << QPEApplication::qpeDir() + "/share/opie-console/sl6000_embedix_kill_0_1.sh";
+ m_kill << QPEApplication::qpeDir() + "share/opie-console/sl6000_embedix_kill_0_1.sh";
if ( !m_kill.start(OProcess::DontCare,OProcess::NoCommunication) ) {
owarn << "could not execute kill script" << oendl;
} else {
Global::statusMessage( QObject::tr("Fixing up Embedix"));
}
#endif
}
void FixIt::breakIt() {
#ifdef EAST
OProcess m_restart;
- m_restart << QPEApplication::qpeDir() + "/share/opie-console/sl6000_embedix_restart_0_1.sh";
+ m_restart << QPEApplication::qpeDir() + "share/opie-console/sl6000_embedix_restart_0_1.sh";
if ( !m_restart.start(OProcess::DontCare,OProcess::NoCommunication) ) {
owarn << "could not execute restart script" << oendl;
}
#endif
}
#endif
diff --git a/noncore/apps/opie-gutenbrowser/LibraryDialog.cpp b/noncore/apps/opie-gutenbrowser/LibraryDialog.cpp
index 020a116..3c096ed 100644
--- a/noncore/apps/opie-gutenbrowser/LibraryDialog.cpp
+++ b/noncore/apps/opie-gutenbrowser/LibraryDialog.cpp
@@ -1,1073 +1,1073 @@
/***************************************************************************
// LibraryDialog.cpp - description
// -------------------
// begin : Sat Aug 19 2000
// copyright : (C) 2000 - 2004 by llornkcor
// email : ljp@llornkcor.com
// ***************************************************/
// /***************************************************************************
// * 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. *
// ***************************************************************************/
//ftp://ibiblio.org/pub/docs/books/gutenberg/GUTINDEX.ALL
#include "LibraryDialog.h"
#include "output.h"
/* OPIE */
#include <qpe/applnk.h>
#include <qpe/qpeapplication.h>
#include <qpe/qpedialog.h>
#include <opie2/odebug.h>
/* QT */
#include <qpushbutton.h>
#include <qmultilineedit.h>
//#include <qlayout.h>
/* STD */
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/*
* The dialog will by default be modeless, unless you set 'modal' to
* TRUE to construct a modal dialog. */
LibraryDialog::LibraryDialog( QWidget* parent, const char* name , bool /*modal*/, WFlags fl )
: QDialog( parent, name, true/* modal*/, fl )
{
if ( !name )
setName( "LibraryDialog" );
indexLoaded=false;
initDialog();
// this->setMaximumWidth(240);
index = "GUTINDEX.ALL";
local_library = (QDir::homeDirPath ()) +"/Applications/gutenbrowser/";
local_index = local_library + index;
QString iniFile ;
- iniFile = QPEApplication::qpeDir()+"/etc/gutenbrowser/gutenbrowserrc";
+ iniFile = QPEApplication::qpeDir()+"etc/gutenbrowser/gutenbrowserrc";
- new_index =QPEApplication::qpeDir()+"/etc/gutenbrowser/PGWHOLE.TXT";
+ new_index =QPEApplication::qpeDir()+"etc/gutenbrowser/PGWHOLE.TXT";
- old_index = QPEApplication::qpeDir()+"/etc/gutenbrowser/GUTINDEX.ALL";
+ old_index = QPEApplication::qpeDir()+"etc/gutenbrowser/GUTINDEX.ALL";
// old_index = QPEApplication::qpeDir()+"etc/gutenbrowser/GUTINDEX.ALL";
// iniFile = local_library+"gutenbrowserrc";
// new_index = local_library + "PGWHOLE.TXT";
// old_index = local_library + "GUTINDEX.ALL";
Config config("Gutenbrowser");
config.setGroup( "HttpServer" );
proxy_http = config.readEntry("Preferred", "http://sailor.gutenbook.org");
config.setGroup( "FTPsite" );
ftp_host=config.readEntry("SiteName", "sailor.gutenberg.org");
odebug << "Library Dialog: ftp_host is "+ftp_host << oendl;
// ftp_host=ftp_host.right(ftp_host.length()-(ftp_host.find(") ",0,TRUE)+1) );
// ftp_host=ftp_host.stripWhiteSpace();
ftp_base_dir= config.readEntry("base", "/pub/gutenberg");
i_binary = 0;
config.setGroup("SortAuth");
if( config.readEntry("authSort", "FALSE") == "TRUE")
authBox->setChecked(TRUE);
config.setGroup("General");
downDir =config.readEntry( "DownloadDirectory",local_library);
odebug << "downDir is "+downDir << oendl;
newindexLib.setName( old_index);
indexLib.setName( old_index);
new QPEDialogListener(this);
QTimer::singleShot( 1000, this, SLOT( FindLibrary()) );
}
LibraryDialog::~LibraryDialog()
{
// delete QList_Item2;
// delete QList_Item1;
// delete QList_Item3;
// delete QList_Item4;
// delete QList_Item5;
// saveConfig();
}
/*This groks using PGWHOLE.TXT */
void LibraryDialog::Newlibrary()
{
#ifndef Q_WS_QWS //sorry embedded gutenbrowser cant use zip files
//odebug << "Opening new library index " << newindexLib << "" << oendl;
if ( newindexLib.open( IO_ReadOnly) ) {
setCaption( tr( "Library Index - using master pg index." ) );// file opened successfully
QTextStream indexStream( &newindexLib );
QString indexLine;
while ( !indexStream.atEnd() ) { // until end of file..
indexLine = indexStream.readLine();
if ( ( indexLine.mid(4,4)).toInt() && !( indexLine.left(3)).toInt()) {
year = indexLine.mid(4,4);
year = year.stripWhiteSpace();
file = indexLine.mid( indexLine.find( "[", 0, TRUE )+1, 12 );
file = file.stripWhiteSpace();
number = indexLine.mid( indexLine.find( "]", 0, TRUE ) +1, indexLine.find( " ", 0, TRUE )+1 );
if( year.toInt() < 1984)
number = number.left( number.length() -1 );
number = number.stripWhiteSpace();
title = indexLine.mid( indexLine.find(" ", 26, TRUE), indexLine.length() );
title = title.stripWhiteSpace();
getAuthor(); // groks author
author = author.stripWhiteSpace();
if (authBox->isChecked()) { // this reverses the first name and last name of the author
// odebug << "Sorting last name first" << oendl;
QString lastName, firstName="";
int finder=author.findRev( ' ', -1, TRUE);
lastName=author.right( author.length()-finder);
firstName=author.left(finder);
lastName=lastName.stripWhiteSpace();
firstName=firstName.stripWhiteSpace();
if( lastName.find( firstName, 0, true) == -1) // this avoids dup names
author=lastName+", "+firstName;
}
if( !number.isEmpty() && (title.find( "reserved",0, FALSE) == -1) && (file.find( "]",0, TRUE) == -1) ) {
// fill string list or something to be able to resort the whole library
if( author.isEmpty() )
QList_Item5 = new QListViewItem( ListView5, /* number,*/ title, author, year, file );
else {
if( (author.left(1) >= QString("A") && author.left(1) <= QString("F")) ||
(author.left(1) >= QString("a") && author.left(1) <= QString("f")) )
QList_Item1 = new QListViewItem( ListView1,/* number,*/ title, author, year, file );
else if( (author.left(1) >= QString("G") && author.left(1) <= QString("M")) ||
(author.left(1) >= QString("g") && author.left(1) <= QString("m")) )
QList_Item2 = new QListViewItem( ListView2, /*number, */title, author, year, file );
else if( (author.left(1) >= QString("N") && author.left(1) <= QString("R")) ||
(author.left(1) >= QString("n") && author.left(1) <= QString("r")) )
QList_Item3 = new QListViewItem( ListView3, /*number,*/ title, author, year, file );
else if( (author.left(1) >= QString("S") && author.left(1) <= QString("Z")) ||
(author.left(1) >= QString("s") && author.left(1) <= QString("z")) )
QList_Item4 = new QListViewItem( ListView4, /* number,*/ title, author, year, file );
else
QList_Item5 = new QListViewItem( ListView5, /* number,*/ title, author, year, file );
}
}
}// end if
}// end while
newindexLib.close();
}
#ifndef Q_WS_QWS
setCursor( arrowCursor);
#endif
#endif
} // end Newlibrary()
void LibraryDialog::Library()
{// old library groking method
ListView1->clear();
ListView2->clear();
ListView3->clear();
ListView4->clear();
ListView5->clear();
odebug << "opening GUTINDEX.ALL file" << oendl;
IDontKnowWhy = "";
if ( indexLib.open( IO_ReadOnly) ) { // file opened successfully
QTextStream indexStream( &indexLib );
QString indexLine;
qApp->processEvents();
// int jig;
while ( !indexStream.eof() ) {
indexLine = indexStream.readLine();
if ( indexLine != "") {
if( (indexLine.mid(4,4)).toInt() /* && !( indexLine.left(3)).toInt()*/ ) {
// month = indexLine.left( 3);
year = indexLine.mid(4,4);
// title = indexLine.mid( 9, 50);
file = indexLine.mid(60,12);
if(file.left(1).find("[",0,TRUE) != -1)
file.remove(1,1);
if( file.find("]",0,TRUE) != -1)
file = file.left( file.find("]",0,TRUE));
//odebug << "file is "+file << oendl;
/// number = indexLine.mid( indexLine.find( "]", 0, TRUE ) +1, indexLine.find( " ", 0, TRUE )+1 );
number = indexLine.mid(55,5);
number = number.stripWhiteSpace();
// title = indexLine.mid( indexLine.find(" ", 26, TRUE), indexLine.length() );
title = indexLine.mid( 9, 50 );
title = title.stripWhiteSpace();
//odebug << "title is "+title << oendl;
getAuthor(); // grok author
author = author.stripWhiteSpace();
//odebug << "author is "+author << oendl;
if (authBox->isChecked() == TRUE) { // this reverses the first name and last name of the author
QString lastName, firstName="";
int finder=author.findRev( ' ', -1, TRUE);
lastName=author.right( author.length()-finder);
firstName=author.left(finder);
lastName=lastName.stripWhiteSpace();
firstName=firstName.stripWhiteSpace();
if( lastName.find( firstName, 0, true) == -1) // this avoids dup names
author=lastName+", "+firstName;
}
if( !number.isEmpty() && (title.find( "reserved",0, FALSE) == -1) /*&& (file.find( "]",0, TRUE))*/ ) {
// fill string list or something to be able to sort by Author
if( author.isEmpty() )
QList_Item5 = new QListViewItem( ListView5, /*number, */title, author, year, file );
else {
if( (author.left(1) >= QString("A") && author.left(1) <= QString("F")) ||
(author.left(1) >= QString("a") && author.left(1) <= QString("f")) )
QList_Item1 = new QListViewItem( ListView1, /* number,*/ title, author, year, file );
else if( (author.left(1) >= QString("G") && author.left(1) <= QString("M")) ||
(author.left(1) >= QString("g") && author.left(1) <= QString("m")) )
QList_Item2 = new QListViewItem( ListView2, /* number,*/ title, author, year, file );
else if( (author.left(1) >= QString("N") && author.left(1) <= QString("R")) ||
(author.left(1) >= QString("n") && author.left(1) <= QString("r")) )
QList_Item3 = new QListViewItem( ListView3, /* number,*/ title, author, year, file );
else if( (author.left(1) >= QString("S") && author.left(1) <= QString("Z")) ||
(author.left(1) >= QString("s") && author.left(1) <= QString("z")) )
QList_Item4 = new QListViewItem( ListView4, /* number,*/ title, author, year, file );
}
}
}
}
}
indexLib.close();
} else {
QString sMsg;
sMsg = ( tr("<p>Error opening local library index:</P> "))+local_index;
QMessageBox::message( "Error",sMsg);
}
} //end Library()
/*
Groks the author out of the title */
bool LibraryDialog::getAuthor()
{
if( title.contains( ", by", TRUE)) {
int auth;
auth = title.find(", by", 0, TRUE);
author = title.right(title.length() - (auth + 4) );
if( int finder = author.find("[", 0, TRUE)) {
author = author.left(finder);
}
}
else if ( title.contains( "by, ", TRUE) ) {
int auth;
auth = title.find("by, ", 0, TRUE);
author = title.right(title.length() - (auth + 4) );
if( int finder = author.find("[", 0, TRUE)) {
author = author.left( finder);
}
}
else if ( title.contains( " by", TRUE) ) {
int auth;
auth = title.find(" by", 0, TRUE);
author = title.right(title.length() - (auth + 3) );
if( int finder = author.find("[", 0, TRUE)) {
author = author.left( finder);
}
}
else if ( title.contains( "by ", TRUE) ) {
int auth;
auth = title.find("by ", 0, TRUE);
author = title.right(title.length() - (auth + 3) );
if( int finder = author.find("[", 0, TRUE)) {
author = author.left( finder);
}
}
else if ( title.contains( ",", TRUE) ) {
int auth;
auth = title.find(",", 0, TRUE);
author = title.right( title.length() - (auth + 1) );
if ( author.contains( ",", TRUE) ) {
int auth;
auth = author.find(",", 0, TRUE);
author = author.right( author.length() - (auth + 1) );
}
if( int finder = author.find("[", 0, TRUE)) {
author = author.left( finder);
}
}
else if ( title.contains( "/", TRUE) ) {
int auth;
auth = title.find("/", 0, TRUE);
author = title.right(title.length() - (auth + 1) );
if( int finder = author.find("[", 0, TRUE)) {
author = author.left( finder);
}
}
else if ( title.contains( "of", TRUE) ) {
int auth;
auth = title.find("of", 0, TRUE);
author = title.right(title.length() - (auth + 2) );
if( int finder = author.find("[", 0, TRUE))
{
author = author.left( finder);
}
} else {
author = "";
}
if ( author.contains("et. al")) {
int auth;
auth = author.find("et. al", 0, TRUE);
author = author.left( auth );
}
if ( author.contains("#")) {
int auth;
auth = author.find("#", 0, TRUE);
author = author.left( auth);
}
if ( author.contains("(")) {
int auth;
auth = author.find("(", 0, TRUE);
author = author.left( auth);
}
if ( author.contains("et al")) {
int auth;
auth = author.find("et al", 0, TRUE);
author = author.left( auth );
}
QRegExp r = QRegExp("[0-9]", TRUE, FALSE);
if ( author.left(2).find( r) != -1 ) {
author = "";
}
// if( author.contains(" ", TRUE)) {
// int suth = author.findRev(" ", -1, TRUE);
// author = author.right( author.length() - suth);
// }
// title
// author
return true;
}////// end getAuthor()
/*
selected one etext*/
void LibraryDialog::select_title( QListViewItem * item)
{
if(item != NULL) {
i++;
int index = tabWidget->currentPageIndex();
DlglistItemTitle = item->text(0);
DlglistItemYear = item->text(2);
DlglistItemFile = item->text(3);
switch (index) {
case 0: {
ListView1->clearSelection();
}
break;
case 1: {
ListView2->clearSelection();
}
break;
case 2: {
ListView3->clearSelection();
}
break;
case 3: {
ListView4->clearSelection();
}
break;
case 4: {
ListView5->clearSelection();
}
break;
};
}
if(DlglistItemTitle.length()>2) {
// DlglistItemNumber = item->text(0);
item = 0;
odebug << "string from librarydialog is:" << DlglistItemYear << " " << DlglistItemFile << " " << DlglistItemNumber << "" << oendl;
odebug << "Title is "+DlglistItemTitle << oendl;
// check for connection here
// if( get_extext())
if(download_Etext()) {
// odebug << "get here 2" << oendl;
if(i_binary == 1) {
}
if(checkBox->isChecked () ) {
accept();
}
}
}
}
bool LibraryDialog::download_Etext()
{ // ftp method
// might have to use old gpl'd ftp for embedded!!
Config cfg("Gutenbrowser");
cfg.setGroup("FTPsite");
ftp_host=cfg.readEntry("SiteName", "sailor.gutenberg.org");
ftp_base_dir= cfg.readEntry("base", "/pub/gutenberg");
odebug << "about to network dialog" << oendl;
QString NewlistItemNumber, NewlistItemYear, ls_result, result_line, s, dir, networkUrl, outputFile;
//////////////////// FIXME- if 'x' is part of real name....
NewlistItemFile = DlglistItemFile.left(DlglistItemFile.find(".xxx", 1, FALSE)).left(DlglistItemFile.left(DlglistItemFile.find(".xxx", 1, FALSE)).find("x", 1, FALSE));
if( NewlistItemFile.find( DlglistItemFile.left(4) ,0,TRUE) ==-1 ) {
NewlistItemFile.replace( 0,4, DlglistItemFile.left(4));
odebug << "NewlistItemFile is now "+NewlistItemFile << oendl;
}
NewlistItemYear = DlglistItemYear.right(2);
int NewlistItemYear_Int = NewlistItemYear.toInt(0, 10);
odebug << NewlistItemYear << oendl;
if (NewlistItemYear_Int < 91 && NewlistItemYear_Int > 70) {
NewlistItemYear = "90";
}
Edir ="etext" +NewlistItemYear;
dir= ftp_base_dir + "/etext" +NewlistItemYear+"/";
if( ftp_base_dir.find("=",0,true) )
ftp_base_dir.remove( ftp_base_dir.find("=",0,true),1);
networkUrl= "ftp://"+ftp_host+dir;
outputFile=local_library+".guten_temp";
//odebug << "Download file:" << NewlistItemFile << "" << oendl;
odebug << "Checking: "+ftp_host+" "+dir+" "+outputFile+" "+NewlistItemFile << oendl;
QStringList networkList;
networkList.append((const char *)ftp_host);
networkList.append((const char *)dir);
networkList.append((const char *)outputFile);
networkList.append((const char *)NewlistItemFile);
//<< (char *)ftp_host << (char *)dir << (char *)outputFile << (char *)NewlistItemFile;
NetworkDialog *NetworkDlg;
NetworkDlg = new NetworkDialog( this,"Network Protocol Dialog", TRUE, 0, networkList);
if( NetworkDlg->exec() != 0 ) { // use new, improved, *INSTANT* network-dialog-file-getterer
File_Name= NetworkDlg->localFileName;
odebug << "back to Library from Network Dialog" << oendl;
odebug << "Just downloaded "+NetworkDlg->localFileName << oendl;
// if (File_Name.find( local_library, 0, TRUE) != -1 ) { //could not be found
// QString oldName=File_Name;
// File_Name.replace(0,local_library.length(),downDir);
// odebug << "File_Name now is "+File_Name << oendl;
// }
// rename .txt to .etx
if(NetworkDlg->successDownload) {
odebug << "Filename is "+File_Name << oendl;
if(File_Name.right(4)==".txt") {
QString s_fileName=File_Name;
s_fileName.replace( s_fileName.length()-3,3,"gtn");
// s_fileName.replace( s_fileName.length()-3,3,"etx");
rename(File_Name.latin1(),s_fileName.latin1());
File_Name=s_fileName;
odebug << "Filename is now "+File_Name << oendl;
}
if(File_Name.length() > 5 ) {
setTitle();
QFileInfo fi(File_Name);
QString name_file=fi.fileName();
name_file=name_file.left(name_file.length()-4);
odebug << "Setting doclink" << oendl;
DocLnk lnk;
odebug << "name is "+name_file << oendl;
lnk.setName(name_file); //sets file name
odebug << "Title is "+DlglistItemTitle << oendl;
lnk.setComment(DlglistItemTitle);
odebug << "Filename is "+File_Name << oendl;
lnk.setFile(File_Name); //sets File property
lnk.setType("guten/plain");// hey is this a REGISTERED mime type?!?!? ;D
lnk.setExec(File_Name);
lnk.setIcon("gutenbrowser/Gutenbrowser");
if(!lnk.writeLink()) {
odebug << "Writing doclink did not work" << oendl;
} else {
}
} else
QMessageBox::message("Note","<p>There was an error with the file</p>");
}
}
return true;
}
bool LibraryDialog::httpDownload()
{// httpDownload
#ifndef Q_WS_QWS
Config config("Gutenbrowser");
config.setGroup( "Browser" );
QString brow = config.readEntry("Preferred", "");
QString file_name = "./.guten_temp";
// config.setGroup( "HttpServer" );
// QString s_http = config.readEntry("Preferred", "http://sailor.gutenbook.org");
QString httpName = proxy_http + "/"+Edir;
// progressBar->setProgress( i);
i++;
if ( brow != "Konq") { /////////// use lynx
// QString cmd = "lynx -source " + httpName +" | cat >> " + file_name;
// system(cmd);
} else { //////////// use KFM
// KFM::download( httpName, file_name);
}
i++;
QFile tmp( file_name);
QString str;
if (tmp.open(IO_ReadOnly)) {
QTextStream t( &tmp ); // use a text stream
while ( !t.eof()) {
QString s = t.readLine();
if (s.contains( NewlistItemFile, FALSE) && (s.contains(".txt")) ) {
str = s.mid( s.find( ".txt\">"+NewlistItemFile, 0, TRUE)+6, (s.find( ".txt</A>", 0, TRUE) + 4) - ( s.find( ".txt\">"+NewlistItemFile, 0, TRUE)+6 ) );
httpName += "/" + str;
}
} //end of while loop
}
tmp.close();
m_getFilePath = local_library + str;
i++;
if ( brow != "KFM"){ ///////// use lynx
QString cmd = "lynx -source " + httpName +" | cat >> " + m_getFilePath;
// QMessageBox::message("Error", cmd);
system(cmd);
} else { ////////// use KFM
// KFM::download( httpName, m_getFilePath);
}
i++;
#endif
return false;
}
void LibraryDialog::cancelIt()
{
saveConfig();
DlglistItemNumber = "";
this->reject();
}
bool LibraryDialog::setTitle()
{
Config config("Gutenbrowser");
odebug << "setting title" << oendl;
odebug << DlglistItemTitle << oendl;
if( DlglistItemTitle.find("[",0,TRUE) != -1)
DlglistItemTitle.replace(DlglistItemTitle.find("[",0,TRUE),1, "(" );
if( DlglistItemTitle.find("]",0,TRUE) !=-1)
DlglistItemTitle.replace(DlglistItemTitle.find("]",0,TRUE),1, ")" );
odebug << "Title being set is "+DlglistItemTitle << oendl;
int test = 0;
QString ramble, temp;
config.setGroup("Files");
QString s_numofFiles = config.readEntry("NumberOfFiles", "0" );
int i_numofFiles = s_numofFiles.toInt();
for ( int i = 0; i <= i_numofFiles; i++){
temp.setNum( i);
ramble = config.readEntry( temp, "" );
if( strcmp( ramble, File_Name) == 0){
test = 1;
}
}
config.setGroup("Files");
config.writeEntry( "NumberOfFiles", i_numofFiles +1 );
QString interger;
interger.setNum( i_numofFiles +1);
config.writeEntry( interger, File_Name);
config.setGroup( "Titles" );
config.writeEntry( File_Name, DlglistItemTitle);
test = 0;
return true;
}
void LibraryDialog::saveConfig()
{
Config config("Gutenbrowser");
if( httpBox->isChecked() == TRUE) {
checked = 1;
config.setGroup( "Proxy" );
config.writeEntry("IsChecked", "TRUE");
} else {
checked = 0;
config.setGroup( "Proxy" );
config.writeEntry("IsChecked", "FALSE");
}
if (authBox->isChecked() == TRUE) {
config.setGroup("SortAuth");
config.writeEntry("authSort", "TRUE");
} else {
config.setGroup("SortAuth");
config.writeEntry("authSort", "FALSE");
}
// config.write();
}
/*
searches library index for user word*/
void LibraryDialog::onButtonSearch()
{
ListView1->clearSelection();
ListView2->clearSelection();
ListView3->clearSelection();
ListView4->clearSelection();
ListView5->clearSelection();
int curTab=tabWidget->currentPageIndex();
SearchDialog* searchDlg;
// if( resultsList)
searchDlg = new SearchDialog( this, "Library Search", TRUE);
searchDlg->setCaption( tr( "Library Search" ) );
searchDlg->setLabel( "- author or title");
QString resultString;
int i_berger = 0;
if( searchDlg->exec() != 0 ) {
QString searcherStr = searchDlg->get_text();
int fluff=0;
// int tabPage = tabWidget->currentPageIndex();
// TODO ititerate here... struct<listViews>??
QListViewItemIterator it1( ListView1 );
QListViewItemIterator it2( ListView2 );
QListViewItemIterator it3( ListView3 );
QListViewItemIterator it4( ListView4 );
QListViewItemIterator it5( ListView5 );
//// this is really pitiful work,
///////
bool cS;
if( searchDlg->caseSensitiveCheckBox->isChecked())
cS=true; //case sensitive
else
cS=false;
if(fluff==0) {
for ( ; it1.current(); ++it1 ) {
resultString = ( it1.current() )->text(0);
resultString += (" : ");
resultString += ( it1.current() )->text(2);
resultString += (" : ");
resultString += ( it1.current() )->text(3);
if( resultString.find( searcherStr, 0, cS) != -1)
{
Searchlist.append( resultString);
}
}
}
if(fluff==0) {// search routine here
for ( ; it2.current(); ++it2 ) {
resultString = ( it2.current() )->text(0);
resultString += (" : ");
resultString += ( it2.current() )->text(2);
resultString += (" : ");
resultString += ( it2.current() )->text(3);
if( resultString.find( searcherStr, 0, cS) != -1) {
Searchlist.append( resultString);
}
}
}
if(fluff==0) {// search routine here
for ( ; it3.current(); ++it3 ) {
resultString = ( it3.current() )->text(0);
resultString += (" : ");
resultString += ( it3.current() )->text(2);
resultString += (" : ");
resultString += ( it3.current() )->text(3);
if( resultString.find( searcherStr, 0, cS) != -1) {
Searchlist.append( resultString);
}
}
}
if(fluff==0) {
// search routine here
for ( ; it4.current(); ++it4 ) {
resultString = ( it4.current() )->text(0);
resultString += (" : ");
resultString += ( it4.current() )->text(2);
resultString += (" : ");
resultString += ( it4.current() )->text(3);
if( resultString.find( searcherStr, 0, cS) != -1) {
Searchlist.append( resultString);
}
}
}
if(fluff==0) { // search routine here
for ( ; it5.current(); ++it5 ) {
resultString = ( it5.current() )->text(0);
resultString += (" : ");
resultString += ( it5.current() )->text(2);
resultString += (" : ");
resultString += ( it5.current() )->text(3);
if( resultString.find( searcherStr, 0, cS) != -1) {
Searchlist.append( resultString);
}
}
}
tabWidget->setCurrentPage( curTab);
Searchlist.sort();
SearchResultsDlg* SearchResultsDialog;
SearchResultsDialog = new SearchResultsDlg( searchDlg, "Results Dialog", true, 0 , Searchlist);
SearchResultsDialog->showMaximized();
if( SearchResultsDialog->exec() != 0) {
texter = SearchResultsDialog->selText;
// odebug << texter << oendl;
resultLs= SearchResultsDialog->resultsList;
i_berger = 1;
}
Searchlist.clear();
// if(SearchResultsDialog)
// delete SearchResultsDialog;
QString tester;
for ( QStringList::Iterator it = resultLs.begin(); it != resultLs.end(); ++it ) {
texter.sprintf("%s \n",(*it).latin1());
// odebug << texter << oendl;
if( tester!=texter)
parseSearchResults( texter);
tester = texter;
}
if(searchDlg)
delete searchDlg;
}
if(checkBox->isChecked() ) {
accept();
} else {
setActiveWindow();
}
}
/*
splits the result string and calls download for the current search result*/
void LibraryDialog::parseSearchResults( QString resultStr)
{
int stringLeng=resultStr.length();
QString my;
my.setNum( stringLeng, 10);
if( resultStr.length() > 2 && resultStr.length() < 130) {
int titleInt = resultStr.find( " : ", 0, TRUE);
DlglistItemTitle = resultStr.left( titleInt);
int yearInt = resultStr.find( " : ", titleInt+3, TRUE);
DlglistItemYear = resultStr.mid( titleInt+3, (yearInt - titleInt)-3);
DlglistItemFile = resultStr.right( resultStr.length() - (yearInt + 3));
download_Etext();
}
/*
printf( DlglistItemTitle+"\n"); printf( DlglistItemYear+"\n"); printf( DlglistItemFile+"\n");*/
}
// bool LibraryDialog::UnzipIt( QString zipFile) {
// //////////TODO findsome other way of dealingwithzip files.
// ///usr/bin/unzip";
// if( QFile::exists( zipFile)) {
// // QString thatFile = local_library +"PGWHOLE.TXT";
// QString cmd;
// #if defined(_WS_X11_)
// cmd = "gunzip -d " + zipFile /*newestLibraryFile */+" -d " + local_library;
// #endif
// #if defined(_WS_WIN_)
// QString temp= QDir::convertSeparators(local_library);
// zipFile=QDir::convertSeparators( zipFile);
// cmd = temp+"unzip.exe -o " +zipFile/*newestLibraryFile */+" -d " + temp;
// #endif
// #ifndef Q_WS_QWS
// // QString cmd = "gunzip -d " + zipFile /*newestLibraryFile */+" -d " + local_library;
// cmd = "unzip " + zipFile;
// #endif
// int exit=QMessageBox::information(this, "Unzip?", "Ok to unzip "+ zipFile+" ?", QMessageBox::Yes, QMessageBox::No);
// if (exit==QMessageBox::Yes) {
// odebug << "Issuing the command "+cmd << oendl;
// #if defined(_WS_WIN_)
// WinExec( cmd, SW_HIDE );
// #endif
// #if defined(_WS_X11_)
// system( cmd);
// #endif
// #ifndef Q_WS_QWS
// system( cmd);
// #endif
// // printf("unzip\n");
// // remove( zipFile /*newestLibraryFile*/);
// return true;
// }
// else if(exit==QMessageBox::No) {
// // printf("unzip\n");
// return false;
// }
// } else {
// // QMessageBox::message( "Note",( tr("Please install unzip in your PATH")) );
// return false;
// }
// return true;
// }
void LibraryDialog::sort()
{
}
/*
Downloads the current selected listitem*/
bool LibraryDialog::getItem(QListViewItem *it)
{
// odebug << "selected getItem" << oendl;
// DlglistItemNumber = it->text(0);
DlglistItemTitle = it->text(0);
DlglistItemYear = it->text(2);
DlglistItemFile = it->text(3);
if(download_Etext()) {
if(i_binary == 1) {
}
}
return true;
}
/*
download button is pushed so we get the current items to download*/
bool LibraryDialog::onButtonDownload()
{
// odebug << "selected onButtonDownloadz" << oendl;
QListViewItemIterator it1( ListView1 );
QListViewItemIterator it2( ListView2 );
QListViewItemIterator it3( ListView3 );
QListViewItemIterator it4( ListView4 );
QListViewItemIterator it5( ListView5 );
// iterate through all items of the listview
for ( ; it1.current(); ++it1 ) {
if ( it1.current()->isSelected() )
getItem(it1.current());
it1.current()->setSelected(FALSE);
}
for ( ; it2.current(); ++it2 ) {
if ( it2.current()->isSelected() )
getItem(it2.current());
it2.current()->setSelected(FALSE);
}
for ( ; it3.current(); ++it3 ) {
if ( it3.current()->isSelected() )
getItem(it3.current());
it3.current()->setSelected(FALSE);
}
for ( ; it4.current(); ++it4 ) {
if ( it4.current()->isSelected() )
getItem(it4.current());
it4.current()->setSelected(FALSE);
}
for ( ; it5.current(); ++it5 ) {
if ( it5.current()->isSelected() )
getItem(it5.current());
it5.current()->setSelected(FALSE);
}
return true;
}
/*
handles the sorting combo box */
void LibraryDialog::comboSelect(int index)
{
// odebug << "we are sorting" << oendl;
ListView1->setSorting( index, TRUE);
ListView2->setSorting( index, TRUE);
ListView3->setSorting( index, TRUE);
ListView4->setSorting( index, TRUE);
ListView5->setSorting( index, TRUE);
ListView1->sort();
ListView2->sort();
ListView3->sort();
ListView4->sort();
ListView5->sort();
// ListView1->triggerUpdate();
// ListView2->triggerUpdate();
// ListView3->triggerUpdate();
// ListView4->triggerUpdate();
// ListView5->triggerUpdate();
}
void LibraryDialog::newList()
{
if(indexLoaded) {
onButtonDownload();
} else {
Output *outDlg;
buttonNewList->setDown(TRUE);
QDir gutDir(QPEApplication::qpeDir()+"etc/gutenbrowser");
if(!gutDir.exists()) gutDir.mkdir(QPEApplication::qpeDir()+"etc/gutenbrowser",true);
if( chdir(QPEApplication::qpeDir()+"etc/gutenbrowser") == 0) {
odebug << "changing dir "+QPEApplication::qpeDir()+"etc/gutenbrowser" << oendl;
QString gutenindex1 = QPEApplication::qpeDir()+"etc/gutenbrowser/GUTINDEX.ALL";
QString cmd="wget -O " + gutenindex1 + " http://sailor.gutenberg.org/GUTINDEX.ALL 2>&1";
int result = QMessageBox::warning( this,"Download"
,"<p>Ok to use /'wget/' to download a new library list?</P>"
,"Yes","No",0,0,1);
qApp->processEvents();
if(result == 0) {
outDlg = new Output( 0, tr("Downloading Gutenberg Index...."),TRUE);
outDlg->showMaximized();
outDlg->show();
qApp->processEvents();
FILE *fp;
char line[130];
outDlg->OutputEdit->append( tr("Running wget") );
outDlg->OutputEdit->setCursorPosition(outDlg->OutputEdit->numLines() + 1,0,FALSE);
sleep(1);
fp = popen( (const char *) cmd, "r");
if ( !fp ) {
} else {
odebug << "Issuing the command\n"+cmd << oendl;
// system(cmd);
while ( fgets( line, sizeof line, fp)) {
outDlg->OutputEdit->append(line);
outDlg->OutputEdit->setCursorPosition(outDlg->OutputEdit->numLines() + 1,0,FALSE);
}
pclose(fp);
outDlg->OutputEdit->append("Finished downloading\n");
outDlg->OutputEdit->setCursorPosition(outDlg->OutputEdit->numLines() + 1,0,FALSE);
qApp->processEvents();
// if( QFile(gutenindex1).exists() ) {
// QString gutenindex=QPEApplication::qpeDir()+"etc/gutenbrowser/GUTINDEX.ALL";
// if( rename(gutenindex1.latin1(),gutenindex.latin1()) !=0)
// odebug << "renaming error" << oendl;
// }
}
// outDlg->close();
FindLibrary();
if(outDlg) delete outDlg;
}
buttonNewList->setDown(FALSE);
} else {
QMessageBox::message("Note","Could not change directories");
}
// if(outDlg)
// delete outDlg;
}
}
bool LibraryDialog::moreInfo()
{
QListViewItem * item;
item = 0;
QString titleString;
item = ListView1->currentItem();
if( item != 0) {
titleString = item->text(0);
ListView1->clearSelection();
item = 0;
}
if( item == 0)
item = ListView2->currentItem();
if( item != 0) {
titleString = item->text(0);
ListView2->clearSelection();
item = 0;
}
if( item == 0)
item = ListView3->currentItem();
if( item != 0) {
titleString = item->text(0);
ListView3->clearSelection();
item = 0;
}
if( item == 0)
item = ListView4->currentItem();
if( item != 0) {
titleString = item->text(0);
ListView4->clearSelection();
item = 0;
}
if( item == 0)
item = ListView5->currentItem();
if( item != 0) {
titleString = item->text(0);
ListView5->clearSelection();
item = 0;
}
item=0;
if(titleString.length()>2) {
odebug << "Title is "+titleString << oendl;
titleString.replace( QRegExp("\\s"), "%20");
titleString.replace( QRegExp("'"), "%20");
titleString.replace( QRegExp("\""), "%20");
titleString.replace( QRegExp("&"), "%20");
QString cmd= "http://google.com/search?q="+titleString+"&num=30&sa=Google+Search";
cmd="opera "+cmd;
system(cmd);
} else
QMessageBox::message( "Note","<p>If you select a title, this will search google.com for that title.</p>");
return true;
}
/*
This loads the library Index*/
void LibraryDialog::FindLibrary()
{
buttonLibrary->setDown(TRUE);
qApp->processEvents();
if( QFile( new_index).exists() /* && this->isHidden() */) {
newindexLib.setName( new_index);
indexLib.setName( new_index);
odebug << "index file is "+ new_index << oendl;
Newlibrary();
} else {
newindexLib.setName( old_index);
indexLib.setName( old_index);
odebug << "new index nameis "+ old_index << oendl;
Library();
}
indexLoaded=true;
buttonSearch->setEnabled(TRUE);
moreInfoButton->setEnabled(TRUE);
buttonLibrary->setDown(FALSE);
buttonNewList->setText("Download");
qApp->processEvents();
}
diff --git a/noncore/apps/opie-gutenbrowser/ftpsitedlg.cpp b/noncore/apps/opie-gutenbrowser/ftpsitedlg.cpp
index a9c7346..de9c72b 100644
--- a/noncore/apps/opie-gutenbrowser/ftpsitedlg.cpp
+++ b/noncore/apps/opie-gutenbrowser/ftpsitedlg.cpp
@@ -1,252 +1,252 @@
/***************************************************************************
ftpsitedlg.cpp - description
-------------------
begin : Tue Jul 25 2000
copyright : (C) 2000 -2004 by llornkcor
email : ljp@llornkcor.com
***************************************************************************/
/***************************************************************************
* 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 "optionsDialog.h"
#include "gutenbrowser.h"
//#include "NetworkDialog.h"
#include "output.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/config.h>
/* QT */
#include <qprogressbar.h>
#include <qurloperator.h>
#include <qlistbox.h>
/* STD */
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
// :)~
void optionsDialog::ftpSiteDlg( )
{
//printf( "ftpSiteDlg: ListFile is "+ ListFile +"\n" );
// initDialog();
local_library = (QDir::homeDirPath ()) +"/Applications/gutenbrowser/";
// ListFile = local_library + "ftpList";
- ListFile = QPEApplication::qpeDir() + "/etc/gutenbrowser";
+ ListFile = QPEApplication::qpeDir() + "etc/gutenbrowser";
QDir dir(ListFile);
if( !dir.exists())
dir.mkdir(ListFile,true);
ListFile+="/ftpList";
odebug << "opening "+ListFile << oendl;
if ( QFile(ListFile).exists() ) {
openSiteList();
} else {
switch( QMessageBox::warning( this, "Gutenbrowser",
"Do you want to download \nan ftp site list?",
QMessageBox::Yes, QMessageBox::No)) {
case QMessageBox::Yes: // yes
getSite();
break;
case QMessageBox::No: // No
// exit
break;
}
}
}
/*
// get ftp list from web- parse it. */
void optionsDialog::getSite()
{
QString file_name;
QString ftp_listFileURL;
QString outputFile;
// outputFile = local_library+ "list.html";
outputFile = ListFile + "list.html";
QString networkUrl= "http://www.gutenberg.org/www/mirror.sites.html";
//http://www.gutenberg.org/index.html";
// QString networkUrl= "http://llornkcor.com/index.shtml";
// // "http://www.gutenberg.org/index.html"
//
//Qhttp stops working at times.... :(
// NetworkDialog *NetworkDlg;
// NetworkDlg = new NetworkDialog( this,"Network Protocol Dialog",TRUE,0,networkUrl,outputFile);
// if( NetworkDlg->exec() != 0 )
// { // use new, improved, *INSTANT* network-dialog-file-getterer
// odebug << "gitcha!" << oendl;
// }
// delete NetworkDlg;
//#ifdef Q_WS_QWS
// TODO qprocess here
QString cmd="wget -T 15 -O " +outputFile + " " + networkUrl + " 2>&1" ;
odebug << "Issuing the command "+cmd << oendl;
Output *outDlg;
outDlg = new Output( 0, tr("Downloading ftp sites...."),TRUE);
outDlg->showMaximized();
outDlg->show();
qApp->processEvents();
FILE *fp;
char line[130];
outDlg->OutputEdit->append( tr("Running wget") );
sleep(1);
fp = popen( (const char *) cmd, "r");
while ( fgets( line, sizeof line, fp)) {
outDlg->OutputEdit->append(line);
outDlg->OutputEdit->setCursorPosition(outDlg->OutputEdit->numLines() + 1,0,FALSE);
}
pclose(fp);
outDlg->close();
if(outDlg)
delete outDlg;
// outputFile=ListFile;
ftp_QListBox_1->clear();
parseFtpList( outputFile); // got the html list, now parse it so we can use it
}
bool optionsDialog::parseFtpList( QString outputFile)
{
// parse ftplist html and extract just the machine names/directories
// TODO: add locations!!
odebug << "parse ftplist "+outputFile << oendl;
QString ftpList, s_location;
QFile f( outputFile );
if( f.open( IO_ReadWrite )) {
QTextStream t( &f);
QString countryName;
bool b_gotchTest=false;
while ( !t.eof() ) {
QString s = t.readLine();
int start;
int end;
if( s.find( "FTP mirror sites for Project Gutenberg:", 0, TRUE) !=-1) { //lower end of this file
b_gotchTest = true;
}
if( b_gotchTest) {
if(( start = s.find( "ftp://", 0, TRUE))!=-1 ) {
end = s.find( "/\"", 0, TRUE);// ==-1)) {
if( end == -1) {
end = s.find( "\">");
}
ftpSite = s.mid( start, (end - start) );
if(ftpSite.right(1) != "/") {
// ftpSite += "/";
}
ftpSite=ftpSite.right( ftpSite.length()-6);
if( ftpSite.find("\n", 0, TRUE) )
ftpSite.remove( ftpSite.find("\n", 0, TRUE), 1);
if( ftpSite.find("\"", 0, TRUE) )
ftpSite.remove( ftpSite.find("\"", 0, TRUE), 1);
if( ftpSite.find("a>", 0, TRUE) )
ftpSite.remove( ftpSite.find("a>", 0, TRUE) -2, 4);
s = t.readLine();
s = t.readLine();
if(( start=s.find("<BR>(", 0, TRUE) ) != -1) {
// odebug << "" << s << "" << oendl;
end = s.find( ")", 0, TRUE)+1;
s_location= s.mid( start+4, (end - start) );
// odebug << "" << s_location << "" << oendl;
// ftpList += ftpSite + "\n";
// ftp_QListBox_1->sort( TRUE );
ftpList += s_location+ " "+ftpSite+"\n";
ftp_QListBox_1->sort( TRUE );
QString winbug=" ";
ftp_QListBox_1->insertItem ( s_location.latin1() +winbug+ftpSite);
// ftp_QListBox_1->insertItem ( ftpSite+" "+s_location.latin1());
}
// ftp_QListBox_1->insertItem ( ftpSite);
}
} // end find ftp://
} // end while loop
QFile f2( ListFile);
if(!f2.open( IO_ReadWrite | IO_Truncate))
QMessageBox::message( (tr("Note")), (tr("File not opened sucessfully.\n"+ListFile )) );
f2.writeBlock( ftpList, ftpList.length() );
f.close();
f2.close();
if( f.exists() )
f.remove();
} else {
QMessageBox::message( (tr("ftpSiteDlg")), (tr("List File not opened sucessfully." )) );
return false;
}
setActiveWindow();
return true;
}
void optionsDialog::openSiteList() {
odebug << " just opens the ftp site list" << oendl;
// ListFile = ( QDir::homeDirPath ()) +"/.gutenbrowser/ftpList";
QFile f( ListFile);
if(!f.open( IO_ReadWrite )) {
QMessageBox::message( (tr("Note")), (tr("File not opened sucessfully." )) );
} else {
QTextStream t( &f);
while ( !t.atEnd() ) {
QString ftpSite = t.readLine();
ftp_QListBox_1->sort( TRUE );
ftp_QListBox_1->insertItem ( ftpSite);
} // end while loop
f.close();
}
QListBoxItem *itemSel=0;
if( (itemSel=ftp_QListBox_1->findItem( ftp_host)) )
ftp_QListBox_1->setSelected( itemSel, true);
}
/*
List box clicked */
void optionsDialog::getSelection( QListBoxItem *item)
{
QString selctionStr;
selctionStr = item->text();
// selctionStr = ftp_QListBox_1->currentText();
// printf( selctionStr+"\n" );
select_site( selctionStr );
}
void optionsDialog::select_site( const char *index )
{
// ftp://ftp.datacanyon.com/pub/gutenberg/
s_site = index;
QString s_site2;
// if(s_site.find("(",0,TRUE))
s_site2=s_site.right( s_site.length()-(s_site.find(" ",0,TRUE)+4) );
odebug << "Selected ftp site is "+ s_site2 << oendl;
int i_ftp = s_site2.find("/", 0, FALSE);
ftp_host = s_site2.left(i_ftp );
ftp_base_dir = s_site2.right( s_site2.length() - i_ftp);
// config->read();
Config config("Gutenbrowser");
config.setGroup( "FTPsite" );
config.writeEntry("SiteName",ftp_host);
config.writeEntry("base",ftp_base_dir);
// config->write();
TextLabel3->setText( "Current ftp server:\n"+ftp_host /*+ ftp_base_dir*/ );
// optionsDialog::accept();
}
diff --git a/noncore/apps/opie-gutenbrowser/gutenbrowser.cpp b/noncore/apps/opie-gutenbrowser/gutenbrowser.cpp
index 644fae8..fac21da 100644
--- a/noncore/apps/opie-gutenbrowser/gutenbrowser.cpp
+++ b/noncore/apps/opie-gutenbrowser/gutenbrowser.cpp
@@ -1,1686 +1,1686 @@
/***************************************************************************
gutenbrowser.cpp - description
-------------------
begin : Mon Jul 24 22:33:12 MDT 2000
copyright : (C) 2000 -2004 by llornkcor
email : ljp@llornkcor.com
* 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. *
***************************************************************************/
// http search
// http://digital.library.upenn.edu/books/authors.html
// http://digital.library.upenn.edu/books/titles.html
// ftp://ibiblio.org/pub/docs/books/gutenberg/GUTINDEX.ALL
// donate@gutenberg.net
#include "editTitle.h"
#include "gutenbrowser.h"
#include "LibraryDialog.h"
//#include "bookmarksdlg.h"
#include "optionsDialog.h"
#include "helpme.h"
#include "NetworkDialog.h"
#include "openetext.h"
#include "output.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/qpeapplication.h>
#include <qpe/fontdatabase.h>
#include <qpe/config.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/mimetype.h>
#include <qpe/resource.h>
#include <qpe/applnk.h>
/* QT */
#include <qregexp.h>
#include <qregion.h>
#include <qpaintdevicemetrics.h>
#include <qvaluelist.h>
#include <qlabel.h>
#include <qclipboard.h>
#include <qpainter.h>
#include <qpalette.h>
#include <qobjectlist.h>
#include <qfontdialog.h>
#include <qtextview.h>
#include <qbrush.h>
#include <qfile.h>
#include <qfontinfo.h>
#include <qscrollview.h>
#include <qpoint.h>
/* STD */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
static const int nfontsizes = 9;
static const int fontsize[nfontsizes] = {8,9,10,11,12,13,14,18,24};
#ifdef NOQUICKLAUNCH
Gutenbrowser::Gutenbrowser()
Gutenbrowser();
#else
Gutenbrowser::Gutenbrowser(QWidget *,const char*, WFlags )
#endif
: QMainWindow()
{
// QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
// QCopEnvelope e("QPE/System", "grabKeyboard(QString)" );
// e << "";
// QPEApplication::grabKeyboard();
showMainList=TRUE;
working=false;
this->setUpdatesEnabled(TRUE);
// #ifndef Q_WS_QWS
QString msg;
msg="You have now entered unto gutenbrowser,\n";
msg+="make your self at home, sit back, relax and read something great.\n";
local_library = (QDir::homeDirPath ()) +"/Applications/gutenbrowser/";
setCaption("Gutenbrowser");// Embedded " VERSION);
this->setUpdatesEnabled(TRUE);
// bool firstTime=FALSE;
topLayout = new QVBoxLayout( this, 0, 0, "topLayout");
menu = new QHBoxLayout(-1,"menu");
buttons2 = new QHBoxLayout(-1,"buttons2");
edits = new QHBoxLayout(-1,"edits");
useSplitter=TRUE;
initConfig();
initMenuBar();
initButtonBar();
initStatusBar();
initView();
initSlots();
qDebug("init finished");
QPEApplication::setStylusOperation( mainList->viewport(),QPEApplication::RightOnHold);
connect( mainList, SIGNAL( mouseButtonPressed( int, QListBoxItem *, const QPoint &)),
this, SLOT( mainListPressed(int, QListBoxItem *, const QPoint &)) );
if( useIcons)
toggleButtonIcons( TRUE);
else
toggleButtonIcons( FALSE);
enableButtons(false);
Config config("Gutenbrowser"); // populate menubuttonlist
config.setGroup("General");
config.setGroup( "Files" );
QString s_numofFiles = config.readEntry("NumberOfFiles", "0" );
int i_numofFiles = s_numofFiles.toInt();
QString tempFileName;
for (int i = 0; i <= i_numofFiles; i++) {
// tempFileName.setNum(i);
config.setGroup( "Files" );
QString ramble = config.readEntry( QString::number(i), "" );
config.setGroup( "Titles" );
QString tempTitle = config.readEntry( ramble, "");
config.setGroup( tempTitle);
int index = config.readNumEntry( "LineNumber", -1 );
if( index != -1) {
odebug << tempTitle << oendl;
if(!tempTitle.isEmpty()) bookmarksMenu->insertItem( tempTitle);
}
}
// QString gutenIndex= local_library + "GUTINDEX.ALL";
- QString gutenIndex = QPEApplication::qpeDir()+ "/etc/gutenbrowser/GUTINDEX.ALL";
+ QString gutenIndex = QPEApplication::qpeDir()+ "etc/gutenbrowser/GUTINDEX.ALL";
qDebug("gutenindex "+gutenIndex );
if( QFile( gutenIndex).exists() ) {
indexLib.setName( gutenIndex);
} else {
- QString localLibIndexFile = QPEApplication::qpeDir()+ "/etc/gutenbrowser/PGWHOLE.TXT";
+ QString localLibIndexFile = QPEApplication::qpeDir()+ "etc/gutenbrowser/PGWHOLE.TXT";
// QString localLibIndexFile= local_library + "PGWHOLE.TXT";
newindexLib.setName( localLibIndexFile);
}
qDebug("attempting new library");
LibraryDlg = new LibraryDialog( this, "Library Index" /*, TRUE */);
loadCheck = false;
chdir(local_library);
if(!showMainList) {
Lview->setFocus();
// if(firstTime)
// Bookmark();
for (int i=1;i< qApp->argc();i++) {
qDebug("Suppose we open somethin");
if(!load(qApp->argv()[i])) return;
}
} else {
fillWithTitles();
mainList->setFocus();
// mainList->setCurrentItem(0);
}
writeConfig();
QTimer::singleShot( 250, this, SLOT(hideView()) );
} //end init
Gutenbrowser::~Gutenbrowser() {
// QPEApplication::grabKeyboard();
// QPEApplication::ungrabKeyboard();
odebug << "Exit" << oendl;
}
/*
Google.com search */
void Gutenbrowser::InfoBarClick() {
QString text;
if( Lview->hasSelectedText()) {
Lview->copy();
QClipboard *cb = QApplication::clipboard();
text = cb->text();
} else {
// text=title;
text=this->caption();
}
searchGoogle(text);
}
/*
download http with wget or preferred browser */
void Gutenbrowser::goGetit( const QString &url, bool showMsg) {
// int eexit=0;
QString cmd;
// config.read();
qApp->processEvents();
QString filename = QPEApplication::qpeDir();
if(filename.right(1)!="/")
filename+="/etc/gutenbrowser/";
else
filename+="etc/gutenbrowser/";
odebug << "filename "+filename << oendl;
// QString filename = QDir::homeDirPath()+"/Applications/gutenbrowser/";
filename += url.right( url.length() - url.findRev("/",-1,TRUE) -1);
Config config("Gutenbrowser");
config.setGroup( "Browser" );
QString brow = config.readEntry("Preferred", "Opera");
odebug << "Preferred browser is "+brow << oendl;
if(!showMsg) { //if we just get the gutenindex.all
cmd="wget -O " + filename +" " + url+" 2>&1" ;
chdir(local_library);
odebug << "Issuing the system command: " << cmd << "" << oendl;
Output *outDlg;
outDlg = new Output(this, tr("Gutenbrowser Output"),FALSE);
outDlg->showMaximized();
outDlg->show();
qApp->processEvents();
FILE *fp;
char line[130];
outDlg->OutputEdit->append( tr("Running wget") );
sleep(1);
fp = popen( (const char *) cmd, "r");
odebug << "Issuing the command\n"+cmd << oendl;
// system(cmd);
while ( fgets( line, sizeof line, fp)) {
outDlg->OutputEdit->append(line);
// outDlg->OutputEdit->setCursorPosition(outDlg->OutputEdit->numLines() + 1,0,FALSE);
}
pclose(fp);
outDlg->close();
if(outDlg)
delete outDlg;
} else {
if( brow == "Konq") {
cmd = "konqueror "+url+" &";
}
if( brow == "Opera") { //for desktop testing
cmd = "opera "+url+" &";
}
// if( brow == "Opera") { // on Zaurus
// cmd = "operagui "+url+" &";
// }
if( brow == "Mozilla") {
cmd = "mozilla "+url+" &";
}
if( brow == "Netscape") {
cmd = "netscape "+url+" &";
}
if(brow == "wget") {
// cmd="wget -q "+url+" &";
QString tempHtml=local_library+"webster.html";
cmd="wget -O "+tempHtml+" -q "+url;
}
chdir(local_library);
odebug << "Issuing the sys command: " << cmd << "" << oendl;
system(cmd);
}
}
void Gutenbrowser::toggleButtonIcons( bool useEm) {
QString pixDir;
if(useEm)
useEm=TRUE;
pixDir=QPEApplication::qpeDir()+"pics/gutenbrowser";
odebug << "Docdir is "+QPEApplication::documentDir() << oendl;
if( useIcons && QDir( pixDir).exists() ) {
LibraryButton->setPixmap( Resource::loadPixmap("home") ); //in inline
OpenButton->setPixmap( Resource::loadPixmap("gutenbrowser/openbook"));
ForwardButton->setPixmap( Resource::loadPixmap("forward"));//in inline
BackButton->setPixmap( Resource::loadPixmap("back") );//in inline
SearchButton->setPixmap( Resource::loadPixmap("gutenbrowser/search") );//in inline
lastBmkButton->setPixmap( Resource::loadPixmap("gutenbrowser/bookmark_folder"));
setBookmarkButton->setPixmap( Resource::loadPixmap("gutenbrowser/bookmark") );
dictionaryButton->setPixmap( Resource::loadPixmap("gutenbrowser/spellcheck") );
InfoBar->setPixmap( Resource::loadPixmap("gutenbrowser/google"));
}
}
bool Gutenbrowser::queryExit()
{
int exit=QMessageBox::information(this, "Quit...", "Do your really want to quit?",
QMessageBox::Ok, QMessageBox::Cancel);
if (exit==1) {
writeConfig();
qApp->quit();
} else {
};
return (exit==1);
}
// SLOT IMPLEMENTATION
void Gutenbrowser::slotFilePrint() {
}
void Gutenbrowser::ByeBye() {
if (b_queryExit)
queryExit();
else {
// writeConfig();
qApp->quit();
}
}
void Gutenbrowser::HelpBtn() {
HelpMe* HelpDlg;
HelpDlg = new HelpMe( this, "Help Dialog");
HelpDlg->showMaximized();
}
void Gutenbrowser::DownloadIndex() {
#ifndef Q_WS_QWS
{
switch( QMessageBox::information( 0, (tr("Download Library Index, or FTP sites?")),
(tr("Do you want to download the newest\n"
"Project Gutenberg Library Index?\n"
"or select an ftp site?\n")),
(tr("&Library Index")), (tr("&Ftp Site")), (tr("&Cancel")), 2, 2 ) )
{
case 0: // index clicked,
downloadLibIndex();
break;
case 1: // ftp selected
downloadFtpList();
break;
case 2: // Cancel
break;
};
}
#endif
} // end DownloadIndex
void Gutenbrowser::downloadFtpList() {
// QString cmd="wget http://www.promo.net/pg/list.html");
//system(cmd);
qApp->processEvents();
optionsDialog* optDlg;
optDlg = new optionsDialog( this,"Options_Dlg", true);
optDlg->getSite();
if(optDlg)
delete optDlg;
}
void Gutenbrowser::downloadLibIndex() {
// QString dwmloader = local_library + "pgwhole.zip";
// QString cmd = "lynx -source http://www.gutenberg.net/pgwhole.zip | cat >> " + dwmloader;
// system(cmd);
// QString outputFile= local_library+ "GUTINDEX.ALL";
// config.setGroup( "FTPsite" ); // ftp server config
// ftp_host=config.readEntry("SiteName", "");
// ftp_base_dir= config.readEntry("base", "");
// QString networkUrl= "ftp://"+ftp_host+ftp_base_dir+"/GUTINDEX.ALL";
QDir dir( local_library);
dir.cd("", TRUE);
goGetit( "http://sailor.gutenberg.org/GUTINDEX.ALL", false); // until ghttp works on binaries -qt3
// goGetit( "http://www.gutenberg.net/pgwhole.zip", true); // until ghttp works on binaries -qt3
// NetworkDialog *NetworkDlg;
// NetworkDlg = new NetworkDialog( this,"Network Protocol Dialog", TRUE, 0, networkUrl, outputFile );
// if( NetworkDlg->exec() != 0 )
// { // use new, improved, *INSTANT* network-dialog-file-getterer
//// QMessageBox::message("Note","");
// }
// if(NetworkDlg)
// delete NetworkDlg;
}
void Gutenbrowser::PrintBtn() {
}
void Gutenbrowser::SearchBtn() {
if( loadCheck) {
odebug << "loadCheck: we have a loaded doc" << oendl;
Search();
}
// else
// QMessageBox::message("Note","Sorry, can't search. No etext is loaded");
}
void Gutenbrowser::ForwardBtn() {
if( !ForwardButton->autoRepeat() && !ForwardButton->isDown()) {
QString s;
QString insertString;
int pageSize= Lview->PageSize();
Lview->clear();
for(int fd=0; fd < pageSize - 1;fd++) {
f.readLine(s, 256);
if(useWrap)
s.replace(QRegExp("\n"),"");
insertString+=s;
Lview->insertLine( s, -1);
// odebug << s << oendl;
currentLine++;
}
// Lview->insertAt( insertString,0,0, FALSE);
currentFilePos = f.at();
// if( i_pageNum != pages) {
// Lview->MultiLine_Ex::pageDown( FALSE);
i_pageNum++;
pageStopArray.resize(i_pageNum + 1);
// int length = Lview->length();
pageStopArray[i_pageNum ] = currentFilePos;
odebug << currentFilePos << " current page is number " << i_pageNum
<< ", pagesize " << pageSize << ", length " << Lview->length()
<< ", current " << pageStopArray[i_pageNum] << oendl;
setStatus();
// Lview->setCursorPosition( 0, 0, FALSE);
// }
} else {
odebug << "bal" << oendl;
// if( i_pageNum != pages) {
// // int newTop = Lview->Top();
// // if(Lview->lastRow() > i)
// Lview->ScrollUp(1);
// // i_pageNum++;
// setStatus();
// Lview->setCursorPosition( Lview->Top(), 0, FALSE);
// }
}
Lview->setFocus();
odebug << "page number " << i_pageNum << " line number " << currentLine << "" << oendl;
}
void Gutenbrowser::BackBtn() {
if( i_pageNum > 0) {
int pageSize= Lview->PageSize();
// int length=Lview->length();
i_pageNum--;
currentFilePos = f.at();
odebug << currentFilePos << " move back to " << pageStopArray[i_pageNum - 1 ]
<< ", current page number " << i_pageNum
<< ", " << pageSize << ", length " << Lview->length() << oendl;
if( i_pageNum < 2) {
f.at( 0);
} else {
if(!f.at( pageStopArray[i_pageNum - 1] ))
odebug << "File positioned backward did not work" << oendl;
}
QString s;
// int sizeLine=0;
Lview->clear();
// QString insertString;
for(int fd = 0; fd < pageSize ;fd++) {
// Lview->removeLine( Lview->PageSize() );
f.readLine(s, 256);
if(useWrap)
s.replace(QRegExp("\n"),"");
currentLine++;
// insertString+=s;
Lview->insertLine( s, -1);
}
// Lview->insertAt( insertString,0,0, FALSE);
if( !BackButton->autoRepeat() && !BackButton->isDown()) {
QString topR;
QString lastR;
QString pageR;
// int sizer = Lview->lastRow() - Lview->topRow();
// int i_topRow = Lview->topRow();
if( i_pageNum < 1)
i_pageNum = 1;
setCaption(QString::number(i_pageNum));
} else {
// int newTop = Lview->Top();
// if(Lview->lastRow() > i)
Lview->MultiLine_Ex::pageUp( FALSE);
// Lview->ScrollDown(1);
// i_pageNum--;
if( i_pageNum < 1)
i_pageNum = 1;
setStatus();
// Lview->setCursorPosition( Lview->Top(), 0, FALSE);
}
}
Lview->setFocus();
}
void Gutenbrowser::doBeginBtn() {
if(loadCheck) {
qApp->processEvents();
BeginBtn();
}
}
// moves text to the very top = 0
void Gutenbrowser::TopBtn() {
if(loadCheck) {
if( i_pageNum != 0) {
odebug << "top" << oendl;
qApp->processEvents();
currentLine = 0;
i_pageNum = 1;
int pageSize = Lview->PageSize() ;
Lview->clear();
QString s;
f.at(0);
for(int fd=0; fd < pageSize ;fd++) {
f.readLine(s, 256);
if(useWrap)
s.replace(QRegExp("\n"),"");
Lview->insertLine(s ,-1);
currentLine++;
}
// Lview->setCursorPosition( 0,0, FALSE);
i_pageNum=1;
setStatus();
}
Lview->setFocus();
}
}
//moves text to the start of the EText
void Gutenbrowser::BeginBtn() {
i_pageNum = 1;
currentLine = 0;
QString s_pattern="*END*THE SMALL PRINT";
QString sPattern2 = "*END THE SMALL PRINT";
int pageSize = Lview->PageSize();
Lview->clear();
// int lines = Lview->numLines();
int pos = 0;//, i = 0;
int i_topRow = Lview->topRow();
QString LeftText;// = Lview->text();
// int linesPerPage = Lview->lastRow() - Lview->topRow();
// int pages = (( linesPerPage / Lview->editSize() ) ) +1;
// int pageN = 0;
i_pageNum = 1;
int lastPage=1;
int lineNo=0;
QString s;
f.at( 0);
while ( !f.atEnd() ) {
f.readLine(s, 256);
lineNo++;
LeftText = s;
currentFilePos = f.at();
i_pageNum = lineNo/pageSize;
if(lastPage < i_pageNum) {
pageStopArray.resize(i_pageNum + 1);
pageStopArray[i_pageNum ] = currentFilePos;
// odebug << "new page number " << i_pageNum << ", found at " << currentFilePos << "" << oendl;
}
// lastPage = i_pageNum;
if( LeftText.find( s_pattern, 0 , TRUE) != -1 || LeftText.find( sPattern2, 0 , TRUE) != -1 ) {
odebug << "<<<<<< FOUND IT!! new page number " << i_pageNum << ", found at " << currentFilePos << "" << oendl;
break;
}
}
if(f.atEnd()) //in case we didnt find anything, we need to show something
f.at(0);
Lview->clear();
for(int fd=0; fd < pageSize - 1;fd++) {
f.readLine(s, 256);
if(useWrap)
s.replace(QRegExp("\n"),"");
Lview->insertLine( s, -1);
currentLine++;
}
i_pageNum = lineNo/pageSize;
pageStopArray.resize(i_pageNum + 1);
// int length = Lview->length();
qApp->processEvents();
if( pos > i_topRow ) {
// Lview->setCursorPosition( pos+linesPerPage+2/* - i_topRow+3 */,0, FALSE);
} else {
// Lview->setCursorPosition( pos+2 , 0, FALSE );
}
Lview->deselect();
// AdjustStatus();
Lview->setFocus();
}
/*
sets the current page and place as a bookmark*/
void Gutenbrowser::setBookmark() {
int eexit=QMessageBox::information(this, "Note",
"Do you really want to \nset this bookmark?."
,QMessageBox::Yes, QMessageBox::No);
if (eexit== 3) {
currentFilePos = f.at();
Config cfg("Gutenbrowser");
cfg.setGroup("General");
file_name = cfg.readEntry("Current","");
qApp->processEvents();
odebug << "Setting book mark "+file_name << oendl;
cfg.setGroup("Titles");
title = cfg.readEntry(file_name,"");
odebug << "title is "+ title << oendl;
cfg.setGroup( "Bookmarks" );
cfg.writeEntry("File Name",file_name);
cfg.writeEntry("Page Number",QString::number(i_pageNum) );
cfg.writeEntry( "PagePosition", QString::number( pageStopArray[i_pageNum - 1]));
cfg.writeEntry("Title", title);
int row = Lview->topRow();// Lview->Top();
cfg.writeEntry("LineNumber",QString::number(row) );
cfg.setGroup(title);
cfg.writeEntry("File Name",file_name);
cfg.writeEntry( "LineNumber", QString::number( row));
cfg.writeEntry( "PagePosition", QString::number( pageStopArray[i_pageNum - 1]));
cfg.writeEntry( "Page Number", QString::number( i_pageNum) );
cfg.write();
bookmarksMenu->insertItem( title);
}
} //end setBookmark
/* goes to last set bookmark*/
void Gutenbrowser::Bookmark( int itemId) {
// qApp->processEvents();
Config config("Gutenbrowser");
config.setGroup( "Bookmarks" );
odebug << "<<<<<< " << Lview->PageSize() << ", " << Lview->lastRow() - Lview->topRow() << "" << oendl;
QString itemString;
odebug << "menu item " << itemId << "" << oendl;
QString tempTitle;
QString s_Bmrkrow;
QString s_pageNum;
int Bmrkrow=0;
int bookmarkPosition = 0;
// qApp->processEvents();
config.setGroup( "Bookmarks" );
title = config.readEntry("Title", "");
file_name = config.readEntry("File Name", "");
i_pageNum = config.readNumEntry("Page Number", 0);
bookmarkPosition = config.readNumEntry( "PagePosition",0);
Bmrkrow = config.readNumEntry("LineNumber",0);
if( !file_name.contains("/")) {
file_name = local_library + file_name;
}
// getTitle(file_name);
// qApp->processEvents();
// Lview->setFocus();
this->setFocus();
Lview->clear();
if(!load(file_name)) return;
int pageSize = Lview->PageSize();
f.at(0);
// Lview->clear();
QString s;
int lineNo=0;
int lastPage=1;
while ( !f.atEnd() ) {
f.readLine(s, 256);
lineNo++;
currentFilePos = f.at();
i_pageNum = lineNo/pageSize;
if(lastPage < i_pageNum) {
pageStopArray.resize(i_pageNum + 1);
pageStopArray[i_pageNum ] = currentFilePos;
// odebug << "new page number " << i_pageNum << ", found at " << currentFilePos << "" << oendl;
}
if(currentFilePos == bookmarkPosition)
break;
}
if(f.atEnd())
f.at(0);
else
f.at( bookmarkPosition);
for(int fd=0; fd < pageSize - 1;fd++) {
f.readLine(s, 256);
lineNo++;
if(useWrap)
s.replace(QRegExp("\n"),"");
Lview->insertLine( s, -1);
currentLine++;
}
i_pageNum = lineNo/pageSize;
pageStopArray.resize(i_pageNum + 1);
if(showMainList) {
showMainList=FALSE;
mainList->hide();
Lview->show();
// qApp->processEvents();
}
odebug << "bookmark loaded" << oendl;
setCaption(title);
}
bool Gutenbrowser::load( const char *fileName) {
// QCopEnvelope ( "QPE/System", "busy()" );
odebug << "Title is already set as "+title << oendl;
odebug << "sizeHint " << sizeHint().height() << " pageSize " << Lview->PageSize() << "" << oendl;
// pointSize = Lview->fontInfo().pointSize();
// odebug << "sizeHint " << sizeHint().height() << " point size " << pointSize << "" << oendl;
if( Lview->PageSize() < 4) {
// Lview->setMaximumHeight( sizeHint().height() );
Lview->setMinimumHeight( sizeHint().height() );
pointSize = Lview->fontInfo().pointSize();
odebug << "sizeHint " << sizeHint().height() << " point size " << pointSize << "" << oendl;
if(pointSize < 15)
Lview->setFixedVisibleLines(19);
else
Lview->setFixedVisibleLines( ( (sizeHint().height() / pointSize ) * 2) -2);
}
Config cfg("Gutenbrowser");
cfg.setGroup("General");
cfg.writeEntry("Current",fileName);
cfg.write();
currentLine=0;
file_name=fileName;
QString o_file = fileName;
// if (i_pageNum < 1) {
i_pageNum = 1;
// }
odebug << "ready to open "+o_file << oendl;
if(f.isOpen()) f.close();
f.setName( o_file);
if ( !f.open( IO_ReadOnly)) {
QMessageBox::message( (tr("Note")), (tr("File not opened sucessfully.\n" +o_file)) );
return false;
}
currentFilePos = 0;
pageStopArray.resize(3);
pageStopArray[0] = currentFilePos;
fileHandle = f.handle();
QString insertString;
QTextStream t(&f);
QString s;
for(int fd=0; fd < Lview->PageSize() ;fd++) {
s=t.readLine();
// insertString+=s;
if(useWrap)
s.replace(QRegExp("\n"),"");
// s.replace(QRegExp("\r"),"");
Lview->insertLine( s,-1);
currentLine++;
}
// int length = Lview->length();
currentFilePos = f.at();
pageStopArray[1] = currentFilePos;
odebug << "<<<<<<<<<<<" << currentFilePos << " current page is number " << i_pageNum
<< ", length " << Lview->length() << ", current " << pageStopArray[i_pageNum]
<< ", pageSize " << Lview->PageSize() << oendl;
Lview->setMaxLines(Lview->PageSize()*2);
// odebug << "Gulped " << currentLine << "" << oendl;
setCaption(title);
Lview->setAutoUpdate( TRUE);
// Lview->setCursorPosition(0,0,FALSE);
// pages = (int)(( Lview->numLines() / Lview->editSize() ) / 2 ) +1;
//odebug << "number of pages " << pages << "" << oendl;
loadCheck = true;
enableButtons(true);
if( donateMenu->count() == 3) {
donateMenu->insertItem("Current Title", this, SLOT( InfoBarClick() ));
}
Lview->setFocus();
// QCopEnvelope("QPE/System", "notBusy()" );
return true;
} // end load
void Gutenbrowser::Search() {
// if( searchDlg->isHidden())
{
odebug << "Starting search dialog" << oendl;
searchDlg = new SearchDialog( this, "Etext Search", true);
searchDlg->setCaption( tr( "Etext Search" ));
// searchDlg->setLabel( "- searches etext");
connect( searchDlg,SIGNAL( search_signal()),this,SLOT( search_slot()));
connect( searchDlg,SIGNAL( search_done_signal()),this,SLOT( searchdone_slot()));
QString resultString;
QString string = searchDlg->searchString;
Lview->deselect();
searchDlg->show();
searchDlg->result();
}
}
void Gutenbrowser::search_slot( ) {
int line, col;
if (!searchDlg /*&& !loadCheck */)
return;
Lview->getCursorPosition(&line,&col);
QString to_find_string=searchDlg->get_text();
// searchDlg->get_direction();// is true if searching backward
if ( last_search != 0 && searchDlg->get_direction() ){
col = col - pattern.length() - 1 ;
}
again:
int result = doSearch( to_find_string , /* searchDlg->case_sensitive()*/ TRUE, searchDlg->forward_search(), line, col);
if(result == 0){
if(!searchDlg->get_direction()){ // forward search
int query = QMessageBox::information( searchDlg, "Find",
"End of document reached.\nContinue from the beginning?",
"Yes", "No", "", 0,1);
if (query == 0){
line = 0;
col = 0;
goto again;
}
} else { //backward search
int query = QMessageBox::information( searchDlg, "Find",
"End of document reached.\nContinue from the beginning?",
"Yes", "No", "", 0,1);
if (query == 0){
QString string = Lview->textLine( Lview->numLines() - 1 );
line = Lview->numLines() - 1;
lineCheck = line;
col = string.length();
last_search = -1; //BACKWARD;
goto again;
}
}
} else {
//// emit CursorPositionChanged(); textLine
}
}
int Gutenbrowser::doSearch( const QString &s_pattern , bool case_sensitive, bool forward, int line, int col ) {
int i, length;
int pos = -1;
if(forward) {
QString string;
for(i = line; i < Lview->numLines(); i++) {
string = Lview->textLine(i);
pos = string.find(s_pattern, i == line ? col : 0, case_sensitive);
if( pos != -1) {
int top = Lview->Top();
length = s_pattern.length();
if( i > Lview->lastRow() ) {
// Lview->setCursorPosition(i,pos,FALSE);
for(int l = 0 ; l < length; l++) {
Lview->cursorRight(TRUE);
}
// Lview->setCursorPosition( i , pos + length, TRUE );
int newTop = Lview->Top();
if(Lview->lastRow() > i)
Lview->ScrollUp( newTop - top);
// AdjustStatus();
} else {
// Lview->setCursorPosition(i,pos,FALSE);
for(int l = 0 ; l < length; l++) {
Lview->cursorRight(TRUE);
}
// Lview->setCursorPosition( i , pos + length, TRUE );
// AdjustStatus();
}
pattern = s_pattern;
last_search = 1; //FORWARD;
return 1;
}
}
} else { //////////////// searching backwards
QString string;
for( i = line; i >= 0; i--) {
string = Lview->textLine(i);
int line_length = string.length();
pos = string.findRev(s_pattern, line == i ? col : line_length , case_sensitive);
if (pos != -1) {
// int top = Lview->Top();
length = s_pattern.length();
if( i < Lview->Top() ) {
Lview->ScrollDown( Lview->PageSize() );
Lview->MultiLine_Ex::pageUp( FALSE );
if( ! (line == i && pos > col ) ) {
// Lview->setCursorPosition( i ,pos ,FALSE );
for(int l = 0 ; l < length; l++) {
Lview->cursorRight(TRUE);
}
// Lview->setCursorPosition(i ,pos + length ,TRUE );
// int newTop = Lview->Top();
/* if(useSplitter) Rview->ScrollUp( newTop - top);
*/ }
} else {
if( ! (line == i && pos > col ) ) {
// Lview->setCursorPosition( i, pos, FALSE );
for( int l = 0 ; l < length; l++) {
Lview->cursorRight( TRUE);
}
// Lview->setCursorPosition( i, pos + length, TRUE );
}
pattern = s_pattern;
last_search = -1;
return 1;
}
}
}
}
return 0;
}
void Gutenbrowser::LibraryBtn() {
QString newestLibraryFile ="pgwhole.zip";
QString zipFile;
// odebug << "Local Library is " << local_library << " " << oendl;
zipFile="/usr/bin/unzip";
// odebug << "newestLibraryFile is " << newestLibraryFile << " " << oendl;
if( QFile::exists( local_library+newestLibraryFile)) {
if( QFile::exists(zipFile) ) {
UnZipIt(newestLibraryFile);
}
else
QMessageBox::message( "Note",( tr("Please install unzip")) );
}
// LibraryDlg = new LibraryDialog( this, "Library Index");
LibraryDlg->setCaption( tr( "Gutenberg Library"));
Config config("Gutenbrowser");
config.setGroup("General");
if(useSplitter)
LibraryDlg->useSmallInterface=FALSE;
LibraryDlg->showMaximized();
if( LibraryDlg->exec() != 0 ) {
listItemNumber = LibraryDlg->DlglistItemNumber;
listItemFile = LibraryDlg->DlglistItemFile;
listItemYear = LibraryDlg->DlglistItemYear;
listItemTitle = LibraryDlg->DlglistItemTitle;
file_name = LibraryDlg->File_Name;
// odebug << "title is being set as "+title << oendl;
title = listItemTitle;
// config.setGroup( "Proxy" );
// if( LibraryDlg->checked == 1) {
// config.writeEntry("IsChecked", "TRUE");
// } else {
// config.writeEntry("IsChecked", "FALSE");
// }
// config.write();
// config.read();
if ( listItemNumber.isNull()) {
} else {
i_pageNum = 1;
if( file_name !="Error" && file_name.length() >2 && !file_name.isEmpty() ) {
//replace .zip with txt for opening it.
// printf("\nFile name is now\n");
// printf(file_name);
// printf("\n");
//
if( file_name.find(".zip"))
{
odebug << "Found zip file\n" << oendl;
// QStringList args;
// args="unzip";
// args+="-o";
// args+=local_library+file_name;
// args+="-d";
// args+=local_library;
QString cmd = "/usr/bin/unzip -o " + local_library+file_name + " -d " + local_library;
odebug << "Issuing the command "+ cmd << oendl;
// unzipProc=new QProcess( this, "unzipProc" ); /// fark that idea!
// unzipProc->start();
system(cmd);
remove( file_name);
}
// //
// file_name = file_name.left(4)+ ".txt";
if( LibraryDlg)
delete LibraryDlg;
setTitle();
// QCopEnvelope ( "QPE/System", "busy()" );
if( !load( file_name)) return;
} else {
printf("Not opening the file.\n");
}
}
}
if(showMainList) {
if(!Lview->isHidden())
Lview->hide();
qApp->processEvents();
showMainList=TRUE;
if(mainList->isHidden())
mainList->show();
fillWithTitles();
qApp->processEvents();
} else
setCentralWidget( Lview);
// QPEApplication::grabKeyboard();
// fixKeys();
}
void Gutenbrowser::OpenBtn() {
QString s_temp;
s_temp = status;
OpenEtext* OpenDlg;
OpenDlg = new OpenEtext(this,"OpenDlg");
OpenDlg->showMaximized();
if( OpenDlg->exec() != 0) {
title = OpenDlg->openFileTitle;
odebug << "title open as "+title << oendl;
file_name = OpenDlg->file;
i_pageNum = 1;
if( !file_name.isEmpty() || file_name.length() > 2 ) {
if(showMainList) {
showMainList=FALSE;
odebug << "ShowMainList is now false" << oendl;
mainList->hide();
Lview->show();
qApp->processEvents();
}
Lview->clear();
// QCopEnvelope ( "QPE/System", "busy()" );
if(!load(file_name)) return;
} else {
odebug << "file_name is empty!" << oendl;
if(showMainList) {
if(!Lview->isHidden())
Lview->hide();
qApp->processEvents();
if(mainList->isHidden())
mainList->show();
fillWithTitles();
qApp->processEvents();
}
}
}
if( OpenDlg)
delete OpenDlg;
/*
Config config("Gutenbrowser");
config.setGroup( title);
file_name = config.readEntry("File Name", "");
i_pageNum = config.readNumEntry("Page Number", -1);
int Bmrkrow = config.readNumEntry("LineNumber", -1);
if(Bmrkrow > -1) {
if( Bmrkrow > Lview->topRow() ) {
Lview->setCursorPosition( Bmrkrow ,0, FALSE );
Lview->ScrollUp( Bmrkrow - Lview->topRow() );
// AdjustStatus();
}
else if( Bmrkrow < Lview->topRow() ) {
Lview->setCursorPosition( Lview->topRow() - Bmrkrow ,0, FALSE );
Lview->ScrollDown( Lview->topRow() - Bmrkrow );
// AdjustStatus();
}
}
*/
// ResizeEdits();
}
void Gutenbrowser::ChangeFont() {
#ifndef Q_WS_QWS
bool ok;
weight= Lview->fontInfo().weight();
italic = Lview->fontInfo().italic();
bold=Lview->fontInfo().bold();
pointSize= Lview->fontInfo().pointSize();
fontStr=Lview->fontInfo().family();
if(italic == true)
italicStr="TRUE";
else
italicStr="FALSE";
QFont currentfont( fontStr, pointSize, weight, italic );
if (ok) {
QFontInfo fontInfo(font );
fontStr=fontInfo.family();
pointSize= fontInfo.pointSize();
font.setFontSize(pointSize);
pointSizeStr.setNum( pointSize);
weight= fontInfo.weight();
weightStr.setNum( weight);
italic =fontInfo.italic();
bold=fontInfo.bold();
if(italic == true)
italicStr="TRUE";
else
italicStr="FALSE";
if(bold == true)
boldStr="TRUE";
else
boldStr="FALSE";
pointSizeStr.setNum( pointSize);
config.setGroup( "Font" );
config.writeEntry("Family", fontStr );
config.writeEntry("Size", pointSizeStr );
config.writeEntry("Weight", weightStr );
config.writeEntry("Italic", italicStr );
config.writeEntry("Bold", boldStr );
// config.write();
Lview->setFont(font);
QRect lRect;
QRect rRect;
lRect = Lview->rect();
if(useSplitter) {
}
// if(loadCheck) {
// ResizeEdits();
// }
update();
}
#endif
}
/*
performs dictionary look ups on the web */
void Gutenbrowser::LookupBtn() {
QString text;
if( Lview->hasSelectedText()) {
Lview->copy();
}
QClipboard *cb = QApplication::clipboard();
text = cb->text();
int eexit=QMessageBox::information(this,
"Note","Do you want to lookup\n\""+text+"\"\non websters web dictionary?",
QMessageBox::Yes, QMessageBox::No);
if (eexit== 3) {
// this link for sale!!
qApp->processEvents();
goGetit( "http://www.m-w.com/cgi-bin/dictionary?" + text, true);
}
}
void Gutenbrowser::ClearEdit() {
Lview->setText("");
loadCheck = false;
status = ( tr("Gutenbrowser"));
InfoBar->setText( "");
setCaption( tr("Gutenbrowser"));
i_pageNum = 0;
enableButtons(false);
if(!showMainList) {
Lview->hide();
showMainList=TRUE;
mainList->show();
fillWithTitles();
qApp->processEvents();
}
if(donateMenu->idAt(3) != -1)
donateMenu->removeItemAt(3);
}
bool Gutenbrowser::getTitle( const char *file ) {
QString s_file;
QString filer = file;
if( filer.contains(local_library, TRUE)) {
QFileInfo f(file);
s_file = f.fileName();
} else {
s_file = filer;
}
Config config("Gutenbrowser");
config.setGroup( "Files" );
QString s_numofFiles = config.readEntry("NumberOfFiles", "0" );
int i_numofFiles = s_numofFiles.toInt();
for (int i = 1; i <= i_numofFiles; i++) {
QString temp;
temp.setNum(i);
QString ramble = config.readEntry(temp, "" );
if( strcmp(ramble, s_file) == 0) {
config.setGroup( "Titles" );
title = config.readEntry(ramble, "");
// odebug << "(getTitle)title is being set as "+title << oendl;
}
}
return true;
}
void Gutenbrowser::searchdone_slot() {
// if (!searchDlg)
// return;
// searchDlg->hide();
// Lview->setFocus();
this->setFocus();
last_search = 0;
// ResizeEdits();
}
/*
sets the status message */
bool Gutenbrowser::setStatus() {
#ifndef Q_WS_QWS
QString s_pages;
s_pages.setNum( pages);
QString chNum;
statusTop = status.left( status.find(" ", TRUE) );
status.append(chNum.setNum( i_pageNum));
status += " / " + s_pages;
if(loadCheck) {
statusBar->message( status);
InfoBar->setText( title);
} else {
}
#else
QString msg;
msg.sprintf(title+" %d", i_pageNum);
setCaption( msg);
#endif
return true;
}
void Gutenbrowser::keyReleaseEvent( QKeyEvent *e) {
switch ( e->key() ) {
case Key_M:
// Bookmark();
break;
case Key_D:
DownloadIndex();
break;
case Key_L:
LibraryBtn();
break;
case Key_O:
OpenBtn();
break;
case Key_F:
ForwardBtn();
break;
case Key_B:
BackBtn();
break;
case Key_P:
PrintBtn();
break;
case Key_S:
SearchBtn();
break;
case Key_E:
ByeBye();
break;
case Key_R:
// setBookmark();
break;
case Key_T:
ChangeFont();
break;
case Key_C:
ClearEdit();
break;
case Key_H:
HelpBtn();
break;
case Key_K:
LookupBtn();
break;
case Key_U:// hide menu
if(menubar->isHidden() )
menubar->show();
else
menubar->hide();
break;
case Key_I:
hideButtons();
break;
////////////////////////////// Zaurus keys
case Key_Home:
// BeginBtn();
break;
case Key_F9: //activity
OpenBtn();
break;
case Key_F10: //contacts
hideButtons();
break;
case Key_F11: //menu
if(menubar->isHidden() )
menubar->show();
else
menubar->hide();
break;
case Key_F12: //home
BeginBtn();
break;
case Key_F13: //mail
LibraryBtn();
break;
case Key_Space:
if(loadCheck)
ForwardBtn();
// else
// Bookmark();
break;
case Key_Down:
if(loadCheck) {
// if( !e->isAutoRepeat() )
// AdjustStatus();
// } else {
// LibraryBtn();
// ForwardBtn();
}
// ForwardButton->setFocus();
// Lview->setFocus();
// if(s_Wrap=="FALSE")
// Lview->MultiLine_Ex::ScrollDown( 1);
// LibraryBtn();
break;
case Key_Up:
if(loadCheck) {
// if( !e->isAutoRepeat() )
// AdjustStatus();
// } else {
// OpenBtn();
// BackBtn();
}
// BackButton->setFocus();
// Lview->setFocus();
// if(s_Wrap=="FALSE")
// Lview->MultiLine_Ex::ScrollUp( 1);
// LibraryBtn();
break;
case Key_Right:
ForwardButton->setFocus();
ForwardBtn();
// LibraryBtn();
break;
case Key_Left:
BackBtn();
BackButton->setFocus();
// OpenBtn();
break;
case Key_Escape:
ByeBye();
break;
case Key_PageUp:
BackBtn();
break;
case Key_PageDown:
ForwardBtn();
break;
////////////////////////////// Zaurus keys
};
}
void Gutenbrowser::keyPressEvent( QKeyEvent *e) {
switch ( e->key() ) {
// case Key_Next:
// ForwardBtn();
// break;
// case Key_Prior:
// BackBtn();
// break;
// case Key_Space:
// ForwardBtn();
// break;
// case Key_Down:
// Lview->MultiLine_Ex::ScrollUp( 1);
// if(useSplitter) Rview->MultiLine_Ex::ScrollUp( 1);
// break;
// case Key_Up:
// if( Lview->Top() != 0) {
// Lview->MultiLine_Ex::ScrollDown( 1);
// if(useSplitter) Rview->MultiLine_Ex::ScrollDown( 1);
// }
// break;
}
}
void Gutenbrowser::resizeEvent( QResizeEvent *ev) {
// odebug << "resize: " << ev->size().width() << "," << ev->size().height() << "\n" << oendl;
if( !LibraryDlg->isHidden())
LibraryDlg->resize(ev->size().width(),ev->size().height() );
// if( loadCheck == true) {
// ResizeEdits();
// AdjustStatus();
// }
}
void Gutenbrowser::doOptions() {
optionsDialog* optDlg;
optDlg = new optionsDialog( this,"Options_Dlg", true);
QString Ddir;
Config config("Gutenbrowser");
config.setGroup( "General" );
QFont myFont;
optDlg->showMaximized();
if( optDlg->exec() !=0) {
qApp->processEvents();
brow=optDlg->browserName;
toggleButtonIcons( optDlg->useIcon);
ftp_host= optDlg->ftp_host;
ftp_base_dir= optDlg->ftp_base_dir;
brow=optDlg->browserName;
Ddir=optDlg->downloadDirEdit->text();
odebug << "writing library config" << oendl;
Config config("Gutenbrowser");
config.setGroup("General");
QString dirname= optDlg->downloadDirEdit->text();
if(dirname.right(1)!="/")
dirname+="/";
config.writeEntry( "DownloadDirectory",dirname);
QDir newDir( optDlg->downloadDirEdit->text());
if( !newDir.exists() ) {
int exit=QMessageBox::information(this, "Note", "Ok, to make a new directory\n"+Ddir+" ?",
QMessageBox::Ok, QMessageBox::Cancel);
if (exit==1) {
QString cmd="mkdir -p ";
cmd+=Ddir.latin1();
system(cmd);
odebug << "Making new dir "+cmd << oendl;
if(Ddir.right(1)!="/") {
Ddir+="/";
}
config.writeEntry("DownloadDirectory",Ddir);
}
}
// if(optDlg->styleChanged)
// setStyle( optDlg->styleInt);
if(optDlg->b_qExit==TRUE)
b_queryExit=TRUE;
else
b_queryExit=FALSE;
if(optDlg->fontDlg-> changedFonts) {
odebug << "Setting font" << oendl;
myFont=optDlg->fontDlg->selectedFont;
Lview->setFont( myFont);
}
if(optDlg->useWordWrap_CheckBox->isChecked() ) {
odebug << "WORD WRAP is set" << oendl;
Lview->setWordWrap(QMultiLineEdit::WidgetWidth);
useWrap=true;
} else {
odebug << "Word wrap is NOT set" << oendl;
Lview->setWordWrap(QMultiLineEdit::NoWrap);
useWrap=false;
}
}
if(showMainList) {
if(!Lview->isHidden())
Lview->hide();
qApp->processEvents();
if(mainList->isHidden())
mainList->show();
fillWithTitles();
} else {
Lview->show();
showMainList=FALSE;
mainList->hide();
}
qApp->processEvents();
update();
}
bool Gutenbrowser::setTitle() {
if( file_name.contains( local_library)) {
QFileInfo f( file_name);
QString s_file = f.fileName();
file_name = s_file;
}
int test = 0;
Config config("Gutenbrowser");
config.setGroup( "Files" );
QString s_numofFiles = config.readEntry("NumberOfFiles", "0" );
int i_numofFiles = s_numofFiles.toInt();
for (int i = 1; i <= i_numofFiles; i++) {
QString temp;
temp.setNum(i);
QString ramble = config.readEntry(temp, "" );
if( strcmp(ramble, file_name) == 0) {
test = 1;
}
}
if (test == 0) {
config.writeEntry("NumberOfFiles",i_numofFiles +1 );
QString interger;
interger.setNum( i_numofFiles +1);
config.writeEntry(interger, file_name);
config.setGroup( "Titles" );
config.writeEntry(file_name,listItemTitle);
}
test = 0;
// config.write();
return true;
}
/*Calls new fangled network dialog */
void Gutenbrowser::OnNetworkDialog( const QString &/*networkUrl*/, const QString &/*output*/)
{
// odebug << networkUrl << oendl;
// odebug << output << oendl;
// #ifndef Q_WS_QWS
// NetworkDialog *NetworkDlg;
// if( networkUrl.length() < 4 ) networkUrl= "http://sailor.gutenberg.org/mirror.sites.html";
// NetworkDlg = new NetworkDialog( this,"Network Protocol Dialog", TRUE, 0, networkUrl, output);
// if( NetworkDlg->exec() != 0 ) {
// }
// if(NetworkDlg)
// delete NetworkDlg;
// #endif
}
void Gutenbrowser::donateGutenberg()
{
int exit=QMessageBox::information(this, "Info", "http://www.gutenberg.org\ndonate@gutenberg.net",
QMessageBox::Ok, QMessageBox::Cancel);
if (exit==1) {
} else {
};
}
void Gutenbrowser::donateByteMonkie()
{
}
void Gutenbrowser::writeConfig()
{
// config.read();
// Config config("Gutenbrowser");
// #ifndef Q_WS_QWS
// config.setGroup( "Geometry" );
// QString s;
// QString globalPosition;
// QPoint point;
// point=mapToGlobal(QPoint(0,0) );
// int posiX, posiY;
// posiX=point.x();
// posiY=point.y();
// globalPosition.sprintf("%i,%i", posiX, posiY);
// QRect frameRect;
// frameRect = geometry();
// s.sprintf("%i,%i", frameRect.width(), frameRect.height());
// config.writeEntry("Frame", s);
// config.writeEntry("Position", globalPosition);
// if( useIcons==TRUE)
// config.writeEntry("Icons", "TRUE");
// else
// config.writeEntry("Icons", "FALSE");
// #endif
// #ifndef Q_WS_QWS
// QString temp;
// temp.setNum(styleI, 10);
// config.setGroup( "StyleIze" );
// config.writeEntry( "Style", temp);
// #endif
// config.setGroup("General");
}
void Gutenbrowser::annotations()
{
// #ifndef Q_WS_QWS
// QMessageBox::message("Note","hi annotate");
// lastBmkButton->setDown(FALSE);
// #endif
}
void Gutenbrowser::hideButtons()
{
if( !buttonsHidden) {
buttonsHidden=TRUE;
LibraryButton->hide();
SearchButton->hide();
InfoBar->hide();
OpenButton->hide();
BackButton->hide();
ForwardButton->hide();
setBookmarkButton->hide();
lastBmkButton->hide();
dictionaryButton->hide();
if(useSplitter) {
ClearButton->hide();
PrintButton->hide();
beginButton->hide();
HelpButton->hide();
FontButton->hide();
ExitButton->hide();
OptionsButton->hide();
DownloadButton->hide();
}
} else {
diff --git a/noncore/apps/opie-gutenbrowser/helpme.cpp b/noncore/apps/opie-gutenbrowser/helpme.cpp
index 53e0236..0e23114 100644
--- a/noncore/apps/opie-gutenbrowser/helpme.cpp
+++ b/noncore/apps/opie-gutenbrowser/helpme.cpp
@@ -1,127 +1,127 @@
/***************************************************************************
helpme.cpp - description
-------------------
begin : Tue Jul 25 2000
begin : Sat Dec 4 1999
copyright : (C) 2000 -2004 by llornkcor
email : ljp@llornkcor.com
***************************************************************************/
/***************************************************************************
* *
* 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 "helpme.h"
#include "helpwindow.h"
/* OPIE */
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpeapplication.h>
#include <opie2/odebug.h>
/* QT */
#include <qprogressdialog.h>
#include <qlayout.h>
/* STD */
#include <sys/stat.h>
#include <unistd.h>
HelpMe::HelpMe(QWidget *parent, QString name ) : QDialog(parent,name)
{
local_library = ( QDir::homeDirPath ())+"/Applications/gutenbrowser/";
setCaption(tr("Gutenbrowser About " VERSION));
QGridLayout *layout = new QGridLayout( this );
layout->setSpacing( 4 );
layout->setMargin( 4 );
Edit = new QMultiLineEdit(this, "");
Edit->setReadOnly(true);
Edit->append(tr("Based on gutenbook.pl, available from http://www.gutenbook.org"));
Edit->append(tr("Much appreciation to Lee Burgess,"));
Edit->append(tr("for the original idea and concept of gutenbook.\n"));
Edit->append(tr("A list of current Gutenberg ftp sites is at http://promo.net/pg/index.html\n"));
Edit->append(tr("For bug reports, comments or questions about Gutenbrowser, email"));
Edit->append(tr("ljp@llornkcor.com\n"));
Edit->append(tr("\nMade using Qt, Qt Embedded, and Qtopia, a cross platform development API\nhttp://www.trolltech.com\n\n"));
Edit->append(tr("Arnold's Laws of Documentation:"));
Edit->append(tr("(1) If it should exist, it doesn't."));
Edit->append(tr("(2) If it does exist, it's out of date."));
Edit->append(tr("(3) Only documentation for"));
Edit->append(tr("useless programs transcends the"));
Edit->append(tr("first two laws.\n"));
Edit->append(tr("Everything is temporary, anyway....\n :o)"));
Edit->setWordWrap(QMultiLineEdit::WidgetWidth);
QString pixDir;
- pixDir=QPEApplication::qpeDir()+"/pics/";
+ pixDir=QPEApplication::qpeDir()+"pics/";
QPushButton *help;
help = new QPushButton(this);
help->setPixmap( QPixmap( pixDir+"gutenbrowser/help.png"));
help->setText("Help");
connect( help,SIGNAL(clicked()),this,SLOT( help() ));
/* QPushButton *ok;
ok = new QPushButton(this);
ok->setPixmap( QPixmap( pixDir+"/gutenbrowser/exit.png"));
ok->setText("ok");
connect(ok,SIGNAL(clicked()),this,SLOT(accept() ));
*/
help->setFixedHeight(25);
// ok->setFixedHeight(25);
// layout->addMultiCellWidget( ok, 0, 0, 4, 4 );
layout->addMultiCellWidget( help, 0, 0, 4, 4 );
layout->addMultiCellWidget( Edit, 1, 1, 0, 4 );
}
HelpMe::~HelpMe()
{
//delete Edit;
}
void HelpMe::goToURL()
{
url = "http://www.llornkcor.com/";
goGetit( url);
}
void HelpMe::goToURL2()
{
url = "http://www.gutenberg.org";
goGetit( url);
}
void HelpMe::goToURL3()
{
url = "http://www.gutenbook.org";
goGetit( url);
}
void HelpMe::goGetit( QString url)
{
HelpWindow *help = new HelpWindow( url, ".", 0, "gutenbrowser");
help->setCaption("Qt Example - Helpviewer");
help->showMaximized();
help->show();
}
void HelpMe::help()
{
QString msg ;
msg=QPEApplication::qpeDir()+"help/html/gutenbrowser-index.html"; // or where ever this ends up to be
odebug << msg << oendl;
QString url = "file://"+msg;
goGetit( url);
// QCopEnvelope e("QPE/Application/helpbrowser", "setDocument(QString)" );
// e << msg;
// goGetit( msg);
}
diff --git a/noncore/apps/zsafe/zsafe.cpp b/noncore/apps/zsafe/zsafe.cpp
index 6aa6392..1ae3b15 100644
--- a/noncore/apps/zsafe/zsafe.cpp
+++ b/noncore/apps/zsafe/zsafe.cpp
@@ -1243,2637 +1243,2637 @@ void ZSafe::showInfo( QListViewItem *_item)
void ZSafe::listViewSelected( QListViewItem *_item)
{
if (!_item)
return;
if (selectedItem != NULL)
selectedItem->setSelected(FALSE);
selectedItem = _item;
#ifndef DESKTOP
// set the column text dependent on the selected item
ListView->setColumnText(0, getFieldLabel (selectedItem, "1", tr("Name")));
ListView->setColumnText(1, getFieldLabel (selectedItem, "2", tr("Field 2")));
ListView->setColumnText(2, getFieldLabel (selectedItem, "3", tr("Field 3")));
ListView->setColumnText(3, getFieldLabel (selectedItem, "4", tr("Comment")));
ListView->setColumnText(4, getFieldLabel (selectedItem, "5", tr("Field 4")));
ListView->setColumnText(5, getFieldLabel (selectedItem, "6", tr("Field 5")));
#endif
#ifdef Q_WS_WIN
// set the column text dependent on the selected item
ListView->setColumnText(0, getFieldLabel (selectedItem, "1", tr("Name")));
ListView->setColumnText(1, getFieldLabel (selectedItem, "2", tr("Field 2")));
ListView->setColumnText(2, getFieldLabel (selectedItem, "3", tr("Field 3")));
ListView->setColumnText(3, getFieldLabel (selectedItem, "4", tr("Comment")));
ListView->setColumnText(4, getFieldLabel (selectedItem, "5", tr("Field 4")));
ListView->setColumnText(5, getFieldLabel (selectedItem, "6", tr("Field 5")));
#endif
}
bool ZSafe::isCategory(QListViewItem *_item)
{
if (_item == NULL)
return FALSE;
QString categoryName = _item->text (0);
if (categories.find (categoryName))
return TRUE;
else
return FALSE;
}
void ZSafe::removeAsciiFile()
{
// QString fn = filename + ".txt";
// open the file dialog
#ifndef DESKTOP
#ifndef NO_OPIE
QMap<QString, QStringList> mimeTypes;
mimeTypes.insert(tr("All"), QStringList() );
mimeTypes.insert(tr("Text"), "text/*" );
QString fn = OFileDialog::getOpenFileName( OFileSelector::EXTENDED_ALL,
QDir::homeDirPath() + "/Documents/application/zsafe",
QString::null,
mimeTypes,
this,
tr ("Remove text file"));
#else
QString fn = ScQtFileEdit::getOpenFileName(this,
tr ("Remove text file"),
QDir::homeDirPath() + "/Documents/application/zsafe",
"*.txt");
#endif
#else
QString fn = QFileDialog::getOpenFileName(
QDir::homeDirPath() + "/Documents/application/zsafe",
"ZSafe (*.txt)",
this,
"ZSafe File Dialog"
"Choose a text file" );
#endif
if (fn && fn.length() > 0 )
{
QFile f( fn );
if ( !f.remove() )
{
#ifndef NO_OPIE
owarn << "Could not remove file " << fn << oendl;
#else
qWarning( QString("Could not remove file %1").arg(fn),2000 );
#endif
QMessageBox::critical( 0, tr("ZSafe"),
tr("Could not remove text file.") );
return;
}
}
}
void ZSafe::writeAllEntries()
{
if (filename.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("No document defined.\nYou have to create a new document"));
return;
}
// open the file dialog
QString fn = zsaveDialog();
// open the new document
if (fn && fn.length() > 0 )
{
QFile f( fn );
if ( !f.open( IO_WriteOnly ) ) {
#ifndef NO_OPIE
owarn << "Could not write to file " << fn << oendl;
#else
qWarning( QString("Could not write to file %1").arg(fn),2000 );
#endif
QMessageBox::critical( 0, "ZSafe",
QString("Could not export to text file.") );
return;
}
QTextStream t( &f );
QListViewItem *i;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL;
si = si->nextSibling())
{
QString oneEntry;
oneEntry += "\"";
oneEntry += i->text(0);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(0);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(1);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(2);
oneEntry += "\";";
oneEntry += "\"";
QString comment = si->text(3);
comment.replace (QRegExp("\n"), "<br>");
oneEntry += comment;
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(4);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(5);
oneEntry += "\"";
// owarn << oneEntry << oendl;
t << oneEntry << endl;
// owarn << si->text(0) << oendl;
}
}
f.close();
}
}
void ZSafe::readAllEntries()
{
if (filename.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("No document defined.\nYou have to create a new document"));
return;
}
// open the file dialog
#ifndef DESKTOP
#ifndef NO_OPIE
QMap<QString, QStringList> mimeTypes;
mimeTypes.insert(tr("All"), QStringList() );
mimeTypes.insert(tr("Text"), "text/*" );
QString fn = OFileDialog::getOpenFileName( OFileSelector::EXTENDED_ALL,
QDir::homeDirPath() + "/Documents/application/zsafe",
QString::null,
mimeTypes,
this,
tr ("Import text file"));
#else
QString fn = ScQtFileEdit::getOpenFileName(this,
tr ("Import text file"),
QDir::homeDirPath() + "/Documents/application/zsafe",
"*.txt");
#endif
#else
QString fn = QFileDialog::getOpenFileName(
QDir::homeDirPath() + "/Documents/application/zsafe",
"ZSafe (*.txt)",
this,
"ZSafe File Dialog"
"Choose a text file" );
#endif
if (fn && fn.length() > 0 )
{
QFile f( fn );
if ( !f.open( IO_ReadOnly ) )
{
#ifndef NO_OPIE
owarn << "Could not read file " << fn << oendl;
#else
qWarning( QString("Could not read file %1").arg(fn), 2000 );
#endif
QMessageBox::critical( 0, "ZSafe",
QString("Could not import text file.") );
return;
}
modified = true;
// clear the password list
selectedItem = NULL;
QListViewItem *i;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL; )
// si = si->nextSibling())
{
QListViewItem *_si = si;
si = si->nextSibling();
i->takeItem(_si); // remove from view list
if (_si) delete _si;
}
}
#ifndef NO_OPIE
owarn << "ReadAllEntries(): " << oendl;
#else
qWarning ("ReadAllEntries(): ");
#endif
QTextStream t(&f);
while ( !t.eof() )
{
QString s = t.readLine();
s.replace (QRegExp("\";\""), "\"|\"");
// char buffer[1024];
#ifndef Q_WS_WIN
char buffer[s.length()+1];
#else
char buffer[4048];
#endif
/* modify QString -> QCString::utf8 */
strcpy (buffer, s.utf8());
QString name;
QString user;
QString password;
QString comment;
QString field5="";
QString field6="";
// separete the entries
char *i = strtok (buffer, "|");
QString category(QString::fromUtf8(&i[1]));
category.truncate(category.length() -1);
int idx=0;
while ((i = strtok (NULL, "|")) != NULL)
{
switch (idx)
{
case 0:
name = QString::fromUtf8(&i[1]);
name.truncate(name.length() -1);
// name
break;
case 1:
// user
user = QString::fromUtf8(&i[1]);
user.truncate(user.length() -1);
break;
case 2:
// password
password = QString::fromUtf8(&i[1]);
password.truncate(password.length() -1);
break;
case 3:
// comment
comment = QString::fromUtf8(&i[1]);
comment.truncate(comment.length() -1);
break;
case 4:
// field5
field5 = QString::fromUtf8(&i[1]);
field5.truncate(field5.length() -1);
break;
case 5:
// field6
field6 = QString::fromUtf8(&i[1]);
field6.truncate(field6.length() -1);
break;
}
idx++;
}
Category *cat= categories.find (category);
if (cat)
{
// use the existend item
QListViewItem *catItem = cat->getListItem();
if (catItem)
{
QListViewItem * item = new ShadedListItem( 0, catItem );
item->setText( 0, tr( name ) );
item->setText( 1, tr( user ) );
item->setText( 2, tr( password ) );
item->setText( 3, tr( comment ) );
item->setText( 4, tr( field5 ) );
item->setText( 5, tr( field6 ) );
catItem->setOpen( TRUE );
}
}
else
{
QListViewItem *catI = new ShadedListItem( 1, ListView );
// create and insert a new item
QListViewItem * item = new ShadedListItem( 0, catI );
item->setText( 0, tr( name ) );
item->setText( 1, tr( user ) );
item->setText( 2, tr( password ) );
item->setText( 3, tr( comment ) );
item->setText( 4, tr( field5 ) );
item->setText( 5, tr( field6 ) );
catI->setOpen( TRUE );
Category *c1 = new Category();
c1->setCategoryName(category);
QString icon;
QString fullIconPath;
QPixmap *pix;
// #ifndef Q_WS_WIN
icon = conf->readEntry(APP_KEY+category);
// #endif
bool isIconAv = false;
if (!icon.isEmpty() && !icon.isNull())
{
// build the full path
fullIconPath = iconPath + icon;
pix = new QPixmap (fullIconPath);
if (!pix->isNull())
{
QImage img = pix->convertToImage();
pix->convertFromImage(img.smoothScale(14,14));
c1->setIconName (icon);
c1->setIcon (*pix);
isIconAv = true;
}
}
if (!isIconAv)
{
c1->setIcon (*getPredefinedIcon(category));
}
c1->setListItem (catI);
c1->initListItem();
categories.insert (c1->getCategoryName(), c1);
}
}
f.close();
}
else
{
}
}
#ifdef UNUSED
void ZSafe::writeAllEntries()
{
if (filename.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("<P>No document defined. You have to create a new document</P>"));
return;
}
// open the file for writing
QString fn = filename + ".txt";
QFile f( fn );
if ( !f.open( IO_WriteOnly ) ) {
#ifndef NO_OPIE
owarn << "Could not write to file " << fn << oendl;
#else
qWarning( QString("Could not write to file %1").arg(fn), 2000 );
#endif
QMessageBox::critical( 0, tr("ZSafe"),
tr("Could not export to text file.") );
return;
}
QTextStream t( &f );
QListViewItem *i;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL;
si = si->nextSibling())
{
QString oneEntry;
oneEntry += "\"";
oneEntry += i->text(0);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(0);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(1);
oneEntry += "\";";
oneEntry += "\"";
oneEntry += si->text(2);
oneEntry += "\";";
oneEntry += "\"";
// oneEntry += si->text(3);
QString comment = si->text(3);
comment.replace (QRegExp("\n"), "<br>");
oneEntry += comment;
oneEntry += "\"";
// owarn << oneEntry << oendl;
t << oneEntry << endl;
// owarn << si->text(0) << oendl;
}
}
f.close();
}
void ZSafe::readAllEntries()
{
QString fn = filename + ".txt";
QFile f( fn );
if ( !f.open( IO_ReadOnly ) )
{
#ifndef NO_OPIE
owarn << "Could not read file " << fn << oendl;
#else
qWarning( QString("Could not read file %1").arg(fn), 2000 );
#endif
QMessageBox::critical( 0, tr("ZSafe"),
tr("Could not import text file.") );
return;
}
modified = true;
// clear the password list
selectedItem = NULL;
QListViewItem *i;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL; )
// si = si->nextSibling())
{
QListViewItem *_si = si;
si = si->nextSibling();
i->takeItem(_si); // remove from view list
if (_si) delete _si;
}
}
#ifndef NO_OPIE
owarn << "ReadAllEntries(): " << oendl;
#else
qWarning ("ReadAllEntries(): ");
#endif
QTextStream t(&f);
while ( !t.eof() )
{
QString s = t.readLine();
s.replace (QRegExp("\";\""), "\"|\"");
// char buffer[1024];
int len=s.length()+1;
#ifdef Q_WS_WIN
char buffer[512];
#else
char buffer[len];
#endif
strcpy (buffer, s);
QString name;
QString user;
QString password;
QString comment;
// separete the entries
char *i = strtok (buffer, "|");
QString category(&i[1]);
category.truncate(category.length() -1);
int idx=0;
while (i = strtok (NULL, "|"))
{
switch (idx)
{
case 0:
name = &i[1];
name.truncate(name.length() -1);
// name
break;
case 1:
// user
user = &i[1];
user.truncate(user.length() -1);
break;
case 2:
// password
password = &i[1];
password.truncate(password.length() -1);
break;
case 3:
// comment
comment = &i[1];
comment.truncate(comment.length() -1);
break;
}
idx++;
}
Category *cat= categories.find (category);
if (cat)
{
// use the existend item
QListViewItem *catItem = cat->getListItem();
if (catItem)
{
QListViewItem * item = new ShadedListItem( 0, catItem );
item->setText( 0, tr( name ) );
item->setText( 1, tr( user ) );
item->setText( 2, tr( password ) );
item->setText( 3, tr( comment ) );
catItem->setOpen( TRUE );
}
}
else
{
QListViewItem *catI = new ShadedListItem( 1, ListView );
// create and insert a new item
QListViewItem * item = new ShadedListItem( 0, catI );
item->setText( 0, tr( name ) );
item->setText( 1, tr( user ) );
item->setText( 2, tr( password ) );
item->setText( 3, tr( comment ) );
catI->setOpen( TRUE );
Category *c1 = new Category();
c1->setCategoryName(category);
QString icon;
QString fullIconPath;
QPixmap *pix;
// #ifndef Q_WS_WIN
icon = conf->readEntry(APP_KEY+category);
// #endif
bool isIconAv = false;
if (!icon.isEmpty() && !icon.isNull())
{
// build the full path
fullIconPath = iconPath + icon;
pix = new QPixmap (fullIconPath);
if (!pix->isNull())
{
QImage img = pix->convertToImage();
pix->convertFromImage(img.smoothScale(14,14));
c1->setIconName (icon);
c1->setIcon (*pix);
isIconAv = true;
}
}
if (!isIconAv)
{
c1->setIcon (*getPredefinedIcon(category));
}
c1->setListItem (catI);
c1->initListItem();
categories.insert (c1->getCategoryName(), c1);
}
}
f.close();
}
#endif // UNUSED
void ZSafe::resume(int)
{
#ifndef NO_OPIE
owarn << "Resume" << oendl;
#endif
// hide the main window
if ( !showpwd )
{
infoForm->hide();
// open zsafe again
m_password = "";
selectedItem = NULL;
// clear the password list
QListViewItem *i;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL; )
{
QListViewItem *_si = si;
si = si->nextSibling();
i->takeItem(_si); // remove from view list
if (_si) delete _si;
}
}
// ask for password and read again
openDocument(filename);
}
}
//---------------------------------------------
bool ZSafe::openDocument(const char* _filename, const char* )
{
QString name= _filename;
qWarning("openDocument "+name);
int retval;
char* entry[FIELD_SIZE];
// #ifndef Q_WS_WIN
int validationFlag = conf->readNumEntry(APP_KEY+"valzsafe", 1);
// #else
// int validationFlag = 1;
// #endif
int pwdOk = 0;
int numberOfTries = 3;
for (int i=0; i < numberOfTries; i++)
{
QFile f(_filename);
if (f.exists())
{
// ask with a dialog for the password
if (m_password.isEmpty())
getDocPassword(tr("Enter Password"));
if (m_password.isEmpty() && validationFlag == 0)
{
#ifndef NO_OPIE
owarn << "Wrong password" << oendl;
#else
qWarning ("Wrong password");
#endif
QMessageBox::critical( 0, tr("ZSafe"),
tr("Wrong password.\n\nZSafe will now exit.") );
exitZs (1);
}
retval = loadInit(_filename, m_password);
if (retval != PWERR_GOOD)
{
#ifndef NO_OPIE
owarn << "Error loading Document" << oendl;
#else
qWarning ("Error loading Document");
#endif
return false;
}
}
else
{
#ifdef Q_WS_WIN
this->setCaption("Qt ZSafe");
#else
this->setCaption("ZSafe");
#endif
filename = "";
switch( QMessageBox::warning( this, tr("ZSafe"),
tr("<P>You must create a new document first. Ok to create?</P>"),
tr("&Yes"), tr("&No."),
0
) )
{
case 1: // No
return false;
break;
case 0: // Yes
newDocument();
return false;
break;
}
}
// load the validation entry
if (validationFlag == 0)
{
pwdOk = 1;
break;
}
retval = loadEntry(entry);
if (retval == 1 &&
!strcmp (entry[0], "ZSAFECATEGORY") &&
!strcmp (entry[1], "name") &&
!strcmp (entry[2], "username") &&
!strcmp (entry[3], "password") &&
!strcmp (entry[4], "comment") )
{
for (int count = 0; count < FIELD_SIZE; count++) free(entry[count]);
pwdOk = 1;
break;
}
else
// for (int count = 0; count < FIELD_SIZE; count++) free(entry[count]);
fclose (fd);
m_password = "";
if (i < numberOfTries - 1)
{
switch( QMessageBox::warning( this, tr("ZSafe"),
tr("Wrong password.\nEnter again?"),
tr("&Yes"), tr("&No."),
0
) )
{
case 1: // No
exitZs (1);
break;
case 0: // Yes
continue;
}
}
}
if (pwdOk == 0)
{
// unset the document entry
conf->writeEntry(APP_KEY+"document", "INVALIDPWD");
if (conf)
delete conf;
exitZs (1);
}
retval = loadEntry(entry);
int numberOfEntries=0;
while (retval == 1) {
QString category( QString::fromUtf8(entry[0]) );
QString name( QString::fromUtf8(entry[1]) );
QString user( QString::fromUtf8(entry[2]) );
QString password( QString::fromUtf8(entry[3]) );
QString comment( QString::fromUtf8(entry[4]) );
QString field5( QString::fromUtf8(entry[5]) );
QString field6( QString::fromUtf8(entry[6]) );
// add the subitems to the categories
Category *cat= categories.find (category);
if (cat)
{
// use the existend item
QListViewItem *catItem = cat->getListItem();
if (catItem)
{
QListViewItem * item = new ShadedListItem( 0, catItem );
item->setText( 0, tr( name ) );
item->setText( 1, tr( user ) );
item->setText( 2, tr( password ) );
item->setText( 3, tr( comment ) );
item->setText( 4, tr( field5 ) );
item->setText( 5, tr( field6 ) );
if (expandTree)
catItem->setOpen( TRUE );
numberOfEntries++;
}
}
else
{
QListViewItem *catI = new ShadedListItem( 1, ListView );
// create and insert a new item
QListViewItem * item = new ShadedListItem( 0, catI );
item->setText( 0, tr( name ) );
item->setText( 1, tr( user ) );
item->setText( 2, tr( password ) );
item->setText( 3, tr( comment ) );
item->setText( 4, tr( field5 ) );
item->setText( 5, tr( field6 ) );
if (expandTree)
catI->setOpen( TRUE );
Category *c1 = new Category();
c1->setCategoryName(category);
QString icon;
QString fullIconPath;
QPixmap *pix;
// #ifndef Q_WS_WIN
icon = conf->readEntry(APP_KEY+category);
// #endif
bool isIconAv = false;
if (!icon.isEmpty() && !icon.isNull())
{
// build the full path
fullIconPath = iconPath + icon;
pix = new QPixmap (fullIconPath);
if (!pix->isNull())
{
QImage img = pix->convertToImage();
pix->convertFromImage(img.smoothScale(14,14));
c1->setIconName (icon);
c1->setIcon (*pix);
isIconAv = true;
}
}
if (!isIconAv)
{
c1->setIcon (*getPredefinedIcon(category));
}
c1->setListItem (catI);
c1->initListItem();
categories.insert (c1->getCategoryName(), c1);
numberOfEntries++;
}
for (int count = 0; count < FIELD_SIZE; count++) {
free(entry[count]);
}
retval = loadEntry(entry);
if (retval == 2) {
// m_parent->slotStatusHelpMsg("Last entry loaded");
}
} // end while
if (numberOfEntries == 0)
{
switch( QMessageBox::warning( this, tr("ZSafe"),
tr("Empty document or\nwrong password.\nContinue?"),
tr("&No"), tr("&Yes."),
0
) ) {
case 0: // No
retval = loadFinalize();
exitZs (1);
break;
case 1: // Yes
break;
}
}
retval = loadFinalize();
return true;
}
int ZSafe::loadInit(const char* _filename, const char *password)
{
unsigned int j = 0;
unsigned int keylength=0;
int count=0, count2=0, count3=0;
unsigned char charbuf[8];
unsigned short ciphertext[4];
char key[128];
Krc2* krc2 = new Krc2();
fd = fopen (_filename, "rb");
QFileInfo f (_filename);
load_buffer_length = f.size();
load_buffer_length = ((load_buffer_length / 1024)+1) * 1024 * 2;
if (fd == NULL)
return PWERR_OPEN;
buffer = (char *)malloc(load_buffer_length);
for (j = 0; password[j] != '\0'; j++) {
key[j] = password[j];
}
keylength = j;
krc2->rc2_expandkey (key, keylength, 128);
#ifndef Q_WS_WIN
size = read(fileno (fd), (unsigned char *) (charbuf + count), 8);
#else
size = fread ((unsigned char *) (charbuf + count), sizeof(unsigned char), 8, fd);
#endif
if (size < 8)
return PWERR_DATA;
for (count = 0; count < 4; count++) {
count2 = count << 1;
iv[count] = charbuf[count2] << 8;
iv[count] += charbuf[count2 + 1];
}
size = 0;
bufferIndex = 0;
#ifndef Q_WS_WIN
while ((count = read (fileno (fd), (unsigned char *) charbuf, 8)) > 0) {
while (count < 8) {
count2 = read (fileno (fd), (unsigned char *) (charbuf + count), 8);
#else
while ((count = fread ((unsigned char *) (charbuf), sizeof(unsigned char), 8, fd)) > 0) {
while (count < 8) {
count2 = fread ((unsigned char *) (charbuf + count), sizeof(unsigned char), 8, fd);
#endif
if (count2 == 0) {
return PWERR_DATA;
}
count += count2;
} /* while (count < 8) */
size += 8;
for (count2 = 0; count2 < 8; count2 += 2) {
count3 = count2 >> 1;
ciphertext[count3] = charbuf[count2] << 8;
ciphertext[count3] += charbuf[count2 + 1];
plaintext[count3] = ciphertext[count3] ^ iv[count3];
iv[count3] = plaintext[count3];
} /* for (count2) */
krc2->rc2_decrypt (plaintext);
memcpy ((unsigned char *) (buffer + bufferIndex), plaintext, 8);
bufferIndex += 8;
buffer[bufferIndex + 1] = '\0';
} /* while ((count = read (fileno (fd), (unsigned char *) charbuf, 8)) > 0) */
size -= buffer[size - 1];
lastcount = 0;
/* This will point to the starting index */
bufferIndex = 0;
return PWERR_GOOD;
}
int ZSafe::loadEntry(char *entry[FIELD_SIZE])
{
/* Strip off PKCS 5 padding
* Should check to make sure it's good here
*/
int count, count1=0;
for (count = lastcount; count < size; count++) {
if ((unsigned char) (buffer[count]) == 255) {
if (buffer[bufferIndex] == '\0') {
bufferIndex++;
}
entry[count1] = (char *) malloc (count - bufferIndex + 1);
memcpy (entry[count1], (unsigned char *) (buffer + bufferIndex), count - bufferIndex);
entry[count1][count - bufferIndex] = '\0';
count++;
bufferIndex = count;
count1++;
if (count1 == FIELD_SIZE) {
lastcount = count;
return 1;
}
} /* if ((unsigned char) (buffer[count]) == 255) */
} /* for (count = 0; count < size; count++) */
return 2;
}
int ZSafe::loadFinalize(void)
{
fclose (fd);
if (buffer) free(buffer);
return PWERR_GOOD;
}
bool ZSafe::saveDocument(const char* _filename,
bool withPwd,
const char* )
{
if (filename.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("No document defined.\nYou have to create a new document"));
return false;
}
// if (m_password.isEmpty())
// withPwd = true; // the document must be saved with a valid password
if (withPwd)
{
bool pwdOk = FALSE;
while (!pwdOk)
{
getDocPassword(tr("Enter Password"));
if (m_password.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("Password is empty.\nPlease enter again."));
continue;
}
QString firstPasswd = m_password;
getDocPassword(tr("Reenter Password"));
if (m_password.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("Password is empty.\nPlease enter again."));
continue;
}
if (firstPasswd != m_password)
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("Passwords must be identical.\nPlease enter again."));
continue;
}
pwdOk = TRUE;
modified = false;
}
}
else if (modified)
{
QString fns(_filename);
fns = fns.right (fns.length() - fns.findRev ('/') - 1);
switch( QMessageBox::information( this, tr("ZSafe"),
tr("Do you want to save ") + fns + tr("\nbefore continuing?"),
tr("&Save"),
tr("&Don't Save"),
0 // Enter == button 0
) )
{ // Escape == button 2
case 0: // Save clicked, Alt-S or Enter pressed.
modified = false;
break;
case 1: // Don't Save clicked or Alt-D pressed
modified = false;
return true;
}
}
modified = false;
if (m_password.isEmpty())
return false;
int retval = saveInit(_filename, m_password);
// int retval = saveInit(_filename, "test");
if (retval != PWERR_GOOD) {
return false;
}
char* entry[FIELD_SIZE];
// save the validation entry
{
int i=0;
entry[i] = (char*)malloc(strlen("ZSAFECATEGORY")+1);
strcpy(entry[i++], "ZSAFECATEGORY");
entry[i] = (char*)malloc(strlen("name")+1);
strcpy(entry[i++], "name");
entry[i] = (char*)malloc(strlen("username")+1);
strcpy(entry[i++], "username");
entry[i] = (char*)malloc(strlen("password")+1);
strcpy(entry[i++], "password");
entry[i] = (char*)malloc(strlen("comment")+1);
strcpy(entry[i++], "comment");
entry[i] = (char*)malloc(strlen("field5")+1);
strcpy(entry[i++], "field5");
entry[i] = (char*)malloc(strlen("field6")+1);
strcpy(entry[i++], "field6");
retval = saveEntry(entry);
for (int z=0; z<i; z++) free(entry[z]);
if (retval == PWERR_DATA) {
#ifndef NO_OPIE
owarn << "1: Error writing file, contents not saved" << oendl;
#else
qWarning("1: Error writing file, contents not saved");
#endif
saveFinalize();
return false;
}
// #ifndef Q_WS_WIN
conf->writeEntry(APP_KEY+"valzsafe", 1);
// #endif
saveConf();
}
QListViewItem *i;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL;
si = si->nextSibling())
{
int j=0;
entry[j] = (char*)malloc(strlen(i->text(0).utf8())+1);
strcpy(entry[j++], i->text(0).utf8());
entry[j] = (char*)malloc(strlen(si->text(0).utf8())+1);
strcpy(entry[j++], si->text(0).utf8());
entry[j] = (char*)malloc(strlen(si->text(1).utf8())+1);
strcpy(entry[j++], si->text(1).utf8());
entry[j] = (char*)malloc(strlen(si->text(2).utf8())+1);
strcpy(entry[j++], si->text(2).utf8());
entry[j] = (char*)malloc(strlen(si->text(3).utf8())+1);
strcpy(entry[j++], si->text(3).utf8());
entry[j] = (char*)malloc(strlen(si->text(4).utf8())+1);
strcpy(entry[j++], si->text(4).utf8());
entry[j] = (char*)malloc(strlen(si->text(5).utf8())+1);
strcpy(entry[j++], si->text(5).utf8());
retval = saveEntry(entry);
for (int z=0; z<j; z++)
{
free(entry[z]);
}
if (retval == PWERR_DATA) {
#ifndef NO_OPIE
owarn << "1: Error writing file, contents not saved" << oendl;
#else
qWarning("1: Error writing file, contents not saved");
#endif
saveFinalize();
return false;
}
}
}
if (saveFinalize() == PWERR_DATA) {
#ifndef NO_OPIE
owarn << "2: Error writing file, contents not saved" << oendl;
#else
qWarning("2: Error writing file, contents not saved");
#endif
return false;
} else {
#ifndef DESKTOP
Global::statusMessage (tr("Password file saved."));
#endif
modified = false;
return true;
}
}
PasswordForm *newPwdDialog;
bool newPwdDialogResult = false;
void ZSafe::setPasswordDialogDone()
{
newPwdDialogResult = true;
newPwdDialog->close();
}
void ZSafe::getDocPassword(QString title)
{
#ifndef NO_OPIE
owarn << "getDocPassword" << oendl;
#endif
// open the 'Password' dialog
PasswordForm *dialog = new PasswordForm(this, title, TRUE);
newPwdDialog = dialog;
newPwdDialogResult = false;
QPixmap image0( ( const char** ) zsafe_xpm );
dialog->setIcon( image0);
connect( dialog->PasswordField, SIGNAL( returnPressed() ),
this, SLOT( setPasswordDialogDone() ) );
// CS: !!!
// int pos = filename.findRev ('/');
QString ti = filename.right (filename.length() - filename.findRev ('/') - 1);
#ifdef Q_WS_WIN
dialog->setCaption("Qt " + ti);
#else
dialog->setCaption(ti);
#endif
// dialog->setCaption(title);
dialog->PasswordField->setFocus();
DialogCode result = (DialogCode) dialog->exec();
#ifdef DESKTOP
result = Accepted;
#endif
QString password;
if (result == Accepted || newPwdDialogResult)
{
m_password = dialog->PasswordField->text();
}
else
{
exitZs (1);
}
}
int ZSafe::saveInit(const char *_filename, const char *password)
{
char key[128];
unsigned int j = 0;
unsigned int keylength;
// int val;
int count2;
Krc2* krc2 = new Krc2();
/* first we should check the permissions of the filename */
/*
if (QFile::exists(_filename)) {
val = checkFile(_filename);
if (val != PWERR_GOOD)
return val;
} else
{
val = creat (_filename, (S_IRUSR | S_IWUSR));
if (val == -1)
return PWERR_OPEN;
else
close(val);
}
*/
QFileInfo f (_filename);
save_buffer_length = f.size();
save_buffer_length = ((save_buffer_length / 1024)+1) * 1024;
fd = fopen (_filename, "wb");
if (fd == NULL)
return PWERR_OPEN;
buffer = (char*)malloc(save_buffer_length);
/* make the key ready */
for (j = 0; password[j] != '\0'; j++) {
key[j] = password[j];
}
keylength = j;
krc2->rc2_expandkey (key, keylength, 128);
/* First, we make the IV */
for (count2 = 0; count2 < 4; count2++) {
iv[count2] = rand ();
putc ((unsigned char) (iv[count2] >> 8), fd);
putc ((unsigned char) (iv[count2] & 0xff), fd);
}
bufferIndex = 0;
return PWERR_GOOD;
}
int ZSafe::saveEntry(char *entry[FIELD_SIZE])
{
char *text1;
int count2, count3;
unsigned short ciphertext[4];
Krc2* krc2 = new Krc2();
buffer = (char*)memset(buffer, '\0', save_buffer_length);
for (count2 = 0; count2 < FIELD_SIZE; count2++) {
text1 = entry[count2];
if (strlen (text1) == 0) {
strncat(buffer, " ", strlen(" "));
} else {
strncat(buffer, text1, strlen(text1));
}
/* Use 255 as the marker. \n is too tough to test for */
buffer[strlen (buffer)] = 255;
} /*for (count2 = 0; count2 < 5; count2++)*/
count2 = 0;
/* I'm using CBC mode and encrypting the data straight from top down.
* At the bottom, encrypted, I will append an MD5 hash of the file, eventually.
* PKCS 5 padding (explained at the code section
*/
while (count2 < (int)strlen (buffer)) {
#ifndef WORDS_BIGENDIAN
plaintext[bufferIndex] = buffer[count2 + 1] << 8;
plaintext[bufferIndex] += buffer[count2] & 0xff;
#endif
#ifdef WORDS_BIGENDIAN
plaintext[bufferIndex] = buffer[count2] << 8;
plaintext[bufferIndex] += buffer[count2 + 1] & 0xff;
#endif
bufferIndex++;
if (bufferIndex == 4) {
krc2->rc2_encrypt (plaintext);
for (count3 = 0; count3 < 4; count3++) {
ciphertext[count3] = iv[count3] ^ plaintext[count3];
/* Now store the ciphertext as the iv */
iv[count3] = plaintext[count3];
/* reset the buffer index */
bufferIndex = 0;
if (putc ((unsigned char) (ciphertext[count3] >> 8), fd) == EOF) return PWERR_DATA;
if (putc ((unsigned char) (ciphertext[count3] & 0xff), fd) == EOF) return PWERR_DATA;
} /*for (count3 = 0; count3 < 5; count3++)*/
} /*if (bufferIndex == 5)*/
/* increment a short, not a byte */
count2 += 2;
} /*while (count2 < strlen (buffer))*/
int ret = PWERR_GOOD;
return ret;
}
int ZSafe::saveFinalize(void)
{
int count1, retval = PWERR_GOOD;
unsigned short ciphertext[4];
Krc2* krc2 = new Krc2();
/* Tack on the PKCS 5 padding
* How it works is we fill up the last n bytes with the value n
*
* So, if we have, say, 13 bytes, 8 of which are used, we have 5 left
* over, leaving us 3 short, so we fill it in with 3's.
*
* If we come out even, we fill it with 8 8s
*
* um, except that in this instance we are using 4 shorts instead of 8 bytes.
* so, half everything
*/
for (count1 = bufferIndex; count1 < 4; count1++) {
plaintext[count1] = (4 - bufferIndex);
}
krc2->rc2_encrypt (plaintext);
for (count1 = 0; count1 < 4; count1++) {
ciphertext[count1] = iv[count1] ^ plaintext[count1];
if (putc ((unsigned char) (ciphertext[count1] >> 8), fd) == EOF) retval = PWERR_DATA;
if (putc ((unsigned char) (ciphertext[count1] & 0xff), fd) == EOF) retval = PWERR_DATA;
}
fclose (fd);
free(buffer);
return retval;
}
void ZSafe::quitMe ()
{
#ifndef NO_OPIE
owarn << "QUIT..." << oendl;
#endif
if (modified)
{
switch( QMessageBox::information( this, tr("ZSafe"),
tr("Do you want to save\nbefore exiting?"),
tr("&Save"),
tr("S&ave with\nnew\npassword"),
tr("&Don't Save"),
0 // Enter == button 0
) )
{ // Escape == button 2
case 0: // Save clicked, Alt-S or Enter pressed.
// save
modified = false;
saveDocument(filename, FALSE);
exitZs (1);
break;
case 1: //
// Save with new password
modified = false;
saveDocument(filename, TRUE);
exitZs (1);
break;
case 2: // Don't Save clicked or Alt-D pressed
// don't save but exitZs
exitZs (1);
break;
}
}
exitZs (1);
}
void ZSafe::categoryFieldActivated( const QString& category)
{
if (categoryDialog)
setCategoryDialogFields(categoryDialog, category);
}
void ZSafe::addCategory()
{
if (filename.isEmpty())
{
QMessageBox::critical( 0, tr("ZSafe"),
tr("No document defined.\nYou have to create a new document"));
return;
}
else
{
// open the 'Category' dialog
bool initIcons = false;
// open the 'Category' dialog
CategoryDialog *dialog;
if (categoryDialog)
{
dialog = categoryDialog;
}
else
{
categoryDialog = new CategoryDialog(this, tr("Category"), TRUE);
#ifdef Q_WS_WIN
categoryDialog->setCaption ("Qt " + tr("Category"));
#endif
dialog = categoryDialog;
connect( dialog->CategoryField,
SIGNAL( activated(const QString&)),
this, SLOT( categoryFieldActivated(const QString&) ) );
initIcons = true;
}
#ifdef DESKTOP
#ifndef Q_WS_WIN
QStringList list = conf->entryList( APP_KEY+"/fieldDefs" );
#else
// read all categories from the config file and store
// into a list
QFile f (cfgFile);
QStringList list;
if ( f.open(IO_ReadOnly) ) { // file opened successfully
QTextStream t( &f ); // use a text stream
QString s;
int n = 1;
while ( !t.eof() ) { // until end of file...
s = t.readLine(); // line of text excluding '\n'
list.append(s);
}
f.close();
}
#endif
#else
// read all categories from the config file and store
// into a list
QFile f (cfgFile);
QStringList list;
if ( f.open(IO_ReadOnly) ) { // file opened successfully
QTextStream t( &f ); // use a text stream
QString s;
while ( !t.eof() ) { // until end of file...
s = t.readLine(); // line of text excluding '\n'
list.append(s);
}
f.close();
}
#endif
QStringList::Iterator it = list.begin();
QString categ;
QString firstCategory;
dialog->CategoryField->clear(); // remove all items
while( it != list.end() )
{
QString *cat = new QString (*it);
if (cat->contains("-field1", FALSE))
{
#ifdef DESKTOP
#ifndef Q_WS_WIN
categ = cat->section ("-field1", 0, 0);
#else
int pos = cat->find ("-field1");
categ = cat->left (pos);
#endif
#else
int pos = cat->find ("-field1");
cat->truncate(pos);
categ = *cat;
#endif
if (!categ.isEmpty())
{
dialog->CategoryField->insertItem (categ, -1);
if (firstCategory.isEmpty())
firstCategory = categ;
}
}
++it;
}
if (firstCategory.isEmpty())
setCategoryDialogFields(dialog);
else
setCategoryDialogFields(dialog, firstCategory);
// CategoryDialog *dialog = new CategoryDialog(this, "Category", TRUE);
if (initIcons)
{
Wait waitDialog(this, tr("Wait dialog"));
waitDialog.waitLabel->setText(tr("Gathering icons..."));
waitDialog.show();
qApp->processEvents();
#ifdef DESKTOP
QDir d(iconPath);
#else
- QDir d(QPEApplication::qpeDir() + "/pics/");
+ QDir d(QPEApplication::qpeDir() + "pics/");
#endif
d.setFilter( QDir::Files);
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
dialog->IconField->insertItem("predefined");
while ( (fi=it.current()) ) { // for each file...
QString fileName = fi->fileName();
if(fileName.right(4) == ".png"){
fileName = fileName.mid(0,fileName.length()-4);
#ifdef DESKTOP
QPixmap imageOfFile;
imageOfFile.load(iconPath + fi->fileName());
#else
QPixmap imageOfFile(Resource::loadPixmap(fileName));
#endif
QImage foo = imageOfFile.convertToImage();
foo = foo.smoothScale(16,16);
imageOfFile.convertFromImage(foo);
dialog->IconField->insertItem(imageOfFile,fileName);
}
++it;
}
waitDialog.hide();
}
#ifndef Q_WS_WIN
dialog->show();
#endif
#ifndef DESKTOP
// dialog->move (20, 100);
#endif
DialogCode result = (DialogCode) dialog->exec();
#ifdef DESKTOP
result = Accepted;
#endif
QString category;
QString icon;
QString fullIconPath;
QPixmap *pix;
if (result == Accepted)
{
modified = true;
category = dialog->CategoryField->currentText();
icon = dialog->IconField->currentText()+".png";
#ifndef NO_OPIE
owarn << category << oendl;
#endif
QListViewItem *li = new ShadedListItem( 1, ListView );
Category *c1 = new Category();
c1->setCategoryName(category);
// if (!icon.isEmpty() && !icon.isNull())
if (icon != "predefined.png")
{
// build the full path
fullIconPath = iconPath + icon;
pix = new QPixmap (fullIconPath);
// pix->resize(14, 14);
if (!pix->isNull())
{
// save the full pixmap name into the config file
// #ifndef Q_WS_WIN
conf->writeEntry(APP_KEY+category, icon);
// #endif
saveConf();
QImage img = pix->convertToImage();
pix->convertFromImage(img.smoothScale(14,14));
c1->setIcon (*pix);
c1->setIconName(icon);
}
else
{
QPixmap folder( ( const char** ) general_data );
c1->setIcon (folder);
}
}
else
{
c1->setIcon (*getPredefinedIcon(category));
}
c1->setListItem (li);
c1->initListItem();
categories.insert (c1->getCategoryName(), c1);
saveCategoryDialogFields(dialog);
}
else
{
// delete dialog;
dialog->hide();
return;
}
}
}
void ZSafe::delCategory()
{
if (!selectedItem)
return;
if (isCategory(selectedItem))
{
switch( QMessageBox::information( this, tr("ZSafe"),
tr("Do you want to delete?"),
tr("&Delete"), tr("D&on't Delete"),
0 // Enter == button 0
) ) { // Escape == button 2
case 0: // Delete clicked, Alt-S or Enter pressed.
// Delete from the category list
modified = true;
categories.remove (selectedItem->text(0));
// #ifndef Q_WS_WIN
conf->removeEntry (selectedItem->text(0));
// #endif
saveConf();
// Delete the selected item and all subitems
// step through all subitems
QListViewItem *si;
for (si = selectedItem->firstChild();
si != NULL; )
{
QListViewItem *_si = si;
si = si->nextSibling();
selectedItem->takeItem(_si); // remove from view list
if (_si) delete _si;
}
ListView->takeItem(selectedItem);
delete selectedItem;
selectedItem = NULL;
break;
case 1: // Don't delete
break;
}
}
}
void ZSafe::setCategoryDialogFields(CategoryDialog *dialog)
{
if (!dialog)
return;
QString icon;
if (selectedItem)
{
dialog->Field1->setText(getFieldLabel (selectedItem, "1", tr("Name")));
dialog->Field2->setText(getFieldLabel (selectedItem, "2", tr("Username")));
dialog->Field3->setText(getFieldLabel (selectedItem, "3", tr("Password")));
dialog->Field4->setText(getFieldLabel (selectedItem, "4", tr("Comment")));
dialog->Field5->setText(getFieldLabel (selectedItem, "5", tr("Field 4")));
dialog->Field6->setText(getFieldLabel (selectedItem, "6", tr("Field 5")));
Category *cat= categories.find (selectedItem->text(0));
if (cat)
{
icon = cat->getIconName();
}
else
icon = conf->readEntry(APP_KEY+selectedItem->text(0));
}
else
{
dialog->Field1->setText(tr("Name"));
dialog->Field2->setText(tr("Username"));
dialog->Field3->setText(tr("Password"));
dialog->Field4->setText(tr("Comment"));
dialog->Field5->setText(tr("Field 4"));
dialog->Field6->setText(tr("Field 5"));
}
#ifdef DESKTOP
QDir d(iconPath);
#else
- QDir d(QPEApplication::qpeDir() + "/pics/");
+ QDir d(QPEApplication::qpeDir() + "pics/");
#endif
d.setFilter( QDir::Files);
const QFileInfoList *list = d.entryInfoList();
int i=0;
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
if (icon.isEmpty() || icon.isNull())
{
dialog->IconField->setCurrentItem(0);
}
else
{
while ( (fi=it.current()) )
{ // for each file...
QString fileName = fi->fileName();
if(fileName.right(4) == ".png")
{
fileName = fileName.mid(0,fileName.length()-4);
if(fileName+".png"==icon)
{
dialog->IconField->setCurrentItem(i+1);
break;
}
++i;
}
++it;
}
}
}
void ZSafe::setCategoryDialogFields(CategoryDialog *dialog, QString category)
{
if (!dialog)
return;
dialog->Field1->setText(getFieldLabel (category, "1", tr("Name")));
dialog->Field2->setText(getFieldLabel (category, "2", tr("Username")));
dialog->Field3->setText(getFieldLabel (category, "3", tr("Password")));
dialog->Field4->setText(getFieldLabel (category, "4", tr("Comment")));
dialog->Field5->setText(getFieldLabel (category, "5", tr("Field 4")));
dialog->Field6->setText(getFieldLabel (category, "6", tr("Field 5")));
QString icon;
Category *cat= categories.find (category);
if (cat)
{
icon = cat->getIconName();
}
else
icon = conf->readEntry(APP_KEY+category);
#ifdef DESKTOP
QDir d(iconPath);
#else
- QDir d(QPEApplication::qpeDir() + "/pics/");
+ QDir d(QPEApplication::qpeDir() + "pics/");
#endif
d.setFilter( QDir::Files);
const QFileInfoList *list = d.entryInfoList();
int i=0;
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
if (icon.isEmpty() || icon.isNull())
{
dialog->IconField->setCurrentItem(0);
}
else
{
while ( (fi=it.current()) )
{ // for each file...
QString fileName = fi->fileName();
if(fileName.right(4) == ".png")
{
fileName = fileName.mid(0,fileName.length()-4);
if(fileName+".png"==icon)
{
dialog->IconField->setCurrentItem(i+1);
break;
}
++i;
}
++it;
}
}
}
void ZSafe::saveCategoryDialogFields(CategoryDialog *dialog)
{
QString app_key = APP_KEY;
#ifndef DESKTOP
conf->setGroup ("fieldDefs");
#else
#ifndef Q_WS_WIN
app_key += "/fieldDefs/";
#endif
#endif
QString category = dialog->CategoryField->currentText();
// #ifndef Q_WS_WIN
conf->writeEntry(app_key+category+"-field1", dialog->Field1->text());
conf->writeEntry(app_key+category+"-field2", dialog->Field2->text());
conf->writeEntry(app_key+category+"-field3", dialog->Field3->text());
conf->writeEntry(app_key+category+"-field4", dialog->Field4->text());
conf->writeEntry(app_key+category+"-field5", dialog->Field5->text());
conf->writeEntry(app_key+category+"-field6", dialog->Field6->text());
// #endif
saveConf();
#ifndef DESKTOP
conf->setGroup ("zsafe");
#endif
}
void ZSafe::editCategory()
{
if (!selectedItem)
return;
if (isCategory(selectedItem))
{
QString category = selectedItem->text(0);
bool initIcons = false;
// open the 'Category' dialog
CategoryDialog *dialog;
if (categoryDialog)
{
dialog = categoryDialog;
}
else
{
categoryDialog = new CategoryDialog(this, tr("Category"), TRUE);
#ifdef Q_WS_WIN
categoryDialog->setCaption ("Qt " + tr("Category"));
#endif
dialog = categoryDialog;
connect( dialog->CategoryField,
SIGNAL( activated(const QString&)),
this, SLOT( categoryFieldActivated(const QString&) ) );
initIcons = true;
}
setCategoryDialogFields(dialog);
#ifdef DESKTOP
#ifndef Q_WS_WIN
QStringList list = conf->entryList( APP_KEY+"/fieldDefs" );
#else
// read all categories from the config file and store
// into a list
QFile f (cfgFile);
QStringList list;
if ( f.open(IO_ReadOnly) ) { // file opened successfully
QTextStream t( &f ); // use a text stream
QString s;
int n = 1;
while ( !t.eof() ) { // until end of file...
s = t.readLine(); // line of text excluding '\n'
list.append(s);
}
f.close();
}
#endif
#else
// read all categories from the config file and store
// into a list
QFile f (cfgFile);
QStringList list;
if ( f.open(IO_ReadOnly) ) { // file opened successfully
QTextStream t( &f ); // use a text stream
QString s;
while ( !t.eof() ) { // until end of file...
s = t.readLine(); // line of text excluding '\n'
list.append(s);
}
f.close();
}
#endif
QStringList::Iterator it = list.begin();
QString categ;
dialog->CategoryField->clear(); // remove all items
int i=0;
bool foundCategory = false;
while( it != list.end() )
{
QString *cat = new QString (*it);
if (cat->contains("-field1", FALSE))
{
#ifdef DESKTOP
#ifndef Q_WS_WIN
categ = cat->section ("-field1", 0, 0);
#else
int pos = cat->find ("-field1");
categ = cat->left (pos);
#endif
#else
int pos = cat->find ("-field1");
cat->truncate(pos);
categ = *cat;
#endif
if (!categ.isEmpty())
{
dialog->CategoryField->insertItem (categ, i);
if (category.compare(categ) == 0)
{
dialog->CategoryField->setCurrentItem(i);
foundCategory = true;
}
i++;
}
}
++it;
}
if (!foundCategory)
{
dialog->CategoryField->insertItem (category, i);
dialog->CategoryField->setCurrentItem(i);
}
QString icon;
Category *cat= categories.find (selectedItem->text(0));
if (cat)
{
icon = cat->getIconName();
}
if (initIcons)
{
Wait waitDialog(this, tr("Wait dialog"));
waitDialog.waitLabel->setText(tr("Gathering icons..."));
waitDialog.show();
qApp->processEvents();
#ifdef DESKTOP
QDir d(iconPath);
#else
- QDir d(QPEApplication::qpeDir() + "/pics/");
+ QDir d(QPEApplication::qpeDir() + "pics/");
#endif
d.setFilter( QDir::Files);
const QFileInfoList *list = d.entryInfoList();
int i=0;
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
if (icon.isEmpty() || icon.isNull())
{
dialog->IconField->setCurrentItem(0);
}
dialog->IconField->insertItem("predefined");
while ( (fi=it.current()) ) { // for each file...
QString fileName = fi->fileName();
if(fileName.right(4) == ".png")
{
fileName = fileName.mid(0,fileName.length()-4);
#ifdef DESKTOP
QPixmap imageOfFile;
imageOfFile.load(iconPath + fi->fileName());
#else
QPixmap imageOfFile(Resource::loadPixmap(fileName));
#endif
QImage foo = imageOfFile.convertToImage();
foo = foo.smoothScale(16,16);
imageOfFile.convertFromImage(foo);
dialog->IconField->insertItem(imageOfFile,fileName);
if(fileName+".png"==icon)
dialog->IconField->setCurrentItem(i+1);
++i;
}
++it;
}
waitDialog.hide();
}
else
{
#ifdef DESKTOP
// QDir d(QDir::homeDirPath() + "/pics/");
QDir d(iconPath);
#else
- QDir d(QPEApplication::qpeDir() + "/pics/");
+ QDir d(QPEApplication::qpeDir() + "pics/");
#endif
d.setFilter( QDir::Files);
const QFileInfoList *list = d.entryInfoList();
int i=0;
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
if (icon.isEmpty() || icon.isNull())
{
dialog->IconField->setCurrentItem(0);
}
else
{
while ( (fi=it.current()) )
{ // for each file...
QString fileName = fi->fileName();
if(fileName.right(4) == ".png")
{
fileName = fileName.mid(0,fileName.length()-4);
if(fileName+".png"==icon)
{
dialog->IconField->setCurrentItem(i+1);
break;
}
++i;
}
++it;
}
}
}
// dialog->show();
#ifndef DESKTOP
// dialog->move (20, 100);
#endif
DialogCode result = (DialogCode) dialog->exec();
#ifdef DESKTOP
result = Accepted;
#endif
QString fullIconPath;
QPixmap *pix;
if (result == Accepted)
{
modified = true;
if (category != dialog->CategoryField->currentText())
{
categories.remove (category);
// #ifndef Q_WS_WIN
conf->removeEntry(category);
// #endif
saveConf();
}
category = dialog->CategoryField->currentText();
icon = dialog->IconField->currentText()+".png";
if (cat)
{
#ifndef NO_OPIE
owarn << "Category found" << oendl;
#else
qWarning("Category found");
#endif
// if (!icon.isEmpty() && !icon.isNull())
if (icon != "predefined.png")
{
// build the full path
fullIconPath = iconPath + icon;
pix = new QPixmap (fullIconPath);
if (!pix->isNull())
{
// save the full pixmap name into the config file
// #ifndef Q_WS_WIN
conf->writeEntry(APP_KEY+category, icon);
// #endif
saveConf();
QImage img = pix->convertToImage();
pix->convertFromImage(img.smoothScale(14,14));
cat->setIconName (icon);
cat->setIcon (*pix);
}
}
else
{
// #ifndef Q_WS_WIN
conf->removeEntry (category);
// #endif
saveConf();
cat->setIcon (*getPredefinedIcon(category));
}
// change the category name of the selected category
QListViewItem *catItem = cat->getListItem();
if (catItem)
{
#ifndef NO_OPIE
owarn << category << oendl;
#else
qWarning (category);
#endif
catItem->setText( 0, tr( category ) );
cat->setCategoryName (tr(category));
cat->initListItem();
categories.insert (category, cat);
}
}
saveCategoryDialogFields(dialog);
}
else
{
// delete dialog;
dialog->hide();
return;
}
}
}
void ZSafe::cutItem()
{
if (!selectedItem)
return;
if (!isCategory(selectedItem))
{
IsCut = true;
copiedItem = selectedItem;
}
}
void ZSafe::copyItem()
{
if (!selectedItem)
return;
if (!isCategory(selectedItem))
{
IsCopy = true;
copiedItem = selectedItem;
}
}
// paste item into category
void ZSafe::pasteItem()
{
if (!selectedItem)
return;
if (isCategory(selectedItem))
{
modified = true;
if (IsCut)
{
if (copiedItem)
{
// add the new item
QListViewItem *i = new ShadedListItem (0, selectedItem);
// i->setOpen (TRUE);
i->setText (0, copiedItem->text(0));
i->setText (1, copiedItem->text(1));
i->setText (2, copiedItem->text(2));
i->setText (3, copiedItem->text(3));
i->setText (4, copiedItem->text(4));
i->setText (5, copiedItem->text(5));
selectedItem->setOpen( TRUE );
// remove the cutted item
copiedItem->parent()->takeItem(copiedItem);
selectedItem = NULL;
}
}
else if (IsCopy)
{
if (copiedItem)
{
// add the new item
QListViewItem *i = new ShadedListItem (0, selectedItem);
// i->setOpen (TRUE);
i->setText (0, copiedItem->text(0));
i->setText (1, copiedItem->text(1));
i->setText (2, copiedItem->text(2));
i->setText (3, copiedItem->text(3));
i->setText (4, copiedItem->text(4));
i->setText (5, copiedItem->text(5));
selectedItem->setOpen( TRUE );
}
}
}
IsCut = false;
IsCopy = false;
}
void ZSafe::newDocument()
{
// open the file dialog
QString newFile = zsaveDialog();
// open the new document
if (newFile && newFile.length() > 0 )
{
// save the previous opened document
if (!filename.isEmpty())
saveDocument(filename, FALSE);
modified = true;
// clear the password list
QListViewItem *i;
QListViewItem *c = NULL;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
if (c) delete c; // delete the previous category
c = i;
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL; )
{
QListViewItem *_si = si;
si = si->nextSibling();
i->takeItem(_si); // remove from view list
if (_si) delete _si;
}
}
if (c) delete c; // delete the previous category
categories.clear();
// m_password = "";
selectedItem = NULL;
filename = newFile;
// save the current filename to the config file
conf->writeEntry(APP_KEY+"document", filename);
saveConf();
QString ti = filename.right (filename.length() - filename.findRev ('/') - 1);
#ifdef Q_WS_WIN
this->setCaption("Qt ZSafe: " + ti);
#else
this->setCaption("ZSafe: " + ti);
#endif
// openDocument(filename);
QMessageBox::information( this, tr("ZSafe"),
tr("Now you have to enter\na password twice for your\nnewly created document."), tr("&OK"), 0);
saveDocumentWithPwd();
}
}
void ZSafe::loadDocument()
{
// open the file dialog
#ifndef DESKTOP
#ifndef NO_OPIE
QMap<QString, QStringList> mimeTypes;
mimeTypes.insert(tr("All"), QStringList() );
mimeTypes.insert(tr("ZSafe"), "zsafe/*" );
QString newFile = OFileDialog::getOpenFileName( OFileSelector::EXTENDED_ALL,
QDir::homeDirPath() + "/Documents/application/zsafe",
QString::null,
mimeTypes,
this,
tr ("Open ZSafe document"));
#else
QString newFile = ScQtFileEdit::getOpenFileName(this,
tr ("Open ZSafe document"),
QDir::homeDirPath() + "/Documents/application/zsafe",
"*.zsf");
#endif
#else
QString newFile = QFileDialog::getOpenFileName(
QDir::homeDirPath() + "/Documents/application/zsafe",
"ZSafe (*.zsf)",
this,
"ZSafe File Dialog"
"Choose a ZSafe file" );
#endif
// open the new document
if (newFile && newFile.length() > 0 )
{
// save the previous opened document
if (!filename.isEmpty())
saveDocument(filename, FALSE);
// clear the password list
QListViewItem *i;
QListViewItem *c = NULL;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
if (c) delete c; // delete the previous category
c = i;
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL; )
{
QListViewItem *_si = si;
si = si->nextSibling();
i->takeItem(_si); // remove from view list
if (_si) delete _si;
}
}
if (c) delete c; // delete the previous category
categories.clear();
m_password = "";
selectedItem = NULL;
filename = newFile;
// save the current filename to the config file
conf->writeEntry(APP_KEY+"document", filename);
saveConf();
QString ti = filename.right (filename.length() - filename.findRev ('/') - 1);
#ifdef Q_WS_WIN
this->setCaption("Qt ZSafe: " + ti);
#else
this->setCaption("ZSafe: " + ti);
#endif
openDocument(filename);
}
}
void ZSafe::saveDocumentAs()
{
QString newFile = zsaveDialog();
// open the new document
if (newFile && newFile.length() > 0 )
{
// save the previous opened document
if (!filename.isEmpty())
saveDocument(filename, FALSE);
selectedItem = NULL;
filename = newFile;
// save the current filename to the config file
conf->writeEntry(APP_KEY+"document", filename);
saveConf();
QString ti = filename.right (filename.length() - filename.findRev ('/') - 1);
#ifdef Q_WS_WIN
this->setCaption("Qt ZSafe: " + ti);
#else
this->setCaption("ZSafe: " + ti);
#endif
QMessageBox::information( this, tr("ZSafe"),
tr("Now you have to enter\na password twice for your\nnewly created document."), tr("&OK"), 0);
saveDocumentWithPwd();
}
}
void ZSafe::saveDocumentWithoutPwd()
{
saveDocument(filename, FALSE);
}
void ZSafe::saveDocumentWithPwd()
{
saveDocument(filename, TRUE);
}
void ZSafe::about()
{
QString info;
#ifdef JPATCH_HDE
info = "<html><body><div align=""center"">";
info += "<b>";
info += tr("Zaurus Password Manager<br>");
info += tr("ZSafe version 2.1.2-jv01b<br>");
info += "</b>";
info += tr("by Carsten Schneider<br>");
info += "zcarsten@gmx.net<br>";
info += "http://z-soft.z-portal.info/zsafe";
info += "<br>";
info += tr("Translations by Robert Ernst<br>");
info += "robert.ernst@linux-solutions.at<br>";
info += "<br><br>";
info += QString::fromUtf8("~W~\\~^/VGA Zaurus対~\\~C~Q~C~C~C~A~\\ ~H~P<br>");
info += "HADECO R&D<br>";
info += "r&d@hadeco.co.jp<br>";
info += "http://www.hadeco.co.jp/r&d/<br>";
info += "<br></div>";
info += "</body></html>";
#else
info = "<html><body><div align=""center"">";
info += "<b>";
info += tr("Zaurus Password Manager<br>");
info += tr("ZSafe version 2.1.2<br>");
info += "</b>";
info += tr("by Carsten Schneider<br>");
info += "zcarsten@gmx.net<br>";
info += "http://z-soft.z-portal.info/zsafe";
info += "<br>";
info += tr("Translations by Robert Ernst<br>");
info += "robert.ernst@linux-solutions.at<br>";
info += "<br></div>";
info += "</body></html>";
#endif
// QMessageBox::information( this, tr("ZSafe"), info, tr("&OK"), 0);
QMessageBox mb( this, tr("ZSafe"));
mb.setText (info);
mb.setButtonText (QMessageBox::Ok, tr ("&OK"));
QPixmap zsafe_img((const char**) zsafe_xpm);
mb.setIconPixmap (zsafe_img);
mb.exec();
}
void ZSafe::setExpandFlag()
{
expandTree = !expandTree;
file->setItemChecked('o', expandTree);
#ifndef DESKTOP
conf->setGroup ("zsafePrefs");
#endif
// #ifndef Q_WS_WIN
conf->writeEntry (APP_KEY+"expandTree", expandTree);
// #endif
saveConf();
}
void ZSafe::paintEvent( QPaintEvent * )
{
if (raiseFlag)
{
raiseFlag = false;
raiseTimer.start (1, true);
if (infoForm->isVisible())
infoForm->raise();
}
}
void ZSafe::resizeEvent ( QResizeEvent * )
{
// owarn << "resizeEvent" << oendl;
#ifndef DESKTOP
DeskW = appl->desktop()->width();
DeskH = appl->desktop()->height();
#else
DeskW = this->width();
DeskH = this->height();
#endif
if (New)
New->setGeometry ( QRect( DeskW-84, 2, 20, 20 ) );
if (Edit)
Edit->setGeometry ( QRect( DeskW-64, 2, 20, 20 ) );
if (Delete)
Delete->setGeometry( QRect( DeskW-44, 2, 20, 20 ) );
if (Find)
Find->setGeometry ( QRect( DeskW-24, 2, 20, 20 ) );
}
void ZSafe::slotRaiseTimer()
{
if (infoForm->isVisible())
infoForm->raise();
raiseFlag = true;
}
QPixmap * ZSafe::getPredefinedIcon(QString category)
{
QPixmap *pm;
if (category == "Bank cards")
pm = new QPixmap((const char**)bank_cards_data);
else if (category == "Passwords")
pm = new QPixmap((const char**)passwords_data);
else if (category == "Software")
pm = new QPixmap((const char**)software_data);
else if (category == "General")
pm = new QPixmap((const char**)general_data);
else
pm = new QPixmap((const char**)general_data);
return pm;
}
void ZSafe::setDocument(const QString& fileref)
{
#ifndef DESKTOP
// stop the timer to prevent loading of the default document
docuTimer.stop();
DocLnk link(fileref);
if ( link.isValid() )
{
// if (filename != link.file())
// saveDocument(filename, FALSE);
filename = link.file();
}
else
{
// if (filename != fileref)
// saveDocument(filename, FALSE);
filename = fileref;
}
// save the current filename to the config file
conf->writeEntry(APP_KEY+"document", filename);
saveConf();
QString ti = filename.right (filename.length() - filename.findRev ('/') - 1);
#ifdef Q_WS_WIN
this->setCaption("Qt ZSafe: " + ti);
#else
this->setCaption("ZSafe: " + ti);
#endif
// clear the password list
QListViewItem *i;
QListViewItem *c = NULL;
// step through all categories
for (i = ListView->firstChild();
i != NULL;
i = i->nextSibling())
{
if (c) delete c; // delete the previous category
c = i;
// step through all subitems
QListViewItem *si;
for (si = i->firstChild();
si != NULL; )
{
QListViewItem *_si = si;
si = si->nextSibling();
i->takeItem(_si); // remove from view list
if (_si) delete _si;
}
}
if (c) delete c; // delete the previous category
categories.clear();
m_password = "";
selectedItem = NULL;
openDocument(filename);
#else
Q_UNUSED(fileref);
#endif
}
void ZSafe::ListPressed(int mouse, QListViewItem *item, const QPoint&, int column) {
if(item ==0) return;
switch (mouse) {
case 1:
{
#ifdef DESKTOP
QDragObject *d = new QTextDrag( item->text(column) , this );
d->dragCopy();
#endif
}
break;
case 2:
{
QClipboard *cb = QApplication::clipboard();
QIconSet copy_img((const char**) copy_xpm);
QIconSet edit_img((const char**) edit_xpm);
QPixmap folder_open_img((const char**) folder_open_xpm);
QPixmap editdelete_img((const char**) editdelete_xpm);
QPopupMenu *m = new QPopupMenu(this);
int copyItem = m->insertItem( copy_img, tr( "Copy to Clipboard" ));
int editItem = m->insertItem(edit_img, tr( "Edit" ));
int showItem = m->insertItem(folder_open_img, tr( "Show Info" ));
int cancelItem = m->insertItem( editdelete_img, tr( "Cancel" ));
m->setFocus();
int me=m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y() ) ) ;
if(me == copyItem) {
copyClip( item->text(column) ) ;
} else if (me == cancelItem) {
cb->clear();
} else if (me == editItem) {
editPwd();
} else if (me == showItem) {
showInfo(item);
}
}
break;
};
}
void ZSafe::copyClip( const QString &text) {
QClipboard *cb = QApplication::clipboard();
cb->setText( text);
}
QString ZSafe::zsaveDialog() {
QString fn;
#ifndef DESKTOP
#ifndef NO_OPIE
QMap<QString, QStringList> mimeTypes;
mimeTypes.insert(tr("All"), QStringList() );
mimeTypes.insert(tr("Text"), "text/*" );
fn = OFileDialog::getSaveFileName( OFileSelector::EXTENDED_ALL,
QDir::homeDirPath() + "/Documents/application/zsafe",
QString::null,
mimeTypes,
this,
tr ("Export text file"));
#else
fn = ScQtFileEdit::getSaveAsFileName(this,
tr ("Export text file"),
QDir::homeDirPath() + "/Documents/application/zsafe",
"*.txt");
#endif
#else
fn = QFileDialog::getSaveFileName(
QDir::homeDirPath() + "/Documents/application/zsafe",
"ZSafe (*.txt)",
this,
"ZSafe");
#endif
return fn;
}
diff --git a/noncore/games/backgammon/backgammon.cpp b/noncore/games/backgammon/backgammon.cpp
index bdb1c78..c286a36 100644
--- a/noncore/games/backgammon/backgammon.cpp
+++ b/noncore/games/backgammon/backgammon.cpp
@@ -1,975 +1,975 @@
#include "backgammon.h"
#include "aidialog.h"
#include "filedialog.h"
#include "playerdialog.h"
#include "rulesdialog.h"
#include "themedialog.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <qpe/resource.h>
using namespace Opie::Core;
/* QT */
#include <qfile.h>
#include <qlayout.h>
#include <qmessagebox.h>
#include <qtimer.h>
#include <qmenubar.h>
#include <stdlib.h>
BackGammon::BackGammon(QWidget* parent, const char* name, WFlags fl)
: QMainWindow(parent, name, fl)
{
if (!name) setName("BackGammon");
setCaption(tr( "Backgammon") );
setIcon( Resource::loadPixmap( "backgammon" ) );
//general counter varaible
int a=0;
//the game engine
move=new MoveEngine();
//load the default theme
Config conf("backgammon");
if(!conf.isValid())
{
odebug << "config file does not exist" << oendl;
conf.setGroup("general");
conf.writeEntry("theme","default");
conf.setGroup("rules");
conf.writeEntry("move_with_pieces_out",false);
conf.writeEntry("nice_dice",false);
conf.setGroup("display");
conf.writeEntry("small",false);
conf.writeEntry("warning",true);
conf.setGroup("ai");
conf.writeEntry("rescue",6);
conf.writeEntry("eliminate",4);
conf.writeEntry("expose",1);
conf.writeEntry("protect",5);
conf.writeEntry("safe",3);
conf.writeEntry("empty",2);
}
conf.setGroup("general");
theme_name=conf.readEntry("theme","default");
- QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme";
+ QString theme_file=QPEApplication::qpeDir()+"backgammon/"+theme_name+".theme";
//the rules
conf.setGroup("rules");
rules.move_with_pieces_out=conf.readBoolEntry("move_with_pieces_out",false);
rules.generous_dice=conf.readBoolEntry("nice_dice",false);
move->setRules(rules);
//get the AI settings
AISettings ai;
conf.setGroup("ai");
ai.rescue=conf.readNumEntry("rescue",6);
ai.eliminate=conf.readNumEntry("eliminate",4);
ai.expose=conf.readNumEntry("expose",1);
ai.protect=conf.readNumEntry("protect",5);
ai.safe=conf.readNumEntry("safe",3);
ai.empty=conf.readNumEntry("empty",2);
move->setAISettings(ai);
//get the theme component names
Config theme(theme_file,Config::File);
if(!theme.isValid())
{
odebug << "theme file does not exist" << oendl;
theme.setGroup("theme");
theme.writeEntry("board","casino_board_1");
theme.writeEntry("pieces1","casino_pieces_blue");
theme.writeEntry("pieces2","casino_pieces_white");
theme.writeEntry("dice1","casino_dice");
theme.writeEntry("dice2","casino_dice");
theme.writeEntry("table","casino_table_green");
theme.writeEntry("odds","casino_odds");
}
theme.setGroup("theme");
board_name=theme.readEntry("board","casino_board_1");
piecesA_name=theme.readEntry("pieces1","casino_pieces_blue");
piecesB_name=theme.readEntry("pieces2","casino_pieces_white");
diceA_name=theme.readEntry("dice1","casino_dice");
diceB_name=theme.readEntry("dice2","casino_dice");
table_name=theme.readEntry("table","casino_table_green");
odds_name=theme.readEntry("odds","casino_odds");
//the menu
QMenuBar* menuBar = new QMenuBar(this);
QPopupMenu* gamemenu= new QPopupMenu(this);
gamemenu->insertItem(tr( "New" ),this,SLOT(newgame()));
gamemenu->insertSeparator();
gamemenu->insertItem(tr( "Load" ),this,SLOT(loadgame()));
gamemenu->insertItem(tr( "Save" ),this,SLOT(savegame()));
gamemenu->insertSeparator();
gamemenu->insertItem(tr( "Delete" ),this,SLOT(deletegame()));
menuBar->insertItem(tr( "Game" ),gamemenu);
QPopupMenu* thememenu= new QPopupMenu(this);
thememenu->insertItem(tr( "New" ),this,SLOT(newtheme()));
thememenu->insertSeparator();
thememenu->insertItem(tr( "Load"),this,SLOT(loadtheme()));
thememenu->insertItem(tr( "Save" ),this,SLOT(savetheme()));
thememenu->insertSeparator();
thememenu->insertItem(tr( "Default"),this,SLOT(themedefault()));
thememenu->insertItem(tr( "Delete" ),this,SLOT(deletetheme()));
menuBar->insertItem(tr( "Theme" ),thememenu);
QPopupMenu* optionmenu=new QPopupMenu(this);
optionmenu->insertItem(tr( "Player" ),this,SLOT(playerselect()));
optionmenu->insertSeparator();
optionmenu->insertItem(tr( "AI" ),this,SLOT(modify_AI()));
optionmenu->insertItem(tr( "Rules" ),this,SLOT(setrules()));
menuBar->insertItem(tr( "Options"),optionmenu);
QWidget* mainarea=new QWidget(this);
setCentralWidget(mainarea);
//the main area
QBoxLayout* layout=new QBoxLayout(mainarea,QBoxLayout::TopToBottom);
area=new QCanvas(235,235);
boardview=new BackGammonView(area,mainarea);
boardview->setMaximumHeight(240);
layout->addWidget(boardview);
connect(boardview,SIGNAL(mouse(int,int)),this,SLOT(mouse(int,int)));
//status bar
message=new QLabel("<b>Backgammon</b>",mainarea);
message->setAlignment(AlignHCenter);
layout->addWidget(message);
//the marker
marker_current=new QCanvasRectangle(area);
marker_current->setBrush(QColor(0,0,255));
marker_current->setSize(15,5);
marker_current->setZ(1);
for(a=0;a<4;a++)
{
marker_next[a]=new QCanvasRectangle(area);
marker_next[a]->setBrush(QColor(0,255,0));
marker_next[a]->setSize(15,5);
marker_next[a]->setZ(1);
}
connect(move,SIGNAL(done_dice1()),this,SLOT(done_dice1()));
connect(move,SIGNAL(done_dice2()),this,SLOT(done_dice2()));
connect(move,SIGNAL(done_dice3()),this,SLOT(done_dice3()));
connect(move,SIGNAL(done_dice4()),this,SLOT(done_dice4()));
connect(move,SIGNAL(nomove()),this,SLOT(nomove()));
connect(move,SIGNAL(player_finished(int)),this,SLOT(finished(int)));
//the pieces
p1=new CanvasImageItem*[15];
p1_side=new CanvasImageItem*[15];
QImage piece_1_all(Resource::loadImage("backgammon/pieces/"+piecesA_name));
QImage piece_1_front=piece_1_all.copy(0,0,15,15);
QImage piece_1_side=piece_1_all.copy(0,15,15,5);
p2=new CanvasImageItem*[15];
p2_side=new CanvasImageItem*[15];
QImage piece_2_all(Resource::loadImage("backgammon/pieces/"+piecesB_name));
QImage piece_2_front=piece_2_all.copy(0,0,15,15);
QImage piece_2_side=piece_2_all.copy(0,15,15,5);
for(a=0;a<15;a++)
{
p1[a]=new CanvasImageItem(piece_1_front,area);
p1[a]->setSize(15,15);
p1_side[a]=new CanvasImageItem(piece_1_side,area);
p1_side[a]->setSize(15,5);
p2[a]=new CanvasImageItem(piece_2_front,area);
p2[a]->setSize(15,15);
p2_side[a]=new CanvasImageItem(piece_2_side,area);
p2_side[a]->setSize(15,5);
}
draw();
//the dice
QImage dicebgA_all(Resource::loadImage("backgammon/dice/"+diceA_name));
diceA1=new CanvasImageItem*[7];
diceA2=new CanvasImageItem*[7];
QImage dicebgB_all(Resource::loadImage("backgammon/dice/"+diceB_name));
diceB1=new CanvasImageItem*[7];
diceB2=new CanvasImageItem*[7];
QImage oddsbg_all=(Resource::loadImage("backgammon/odds/"+odds_name));
//oddsDice=new CanvasImageItem*[6];
for(a=0;a<7;a++)
{
QImage dicebgA=dicebgA_all.copy(a*25,0,25,25);
diceA1[a]=new CanvasImageItem(dicebgA,area);
diceA1[a]->setX(5);
diceA1[a]->setY(205-2);
diceA1[a]->setZ(1);
diceA1[a]->setSize(25,25);
diceA2[a]=new CanvasImageItem(dicebgA,area);
diceA2[a]->setX(35);
diceA2[a]->setY(205-2);
diceA2[a]->setZ(1);
diceA2[a]->setSize(25,25);
QImage dicebgB=dicebgB_all.copy(a*25,0,25,25);
diceB1[a]=new CanvasImageItem(dicebgB,area);
diceB1[a]->setX(175);
diceB1[a]->setY(205-2);
diceB1[a]->setZ(1);
diceB1[a]->setSize(25,25);
diceB2[a]=new CanvasImageItem(dicebgB,area);
diceB2[a]->setX(205);
diceB2[a]->setY(205-2);
diceB2[a]->setZ(1);
diceB2[a]->setSize(25,25);
/*
if(a<6)
{
QImage oddsbg=oddsbg_all.copy(a*15,0,15,15);
oddsDice[a]=new CanvasImageItem(oddsbg,area);
oddsDice[a]->setX(110);
oddsDice[a]->setY(210-2);
oddsDice[a]->setZ(1);
oddsDice[a]->setSize(15,15);
oddsDice[a]->hide();
}
*/
}
//oddsDice[0]->show();
//set the board
QImage boardbg(Resource::loadImage("backgammon/boards/"+board_name));
board=new CanvasImageItem(boardbg,area);
board->setX(0);
board->setY(0);
board->setZ(0);
board->setSize(235-2,200-2);
board->show();
//the table
QImage tablebg(Resource::loadImage("backgammon/table/"+table_name));
table=new CanvasImageItem(tablebg,area);
table->setX(0);
table->setY(200-2);
table->setZ(0);
table->setSize(235-2,20);
table->show();
//the no move marker
QImage nomovebg(Resource::loadImage("backgammon/no_move"));
nomove_marker=new CanvasImageItem(nomovebg,area);
nomove_marker->setX(0);
nomove_marker->setY(200);
nomove_marker->setZ(2);
nomove_marker->hide();
//default human against computer
player1_auto=false;
player2_auto=true;
//start new game
newgame();
}
BackGammon::~BackGammon()
{
//DESTRUCTOR
}
void BackGammon::newgame()
{
gameFinished=false;
QDateTime now=QDateTime::currentDateTime();
game_name=now.date().toString()+"_"+now.time().toString();
move->reset();
draw();
diceA1_value=7;
diceA2_value=7;
diceA3_value=7;
diceA4_value=7;
diceB1_value=7;
diceB2_value=7;
diceB3_value=7;
diceB4_value=7;
showdice();
player=2;
dice1_played=true;
dice2_played=true;
dice3_played=true;
dice4_played=true;
dice_rolled=false;
setplayer();
area->update();
}
void BackGammon::playerselect()
{
PlayerDialog* playerdialog=new PlayerDialog(this);
playerdialog->setAuto1(player1_auto);
playerdialog->setAuto2(player2_auto);
if(!playerdialog->exec())
return;
player1_auto=playerdialog->getAuto1();
player2_auto=playerdialog->getAuto2();
}
void BackGammon::loadgame()
{
FileDialog* file=new FileDialog(this,"Load Game",".game");
if(!file->exec())
return;
game_name=file->filename();
- QString game_file=QPEApplication::qpeDir()+"/backgammon/"+game_name+".game";
+ QString game_file=QPEApplication::qpeDir()+"backgammon/"+game_name+".game";
Config game(game_file,Config::File);
game.setGroup("dice");
diceA1_value=game.readNumEntry("diceA1_value");
diceA2_value=game.readNumEntry("diceA2_value");
diceA3_value=game.readNumEntry("diceA3_value");
diceA4_value=game.readNumEntry("diceA4_value");
diceB1_value=game.readNumEntry("diceB1_value");
diceB2_value=game.readNumEntry("diceB2_value");
diceB3_value=game.readNumEntry("diceB3_value");
diceB4_value=game.readNumEntry("diceB4_value");
player=game.readNumEntry("player");
dice1_played=game.readBoolEntry("dice1_played");
dice2_played=game.readBoolEntry("dice2_played");
dice3_played=game.readBoolEntry("dice3_played");
dice4_played=game.readBoolEntry("dice4_played");
dice_rolled=game.readBoolEntry("dice_rolled");
player1_auto=game.readBoolEntry("player1_auto");
player2_auto=game.readBoolEntry("player2_auto");
game.setGroup("pieces");
QString label;
LoadSave load;
for(int a=0;a<28;a++)
{
label.setNum(a);
load.pop[a].total = game.readNumEntry(label,0);
}
move->loadGame(load);
setplayer();
showdice();
draw();
area->update();
}
void BackGammon::savegame()
{
- QString game_file=QPEApplication::qpeDir()+"/backgammon/"+game_name+".game";
+ QString game_file=QPEApplication::qpeDir()+"backgammon/"+game_name+".game";
Config game(game_file,Config::File);
game.setGroup("dice");
game.writeEntry("diceA1_value",diceA1_value);
game.writeEntry("diceA2_value",diceA2_value);
game.writeEntry("diceA3_value",diceA3_value);
game.writeEntry("diceA4_value",diceA4_value);
game.writeEntry("diceB1_value",diceB1_value);
game.writeEntry("diceB2_value",diceB3_value);
game.writeEntry("diceB3_value",diceB4_value);
game.writeEntry("diceB4_value",diceB4_value);
game.writeEntry("player",player);
game.writeEntry("dice1_played",dice1_played);
game.writeEntry("dice2_played",dice2_played);
game.writeEntry("dice3_played",dice3_played);
game.writeEntry("dice4_played",dice4_played);
game.writeEntry("dice_rolled",dice_rolled);
game.writeEntry("player1_auto",player1_auto);
game.writeEntry("player2_auto",player2_auto);
game.setGroup("pieces");
QString label;
LoadSave save=move->saveGame();
for(int a=0;a<28;a++)
{
label.setNum(a);
game.writeEntry(label,save.pop[a].total);
}
QMessageBox::information(this,"Backgammon","Game saved","OK");
}
void BackGammon::deletegame()
{
FileDialog* file=new FileDialog(this,"Delete Game",".game");
if(!file->exec())
return;
game_name=file->filename();
- QString game_file=QPEApplication::qpeDir()+"/backgammon/"+game_name+".game";
+ QString game_file=QPEApplication::qpeDir()+"backgammon/"+game_name+".game";
if(!QMessageBox::warning(this,"Backgammon","deleted game\n"+game_name+" ?","OK","Cancel"))
{
QFile(game_file).remove();
}
}
void BackGammon::newtheme()
{
ThemeDialog* theme=new ThemeDialog(this);
ImageNames names;
names.theme=theme_name;
names.board=board_name;
names.pieces1=piecesA_name;
names.pieces2=piecesB_name;
names.dice1=diceA_name;
names.dice2=diceB_name;
names.odds=odds_name;
names.table=table_name;
theme->setCurrent(names);
if(!theme->exec())
return;
names=theme->getNames();
theme_name=names.theme;
board_name=names.board;
piecesA_name=names.pieces1;
piecesB_name=names.pieces2;
diceA_name=names.dice1;
diceB_name=names.dice2;
odds_name=names.odds;
table_name=names.table;
applytheme();
}
void BackGammon::loadtheme()
{
FileDialog* file=new FileDialog(this,"Load Theme",".theme");
if(!file->exec())
return;
theme_name=file->filename();
- QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme";
+ QString theme_file=QPEApplication::qpeDir()+"backgammon/"+theme_name+".theme";
Config theme(theme_file,Config::File);
theme.setGroup("theme");
board_name=theme.readEntry("board","board_1");
piecesA_name=theme.readEntry("pieces1","pieces_1");
piecesB_name=theme.readEntry("pieces2","pieces_2");
diceA_name=theme.readEntry("dice1","dice_1");
diceB_name=theme.readEntry("dice2","dice_2");
table_name=theme.readEntry("table","table_1");
odds_name=theme.readEntry("odds","odds_1");
applytheme();
}
void BackGammon::savetheme()
{
if(theme_name=="default")
{
QMessageBox::information(this,"Backgammon","Sorry\nCannot overwrite default.theme","OK");
return;
}
- QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme";
+ QString theme_file=QPEApplication::qpeDir()+"backgammon/"+theme_name+".theme";
if(QMessageBox::information(this,"Backgammon","Save Theme\n"+theme_name,"Yes","No"))
return;
Config theme(theme_file,Config::File);
theme.setGroup("theme");
theme.writeEntry("board",board_name);
theme.writeEntry("pieces1",piecesA_name);
theme.writeEntry("pieces2",piecesB_name);
theme.writeEntry("dice1",diceA_name);
theme.writeEntry("dice2",diceB_name);
theme.writeEntry("table",table_name);
theme.writeEntry("odds",odds_name);
}
void BackGammon::themedefault()
{
if(QMessageBox::information(this,"Backgammon","Make Theme\n"+theme_name+"\nthe default theme","Yes","No"))
return;
Config conf("backgammon");
conf.setGroup("general");
conf.writeEntry("theme",theme_name);
}
void BackGammon::deletetheme()
{
FileDialog* file=new FileDialog(this,"Delete Theme",".theme");
if(!file->exec())
return;
theme_name=file->filename();
- QString theme_file=QPEApplication::qpeDir()+"/backgammon/"+theme_name+".theme";
+ QString theme_file=QPEApplication::qpeDir()+"backgammon/"+theme_name+".theme";
if(!QMessageBox::warning(this,tr( "Backgammon" ),tr( "deleted theme %1?").arg(theme_name),tr( "OK" ),tr( "Cancel" )))
{
QFile(theme_file).remove();
}
}
void BackGammon::modify_AI()
{
AI_Dialog* ai_mod=new AI_Dialog(this,tr( "Load Theme" ),".theme");
ai_mod->setAISettings(move->getAISettings());
if(!ai_mod->exec())
return;
//get the AI settings
AISettings ai=ai_mod->getAISettings();
move->setAISettings(ai);
//write new settings to conf file
Config conf("backgammon");
conf.setGroup("ai");
conf.writeEntry("rescue",ai.rescue);
conf.writeEntry("eliminate",ai.eliminate);
conf.writeEntry("expose",ai.expose);
conf.writeEntry("protect",ai.protect);
conf.writeEntry("safe",ai.safe);
conf.writeEntry("empty",ai.empty);
}
void BackGammon::setrules()
{
RulesDialog* rulesdialog=new RulesDialog(this,tr( "Load Theme" ),".theme");
rulesdialog->setRules(rules);
if(!rulesdialog->exec())
return;
rules=rulesdialog->getRules();
Config conf("backgammon");
conf.setGroup("rules");
conf.writeEntry("move_with_pieces_out",rules.move_with_pieces_out);
conf.writeEntry("nice_dice",rules.generous_dice);
move->setRules(rules);
}
void BackGammon::draw()
{
Pieces pieces;
move->position(pieces);
for(int a=0;a<15;a++)
{
if(!pieces.player1[a].side)
{
p1[a]->setX(pieces.player1[a].x);
p1[a]->setY(pieces.player1[a].y);
p1[a]->setZ(pieces.player1[a].z);
p1[a]->show();
p1_side[a]->hide();
}
else
{
p1_side[a]->setX(pieces.player1[a].x);
p1_side[a]->setY(pieces.player1[a].y);
p1_side[a]->setZ(pieces.player1[a].z);
p1_side[a]->show();
p1[a]->hide();
}
if(!pieces.player2[a].side)
{
p2[a]->setX(pieces.player2[a].x);
p2[a]->setY(pieces.player2[a].y);
p2[a]->setZ(pieces.player2[a].z);
p2[a]->show();
p2_side[a]->hide();
}
else
{
p2_side[a]->setX(pieces.player2[a].x);
p2_side[a]->setY(pieces.player2[a].y);
p2_side[a]->setZ(pieces.player2[a].z);
p2_side[a]->show();
p2[a]->hide();
}
}
}
void BackGammon::mouse(int x,int y)
{
if(gameFinished)
{
newgame();
return;
}
if(y<=200) //move pieces
{
if((player==1 && player1_auto) || (player==2 && player2_auto))
return;
Marker marker;
move->boardpressed(x,y,marker);
if(marker.visible_current)
{
marker_current->setX(marker.x_current);
marker_current->setY(marker.y_current);
marker_current->show();
}
else
{
marker_current->hide();
}
for(int a=0;a<4;a++)
{
if(marker.visible_next[a])
{
marker_next[a]->setX(marker.x_next[a]);
marker_next[a]->setY(marker.y_next[a]);
marker_next[a]->show();
}
else
{
marker_next[a]->hide();
}
}
area->update();
}
else //roll dice
{
if(x>=10 && x<=65 && player==1 && !dice_rolled)
{
dice1_played=false;
dice2_played=false;
dice3_played=false;
dice4_played=false;
dice_rolled=true;
srand(QTime::currentTime().msec());
diceA1_value=1+(int) (6.0*rand()/(RAND_MAX+1.0));
diceA2_value=1+(int) (6.0*rand()/(RAND_MAX+1.0));
if(diceA1_value==diceA2_value)
{
diceA3_value=diceA1_value;
diceA4_value=diceA1_value;
}
else
{
diceA3_value=7;
dice3_played=true;
diceA4_value=7;
dice4_played=true;
}
showdice();
area->update();
move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto);
}
else if(x>=160 && x<=225 && player==2 && !dice_rolled)
{
dice1_played=false;
dice2_played=false;
dice3_played=false;
dice4_played=false;
dice_rolled=true;
srand(QTime::currentTime().msec());
diceB1_value=1+(int) (6.0*rand()/(RAND_MAX+1.0));
diceB2_value=1+(int) (6.0*rand()/(RAND_MAX+1.0));
if(diceB1_value==diceB2_value)
{
diceB3_value=diceB1_value;
diceB4_value=diceB1_value;
}
else
{
diceB3_value=7;
dice3_played=true;
diceB4_value=7;
dice4_played=true;
}
showdice();
area->update();
move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto);
}
}
}
void BackGammon::done_dice1()
{
dice1_played=true;
if(player==1)
diceA1_value=7;
else
diceB1_value=7;
setplayer();
showdice();
draw();
area->update();
if(!dice2_played || !dice3_played || !dice4_played)
{
if(player==1)
{
move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto);
}
else
{
move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto);
}
}
}
void BackGammon::done_dice2()
{
dice2_played=true;
if(player==1)
diceA2_value=7;
else
diceB2_value=7;
setplayer();
showdice();
draw();
area->update();
if(!dice1_played || !dice3_played || !dice4_played)
{
if(player==1)
{
move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto);
}
else
{
move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto);
}
}
}
void BackGammon::done_dice3()
{
dice3_played=true;
if(player==1)
diceA3_value=7;
else
diceB3_value=7;
setplayer();
showdice();
draw();
area->update();
if(!dice1_played || !dice2_played || !dice4_played)
{
if(player==1)
{
move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto);
}
else
{
move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto);
}
}
}
void BackGammon::done_dice4()
{
dice4_played=true;
if(player==1)
diceA4_value=7;
else
diceB4_value=7;
setplayer();
showdice();
draw();
area->update();
if(!dice1_played || !dice2_played || !dice3_played)
{
if(player==1)
{
move->diceroll(1,diceA1_value,diceA2_value,diceA3_value,diceA4_value,player1_auto);
}
else
{
move->diceroll(2,diceB1_value,diceB2_value,diceB3_value,diceB4_value,player2_auto);
}
}
}
void BackGammon::nomove()
{
if(player==1)
nomove_marker->setX(0);
else
nomove_marker->setX(170);
nomove_marker->show();
message->setText(tr( "<b>no move</b>" ));
dice1_played=true;
dice2_played=true;
dice3_played=true;
dice4_played=true;
if(player==1)
{
diceA1_value=7;
diceA2_value=7;
diceA3_value=7;
diceA4_value=7;
}
else
{
diceB1_value=7;
diceB2_value=7;
diceB3_value=7;
diceB4_value=7;
}
area->update();
QTimer::singleShot(2000,this,SLOT(nomove2()));
}
void BackGammon::nomove2()
{
nomove_marker->hide();
setplayer();
showdice();
draw();
area->update();
}
void BackGammon::finished(int theplayer)
{
nomove_marker->hide();
if(theplayer==1)
message->setText(tr( "<b>Player 1 wins. Click on board for new game.</b>" ));
else
message->setText(tr( "<b>Player 2 wins. Click on board for new game.</b>" ));
diceA1_value=7;
diceA2_value=7;
diceB1_value=7;
diceB2_value=7;
player=0;
showdice();
draw();
area->update();
gameFinished=true;
}
void BackGammon::showdice()
{
int value_diceA1=diceA1_value-1;
if(diceA1_value==7 && diceA3_value!=7)
value_diceA1=diceA3_value-1;
int value_diceA2=diceA2_value-1;
if(diceA2_value==7 && diceA4_value!=7)
value_diceA2=diceA4_value-1;
int value_diceB1=diceB1_value-1;
if(diceB1_value==7 && diceB3_value!=7)
value_diceB1=diceB3_value-1;
int value_diceB2=diceB2_value-1;
if(diceB2_value==7 && diceB4_value!=7)
value_diceB2=diceB4_value-1;
for(int index=0;index<7;index++)
{
if(value_diceA1==index)
diceA1[index]->show();
else
diceA1[index]->hide();
if(value_diceA2==index)
diceA2[index]->show();
else
diceA2[index]->hide();
if(value_diceB1==index)
diceB1[index]->show();
else
diceB1[index]->hide();
if(value_diceB2==index)
diceB2[index]->show();
else
diceB2[index]->hide();
}
}
void BackGammon::setplayer()
{
if(dice1_played && dice2_played && dice3_played && dice4_played && player==1)
{
message->setText(tr( "<b>P2 turn</b>", "P means player" ));
dice_rolled=false;
player=2;
if(player2_auto)
QTimer::singleShot(2000,this,SLOT(autoroll_dice2()));
}
else if(dice1_played && dice2_played && dice3_played && dice4_played && player==2)
{
message->setText(tr( "<b>P1 turn</b>", "P means player" ));
dice_rolled=false;
player=1;
if(player1_auto)
QTimer::singleShot(2000,this,SLOT(autoroll_dice1()));
}
}
void BackGammon::autoroll_dice1()
{
mouse(20,210);
}
void BackGammon::autoroll_dice2()
{
mouse(170,210);
}
void BackGammon::applytheme()
{
QImage boardbg(Resource::loadImage("backgammon/boards/"+board_name));
board->setImage(boardbg);
QImage tablebg(Resource::loadImage("backgammon/table/"+table_name));
table->setImage(tablebg);
QImage piece_1_all(Resource::loadImage("backgammon/pieces/"+piecesA_name));
QImage piece_1_front=piece_1_all.copy(0,0,15,15);
QImage piece_1_side=piece_1_all.copy(0,15,15,5);
QImage piece_2_all(Resource::loadImage("backgammon/pieces/"+piecesB_name));
QImage piece_2_front=piece_2_all.copy(0,0,15,15);
QImage piece_2_side=piece_2_all.copy(0,15,15,5);
int a=0;
for(a=0;a<15;a++)
{
p1[a]->setImage(piece_1_front);
p1_side[a]->setImage(piece_1_side);
p2[a]->setImage(piece_2_front);
p2_side[a]->setImage(piece_2_side);
}
draw();
QImage dicebgA_all(Resource::loadImage("backgammon/dice/"+diceA_name));
QImage dicebgB_all(Resource::loadImage("backgammon/dice/"+diceB_name));
QImage oddsbg_all=(Resource::loadImage("backgammon/odds/"+odds_name));
for(a=0;a<7;a++)
{
QImage dicebgA=dicebgA_all.copy(a*25,0,25,25);
diceA1[a]->setImage(dicebgA);
diceA2[a]->setImage(dicebgA);
QImage dicebgB=dicebgB_all.copy(a*25,0,25,25);
diceB1[a]->setImage(dicebgB);
diceB2[a]->setImage(dicebgB);
/*
if(a<6)
{
QImage oddsbg=oddsbg_all.copy(a*15,0,15,15);
oddsDice[a]->setImage(oddsbg);
}
*/
}
}
diff --git a/noncore/games/backgammon/filedialog.cpp b/noncore/games/backgammon/filedialog.cpp
index e0a2914..f185188 100644
--- a/noncore/games/backgammon/filedialog.cpp
+++ b/noncore/games/backgammon/filedialog.cpp
@@ -1,61 +1,61 @@
#include "filedialog.h"
#include <qdir.h>
#include <qpe/qpeapplication.h>
FileDialog::FileDialog(QWidget* parent,QString header,QString extension,const char* name,bool modal,WFlags f)
:QDialog(parent,name,modal,f)
{
setCaption(header);
ext=extension;
dirselector=new QListView(this);
dirselector->setGeometry(1,10,235,200);
dirselector->addColumn("Files");
connect(dirselector,SIGNAL(clicked(QListViewItem*)),this,SLOT(selectorclicked(QListViewItem*)));
getCurrentDir();
file_name="user";
fileinput=new QLineEdit(file_name,this);
fileinput->setGeometry(1,220,235,20);
QPEApplication::showDialog( this );
}
FileDialog::~FileDialog()
{}
void FileDialog::selectorclicked(QListViewItem* entry)
{
if(entry==NULL)
return;
file_name=entry->text(0);
fileinput->setText(file_name);
}
void FileDialog::getCurrentDir()
{
dirselector->clear();
- QDir dir(QPEApplication::qpeDir()+"/backgammon");
+ QDir dir(QPEApplication::qpeDir()+"backgammon");
dir.setFilter(QDir::Files);
QFileInfoListIterator it(*(dir.entryInfoList()));
QFileInfo* fi;
int ext_length=ext.length();
while((fi=it.current())) // go through all file and subdirs
{
QString file=fi->fileName();
if(file.right(ext_length)==ext && file)
{
file=file.left(file.length()-ext_length);
new QListViewItem(dirselector,file);
}
++it;
}
}
QString FileDialog::filename()
{
return file_name;
}
diff --git a/noncore/games/backgammon/themedialog.cpp b/noncore/games/backgammon/themedialog.cpp
index afd6a1b..9bdb6a9 100644
--- a/noncore/games/backgammon/themedialog.cpp
+++ b/noncore/games/backgammon/themedialog.cpp
@@ -1,161 +1,161 @@
#include "themedialog.h"
#include <qdir.h>
#include <qlabel.h>
#include <qpe/qpeapplication.h>
ThemeDialog::ThemeDialog(QWidget* parent,const char* name,bool modal,WFlags f)
:QDialog(parent,name,modal,f)
{
setCaption("Theme Dialog");
QLabel* labelname=new QLabel("name",this);
labelname->setGeometry(0,5,40,20);
lineName=new QLineEdit("user",this);
lineName->setGeometry(40,5,195,20);
QLabel* labelboard=new QLabel("board",this);
labelboard->setGeometry(0,30,40,20);
boxboard=new QComboBox(this,"");
boxboard->setGeometry(40,30,195,20);
fillBox("boards",boxboard);
QLabel* labelpiecesA=new QLabel("pieces1",this);
labelpiecesA->setGeometry(0,70,40,20);
boxpiecesA=new QComboBox(this);
boxpiecesA->setGeometry(40,70,195,20);
fillBox("pieces",boxpiecesA);
QLabel* labelpiecesB=new QLabel("pieces2",this);
labelpiecesB->setGeometry(0,95,40,20);
boxpiecesB=new QComboBox(this);
boxpiecesB->setGeometry(40,95,195,20);
fillBox("pieces",boxpiecesB);
QLabel* labeldiceA=new QLabel("dice1",this);
labeldiceA->setGeometry(0,135,40,20);
boxdiceA=new QComboBox(this);
boxdiceA->setGeometry(40,135,195,20);
fillBox("dice",boxdiceA);
QLabel* labeldiceB=new QLabel("dice2",this);
labeldiceB->setGeometry(0,160,40,20);
boxdiceB=new QComboBox(this);
boxdiceB->setGeometry(40,160,195,20);
fillBox("dice",boxdiceB);
QLabel* labelodds=new QLabel("odds",this);
labelodds->setGeometry(0,200,40,20);
boxodds=new QComboBox(this);
boxodds->setGeometry(40,200,195,20);
fillBox("odds",boxodds);
boxodds->setEnabled(false);
QLabel* labeltable=new QLabel("table",this);
labeltable->setGeometry(0,225,40,20);
boxtable=new QComboBox(this);
boxtable->setGeometry(40,225,195,20);
fillBox("table",boxtable);
QPEApplication::showDialog( this );
}
ThemeDialog::~ThemeDialog()
{}
ImageNames ThemeDialog::getNames()
{
ImageNames names;
names.theme=lineName->text();
names.board=boxboard->currentText();
names.pieces1=boxpiecesA->currentText();
names.pieces2=boxpiecesB->currentText();
names.dice1=boxdiceA->currentText();
names.dice2=boxdiceB->currentText();
names.odds=boxodds->currentText();
names.table=boxtable->currentText();
return names;
}
void ThemeDialog::setCurrent(const ImageNames& current)
{
int a=0;
lineName->setText(current.theme);
for(a=0;a<boxboard->count();a++)
{
if(boxboard->text(a)==current.board)
{
boxboard->setCurrentItem(a);
break;
}
}
for(a=0;a<boxpiecesA->count();a++)
{
if(boxpiecesA->text(a)==current.pieces1)
{
boxpiecesA->setCurrentItem(a);
break;
}
}
for(a=0;a<boxpiecesB->count();a++)
{
if(boxpiecesB->text(a)==current.pieces2)
{
boxpiecesB->setCurrentItem(a);
break;
}
}
for(a=0;a<boxdiceA->count();a++)
{
if(boxdiceA->text(a)==current.dice1)
{
boxdiceA->setCurrentItem(a);
break;
}
}
for(a=0;a<boxdiceB->count();a++)
{
if(boxdiceB->text(a)==current.dice2)
{
boxdiceB->setCurrentItem(a);
break;
}
}
for(a=0;a<boxodds->count();a++)
{
if(boxodds->text(a)==current.odds)
{
boxodds->setCurrentItem(a);
break;
}
}
for(a=0;a<boxtable->count();a++)
{
if(boxtable->text(a)==current.table)
{
boxtable->setCurrentItem(a);
break;
}
}
}
void ThemeDialog::fillBox(QString dirname,QComboBox* thebox)
{
thebox->clear();
- QDir dir(QPEApplication::qpeDir()+"/pics/backgammon/"+dirname);
+ QDir dir(QPEApplication::qpeDir()+"pics/backgammon/"+dirname);
dir.setFilter(QDir::Dirs | QDir::Files);
QFileInfoListIterator it(*(dir.entryInfoList()));
QFileInfo* fi;
while((fi=it.current())) // go through all file and subdirs
{
QString file=fi->fileName();
if(file.right(4)==".png")
{
thebox->insertItem(file.left(file.find(".png")));
}
++it;
}
delete fi;
}
diff --git a/noncore/multimedia/opieplayer2/playlistwidget.cpp b/noncore/multimedia/opieplayer2/playlistwidget.cpp
index dc2c496..2e9553f 100644
--- a/noncore/multimedia/opieplayer2/playlistwidget.cpp
+++ b/noncore/multimedia/opieplayer2/playlistwidget.cpp
@@ -1,1066 +1,1066 @@
/*
This file is part of the Opie Project
Copyright (c) 2002,2003 Max Reiss <harlekin@handhelds.org>
Copyright (c) 2002 L. Potter <ljp@llornkcor.com>
Copyright (c) 2002 Holger Freyther <zecke@handhelds.org>
=.
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. 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 library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "playlistselection.h"
#include "playlistwidget.h"
#include "mediaplayer.h"
#include "inputDialog.h"
#include "om3u.h"
#include "playlistfileview.h"
/* OPIE */
#include <opie2/odebug.h>
#include <opie2/ofiledialog.h>
using namespace Opie::Core;
using namespace Opie::Ui;
/* QT */
#include <qmessagebox.h>
#include <qtoolbar.h>
/* STD */
#include <assert.h>
PlayListWidget::PlayListWidget(QWidget* parent, const char* name, WFlags fl )
: PlayListWidgetGui( parent, "playList" ) , currentFileListView( 0 )
{
Global::statusMessage( tr( "Loading of Skin started" ) );
mediaPlayerState = new MediaPlayerState(0, "mediaPlayerState" );
m_mp = new MediaPlayer(*this, *mediaPlayerState, 0, "mediaPlayer");
d->tbAddToList = new ToolButton( bar, tr( "Add to Playlist" ),
"opieplayer2/add_to_playlist",
this , SLOT(addSelected() ) );
d->tbRemoveFromList = new ToolButton( bar, tr( "Remove from Playlist" ),
"opieplayer2/remove_from_playlist",
this , SLOT(removeSelected() ) );
d->tbPlay = new ToolButton( bar, tr( "Play" ), "opieplayer2/play",
this , SLOT( btnPlay(bool) ), TRUE );
d->tbShuffle = new ToolButton( bar, tr( "Randomize" ),"opieplayer2/shuffle",
mediaPlayerState, SLOT( setShuffled(bool) ), TRUE );
d->tbLoop = new ToolButton( bar, tr( "Loop" ), "opieplayer2/loop",
mediaPlayerState, SLOT( setLooping(bool) ), TRUE );
(void)new MenuItem( pmPlayList, tr( "Clear List" ), this, SLOT( clearList() ) );
(void)new MenuItem( pmPlayList, tr( "Add all audio files" ),
this, SLOT( addAllMusicToList() ) );
(void)new MenuItem( pmPlayList, tr( "Add all video files" ),
this, SLOT( addAllVideoToList() ) );
(void)new MenuItem( pmPlayList, tr( "Add all files" ),
this, SLOT( addAllToList() ) );
pmPlayList->insertSeparator(-1);
(void)new MenuItem( pmPlayList, tr( "Add File" ),
this,SLOT( openFile() ) );
(void)new MenuItem( pmPlayList, tr("Add URL"),
this,SLOT( openURL() ) );
(void)new MenuItem( pmPlayList, tr( "Add Directory"),
this, SLOT(openDirectory()));
pmPlayList->insertSeparator(-1);
(void)new MenuItem( pmPlayList, tr( "Save Playlist" ),
this, SLOT(writem3u() ) );
pmPlayList->insertSeparator(-1);
(void)new MenuItem( pmPlayList, tr( "Rescan for Audio Files" ),
audioView, SLOT( scanFiles() ) );
(void)new MenuItem( pmPlayList, tr( "Rescan for Video Files" ),
videoView, SLOT( scanFiles() ) );
pmView->insertItem( Resource::loadPixmap("fullscreen") , tr( "Full Screen"),
mediaPlayerState, SLOT( toggleFullscreen() ) );
Config cfg( "OpiePlayer" );
bool b= cfg.readBoolEntry("FullScreen", 0);
mediaPlayerState->setFullscreen( b );
pmView->setItemChecked( -16, b );
(void)new ToolButton( vbox1, tr( "Move Up" ), "opieplayer2/up",
d->selectedFiles, SLOT(moveSelectedUp() ) );
(void)new ToolButton( vbox1, tr( "Remove" ), "opieplayer2/cut",
d->selectedFiles, SLOT(removeSelected() ) );
(void)new ToolButton( vbox1, tr( "Move Down" ), "opieplayer2/down",
d->selectedFiles, SLOT(moveSelectedDown() ) );
QVBox *stretch2 = new QVBox( vbox1 );
connect( tbDeletePlaylist, ( SIGNAL( released() ) ),
SLOT( deletePlaylist() ) );
connect( pmView, SIGNAL( activated(int) ),
this, SLOT( pmViewActivated(int) ) );
connect( skinsMenu, SIGNAL( activated(int) ) ,
this, SLOT( skinsMenuActivated(int) ) );
connect( d->selectedFiles, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int) ),
this,SLOT( playlistViewPressed(int,QListViewItem*,const QPoint&,int) ) );
connect( audioView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int) ),
this,SLOT( viewPressed(int,QListViewItem*,const QPoint&,int) ) );
connect( audioView, SIGNAL( returnPressed(QListViewItem*) ),
this,SLOT( playIt(QListViewItem*) ) );
connect( audioView, SIGNAL( doubleClicked(QListViewItem*) ),
this, SLOT( addToSelection(QListViewItem*) ) );
connect( videoView, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int) ),
this,SLOT( viewPressed(int,QListViewItem*,const QPoint&,int) ) );
connect( videoView, SIGNAL( returnPressed(QListViewItem*) ),
this,SLOT( playIt(QListViewItem*) ) );
connect( videoView, SIGNAL( doubleClicked(QListViewItem*) ),
this, SLOT( addToSelection(QListViewItem*) ) );
connect( playLists, SIGNAL( fileSelected(const DocLnk&) ),
this, SLOT( loadList(const DocLnk&) ) );
connect( tabWidget, SIGNAL ( currentChanged(QWidget*) ),
this, SLOT( tabChanged(QWidget*) ) );
connect( mediaPlayerState, SIGNAL( playingToggled(bool) ),
d->tbPlay, SLOT( setOn(bool) ) );
connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ),
d->tbLoop, SLOT( setOn(bool) ) );
connect( mediaPlayerState, SIGNAL( shuffledToggled(bool) ),
d->tbShuffle, SLOT( setOn(bool) ) );
connect( d->selectedFiles, SIGNAL( doubleClicked(QListViewItem*) ),
this, SLOT( playIt(QListViewItem*) ) );
connect ( gammaSlider, SIGNAL( valueChanged(int) ),
mediaPlayerState, SLOT( setVideoGamma(int) ) );
connect( this, SIGNAL(skinSelected() ),
m_mp, SLOT( reloadSkins() ) );
// see which skins are installed
populateSkinsMenu();
initializeStates();
channel = new QCopChannel( "QPE/Application/opieplayer2", this );
connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT( qcopReceive(const QCString&,const QByteArray&)) );
cfg.setGroup("PlayList");
QString currentPlaylist = cfg.readEntry( "CurrentPlaylist", "default");
loadList(DocLnk( currentPlaylist ) );
tabWidget->showPage( playListTab );
}
PlayListWidget::~PlayListWidget() {
delete d;
delete m_mp;
}
void PlayListWidget::initializeStates() {
d->tbPlay->setOn( mediaPlayerState->isPlaying() );
d->tbLoop->setOn( mediaPlayerState->isLooping() );
d->tbShuffle->setOn( mediaPlayerState->isShuffled() );
d->playListFrame->show();
}
void PlayListWidget::writeDefaultPlaylist() {
Config config( "OpiePlayer" );
config.setGroup( "PlayList" );
QString filename=QPEApplication::documentDir() + "/default.m3u";
QString currentString = config.readEntry( "CurrentPlaylist", filename);
if( currentString == filename) {
Om3u *m3uList;
if( d->selectedFiles->first() ) {
m3uList = new Om3u(filename, IO_ReadWrite | IO_Truncate);
do {
m3uList->add( d->selectedFiles->current()->file() );
}
while ( d->selectedFiles->next() );
m3uList->write();
m3uList->close();
delete m3uList;
}
}
}
void PlayListWidget::addToSelection( const DocLnk& lnk ) {
d->setDocumentUsed = FALSE;
if( QFileInfo( lnk.file() ).exists() ||
lnk.file().left(4) == "http" ) {
d->selectedFiles->addToSelection( lnk );
}
}
void PlayListWidget::clearList() {
while ( first() ) {
d->selectedFiles->removeSelected();
}
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
cfg.writeEntry("CurrentPlaylist","default");
setCaption("OpiePlayer");
}
void PlayListWidget::viewPressed( int mouse, QListViewItem *, const QPoint& , int) {
switch (mouse) {
case LeftButton:
break;
case RightButton:
{
QPopupMenu m;
m.insertItem( tr( "Play Selected" ), this, SLOT( playSelected() ));
m.insertItem( tr( "Add to Playlist" ), this, SLOT( addSelected() ));
m.exec( QCursor::pos() );
}
break;
}
}
void PlayListWidget::playlistViewPressed( int mouse, QListViewItem *, const QPoint& , int ) {
switch (mouse) {
case LeftButton:
break;
case RightButton:
{
QPopupMenu m;
m.insertItem( tr( "Play" ), this, SLOT( playSelected() ));
m.insertItem( tr( "Remove" ), this, SLOT( removeSelected() ));
m.exec( QCursor::pos() );
}
break;
}
}
void PlayListWidget::addAllToList() {
audioView->populateView();
QListViewItemIterator audioIt( audioView );
DocLnk lnk;
QString filename;
// iterate through all items of the listview
for ( ; audioIt.current(); ++audioIt ) {
filename = audioIt.current()->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
}
videoView->populateView();
QListViewItemIterator videoIt( videoView );
for ( ; videoIt.current(); ++videoIt ) {
filename = videoIt.current()->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
}
tabWidget->setCurrentPage(0);
writeCurrentM3u();
d->selectedFiles->first();
}
void PlayListWidget::addAllMusicToList() {
audioView->populateView();
QListViewItemIterator audioIt( audioView );
DocLnk lnk;
QString filename;
// iterate through all items of the listview
for ( ; audioIt.current(); ++audioIt ) {
filename = audioIt.current()->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
}
tabWidget->setCurrentPage(0);
writeCurrentM3u();
d->selectedFiles->first();
}
void PlayListWidget::addAllVideoToList() {
videoView->populateView();
QListViewItemIterator videoIt( videoView );
DocLnk lnk;
QString filename;
for ( ; videoIt.current(); ++videoIt ) {
filename = videoIt.current()->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
}
tabWidget->setCurrentPage(0);
writeCurrentM3u();
d->selectedFiles->first();
}
void PlayListWidget::setDocument( const QString& _fileref ) {
// odebug << "<<<<<<<<set document>>>>>>>>>> "+fileref << oendl;
QString fileref = _fileref;
fromSetDocument = TRUE;
DocLnk lnk(_fileref);
if(lnk.isValid())
fileref = lnk.file();
QFileInfo fileInfo(fileref);
if ( !fileInfo.exists() ) {
QMessageBox::warning( this, tr( "Invalid File" ),
tr( "There was a problem in getting the file." ) );
return;
}
clearList();
QString extension = fileInfo.extension(false);
if( extension.find( "m3u", 0, false) != -1
|| extension.find( "pls", 0, false) != -1 ) {
readListFromFile( fileref );
} else {
clearList();
DocLnk lnk;
lnk.setName( fileInfo.baseName() ); //sets name
lnk.setFile( fileref ); //sets file name
addToSelection( lnk );
writeCurrentM3u();
d->setDocumentUsed = TRUE;
mediaPlayerState->setPlaying( FALSE );
mediaPlayerState->setPlaying( TRUE );
}
}
void PlayListWidget::useSelectedDocument() {
d->setDocumentUsed = FALSE;
}
const DocLnk *PlayListWidget::current() const { // this is fugly
assert( currentTab() == CurrentPlayList );
const DocLnk *lnk = d->selectedFiles->current();
if ( !lnk ) {
d->selectedFiles->first();
lnk = d->selectedFiles->current();
}
assert( lnk );
return lnk;
}
bool PlayListWidget::prev() {
if ( mediaPlayerState->isShuffled() ) {
const DocLnk *cur = current();
int j = 1 + (int)(97.0 * rand() / (RAND_MAX + 1.0));
for ( int i = 0; i < j; i++ ) {
if ( !d->selectedFiles->next() )
d->selectedFiles->first();
}
if ( cur == current() )
if ( !d->selectedFiles->next() ) {
d->selectedFiles->first();
}
return TRUE;
} else {
if ( !d->selectedFiles->prev() ) {
if ( mediaPlayerState->isLooping() ) {
return d->selectedFiles->last();
} else {
return FALSE;
}
}
return TRUE;
}
}
bool PlayListWidget::next() {
//odebug << "<<<<<<<<<<<<next()" << oendl;
if ( mediaPlayerState->isShuffled() ) {
return prev();
} else {
if ( !d->selectedFiles->next() ) {
if ( mediaPlayerState->isLooping() ) {
return d->selectedFiles->first();
} else {
return FALSE;
}
}
return TRUE;
}
}
bool PlayListWidget::first() {
return d->selectedFiles->first();
}
bool PlayListWidget::last() {
return d->selectedFiles->last();
}
void PlayListWidget::saveList() {
writem3u();
}
void PlayListWidget::loadList( const DocLnk & lnk) {
QString name = lnk.name();
if( name.length()>0) {
setCaption("OpiePlayer: "+name);
clearList();
readListFromFile(lnk.file());
tabWidget->setCurrentPage(0);
}
}
void PlayListWidget::addSelected() {
assert( inFileListMode() );
QListViewItemIterator it( currentFileListView );
for ( ; it.current(); ++it )
if ( it.current()->isSelected() ) {
QString filename = it.current()->text(3);
DocLnk lnk;
lnk.setName( QFileInfo( filename ).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk );
}
currentFileListView->clearSelection();
writeCurrentM3u();
}
void PlayListWidget::removeSelected() {
d->selectedFiles->removeSelected( );
writeCurrentM3u();
}
void PlayListWidget::playIt( QListViewItem *it) {
if(!it) return;
mediaPlayerState->setPlaying(FALSE);
mediaPlayerState->setPlaying(TRUE);
d->selectedFiles->unSelect();
}
void PlayListWidget::addToSelection( QListViewItem *it) {
d->setDocumentUsed = FALSE;
if(it) {
if ( currentTab() == CurrentPlayList )
return;
DocLnk lnk;
QString filename;
filename=it->text(3);
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
writeCurrentM3u();
// tabWidget->setCurrentPage(0);
}
}
void PlayListWidget::tabChanged(QWidget *) {
d->tbPlay->setEnabled( true );
disconnect( audioView, SIGNAL( itemsSelected(bool) ),
d->tbPlay, SLOT( setEnabled(bool) ) );
disconnect( videoView, SIGNAL( itemsSelected(bool) ),
d->tbPlay, SLOT( setEnabled(bool) ) );
currentFileListView = 0;
switch ( currentTab() ) {
case CurrentPlayList:
{
if( !tbDeletePlaylist->isHidden() ) {
tbDeletePlaylist->hide();
}
d->tbRemoveFromList->setEnabled(TRUE);
d->tbAddToList->setEnabled(FALSE);
d->tbPlay->setEnabled( !d->selectedFiles->isEmpty() );
}
break;
case AudioFiles:
{
audioView->populateView();
if( !tbDeletePlaylist->isHidden() ) {
tbDeletePlaylist->hide();
}
d->tbRemoveFromList->setEnabled(FALSE);
d->tbAddToList->setEnabled(TRUE);
connect( audioView, SIGNAL( itemsSelected(bool) ),
d->tbPlay, SLOT( setEnabled(bool) ) );
d->tbPlay->setEnabled( audioView->hasSelection() );
currentFileListView = audioView;
}
break;
case VideoFiles:
{
videoView->populateView();
if( !tbDeletePlaylist->isHidden() ) {
tbDeletePlaylist->hide();
}
d->tbRemoveFromList->setEnabled(FALSE);
d->tbAddToList->setEnabled(TRUE);
connect( videoView, SIGNAL( itemsSelected(bool) ),
d->tbPlay, SLOT( setEnabled(bool) ) );
d->tbPlay->setEnabled( videoView->hasSelection() );
currentFileListView = videoView;
}
break;
case PlayLists:
{
if( tbDeletePlaylist->isHidden() ) {
tbDeletePlaylist->show();
}
playLists->reread();
d->tbAddToList->setEnabled(FALSE);
d->tbPlay->setEnabled( false );
}
break;
};
}
void PlayListWidget::btnPlay(bool b) {
// mediaPlayerState->setPlaying(false);
mediaPlayerState->setPlaying(b);
insanityBool=FALSE;
}
void PlayListWidget::deletePlaylist() {
switch( QMessageBox::information( this, (tr("Remove Playlist?")),
(tr("You really want to delete\nthis playlist?")),
(tr("Yes")), (tr("No")), 0 )){
case 0: // Yes clicked,
QFile().remove(playLists->selectedDocument().file());
QFile().remove(playLists->selectedDocument().linkFile());
playLists->reread();
break;
case 1: // Cancel
break;
};
}
void PlayListWidget::playSelected() {
btnPlay( TRUE);
}
bool PlayListWidget::inFileListMode() const
{
TabType tab = currentTab();
return tab == AudioFiles || tab == VideoFiles;
}
void PlayListWidget::openURL() {
// http://66.28.164.33:2080
// http://somafm.com/star0242.m3u
QString filename, name;
InputDialog *fileDlg;
fileDlg = new InputDialog(this,tr("Add URL"),TRUE, 0);
fileDlg->exec();
if( fileDlg->result() == 1 ) {
filename = fileDlg->text();
odebug << "Selected filename is " + filename << oendl;
// Om3u *m3uList;
DocLnk lnk;
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
if(filename.left(4) == "http") {
QString m3uFile, m3uFilePath;
if(filename.find(":",8,TRUE) != -1) { //found a port
m3uFile = filename.left( filename.find( ":",8,TRUE));
m3uFile = m3uFile.right( 7);
} else if(filename.left(4) == "http"){
m3uFile=filename;
m3uFile = m3uFile.right( m3uFile.length() - 7);
} else{
m3uFile=filename;
}
lnk.setName( filename ); //sets name
lnk.setFile( filename ); //sets file name
// lnk.setIcon("opieplayer2/musicfile");
d->selectedFiles->addToSelection( lnk );
writeCurrentM3u();
d->selectedFiles->setSelectedItem( lnk.name());
}
else if( filename.right( 3) == "m3u" || filename.right(3) == "pls" ) {
readListFromFile( filename );
} else {
lnk.setName( QFileInfo(filename).baseName() ); //sets name
lnk.setFile( filename ); //sets file name
d->selectedFiles->addToSelection( lnk);
writeCurrentM3u();
d->selectedFiles->setSelectedItem( lnk.name());
}
}
delete fileDlg;
}
static MimeTypes fileSelectorMimeTypes() {
MimeTypes types;
QStringList audio, video, all;
audio << "audio/*";
audio << "playlist/plain";
audio << "audio/x-ogg";
audio << "audio/x-mpegurl";
video << "video/*";
video << "playlist/plain";
all += audio;
all += video;
types.insert("All Media Files", all );
types.insert("Audio", audio );
types.insert("Video", video );
return types;
}
void PlayListWidget::openFile() {
QString filename, name;
Config cfg( "OpiePlayer" );
cfg.setGroup("Dialog");
MimeTypes types = fileSelectorMimeTypes();
QString str = OFileDialog::getOpenFileName( 1, QString::null,
QString::null, types, 0,
tr("Add File to Playlist") );
if( str.isEmpty() )
return;
if(str.left(2) == "//") str=str.right(str.length()-1);
if( str.right( 3) == "m3u" || str.right(3) == "pls" ) {
readListFromFile( str );
} else {
QFileInfo info( str );
DocLnk lnk = addFileToPlaylist( str, info.baseName() );
d->selectedFiles->setSelectedItem( lnk.name() );
}
}
void PlayListWidget::openDirectory() {
QString str = OFileDialog::getDirectory( OFileSelector::DirectorySelector,
QString::null, 0,
tr( "Add Files from Directory"));
if(str.isEmpty() )
return;
if(str.left(2) == "//") str=str.right(str.length()-1);
QDir dir( str );
QStringList lst = dir.entryList(QDir::Files|QDir::Readable);
for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) {
QString filename = str + "/" + *it;
if( filename.right( 3) == "m3u" || filename.right(3) == "pls" )
readListFromFile( filename );
else {
addFileToPlaylist( filename, QFileInfo(*it).baseName() );
}
}
}
void PlayListWidget::readListFromFile( const QString &filename ) {
odebug << "read list filename " + filename << oendl;
QFileInfo fi(filename);
Om3u *m3uList;
QString s, name;
m3uList = new Om3u( filename, IO_ReadOnly );
if(fi.extension(false).find("m3u",0,false) != -1 )
m3uList->readM3u();
else if(fi.extension(false).find("pls",0,false) != -1 )
m3uList->readPls();
DocLnk lnk;
for ( QStringList::ConstIterator it = m3uList->begin(); it != m3uList->end(); ++it ) {
s = *it;
// odebug << s << oendl;
if(s.left(4)=="http") {
lnk.setName( s ); //sets file name
lnk.setIcon("opieplayer2/musicfile");
lnk.setFile( s ); //sets file name
} else { //is file
lnk.setName( QFileInfo(s).baseName());
if(s.left(1) != "/") {
lnk.setFile( QFileInfo(filename).dirPath()+"/"+s);
} else {
lnk.setFile( s);
}
}
d->selectedFiles->addToSelection( lnk );
}
Config config( "OpiePlayer" );
config.setGroup( "PlayList" );
config.writeEntry("CurrentPlaylist",filename);
config.write();
currentPlayList=filename;
m3uList->close();
delete m3uList;
d->selectedFiles->setSelectedItem( s);
setCaption(tr("OpiePlayer: ")+ QFileInfo(filename).baseName());
}
// writes current playlist to current m3u file */
void PlayListWidget::writeCurrentM3u() {
odebug << "writing to current m3u" << oendl;
Config cfg( "OpiePlayer" );
cfg.setGroup("PlayList");
QString currentPlaylist = cfg.readEntry("CurrentPlaylist","default");
Om3u *m3uList;
m3uList = new Om3u( currentPlaylist, IO_ReadWrite | IO_Truncate );
if( d->selectedFiles->first()) {
do {
// odebug << "add writeCurrentM3u " +d->selectedFiles->current()->file() << oendl;
m3uList->add( d->selectedFiles->current()->file() );
}
while ( d->selectedFiles->next() );
// odebug << "<<<<<<<<<<<<>>>>>>>>>>>>>>>>>" << oendl;
m3uList->write();
m3uList->close();
}
delete m3uList;
}
/*
writes current playlist to m3u file */
void PlayListWidget::writem3u() {
Config cfg( "OpiePlayer" );
cfg.setGroup("Dialog");
MimeTypes types = fileSelectorMimeTypes();
QString str = OFileDialog::getOpenFileName( 1, QString::null,
QString::null, types, 0,
tr( "Save Playlist" ));
if(str.left(2) == "//") str=str.right(str.length()-1);
QString name, filename, list;
Om3u *m3uList;
if( !str.isEmpty() ) {
name = str;
// name = fileDlg->text();
// odebug << filename << oendl;
if( name.find("/",0,true) != -1) {// assume they specify a file path
filename = name;
name = name.right(name.length()- name.findRev("/",-1,true) - 1 );
}
else //otherwise dump it somewhere noticable
filename = QPEApplication::documentDir() + "/" + name;
if( filename.right( 3 ) != "m3u" ) //needs filename extension
filename += ".m3u";
if( d->selectedFiles->first()) { //ramble through playlist view
m3uList = new Om3u( filename, IO_ReadWrite | IO_Truncate);
do {
m3uList->add( d->selectedFiles->current()->file());
}
while ( d->selectedFiles->next() );
// odebug << list << oendl;
m3uList->write();
m3uList->close();
delete m3uList;
//delete fileDlg;
DocLnk lnk;
lnk.setFile( filename);
lnk.setIcon("opieplayer2/playlist2");
lnk.setName( name); //sets file name
// odebug << filename << oendl;
Config config( "OpiePlayer" );
config.setGroup( "PlayList" );
config.writeEntry("CurrentPlaylist",filename);
currentPlayList=filename;
if(!lnk.writeLink()) {
odebug << "Writing doclink did not work" << oendl;
}
setCaption(tr("OpiePlayer: ") + name);
}
}
}
void PlayListWidget::keyReleaseEvent( QKeyEvent *e ) {
switch ( e->key() ) {
////////////////////////////// Zaurus keys
case Key_F9: //activity
// if(audioUI->isHidden())
// audioUI->showMaximized();
break;
case Key_F10: //contacts
// if( videoUI->isHidden())
// videoUI->showMaximized();
break;
case Key_F11: //menu
break;
case Key_F12: //home
// doBlank();
break;
case Key_F13: //mail
// doUnblank();
break;
case Key_Q: //add to playlist
addSelected();
break;
case Key_R: //remove from playlist
removeSelected();
break;
// case Key_P: //play
// odebug << "Play" << oendl;
// playSelected();
// break;
case Key_Space:
// playSelected(); puh
break;
case Key_1:
tabWidget->setCurrentPage( 0 );
break;
case Key_2:
tabWidget->setCurrentPage( 1 );
break;
case Key_3:
tabWidget->setCurrentPage( 2 );
break;
case Key_4:
tabWidget->setCurrentPage( 3 );
break;
case Key_Down:
if ( !d->selectedFiles->next() )
d->selectedFiles->first();
break;
case Key_Up:
if ( !d->selectedFiles->prev() )
// d->selectedFiles->last();
break;
}
}
void PlayListWidget::pmViewActivated(int index) {
// odebug << "" << index << "" << oendl;
switch(index) {
case -16:
{
mediaPlayerState->toggleFullscreen();
bool b=mediaPlayerState->isFullscreen();
pmView->setItemChecked( index, b);
Config cfg( "OpiePlayer" );
cfg.writeEntry( "FullScreen", b );
}
break;
};
}
void PlayListWidget::populateSkinsMenu() {
int item = 0;
defaultSkinIndex = 0;
QString skinName;
Config cfg( "OpiePlayer" );
cfg.setGroup("Options" );
QString skin = cfg.readEntry( "Skin", "default" );
- QDir skinsDir( QPEApplication::qpeDir() + "/pics/opieplayer2/skins" );
+ QDir skinsDir( QPEApplication::qpeDir() + "pics/opieplayer2/skins" );
skinsDir.setFilter( QDir::Dirs );
skinsDir.setSorting(QDir::Name );
const QFileInfoList *skinslist = skinsDir.entryInfoList();
QFileInfoListIterator it( *skinslist );
QFileInfo *fi;
while ( ( fi = it.current() ) ) {
skinName = fi->fileName();
// odebug << fi->fileName() << oendl;
if( skinName != "." && skinName != ".." && skinName !="CVS" ) {
item = skinsMenu->insertItem( fi->fileName() ) ;
}
if( skinName == "default" ) {
defaultSkinIndex = item;
}
if( skinName == skin ) {
skinsMenu->setItemChecked( item, TRUE );
}
++it;
}
}
void PlayListWidget::skinsMenuActivated( int item ) {
for(unsigned int i = defaultSkinIndex; i > defaultSkinIndex - skinsMenu->count(); i-- ) {
skinsMenu->setItemChecked( i, FALSE );
}
skinsMenu->setItemChecked( item, TRUE );
{
Config cfg( "OpiePlayer" );
cfg.setGroup("Options");
cfg.writeEntry("Skin", skinsMenu->text( item ) );
}
emit skinSelected();
}
PlayListWidget::TabType PlayListWidget::currentTab() const
{
static const TabType indexToTabType[ TabTypeCount ] =
{ CurrentPlayList, AudioFiles, VideoFiles, PlayLists };
int index = tabWidget->currentPageIndex();
assert( index < TabTypeCount && index >= 0 );
return indexToTabType[ index ];
}
PlayListWidget::Entry PlayListWidget::currentEntry() const
{
if ( currentTab() == CurrentPlayList ) {
const DocLnk *lnk = current();
return Entry( lnk->name(), lnk->file() );
}
return Entry( currentFileListPathName() );
}
QString PlayListWidget::currentFileListPathName() const {
return currentFileListView->currentItem()->text( 3 );
}
void PlayListWidget::qcopReceive(const QCString &msg, const QByteArray &data) {
QDataStream stream ( data, IO_ReadOnly );
if ( msg == "play()" ) { //plays current selection
btnPlay( true);
} else if ( msg == "stop()" ) {
mediaPlayerState->setPlaying( false);
} else if ( msg == "togglePause()" ) {
mediaPlayerState->togglePaused();
} else if ( msg == "next()" ) { //select next in list
mediaPlayerState->setNext();
} else if ( msg == "prev()" ) { //select previous in list
mediaPlayerState->setPrev();
} else if ( msg == "toggleLooping()" ) { //loop or not loop
mediaPlayerState->toggleLooping();
} else if ( msg == "toggleShuffled()" ) { //shuffled or not shuffled
mediaPlayerState->toggleShuffled();
} else if ( msg == "volUp()" ) { //volume more
// emit moreClicked();
// emit moreReleased();
} else if ( msg == "volDown()" ) { //volume less
// emit lessClicked();
// emit lessReleased();
} else if ( msg == "play(QString)" ) { //play this now
QString file;
stream >> file;
setDocument( (const QString &) file);
} else if ( msg == "add(QString)" ) { //add to playlist
QString file;
stream >> file;
QFileInfo fileInfo(file);
DocLnk lnk;
lnk.setName( fileInfo.baseName() ); //sets name
lnk.setFile( file ); //sets file name
addToSelection( lnk );
} else if ( msg == "rem(QString)" ) { //remove from playlist
QString file;
stream >> file;
}
}
DocLnk PlayListWidget::addFileToPlaylist( const QString& file,
const QString& name ) {
DocLnk lnk;
lnk.setName( name ); //sets name
lnk.setFile( file ); //sets file name
d->selectedFiles->addToSelection( lnk );
writeCurrentM3u();
return lnk;
}
diff --git a/noncore/settings/language/language.cpp b/noncore/settings/language/language.cpp
index 81d6717..14750ac 100644
--- a/noncore/settings/language/language.cpp
+++ b/noncore/settings/language/language.cpp
@@ -1,159 +1,159 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "settings.h"
#include <qpe/global.h>
#include <qpe/fontmanager.h>
#include <qpe/config.h>
#include <qpe/applnk.h>
#include <qpe/qpedialog.h>
#include <qpe/qpeapplication.h>
#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
#include <qpe/qcopenvelope_qws.h>
#endif
#include <qlabel.h>
#include <qcheckbox.h>
#include <qradiobutton.h>
#include <qtabwidget.h>
#include <qslider.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qdatastream.h>
#include <qmessagebox.h>
#include <qcombobox.h>
#include <qspinbox.h>
#include <qlistbox.h>
#include <qdir.h>
#if QT_VERSION >= 300
#include <qstylefactory.h>
#endif
#include <stdlib.h>
LanguageSettings::LanguageSettings( QWidget* parent, const char* name, WFlags fl )
: LanguageSettingsBase( parent, name, TRUE, fl )
{
if ( FontManager::hasUnicodeFont() )
languages->setFont(FontManager::unicodeFont(FontManager::Proportional));
- QString tfn = QPEApplication::qpeDir() + "/i18n/";
+ QString tfn = QPEApplication::qpeDir() + "i18n/";
QDir langDir = tfn;
QStringList list = langDir.entryList("*", QDir::Dirs );
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
QString name = (*it);
QFileInfo desktopFile( tfn + "/" + name + "/.directory" );
if ( desktopFile.exists() ) {
langAvail.append(name);
Config conf( desktopFile.filePath(), Config::File );
QString langName = conf.readEntry( "Name" );
QString ownName = conf.readEntryDirect( "Name[" + name + "]" );
if ( ownName.isEmpty() )
ownName = conf.readEntryDirect( "Name" );
if ( !ownName.isEmpty() && ownName != langName )
langName = langName + " [" + ownName + "]";
languages->insertItem( langName );
}
}
if ( langAvail. find ( "en" ) == -1 ) {
langAvail. prepend ( "" ); // no tr
languages-> insertItem ( QString ( "English [%1] (%2)" /* no tr (!) */ ). arg ( tr ( "English" )). arg ( tr( "default" )), 0 );
}
dl = new QPEDialogListener(this);
reset();
}
LanguageSettings::~LanguageSettings()
{}
void LanguageSettings::accept()
{
Config c( "qpe" );
c.setGroup( "Startup" );
if ( ( c.readNumEntry( "FirstUse", 42 ) == 0 ) &&
( QMessageBox::warning( this, tr("Language"), tr("<qt>Attention, all windows will be closed by changing the language\n"
"without saving the Data.<br><br>Go on?</qt>"), 1, 2) )
== QMessageBox::Cancel )
return;
applyLanguage();
QDialog::accept();
}
void LanguageSettings::applyLanguage()
{
setLanguage ( langAvail. at ( languages-> currentItem ( )));
}
void LanguageSettings::reject()
{
reset();
QDialog::reject();
}
void LanguageSettings::reset()
{
QString l = getenv("LANG");
Config config("locale");
config.setGroup("Language");
l = config.readEntry( "Language", l );
actualLanguage = l;
if (l.isEmpty())
l = "en";
int n = langAvail.find( l );
languages->setCurrentItem( n );
}
QString LanguageSettings::actualLanguage;
void LanguageSettings::setLanguage(const QString& lang)
{
if ( lang != actualLanguage ) {
Config config("locale");
config.setGroup( "Language" );
if ( lang. isEmpty ( ))
config. removeEntry ( "Language" );
else
config.writeEntry( "Language", lang );
config.write();
#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
QCopEnvelope e("QPE/System", "language(QString)");
e << lang;
#endif
}
}
void LanguageSettings::done(int r)
{
QDialog::done(r);
close();
}
diff --git a/noncore/settings/networksettings/mainwindow/mainwindowimp.cpp b/noncore/settings/networksettings/mainwindow/mainwindowimp.cpp
index fb7d7c9..5f23aea 100644
--- a/noncore/settings/networksettings/mainwindow/mainwindowimp.cpp
+++ b/noncore/settings/networksettings/mainwindow/mainwindowimp.cpp
@@ -1,713 +1,713 @@
#include "mainwindowimp.h"
#include "addconnectionimp.h"
#include "interfaceinformationimp.h"
#include "interfacesetupimp.h"
#include "interfaces.h"
#include "module.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <qpe/qlibrary.h>
#include <qpe/resource.h>
/* QT */
#include <qpushbutton.h>
#include <qlistbox.h>
#include <qlineedit.h>
#include <qlistview.h>
#include <qheader.h>
#include <qlabel.h>
#include <qtabwidget.h> // in order to disable the profiles tab
#include <qmessagebox.h>
#if QT_VERSION < 300
#include <qlist.h>
#else
#include <qptrlist.h>
#endif
#include <qdir.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qregexp.h>
/* STD */
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#define DEFAULT_SCHEME "/var/lib/pcmcia/scheme"
#define _PROCNETDEV "/proc/net/dev"
MainWindowImp::MainWindowImp(QWidget *parent, const char *name, WFlags) : MainWindow(parent, name, Qt::WStyle_ContextHelp), advancedUserMode(true), scheme(DEFAULT_SCHEME)
{
connect(addConnectionButton, SIGNAL(clicked()), this, SLOT(addClicked()));
connect(removeConnectionButton, SIGNAL(clicked()), this, SLOT(removeClicked()));
connect(informationConnectionButton, SIGNAL(clicked()), this, SLOT(informationClicked()));
connect(configureConnectionButton, SIGNAL(clicked()), this, SLOT(configureClicked()));
//remove tab with no function
tabWidget->removePage( tab );
// Load connections.
// /usr/local/kde/lib/libinterfaces.la
loadModules(QPEApplication::qpeDir() + "plugins/networksettings");
getAllInterfaces();
Interfaces i;
QStringList list = i.getInterfaceList();
QMap<QString, Interface*>::Iterator it;
for ( QStringList::Iterator ni = list.begin(); ni != list.end(); ++ni )
{
/*
* we skipped it in getAllInterfaces now
* we need to ignore it as well
*/
if (m_handledIfaces.contains( *ni) )
{
odebug << "Not up iface handled by module" << oendl;
continue;
}
bool found = false;
for( it = interfaceNames.begin(); it != interfaceNames.end(); ++it )
{
if(it.key() == (*ni))
found = true;
}
if(!found)
{
if(!(*ni).contains("_"))
{
Interface *i = new Interface(this, *ni, false);
i->setAttached(false);
i->setHardwareName(tr("Disconnected"));
interfaceNames.insert(i->getInterfaceName(), i);
updateInterface(i);
connect(i, SIGNAL(updateInterface(Interface*)), this, SLOT(updateInterface(Interface*)));
}
}
}
//getInterfaceList();
connectionList->header()->hide();
Config cfg("NetworkSetup");
profiles = QStringList::split(" ", cfg.readEntry("Profiles", "All"));
for ( QStringList::Iterator it = profiles.begin();
it != profiles.end(); ++it)
profilesList->insertItem((*it));
currentProfileLabel->setText(cfg.readEntry("CurrentProfile", "All"));
advancedUserMode = cfg.readBoolEntry("AdvancedUserMode", false);
scheme = cfg.readEntry("SchemeFile", DEFAULT_SCHEME);
QFile file(scheme);
if ( file.open(IO_ReadOnly) )
{ // file opened successfully
QTextStream stream( &file ); // use a text stream
while ( !stream.eof() )
{ // until end of file...
QString line = stream.readLine(); // line of text excluding '\n'
if(line.contains("SCHEME"))
{
line = line.mid(7, line.length());
currentProfileLabel->setText(line);
break;
}
}
file.close();
}
makeChannel();
}
/**
* Deconstructor. Save profiles. Delete loaded libraries.
*/
MainWindowImp::~MainWindowImp()
{
// Save profiles.
Config cfg("NetworkSetup");
cfg.setGroup("General");
cfg.writeEntry("Profiles", profiles.join(" "));
// Delete all interfaces that don't have owners.
QMap<Interface*, QListViewItem*>::Iterator iIt;
for( iIt = items.begin(); iIt != items.end(); ++iIt )
{
if(iIt.key()->getModuleOwner() == NULL)
delete iIt.key();
}
// Delete Modules and Libraries
QMap<Module*, QLibrary*>::Iterator it;
for( it = libraries.begin(); it != libraries.end(); ++it )
{
delete it.key();
// I wonder why I can't delete the libraries
// What fucking shit this is.
//delete it.data();
}
}
/**
* Query the kernel for all of the interfaces.
*/
void MainWindowImp::getAllInterfaces()
{
int sockfd = socket(PF_INET, SOCK_DGRAM, 0);
if(sockfd == -1)
return;
struct ifreq ifr;
QStringList ifaces;
QFile procFile(QString(_PROCNETDEV));
int result;
Interface *i;
if (! procFile.exists())
{
struct ifreq ifrs[100];
struct ifconf ifc;
ifc.ifc_len = sizeof(ifrs);
ifc.ifc_req = ifrs;
result = ioctl(sockfd, SIOCGIFCONF, &ifc);
for (unsigned int i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++)
{
struct ifreq *pifr = &ifrs[i];
ifaces += pifr->ifr_name;
}
}
else
{
procFile.open(IO_ReadOnly);
QString line;
QTextStream procTs(&procFile);
int loc = -1;
procTs.readLine(); // eat a line
procTs.readLine(); // eat a line
while((line = procTs.readLine().simplifyWhiteSpace()) != QString::null)
{
if((loc = line.find(":")) != -1)
{
ifaces += line.left(loc);
}
}
}
for (QStringList::Iterator it = ifaces.begin(); it != ifaces.end(); ++it)
{
int flags = 0;
if ( m_handledIfaces.contains( (*it) ) )
{
odebug << " " << (*it).latin1() << " is handled by a module" << oendl;
continue;
}
// int family;
i = NULL;
strcpy(ifr.ifr_name, (*it).latin1());
struct ifreq ifcopy;
ifcopy = ifr;
result = ioctl(sockfd, SIOCGIFFLAGS, &ifcopy);
flags = ifcopy.ifr_flags;
i = new Interface(this, ifr.ifr_name, false);
i->setAttached(true);
if ((flags & IFF_UP) == IFF_UP)
i->setStatus(true);
else
i->setStatus(false);
if ((flags & IFF_BROADCAST) == IFF_BROADCAST)
i->setHardwareName("Ethernet");
else if ((flags & IFF_POINTOPOINT) == IFF_POINTOPOINT)
i->setHardwareName("Point to Point");
else if ((flags & IFF_MULTICAST) == IFF_MULTICAST)
i->setHardwareName("Multicast");
else if ((flags & IFF_LOOPBACK) == IFF_LOOPBACK)
i->setHardwareName("Loopback");
else
i->setHardwareName("Unknown");
owarn << "Adding interface " << ifr.ifr_name << " to interfaceNames\n" << oendl;
interfaceNames.insert(i->getInterfaceName(), i);
updateInterface(i);
connect(i, SIGNAL(updateInterface(Interface*)),
this, SLOT(updateInterface(Interface*)));
}
// now lets ask the plugins too ;)
QMap<Module*, QLibrary*>::Iterator it;
QList<Interface> ilist;
for( it = libraries.begin(); it != libraries.end(); ++it )
{
if(it.key())
{
ilist = it.key()->getInterfaces();
for( i = ilist.first(); i != 0; i = ilist.next() )
{
owarn << "Adding interface " << i->getInterfaceName().latin1() << " to interfaceNames\n" << oendl;
interfaceNames.insert(i->getInterfaceName(), i);
updateInterface(i);
connect(i, SIGNAL(updateInterface(Interface*)),
this, SLOT(updateInterface(Interface*)));
}
}
}
}
/**
* Load all modules that are found in the path
* @param path a directory that is scaned for any plugins that can be loaded
* and attempts to load them
*/
void MainWindowImp::loadModules(const QString &path)
{
#ifdef DEBUG
odebug << "MainWindowImp::loadModules: " << path.latin1() << "" << oendl;
#endif
QDir d(path);
if(!d.exists())
return;
QString lang = ::getenv("LANG");
// Don't want sym links
d.setFilter( QDir::Files | QDir::NoSymLinks );
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list );
QFileInfo *fi;
while ( (fi=it.current()) )
{
if(fi->fileName().contains(".so"))
{
/* if loaded install translation */
if( loadPlugin(path + "/" + fi->fileName()) != 0l ){
QTranslator *trans = new QTranslator(qApp);
- QString fn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+ fi->fileName().left( fi->fileName().find(".") )+".qm";
+ QString fn = QPEApplication::qpeDir()+"i18n/"+lang+"/"+ fi->fileName().left( fi->fileName().find(".") )+".qm";
if( trans->load( fn ) )
qApp->installTranslator( trans );
else
delete trans;
}
odebug << "loaded plugin: >" << QString(path + "/" + fi->fileName()).latin1() << "< " << oendl;
}
++it;
}
}
/**
* Attempt to load a function and resolve a function.
* @param pluginFileName - the name of the file in which to attempt to load
* @param resolveString - function pointer to resolve
* @return pointer to the function with name resolveString or NULL
*/
Module* MainWindowImp::loadPlugin(const QString &pluginFileName, const QString &resolveString)
{
#ifdef DEBUG
odebug << "MainWindowImp::loadPlugin: " << pluginFileName.latin1() << ": resolving " << resolveString.latin1() << "" << oendl;
#endif
QLibrary *lib = new QLibrary(pluginFileName);
void *functionPointer = lib->resolve(resolveString);
if( !functionPointer )
{
#ifdef DEBUG
odebug << "MainWindowImp::loadPlugin: Warning: " << pluginFileName.latin1() << " is not a plugin" << oendl;
#endif
delete lib;
return 0;
}
// Try to get an object.
Module *object = ((Module* (*)()) functionPointer)();
if(object == 0)
{
#ifdef DEBUG
odebug << "MainWindowImp: Couldn't create object, but did load library!" << oendl;
#endif
delete lib;
return 0;
}
m_handledIfaces += object->handledInterfaceNames();
// Store for deletion later
libraries.insert(object, lib);
return object;
}
/**
* The Add button was clicked. Bring up the add dialog and if OK is hit
* load the plugin and append it to the list
*/
void MainWindowImp::addClicked()
{
QMap<Module*, QLibrary*>::Iterator it;
QMap<QString, QString> list;
QMap<QString, Module*> newInterfaceOwners;
for( it = libraries.begin(); it != libraries.end(); ++it )
{
if(it.key())
{
(it.key())->possibleNewInterfaces(list);
}
}
// See if the list has anything that we can add.
if(list.count() == 0)
{
QMessageBox::information(this, "Sorry", "Nothing to add.", QMessageBox::Ok);
return;
}
AddConnectionImp addNewConnection(this, "AddConnectionImp", true);
addNewConnection.addConnections(list);
if( QDialog::Accepted == QPEApplication::execDialog( &addNewConnection ) )
{
QListViewItem *item = addNewConnection.registeredServicesList->currentItem();
if(!item)
return;
for( it = libraries.begin(); it != libraries.end(); ++it )
{
if(it.key())
{
Interface *i = (it.key())->addNewInterface(item->text(0));
if(i)
{
odebug << "iface name " << i->getInterfaceName().latin1() << "" << oendl;
interfaceNames.insert(i->getInterfaceName(), i);
updateInterface(i);
}
}
}
}
}
/**
* Prompt the user to see if they really want to do this.
* If they do then remove from the list and unload.
*/
void MainWindowImp::removeClicked()
{
QListViewItem *item = connectionList->currentItem();
if(!item)
{
QMessageBox::information(this, "Sorry","Please select an interface First.", QMessageBox::Ok);
return;
}
Interface *i = interfaceItems[item];
if(i->getModuleOwner() == NULL)
{
QMessageBox::information(this, "Can't remove interface.", "Interface is built in.", QMessageBox::Ok);
}
else
{
if(!i->getModuleOwner()->remove(i))
QMessageBox::information(this, tr("Error"), tr("Unable to remove."), QMessageBox::Ok);
else
{
delete item;
// QMessageBox::information(this, "Success", "Interface was removed.", QMessageBox::Ok);
}
}
}
/**
* Pull up the configure about the currently selected interface.
* Report an error if no interface is selected.
* If the interface has a module owner then request its configure.
*/
void MainWindowImp::configureClicked()
{
QListViewItem *item = connectionList->currentItem();
if(!item)
{
QMessageBox::information(this, tr("Sorry"),tr("Please select an interface first."), QMessageBox::Ok);
return;
}
QString currentProfileText = currentProfileLabel->text();
if(currentProfileText.upper() == "ALL");
currentProfileText = "";
Interface *i = interfaceItems[item];
if(i->getModuleOwner())
{
QWidget *moduleConfigure = i->getModuleOwner()->configure(i);
if(moduleConfigure != NULL)
{
i->getModuleOwner()->setProfile(currentProfileText);
QPEApplication::showWidget( moduleConfigure );
return;
}
}
InterfaceSetupImpDialog *configure = new InterfaceSetupImpDialog(this, "InterfaceSetupImp", i, true, Qt::WDestructiveClose | Qt::WStyle_ContextHelp );
configure->setProfile(currentProfileText);
QPEApplication::showDialog( configure );
}
/**
* Pull up the information about the currently selected interface.
* Report an error if no interface is selected.
* If the interface has a module owner then request its configure.
*/
void MainWindowImp::informationClicked()
{
QListViewItem *item = connectionList->currentItem();
if(!item)
{
QMessageBox::information(this, "Sorry","Please select an interface First.", QMessageBox::Ok);
return;
}
Interface *i = interfaceItems[item];
// if(!i->isAttached()){
// QMessageBox::information(this, "Sorry","No information about\na disconnected interface.", QMessageBox::Ok);
// return;
// }
if(i->getModuleOwner())
{
QWidget *moduleInformation = i->getModuleOwner()->information(i);
if(moduleInformation != NULL)
{
QPEApplication::showWidget( moduleInformation );
#ifdef DEBUG
odebug << "MainWindowImp::informationClicked:: Module owner has created, we showed." << oendl;
#endif
return;
}
}
InterfaceInformationImp *information = new InterfaceInformationImp(this, "InterfaceSetupImp", i, Qt::WType_Modal | Qt::WDestructiveClose | Qt::WStyle_Dialog | Qt::WStyle_ContextHelp);
QPEApplication::showWidget( information );
}
/**
* Update this interface. If no QListViewItem exists create one.
* @param Interface* pointer to the interface that needs to be updated.
*/
void MainWindowImp::updateInterface(Interface *i)
{
if(!advancedUserMode)
{
if(i->getInterfaceName() == "lo")
return;
}
QListViewItem *item = NULL;
// Find the interface, making it if needed.
if(items.find(i) == items.end())
{
item = new QListViewItem(connectionList, "", "", "");
// See if you can't find a module owner for this interface
QMap<Module*, QLibrary*>::Iterator it;
for( it = libraries.begin(); it != libraries.end(); ++it )
{
if(it.key()->isOwner(i))
i->setModuleOwner(it.key());
}
items.insert(i, item);
interfaceItems.insert(item, i);
}
else
item = items[i];
// Update the icons and information
#ifdef QWS
item->setPixmap(0, (Resource::loadPixmap(i->getStatus() ? "up": "down")));
#else
item->setPixmap(0, (SmallIcon(i->getStatus() ? "up": "down")));
#endif
QString typeName = "lan";
if(i->getInterfaceName() == "lo")
typeName = "lo";
if(i->getInterfaceName().contains("irda"))
typeName = "irda";
if(i->getInterfaceName().contains("wlan"))
typeName = "wlan";
if(i->getInterfaceName().contains("usb"))
typeName = "usb";
if(!i->isAttached())
typeName = "connect_no";
// Actually try to use the Module
if(i->getModuleOwner() != NULL)
typeName = i->getModuleOwner()->getPixmapName(i);
#ifdef QWS
item->setPixmap(1, (Resource::loadPixmap(QString("networksettings/") + typeName)));
#else
item->setPixmap(1, (SmallIcon(typeName)));
#endif
item->setText(2, i->getHardwareName());
item->setText(3, QString("(%1)").arg(i->getInterfaceName()));
item->setText(4, (i->getStatus()) ? i->getIp() : QString(""));
}
void MainWindowImp::newProfileChanged(const QString& newText)
{
if(newText.length() > 0)
newProfileButton->setEnabled(true);
else
newProfileButton->setEnabled(false);
}
/**
* Adds a new profile to the list of profiles.
* Don't add profiles that already exists.
* Appends to the list and QStringList
*/
void MainWindowImp::addProfile()
{
QString newProfileName = newProfile->text();
if(profiles.grep(newProfileName).count() > 0)
{
QMessageBox::information(this, "Can't Add","Profile already exists.", QMessageBox::Ok);
return;
}
profiles.append(newProfileName);
profilesList->insertItem(newProfileName);
}
/**
* Removes the currently selected profile in the combo.
* Doesn't delete if there are less then 2 profiles.
*/
void MainWindowImp::removeProfile()
{
if(profilesList->count() <= 1)
{
QMessageBox::information(this, "Can't remove.","At least one profile\nis needed.", QMessageBox::Ok);
return;
}
QString profileToRemove = profilesList->currentText();
if(profileToRemove == "All")
{
QMessageBox::information(this, "Can't remove.","Can't remove default.", QMessageBox::Ok);
return;
}
// Can't remove the curent profile
if(profileToRemove == currentProfileLabel->text())
{
QMessageBox::information(this, "Can't remove.",QString("%1 is the current profile.").arg(profileToRemove), QMessageBox::Ok);
return;
}
if(QMessageBox::information(this, "Question",QString("Remove profile: %1").arg(profileToRemove), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok)
{
profiles = QStringList::split(" ", profiles.join(" ").replace(QRegExp(profileToRemove), ""));
profilesList->clear();
for ( QStringList::Iterator it = profiles.begin(); it != profiles.end(); ++it)
profilesList->insertItem((*it));
// Remove any interface settings and mappings.
Interfaces interfaces;
// Go through them one by one
QMap<Interface*, QListViewItem*>::Iterator it;
for( it = items.begin(); it != items.end(); ++it )
{
QString interfaceName = it.key()->getInterfaceName();
odebug << interfaceName.latin1() << oendl;
if(interfaces.setInterface(interfaceName + "_" + profileToRemove))
{
interfaces.removeInterface();
if(interfaces.setMapping(interfaceName))
{
if(profilesList->count() == 1)
interfaces.removeMapping();
else
{
interfaces.removeMap("map", interfaceName + "_" + profileToRemove);
}
}
interfaces.write();
break;
}
}
}
}
/**
* A new profile has been selected, change.
* @param newProfile the new profile.
*/
void MainWindowImp::changeProfile()
{
if(profilesList->currentItem() == -1)
{
QMessageBox::information(this, "Can't Change.","Please select a profile.", QMessageBox::Ok);
return;
}
QString newProfile = profilesList->text(profilesList->currentItem());
if(newProfile != currentProfileLabel->text())
{
currentProfileLabel->setText(newProfile);
QFile::remove(scheme);
QFile file(scheme);
if ( file.open(IO_ReadWrite) )
{
QTextStream stream( &file );
stream << QString("SCHEME=%1").arg(newProfile);
file.close();
}
// restart all up devices?
if(QMessageBox::information(this, "Question","Restart all running interfaces?", QMessageBox::Ok, QMessageBox::No) == QMessageBox::Ok)
{
// Go through them one by one
QMap<Interface*, QListViewItem*>::Iterator it;
for( it = items.begin(); it != items.end(); ++it )
{
if(it.key()->getStatus() == true)
it.key()->restart();
}
}
}
// TODO change the profile in the modules
}
void MainWindowImp::makeChannel()
{
channel = new QCopChannel( "QPE/Application/networksettings", this );
connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(receive(const QCString&,const QByteArray&)) );
}
void MainWindowImp::receive(const QCString &msg, const QByteArray &arg)
{
bool found = false;
odebug << "MainWindowImp::receive QCop msg >"+msg+"<" << oendl;
if (msg == "raise")
{
raise();
return;
}
QString dest = msg.left(msg.find("("));
QCString param = msg.right(msg.length() - msg.find("(") - 1);
param = param.left( param.length() - 1 );
odebug << "dest >" << dest.latin1() << "< param >"+param+"<" << oendl;
QMap<Module*, QLibrary*>::Iterator it;
for( it = libraries.begin(); it != libraries.end(); ++it )
{
odebug << "plugin >" << it.key()->type().latin1() << "<" << oendl;
if(it.key()->type() == dest)
{
it.key()->receive( param, arg );
found = true;
}
}
if (found) QPEApplication::setKeepRunning();
else odebug << "Huh what do ya want" << oendl;
}
diff --git a/noncore/settings/sysinfo/benchmarkinfo.cpp b/noncore/settings/sysinfo/benchmarkinfo.cpp
index 793fcb1..060185a 100644
--- a/noncore/settings/sysinfo/benchmarkinfo.cpp
+++ b/noncore/settings/sysinfo/benchmarkinfo.cpp
@@ -1,408 +1,408 @@
/**********************************************************************
** BenchmarkInfo
**
** A benchmark widget for Qt/Embedded
**
** Copyright (C) 2004 Michael Lauer <mickey@vanille.de>
** Inspired by ZBench (C) 2002 Satoshi <af230533@im07.alpha-net.ne.jp>
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "benchmarkinfo.h"
/* OPIE */
#include <opie2/odebug.h>
#include <opie2/ostorageinfo.h>
#include <opie2/olistview.h>
#include <qpe/qpeapplication.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpedecoration_qws.h>
#include <qpe/resource.h>
#include <qpe/config.h>
using namespace Opie::Core;
using namespace Opie::Ui;
/* QT */
#include <qclipboard.h>
#include <qcolor.h>
#include <qcombobox.h>
#include <qdirectpainter_qws.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qfiledialog.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qpainter.h>
#include <qpushbutton.h>
#include <qtimer.h>
#include <qwhatsthis.h>
/* STD */
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#if defined (__GNUC__) && (__GNUC__ < 3)
#define round qRound
#endif
extern "C"
{
void BenchFFT( void );
double dhry_main( int );
}
#define DHRYSTONE_RUNS 20000000
#define TEST_DURATION 3
//===========================================================================
class BenchmarkPaintWidget : public QWidget
{
public:
BenchmarkPaintWidget() : QWidget( 0, "Benchmark Paint Widget", WStyle_Customize|WStyle_StaysOnTop|WPaintUnclipped|WPaintClever )
{
resize( QApplication::desktop()->size() );
show();
p.begin( this );
};
~BenchmarkPaintWidget()
{
p.end();
hide();
};
QPainter p;
};
//===========================================================================
BenchmarkInfo::BenchmarkInfo( QWidget *parent, const char *name, int wFlags )
: QWidget( parent, name, wFlags )
{
setMinimumSize( 200, 150 );
QVBoxLayout* vb = new QVBoxLayout( this );
vb->setSpacing( 4 );
vb->setMargin( 4 );
tests = new OListView( this );
QWhatsThis::add( tests->viewport(), tr( "This area shows the available tests, the results for which the tests "
"have been performed, and comparison values for one selected device. "
"Use the checkboxes to define which tests you want to perform." ) );
tests->setMargin( 0 );
tests->addColumn( tr( "Tests" ) );
tests->addColumn( tr( "Results" ) );
tests->addColumn( tr( "Comparison" ) );
tests->setShowSortIndicator( true );
test_alu = new OCheckListItem( tests, tr( "1. Integer Arithmetic " ), OCheckListItem::CheckBox );
test_fpu = new OCheckListItem( tests, tr( "2. Floating Point Unit " ), OCheckListItem::CheckBox );
test_txt = new OCheckListItem( tests, tr( "3. Text Rendering " ), OCheckListItem::CheckBox );
test_gfx = new OCheckListItem( tests, tr( "4. Gfx Rendering " ), OCheckListItem::CheckBox );
test_ram = new OCheckListItem( tests, tr( "5. RAM Performance " ), OCheckListItem::CheckBox );
#ifndef QT_QWS_RAMSES
test_sd = new OCheckListItem( tests, tr( "6. SD Card Performance " ), OCheckListItem::CheckBox );
test_cf = new OCheckListItem( tests, tr( "7. CF Card Performance " ), OCheckListItem::CheckBox );
#endif
test_alu->setText( 1, "n/a" );
test_fpu->setText( 1, "n/a" );
test_txt->setText( 1, "n/a" );
test_gfx->setText( 1, "n/a" );
test_ram->setText( 1, "n/a" );
#ifndef QT_QWS_RAMSES
test_sd->setText( 1, "n/a" );
test_cf->setText( 1, "n/a" );
#endif
test_alu->setText( 2, "n/a" );
test_fpu->setText( 2, "n/a" );
test_txt->setText( 2, "n/a" );
test_gfx->setText( 2, "n/a" );
test_ram->setText( 2, "n/a" );
#ifndef QT_QWS_RAMSES
test_sd->setText( 2, "n/a" );
test_cf->setText( 2, "n/a" );
#endif
startButton = new QPushButton( tr( "&Start Tests!" ), this );
QWhatsThis::add( startButton, tr( "Click here to perform the selected tests." ) );
connect( startButton, SIGNAL( clicked() ), this, SLOT( run() ) );
vb->addWidget( tests, 2 );
QHBoxLayout* hb = new QHBoxLayout( vb );
hb->addWidget( startButton, 2 );
- QFile f( QPEApplication::qpeDir() + "/share/sysinfo/results" );
+ QFile f( QPEApplication::qpeDir() + "share/sysinfo/results" );
if ( f.open( IO_ReadOnly ) )
{
machineCombo = new QComboBox( this );
QWhatsThis::add( machineCombo, tr( "Choose a model to compare your results with." ) );
QTextStream ts( &f );
while( !ts.eof() )
{
QString machline = ts.readLine();
odebug << "sysinfo: parsing benchmark results for '" << machline << "'" << oendl;
QString resline = ts.readLine();
machines.insert( machline, new QStringList( QStringList::split( ",", resline ) ) );
machineCombo->insertItem( machline );
}
hb->addWidget( new QLabel( tr( "Compare:" ), this ) );
hb->addWidget( machineCombo, 2 );
connect( machineCombo, SIGNAL( activated(int) ), this, SLOT( machineActivated(int) ) );
}
}
BenchmarkInfo::~BenchmarkInfo()
{}
void BenchmarkInfo::machineActivated( int index )
{
QStringList* results = machines[ machineCombo->text( index ) ];
if ( !results )
{
odebug << "sysinfo: no results available." << oendl;
return;
}
QStringList::Iterator it = results->begin();
test_alu->setText( 2, *(it++) );
test_fpu->setText( 2, *(it++) );
test_txt->setText( 2, *(it++) );
test_gfx->setText( 2, *(it++) );
test_ram->setText( 2, *(it++) );
#ifndef QT_QWS_RAMSES
test_sd->setText( 2, *(it++) );
test_cf->setText( 2, *(it++) );
#endif
}
void BenchmarkInfo::run()
{
startButton->setText( "> Don't touch! <" );
qApp->processEvents();
QTime t;
if ( test_alu->isOn() )
{
int d = round( dhry_main( DHRYSTONE_RUNS ) );
test_alu->setText( 1, QString().sprintf( "%d dhrys", d ) );
test_alu->setOn( false );
}
if ( test_fpu->isOn() )
{
t.start();
BenchFFT();
test_fpu->setText( 1, QString().sprintf( "%.2f secs", t.elapsed() / 1000.0 ) );;
test_fpu->setOn( false );
}
if ( test_txt->isOn() )
{
int value = textRendering( TEST_DURATION );
test_txt->setText( 1, QString().sprintf( "%d chars/sec", value / TEST_DURATION ) );
test_txt->setOn( false );
}
if ( test_gfx->isOn() )
{
int value = gfxRendering( TEST_DURATION );
test_gfx->setText( 1, QString().sprintf( "%.2f gops/sec", value / 4.0 / TEST_DURATION ) ); // 4 tests
test_gfx->setOn( false );
}
if ( test_ram->isOn() ) // /tmp is supposed to be in RAM on a PDA
{
performFileTest( "/tmp/benchmarkFile.dat", test_ram );
}
#ifndef QT_QWS_RAMSES
if ( test_cf->isOn() )
{
OStorageInfo storage;
performFileTest( storage.cfPath() + "/benchmarkFile.dat", test_cf );
}
if ( test_sd->isOn() )
{
OStorageInfo storage;
performFileTest( storage.sdPath() + "/benchmarkFile.dat", test_sd );
}
#endif
startButton->setText( tr( "&Start Tests!" ) );
}
int BenchmarkInfo::textRendering( int seconds )
{
QTime t;
t.start();
int stop = t.elapsed() + seconds * 1000;
int rr[] = { 255, 255, 255, 0, 0, 0, 0, 128, 128 };
int gg[] = { 0, 255, 0, 0, 255, 255, 0, 128, 128 };
int bb[] = { 0, 0, 255, 0, 0, 255, 255, 128, 0 };
const QString text( "Opie Benchmark Test" );
int w = QApplication::desktop()->width();
int h = QApplication::desktop()->height();
srand( time( NULL ) );
BenchmarkPaintWidget bpw;
int loops = 0;
while ( t.elapsed() < stop )
{
int k = rand() % 9;
int s = rand() % 100;
bpw.p.setPen( QColor( rr[ k ], gg[ k ], bb[ k ] ) );
bpw.p.setFont( QFont( "Vera", s ) );
bpw.p.drawText( rand() % w, rand() % h, text, text.length() );
++loops;
}
return loops * text.length();
}
int BenchmarkInfo::gfxRendering( int seconds )
{
int rr[] = { 255, 255, 255, 0, 0, 0, 0, 128, 128 };
int gg[] = { 0, 255, 0, 0, 255, 255, 0, 128, 128 };
int bb[] = { 0, 0, 255, 0, 0, 255, 255, 128, 0 };
int w = QApplication::desktop()->width();
int h = QApplication::desktop()->height();
srand( time( NULL ) );
BenchmarkPaintWidget bpw;
QTime t;
t.start();
int stop = t.elapsed() + seconds*1000;
int loops = 0;
while ( t.elapsed() < stop )
{
int k = rand() % 9;
bpw.p.setPen( QColor( rr[ k ], gg[ k ], bb[ k ] ) );
bpw.p.drawLine( rand()%w, rand()%h, rand()%w, rand()%h );
++loops;
}
t.restart();
stop = t.elapsed() + seconds*1000;
while ( t.elapsed() < stop )
{
int k = rand() % 9;
bpw.p.setPen( QColor( rr[ k ], gg[ k ], bb[ k ] ) );
bpw.p.drawArc( rand()%w, rand()%h, rand()%w, rand()%h, 360 * 16, 360 * 16 );
++loops;
}
QBrush br1;
br1.setStyle( SolidPattern );
t.restart();
stop = t.elapsed() + seconds*1000;
while ( t.elapsed() < stop )
{
int k = rand() % 9;
br1.setColor( QColor( rr[ k ], gg[ k ], bb[ k ] ) );
bpw.p.fillRect( rand()%w, rand()%h, rand()%w, rand()%h, br1 );
++loops;
}
QPixmap p = Resource::loadPixmap( "sysinfo/pattern" );
t.restart();
stop = t.elapsed() + seconds*1000;
while ( t.elapsed() < stop )
{
bpw.p.drawPixmap( rand()%w, rand()%h, p );
++loops;
}
return loops;
}
const unsigned int FILE_TEST_COUNT = 8000;
const unsigned int FILE_TEST_BLOCKSIZE = 1024;
void BenchmarkInfo::performFileTest( const QString& fname, OCheckListItem* item )
{
QString filename = fname == "/benchmarkFile.dat" ? QString( "/tmp/bla" ) : fname;
odebug << "performing file test on " << filename << oendl;
QString writeCommand = QString( "dd if=/dev/zero of=%1 count=%2 bs=%3 && sync" ).arg( filename )
.arg( FILE_TEST_COUNT )
.arg( FILE_TEST_BLOCKSIZE );
QString readCommand = QString( "dd if=%1 of=/dev/null count=%2 bs=%3").arg( filename )
.arg( FILE_TEST_COUNT )
.arg( FILE_TEST_BLOCKSIZE );
::system( "sync" );
odebug << "performing file test on " << filename << oendl;
int write = 0;
int read = 0;
QTime time;
time.start();
if ( ::system( writeCommand ) == 0 )
{
write = time.elapsed();
}
else
{
item->setText( 1, tr( "error" ) );
return;
}
time.restart();
if ( ::system( readCommand ) == 0 )
{
read = time.elapsed();
}
else
{
item->setText( 1, tr( "error" ) );
return;
}
QFile::remove( filename );
double readSpeed = FILE_TEST_COUNT / ( read / 1000.0 );
QString readUnit = "kB/s";
if ( readSpeed > 1024 )
{
readSpeed /= 1024.0;
readUnit = "MB/s";
}
double writeSpeed = FILE_TEST_COUNT / ( write / 1000.0 );
QString writeUnit = "kb/s";
if ( writeSpeed > 1024 )
{
writeSpeed /= 1024.0;
writeUnit = "MB/s";
}
item->setText( 1, QString().sprintf( "%.2f %s; %.2f %s", readSpeed, readUnit.latin1(), writeSpeed, writeUnit.latin1() ) );
item->setOn( false );
}
diff --git a/noncore/settings/tabmanager/tabmanager.cpp b/noncore/settings/tabmanager/tabmanager.cpp
index 3eae424..85e5814 100644
--- a/noncore/settings/tabmanager/tabmanager.cpp
+++ b/noncore/settings/tabmanager/tabmanager.cpp
@@ -1,510 +1,510 @@
#include "tabmanager.h"
#include "app.h"
#include "wait.h"
#include "tabapplnk.h"
#include <opie2/odebug.h>
#include <qpe/applnk.h>
#include <qdir.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qlistview.h>
#include <qheader.h>
#include <qcombobox.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <qmessagebox.h>
#include <stdlib.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
-#define HOME_APP_DIR QPEApplication::qpeDir()+"/apps"
+#define HOME_APP_DIR QPEApplication::qpeDir()+"apps"
#define HOME_APP_INSTALL_DIR "/usr/lib/ipkg/info"
#define NEW_FOLDER "EmptyTab"
#define NEW_APPLICATION "NewApp"
#define APPLICATION_EXTENSION ".desktop"
#define APPLICATION_EXTENSION_LENGTH 8
/**
* Constructor. Sets up signals. Performs initial scan of applications
* and tabs
*/
TabManager::TabManager( QWidget* parent, const char* name):TabManagerBase(parent, name), changed(false), application(NULL){
rescanFolder(HOME_APP_DIR);
// Connect the signals and slots
connect(tabList, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(editItem(QListViewItem*)));
(tabList->header())->hide();
connect(tabList, SIGNAL(moveItem(QListViewItem*,QListViewItem*)), this, SLOT(moveApplication(QListViewItem*,QListViewItem*)));
}
/**
* If anything in the tab's have been changed then update the system or alert
* the user.
*/
TabManager::~TabManager(){
if(changed){
// Prompt.
//int answer = QMessageBox::warning(this, "Message", "Should your desktop be","Yes", "Cancel", 0, 1 );
//if (answer)
// return;
QCopEnvelope e("QPE/System", "linkChanged(QString)");
QString link; //we'll just send an empty string
e << link;
}
}
/**
* Scans root directory for any tabs or applications. Will recursivly go down,
* but will not follow symlinks.
* @param directory - the directory to look in.
* @param parent - the parent to place any new tabs or apps into. If parent is
* NULL then the item is a tab and should be placed as a child of the window.
*/
void TabManager::rescanFolder(QString directory, QListViewItem* parent){
//odebug << QString("rescanFolder: ") + directory.latin1() << oendl;
QDir d;
d.setPath(directory);
// Show hidden files for .directories
d.setFilter( QDir::Files | QDir::Hidden | QDir::Dirs);
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
while ( (fi=it.current()) ) { // for each file...
// If it is a dir and not .. or . then add it as a tab and go down.
if(fi->isDir()){
if(fi->fileName() != ".." && fi->fileName() != ".") {
QListViewItem* newItem;
if(!parent)
newItem = new QListViewItem(tabList, fi->fileName());
else
newItem = new QListViewItem(parent, fi->fileName());
itemList.insert(newItem, directory + "/" + fi->fileName() + "/.directory" );
rescanFolder(directory + "/" + fi->fileName(), newItem);
}
}
else{
// it is a file, if not a .directory add to parent.
// Change parents name and icon to reflect icon.
if(fi->fileName() == ".directory"){
AppLnk app(directory + "/" + fi->fileName());
if(parent){
parent->setPixmap(0,app.pixmap());
parent->setText(0, app.name());
}
}
else{
// Add any desktop files found.
QListViewItem* newItem;
if(directory != HOME_APP_DIR){
if(!parent)
newItem = new QListViewItem(tabList, fi->fileName());
else
newItem = new QListViewItem(parent, fi->fileName());
if(fi->fileName().right(APPLICATION_EXTENSION_LENGTH) == APPLICATION_EXTENSION){
AppLnk app(directory + "/" + fi->fileName());
newItem->setPixmap(0,app.pixmap());
newItem->setText(0, app.name());
itemList.insert(newItem, directory + "/" + fi->fileName());
}
}
}
}
++it; // goto next list element
}
}
/**
* Create a new blank Tab.
* Create a physical folder with .directory file
* Create a item on the list
*/
void TabManager::newFolder(){
QDir r;
r.mkdir(QString(HOME_APP_DIR) + "/" + NEW_FOLDER);
system((QString("echo [Desktop Entry] | cat >> ") + HOME_APP_DIR + "/" + NEW_FOLDER "/.directory").latin1());
system((QString("echo Name=" NEW_FOLDER " | cat >> ") + HOME_APP_DIR + "/" + NEW_FOLDER "/.directory").latin1());
QString homeLocation = QString(HOME_APP_DIR) + "/" + NEW_FOLDER + "/.directory";
QListViewItem *newItem = new QListViewItem(tabList, NEW_FOLDER);
itemList.insert(newItem, homeLocation );
// We have changed something.
changed = true;
}
/**
* Create a new blank application
* Make sure a tab is selected
* create physical file
* fill file with default information (entry, name, type).
*/
void TabManager::newApplication(){
QListViewItem *item = tabList->currentItem();
if(!item || item->parent())
return;
QString parentDir = itemList[item].mid(0,itemList[item].length()-11);
QString homeLocation = parentDir + "/" NEW_APPLICATION APPLICATION_EXTENSION;
system((QString("echo [Desktop Entry] | cat >> ") + homeLocation).latin1());
system((QString("echo Name=" NEW_APPLICATION " | cat >> ") + homeLocation).latin1());
int slash = parentDir.findRev('/', -1);
QString folderName = parentDir.mid(slash+1, parentDir.length());
system((QString("echo Type=") + folderName + " | cat >> " + homeLocation).latin1());
// Insert into the tree
QListViewItem *newItem = new QListViewItem(item, NEW_APPLICATION);
itemList.insert(newItem, homeLocation );
// We have changed something.
changed = true;
}
/**
* Remove the item.
* Check if we can
* Prompt user
* Delete physical file (Dir, remove .dir, then dir. File, remove file)
* Remove from installer if need too.
*/
void TabManager::removeItem(){
// Make sure we can delete
QListViewItem *item = tabList->currentItem();
if(!item)
return;
if(item->childCount() > 0){
QMessageBox::critical(this, tr("Message"), tr("Can't remove with applications\nstill in the group."), tr("Ok") );
return;
}
// Prompt.
int answer = QMessageBox::warning(this, tr("Message"), tr("Are you sure you want to delete?"), tr("Yes"), tr("Cancel"), 0, 1 );
if (answer)
return;
bool removeSuccessful = true;
QString location = itemList[item];
// Remove file (.directory in a Directory case)
if(!QFile::remove(location))
removeSuccessful = false;
// Remove directory
if(item->parent() == NULL){
// Remove .directory file string
location = location.mid(0,location.length()-10);
QDir dir;
if(!dir.rmdir(location))
removeSuccessful = false;
else
removeSuccessful = true;
}
// If removing failed.
if(!removeSuccessful){
odebug << (QString("removeItem: ") + location).latin1() << oendl;
QMessageBox::critical(this, tr("Message"), tr("Can't remove."), tr("Ok") );
return;
}
// Remove from the installer so it wont fail.
// Don't need to do this sense the current install uses rm -f so no error
// Remove from the gui list.
itemList.remove(item);
if(item->parent())
item->parent()->takeItem(item);
delete item;
// We have changed something.
changed = true;
}
/**
* Helper function. Edits the current item.
* calls editItem with the currently selected item.
*/
void TabManager::editCurrentItem(){
editItem(tabList->currentItem());
}
/**
* Edit the item that is passed in.
* Show application dialog and if anything changed
* @param item the item to edit.
*/
void TabManager::editItem( QListViewItem * item){
if(!item)
return;
TabAppLnk app(itemList[item]);
if(!app.isValid()){
odebug << QString("editItem: Not a valid applnk file: ") + itemList[item].latin1() << oendl;
return;
}
// Fill with all of the icons
if(!application){
Wait waitDialog(this, "Wait dialog");
waitDialog.waitLabel->setText(tr("Gathering icons..."));
waitDialog.show();
qApp->processEvents();
application = new AppEdit(this, "Application edit", true);
- QDir d(QPEApplication::qpeDir() + "/pics/");
+ QDir d(QPEApplication::qpeDir() + "pics/");
d.setFilter( QDir::Files);
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
while ( (fi=it.current()) ) { // for each file...
QString fileName = fi->fileName();
if(fileName.right(4) == ".png"){
fileName = fileName.mid(0,fileName.length()-4);
QPixmap imageOfFile(Resource::loadPixmap(fileName));
QImage foo = imageOfFile.convertToImage();
foo = foo.smoothScale(16,16);
imageOfFile.convertFromImage(foo);
application->iconLineEdit->insertItem(imageOfFile,fileName);
}
//odebug << fi->fileName().latin1() << oendl;
++it;
}
waitDialog.hide();
}
int pixmap = -1;
QString pixmapText = app.pixmapString();
QComboBox *f = application->iconLineEdit;
for(int i = 0; i < application->iconLineEdit->count(); i++){
if(f->text(i) == pixmapText){
pixmap = i;
break;
}
}
if(pixmap != -1)
application->iconLineEdit->setCurrentItem(pixmap);
else if(pixmapText.isEmpty()){
application->iconLineEdit->setCurrentItem(0);
}
else{
QPixmap imageOfFile(Resource::loadPixmap(pixmapText));
QImage foo = imageOfFile.convertToImage();
foo = foo.smoothScale(16,16);
imageOfFile.convertFromImage(foo);
application->iconLineEdit->insertItem(imageOfFile,pixmapText,0);
application->iconLineEdit->setCurrentItem(0);
}
application->nameLineEdit->setText(app.name());
application->execLineEdit->setText(app.exec());
application->commentLineEdit->setText(app.comment());
if(item->parent() == NULL){
application->execLineEdit->setEnabled(false);
application->TextLabel3->setEnabled(false);
application->setCaption(tr("Tab"));
}
else{
application->execLineEdit->setEnabled(true);
application->TextLabel3->setEnabled(true);
application->setCaption(tr("Application"));
}
// Only do somthing if they hit OK
application->showMaximized();
if(application->exec() == 0)
return;
// If nothing has changed exit (hmmm why did they hit ok?)
if(app.name() == application->nameLineEdit->text() &&
app.pixmapString() == application->iconLineEdit->currentText() &&
app.comment() == application->commentLineEdit->text() &&
app.exec() == application->execLineEdit->text())
return;
// Change the applnk file
QString oldName = app.name();
app.setName(application->nameLineEdit->text());
app.setIcon(application->iconLineEdit->currentText());
app.setComment(application->commentLineEdit->text());
app.setExec(application->execLineEdit->text());
if(!app.writeLink()){
QMessageBox::critical(this, tr("Message"), "Can't save.", tr("Ok") );
return;
}
// Update the gui icon and name
item->setText(0,app.name());
item->setPixmap(0,app.pixmap());
// We have changed something.
changed = true;
// If we were dealing with a new folder or new application change
// the file names. Also change the item location in itemList
if(oldName == NEW_FOLDER){
QDir r;
QString oldName = itemList[item];
oldName = oldName.mid(0,oldName.length()-11);
QString newName = oldName.mid(0,oldName.length()-9);
newName = newName + "/" + app.name();
r.rename(oldName, newName);
itemList.remove(item);
itemList.insert(item, newName + "/.directory" );
}
else if(oldName == NEW_APPLICATION){
if(!item->parent())
return;
QString parentDir = itemList[item->parent()];
QDir r;
QString oldName = itemList[item];
QString newName = oldName.mid(0, parentDir.length()-10);
newName = newName + app.name() + APPLICATION_EXTENSION;
r.rename(oldName, newName);
itemList.remove(item);
itemList.insert(item, newName);
}
}
/**
* Move an application from one directory to another.
* Move in the gui, move in the applnk file, move in the installer.
* @param item the application to move
* @pearam newGroup the new parent of this application
*/
void TabManager::moveApplication(QListViewItem *item, QListViewItem *newGroup){
// Can we even move it?
if(!item || !item->parent() || newGroup->parent())
return;
if(item->parent() == newGroup)
return;
// Get the new folder, new file name,
QString newFolder = itemList[newGroup];
newFolder = newFolder.mid(0,newFolder.length()-11);
int slash = newFolder.findRev('/', -1);
QString folderName = newFolder.mid(slash+1, newFolder.length());
QString desktopFile = itemList[item];
slash = desktopFile.findRev('/', -1);
desktopFile = desktopFile.mid(slash, desktopFile.length());
newFolder = newFolder + desktopFile;
// Move file
QDir r;
if(!r.rename(itemList[item], newFolder)){
QMessageBox::critical(this, tr("Message"), "Can't move application.", tr("Ok") );
return;
}
//odebug << (QString("moveApplication: ") + itemList[item]).latin1() << oendl;
//odebug << (QString("moveApplication: ") + newFolder).latin1() << oendl;
// Move in the gui
item->parent()->takeItem(item);
newGroup->insertItem(item);
newGroup->setOpen(true);
// Move file in the installer
QString installedAppFile;
if(findInstalledApplication(desktopFile, installedAppFile))
swapInstalledLocation(installedAppFile, desktopFile, newFolder);
else
odebug << "moveApplication: No installed app found for dekstop file" << oendl;
// Move application type
AppLnk app(newFolder);
app.setType(folderName);
app.writeLink();
// Move in our internal list
itemList.remove(item);
itemList.insert(item, newFolder);
// We have changed something.
changed = true;
}
/**
* File the installed application that has this desktop file.
* Go through each file in HOME_APP_INSTALL_DIR and see if it contains desktop
* file
* @param desktopFile - the .desktop file to search for [foo.desktop]
* @param installedAppFile - location of the app install list
* @return true if successful, false if file not found.
*/
bool TabManager::findInstalledApplication(QString desktopFile, QString &installedAppFile){
QDir d;
d.setPath(HOME_APP_INSTALL_DIR);
d.setFilter( QDir::Files );
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
while ( (fi=it.current()) ) { // for each file...
QFile file(QString(HOME_APP_INSTALL_DIR) + "/" + fi->fileName());
if ( file.open(IO_ReadOnly) ) { // file opened successfully
QTextStream stream( &file ); // use a text stream
QString line;
while ( !stream.eof() ) { // until end of file...
line = stream.readLine(); // line of text excluding '\n'
if(line.contains(desktopFile)){
installedAppFile = QString(HOME_APP_INSTALL_DIR) + "/" + fi->fileName();
file.close();
return true;
}
}
file.close();
}
else
odebug << (QString("findInstalledApplication: Can't open file") + HOME_APP_INSTALL_DIR + "/" + fi->fileName()).latin1() << oendl;
++it; // goto next list element
}
return false;
}
/**
* Open a file and replace a file containing the old desktop file with the new.
* @param installedAppFile application installed list
* @param desktopFile old .desktop file
* @param newLocation new .desktop file
*/
void TabManager::swapInstalledLocation( QString installedAppFile, QString desktopFile, QString newLocation ){
QFile file(installedAppFile);
if ( !file.open(IO_ReadOnly) ){
odebug << QString("swapInstalledLocation: Can't edit file: %1").arg(installedAppFile).latin1() << oendl;
return;
}
QTextStream stream( &file ); // use a text stream
QString allLines;
while ( !stream.eof() ) { // until end of file...
QString line = stream.readLine(); // line of text excluding '\n'
if(line.contains(desktopFile))
allLines += newLocation;
else
allLines += line;
allLines += '\n';
}
file.close();
if ( !file.open(IO_ReadWrite) ){
odebug << QString("swapInstalledLocation: Can't edit file: %1").arg(installedAppFile).latin1() << oendl;
return;
}
QTextStream streamOut( &file );
streamOut << allLines;
file.close();
}
// tabmanager.cpp
diff --git a/noncore/styles/theme/othemebase.cpp b/noncore/styles/theme/othemebase.cpp
index d2226e6..4275dd6 100644
--- a/noncore/styles/theme/othemebase.cpp
+++ b/noncore/styles/theme/othemebase.cpp
@@ -1,1205 +1,1205 @@
/* This file is part of the KDE libraries
Copyright (C) 1999 Daniel M. Duley <mosfet@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "othemebase.h"
#include "ogfxeffect.h"
/* OPIE */
#include <opie2/odebug.h>
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
using namespace Opie::Core;
/* QT */
#include <qfile.h>
#include <qtextstream.h>
#include <qdir.h>
#include <qpainter.h>
#include <qbitmap.h>
#include <qstringlist.h>
/* STD */
#include <stdlib.h>
template class QIntCache<OThemePixmap>
;
static const char *widgetEntries[] =
{ // unsunken widgets (see header)
"PushButton", "ComboBox", "HSBarSlider", "VSBarSlider", "Bevel", "ToolButton",
"ScrollButton", "HScrollDeco", "VScrollDeco", "ComboDeco", "MenuItem", "Tab",
"ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight",
// sunken widgets
"PushButtonDown", "ComboBoxDown", "HSBarSliderDown", "VSBarSliderDown",
"BevelDown", "ToolButtonDown", "ScrollButtonDown", "HScrollDecoDown",
"VScrollDecoDown", "ComboDecoDown", "MenuItemDown", "TabDown", "SunkenArrowUp",
"SunkenArrowDown", "SunkenArrowLeft", "SunkenArrowRight",
// everything else
"HScrollGroove", "VScrollGroove", "Slider", "SliderGroove", "CheckBoxDown",
"CheckBox", "RadioDown", "Radio", "HBarHandle", "VBarHandle",
"ToolBar", "Splitter", "CheckMark", "MenuBar", "DisableArrowUp",
"DisableArrowDown", "DisableArrowLeft", "DisableArrowRight", "ProgressBar",
"ProgressBackground", "MenuBarItem", "Background"
};
#define INHERIT_ITEMS 16
// This is used to encode the keys. I used to use masks but I think this
// bitfield is nicer :) I don't know why C++ coders don't use these more..
// (mosfet)
struct kthemeKeyData
{
unsigned int id :
6;
unsigned int width :
12;
unsigned int height :
12;
unsigned int border :
1;
unsigned int mask :
1;
};
union kthemeKey{
kthemeKeyData data;
unsigned int cacheKey;
};
void OThemeBase::generateBorderPix( int i )
{
// separate pixmap into separate components
if ( pbPixmaps[ i ] ) {
// evidently I have to do masks manually...
const QBitmap * srcMask = pbPixmaps[ i ] ->mask();
QBitmap destMask( pbWidth[ i ], pbWidth[ i ] );
QPixmap tmp( pbWidth[ i ], pbWidth[ i ] );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, 0, pbWidth[ i ], pbWidth[ i ],
Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, 0, 0, pbWidth[ i ], pbWidth[ i ],
Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::TopLeft, tmp );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ], 0,
pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
0, pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::TopRight, tmp );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbPixmaps[ i ] ->height() - pbWidth[ i ],
pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, 0, pbPixmaps[ i ] ->height() - pbWidth[ i ],
pbWidth[ i ], pbWidth[ i ], Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomLeft, tmp );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ],
pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ],
Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
pbPixmaps[ i ] ->height() - pbWidth[ i ], pbWidth[ i ], pbWidth[ i ],
Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::BottomRight, tmp );
tmp.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] );
destMask.resize( pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ] );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ], 0,
pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ], 0,
pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ],
Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::Top, tmp );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbWidth[ i ],
pbPixmaps[ i ] ->height() - pbWidth[ i ],
pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, pbWidth[ i ],
pbPixmaps[ i ] ->height() - pbWidth[ i ],
pbPixmaps[ i ] ->width() - pbWidth[ i ] * 2, pbWidth[ i ], Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::Bottom, tmp );
tmp.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 );
destMask.resize( pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2 );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], 0, pbWidth[ i ], pbWidth[ i ],
pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, 0, pbWidth[ i ], pbWidth[ i ],
pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2, Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::Left, tmp );
bitBlt( &tmp, 0, 0, pbPixmaps[ i ], pbPixmaps[ i ] ->width() - pbWidth[ i ],
pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2,
Qt::CopyROP, false );
if ( srcMask ) {
bitBlt( &destMask, 0, 0, srcMask, pbPixmaps[ i ] ->width() - pbWidth[ i ],
pbWidth[ i ], pbWidth[ i ], pbPixmaps[ i ] ->height() - pbWidth[ i ] * 2,
Qt::CopyROP, false );
tmp.setMask( destMask );
}
pbPixmaps[ i ] ->setBorder( OThemePixmap::Right, tmp );
}
else
odebug << "OThemeBase: Tried making border from empty pixmap" << oendl;
}
void OThemeBase::copyWidgetConfig( int sourceID, int destID, QString *pixnames,
QString *brdnames )
{
scaleHints[ destID ] = scaleHints[ sourceID ];
gradients[ destID ] = gradients[ sourceID ];
blends[ destID ] = blends[ sourceID ];
bContrasts[ destID ] = bContrasts[ sourceID ];
borders[ destID ] = borders[ sourceID ];
highlights[ destID ] = highlights[ sourceID ];
if ( grLowColors[ sourceID ] )
grLowColors[ destID ] = new QColor( *grLowColors[ sourceID ] );
else
grLowColors[ destID ] = NULL;
if ( grHighColors[ sourceID ] )
grHighColors[ destID ] = new QColor( *grHighColors[ sourceID ] );
else
grHighColors[ destID ] = NULL;
if ( colors[ sourceID ] )
colors[ destID ] = new QColorGroup( *colors[ sourceID ] );
else
colors[ destID ] = NULL;
// pixmap
pixnames[ destID ] = pixnames[ sourceID ];
duplicate[ destID ] = false;
pixmaps[ destID ] = NULL;
images[ destID ] = NULL;
if ( !pixnames[ destID ].isEmpty() ) {
if ( scaleHints[ sourceID ] == TileScale && blends[ sourceID ] == 0.0 ) {
pixmaps[ destID ] = pixmaps[ sourceID ];
duplicate[ destID ] = true;
}
if ( !duplicate[ destID ] ) {
pixmaps[ destID ] = loadPixmap( pixnames[ destID ] );
if ( scaleHints[ destID ] == TileScale && blends[ destID ] == 0.0 )
images[ destID ] = NULL;
else
images[ destID ] = loadImage( pixnames[ destID ] );
}
}
// border pixmap
pbDuplicate[ destID ] = false;
pbPixmaps[ destID ] = NULL;
pbWidth[ destID ] = pbWidth[ sourceID ];
brdnames[ destID ] = brdnames[ sourceID ];
if ( !brdnames[ destID ].isEmpty() ) {
pbPixmaps[ destID ] = pbPixmaps[ sourceID ];
pbDuplicate[ destID ] = true;
}
if ( sourceID == ActiveTab && destID == InactiveTab )
aTabLine = iTabLine;
else if ( sourceID == InactiveTab && destID == ActiveTab )
iTabLine = aTabLine;
}
void OThemeBase::readConfig( Qt::GUIStyle /*style*/ )
{
#define PREBLEND_ITEMS 12
static WidgetType preBlend[] = {Slider, IndicatorOn, IndicatorOff,
ExIndicatorOn, ExIndicatorOff, HScrollDeco, VScrollDeco, HScrollDecoDown,
VScrollDecoDown, ComboDeco, ComboDecoDown, CheckMark};
int i;
QString tmpStr;
QString copyfrom[ WIDGETS ];
QString pixnames[ WIDGETS ]; // used for duplicate check
QString brdnames[ WIDGETS ];
bool loaded[ WIDGETS ]; // used for preloading for CopyWidget
if ( configFileName.isEmpty() ) {
Config cfg ( "qpe" );
cfg. setGroup ( "Appearance" );
configFileName = cfg. readEntry ( "Theme", "default" );
}
Config config( configFilePath + "/themes/" + configFileName + ".themerc" , Config::File );
// Are we initalized?
applyMiscResourceGroup( &config );
for ( i = 0; i < INHERIT_ITEMS; ++i ) {
applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
}
for ( ; i < INHERIT_ITEMS*2; ++i ) {
if ( config.hasGroup( QString( widgetEntries[ i ] ) ) ) {
applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
}
else {
copyfrom [ i ] = widgetEntries[ i - INHERIT_ITEMS ];
}
}
for ( ; i < WIDGETS; ++i ) {
applyResourceGroup( &config, i, copyfrom, pixnames, brdnames );
}
// initalize defaults that may not be read
for ( i = 0; i < WIDGETS; ++i )
loaded[ i ] = false;
btnXShift = btnYShift = focus3DOffset = 0;
aTabLine = iTabLine = true;
roundedButton = roundedCombo = roundedSlider = focus3D = false;
splitterWidth = 10;
for ( i = 0; i < WIDGETS; ++i ) {
readResourceGroup( i, copyfrom, pixnames, brdnames, loaded );
}
// misc items
readMiscResourceGroup();
// Handle preblend items
for ( i = 0; i < PREBLEND_ITEMS; ++i ) {
if ( pixmaps[ preBlend[ i ] ] != NULL && blends[ preBlend[ i ] ] != 0.0 )
blend( preBlend[ i ] );
}
}
OThemeBase::OThemeBase( const QString & configFile )
: QWindowsStyle()
{
- configFilePath = QPEApplication::qpeDir ( ) + "/plugins/styles/";
+ configFilePath = QPEApplication::qpeDir ( ) + "plugins/styles/";
configFileName = configFile;
readConfig( Qt::WindowsStyle );
cache = new OThemeCache( cacheSize );
}
void OThemeBase::applyConfigFile( const QString &/*file*/ )
{
#if 0
// handle std color scheme
Config inConfig( file, Config::File );
Config globalConfig ( "qpe" );
globalConfig. setGroup ( "Apperance" );
inConfig. setGroup( "General" );
if ( inConfig.hasKey( "foreground" ) )
globalConfig.writeEntry( "Text", inConfig.readEntry( "foreground", " " ) );
if ( inConfig.hasKey( "background" ) )
globalConfig.writeEntry( "Background", inConfig.readEntry( "background", " " ) );
if ( inConfig.hasKey( "selectForeground" ) )
globalConfig.writeEntry( "HighlightedText", inConfig.readEntry( "selectForeground", " " ) );
if ( inConfig.hasKey( "selectBackground" ) )
globalConfig.writeEntry( "Highlight", inConfig.readEntry( "selectBackground", " " ) );
if ( inConfig.hasKey( "windowForeground" ) )
globalConfig.writeEntry( "Text", inConfig.readEntry( "windowForeground", " " ) );
if ( inConfig.hasKey( "windowBackground" ) )
globalConfig.writeEntry( "Base", inConfig.readEntry( "windowBackground", " " ) );
// Keep track of the current theme so that we can select the right one
// in the KControl module.
globalConfig.writeEntry ( "CurrentTheme", file );
globalConfig.write();
#endif
}
OThemeBase::~OThemeBase()
{
int i;
for ( i = 0; i < WIDGETS; ++i ) {
if ( !duplicate[ i ] ) {
if ( images[ i ] )
delete images[ i ];
if ( pixmaps[ i ] )
delete pixmaps[ i ];
}
if ( !pbDuplicate[ i ] && pbPixmaps[ i ] )
delete pbPixmaps[ i ];
if ( colors[ i ] )
delete( colors[ i ] );
if ( grLowColors[ i ] )
delete( grLowColors[ i ] );
if ( grHighColors[ i ] )
delete( grHighColors[ i ] );
}
delete cache;
}
QImage* OThemeBase::loadImage( QString &name )
{
QImage * image = new QImage;
QString path = configFilePath + "/pixmaps/" + name;
image->load( path );
if ( !image->isNull() )
return ( image );
odebug << "OThemeBase: Unable to load image " << name.ascii ( ) << oendl;
delete image;
return ( NULL );
}
OThemePixmap* OThemeBase::loadPixmap( QString &name )
{
OThemePixmap * pixmap = new OThemePixmap( false );
QString path = configFilePath + "/pixmaps/" + name;
pixmap->load( path );
if ( !pixmap->isNull() )
return pixmap;
odebug << "OThemeBase: Unable to load pixmap " << name.ascii() << oendl;
delete pixmap;
return ( NULL );
}
OThemePixmap* OThemeBase::scale( int w, int h, WidgetType widget )
{
if ( scaleHints[ widget ] == FullScale ) {
if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
pixmaps[ widget ] ->height() != h ) {
OThemePixmap * cachePix = cache->pixmap( w, h, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
widget );
else
odebug << "We would have inserted a null pixmap!\n" << oendl;
pixmaps[ widget ] = cachePix;
}
else {
cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
QImage tmpImg = images[ widget ] ->smoothScale( w, h );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->convertFromImage( tmpImg );
if ( blends[ widget ] != 0.0 )
blend( widget );
}
}
}
else if ( scaleHints[ widget ] == HorizontalScale ) {
if ( pixmaps[ widget ] ->width() != w ) {
OThemePixmap * cachePix = cache->horizontalPixmap( w, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget );
else
odebug << "We would have inserted a null pixmap!" << oendl;
pixmaps[ widget ] = cachePix;
}
else {
cache->insert( pixmaps[ widget ], OThemeCache::HorizontalScale, widget );
QImage tmpImg = images[ widget ] ->
smoothScale( w, images[ widget ] ->height() );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->convertFromImage( tmpImg );
if ( blends[ widget ] != 0.0 )
blend( widget );
}
}
}
else if ( scaleHints[ widget ] == VerticalScale ) {
if ( pixmaps[ widget ] ->height() != h ) {
OThemePixmap * cachePix = cache->verticalPixmap( w, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget );
else
odebug << "We would have inserted a null pixmap!" << oendl;
pixmaps[ widget ] = cachePix;
}
else {
cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale, widget );
QImage tmpImg =
images[ widget ] ->smoothScale( images[ widget ] ->width(), h );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->convertFromImage( tmpImg );
if ( blends[ widget ] != 0.0 )
blend( widget );
}
}
}
// If blended tile here so the blend is scaled properly
else if ( scaleHints[ widget ] == TileScale && blends[ widget ] != 0.0 ) {
if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
pixmaps[ widget ] ->height() != h ) {
OThemePixmap * cachePix = cache->pixmap( w, h, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
pixmaps[ widget ] = cachePix;
}
else {
cache->insert( pixmaps[ widget ], OThemeCache::FullScale, widget );
QPixmap tile;
tile.convertFromImage( *images[ widget ] );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->resize( w, h );
QPainter p( pixmaps[ widget ] );
p.drawTiledPixmap( 0, 0, w, h, tile );
if ( blends[ widget ] != 0.0 )
blend( widget );
}
}
}
return ( pixmaps[ widget ] );
}
OThemePixmap* OThemeBase::scaleBorder( int w, int h, WidgetType widget )
{
OThemePixmap * pixmap = NULL;
if ( !pbPixmaps[ widget ] && !pbWidth[ widget ] )
return ( NULL );
pixmap = cache->pixmap( w, h, widget, true );
if ( pixmap ) {
pixmap = new OThemePixmap( *pixmap );
}
else {
pixmap = new OThemePixmap();
pixmap->resize( w, h );
QBitmap mask;
mask.resize( w, h );
mask.fill( color0 );
QPainter mPainter;
mPainter.begin( &mask );
QPixmap *tmp = borderPixmap( widget ) ->border( OThemePixmap::TopLeft );
const QBitmap *srcMask = tmp->mask();
int bdWidth = tmp->width();
bitBlt( pixmap, 0, 0, tmp, 0, 0, bdWidth, bdWidth,
Qt::CopyROP, false );
if ( srcMask )
bitBlt( &mask, 0, 0, srcMask, 0, 0, bdWidth, bdWidth,
Qt::CopyROP, false );
else
mPainter.fillRect( 0, 0, bdWidth, bdWidth, color1 );
tmp = borderPixmap( widget ) ->border( OThemePixmap::TopRight );
srcMask = tmp->mask();
bitBlt( pixmap, w - bdWidth, 0, tmp, 0, 0, bdWidth,
bdWidth, Qt::CopyROP, false );
if ( srcMask )
bitBlt( &mask, w - bdWidth, 0, srcMask, 0, 0, bdWidth,
bdWidth, Qt::CopyROP, false );
else
mPainter.fillRect( w - bdWidth, 0, bdWidth, bdWidth, color1 );
tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomLeft );
srcMask = tmp->mask();
bitBlt( pixmap, 0, h - bdWidth, tmp, 0, 0, bdWidth,
bdWidth, Qt::CopyROP, false );
if ( srcMask )
bitBlt( &mask, 0, h - bdWidth, srcMask, 0, 0, bdWidth,
bdWidth, Qt::CopyROP, false );
else
mPainter.fillRect( 0, h - bdWidth, bdWidth, bdWidth, color1 );
tmp = borderPixmap( widget ) ->border( OThemePixmap::BottomRight );
srcMask = tmp->mask();
bitBlt( pixmap, w - bdWidth, h - bdWidth, tmp, 0, 0,
bdWidth, bdWidth, Qt::CopyROP, false );
if ( srcMask )
bitBlt( &mask, w - bdWidth, h - bdWidth, srcMask, 0, 0,
bdWidth, bdWidth, Qt::CopyROP, false );
else
mPainter.fillRect( w - bdWidth, h - bdWidth, bdWidth, bdWidth, color1 );
QPainter p;
p.begin( pixmap );
if ( w - bdWidth * 2 > 0 ) {
tmp = borderPixmap( widget ) ->border( OThemePixmap::Top );
srcMask = tmp->mask();
p.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *tmp );
if ( srcMask )
mPainter.drawTiledPixmap( bdWidth, 0, w - bdWidth * 2, bdWidth, *srcMask );
else
mPainter.fillRect( bdWidth, 0, w - bdWidth * 2, bdWidth, color1 );
tmp = borderPixmap( widget ) ->border( OThemePixmap::Bottom );
srcMask = tmp->mask();
p.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth,
*tmp );
if ( srcMask )
mPainter.drawTiledPixmap( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth, *srcMask );
else
mPainter.fillRect( bdWidth, h - bdWidth, w - bdWidth * 2, bdWidth,
color1 );
}
if ( h - bdWidth * 2 > 0 ) {
tmp = borderPixmap( widget ) ->border( OThemePixmap::Left );
srcMask = tmp->mask();
p.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *tmp );
if ( srcMask )
mPainter.drawTiledPixmap( 0, bdWidth, bdWidth, h - bdWidth * 2, *srcMask );
else
mPainter.fillRect( 0, bdWidth, bdWidth, h - bdWidth * 2, color1 );
tmp = borderPixmap( widget ) ->border( OThemePixmap::Right );
srcMask = tmp->mask();
p.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2,
*tmp );
if ( srcMask )
mPainter.drawTiledPixmap( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, *srcMask );
else
mPainter.fillRect( w - bdWidth, bdWidth, bdWidth, h - bdWidth * 2, color1 );
}
p.end();
mPainter.end();
pixmap->setMask( mask );
cache->insert( pixmap, OThemeCache::FullScale, widget, true );
if ( !pixmap->mask() )
odebug << "No mask for border pixmap!" << oendl;
}
return ( pixmap );
}
OThemePixmap* OThemeBase::blend( WidgetType widget )
{
OGfxEffect::GradientType g;
switch ( gradients[ widget ] ) {
case GrHorizontal:
g = OGfxEffect::HorizontalGradient;
break;
case GrVertical:
g = OGfxEffect::VerticalGradient;
break;
case GrPyramid:
g = OGfxEffect::PyramidGradient;
break;
case GrRectangle:
g = OGfxEffect::RectangleGradient;
break;
case GrElliptic:
g = OGfxEffect::EllipticGradient;
break;
default:
g = OGfxEffect::DiagonalGradient;
break;
}
OGfxEffect::blend( *pixmaps[ widget ], blends[ widget ], *grLowColors[ widget ],
g, false );
return ( pixmaps[ widget ] );
}
OThemePixmap* OThemeBase::gradient( int w, int h, WidgetType widget )
{
if ( gradients[ widget ] == GrVertical ) {
if ( !pixmaps[ widget ] || pixmaps[ widget ] ->height() != h ) {
OThemePixmap * cachePix = cache->verticalPixmap( h, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale,
widget );
pixmaps[ widget ] = cachePix;
}
else {
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::VerticalScale,
widget );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->resize( w, h );
OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
*grLowColors[ widget ],
OGfxEffect::VerticalGradient );
}
}
}
else if ( gradients[ widget ] == GrHorizontal ) {
if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ) {
OThemePixmap * cachePix = cache->horizontalPixmap( w, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ],
OThemeCache::HorizontalScale, widget );
pixmaps[ widget ] = cachePix;
}
else {
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ],
OThemeCache::HorizontalScale, widget );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->resize( w, h );
OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
*grLowColors[ widget ],
OGfxEffect::HorizontalGradient );
}
}
}
else if ( gradients[ widget ] == GrReverseBevel ) {
if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
pixmaps[ widget ] ->height() != h ) {
OThemePixmap * cachePix = cache->pixmap( w, h, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
widget );
pixmaps[ widget ] = cachePix;
}
else {
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
widget );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->resize( w, h );
QPixmap s;
int offset = decoWidth( widget );
s.resize( w - offset * 2, h - offset * 2 );
QColor lc( *grLowColors[ widget ] );
QColor hc( *grHighColors[ widget ] );
if ( bevelContrast( widget ) ) {
int bc = bevelContrast( widget );
// want single increments, not factors like light()/dark()
lc.setRgb( lc.red() - bc, lc.green() - bc, lc.blue() - bc );
hc.setRgb( hc.red() + bc, hc.green() + bc, hc.blue() + bc );
}
OGfxEffect::gradient( *pixmaps[ widget ],
lc, hc,
OGfxEffect::DiagonalGradient );
OGfxEffect::gradient( s, *grHighColors[ widget ],
*grLowColors[ widget ],
OGfxEffect::DiagonalGradient );
bitBlt( pixmaps[ widget ], offset, offset, &s, 0, 0, w - offset * 2,
h - offset * 2, Qt::CopyROP );
}
}
}
else {
OGfxEffect::GradientType g;
switch ( gradients[ widget ] ) {
case GrPyramid:
g = OGfxEffect::PyramidGradient;
break;
case GrRectangle:
g = OGfxEffect::RectangleGradient;
break;
case GrElliptic:
g = OGfxEffect::EllipticGradient;
break;
default:
g = OGfxEffect::DiagonalGradient;
break;
}
if ( !pixmaps[ widget ] || pixmaps[ widget ] ->width() != w ||
pixmaps[ widget ] ->height() != h ) {
OThemePixmap * cachePix = cache->pixmap( w, h, widget );
if ( cachePix ) {
cachePix = new OThemePixmap( *cachePix );
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
widget );
pixmaps[ widget ] = cachePix;
}
else {
if ( pixmaps[ widget ] )
cache->insert( pixmaps[ widget ], OThemeCache::FullScale,
widget );
pixmaps[ widget ] = new OThemePixmap;
pixmaps[ widget ] ->resize( w, h );
OGfxEffect::gradient( *pixmaps[ widget ], *grHighColors[ widget ],
*grLowColors[ widget ], g );
}
}
}
return ( pixmaps[ widget ] );
}
OThemePixmap* OThemeBase::scalePixmap( int w, int h, WidgetType widget )
{
if ( gradients[ widget ] && blends[ widget ] == 0.0 )
return ( gradient( w, h, widget ) );
return ( scale( w, h, widget ) );
}
QColorGroup* OThemeBase::makeColorGroup( QColor &fg, QColor &bg,
Qt::GUIStyle )
{
if ( shading == Motif ) {
int highlightVal, lowlightVal;
highlightVal = 100 + ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 16 / 10;
lowlightVal = 100 + ( ( 2* /*KGlobalSettings::contrast()*/ 3 + 4 ) * 10 );
return ( new QColorGroup( fg, bg, bg.light( highlightVal ),
bg.dark( lowlightVal ), bg.dark( 120 ),
fg, qApp->palette().normal().base() ) );
}
else
return ( new QColorGroup( fg, bg, bg.light( 150 ), bg.dark(),
bg.dark( 120 ), fg,
qApp->palette().normal().base() ) );
}
static QColor strToColor ( const QString &str )
{
QString str2 = str. stripWhiteSpace ( );
if ( str2 [0] == '#' )
return QColor ( str2 );
else {
QStringList sl = QStringList::split ( ',', str2 );
if ( sl. count ( ) >= 3 )
return QColor ( sl [0]. toInt ( ), sl [1]. toInt ( ), sl [2]. toInt ( ));
}
return QColor ( 0, 0, 0 );
}
void OThemeBase::applyMiscResourceGroup( Config *config )
{
config-> setGroup ( "Misc" );
QString tmpStr;
tmpStr = config->readEntry( "SButtonPosition" );
if ( tmpStr == "BottomLeft" )
sbPlacement = SBBottomLeft;
else if ( tmpStr == "BottomRight" )
sbPlacement = SBBottomRight;
else {
if ( tmpStr != "Opposite" && !tmpStr.isEmpty() )
odebug << "OThemeBase: Unrecognized sb button option " << tmpStr.ascii()
<< ", using Opposite." << oendl;
sbPlacement = SBOpposite;
}
tmpStr = config->readEntry( "ArrowType" );
if ( tmpStr == "Small" )
arrowStyle = SmallArrow;
else if ( tmpStr == "3D" )
arrowStyle = MotifArrow;
else {
if ( tmpStr != "Normal" && !tmpStr.isEmpty() )
odebug << "OThemeBase: Unrecognized arrow option " << tmpStr.ascii()
<< ", using Normal." << oendl;
arrowStyle = LargeArrow;
}
tmpStr = config->readEntry( "ShadeStyle" );
if ( tmpStr == "Motif" )
shading = Motif;
else if ( tmpStr == "Next" )
shading = Next;
else if ( tmpStr == "KDE" )
shading = KDE;
else
shading = Windows;
defaultFrame = config->readNumEntry( "FrameWidth", 2 );
cacheSize = config->readNumEntry( "Cache", 1024 );
sbExtent = config->readNumEntry( "ScrollBarExtent", 16 );
config-> setGroup ( "General" );
if ( config-> hasKey ( "foreground" )) fgcolor = strToColor ( config-> readEntry ( "foreground" ));
if ( config-> hasKey ( "background" )) bgcolor = strToColor ( config-> readEntry ( "background" ));
if ( config-> hasKey ( "selectForeground" )) selfgcolor = strToColor ( config-> readEntry ( "selectForeground" ));
if ( config-> hasKey ( "selectBackground" )) selbgcolor = strToColor ( config-> readEntry ( "selectBackground" ));
if ( config-> hasKey ( "windowForeground" )) winfgcolor = strToColor ( config-> readEntry ( "windowForeground" ));
if ( config-> hasKey ( "windowBackground" )) winbgcolor = strToColor ( config-> readEntry ( "windowBackground" ));
}
void OThemeBase::readMiscResourceGroup()
{}
void OThemeBase::applyResourceGroup( Config *config, int i, QString *copyfrom, QString *pixnames, QString *brdnames )
{
QString tmpStr;
config-> setGroup ( widgetEntries [ i ] );
tmpStr = config->readEntry( "CopyWidget", "" );
copyfrom [ i ] = tmpStr;
if ( !tmpStr.isEmpty() )
return ;
// Scale hint
tmpStr = config->readEntry( "Scale" );
if ( tmpStr == "Full" )
scaleHints [ i ] = FullScale;
else if ( tmpStr == "Horizontal" )
scaleHints [ i ] = HorizontalScale;
else if ( tmpStr == "Vertical" )
scaleHints [ i ] = VerticalScale;
else {
if ( tmpStr != "Tile" && !tmpStr.isEmpty() )
odebug << "OThemeBase: Unrecognized scale option " << tmpStr.ascii()
<< ", using Tile." << oendl;
scaleHints [ i ] = TileScale;
}
// Gradient type
tmpStr = config->readEntry( "Gradient" );
if ( tmpStr == "Diagonal" )
gradients [ i ] = GrDiagonal;
else if ( tmpStr == "Horizontal" )
gradients [ i ] = GrHorizontal;
else if ( tmpStr == "Vertical" )
gradients [ i ] = GrVertical;
else if ( tmpStr == "Pyramid" )
gradients [ i ] = GrPyramid;
else if ( tmpStr == "Rectangle" )
gradients [ i ] = GrRectangle;
else if ( tmpStr == "Elliptic" )
gradients [ i ] = GrElliptic;
else if ( tmpStr == "ReverseBevel" )
gradients [ i ] = GrReverseBevel;
else {
if ( tmpStr != "None" && !tmpStr.isEmpty() )
odebug << "OThemeBase: Unrecognized gradient option " << tmpStr.ascii()
<< ", using None." << oendl;
gradients [ i ] = GrNone;
}
// Blend intensity
blends[ i ] = config->readEntry( "BlendIntensity", "0.0" ).toDouble();
// Bevel contrast
bContrasts[ i ] = config->readNumEntry( "BevelContrast", 0 );
// Border width
borders [ i ] = config->readNumEntry( "Border", 1 );
// Highlight width
highlights [ i ] = config->readNumEntry( "Highlight", 1 );
// Gradient low color or blend background
if ( config->hasKey( "GradientLow" ) && ( gradients[ i ] != GrNone || blends[ i ] != 0.0 ))
grLowColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientLow", qApp->palette().normal().background().name() )));
else
grLowColors[ i ] = NULL;
// Gradient high color
if ( config->hasKey( "GradientHigh" ) && ( gradients[ i ] != GrNone ))
grHighColors[ i ] = new QColor( strToColor ( config->readEntry( "GradientHigh", qApp->palette().normal().background().name() )));
else
grHighColors[ i ] = NULL;
// Extended color attributes
if ( config->hasKey( "Foreground" ) || config->hasKey( "Background" ) ) {
QColor bg = strToColor( config->readEntry( "Background", qApp->palette().normal().background().name() ));
QColor fg = strToColor( config->readEntry( "Foreground", qApp->palette().normal().foreground().name() ));
colors[ i ] = makeColorGroup( fg, bg, Qt::WindowsStyle );
}
else
colors[ i ] = NULL;
// Pixmap
tmpStr = config->readEntry( "Pixmap", "" );
pixnames[ i ] = tmpStr;
duplicate[ i ] = false;
pixmaps[ i ] = NULL;
images[ i ] = NULL;
// Pixmap border
tmpStr = config->readEntry( "PixmapBorder", "" );
brdnames[ i ] = tmpStr;
pbDuplicate[ i ] = false;
pbPixmaps[ i ] = NULL;
pbWidth[ i ] = 0;
if ( !tmpStr.isEmpty() ) {
pbWidth[ i ] = config->readNumEntry( "PixmapBWidth", 0 );
if ( pbWidth[ i ] == 0 ) {
odebug << "OThemeBase: No border width specified for pixmapped border widget "
<< widgetEntries[ i ] << oendl;
odebug << "OThemeBase: Using default of 2." << oendl;
pbWidth[ i ] = 2;
}
}
// Various widget specific settings. This was more efficent when bunched
// together in the misc group, but this makes an easier to read config.
if ( i == SliderGroove )
roundedSlider = config->readBoolEntry( "SmallGroove", false );
else if ( i == ActiveTab ) {
aTabLine = config->readBoolEntry( "BottomLine", true );
}
else if ( i == InactiveTab ) {
iTabLine = config->readBoolEntry( "BottomLine", true );
}
else if ( i == Splitter )
splitterWidth = config->readNumEntry( "Width", 10 );
else if ( i == ComboBox || i == ComboBoxDown ) {
roundedCombo = config->readBoolEntry( "Round", false );
}
else if ( i == PushButton || i == PushButtonDown ) {
btnXShift = config->readNumEntry( "XShift", 0 );
btnYShift = config->readNumEntry( "YShift", 0 );
focus3D = config->readBoolEntry( "3DFocusRect", false );
focus3DOffset = config->readBoolEntry( "3DFocusOffset", 0 );
roundedButton = config->readBoolEntry( "Round", false );
}
}
void OThemeBase::readResourceGroup( int i, QString *copyfrom, QString *pixnames, QString *brdnames,
bool *loadArray )
{
if ( loadArray[ i ] == true ) {
return ; // already been preloaded.
}
int tmpVal;
QString tmpStr;
tmpStr = copyfrom [ i ];
if ( !tmpStr.isEmpty() ) { // Duplicate another widget's config
int sIndex;
loadArray[ i ] = true;
for ( sIndex = 0; sIndex < WIDGETS; ++sIndex ) {
if ( tmpStr == widgetEntries[ sIndex ] ) {
if ( !loadArray[ sIndex ] ) // hasn't been loaded yet
readResourceGroup( sIndex, copyfrom, pixnames, brdnames,
loadArray );
break;
}
}
if ( loadArray[ sIndex ] ) {
copyWidgetConfig( sIndex, i, pixnames, brdnames );
}
else
odebug << "OThemeBase: Unable to identify source widget for " << widgetEntries[ i ] << oendl;
return ;
}
// special inheritance for disabled arrows (these are tri-state unlike
// the rest of what we handle).
for ( tmpVal = DisArrowUp; tmpVal <= DisArrowRight; ++tmpVal ) {
if ( tmpVal == i ) {
tmpStr = pixnames [ i ];
if ( tmpStr.isEmpty() ) {
copyWidgetConfig( ArrowUp + ( tmpVal - DisArrowUp ), i, pixnames,
brdnames );
return ;
}
}
}
// Pixmap
int existing;
// Scan for duplicate pixmaps(two identical pixmaps, tile scale, no blend,
// no pixmapped border)
if ( !pixnames [ i ].isEmpty() ) {
for ( existing = 0; existing < i; ++existing ) {
if ( pixnames[ i ] == pixnames[ existing ] && scaleHints[ i ] == TileScale &&
scaleHints[ existing ] == TileScale && blends[ existing ] == 0.0 &&
blends[ i ] == 0.0 ) {
pixmaps[ i ] = pixmaps[ existing ];
duplicate[ i ] = true;
break;
}
}
}
// load
if ( !duplicate[ i ] && !pixnames[ i ].isEmpty() ) {
pixmaps[ i ] = loadPixmap( pixnames[ i ] );
// load and save images for scaled/blended widgets for speed.
if ( scaleHints[ i ] == TileScale && blends[ i ] == 0.0 )
images[ i ] = NULL;
else
images[ i ] = loadImage( pixnames[ i ] );
}
// Pixmap border
if ( !brdnames [ i ]. isEmpty () ) {
// duplicate check
for ( existing = 0; existing < i; ++existing ) {
if ( brdnames [i] == brdnames[ existing ] ) {
pbPixmaps[ i ] = pbPixmaps[ existing ];
pbDuplicate[ i ] = true;
break;
}
}
}
// load
if ( !pbDuplicate[ i ] && !brdnames[ i ].isEmpty() )
pbPixmaps[ i ] = loadPixmap( brdnames[ i ] );
if ( pbPixmaps[ i ] && !pbDuplicate[ i ] )
generateBorderPix( i );
loadArray[ i ] = true;
}
OThemePixmap::OThemePixmap( bool timer )
: QPixmap()
{
if(timer){
t = new QTime;
t->start();
}
else
t = NULL;
int i;
for ( i = 0; i < 8; ++i )
b[ i ] = NULL;
}
OThemePixmap::OThemePixmap( const OThemePixmap &p )
: QPixmap( p )
{
if(p.t){
t = new QTime;
t->start();
}
else
t = NULL;
int i;
for ( i = 0; i < 8; ++i )
if ( p.b[ i ] )
b[ i ] = new QPixmap( *p.b[ i ] );
else
b[ i ] = NULL;
}
OThemePixmap::~OThemePixmap()
{
if(t)
delete t;
int i;
for ( i = 0; i < 8; ++i )
if ( b[ i ] )
delete b[ i ];
}
OThemeCache::OThemeCache( int maxSize, QObject *parent, const char *name )
: QObject( parent, name )
{
cache.setMaxCost( maxSize * 1024 );
cache.setAutoDelete( true );
flushTimer.start(300000); // 5 minutes
connect(&flushTimer, SIGNAL(timeout()), SLOT(flushTimeout()));
}
void OThemeCache::flushTimeout()
{
QIntCacheIterator<OThemePixmap> it( cache );
while ( it.current() ) {
if ( it.current() ->isOld() )
cache.remove( it.currentKey() );
else
++it;
}
}
OThemePixmap* OThemeCache::pixmap( int w, int h, int widgetID, bool border,
bool mask )
{
kthemeKey key;
key.cacheKey = 0; // shut up, gcc
key.data.id = widgetID;
key.data.width = w;
key.data.height = h;
key.data.border = border;
key.data.mask = mask;
OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
if ( pix )
pix->updateAccessed();
return ( pix );
}
OThemePixmap* OThemeCache::horizontalPixmap( int w, int widgetID )
{
kthemeKey key;
key.cacheKey = 0; // shut up, gcc
key.data.id = widgetID;
key.data.width = w;
key.data.height = 0;
key.data.border = false;
key.data.mask = false;
OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
if ( pix )
pix->updateAccessed();
return ( pix );
}
OThemePixmap* OThemeCache::verticalPixmap( int h, int widgetID )
{
kthemeKey key;
key.cacheKey = 0; // shut up, gcc
key.data.id = widgetID;
key.data.width = 0;
key.data.height = h;
key.data.border = false;
key.data.mask = false;
OThemePixmap *pix = cache.find( ( unsigned long ) key.cacheKey );
if ( pix )
pix->updateAccessed();
return ( pix );
}
bool OThemeCache::insert( OThemePixmap *pixmap, ScaleHint scale, int widgetID,
bool border, bool mask )
{
kthemeKey key;
key.cacheKey = 0; // shut up, gcc
key.data.id = widgetID;
key.data.width = ( scale == FullScale || scale == HorizontalScale ) ?
pixmap->width() : 0;
key.data.height = ( scale == FullScale || scale == VerticalScale ) ?
pixmap->height() : 0;
key.data.border = border;
key.data.mask = mask;
if ( cache.find( ( unsigned long ) key.cacheKey, true ) != NULL ) {
return ( true ); // a pixmap of this scale is already in there
}
return ( cache.insert( ( unsigned long ) key.cacheKey, pixmap,
pixmap->width() * pixmap->height() * pixmap->depth() / 8 ) );
}
//#include "kthemebase.moc"
diff --git a/noncore/styles/theme/themeset.cpp b/noncore/styles/theme/themeset.cpp
index d4005bc..3205106 100644
--- a/noncore/styles/theme/themeset.cpp
+++ b/noncore/styles/theme/themeset.cpp
@@ -1,124 +1,124 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "themeset.h"
#include <qpe/qpeapplication.h>
#include <qpe/global.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlistview.h>
#include <qdir.h>
#include <qpe/config.h>
class MyConfig : public Config
{
public:
MyConfig ( const QString &f, Domain d ) : Config ( f, d )
{ }
bool hasGroup ( const QString &gname ) const
{
QMap< QString, ConfigGroup>::ConstIterator it = groups. find ( gname );
return ( it != groups.end() );
}
};
class MyItem : public QListViewItem
{
public:
MyItem ( QListView *lv, QListViewItem *after, const QString &name, const QString &comm, const QString &theme ) : QListViewItem ( lv, after, name, comm )
{
m_theme = theme;
}
QString m_theme;
};
ThemeSettings::ThemeSettings ( QWidget* parent, const char *name, WFlags fl )
: QWidget ( parent, name, fl )
{
setCaption ( tr( "Theme Style" ) );
Config config ( "qpe" );
config. setGroup ( "Appearance" );
QString active = config. readEntry ( "Theme", "default" );
QVBoxLayout *vbox = new QVBoxLayout ( this );
vbox-> setSpacing ( 3 );
vbox-> setMargin ( 6 );
vbox-> addWidget ( new QLabel ( tr( "Select the theme to be used" ), this ));
m_list = new QListView ( this );
m_list-> addColumn ( tr( "Name" ));
m_list-> addColumn ( tr( "Description" ));
m_list-> setSelectionMode ( QListView::Single );
m_list-> setAllColumnsShowFocus ( true );
m_list-> setSorting ( -1 );
vbox-> addWidget ( m_list, 10 );
QListViewItem *item = new MyItem ( m_list, 0, tr( "[No theme]" ), "", "" );
m_list-> setSelected ( item, true );
- QString path = QPEApplication::qpeDir() + "/plugins/styles/themes";
+ QString path = QPEApplication::qpeDir() + "plugins/styles/themes";
QStringList list = QDir ( path, "*.themerc" ). entryList ( );
for ( QStringList::Iterator it = list. begin(); it != list. end ( ); ++it ) {
MyConfig cfg ( path + "/" + *it, Config::File );
if ( cfg. hasGroup ( "Misc" )) {
cfg. setGroup ( "Misc" );
QString name = cfg. readEntry ( "Name" );
QString comm = cfg. readEntry ( "Comment" );
if ( !name. isEmpty ( )) {
QString fname = (*it). left ((*it). length ( ) - 8 );
item = new MyItem ( m_list, item, name, comm, fname );
if ( active == fname ) {
m_list-> setSelected ( item, true );
}
}
}
}
}
bool ThemeSettings::writeConfig ( )
{
Config config ( "qpe" );
config. setGroup ( "Appearance" );
MyItem *it = (MyItem *) m_list-> selectedItem ( );
config. writeEntry ( "Theme", it ? it-> m_theme : QString ( "" ));
config. write ( );
return true;
}
diff --git a/noncore/tools/calc2/calc.cpp b/noncore/tools/calc2/calc.cpp
index 3dcdf6e..c7656bf 100644
--- a/noncore/tools/calc2/calc.cpp
+++ b/noncore/tools/calc2/calc.cpp
@@ -1,104 +1,104 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include <qvaluelist.h>
#include <qpe/qpeapplication.h>
#include <qdir.h>
#include <qwidgetstack.h>
#include "calc.h"
#include "plugininterface.h"
calc::calc (QWidget * p, const char *n):QWidget (p, n)
{
setCaption (tr ("Calculator"));
// widgets
LCD = new QLCDNumber (this);
LCD->setMaximumSize (QSize (240, 30));
LCD->setNumDigits(12);
LCD->setSegmentStyle(QLCDNumber::Filled);
pluginWidgetStack = new QWidgetStack (this);
// layout widgets
calculatorLayout = new QVBoxLayout (this);
calculatorLayout->addWidget (LCD);
calculatorLayout->addWidget (pluginWidgetStack);
// no formatting of display for now
connect (&engine, SIGNAL(display(double)), LCD, SLOT(display(double)));
connect (&engine, SIGNAL(display(const QString&)), LCD, SLOT(display(const QString&)));
connect (&engine, SIGNAL(setBinMode()), LCD, SLOT(setBinMode()));
connect (&engine, SIGNAL(setOctMode()), LCD, SLOT(setOctMode()));
connect (&engine, SIGNAL(setDecMode()), LCD, SLOT(setDecMode()));
connect (&engine, SIGNAL(setHexMode()), LCD, SLOT(setHexMode()));
#ifndef NO_PLUGINS
// load plugins
QValueList < Plugin >::Iterator mit;
for (mit = pluginList.begin (); mit != pluginList.end (); ++mit) {
(*mit).interface->release ();
(*mit).library->unload ();
delete (*mit).library;
}
pluginList.clear ();
- QString path = QPEApplication::qpeDir() + "/plugins/calculator";
+ QString path = QPEApplication::qpeDir() + "plugins/calculator";
QDir dir (path, "lib*.so");
QStringList list = dir.entryList ();
QStringList::Iterator it;
for (it = list.begin (); it != list.end (); ++it) {
CalcInterface *iface = 0;
QLibrary *lib = new QLibrary (path + "/" + *it);
Plugin plugin;
plugin.pluginWidget = 0;
if (lib->queryInterface (IID_Calc, (QUnknownInterface **) & iface) ==
QS_OK) {
plugin.library = lib;
plugin.interface = iface;
plugin.pluginWidget = plugin.interface->getPlugin(&engine,pluginWidgetStack);
if (plugin.pluginWidget)
pluginWidgetStack->addWidget (plugin.pluginWidget, pluginList.count());
pluginList.append (plugin);
} else {
delete lib;
}
}
setMode (1);
#else
// load simple interface
#endif
}
calc::~calc ()
{
#ifndef NO_PLUGINS
QValueList < Plugin >::Iterator mit;
for (mit = pluginList.begin (); mit != pluginList.end (); ++mit) {
(*mit).interface->release ();
(*mit).library->unload ();
delete (*mit).library;
}
#endif
}
diff --git a/x11/libqpe-x11/qpe/qpeapplication.cpp b/x11/libqpe-x11/qpe/qpeapplication.cpp
index 3cb8faf..73e7ce4 100644
--- a/x11/libqpe-x11/qpe/qpeapplication.cpp
+++ b/x11/libqpe-x11/qpe/qpeapplication.cpp
@@ -1,796 +1,796 @@
#define QTOPIA_INTERNAL_LANGLIST
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <qdir.h>
#include <qdialog.h>
#include <qdragobject.h>
#include <qevent.h>
#include <qlabel.h>
#include <qlist.h>
#include <qtextstream.h>
#include <qtextcodec.h>
#include <qpalette.h>
#include <qptrdict.h>
#include <qregexp.h>
#include <qtimer.h>
#include <qpe/custom.h>
#include <qpe/alarmserver.h>
#include <qpe/applnk.h>
#include <qpe/qpemenubar.h>
#include <qpe/textcodecinterface.h>
#include <qpe/imagecodecinterface.h>
#include <qpe/qlibrary.h>
#include <qpe/qpestyle.h>
#include <qpe/styleinterface.h>
#include <qpe/global.h>
#include <qpe/resource.h>
#include <qpe/config.h>
#include <qpe/network.h>
#include <qpe/qpeapplication.h>
#include <qpe/timestring.h>
#include <qpe/qcopenvelope_qws.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
const int XKeyPress = KeyPress;
const int XKeyRelease = KeyRelease;
#undef KeyPress
#undef KeyRelease
namespace {
struct QCopRec{
QCopRec( const QCString& ch, const QCString& msg, const QByteArray& ar )
: channel(ch), message(msg), data(ar) {
}
QCString channel;
QCString message;
QByteArray data;
};
};
class QPEApplication::Private {
public:
Private();
~Private();
void enqueueQCop( const QCString& ch, const QCString& msg,
const QByteArray& );
void sendQCopQ();
static void show_mx(QWidget* mw, bool nomaximize );
void show( QWidget* mw, bool nomax );
void loadTextCodecs();
void loadImageCodecs();
int kbgrabber;
int presstimer;
bool rightpressed : 1;
bool kbregrab : 1;
bool notbusysent : 1;
bool preloaded : 1;
bool forceshow : 1;
bool nomaximize : 1;
bool keep_running : 1;
QWidget* presswidget;
QPoint presspos;
QWidget* qpe_main_widget;
QString appName;
QString styleName;
QString decorationName;
Atom wm_delete_window;
Atom wm_take_focus;
Atom wm_context_help;
Atom wm_context_accept;
Atom wm_protocols;
private:
QList<QCopRec> qcopq;
};
QPEApplication::Private::~Private() {
}
QPEApplication::Private::Private()
: kbgrabber(0 ), presstimer(0 ), rightpressed( FALSE ), kbregrab( FALSE ), notbusysent( FALSE ),
preloaded( FALSE ), forceshow( FALSE ), nomaximize( FALSE ), keep_running( TRUE ),
presswidget( 0 ), qpe_main_widget(0 ) {
qcopq.setAutoDelete( TRUE );
}
void QPEApplication::Private::enqueueQCop( const QCString& chan, const QCString& msg,
const QByteArray& ar ) {
qcopq.append( new QCopRec(chan, msg, ar ) );
}
void QPEApplication::Private::sendQCopQ() {
QCopRec* r;
for ( r = qcopq.first(); r; r = qcopq.next() ) {
QCopChannel::sendLocally( r->channel, r->message, r->data );
}
qcopq.clear();
}
void QPEApplication::Private::show_mx(QWidget* mw, bool nomaximize ) {
if (mw->layout() && mw->inherits("QDialog") ) {
QPEApplication::showDialog( (QDialog*)mw, nomaximize );
}else {
if (!nomaximize )
mw->showMaximized();
else
mw->show();
}
}
void QPEApplication::Private::show( QWidget* mw, bool nomax ) {
nomaximize = nomax;
qpe_main_widget = mw;
sendQCopQ();
if ( preloaded ) {
if (forceshow )
show_mx(mw, nomax );
}else if ( keep_running )
show_mx( mw, nomax );
}
void QPEApplication::Private::loadTextCodecs() {
- QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
+ QString path = QPEApplication::qpeDir() + "plugins/textcodecs";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
TextCodecInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if ( lib->queryInterface( IID_QtopiaTextCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
QValueList<int> mibs = iface->mibEnums();
for (QValueList<int>::ConstIterator i = mibs.begin(); i != mibs.end(); ++i) {
(void)iface->createForMib(*i);
// ### it exists now; need to remember if we can delete it
}
}
else {
lib->unload();
delete lib;
}
}
}
void QPEApplication::Private::loadImageCodecs() {
- QString path = QPEApplication::qpeDir() + "/plugins/imagecodecs";
+ QString path = QPEApplication::qpeDir() + "plugins/imagecodecs";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); ++it ) {
ImageCodecInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
if ( lib->queryInterface( IID_QtopiaImageCodec, (QUnknownInterface**)&iface ) == QS_OK && iface ) {
QStringList formats = iface->keys();
for (QStringList::ConstIterator i = formats.begin(); i != formats.end(); ++i) {
(void)iface->installIOHandler(*i);
// ### it exists now; need to remember if we can delete it
}
}
else {
lib->unload();
delete lib;
}
}
}
// The Help System hook
namespace {
class ResourceMimeFactory : public QMimeSourceFactory
{
public:
ResourceMimeFactory();
~ResourceMimeFactory();
const QMimeSource* data( const QString& abs_name )const;
};
ResourceMimeFactory::ResourceMimeFactory()
{
setFilePath( Global::helpPath() );
setExtensionType( "html", "text/html;charset=UTF-8" );
}
ResourceMimeFactory::~ResourceMimeFactory() {
}
const QMimeSource* ResourceMimeFactory::data( const QString& abs_name ) const
{
const QMimeSource * r = QMimeSourceFactory::data( abs_name );
if ( !r ) {
int sl = abs_name.length();
do {
sl = abs_name.findRev( '/', sl - 1 );
QString name = sl >= 0 ? abs_name.mid( sl + 1 ) : abs_name;
int dot = name.findRev( '.' );
if ( dot >= 0 )
name = name.left( dot );
QImage img = Resource::loadImage( name );
if ( !img.isNull() )
r = new QImageDrag( img );
}
while ( !r && sl > 0 );
}
return r;
};
};
// QPEApplication
QPEApplication::~QPEApplication() {
qWarning("~QPEApplication");
ungrabKeyboard();
qWarning("UngrabKeyboard");
// delete m_sys;
// delete m_pid;
delete d;
}
QPEApplication::QPEApplication(int &arg, char** argv, Type t)
: QApplication( arg, argv, t ) {
d = new Private;
d->loadTextCodecs();
d->loadImageCodecs();
// Init X-Atom
Atom *atoms[5];
Atom atoms_re[5];
char* names[5];
int n = 0;
atoms[n] = &d->wm_delete_window;
names[n++] = "WM_DELETE_WINDOW";
atoms[n] = &d->wm_take_focus;
names[n++] = "WM_TAKE_FOCUS";
atoms[n] = &d->wm_context_help;
names[n++] = "_NET_WM_CONTEXT_HELP";
atoms[n] = &d->wm_context_accept;
names[n++] = "_NET_WM_CONTEXT_ACCEPT";
atoms[n] = &d->wm_protocols;
names[n++] = "WM_PROTOCOLS";
XInternAtoms( qt_xdisplay(), names, n, FALSE, atoms_re);
// now copy the values over to the properties
for (int i = 0; i < n; i++ )
*atoms[i] = atoms_re[i];
// done with X11 Stuff
int dw = desktop()->width();
if ( dw < 200 ) {
setFont( QFont( "helvetica", 8 ) );
AppLnk::setSmallIconSize( 10 );
AppLnk::setBigIconSize( 28 );
}else if ( dw > 600 ) {
setFont( QFont( "helvetica", 12 ) );
AppLnk::setSmallIconSize( 24 );
AppLnk::setBigIconSize( 48 );
}else if ( dw > 200 ) {
setFont( QFont( "helvetica", 10 ) );
AppLnk::setSmallIconSize( 16 );
AppLnk::setBigIconSize( 32 );
}
QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory );
connect( this, SIGNAL( lastWindowClosed() ), this, SLOT(hideOrQuit() ) );
QString qcopfn( "/tmp/qcop-msg-" );
qcopfn += QString( argv[0] ); // append command name to the QCOP name
QFile file( qcopfn );
if (file.open(IO_ReadOnly ) ) {
flock( file.handle(), LOCK_EX );
}
/* Hmmm damn we need to make the parent 0l otherwise it get's deleted
* past the QApplication
*/
m_sys = new QCopChannel( "QPE/System", 0l);
connect(m_sys, SIGNAL( received(const QCString&,const QByteArray&) ),
this, SLOT(systemMessage(const QCString&,const QByteArray&) ) );
// private channel QPE/Application/appname
QCString channel = QCString( argv[0] );
channel.replace( QRegExp( ".*/"), "" );
d->appName = channel;
channel = "QPE/Application/"+ channel;
m_pid = new QCopChannel( channel, 0l );
connect(m_pid, SIGNAL( received(const QCString&,const QByteArray&) ),
this, SLOT( pidMessage(const QCString&,const QByteArray&) ) );
// read the Pre QCOP Stuff from the file
if ( file.isOpen() ) {
d->keep_running = FALSE;
QDataStream ds( &file );
QCString chanel, message;
QByteArray data;
while (!ds.atEnd() ) {
ds >> chanel >> message >> data;
d->enqueueQCop( chanel, message, data );
}
flock( file.handle(), LOCK_UN );
file.close();
file.remove();
}
// read in some stuff from the command line
// we do not have setArgs so we need to take
// care of that
for ( int a = 0; a < arg; a++ ) {
if ( qstrcmp( argv[a], "-preload" ) == 0 ) {
d->preloaded = TRUE;
}else if ( qstrcmp( argv[a ] , "-preload-show" ) == 0 ) {
d->preloaded = TRUE;
d->forceshow = TRUE;
}
}
initTranslations();
applyStyle();
if ( type() == GuiServer )
;
installEventFilter( this );
QPEMenuToolFocusManager::initialize();
}
void QPEApplication::initTranslations() {
// Translations add it
QStringList langs = Global::languageList();
for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) {
QString lang = *it;
QTranslator * trans;
QString tfn;
trans = new QTranslator( this );
tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm";
if ( trans->load( tfn ) )
installTranslator( trans );
else
delete trans;
trans = new QTranslator( this );
tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm";
if ( trans->load( tfn ) )
installTranslator( trans );
else
delete trans;
}
}
QString QPEApplication::qpeDir() {
const char * base = getenv( "OPIEDIR" );
if ( base )
return QString( base ) + "/";
return QString( "../" );
}
QString QPEApplication::documentDir() {
const char* base = getenv( "HOME");
if ( base )
return QString( base ) + "/Documents";
return QString( "../Documents" );
}
void QPEApplication::applyStyle() {
Config config( "qpe" );
config.setGroup( "Appearance" );
// Widget style
QString style = config.readEntry( "Style", "Light" );
internalSetStyle( style );
// Colors
QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) );
QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) );
QPalette pal( btncolor, bgcolor );
QString color = config.readEntry( "Highlight", "#800000" );
pal.setColor( QColorGroup::Highlight, QColor( color ) );
color = config.readEntry( "HighlightedText", "#FFFFFF" );
pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
color = config.readEntry( "Text", "#000000" );
pal.setColor( QColorGroup::Text, QColor( color ) );
color = config.readEntry( "ButtonText", "#000000" );
pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
color = config.readEntry( "Base", "#FFFFFF" );
pal.setColor( QColorGroup::Base, QColor( color ) );
pal.setColor( QPalette::Disabled, QColorGroup::Text,
pal.color( QPalette::Active, QColorGroup::Background ).dark() );
setPalette( pal, TRUE );
// Font
QString ff = config.readEntry( "FontFamily", font().family() );
int fs = config.readNumEntry( "FontSize", font().pointSize() );
setFont( QFont(ff, fs) );
}
int QPEApplication::defaultRotation() {
return 0;
}
void QPEApplication::setDefaultRotation(int r ) {
}
void QPEApplication::grabKeyboard() {
QPEApplication::Private * d = ( ( QPEApplication* ) qApp ) ->d;
if ( qApp->type() == QApplication::GuiServer )
d->kbgrabber = 0;
else {
QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
e << d->appName;
d->kbgrabber = 2; // me
}
}
void QPEApplication::ungrabKeyboard() {
QPEApplication::Private * d = ( ( QPEApplication* ) qApp ) ->d;
if ( d->kbgrabber == 2 ) {
QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
e << QString::null;
d->kbregrab = FALSE;
d->kbgrabber = 0;
}
}
void QPEApplication::showMainWidget( QWidget* wid, bool b) {
d->show(wid, b );
}
void QPEApplication::showMainDocumentWidget( QWidget* mw, bool m) {
if ( mw && argc() == 2 )
Global::setDocument( mw, QString::fromUtf8(argv()[1] ) );
d->show(mw, m );
}
void QPEApplication::showDialog( QDialog* d, bool nomax ) {
QSize sh = d->sizeHint();
int w = QMAX(sh.width(),d->width());
int h = QMAX(sh.height(),d->height());
if ( !nomax
&& ( w > qApp->desktop()->width()*3/4
|| h > qApp->desktop()->height()*3/4 ) )
{
d->showMaximized();
} else {
d->resize(w,h);
d->show();
}
}
int QPEApplication::execDialog( QDialog* d, bool nomax) {
showDialog(d,nomax);
return d->exec();
}
void QPEApplication::setKeepRunning() {
if ( qApp && qApp->inherits( "QPEApplication" ) ) {
QPEApplication * qpeApp = ( QPEApplication* ) qApp;
qpeApp->d->keep_running = TRUE;
}
}
bool QPEApplication::keepRunning()const {
return d->keep_running;
}
bool QPEApplication::keyboardGrabbed()const {
return d->kbgrabber;
}
int QPEApplication::exec() {
/* now send the QCOP stuff gotten from the file */
d->sendQCopQ();
if ( d->keep_running ) {
qWarning("going to exec");
int a = QApplication::exec();
qWarning("left");
return a;
}
{
QCopEnvelope e( "QPE/System", "closing(QString)" );
e << d->appName;
}
qWarning("processing events!");
processEvents();
return 0;
}
void QPEApplication::internalSetStyle( const QString& ) {
}
void QPEApplication::systemMessage( const QCString& chan, const QByteArray& ) {
qWarning("QPEApplication::systemMessage( %s )", chan.data() );
}
void QPEApplication::pidMessage( const QCString& msg, const QByteArray& ) {
if ( msg == "flush()" ) {
emit flush();
QCopEnvelope e( "QPE/Desktop", "flushDone(QString)" );
e << d->appName;
}else if ( msg == "reload()" ) {
emit reload();
}
}
void QPEApplication::timerEvent( QTimerEvent* e ) {
if ( e->timerId() == d->presstimer && d->presswidget ) {
// Right pressed
postEvent( d->presswidget,
new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
RightButton, LeftButton ) );
killTimer( d->presstimer );
d->presstimer = 0;
}
}
// InputMethods Hints
namespace {
static QPtrDict<void>* inputMethodDict = 0;
static void createInputMethodDict(){
if ( !inputMethodDict )
inputMethodDict = new QPtrDict<void>;
}
static QPtrDict<void>* stylusDict = 0;
static void createDict() {
if ( !stylusDict )
stylusDict = new QPtrDict<void>;
}
};
void QPEApplication::setInputMethodHint( QWidget* w, InputMethodHint mode ) {
createInputMethodDict();
if ( mode == Normal ) {
inputMethodDict->remove
( w );
}else {
inputMethodDict->insert( w, ( void* ) mode );
}
}
QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget* w) {
if ( inputMethodDict && w )
return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
return Normal;
}
void QPEApplication::removeSenderFromStylusDict() {
stylusDict->remove( ( void* ) sender() );
if ( d->presswidget == sender() )
d->presswidget = 0;
}
void QPEApplication::setStylusOperation( QWidget* w, StylusMode mode) {
createDict();
if ( mode == LeftOnly ) {
stylusDict->remove
( w );
w->removeEventFilter( qApp );
}else {
stylusDict->insert( w, ( void* ) mode );
connect( w, SIGNAL( destroyed() ), qApp, SLOT( removeSenderFromStylusDict() ) );
w->installEventFilter( qApp );
}
}
QPEApplication::StylusMode QPEApplication::stylusOperation( QWidget* w) {
if ( stylusDict )
return ( StylusMode ) ( int ) stylusDict->find( w );
return LeftOnly;
}
// eventFilter......
bool QPEApplication::eventFilter( QObject* o, QEvent* e ) {
/*
* We want our WM to show Ok and a X button
* on dialogs
* our part is to set the _NET_WM_CONTEXT_ACCEPT
* propery
* and then wait for a client message -zecke
* on show we will add the prop
*/
if (o->inherits("QDialog") && e->type() == QEvent::Show ) {
QDialog* dialog = (QDialog*)o;
Atom wm_prot[45];
int n = 0;
wm_prot[n++] = d->wm_delete_window;
wm_prot[n++] = d->wm_take_focus;
wm_prot[n++] = d->wm_context_accept;
if ( dialog->testWFlags( WStyle_ContextHelp ) )
wm_prot[n++] = d->wm_context_help;
XSetWMProtocols( qt_xdisplay(), dialog->winId(), wm_prot, n );
return TRUE; // should be save
}
if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
QMouseEvent * me = ( QMouseEvent* ) e;
StylusMode mode = (StylusMode)(int)stylusDict->find(o);
switch (mode) {
case RightOnHold:
switch ( me->type() ) {
case QEvent::MouseButtonPress:
if ( me->button() == LeftButton ) {
d->presstimer = startTimer(500); // #### pref.
d->presswidget = (QWidget*)o;
d->presspos = me->pos();
d->rightpressed = FALSE;
}
break;
case QEvent::MouseMove:
if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
killTimer(d->presstimer);
d->presstimer = 0;
}
break;
case QEvent::MouseButtonRelease:
if ( me->button() == LeftButton ) {
if ( d->presstimer ) {
killTimer(d->presstimer);
d->presstimer = 0;
}
if ( d->rightpressed && d->presswidget ) {
// Right released
postEvent( d->presswidget,
new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
RightButton, LeftButton + RightButton ) );
// Left released, off-widget
postEvent( d->presswidget,
new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
LeftButton, LeftButton ) );
postEvent( d->presswidget,
new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
LeftButton, LeftButton ) );
d->rightpressed = FALSE;
return TRUE; // don't send the real Left release
}
}
break;
default:
break;
}
break;
default:
;
}
}
else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
QKeyEvent *ke = (QKeyEvent *)e;
if ( ke->key() == Key_Enter ) {
if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
return TRUE;
}
}
}
return FALSE;
}
// Quit stuff
void QPEApplication::restart() {
}
void QPEApplication::shutdown() {
}
void QPEApplication::tryQuit() {
qWarning("TryQuit!!");
if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
return ; // Inside modal loop or konsole. Too hard to save state.
{
QCopEnvelope e( "QPE/System", "closing(QString)" );
e << d->appName;
}
processEvents();
quit();
}
void QPEApplication::hideOrQuit() {
qWarning("hide or close");
processEvents();
qWarning("past processing");
// If we are a preloaded application we don't actually quit, so emit
// a System message indicating we're quasi-closing.
if ( d->preloaded && d->qpe_main_widget )
{
qWarning("hiding");
QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
e << d->appName;
d->qpe_main_widget->hide();
}
else
quit();
}
/*!
\internal
*/
void QPEApplication::prepareForTermination( bool willrestart )
{
if ( willrestart ) {
// Draw a big wait icon, the image can be altered in later revisions
// QWidget *d = QApplication::desktop();
QImage img = Resource::loadImage( "launcher/new_wait" );
QPixmap pix;
pix.convertFromImage( img.smoothScale( 1 * img.width(), 1 * img.height() ) );
QLabel *lblWait = new QLabel( 0, "wait hack!", QWidget::WStyle_Customize |
QWidget::WStyle_NoBorder | QWidget::WStyle_Tool );
lblWait->setPixmap( pix );
lblWait->setAlignment( QWidget::AlignCenter );
lblWait->show();
lblWait->showMaximized();
}
#ifndef SINGLE_APP
{ QCopEnvelope envelope( "QPE/System", "forceQuit()" );
}
processEvents(); // ensure the message goes out.
sleep( 1 ); // You have 1 second to comply.
#endif
}
int QPEApplication::x11ClientMessage(QWidget* w, XEvent* event, bool b ) {
qWarning("X11 ClientMessage %d %d", event->type, ClientMessage);
if ( event->type == ClientMessage ) {
if ( (event->xclient.message_type == d->wm_protocols) &&
(event->xclient.data.l[0] == d->wm_context_accept ) ) {
qWarning("accepted!!!");
/*
* I'm not sure if we should use activeWidget
* or activeModalWidget
* a QDialog could be not modal too
*/
if ( w->inherits("QDialog" ) ) {
qWarning("inherits QDialog!!!");
QDialog* dia = (QDialog*)w;
/*
* call it directly or via QTimer::singleShot?
*/
QTimer::singleShot(0, dia, SLOT(accept() ) );
return 0;
}
}
}
return QApplication::x11ClientMessage(w, event, b );
}
#define KeyPress XKeyPress
#define KeyRelease XKeyRelease
#if defined(OPIE_NEW_MALLOC)
// The libraries with the skiff package (and possibly others) have
// completely useless implementations of builtin new and delete that
// use about 50% of your CPU. Here we revert to the simple libc
// functions.
void* operator new[]( size_t size )
{
return malloc( size );
}
void* operator new( size_t size )
{
return malloc( size );
}
void operator delete[]( void* p )
{
free( p );
}
void operator delete[]( void* p, size_t /*size*/ )
{
free( p );
}
void operator delete( void* p )
{
free( p );
}
void operator delete( void* p, size_t /*size*/ )
{
free( p );
}
#endif