VirtualBox

Changeset 14019 in vbox


Ignore:
Timestamp:
Nov 10, 2008 4:28:45 PM (16 years ago)
Author:
vboxsync
Message:

FE/Qt4: Cumulative fix for VBoxSelectorWnd & VBoxVMListView: minor fixes for system-tray feature (coding style, correct callers) & fix for context-menu request feature (correct policy and invoke method used).

Location:
trunk/src/VBox/Frontends/VirtualBox4
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSelectorWnd.h

    r13790 r14019  
    5050class QEvent;
    5151
    52 class VBoxSelectorWnd: public QIWithRetranslateUI2<QMainWindow>
     52class VBoxSelectorWnd: public QIWithRetranslateUI2 <QMainWindow>
    5353{
    5454    Q_OBJECT;
     
    7272    VBoxVMItem* getSelectedItem();
    7373#ifdef VBOX_GUI_WITH_SYSTRAY
    74     void iconActivated(QSystemTrayIcon::ActivationReason aReason);
     74    void iconActivated (QSystemTrayIcon::ActivationReason aReason);
    7575    void showWindow();
    7676#endif
     
    8181    void vmSettings (const QString &aCategory = QString::null,
    8282                     const QString &aControl = QString::null,
    83                      const QUuid& = "");
    84     void vmDelete(const QUuid& = "");
    85     void vmStart (const QUuid& = "");
    86     void vmDiscard(const QUuid& = "");
    87     void vmPause (bool, const QUuid& = "");
    88     void vmRefresh(const QUuid& = "");
    89     void vmShowLogs(const QUuid& = "");
     83                     const QUuid &aMachineId = QUuid());
     84    void vmDelete (const QUuid &aMachineId = QUuid());
     85    void vmStart (const QUuid &aMachineId = QUuid());
     86    void vmDiscard (const QUuid &aMachineId = QUuid());
     87    void vmPause (bool, const QUuid &aMachineId = QUuid());
     88    void vmRefresh (const QUuid &aMachineId = QUuid());
     89    void vmShowLogs (const QUuid &aMachineId = QUuid());
    9090
    9191#ifdef VBOX_GUI_WITH_SYSTRAY
     
    9797                                          bool aDescription);
    9898
    99     void showContextMenu (VBoxVMItem *aItem, const QPoint &aPoint);
     99    void showContextMenu (const QPoint &aPoint);
    100100
    101101protected:
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxVMListView.h

    r13790 r14019  
    3131#include <QDateTime>
    3232
     33class VBoxSelectorWnd;
     34
    3335class VBoxVMItem : public QObject
    3436{
     
    5052public:
    5153
    52     VBoxVMItem (const CMachine &aM, QObject* pParent);
     54    VBoxVMItem (const CMachine &aMachine, VBoxSelectorWnd *pParent);
    5355    virtual ~VBoxVMItem();
    5456
     
    8587    bool canSwitchTo() const;
    8688    bool switchTo();
    87    
     89
    8890    void updateActions();
    8991
     
    9193
    9294    /* Private member vars */
    93     QObject* mParent;
     95    VBoxSelectorWnd *mParent;
    9496    CMachine mMachine;
    9597
     
    200202    void currentChanged();
    201203    void activated();
    202     void contextMenuRequested (VBoxVMItem *aItem, const QPoint &aPoint);
    203204
    204205protected slots:
     
    208209
    209210protected:
    210     void mousePressEvent (QMouseEvent *aEvent);
    211211    bool selectCurrent();
    212212};
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSelectorWnd.cpp

    r14018 r14019  
    670670    connect (mVMListView, SIGNAL (currentChanged()),
    671671             this, SLOT (vmListViewCurrentChanged()));
    672     connect (mVMListView, SIGNAL (activated ()),
     672    connect (mVMListView, SIGNAL (activated()),
    673673             this, SLOT (vmStart()));
    674     connect (mVMListView, SIGNAL (contextMenuRequested (VBoxVMItem *, const QPoint &)),
    675              this, SLOT (showContextMenu (VBoxVMItem *, const QPoint &)));
     674    connect (mVMListView, SIGNAL (customContextMenuRequested (const QPoint &)),
     675             this, SLOT (showContextMenu (const QPoint &)));
    676676
    677677    connect (vmDetailsView, SIGNAL (linkClicked (const QString &)),
     
    836836 *  Opens the VM settings dialog.
    837837 */
    838 void VBoxSelectorWnd::vmSettings (const QString &aCategory, const QString &aControl, const QUuid& a_Uuid)
     838void VBoxSelectorWnd::vmSettings (const QString &aCategory, const QString &aControl, const QUuid& aUuid)
    839839{
    840840    if (!aCategory.isEmpty() && aCategory [0] != '#')
     
    845845    }
    846846
    847     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     847    VBoxVMItem *item = mVMModel->itemById (aUuid);
    848848    if (NULL == item)
    849849        item = getSelectedItem();
     
    888888}
    889889
    890 void VBoxSelectorWnd::vmDelete(const QUuid& a_Uuid)
    891 {
    892     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     890void VBoxSelectorWnd::vmDelete (const QUuid& aUuid)
     891{
     892    VBoxVMItem *item = mVMModel->itemById (aUuid);
    893893    if (NULL == item)
    894894        item = getSelectedItem();
     
    950950}
    951951
    952 void VBoxSelectorWnd::vmStart(const QUuid& a_Uuid)
    953 {
    954     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     952void VBoxSelectorWnd::vmStart (const QUuid& aUuid)
     953{
     954    VBoxVMItem *item = mVMModel->itemById (aUuid);
    955955    if (NULL == item)
    956956        item = getSelectedItem();
     
    10291029}
    10301030
    1031 void VBoxSelectorWnd::vmDiscard(const QUuid& a_Uuid)
    1032 {
    1033     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     1031void VBoxSelectorWnd::vmDiscard (const QUuid& aUuid)
     1032{
     1033    VBoxVMItem *item = mVMModel->itemById (aUuid);
    10341034    if (NULL == item)
    10351035        item = getSelectedItem();
     
    10651065}
    10661066
    1067 void VBoxSelectorWnd::vmPause (bool aPause, const QUuid& a_Uuid)
    1068 {
    1069     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     1067void VBoxSelectorWnd::vmPause (bool aPause, const QUuid& aUuid)
     1068{
     1069    VBoxVMItem *item = mVMModel->itemById (aUuid);
    10701070    if (NULL == item)
    10711071        item = getSelectedItem();
     
    10981098}
    10991099
    1100 void VBoxSelectorWnd::vmRefresh(const QUuid& a_Uuid)
    1101 {
    1102     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     1100void VBoxSelectorWnd::vmRefresh (const QUuid& aUuid)
     1101{
     1102    VBoxVMItem *item = mVMModel->itemById (aUuid);
    11031103    if (NULL == item)
    11041104        item = getSelectedItem();
     
    11121112}
    11131113
    1114 void VBoxSelectorWnd::vmShowLogs(const QUuid& a_Uuid)
    1115 {
    1116     VBoxVMItem *item = mVMModel->itemById (a_Uuid);
     1114void VBoxSelectorWnd::vmShowLogs (const QUuid& aUuid)
     1115{
     1116    VBoxVMItem *item = mVMModel->itemById (aUuid);
    11171117    if (NULL == item)
    11181118        item = getSelectedItem();
     
    12201220}
    12211221
    1222 void VBoxSelectorWnd::showContextMenu (VBoxVMItem *aItem, const QPoint &aPoint)
    1223 {
    1224     if (aItem)
    1225         mVMCtxtMenu->exec (aPoint);
     1222void VBoxSelectorWnd::showContextMenu (const QPoint &aPoint)
     1223{
     1224    /* Send a context menu request */
     1225    const QModelIndex &index = mVMListView->indexAt (aPoint);
     1226    if (index.isValid())
     1227        if (VBoxVMItem *item = mVMListView->model()->data (index,
     1228            VBoxVMModel::VBoxVMItemPtrRole).value <VBoxVMItem*>())
     1229                mVMCtxtMenu->exec (mVMListView->mapToGlobal (aPoint));
    12261230}
    12271231
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxVMListView.cpp

    r13803 r14019  
    135135#endif
    136136
    137 VBoxVMItem::VBoxVMItem (const CMachine &aM, QObject* pParent)
    138     : mParent(pParent), mMachine (aM)
     137VBoxVMItem::VBoxVMItem (const CMachine &aMachine, VBoxSelectorWnd *pParent)
     138    : mParent (pParent), mMachine (aMachine)
    139139{
    140140    vmConfigAction = new QAction (this);
    141141    vmConfigAction->setIcon (VBoxGlobal::iconSetFull (
    142           QSize (32, 32), QSize (16, 16),
    143           ":/vm_settings_32px.png", ":/settings_16px.png",
    144           ":/vm_settings_disabled_32px.png", ":/settings_dis_16px.png"));
     142        QSize (32, 32), QSize (16, 16),
     143        ":/vm_settings_32px.png", ":/settings_16px.png",
     144        ":/vm_settings_disabled_32px.png", ":/settings_dis_16px.png"));
    145145    vmDeleteAction = new QAction (this);
    146146    vmDeleteAction->setIcon (VBoxGlobal::iconSetFull (
    147           QSize (32, 32), QSize (16, 16),
    148           ":/vm_delete_32px.png", ":/delete_16px.png",
    149           ":/vm_delete_disabled_32px.png", ":/delete_dis_16px.png"));
    150      vmStartAction = new QAction (this);
    151      vmStartAction->setIcon (VBoxGlobal::iconSetFull (
    152           QSize (32, 32), QSize (16, 16),
    153           ":/vm_start_32px.png", ":/start_16px.png",
    154           ":/vm_start_disabled_32px.png", ":/start_dis_16px.png"));
     147        QSize (32, 32), QSize (16, 16),
     148        ":/vm_delete_32px.png", ":/delete_16px.png",
     149        ":/vm_delete_disabled_32px.png", ":/delete_dis_16px.png"));
     150    vmStartAction = new QAction (this);
     151    vmStartAction->setIcon (VBoxGlobal::iconSetFull (
     152        QSize (32, 32), QSize (16, 16),
     153        ":/vm_start_32px.png", ":/start_16px.png",
     154        ":/vm_start_disabled_32px.png", ":/start_dis_16px.png"));
    155155    vmDiscardAction = new QAction (this);
    156156    vmDiscardAction->setIcon (VBoxGlobal::iconSetFull (
    157           QSize (32, 32), QSize (16, 16),
    158           ":/vm_discard_32px.png", ":/discard_16px.png",
    159           ":/vm_discard_disabled_32px.png", ":/discard_dis_16px.png"));
     157        QSize (32, 32), QSize (16, 16),
     158        ":/vm_discard_32px.png", ":/discard_16px.png",
     159        ":/vm_discard_disabled_32px.png", ":/discard_dis_16px.png"));
    160160    vmPauseAction = new QAction (this);
    161161    vmPauseAction->setCheckable (true);
    162162    vmPauseAction->setIcon (VBoxGlobal::iconSetFull (
    163           QSize (32, 32), QSize (16, 16),
    164           ":/vm_pause_32px.png", ":/pause_16px.png",
    165           ":/vm_pause_disabled_32px.png", ":/pause_disabled_16px.png"));
     163        QSize (32, 32), QSize (16, 16),
     164        ":/vm_pause_32px.png", ":/pause_16px.png",
     165        ":/vm_pause_disabled_32px.png", ":/pause_disabled_16px.png"));
    166166    vmRefreshAction = new QAction (this);
    167167    vmRefreshAction->setIcon (VBoxGlobal::iconSetFull (
    168           QSize (32, 32), QSize (16, 16),
    169           ":/refresh_32px.png", ":/refresh_16px.png",
    170           ":/refresh_disabled_32px.png", ":/refresh_disabled_16px.png"));
     168        QSize (32, 32), QSize (16, 16),
     169        ":/refresh_32px.png", ":/refresh_16px.png",
     170        ":/refresh_disabled_32px.png", ":/refresh_disabled_16px.png"));
    171171    vmShowLogsAction = new QAction (this);
    172172    vmShowLogsAction->setIcon (VBoxGlobal::iconSetFull (
    173           QSize (32, 32), QSize (16, 16),
    174           ":/vm_show_logs_32px.png", ":/show_logs_16px.png",
    175           ":/vm_show_logs_disabled_32px.png", ":/show_logs_disabled_16px.png"));
     173        QSize (32, 32), QSize (16, 16),
     174        ":/vm_show_logs_32px.png", ":/show_logs_16px.png",
     175        ":/vm_show_logs_disabled_32px.png", ":/show_logs_disabled_16px.png"));
    176176
    177177    recache();
     
    184184    connect (vmRefreshAction, SIGNAL (triggered()), this, SLOT (vmRefresh()));
    185185    connect (vmShowLogsAction, SIGNAL (triggered()), this, SLOT (vmShowLogs()));
    186    
     186
    187187    updateActions();
    188188}
     
    197197QString VBoxVMItem::sessionStateName() const
    198198{
    199     return mAccessible ? vboxGlobal().toString (mState) : VBoxVMListView::tr ("Inaccessible");
     199    return mAccessible ? vboxGlobal().toString (mState) :
     200           VBoxVMListView::tr ("Inaccessible");
    200201}
    201202
    202203void VBoxVMItem::vmSettings()
    203204{
    204     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    205     Assert (pWnd);
    206     emit pWnd->vmSettings(NULL, NULL, mId);
     205    mParent->vmSettings (NULL, NULL, mId);
    207206}
    208207
    209208void VBoxVMItem::vmDelete()
    210209{
    211     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    212     Assert (pWnd);
    213     emit pWnd->vmDelete(mId);
     210    mParent->vmDelete (mId);
    214211}
    215212
    216213void VBoxVMItem::vmStart()
    217214{
    218     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    219     Assert (pWnd);
    220     emit pWnd->vmStart(mId);
     215    mParent->vmStart (mId);
    221216}
    222217
    223218void VBoxVMItem::vmDiscard()
    224219{
    225     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    226     Assert (pWnd);
    227     emit pWnd->vmDiscard(mId);
    228 }
    229 
    230 void VBoxVMItem::vmPause(bool aPause)
    231 {
    232     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    233     Assert (pWnd);
    234     emit pWnd->vmPause(aPause, mId);
     220    mParent->vmDiscard (mId);
     221}
     222
     223void VBoxVMItem::vmPause (bool aPause)
     224{
     225    mParent->vmPause (aPause, mId);
    235226}
    236227
    237228void VBoxVMItem::vmRefresh()
    238229{
    239     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    240     Assert (pWnd);
    241     emit pWnd->vmRefresh(mId);
     230    mParent->vmRefresh (mId);
    242231}
    243232
    244233void VBoxVMItem::vmShowLogs()
    245234{
    246     VBoxSelectorWnd* pWnd = qobject_cast<VBoxSelectorWnd*>(mParent);
    247     Assert (pWnd);
    248     emit pWnd->vmShowLogs(mId);
     235    mParent->vmShowLogs (mId);
    249236}
    250237
     
    296283    {
    297284        QString name = mMachine.GetName();
    298         setObjectName(name);
     285        setObjectName (name);
    299286        CSnapshot snp = mMachine.GetCurrentSnapshot();
    300287        mSnapshotName = snp.isNull() ? QString::null : snp.GetName();
     
    545532    }
    546533    else
    547     {   
    548         vmRefreshAction->setEnabled (true);   
     534    {
     535        vmRefreshAction->setEnabled (true);
    549536
    550537        /* disable modify actions */
     
    563550        vmShowLogsAction->setEnabled (false);
    564551    }
    565      
     552
    566553    vmConfigAction->setText (tr ("&Settings..."));
    567554    vmConfigAction->setStatusTip (tr ("Configure the selected virtual machine"));
    568    
     555
    569556    vmDeleteAction->setText (tr ("&Delete"));
    570557    vmDeleteAction->setStatusTip (tr ("Delete the selected virtual machine"));
    571    
     558
    572559    vmDiscardAction->setText (tr ("D&iscard"));
    573560    vmDiscardAction->setStatusTip (
    574561        tr ("Discard the saved state of the selected virtual machine"));
    575    
     562
    576563    vmRefreshAction->setText (tr ("&Refresh"));
    577564    vmRefreshAction->setStatusTip (
    578565        tr ("Refresh the accessibility state of the selected virtual machine"));
    579    
     566
    580567    vmShowLogsAction->setText (tr ("Show &Log..."));
    581568    vmShowLogsAction->setIconText (tr ("Log", "icon text"));
     
    693680}
    694681
    695 int VBoxVMModel::rowCount(const QModelIndex & /* aParent = QModelIndex() */) const
     682int VBoxVMModel::rowCount (const QModelIndex & /* aParent = QModelIndex() */) const
    696683{
    697684    return mVMItemList.count();
    698685}
    699686
    700 QVariant VBoxVMModel::data(const QModelIndex &aIndex, int aRole) const
     687QVariant VBoxVMModel::data (const QModelIndex &aIndex, int aRole) const
    701688{
    702689    if (!aIndex.isValid())
     
    710697    {
    711698        case Qt::DisplayRole:
    712             {
    713                 v = mVMItemList.at (aIndex.row())->name();
    714                 break;
    715             }
     699        {
     700            v = mVMItemList.at (aIndex.row())->name();
     701            break;
     702        }
    716703        case Qt::DecorationRole:
    717             {
    718                 v = mVMItemList.at (aIndex.row())->osIcon();
    719                 break;
    720             }
     704        {
     705            v = mVMItemList.at (aIndex.row())->osIcon();
     706            break;
     707        }
    721708        case Qt::ToolTipRole:
    722             {
    723                 v = mVMItemList.at (aIndex.row())->toolTipText();
    724                 break;
    725             }
     709        {
     710            v = mVMItemList.at (aIndex.row())->toolTipText();
     711            break;
     712        }
    726713        case Qt::FontRole:
    727             {
    728                 QFont f = qApp->font();
    729                 f.setPointSize (f.pointSize() + 1);
    730                 f.setWeight (QFont::Bold);
    731                 v = f;
    732                 break;
    733             }
     714        {
     715            QFont f = qApp->font();
     716            f.setPointSize (f.pointSize() + 1);
     717            f.setWeight (QFont::Bold);
     718            v = f;
     719            break;
     720        }
    734721        case Qt::AccessibleTextRole:
    735             {
    736                 VBoxVMItem *item = mVMItemList.at (aIndex.row());
    737                 v = QString ("%1 (%2)\n%3")
    738                              .arg (item->name())
    739                              .arg (item->snapshotName())
    740                              .arg (item->sessionStateName());
    741                 break;
    742             }
     722        {
     723            VBoxVMItem *item = mVMItemList.at (aIndex.row());
     724            v = QString ("%1 (%2)\n%3")
     725                         .arg (item->name())
     726                         .arg (item->snapshotName())
     727                         .arg (item->sessionStateName());
     728            break;
     729        }
    743730        case SnapShotDisplayRole:
    744             {
    745                 v = mVMItemList.at (aIndex.row())->snapshotName();
    746                 break;
    747             }
     731        {
     732            v = mVMItemList.at (aIndex.row())->snapshotName();
     733            break;
     734        }
    748735        case SnapShotFontRole:
    749             {
    750                 QFont f = qApp->font();
    751                 v = f;
    752                 break;
    753             }
     736        {
     737            QFont f = qApp->font();
     738            v = f;
     739            break;
     740        }
    754741        case SessionStateDisplayRole:
    755             {
    756                 v = mVMItemList.at (aIndex.row())->sessionStateName();
    757                 break;
    758             }
     742        {
     743            v = mVMItemList.at (aIndex.row())->sessionStateName();
     744            break;
     745        }
    759746        case SessionStateDecorationRole:
    760             {
    761                 v = mVMItemList.at (aIndex.row())->sessionStateIcon();
    762                 break;
    763             }
     747        {
     748            v = mVMItemList.at (aIndex.row())->sessionStateIcon();
     749            break;
     750        }
    764751        case SessionStateFontRole:
    765             {
    766                 QFont f = qApp->font();
    767                 f.setPointSize (f.pointSize());
    768                 if (mVMItemList.at (aIndex.row())->sessionState() != KSessionState_Closed)
    769                     f.setItalic (true);
    770                 v = f;
    771                 break;
    772             }
     752        {
     753            QFont f = qApp->font();
     754            f.setPointSize (f.pointSize());
     755            if (mVMItemList.at (aIndex.row())->sessionState() != KSessionState_Closed)
     756                f.setItalic (true);
     757            v = f;
     758            break;
     759        }
    773760        case VBoxVMItemPtrRole:
    774             {
    775                 v = qVariantFromValue (mVMItemList.at (aIndex.row()));
    776             }
     761        {
     762            v = qVariantFromValue (mVMItemList.at (aIndex.row()));
     763        }
    777764    }
    778765    return v;
    779766}
    780767
    781 QVariant VBoxVMModel::headerData(int /*aSection*/, Qt::Orientation /*aOrientation*/,
    782                                  int /*aRole = Qt::DisplayRole */) const
     768QVariant VBoxVMModel::headerData (int /*aSection*/, Qt::Orientation /*aOrientation*/,
     769                                  int /*aRole = Qt::DisplayRole */) const
    783770{
    784771    return QVariant();
     
    805792{
    806793    /* Create & set our delegation class */
    807     VBoxVMItemPainter *delegate = new VBoxVMItemPainter(this);
    808     setItemDelegate(delegate);
     794    VBoxVMItemPainter *delegate = new VBoxVMItemPainter (this);
     795    setItemDelegate (delegate);
    809796    /* Default icon size */
    810797    setIconSize (QSize (32, 32));
    811798    /* Publish the activation of items */
    812799    connect (this, SIGNAL (activated (const QModelIndex &)),
    813              this, SIGNAL (activated ()));
     800             this, SIGNAL (activated()));
     801    /* Use the correct policy for the context menu */
     802    setContextMenuPolicy (Qt::CustomContextMenu);
    814803}
    815804
     
    821810void VBoxVMListView::selectItemById (const QUuid &aID)
    822811{
    823     if (VBoxVMModel *m = qobject_cast<VBoxVMModel*> (model()))
     812    if (VBoxVMModel *m = qobject_cast <VBoxVMModel*> (model()))
    824813    {
    825814        QModelIndex i = m->indexById (aID);
     
    832821{
    833822    VBoxVMItem *item = selectedItem();
    834     if(!item)
     823    if (!item)
    835824    {
    836825        aRowHint = qBound (0, aRowHint, model()->rowCount() - 1);
     
    847836    if (indexes.isEmpty())
    848837        return NULL;
    849     return model()->data (indexes.first(), VBoxVMModel::VBoxVMItemPtrRole).value<VBoxVMItem *>();
     838    return model()->data (indexes.first(), VBoxVMModel::VBoxVMItemPtrRole).value <VBoxVMItem *>();
    850839}
    851840
     
    877866    ensureCurrentVisible();
    878867    emit currentChanged();
    879 }
    880 
    881 void VBoxVMListView::mousePressEvent (QMouseEvent *aEvent)
    882 {
    883     /* First process event, in the case the user select a new item */
    884     QListView::mousePressEvent (aEvent);
    885     if (aEvent->button() == Qt::RightButton)
    886     {
    887         /* Send a context menu request if necessary */
    888         const QModelIndex &index = indexAt (aEvent->pos());
    889         if (index.isValid())
    890         {
    891             VBoxVMItem *item = model()->data (index, VBoxVMModel::VBoxVMItemPtrRole).value<VBoxVMItem *>();
    892             emit contextMenuRequested (item, aEvent->globalPos());
    893         }
    894     }
    895868}
    896869
Note: See TracChangeset for help on using the changeset viewer.

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