Source Code (Use browser search to find items of interest.)
Class Index
kicker'AppletArea (./kdebase/kicker/appletarea.h:20)
class AppletArea : public Panner, DCOPObject
{
Q_OBJECT;
public:
AppletArea( Orientation orientation, QWidget* parent, const char* name = 0);
~AppletArea();
bool process(const QCString &fun, const QByteArray &data,
QCString& replyType, QByteArray &replyData);
public slots:
void startAppletMove(AppletContainer *a);
void stopAppletMove(AppletContainer *a);
void removeApplet(AppletContainer *a);
protected:
void layoutChildren();
AppletContainer* findApplet( QCString id );
void dockMe( QCString application, QCString applet);
// does AppletContainer a cover other AppletContainer's ? (if(strict == false): more than 25%)?
AppletContainer* coversAppletContainer(AppletContainer *a, bool strict);
void updateAppletContainerList();
uint relativeAppletContainerPos(AppletContainer* a);
void mouseMoveEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void dragEnterEvent(QDragEnterEvent *ev);
void dropEvent(QDropEvent *ev);
void addApplet(AppletContainer* a);
void setUniqueId(AppletContainer* a);
void moveToFirstFreePosition(AppletContainer* a);
protected slots:
void embeddedWindowDestroyed();
void saveAppletConfig();
private:
QList<AppletContainer> _applets;
bool _block_relayout;
bool _movingAC;
AppletContainer *_moveAC;
QPoint _moveOffset;
int _mouseAccel, _mouseThreshold;
};
kicker'AppletArea::AppletArea() (./kdebase/kicker/appletarea.cpp:30)
AppletArea::AppletArea( Orientation orient, QWidget* parent, const char* name)
: Panner( orient, parent, name )
, DCOPObject("appletArea")
, _block_relayout(false)
, _movingAC(false)
, _moveAC(0)
, _moveOffset(QPoint(0,0))
, _mouseAccel(2)
, _mouseThreshold(2)
{
setAcceptDrops(true);
_applets.setAutoDelete(false);
// set background pixmap
KConfig* config = KGlobal::config();
config->setGroup("theme");
QString bgStr = config->readEntry("AppletAreaBackground", "");
if(!bgStr.isEmpty()){
QPixmap bgPix(bgStr);
if(!bgPix.isNull()){
QBrush bgBrush(colorGroup().background(), bgPix);
QPalette pal = kapp->palette();
pal.setBrush(QColorGroup::Background, bgBrush);
setPalette(pal);
}
else
warning("Kicker: Error loading AppletArea theme pixmap");
}
config->setGroup("layout");
if(!config->hasKey("applets")) // default layout
{
// kmenu
KMenuButtonContainer *kmenu = new KMenuButtonContainer(viewport());
addApplet(kmenu);
QString appPath = KGlobal::dirs()->resourceDirs("apps").last();
// some url buttons
URLButtonContainer *url = new URLButtonContainer(appPath + "/System/konsole.desktop",
viewport());
url->setRelativePos(20);
addApplet(url);
url = new URLButtonContainer(appPath + "/Home.desktop", viewport());
url->setRelativePos(0);
addApplet(url);
url = new URLButtonContainer(appPath + "/Control/User.desktop", viewport());
url->setRelativePos(20);
addApplet(url);
// pager applet
InternalFrame *pager = new InternalFrame("kminipagerapplet",
"kminipagerapplet.desktop", viewport());
pager->setRelativePos(40);
addApplet(pager);
// koolclock applet
InternalFrame *clock = new InternalFrame("koolclockapplet",
"koolclockapplet.desktop", viewport());
clock->setRelativePos(40);
addApplet(clock);
// taskbar applet
InternalFrame *taskbar = new InternalFrame("ktaskbarapplet",
"ktaskbarapplet.desktop", viewport());
taskbar->setRelativePos(100);
addApplet(taskbar);
}
else // restore layout
{
// read layout stringlist
QStringList appletLayout = config->readListEntry("applets");
// now restore the applets
QStringList::Iterator it;
it = appletLayout.begin();
int freepos = 0;
while(it != appletLayout.end())
{
config->setGroup("applets");
AppletContainer *a = 0;
// read applet id
QString appletId(*it);
// iterate...make sure not to read beyond the list end
++it;
if(it == appletLayout.end())
break;
// read relative pos
int rpos = (*it).toInt();
// external applet hack
rpos += freepos;
freepos = 0;
// iterate
++it;
// is there a entry for the current appletId?
if(!config->hasKey(appletId))
continue;
// read the entry for the current appletId
QString data = config->readEntry(appletId);
// create a matching applet container
if (appletId.contains("KMenuButton") > 0)
a = new KMenuButtonContainer(viewport());
else if (appletId.contains("URLButton") > 0)
a = new URLButtonContainer(data, viewport());
else if (appletId.contains("BrowserButton") > 0)
a = new BrowserButtonContainer(data, viewport());
else if (appletId.contains("ExeButton") > 0)
a = new ExeButtonContainer(data, viewport());
else if (appletId.contains("InternalApplet") > 0)
a = new InternalFrame(appletId, data, viewport());
else if (appletId.contains("ExternalApplet") > 0)
{
int index = data.find("::seperator::");
QString command = data;
command.truncate(index);
freepos = (data.mid(index + 13)).toInt();
KProcess process;
process << command;
process.start(KProcess::DontCare);
}
if (a) {
a->setRelativePos(rpos);
addApplet(a);
}
}
}
layoutChildren();
saveAppletConfig();
}
kicker'AppletArea::~AppletArea() (./kdebase/kicker/appletarea.cpp:174)
AppletArea::~AppletArea()
{
for (QListIterator<AppletContainer> it(_applets); it.current(); ++it )
{
AppletContainer *a = it.current();
if (a) delete a;
}
}
kicker'AppletArea::addApplet() (./kdebase/kicker/appletarea.cpp:183)
void AppletArea:: addApplet(AppletContainer* a)
{
if (!a) return;
setUniqueId(a);
_applets.append(a);
a->show();
connect(a, SIGNAL(moveme(AppletContainer*) ), SLOT( startAppletMove(AppletContainer*)));
connect(a, SIGNAL(removeme(AppletContainer*) ), SLOT( removeApplet(AppletContainer*)));
connect(a, SIGNAL(requestSave()), SLOT(saveAppletConfig()));
if (a->inherits("ExternalFrame"))
connect(a, SIGNAL(embeddedWindowDestroyed() ), this, SLOT( embeddedWindowDestroyed()));
kdDebug() << "adding applet: " << a->appletId() << endl;
}
kicker'AppletArea::setUniqueId() (./kdebase/kicker/appletarea.cpp:202)
void AppletArea::setUniqueId(AppletContainer* a)
{
QString idBase = a->appletType() + "_%1";
QString newId;
int i = 0;
bool unique = false;
while(!unique)
{
i++;
newId = idBase.arg(i);
unique = true;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
AppletContainer* b = static_cast<AppletContainer*>(it.current());
if (b->appletId() == newId)
{
unique = false;
break;
}
}
}
a->setAppletId(newId);
}
kicker'AppletArea::saveAppletConfig() (./kdebase/kicker/appletarea.cpp:229)
void AppletArea::saveAppletConfig()
{
kdDebug() << "AppletArea::saveAppletConfig()" << endl;
KConfig *config = KGlobal::config();
config->setGroup("applets");
QStringList layoutList;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
AppletContainer* a = static_cast<AppletContainer*>(it.current());
// append applet to layoutList
layoutList.append(a->appletId());
layoutList.append(QString("%1").arg(a->relativePos()));
// write applet config entry
config->writeEntry(a->appletId(), a->configData());
}
config->setGroup("layout");
config->writeEntry("applets", layoutList);
config->sync();
}
kicker'AppletArea::removeApplet() (./kdebase/kicker/appletarea.cpp:256)
void AppletArea::removeApplet(AppletContainer *a)
{
if (a) {
_applets.removeRef(a);
delete a;
}
updateAppletContainerList();
layoutChildren();
saveAppletConfig();
QTimer::singleShot( 0, this, SLOT( cleanupChildren() ) );
}
kicker'AppletArea::startAppletMove() (./kdebase/kicker/appletarea.cpp:269)
void AppletArea::startAppletMove(AppletContainer *a)
{
if (!a) return;
_moveAC = a;
_movingAC = true;
setMouseTracking(true);
QCursor::setPos(mapToGlobal(QPoint(a->x() + a->moveOffset().x(), a->y() + a->moveOffset().y())));
grabMouse(sizeAllCursor);
int accel_num, accel_den, threshold;
XGetPointerControl( kapp->getDisplay(),
&accel_num, &accel_den, &threshold );
_mouseAccel = accel_num / accel_den;
_mouseThreshold = threshold;
XChangePointerControl( kapp->getDisplay(),
true, true, 1, 1, _mouseThreshold);
a->raise();
_block_relayout = true;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
AppletContainer* b = static_cast<AppletContainer*>(it.current());
if (orientation() == Horizontal)
b->resize(b->widthForHeight(height()), height());
else
b->resize(width(), b->heightForWidth(width()));
}
}
kicker'AppletArea::stopAppletMove() (./kdebase/kicker/appletarea.cpp:303)
void AppletArea::stopAppletMove(AppletContainer *b)
{
if (_moveAC != b) return;
releaseMouse();
setCursor(arrowCursor);
_movingAC = false;
setMouseTracking(false);
AppletContainer *a = coversAppletContainer(_moveAC, true);
if (a) {
if (orientation() == Horizontal) {
if (_moveAC->x() < a->x())
_moveAC->move(QPoint(a->x() - _moveAC->width() - 1, _moveAC->y()));
else
_moveAC->move(QPoint(a->x() + a->width() + 1, _moveAC->y()));
}
else {
if (_moveAC->y() < a->y())
_moveAC->move(QPoint(_moveAC->x(), a->y() - _moveAC->height() - 1));
else
_moveAC->move(QPoint(_moveAC->x(), a->y() + a->height() + 1));
}
}
_moveAC = 0;
XChangePointerControl( kapp->getDisplay(),
true, true, _mouseAccel, 1, _mouseThreshold);
_block_relayout = false;
updateAppletContainerList();
layoutChildren();
saveAppletConfig();
}
kicker'AppletArea::mouseReleaseEvent() (./kdebase/kicker/appletarea.cpp:340)
void AppletArea::mouseReleaseEvent(QMouseEvent *)
{
if (_movingAC && _moveAC)
stopAppletMove(_moveAC);
}
kicker'AppletArea::mouseMoveEvent() (./kdebase/kicker/appletarea.cpp:346)
void AppletArea::mouseMoveEvent(QMouseEvent *ev)
{
if(_movingAC && _moveAC) {
// horizontal panel
if(orientation() == Horizontal) {
// calculate new position.
int x = ev->pos().x()-_moveAC->moveOffset().x();
// make sure the new position is inside the appletarea
// scroll if needed
if (x < 0) {
x = 0;
scrollBy( -10, 0 );
}
else if (x > width() - _moveAC->width()) {
x = width() - _moveAC->width();
scrollBy( 10, 0 );
}
// move the Applet to the calculated position
_moveAC->move(QPoint(x , _moveAC->y()));
// check if we cover another applet now
AppletContainer *b = coversAppletContainer(_moveAC, false);
// we do cover another applet
// switch the applets positions
if (b) {
if(_moveAC->x() < b->x()) // left to right
{
int br = b->x() + b->width();
int newx = br - _moveAC->width();
_moveAC->move(QPoint(newx , _moveAC->y()));
b->move(newx - b->width() - 1, b->y());
}
else // right to left
{
int bl = b->x();
int newx = bl;
_moveAC->move(QPoint(newx , _moveAC->y()));
b->move(newx + _moveAC->width() + 1, b->y());
}
}
}
else { // vertical panel
// calculate new position.
int y = ev->pos().y()-_moveAC->moveOffset().y();
// make sure the new position is inside the appletarea
// scroll if needed
if (y < 0) {
y = 0;
scrollBy( 0, -10 );
}
else if (y > height() - _moveAC->height()) {
y = height() - _moveAC->height();
scrollBy( 0, 10 );
}
// move the Applet to the calculated position
_moveAC->move(QPoint(_moveAC->x(), y));
// check if we cover another applet now
AppletContainer *b = coversAppletContainer(_moveAC, false);
// we do cover another applet
// switch the applets positions
if (b) {
if(_moveAC->y() < b->y()) // top to bottom
{
int bb = b->y() + b->height();
int newy = bb - _moveAC->height();
_moveAC->move(QPoint(_moveAC->x(), newy));
b->move(b->x(), newy - b->height() - 1);
}
else // bottom to top
{
int bt = b->y();
int newy = bt;
_moveAC->move(QPoint(_moveAC->x(), newy ));
b->move(b->x(), newy + _moveAC->height() + 1);
}
}
}
QCursor::setPos(mapToGlobal(QPoint(_moveAC->x() + _moveAC->moveOffset().x(),
_moveAC->y() + _moveAC->moveOffset().y())));
}
else
Panner::mouseMoveEvent(ev);
}
kicker'AppletArea::process() (./kdebase/kicker/appletarea.cpp:445)
bool AppletArea::process(const QCString &fun, const QByteArray &data,
QCString& replyType, QByteArray &replyData)
{
if ( fun == "dockMe(QCString)" )
{
QDataStream dataStream( data, IO_ReadOnly );
QCString name;
dataStream >> name;
dockMe( kapp->dcopClient()->senderId(), name );
return true;
}
else if(fun == "setStretch(QCString,int)")
{
QDataStream dataStream(data, IO_ReadOnly);
QCString name;
int s;
dataStream >> name;
dataStream >> s;
bool value = static_cast<bool> (s);
AppletContainer* a = findApplet(name);
if(a)
a->setStretch(value);
return(true);
}
else if(fun == "position()")
{
QDataStream dataStream(replyData, IO_ReadWrite);
replyType = "int";
dataStream << static_cast<int>(PGlobal::panel->position());
return(true);
}
else if(fun == "orientation()")
{
QDataStream dataStream(replyData, IO_ReadWrite);
replyType = "int";
dataStream << static_cast<int>(PGlobal::panel->orientation());
return(true);
}
return true;
}
kicker'AppletArea::findApplet() (./kdebase/kicker/appletarea.cpp:486)
AppletContainer* AppletArea::findApplet( QCString id )
{
for ( QListIterator<AppletContainer> it(_applets); it.current(); ++it ) {
if ( it.current()->objId() == id )
return it.current();
}
return 0;
}
kicker'AppletArea::embeddedWindowDestroyed() (./kdebase/kicker/appletarea.cpp:495)
void AppletArea::embeddedWindowDestroyed()
{
if (sender() && sender()->inherits("ExternalFrame"))
removeApplet((ExternalFrame*)sender());
}
kicker'AppletArea::layoutChildren() (./kdebase/kicker/appletarea.cpp:501)
void AppletArea::layoutChildren()
{
if (_block_relayout) return;
kdDebug() << "AppletArea::layoutChildren()" << endl;
int pos = 0;
for (QListIterator<AppletContainer> it(_applets); it.current(); ++it )
{
// pointer to current applet
AppletContainer *a = it.current();
// get pointer to the next applet
++it;
AppletContainer *next = it.current();
--it;
a->setOrientation(orientation());
a->setPosition(PGlobal::panel->position());
pos += a->relativePos();
if (orientation() == Horizontal)
{
a->move( pos, 0 );
int w = a->widthForHeight(height());
if (a->stretch())
{
if (next)
a->resize(w + next->relativePos(), height());
else
a->resize(realWidth() - a->x(), height());
}
else
a->resize(w, height());
pos += w + 1;
}
else
{
a->move( 0, pos );
int h = a->heightForWidth(width());
if (a->stretch())
{
if (next)
a->resize(width(), h + next->relativePos());
else
a->resize(width(), realHeight() - a->y());
}
else
a->resize(width(), h);
pos += h + 1;
}
}
resizeContents(viewport()->childrenRect().width(),
viewport()->childrenRect().height());
}
kicker'AppletArea::dockMe() (./kdebase/kicker/appletarea.cpp:557)
void AppletArea::dockMe( QCString application, QCString applet )
{
ExternalFrame* frame = new ExternalFrame( application, applet, viewport() );
addApplet(frame);
layoutChildren();
moveToFirstFreePosition(frame);
saveAppletConfig();
}
kicker'AppletArea::dragEnterEvent() (./kdebase/kicker/appletarea.cpp:566)
void AppletArea::dragEnterEvent(QDragEnterEvent *ev)
{
ev->accept(QUriDrag::canDecode(ev));
}
kicker'AppletArea::dropEvent() (./kdebase/kicker/appletarea.cpp:571)
void AppletArea::dropEvent(QDropEvent *ev)
{
QStrList fileList;
if(QUriDrag::decode(ev, fileList)){
QStrListIterator it(fileList);
for(;it.current(); ++it)
{
warning("In dropEvent for %s", it.current());
AppletContainer* a;
KURL url(it.current());
// see if it's a executable or directory
if(url.isLocalFile() && !KDesktopFile::isDesktopFile(url.path()))
{
QFileInfo fi(url.path());
if(fi.isDir()) // directory
{
PanelDirDropMenu mnu;
switch(mnu.exec(mapToGlobal(ev->pos()))){
case PanelDirDropMenu::Browser:
a = new BrowserButtonContainer(url.path(), viewport());
break;
case PanelDirDropMenu::Url:
default:
a = new URLButtonContainer(it.current(), viewport());
break;
}
}
else if(fi.isExecutable()) // non-KDE executable
{
warning("Dropped exe");
QString pixmapFile;
KMimeType::pixmapForURL(url.path(), 0,
KIcon::SizeMedium /*HACK*/, &pixmapFile);
PanelExeDialog dlg(url.path(), pixmapFile,
QString::null, false, viewport());
if(dlg.exec() == QDialog::Accepted){
// KIconloader returns a full path, we only want name
QFileInfo iconfi(dlg.icon());
a = new ExeButtonContainer(url.path(), iconfi.fileName(),
dlg.commandLine(),
dlg.useTerminal(), viewport());
}
else
break;
}
else // some unknown local file
a = new URLButtonContainer(it.current(), viewport());
}
else // a internet URL or desktop file.
a= new URLButtonContainer(it.current(), viewport());
addApplet(a);
layoutChildren();
moveToFirstFreePosition(a);
saveAppletConfig();
}
}
}
kicker'AppletArea::moveToFirstFreePosition() (./kdebase/kicker/appletarea.cpp:631)
void AppletArea::moveToFirstFreePosition(AppletContainer* a)
{
int w = a->widthForHeight(height());
int h = a->heightForWidth(width());
Orientation orient = orientation();
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
AppletContainer* b = static_cast<AppletContainer*>(it.current());
int freespace = b->relativePos();
if (orient == Horizontal) {
if (freespace >= w) {
a->move(b->pos().x() - freespace, a->y());
break;
}
}
else {
if (freespace >= h) {
a->move(a->x(), b->pos().y() - freespace);
break;
}
}
}
updateAppletContainerList();
layoutChildren();
}
kicker'AppletArea::coversAppletContainer() (./kdebase/kicker/appletarea.cpp:661)
AppletContainer* AppletArea::coversAppletContainer(AppletContainer *a, bool strict)
{
AppletContainer *b;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
b = (AppletContainer*)it.current();
if (b == a) continue;
if ( orientation() == Horizontal ) {
int bl, br;
if (strict) {
bl = b->x();
br = b->x() + b->width();
}
else {
bl = b->x() + 10;
br = b->x() + b->width() - 10;
}
int btnl = a->x();
int btnr = btnl + a->width();
if ((btnl >= bl) && (btnl <= br))
return b;
else if ((btnr >= bl) && (btnr <= br))
return b;
}
else {
int bt, bb;
if (strict) {
bt = b->y();
bb = b->y() + b->height();
}
else {
bt = b->y() + 10;
bb = b->y() + b->height() - 10;
}
int btnt = a->y();
int btnb = btnt + a->height();
if ((btnt >= bt) && (btnt <= bb))
return b;
else if ((btnb >= bt) && (btnb <= bb))
return b;
}
}
return 0;
}
kicker'AppletArea::updateAppletContainerList() (./kdebase/kicker/appletarea.cpp:713)
void AppletArea::updateAppletContainerList()
{
QList<AppletContainer> sorted;
while(!_applets.isEmpty())
{
AppletContainer *b = 0;
int pos = 9999;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
AppletContainer* a = static_cast<AppletContainer*>(it.current());
if(orientation() == Horizontal)
{
if (a->x() < pos) {
b = a;
pos = a->x();
}
}
else
{
if (a->y() < pos) {
b = a;
pos = a->y();
}
}
}
if (b) {
sorted.append(b);
_applets.remove(b);
}
}
_applets = sorted;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
it.current()->setRelativePos(relativeAppletContainerPos(it.current()));
}
kicker'AppletArea::relativeAppletContainerPos() (./kdebase/kicker/appletarea.cpp:755)
uint AppletArea::relativeAppletContainerPos(AppletContainer* b)
{
if (!b) return 0;
if (!_applets.contains(b)) return 0;
uint pos = 0;
QListIterator<AppletContainer> it(_applets);
for(; it.current() ; ++it)
{
AppletContainer* a = static_cast<AppletContainer*>(it.current());
if(orientation() == Horizontal)
{
if (a == b)
return (b->x() - pos);
else
pos = a->x() + a->widthForHeight(height())+1;
}
else
{
if (a == b)
return (b->y() - pos);
else
pos = a->y() + a->heightForWidth(width())+1;
}
}
return 0;
}