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;
}