VirtualBox

Changeset 77647 in vbox


Ignore:
Timestamp:
Mar 11, 2019 10:43:02 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
129277
Message:

FE/Qt: bugref:6699. Adding an action to show detailed session/process information.

Location:
trunk/src/VBox/Frontends/VirtualBox/src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h

    r76581 r77647  
    151151template<> SHARED_LIBRARY_STUFF bool canConvert<KChipsetType>();
    152152template<> SHARED_LIBRARY_STUFF bool canConvert<KNATProtocol>();
     153template<> SHARED_LIBRARY_STUFF bool canConvert<KGuestSessionStatus>();
     154template<> SHARED_LIBRARY_STUFF bool canConvert<KProcessStatus>();
    153155
    154156
     
    302304template<> SHARED_LIBRARY_STUFF QString toInternalString(const KNATProtocol &protocol);
    303305template<> SHARED_LIBRARY_STUFF KNATProtocol fromInternalString<KNATProtocol>(const QString &strProtocol);
     306template<> SHARED_LIBRARY_STUFF QString toInternalString(const KGuestSessionStatus &status);
     307template<> SHARED_LIBRARY_STUFF KGuestSessionStatus fromInternalString<KGuestSessionStatus>(const QString &strStatus);
     308template<> SHARED_LIBRARY_STUFF QString toInternalString(const KProcessStatus &status);
     309template<> SHARED_LIBRARY_STUFF KProcessStatus fromInternalString<KProcessStatus>(const QString &strStatus);
    304310
    305311
  • trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp

    r76606 r77647  
    5454template<> bool canConvert<KChipsetType>() { return true; }
    5555template<> bool canConvert<KNATProtocol>() { return true; }
    56 
     56template<> bool canConvert<KGuestSessionStatus>() { return true; }
     57template<> bool canConvert<KProcessStatus>() { return true; }
    5758
    5859/* QColor <= KMachineState: */
     
    678679    return values.at(keys.indexOf(QRegExp(strProtocol, Qt::CaseInsensitive)));
    679680}
     681
     682template<> QString toInternalString(const KGuestSessionStatus &enmStatus)
     683{
     684    switch (enmStatus)
     685    {
     686        case KGuestSessionStatus_Undefined:           return QApplication::translate("VBoxGlobal", "Undefined",          "GuestSessionStatus");
     687        case KGuestSessionStatus_Starting:            return QApplication::translate("VBoxGlobal", "Starting",           "GuestSessionStatus");
     688        case KGuestSessionStatus_Started:             return QApplication::translate("VBoxGlobal", "Started",            "GuestSessionStatus");
     689        case KGuestSessionStatus_Terminating:         return QApplication::translate("VBoxGlobal", "Terminating",        "GuestSessionStatus");
     690        case KGuestSessionStatus_Terminated:          return QApplication::translate("VBoxGlobal", "Terminated",         "GuestSessionStatus");
     691        case KGuestSessionStatus_TimedOutKilled:      return QApplication::translate("VBoxGlobal", "TimedOutKilled",     "GuestSessionStatus");
     692        case KGuestSessionStatus_TimedOutAbnormally:  return QApplication::translate("VBoxGlobal", "TimedOutAbnormally", "GuestSessionStatus");
     693        case KGuestSessionStatus_Down:                return QApplication::translate("VBoxGlobal", "Down",               "GuestSessionStatus");
     694        case KGuestSessionStatus_Error:               return QApplication::translate("VBoxGlobal", "Error",              "GuestSessionStatus");
     695        default: AssertMsgFailed(("No text for %d", enmStatus)); break;
     696    }
     697    return QString();
     698}
     699
     700template<> KGuestSessionStatus fromInternalString<KGuestSessionStatus>(const QString &strStatus)
     701{
     702    QHash<QString, KGuestSessionStatus> list;
     703    list.insert(QApplication::translate("VBoxGlobal", "Undefined",          "GuestSessionStatus"),  KGuestSessionStatus_Undefined);
     704    list.insert(QApplication::translate("VBoxGlobal", "Starting",           "GuestSessionStatus"),  KGuestSessionStatus_Starting);
     705    list.insert(QApplication::translate("VBoxGlobal", "Started",            "GuestSessionStatus"),  KGuestSessionStatus_Started);
     706    list.insert(QApplication::translate("VBoxGlobal", "Terminating",        "GuestSessionStatus"),  KGuestSessionStatus_Terminating);
     707    list.insert(QApplication::translate("VBoxGlobal", "Terminated",         "GuestSessionStatus"),  KGuestSessionStatus_Terminated);
     708    list.insert(QApplication::translate("VBoxGlobal", "TimedOutKilled",     "GuestSessionStatus"),  KGuestSessionStatus_TimedOutKilled);
     709    list.insert(QApplication::translate("VBoxGlobal", "TimedOutAbnormally", "GuestSessionStatus"),  KGuestSessionStatus_TimedOutAbnormally);
     710    list.insert(QApplication::translate("VBoxGlobal", "Down",               "GuestSessionStatus"),  KGuestSessionStatus_Down);
     711    list.insert(QApplication::translate("VBoxGlobal", "Error",              "GuestSessionStatus"),  KGuestSessionStatus_Error);
     712    if (!list.contains(strStatus))
     713    {
     714        AssertMsgFailed(("No value for '%s'", strStatus.toUtf8().constData()));
     715    }
     716    return list.value(strStatus, KGuestSessionStatus_Error);
     717}
     718
     719template<> QString toInternalString(const KProcessStatus &enmStatus)
     720{
     721    switch (enmStatus)
     722    {
     723        case KProcessStatus_Undefined:            return QApplication::translate("VBoxGlobal", "Undefined",            "ProcessStatus");
     724        case KProcessStatus_Starting:             return QApplication::translate("VBoxGlobal", "Starting",             "ProcessStatus");
     725        case KProcessStatus_Started:              return QApplication::translate("VBoxGlobal", "Started",              "ProcessStatus");
     726        case KProcessStatus_Paused:               return QApplication::translate("VBoxGlobal", "Paused",               "ProcessStatus");
     727        case KProcessStatus_Terminating:          return QApplication::translate("VBoxGlobal", "Terminating",          "ProcessStatus");
     728        case KProcessStatus_TerminatedNormally:   return QApplication::translate("VBoxGlobal", "TerminatedNormally",   "ProcessStatus");
     729        case KProcessStatus_TerminatedSignal:     return QApplication::translate("VBoxGlobal", "TerminatedSignal",     "ProcessStatus");
     730        case KProcessStatus_TerminatedAbnormally: return QApplication::translate("VBoxGlobal", "TerminatedAbnormally", "ProcessStatus");
     731        case KProcessStatus_TimedOutKilled:       return QApplication::translate("VBoxGlobal", "TimedOutKilled",       "ProcessStatus");
     732        case KProcessStatus_TimedOutAbnormally:   return QApplication::translate("VBoxGlobal", "TimedOutAbnormally",   "ProcessStatus");
     733        case KProcessStatus_Down:                 return QApplication::translate("VBoxGlobal", "Down",                 "ProcessStatus");
     734        case KProcessStatus_Error:                return QApplication::translate("VBoxGlobal", "Error",                "ProcessStatus");
     735        default: AssertMsgFailed(("No text for %d", enmStatus)); break;
     736    }
     737    return QString();
     738}
     739
     740template<> KProcessStatus fromInternalString<KProcessStatus>(const QString &strStatus)
     741{
     742    QHash<QString, KProcessStatus> list;
     743    list.insert(QApplication::translate("VBoxGlobal", "Undefined",            "GuestSessionStatus"),  KProcessStatus_Undefined);
     744    list.insert(QApplication::translate("VBoxGlobal", "Starting",             "GuestSessionStatus"),  KProcessStatus_Starting);
     745    list.insert(QApplication::translate("VBoxGlobal", "Started",              "GuestSessionStatus"),  KProcessStatus_Started);
     746    list.insert(QApplication::translate("VBoxGlobal", "Paused",               "GuestSessionStatus"),  KProcessStatus_Paused);
     747    list.insert(QApplication::translate("VBoxGlobal", "Terminating",          "GuestSessionStatus"),  KProcessStatus_Terminating);
     748    list.insert(QApplication::translate("VBoxGlobal", "TerminatedNormally",   "GuestSessionStatus"),  KProcessStatus_TerminatedNormally);
     749    list.insert(QApplication::translate("VBoxGlobal", "TerminatedSignal",     "GuestSessionStatus"),  KProcessStatus_TerminatedSignal);
     750    list.insert(QApplication::translate("VBoxGlobal", "TerminatedAbnormally", "GuestSessionStatus"),  KProcessStatus_TerminatedAbnormally);
     751    list.insert(QApplication::translate("VBoxGlobal", "TimedOutKilled",       "GuestSessionStatus"),  KProcessStatus_TimedOutKilled);
     752    list.insert(QApplication::translate("VBoxGlobal", "TimedOutAbnormally",   "GuestSessionStatus"),  KProcessStatus_TimedOutAbnormally);
     753    list.insert(QApplication::translate("VBoxGlobal", "Down",                 "GuestSessionStatus"),  KProcessStatus_Down);
     754    list.insert(QApplication::translate("VBoxGlobal", "Error",                "GuestSessionStatus"),  KProcessStatus_Error);
     755
     756    if (!list.contains(strStatus))
     757    {
     758        AssertMsgFailed(("No value for '%s'", strStatus.toUtf8().constData()));
     759    }
     760    return list.value(strStatus, KProcessStatus_Error);
     761
     762}
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIFileManagerGuestTable.cpp

    r77279 r77647  
    542542        return;
    543543
    544     m_pPropertiesDialog = new UIPropertiesDialog();
     544    m_pPropertiesDialog = new UIPropertiesDialog(this);
    545545    if (!m_pPropertiesDialog)
    546546        return;
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlTreeItem.cpp

    r77584 r77647  
    1717
    1818/* GUI includes: */
     19#include "UIConverter.h"
    1920#include "UIExtraDataManager.h"
    2021#include "UIGuestControlTreeItem.h"
     22#include "UIGuestProcessControlWidget.h"
    2123#include "VBoxGlobal.h"
    2224
     
    2628#include "CGuestProcessStateChangedEvent.h"
    2729#include "CGuestSessionStateChangedEvent.h"
    28 
    29 
    30 QString sessionStatusString(KGuestSessionStatus status)
    31 {
    32     QString statusString;
    33     switch (status)
    34     {
    35         case KGuestSessionStatus_Undefined:
    36             statusString = "Undefined";
    37             break;
    38         case KGuestSessionStatus_Starting:
    39             statusString = "Starting";
    40             break;
    41         case KGuestSessionStatus_Started:
    42             statusString = "Started";
    43             break;
    44         case KGuestSessionStatus_Terminating:
    45             statusString = "Terminating";
    46             break;
    47         case KGuestSessionStatus_Terminated:
    48             statusString = "Terminated";
    49             break;
    50         case KGuestSessionStatus_TimedOutKilled:
    51             statusString = "TimedOutKilled";
    52             break;
    53         case KGuestSessionStatus_TimedOutAbnormally:
    54             statusString = "TimedOutAbnormally";
    55             break;
    56         case KGuestSessionStatus_Down:
    57             statusString = "Down";
    58             break;
    59         case KGuestSessionStatus_Error:
    60             statusString = "Error";
    61             break;
    62         default:
    63             statusString = "Undefined";
    64             break;
    65     }
    66     return statusString;
    67 }
    68 
    69 QString processStatusString(KProcessStatus status)
    70 {
    71     QString statusString;
    72     switch (status)
    73     {
    74         case KProcessStatus_Undefined:
    75             statusString = "Undefined";
    76             break;
    77         case KProcessStatus_Starting:
    78             statusString = "Starting";
    79             break;
    80         case KProcessStatus_Started:
    81             statusString = "Started";
    82             break;
    83         case KProcessStatus_Paused:
    84             statusString = "Terminating";
    85             break;
    86         case KProcessStatus_Terminating:
    87             statusString = "Terminating";
    88             break;
    89         case KProcessStatus_TerminatedNormally:
    90             statusString = "TerminatedNormally";
    91             break;
    92         case KProcessStatus_TerminatedSignal:
    93             statusString = "TerminatedSignal";
    94             break;
    95         case KProcessStatus_TerminatedAbnormally:
    96             statusString = "TerminatedAbnormally";
    97             break;
    98         case KProcessStatus_TimedOutKilled:
    99             statusString = "TimedOutKilled";
    100             break;
    101         case KProcessStatus_TimedOutAbnormally:
    102             statusString = "TimedOutAbnormally";
    103             break;
    104         case KProcessStatus_Down:
    105             statusString = "Down";
    106             break;
    107         case KProcessStatus_Error:
    108             statusString = "Error";
    109             break;
    110         default:
    111             break;
    112     }
    113     return statusString;
    114 }
    11530
    11631
     
    247162        return;
    248163    QVector<CGuestProcess> processes = m_comGuestSession.GetProcesses();
     164    printf("processes # %d\n", processes.size());
    249165    for (int  i =0; i < processes.size(); ++i)
    250166        addGuestProcess(processes[i]);
     
    267183void UIGuestSessionTreeItem::sltGuestProcessRegistered(CGuestProcess guestProcess)
    268184{
     185    const ULONG waitTimeout = 2000;
     186    KProcessWaitResult waitResult = guestProcess.WaitFor(KProcessWaitForFlag_Start, waitTimeout);
     187    if (waitResult != KProcessWaitResult_Start)
     188    {
     189        return ;
     190    }
     191
    269192    if (!guestProcess.isOk())
    270193        return;
     
    285208    connect(newItem, &UIGuestProcessTreeItem::sigGuestProcessErrorText,
    286209            this, &UIGuestSessionTreeItem::sigGuestSessionErrorText);
     210    setExpanded(true);
    287211}
    288212
     
    292216}
    293217
     218KGuestSessionStatus UIGuestSessionTreeItem::status() const
     219{
     220    if (!m_comGuestSession.isOk())
     221        return KGuestSessionStatus_Undefined;
     222    return m_comGuestSession.GetStatus();
     223}
     224
     225QString UIGuestSessionTreeItem::propertyString() const
     226{
     227    QString strProperty;
     228    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Session Name")).arg(m_comGuestSession.GetName());
     229    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Session Id")).arg(m_comGuestSession.GetId());
     230    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Session Status")).arg(gpConverter->toInternalString(m_comGuestSession.GetStatus()));
     231    return strProperty;
     232}
     233
    294234void UIGuestSessionTreeItem::sltGuestProcessUnregistered(CGuestProcess guestProcess)
    295235{
     236    if (!UIGuestProcessControlWidget::m_fDeleteAfterUnregister)
     237        return;
    296238    for (int i = 0; i < childCount(); ++i)
    297239    {
     
    311253    setText(0, QString("%1").arg(m_comGuestSession.GetId()));
    312254    setText(1, QString("%1").arg(m_comGuestSession.GetName()));
    313     setText(2, QString("%1").arg(sessionStatusString(m_comGuestSession.GetStatus())));
     255    setText(2, QString("%1").arg(gpConverter->toInternalString(m_comGuestSession.GetStatus())));
    314256}
    315257
     
    346288}
    347289
     290KProcessStatus UIGuestProcessTreeItem::status() const
     291{
     292    if (!m_comGuestProcess.isOk())
     293        return KProcessStatus_Undefined;
     294    return m_comGuestProcess.GetStatus();
     295}
     296
     297QString UIGuestProcessTreeItem::propertyString() const
     298{
     299    QString strProperty;
     300    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Process Name")).arg(m_comGuestProcess.GetName());
     301    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Process Id")).arg(m_comGuestProcess.GetPID());
     302    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Process Status")).arg(gpConverter->toInternalString(m_comGuestProcess.GetStatus()));
     303    strProperty += QString("<b>%1: </b>%2<br/>").arg(tr("Executable Path")).arg(m_comGuestProcess.GetExecutablePath());
     304    return strProperty;
     305}
     306
    348307void UIGuestProcessTreeItem::prepareListener()
    349308{
     
    355314}
    356315
    357 
    358316void UIGuestProcessTreeItem::cleanupListener()
    359317{
     
    376334        processStatus !=  KProcessStatus_Paused)
    377335    {
    378         this->deleteLater();
     336        if (UIGuestProcessControlWidget::m_fDeleteAfterUnregister)
     337            this->deleteLater();
    379338    }
    380339}
     
    384343    if (!m_comGuestProcess.isOk())
    385344        return;
    386     setText(0, QString("PID: %1").arg(m_comGuestProcess.GetPID()));
    387     setText(1, QString("Process Name: %1").arg(m_comGuestProcess.GetName()));
    388     setText(2, QString("Process Status: %1").arg(processStatusString(m_comGuestProcess.GetStatus())));
    389 
     345    setText(0, QString("%1").arg(m_comGuestProcess.GetPID()));
     346    setText(1, QString("%1").arg(m_comGuestProcess.GetExecutablePath()));
     347    setText(2, QString("%1").arg(gpConverter->toInternalString(m_comGuestProcess.GetStatus())));
    390348}
    391349
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestControlTreeItem.h

    r77528 r77647  
    2727
    2828/* COM includes: */
     29#include "COMEnums.h"
    2930#include "CEventListener.h"
    3031#include "CGuestSession.h"
     
    4748    UIGuestControlTreeItem(UIGuestControlTreeItem *pTreeWidgetItem, const QStringList &strings = QStringList());
    4849    virtual ~UIGuestControlTreeItem();
     50    virtual QString propertyString() const = 0;
    4951
    5052private slots:
     
    8890    const CGuestSession& guestSession() const;
    8991    void errorString(QString strError);
     92    KGuestSessionStatus status() const;
     93    virtual QString propertyString() const /* override */;
    9094
    9195protected:
     
    128132    const CGuestProcess& guestProcess() const;
    129133    virtual ~UIGuestProcessTreeItem();
    130 
     134    KProcessStatus status() const;
     135    virtual QString propertyString() const /* override */;
    131136
    132137protected:
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestProcessControlDialog.cpp

    r77584 r77647  
    8383{
    8484    /* Create widget: */
    85     UIGuestProcessControlWidget *pWidget = new UIGuestProcessControlWidget(EmbedTo_Dialog, m_comGuest, this);
     85    UIGuestProcessControlWidget *pWidget = new UIGuestProcessControlWidget(EmbedTo_Dialog, m_comGuest, this, m_strMachineName);
    8686
    8787    if (pWidget)
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestProcessControlWidget.cpp

    r77584 r77647  
    2323
    2424/* GUI includes: */
    25 #include "QITreeWidget.h"
     25#include "QIDialog.h"
     26#include "QIDialogButtonBox.h"
    2627#include "UIExtraDataManager.h"
    2728#include "UIGuestControlConsole.h"
     
    3839#include "CEventSource.h"
    3940
     41const bool UIGuestProcessControlWidget::m_fDeleteAfterUnregister = false;
     42
     43/** A QIDialog child to display properties of a guest session on process. */
     44class UISessionProcessPropertiesDialog : public QIDialog
     45{
     46
     47    Q_OBJECT;
     48
     49public:
     50
     51    UISessionProcessPropertiesDialog(QWidget *pParent = 0, Qt::WindowFlags flags = 0);
     52    void setPropertyText(const QString &strProperty);
     53
     54private:
     55
     56    QVBoxLayout *m_pMainLayout;
     57    QTextEdit   *m_pInfoEdit;
     58    QString      m_strProperty;
     59};
     60
     61
     62/*********************************************************************************************************************************
     63*   UIGuestControlTreeWidget definition.                                                                                         *
     64*********************************************************************************************************************************/
    4065
    4166class UIGuestControlTreeWidget : public QITreeWidget
     
    4772
    4873    void sigCloseSessionOrProcess();
     74    void sigShowProperties();
    4975
    5076public:
    5177
    52     UIGuestControlTreeWidget(QWidget *pParent = 0)
    53         :QITreeWidget(pParent)
    54     {
    55         setSelectionMode(QAbstractItemView::SingleSelection);
    56     }
    57 
    58     UIGuestControlTreeItem *selectedItem()
    59     {
    60         QList<QTreeWidgetItem*> selectedList = selectedItems();
    61         if (selectedList.isEmpty())
    62             return 0;
    63         UIGuestControlTreeItem *item =
    64             dynamic_cast<UIGuestControlTreeItem*>(selectedList[0]);
    65         /* Return the firstof the selected items */
    66         return item;
    67     }
     78    UIGuestControlTreeWidget(QWidget *pParent = 0);
     79    UIGuestControlTreeItem *selectedItem();
    6880
    6981protected:
    7082
    71     void contextMenuEvent(QContextMenuEvent *pEvent) /* override */
    72     {
    73         QMenu *menu = new QMenu(this);
    74         QList<QTreeWidgetItem *> selectedList = selectedItems();
    75 
    76         UIGuestSessionTreeItem *sessionTreeItem = 0;
    77         if (!selectedList.isEmpty())
    78             sessionTreeItem = dynamic_cast<UIGuestSessionTreeItem*>(selectedList[0]);
    79         QAction *pSessionCloseAction = 0;
    80 
    81         /* Create a guest session related context menu */
    82         if (sessionTreeItem)
     83    void contextMenuEvent(QContextMenuEvent *pEvent) /* override */;
     84
     85private slots:
     86
     87    void sltExpandAll();
     88    void sltCollapseAll();
     89    void sltRemoveAllTerminateSessionsProcesses();
     90
     91private:
     92
     93    void expandCollapseAll(bool bFlag);
     94};
     95
     96
     97/*********************************************************************************************************************************
     98*   UISessionProcessPropertiesDialog implementation.                                                                             *
     99*********************************************************************************************************************************/
     100
     101UISessionProcessPropertiesDialog::UISessionProcessPropertiesDialog(QWidget *pParent /* = 0 */, Qt::WindowFlags flags /*= 0 */)
     102    :QIDialog(pParent, flags)
     103    , m_pMainLayout(new QVBoxLayout)
     104    , m_pInfoEdit(new QTextEdit)
     105{
     106    setLayout(m_pMainLayout);
     107
     108    if (m_pMainLayout)
     109        m_pMainLayout->addWidget(m_pInfoEdit);
     110    if (m_pInfoEdit)
     111    {
     112        m_pInfoEdit->setReadOnly(true);
     113        m_pInfoEdit->setFrameStyle(QFrame::NoFrame);
     114    }
     115    QIDialogButtonBox *pButtonBox =
     116        new QIDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, this);
     117    m_pMainLayout->addWidget(pButtonBox);
     118    connect(pButtonBox, &QIDialogButtonBox::accepted, this, &UISessionProcessPropertiesDialog::accept);
     119}
     120
     121void  UISessionProcessPropertiesDialog::setPropertyText(const QString &strProperty)
     122{
     123    if (!m_pInfoEdit)
     124        return;
     125    m_strProperty = strProperty;
     126    m_pInfoEdit->setHtml(strProperty);
     127}
     128
     129
     130/*********************************************************************************************************************************
     131*   UIGuestControlTreeWidget implementation.                                                                                     *
     132*********************************************************************************************************************************/
     133
     134UIGuestControlTreeWidget::UIGuestControlTreeWidget(QWidget *pParent /* = 0 */)
     135    :QITreeWidget(pParent)
     136{
     137    setSelectionMode(QAbstractItemView::SingleSelection);
     138}
     139
     140UIGuestControlTreeItem *UIGuestControlTreeWidget::selectedItem()
     141{
     142    QList<QTreeWidgetItem*> selectedList = selectedItems();
     143    if (selectedList.isEmpty())
     144        return 0;
     145    UIGuestControlTreeItem *item =
     146        dynamic_cast<UIGuestControlTreeItem*>(selectedList[0]);
     147    /* Return the firstof the selected items */
     148    return item;
     149}
     150
     151void UIGuestControlTreeWidget::contextMenuEvent(QContextMenuEvent *pEvent) /* override */
     152{
     153    QMenu menu(this);
     154    QList<QTreeWidgetItem *> selectedList = selectedItems();
     155
     156    UIGuestSessionTreeItem *sessionTreeItem = 0;
     157    if (!selectedList.isEmpty())
     158        sessionTreeItem = dynamic_cast<UIGuestSessionTreeItem*>(selectedList[0]);
     159    QAction *pSessionCloseAction = 0;
     160    bool fHasAnyItems = topLevelItemCount() != 0;
     161    /* Create a guest session related context menu */
     162    if (sessionTreeItem)
     163    {
     164        pSessionCloseAction = menu.addAction(tr("Terminate Session"));
     165        if (pSessionCloseAction)
     166            connect(pSessionCloseAction, &QAction::triggered,
     167                    this, &UIGuestControlTreeWidget::sigCloseSessionOrProcess);
     168    }
     169    UIGuestProcessTreeItem *processTreeItem = 0;
     170    if (!selectedList.isEmpty())
     171        processTreeItem = dynamic_cast<UIGuestProcessTreeItem*>(selectedList[0]);
     172    QAction *pProcessTerminateAction = 0;
     173    if (processTreeItem)
     174    {
     175        pProcessTerminateAction = menu.addAction(tr("Terminate Process"));
     176        if (pProcessTerminateAction)
    83177        {
    84             pSessionCloseAction = menu->addAction(tr("Close Session"));
    85             if (pSessionCloseAction)
    86                 connect(pSessionCloseAction, &QAction::triggered,
    87                         this, &UIGuestControlTreeWidget::sigCloseSessionOrProcess);
     178            connect(pProcessTerminateAction, &QAction::triggered,
     179                    this, &UIGuestControlTreeWidget::sigCloseSessionOrProcess);
     180            pProcessTerminateAction->setIcon(UIIconPool::iconSet(":/file_manager_delete_16px.png"));
    88181        }
    89         UIGuestProcessTreeItem *processTreeItem = 0;
    90         if (!selectedList.isEmpty())
    91             processTreeItem = dynamic_cast<UIGuestProcessTreeItem*>(selectedList[0]);
    92         QAction *pProcessTerminateAction = 0;
    93         if (processTreeItem)
     182    }
     183    if (pProcessTerminateAction || pSessionCloseAction)
     184        menu.addSeparator();
     185
     186    QAction *pRemoveAllTerminated = menu.addAction(tr("Remove All Terminated Sessions/Processes"));
     187    if (pRemoveAllTerminated)
     188    {
     189
     190        pRemoveAllTerminated->setEnabled(fHasAnyItems);
     191        pRemoveAllTerminated->setIcon(UIIconPool::iconSet(":/state_aborted_16px.png"));
     192
     193        connect(pRemoveAllTerminated, &QAction::triggered,
     194                this, &UIGuestControlTreeWidget::sltRemoveAllTerminateSessionsProcesses);
     195    }
     196
     197    // Add actions to expand/collapse all tree items
     198    QAction *pExpandAllAction = menu.addAction(tr("Expand All"));
     199    if (pExpandAllAction)
     200    {
     201        pExpandAllAction->setIcon(UIIconPool::iconSet(":/expand_all_16px.png"));
     202        connect(pExpandAllAction, &QAction::triggered,
     203                this, &UIGuestControlTreeWidget::sltExpandAll);
     204    }
     205
     206    QAction *pCollapseAllAction = menu.addAction(tr("Collapse All"));
     207    if (pCollapseAllAction)
     208    {
     209        pCollapseAllAction->setIcon(UIIconPool::iconSet(":/collapse_all_16px.png"));
     210        connect(pCollapseAllAction, &QAction::triggered,
     211                this, &UIGuestControlTreeWidget::sltCollapseAll);
     212    }
     213    menu.addSeparator();
     214    QAction *pShowPropertiesAction = menu.addAction(tr("Properties"));
     215    if (pShowPropertiesAction)
     216    {
     217        pShowPropertiesAction->setIcon(UIIconPool::iconSet(":/file_manager_properties_16px.png"));
     218        pShowPropertiesAction->setEnabled(fHasAnyItems);
     219        connect(pShowPropertiesAction, &QAction::triggered,
     220                this, &UIGuestControlTreeWidget::sigShowProperties);
     221    }
     222
     223    menu.exec(pEvent->globalPos());
     224}
     225
     226void UIGuestControlTreeWidget::sltExpandAll()
     227{
     228    expandCollapseAll(true);
     229}
     230
     231void UIGuestControlTreeWidget::sltCollapseAll()
     232{
     233    expandCollapseAll(false);
     234}
     235
     236void UIGuestControlTreeWidget::sltRemoveAllTerminateSessionsProcesses()
     237{
     238    for (int i = 0; i < topLevelItemCount(); ++i)
     239    {
     240        if (!topLevelItem(i))
     241            break;
     242        UIGuestSessionTreeItem *pSessionItem = dynamic_cast<UIGuestSessionTreeItem*>(topLevelItem(i));
     243
     244        if (!pSessionItem)
     245            continue;
     246
     247        if (pSessionItem->status() != KGuestSessionStatus_Starting &&
     248            pSessionItem->status() != KGuestSessionStatus_Started)
    94249        {
    95             pProcessTerminateAction = menu->addAction(tr("Terminate Process"));
    96             if (pProcessTerminateAction)
    97                 connect(pProcessTerminateAction, &QAction::triggered,
    98                         this, &UIGuestControlTreeWidget::sigCloseSessionOrProcess);
     250            delete pSessionItem;
     251            continue;
    99252        }
    100         if (pProcessTerminateAction || pSessionCloseAction)
    101             menu->addSeparator();
    102         // Add actions to expand/collapse all tree items
    103         QAction *pExpandAllAction = menu->addAction(tr("Expand All"));
    104         if (pExpandAllAction)
     253
     254        for (int j = 0; j < topLevelItem(i)->childCount(); ++j)
    105255        {
    106             pExpandAllAction->setIcon(UIIconPool::iconSet(":/expand_all_16px.png"));
    107             connect(pExpandAllAction, &QAction::triggered,
    108                     this, &UIGuestControlTreeWidget::sltExpandAll);
    109         }
    110 
    111         QAction *pCollapseAllAction = menu->addAction(tr("Collapse All"));
    112         if (pCollapseAllAction)
    113         {
    114             pCollapseAllAction->setIcon(UIIconPool::iconSet(":/collapse_all_16px.png"));
    115             connect(pCollapseAllAction, &QAction::triggered,
    116                     this, &UIGuestControlTreeWidget::sltCollapseAll);
    117         }
    118         menu->exec(pEvent->globalPos());
    119 
    120         if (pSessionCloseAction)
    121             disconnect(pSessionCloseAction, &QAction::triggered,
    122                        this, &UIGuestControlTreeWidget::sigCloseSessionOrProcess);
    123         if (pProcessTerminateAction)
    124             disconnect(pProcessTerminateAction, &QAction::triggered,
    125                        this, &UIGuestControlTreeWidget::sigCloseSessionOrProcess);
    126 
    127         if (pExpandAllAction)
    128             disconnect(pExpandAllAction, &QAction::triggered,
    129                     this, &UIGuestControlTreeWidget::sltExpandAll);
    130 
    131         if (pCollapseAllAction)
    132             disconnect(pCollapseAllAction, &QAction::triggered,
    133                     this, &UIGuestControlTreeWidget::sltCollapseAll);
    134 
    135         delete menu;
    136     }
    137 
    138 private slots:
    139 
    140     void sltExpandAll()
    141     {
    142         expandCollapseAll(true);
    143     }
    144 
    145     void sltCollapseAll()
    146     {
    147         expandCollapseAll(false);
    148     }
    149 
    150     void expandCollapseAll(bool bFlag)
    151     {
    152         for (int i = 0; i < topLevelItemCount(); ++i)
    153         {
    154             if (!topLevelItem(i))
    155                 break;
    156             topLevelItem(i)->setExpanded(bFlag);
    157             for (int j = 0; j < topLevelItem(i)->childCount(); ++j)
     256            UIGuestProcessTreeItem *pProcessItem = dynamic_cast<UIGuestProcessTreeItem*>(topLevelItem(i)->child(j));
     257
     258            if (pProcessItem)
    158259            {
    159                 if (topLevelItem(i)->child(j))
    160                 {
    161                     topLevelItem(i)->child(j)->setExpanded(bFlag);
    162                 }
     260                if (pProcessItem->status() != KProcessStatus_Starting &&
     261                    pProcessItem->status() != KProcessStatus_Started)
     262                    delete pProcessItem;
    163263            }
    164264        }
    165265    }
    166 };
     266
     267}
     268
     269void UIGuestControlTreeWidget::expandCollapseAll(bool bFlag)
     270{
     271    for (int i = 0; i < topLevelItemCount(); ++i)
     272    {
     273        if (!topLevelItem(i))
     274            break;
     275        topLevelItem(i)->setExpanded(bFlag);
     276        for (int j = 0; j < topLevelItem(i)->childCount(); ++j)
     277        {
     278            if (topLevelItem(i)->child(j))
     279            {
     280                topLevelItem(i)->child(j)->setExpanded(bFlag);
     281            }
     282        }
     283    }
     284}
     285
     286
     287/*********************************************************************************************************************************
     288*   UIGuestProcessControlWidget implementation.                                                                                  *
     289*********************************************************************************************************************************/
    167290
    168291UIGuestProcessControlWidget::UIGuestProcessControlWidget(EmbedTo enmEmbedding, const CGuest &comGuest,
    169                                                          QWidget *pParent, bool fShowToolbar /* = false */)
     292                                                         QWidget *pParent, QString strMachineName /* = QString()*/,
     293                                                         bool fShowToolbar /* = false */)
    170294    :QIWithRetranslateUI<QWidget>(pParent)
    171295    , m_comGuest(comGuest)
     
    179303    , m_pQtListener(0)
    180304    , m_fShowToolbar(fShowToolbar)
    181     , m_fDeleteAfterSessionUnregister(false)
     305    , m_strMachineName(strMachineName)
    182306{
    183307    prepareListener();
     
    200324    {
    201325        QStringList labels;
    202         labels << tr("Session ID") << tr("Session Name") << tr("Session Status");
     326        labels << tr("Session/Process ID") << tr("Session Name/Process Command") << tr("Session/Process Status");
    203327        m_pTreeWidget->setHeaderLabels(labels);
    204328    }
     
    273397
    274398    if (m_pTreeWidget)
     399    {
    275400        connect(m_pTreeWidget, &UIGuestControlTreeWidget::sigCloseSessionOrProcess,
    276401                this, &UIGuestProcessControlWidget::sltCloseSessionOrProcess);
     402        connect(m_pTreeWidget, &UIGuestControlTreeWidget::sigShowProperties,
     403                this, &UIGuestProcessControlWidget::sltShowProperties);
     404    }
    277405
    278406    if (m_pQtListener)
     
    333461        return;
    334462    guestSession.Close();
     463}
     464
     465void UIGuestProcessControlWidget::sltShowProperties()
     466{
     467    UIGuestControlTreeItem *pItem = m_pTreeWidget->selectedItem();
     468    if (!pItem)
     469        return;
     470
     471    UISessionProcessPropertiesDialog *pPropertiesDialog = new UISessionProcessPropertiesDialog(this);
     472    if (!m_strMachineName.isEmpty())
     473    {
     474        pPropertiesDialog->setWindowTitle(m_strMachineName);
     475    }
     476    if (!pPropertiesDialog)
     477        return;
     478
     479    pPropertiesDialog->setPropertyText(pItem->propertyString());
     480    pPropertiesDialog->exec();
     481
     482    delete pPropertiesDialog;
    335483}
    336484
     
    477625        }
    478626    }
    479     if (m_fDeleteAfterSessionUnregister)
     627    if (m_fDeleteAfterUnregister)
    480628        delete selectedItem;
    481629}
  • trunk/src/VBox/Frontends/VirtualBox/src/guestctrl/UIGuestProcessControlWidget.h

    r77584 r77647  
    5353public:
    5454
    55     UIGuestProcessControlWidget(EmbedTo enmEmbedding, const CGuest &comGuest, QWidget *pParent, bool fShowToolbar = false);
     55    UIGuestProcessControlWidget(EmbedTo enmEmbedding, const CGuest &comGuest, QWidget *pParent,
     56                                QString strMachineName = QString(), bool fShowToolbar = false);
    5657    ~UIGuestProcessControlWidget();
     58    /** When true we delete the corresponding tree item as soon as the guest session/process is unregistered. */
     59    static const bool           m_fDeleteAfterUnregister;
    5760
    5861protected:
     
    6568    void sltConsoleCommandEntered(const QString &strCommand);
    6669    void sltConsoleOutputReceived(const QString &strOutput);
    67 
    6870    void sltGuestSessionRegistered(CGuestSession guestSession);
    6971    void sltGuestSessionUnregistered(CGuestSession guestSession);
    7072    void sltGuestControlErrorText(QString strError);
    71 
    7273    void sltTreeItemUpdated();
    7374    void sltCloseSessionOrProcess();
     75    void sltShowProperties();
    7476
    7577private:
     
    100102    CEventListener m_comEventListener;
    101103    const bool     m_fShowToolbar;
    102     /** When true we delete the corresponding tree item as soon as the guest session is unregistered. */
    103     bool           m_fDeleteAfterSessionUnregister;
     104    QString        m_strMachineName;
    104105};
    105106
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/UIVMInformationDialog.cpp

    r77594 r77647  
    239239            m_pTabWidget->addTab(m_tabs.value(1), QString());
    240240        }
    241 
     241        QString strMachineName;
     242        if (m_pMachineWindow && m_pMachineWindow->console().isOk())
     243        {
     244            CMachine comMachine = m_pMachineWindow->console().GetMachine();
     245            if (comMachine.isOk())
     246                strMachineName = comMachine.GetName();
     247        }
    242248        UIGuestProcessControlWidget *pGuestProcessControlWidget =
    243             new UIGuestProcessControlWidget(EmbedTo_Dialog, m_pMachineWindow->console().GetGuest(), this, false /* fShowToolbar */);
     249            new UIGuestProcessControlWidget(EmbedTo_Dialog, m_pMachineWindow->console().GetGuest(),
     250                                            this, strMachineName, false /* fShowToolbar */);
    244251
    245252        if (pGuestProcessControlWidget)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette