Source Code (Use browser search to find items of interest.)

Class Index

kdelibs'PartManager (./kdelibs/kparts/partmanager.h:45)

class PartManager : public QObject
{
  Q_OBJECT
public:
  // the default policy of a PartManager is Direct!
  enum SelectionPolicy { Direct, TriState };

  /**
   * Create a part manager.
   *
   * @param parent The toplevel widget (window / dialog).
   */
  PartManager( QWidget * parent, const char * name = 0L );
  virtual ~PartManager();

  /**
   * Set the selection policy of the partmanager.
   */
  void setSelectionPolicy( SelectionPolicy policy );
  /**
   * Retrieve the current selection policy.
   */
  SelectionPolicy selectionPolicy() const;

  /**
   * Specify whether the partmanager should handle/allow nested parts or not.
   * This is a property the shell has to set/specify. Per default we assume that the
   * shell cannot handle nested parts. However in case of a KOffice shell for example
   * we allow nested parts.
   * A Part is nested (a child part) if its parent object inherits KParts::Part.
   * If a child part is activated and nested parts are not allowed/handled, then the top parent
   * part in the tree is activated.
   */
  void setAllowNestedParts( bool allow );
  bool allowNestedParts() const;

  /**
   * @internal
   */
  virtual bool eventFilter( QObject *obj, QEvent *ev );

  /**
   * Add a Part to the manager.
   *
   * Sets it to the active part automatically if @p setActive is true (default ).
   */
  virtual void addPart( Part *part, bool setActive = true );

  /**
   * Remove a part from the manager (this does not delete the object) .
   *
   * Sets the active part to 0 if @p part is the @ref activePart() .
   */
  virtual void removePart( Part *part );

  /**
   * Set the active part.
   *
   * The active part receives activation events.
   *
   * @p widget can be used to specify which widget was responsible for the activation.
   * This is important if you have multiple views for a document/part , like in KOffice .
   */
  virtual void setActivePart( Part *part, QWidget *widget = 0L );

  /**
   * Retrieve the active part.
   **/
  virtual Part *activePart() const;

  /**
   * Retrieve the active widget of the current active part (see @ref activePart ).
   */
  virtual QWidget *activeWidget() const;

  /**
   * Set the selected part.
   *
   * The selected part receives selection events.
   *
   * @p widget can be used to specify which widget was responsible for the selection.
   * This is important if you have multiple views for a document/part , like in KOffice .
   */
  virtual void setSelectedPart( Part *part, QWidget *widget = 0L );

  /**
   * Retrieve the current selected part.
   */
  virtual Part *selectedPart() const;

  /**
   * Retrieve the selected widget of the current selected part (see @ref selectedPart ).
   */
  virtual QWidget *selectedWidget() const;

  /**
   * Retrieve the list of parts being managed by the partmanager.
   */
  const QList<Part> *parts() const;

signals:
  /**
   * Emitted when a new part has been added.
   * @see addPart()
   **/
  void partAdded( KParts::Part *part );
  /**
   * Emitted when a part has been removed.
   * @see removePart()
   **/
  void partRemoved( KParts::Part *part );
  /**
   * Emitted when the active part has changed.
   * @see setActivePart()
   **/
  void activePartChanged( KParts::Part *newPart );

protected slots:
  /**
   * Removes a part when it is destroyed.
   **/
  void slotObjectDestroyed();

  /**
   * @internal
   */
  void slotWidgetDestroyed();

private:
  Part * findPartFromWidget( QWidget * widget, const QPoint &pos );

  PartManagerPrivate *d;
};

};

kdelibs'PartManager::PartManager() (./kdelibs/kparts/partmanager.cpp:65)

PartManager::PartManager( QWidget * parent, const char * name )
 : QObject( parent, name )
{
  d = new PartManagerPrivate;

  qApp->installEventFilter( this );

  d->m_policy = Direct;
}


kdelibs'PartManager::~PartManager() (./kdelibs/kparts/partmanager.cpp:75)

PartManager::~PartManager()
{
  // core dumps ... setActivePart( 0L );
  qApp->removeEventFilter( this );
  delete d;
}


kdelibs'PartManager::setSelectionPolicy() (./kdelibs/kparts/partmanager.cpp:82)

void PartManager::setSelectionPolicy( SelectionPolicy policy )
{
  d->m_policy = policy;
}

PartManager::SelectionPolicy PartManager::selectionPolicy() const
{
  return d->m_policy;
}


kdelibs'PartManager::setAllowNestedParts() (./kdelibs/kparts/partmanager.cpp:92)

void PartManager::setAllowNestedParts( bool allow )
{
  d->m_bAllowNestedParts = allow;
}


kdelibs'PartManager::allowNestedParts() (./kdelibs/kparts/partmanager.cpp:97)

bool PartManager::allowNestedParts() const
{
  return d->m_bAllowNestedParts;
}


kdelibs'PartManager::eventFilter() (./kdelibs/kparts/partmanager.cpp:102)

bool PartManager::eventFilter( QObject *obj, QEvent *ev )
{

  if ( ev->type() != QEvent::MouseButtonPress &&
       ev->type() != QEvent::MouseButtonDblClick &&
       ev->type() != QEvent::FocusIn )
    return false;

  if ( !obj->isWidgetType() )
    return false;

  QWidget *w = (QWidget *)obj;

  if ( ( w->testWFlags( WStyle_Dialog ) && w->isModal() ) ||
       w->testWFlags( WType_Popup ) || w->testWFlags( WStyle_Tool ) )
    return false;

  Part * part;
  while ( w )
  {
    QPoint pos;

    if ( ev->type() == QEvent::MouseButtonPress || ev->type() == QEvent::MouseButtonDblClick )
      pos = ((QMouseEvent *)ev)->globalPos();

    if ( w->topLevelWidget() != ((QWidget *)parent())->topLevelWidget() )
      return false;

    part = findPartFromWidget( w, pos );
    if ( part ) // We found a part whose widget is w
    {
      if ( d->m_policy == PartManager::TriState )
      {
        if ( ev->type() == QEvent::MouseButtonDblClick )
	{
	  if ( part == d->m_activePart && w == d->m_activeWidget )
	    return false;
	
	  setActivePart( part, w );
	  return true;
	}
	
	if ( ( d->m_selectedWidget != w || d->m_selectedPart != part ) &&
	     ( d->m_activeWidget != w || d->m_activePart != part ) )
	{
	  if ( part->isSelectable() )
  	    setSelectedPart( part, w );
	  else
	    setActivePart( part, w );
	  return true;
	}
	else if ( d->m_selectedWidget == w && d->m_selectedPart == part )
	{
	  setActivePart( part, w );
	  return true;
	}
	else if ( d->m_activeWidget == w && d->m_activePart == part )
	{
  	  setSelectedPart( 0L );
	  return false;
	}
	
	return false;
      }
      else if ( part != d->m_activePart )
      {
        kdDebug(1000) << QString("Part %1 made active because %2 got event").arg(part->name()).arg(w->className()) << endl;

        setActivePart( part, w );
      }

      // I suppose we don't return here in case of child parts, right ?
      // But it means we'll emit the event for each intermediate parent ? (David)
      // Perhaps we should store the new part and emit at the end ?

      // I think we should return here (Simon)
      return false; // Ok, let's return. We'll test child parts later on. (David)
    }

    w = w->parentWidget();

    if ( w && ( ( w->testWFlags( WStyle_Dialog ) && w->isModal() ) ||
                w->testWFlags( WType_Popup ) || w->testWFlags( WStyle_Tool ) ) )
    {
      kdDebug(1000) << QString("No part made active although %1/%2 got event - loop aborted").arg(obj->name()).arg(obj->className()) << endl;
      return false;
    }

  }

  kdDebug(1000) << QString("No part made active although %1/%2 got event").arg(obj->name()).arg(obj->className()) << endl;
  return false;
}


kdelibs'PartManager::findPartFromWidget() (./kdelibs/kparts/partmanager.cpp:196)

Part * PartManager::findPartFromWidget( QWidget * widget, const QPoint &pos )
{
  QListIterator<Part> it ( d->m_parts );
  for ( ; it.current() ; ++it )
  {
    Part *part = it.current()->hitTest( widget, pos );
    if ( part )
      return part;
  }
  return 0L;
}


kdelibs'PartManager::addPart() (./kdelibs/kparts/partmanager.cpp:208)

void PartManager::addPart( Part *part, bool setActive )
{
  connect( part, SIGNAL( destroyed() ), this, SLOT( slotObjectDestroyed() ) );

  d->m_parts.append( part );

  part->setManager( this );

  if ( setActive )
  {
    setActivePart( part );
    if ( part->widget() )
      part->widget()->setFocus();
  }

  // Prevent focus problems
  if ( part->widget() &&
      ( part->widget()->focusPolicy() == QWidget::NoFocus ||
        part->widget()->focusPolicy() == QWidget::TabFocus ) )
  {
    kdWarning(1000) << QString("Part %1 must have at least a ClickFocus policy. Prepare for trouble !").arg(part->name()) << endl;
  }

  if ( part->widget() )
    part->widget()->show();
  emit partAdded( part );
}


kdelibs'PartManager::removePart() (./kdelibs/kparts/partmanager.cpp:236)

void PartManager::removePart( Part *part )
{
  if ( d->m_parts.findRef( part ) == -1 )
  {
    kdFatal(1000) << QString("Can't remove part %1, not in KPartManager's list.").arg(part->name()) << endl;
    return;
  }
  disconnect( part, SIGNAL( destroyed() ), this, SLOT( slotObjectDestroyed() ) );

  kdDebug(1000) << QString("Part %1 removed").arg(part->name()) << endl;
  d->m_parts.removeRef( part );

  if ( part == d->m_activePart )
    setActivePart( 0 );

  emit partRemoved( part );
}


kdelibs'PartManager::setActivePart() (./kdelibs/kparts/partmanager.cpp:254)

void PartManager::setActivePart( Part *part, QWidget *widget )
{
  //check whether nested parts are disallowed and activate the top parent part then, by traversing the
  //tree recursively (Simon)
  if ( part && !d->m_bAllowNestedParts && part->parent() && part->parent()->inherits( "KParts::Part" ) )
    setActivePart( (KParts::Part *)part->parent() );

  KParts::Part *oldActivePart = d->m_activePart;
  QWidget *oldActiveWidget = d->m_activeWidget;

  setSelectedPart( 0L );

  d->m_activePart = part;
  d->m_activeWidget = widget;

  if ( oldActivePart )
  {
    KParts::Part *savedActivePart = part;
    QWidget *savedActiveWidget = widget;

    PartActivateEvent ev( false, oldActivePart, oldActiveWidget );
    QApplication::sendEvent( oldActivePart, &ev );
    if ( oldActiveWidget )
    {
      disconnect( oldActiveWidget, SIGNAL( destroyed() ),
		  this, SLOT( slotWidgetDestroyed() ) );
      QApplication::sendEvent( oldActiveWidget, &ev );
    }

    d->m_activePart = savedActivePart;
    d->m_activeWidget = savedActiveWidget;
  }

  if ( d->m_activePart )
  {
    if ( !widget )
      d->m_activeWidget = part->widget();

    PartActivateEvent ev( true, d->m_activePart, d->m_activeWidget );
    QApplication::sendEvent( d->m_activePart, &ev );
    if ( d->m_activeWidget )
    {
      connect( d->m_activeWidget, SIGNAL( destroyed() ),
	       this, SLOT( slotWidgetDestroyed() ) );
      QApplication::sendEvent( d->m_activeWidget, &ev );
    }
  }

  emit activePartChanged( d->m_activePart );
}


kdelibs'PartManager::activePart() (./kdelibs/kparts/partmanager.cpp:305)

Part *PartManager::activePart() const
{
  return d->m_activePart;
}


kdelibs'PartManager::activeWidget() (./kdelibs/kparts/partmanager.cpp:310)

QWidget *PartManager::activeWidget() const
{
  return  d->m_activeWidget;
}


kdelibs'PartManager::setSelectedPart() (./kdelibs/kparts/partmanager.cpp:315)

void PartManager::setSelectedPart( Part *part, QWidget *widget )
{
  if ( part == d->m_selectedPart && widget == d->m_selectedWidget )
    return;

  Part *oldPart = d->m_selectedPart;
  QWidget *oldWidget = d->m_selectedWidget;

  d->m_selectedPart = part;
  d->m_selectedWidget = widget;

  if ( part && !widget )
    d->m_selectedWidget = part->widget();

  if ( oldPart )
  {
    PartSelectEvent ev( false, oldPart, oldWidget );
    QApplication::sendEvent( oldPart, &ev );
    QApplication::sendEvent( oldWidget, &ev );
  }

  if ( d->m_selectedPart )
  {
    PartSelectEvent ev( true, d->m_selectedPart, d->m_selectedWidget );
    QApplication::sendEvent( d->m_selectedPart, &ev );
    QApplication::sendEvent( d->m_selectedWidget, &ev );
  }
}


kdelibs'PartManager::selectedPart() (./kdelibs/kparts/partmanager.cpp:344)

Part *PartManager::selectedPart() const
{
  return d->m_selectedPart;
}


kdelibs'PartManager::selectedWidget() (./kdelibs/kparts/partmanager.cpp:349)

QWidget *PartManager::selectedWidget() const
{
  return d->m_selectedWidget;
}


kdelibs'PartManager::slotObjectDestroyed() (./kdelibs/kparts/partmanager.cpp:354)

void PartManager::slotObjectDestroyed()
{
  kdDebug(1000) << "KPartManager::slotObjectDestroyed()" << endl;
  removePart( (Part *)sender() );
}


kdelibs'PartManager::slotWidgetDestroyed() (./kdelibs/kparts/partmanager.cpp:360)

void PartManager::slotWidgetDestroyed()
{
  kdDebug(1000) << "KPartsManager::slotWidgetDestroyed()" << endl;
  if ( (QWidget *)sender() == d->m_activeWidget )
    setActivePart( 0L ); //do not remove the part because if the part's widget dies, then the
                         //part will delete itself anyway (which ends up in a slotObjectDestroyed() call
}


kdelibs'PartManager::parts() (./kdelibs/kparts/partmanager.cpp:368)

const QList<Part> *PartManager::parts() const
{
  return &d->m_parts;
}