summaryrefslogtreecommitdiff
path: root/src/pmchart/openviewdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmchart/openviewdialog.cpp')
-rw-r--r--src/pmchart/openviewdialog.cpp432
1 files changed, 432 insertions, 0 deletions
diff --git a/src/pmchart/openviewdialog.cpp b/src/pmchart/openviewdialog.cpp
new file mode 100644
index 0000000..d2b63e6
--- /dev/null
+++ b/src/pmchart/openviewdialog.cpp
@@ -0,0 +1,432 @@
+/*
+ * Copyright (c) 2013, Red Hat.
+ * Copyright (c) 2007-2009, Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#include "openviewdialog.h"
+#include <QtGui/QCompleter>
+#include <QtGui/QFileDialog>
+#include <QtGui/QMessageBox>
+#include "main.h"
+#include "hostdialog.h"
+
+OpenViewDialog::OpenViewDialog(QWidget *parent) : QDialog(parent)
+{
+ setupUi(this);
+ my.dirModel = new QDirModel;
+ my.dirModel->setIconProvider(fileIconProvider);
+ dirListView->setModel(my.dirModel);
+
+ my.completer = new QCompleter;
+ my.completer->setModel(my.dirModel);
+ fileNameLineEdit->setCompleter(my.completer);
+
+ connect(dirListView->selectionModel(),
+ SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+ this, SLOT(dirListView_selectionChanged()));
+
+ QDir dir;
+ QChar sep(__pmPathSeparator());
+ QString sys = my.systemDir = pmGetConfig("PCP_VAR_DIR");
+ my.systemDir.append(sep);
+ my.systemDir.append("config");
+ my.systemDir.append(sep);
+ my.systemDir.append("kmchart");
+ if (dir.exists(my.systemDir))
+ pathComboBox->addItem(fileIconProvider->icon(QFileIconProvider::Folder),
+ my.systemDir);
+ my.systemDir = sys;
+ my.systemDir.append(sep);
+ my.systemDir.append("config");
+ my.systemDir.append(sep);
+ my.systemDir.append("pmchart");
+ if (dir.exists(my.systemDir))
+ pathComboBox->addItem(fileIconProvider->icon(QFileIconProvider::Folder),
+ my.systemDir);
+
+ QString home = my.userDir = QDir::toNativeSeparators(QDir::homePath());
+ my.userDir.append(sep);
+ my.userDir.append(".pcp");
+ my.userDir.append(sep);
+ my.userDir.append("kmchart");
+ if (dir.exists(my.userDir))
+ pathComboBox->addItem(fileIconProvider->icon(QFileIconProvider::Folder),
+ my.userDir);
+ my.userDir = home;
+ my.userDir.append(sep);
+ my.userDir.append(".pcp");
+ my.userDir.append(sep);
+ my.userDir.append("pmchart");
+ if (dir.exists(my.userDir))
+ pathComboBox->addItem(fileIconProvider->icon(QFileIconProvider::Folder),
+ my.userDir);
+
+ pathComboBox->addItem(fileIconProvider->icon(QFileIconProvider::Folder),
+ home);
+}
+
+OpenViewDialog::~OpenViewDialog()
+{
+ delete my.completer;
+ delete my.dirModel;
+}
+
+void OpenViewDialog::reset()
+{
+ if ((my.archiveSource = pmchart->isArchiveTab())) {
+ sourceLabel->setText(tr("Archive:"));
+ sourcePushButton->setIcon(QIcon(":/images/archive.png"));
+ } else {
+ sourceLabel->setText(tr("Host:"));
+ sourcePushButton->setIcon(QIcon(":/images/computer.png"));
+ }
+ setupComboBoxes(my.archiveSource);
+ setPath(my.systemDir);
+}
+
+void OpenViewDialog::setPathUi(const QString &path)
+{
+ if (path.isEmpty())
+ return;
+
+ int index = pathComboBox->findText(path);
+ if (index == -1) {
+ pathComboBox->addItem(fileIconProvider->icon(QFileIconProvider::Folder),
+ path);
+ index = pathComboBox->count() - 1;
+ }
+ pathComboBox->setCurrentIndex(index);
+ dirListView->selectionModel()->clear();
+
+ userToolButton->setChecked(path == my.userDir);
+ systemToolButton->setChecked(path == my.systemDir);
+
+ fileNameLineEdit->setModified(false);
+ fileNameLineEdit->clear();
+}
+
+void OpenViewDialog::setPath(const QModelIndex &index)
+{
+ console->post("OpenViewDialog::setPath QModelIndex path=%s",
+ (const char *)my.dirModel->filePath(index).toAscii());
+ my.dirIndex = index;
+ my.dirModel->refresh(index);
+ dirListView->setRootIndex(index);
+ setPathUi(my.dirModel->filePath(index));
+}
+
+void OpenViewDialog::setPath(const QString &path)
+{
+ console->post("OpenViewDialog::setPath QString path=%s",
+ (const char *)path.toAscii());
+ my.dirIndex = my.dirModel->index(path);
+ my.dirModel->refresh(my.dirIndex);
+ dirListView->setRootIndex(my.dirIndex);
+ setPathUi(path);
+}
+
+void OpenViewDialog::pathComboBox_currentIndexChanged(QString path)
+{
+ console->post("OpenViewDialog::pathComboBox_currentIndexChanged");
+ setPath(path);
+}
+
+void OpenViewDialog::parentToolButton_clicked()
+{
+ console->post("OpenViewDialog::parentToolButton_clicked");
+ setPath(my.dirModel->parent(my.dirIndex));
+}
+
+void OpenViewDialog::userToolButton_clicked(bool enabled)
+{
+ if (enabled) {
+ QDir dir;
+ if (!dir.exists(my.userDir))
+ dir.mkpath(my.userDir);
+ setPath(my.userDir);
+ }
+}
+
+void OpenViewDialog::systemToolButton_clicked(bool enabled)
+{
+ if (enabled)
+ setPath(my.systemDir);
+}
+
+void OpenViewDialog::dirListView_selectionChanged()
+{
+ QItemSelectionModel *selections = dirListView->selectionModel();
+ QModelIndexList selectedIndexes = selections->selectedIndexes();
+
+ console->post("OpenViewDialog::dirListView_clicked");
+
+ my.completer->setCompletionPrefix(my.dirModel->filePath(my.dirIndex));
+ if (selectedIndexes.count() != 1)
+ fileNameLineEdit->setText("");
+ else
+ fileNameLineEdit->setText(my.dirModel->fileName(selectedIndexes.at(0)));
+}
+
+void OpenViewDialog::dirListView_activated(const QModelIndex &index)
+{
+ QFileInfo fi = my.dirModel->fileInfo(index);
+
+ console->post("OpenViewDialog::dirListView_activated");
+
+ if (fi.isDir())
+ setPath(index);
+ else if (fi.isFile()) {
+ QStringList files;
+ files << fi.absoluteFilePath();
+ if (openViewFiles(files) == true)
+ done(0);
+ }
+}
+
+int OpenViewDialog::setupArchiveComboBoxes()
+{
+ QIcon archiveIcon = fileIconProvider->icon(QedFileIconProvider::Archive);
+ QIcon hostIcon = fileIconProvider->icon(QFileIconProvider::Computer);
+ int index = 0;
+
+ for (unsigned int i = 0; i < archiveGroup->numContexts(); i++) {
+ QmcSource source = archiveGroup->context(i)->source();
+ sourceComboBox->insertItem(i, archiveIcon, source.source());
+ if (i == archiveGroup->contextIndex())
+ index = i;
+ }
+ return index;
+}
+
+int OpenViewDialog::setupLiveComboBoxes()
+{
+ QIcon hostIcon = fileIconProvider->icon(QFileIconProvider::Computer);
+ int index = 0;
+
+ for (unsigned int i = 0; i < liveGroup->numContexts(); i++) {
+ QmcSource source = liveGroup->context(i)->source();
+ sourceComboBox->insertItem(i, hostIcon, source.host());
+ if (i == liveGroup->contextIndex())
+ index = i;
+ }
+ return index;
+}
+
+void OpenViewDialog::setupComboBoxes(bool arch)
+{
+ // We block signals on the target combo boxes so that we don't
+ // send spurious signals out about their lists being changed.
+ // If we did that, we would keep changing the current context.
+ sourceComboBox->blockSignals(true);
+ sourceComboBox->clear();
+ int index = arch ? setupArchiveComboBoxes() : setupLiveComboBoxes();
+ sourceComboBox->setCurrentIndex(index);
+ sourceComboBox->blockSignals(false);
+}
+
+void OpenViewDialog::archiveAdd()
+{
+ QFileDialog *af = new QFileDialog(this);
+ QStringList al;
+ int sts;
+
+ af->setFileMode(QFileDialog::ExistingFiles);
+ af->setAcceptMode(QFileDialog::AcceptOpen);
+ af->setWindowTitle(tr("Add Archive"));
+ af->setIconProvider(fileIconProvider);
+ af->setDirectory(QDir::toNativeSeparators(QDir::homePath()));
+
+ if (af->exec() == QDialog::Accepted)
+ al = af->selectedFiles();
+ for (QStringList::Iterator it = al.begin(); it != al.end(); ++it) {
+ QString archive = *it;
+ if ((sts = archiveGroup->use(PM_CONTEXT_ARCHIVE, archive)) < 0) {
+ archive.prepend(tr("Cannot open PCP archive: "));
+ archive.append(tr("\n"));
+ archive.append(tr(pmErrStr(sts)));
+ QMessageBox::warning(this, pmProgname, archive,
+ QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
+ QMessageBox::NoButton, QMessageBox::NoButton);
+ } else {
+ setupComboBoxes(true);
+ archiveGroup->updateBounds();
+ QmcSource source = archiveGroup->context()->source();
+ pmtime->addArchive(source.start(), source.end(),
+ source.timezone(), source.host(), false);
+ }
+ }
+ delete af;
+}
+
+void OpenViewDialog::hostAdd()
+{
+ HostDialog *host = new HostDialog(this);
+
+ if (host->exec() == QDialog::Accepted) {
+ QString hostspec = host->getHostSpecification();
+ int sts, flags = host->getContextFlags();
+
+ if (hostspec == QString::null || hostspec.length() == 0) {
+ hostspec.append(tr("Hostname not specified\n"));
+ QMessageBox::warning(this, pmProgname, hostspec,
+ QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
+ Qt::NoButton, Qt::NoButton);
+ } else if ((sts = liveGroup->use(PM_CONTEXT_HOST, hostspec, flags)) < 0) {
+ hostspec.prepend(tr("Cannot connect to host: "));
+ hostspec.append(tr("\n"));
+ hostspec.append(tr(pmErrStr(sts)));
+ QMessageBox::warning(this, pmProgname, hostspec,
+ QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
+ Qt::NoButton, Qt::NoButton);
+ } else {
+ console->post(PmChart::DebugUi,
+ "OpenViewDialog::newHost: %s (flags=0x%x)",
+ (const char *)hostspec.toAscii(), flags);
+ setupComboBoxes(false);
+ }
+ }
+ delete host;
+}
+
+void OpenViewDialog::sourcePushButton_clicked()
+{
+ if (my.archiveSource)
+ archiveAdd();
+ else
+ hostAdd();
+}
+
+void OpenViewDialog::sourceComboBox_currentIndexChanged(int index)
+{
+ console->post("OpenViewDialog::sourceComboBox_currentIndexChanged %d", index);
+ if (my.archiveSource == false)
+ liveGroup->use((unsigned int)index);
+ else
+ archiveGroup->use((unsigned int)index);
+}
+
+bool OpenViewDialog::useLiveContext(QString source)
+{
+ int sts;
+
+ if ((sts = liveGroup->use(PM_CONTEXT_HOST, source)) < 0) {
+ QString msg;
+ msg.sprintf("Failed to connect to pmcd on \"%s\".\n%s.\n\n",
+ (const char *)source.toAscii(), pmErrStr(sts));
+ QMessageBox::warning(NULL, pmProgname, msg,
+ QMessageBox::Ok | QMessageBox::Default | QMessageBox::Escape,
+ QMessageBox::NoButton, QMessageBox::NoButton);
+ return false;
+ }
+ return true;
+}
+
+bool OpenViewDialog::useArchiveContext(QString source)
+{
+ int sts;
+
+ if ((sts = archiveGroup->use(PM_CONTEXT_ARCHIVE, source)) < 0) {
+ QString msg;
+ msg.sprintf("Failed to open archive \"%s\".\n%s.\n\n",
+ (const char *)source.toAscii(), pmErrStr(sts));
+ QMessageBox::warning(NULL, pmProgname, msg,
+ QMessageBox::Ok | QMessageBox::Default | QMessageBox::Escape,
+ QMessageBox::NoButton, QMessageBox::NoButton);
+ return false;
+ }
+ return true;
+}
+
+bool OpenViewDialog::useComboBoxContext(bool arch)
+{
+ if (arch == false)
+ return useLiveContext(sourceComboBox->currentText());
+ else
+ return useArchiveContext(sourceComboBox->currentText());
+}
+
+bool OpenViewDialog::openViewFiles(const QStringList &fl)
+{
+ QString msg;
+ bool result = true;
+
+ if (pmchart->isArchiveTab() != my.archiveSource) {
+ if (pmchart->isArchiveTab())
+ msg = tr("Cannot open Host View(s) in an Archive Tab\n");
+ else
+ msg = tr("Cannot open Archive View(s) in a Host Tab\n");
+ QMessageBox::warning(this, pmProgname, msg,
+ QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
+ QMessageBox::NoButton, QMessageBox::NoButton);
+ return false;
+ }
+ if (useComboBoxContext(my.archiveSource) == false)
+ return false;
+ QStringList files = fl;
+ for (QStringList::Iterator it = files.begin(); it != files.end(); ++it)
+ if (openView((const char *)(*it).toAscii()) == false)
+ result = false;
+ pmchart->enableUi();
+ return result;
+}
+
+void OpenViewDialog::openPushButton_clicked()
+{
+ QStringList files;
+ QString msg;
+
+ if (fileNameLineEdit->isModified()) {
+ QString filename = fileNameLineEdit->text().trimmed();
+ if (filename.isEmpty())
+ msg = tr("No View file(s) specified");
+ else {
+ QFileInfo f(filename);
+ if (f.isDir()) {
+ setPath(filename);
+ }
+ else if (f.exists()) {
+ files << filename;
+ if (openViewFiles(files) == true)
+ done(0);
+ }
+ else {
+ msg = tr("No such View file exists:\n");
+ msg.append(filename);
+ }
+ }
+ }
+ else {
+ QItemSelectionModel *selections = dirListView->selectionModel();
+ QModelIndexList selectedIndexes = selections->selectedIndexes();
+
+ if (selectedIndexes.count() == 0)
+ msg = tr("No View file(s) selected");
+ else {
+ for (int i = 0; i < selectedIndexes.count(); i++) {
+ QString filename = my.dirModel->filePath(selectedIndexes.at(i));
+ QFileInfo f(filename);
+ if (f.isDir())
+ continue;
+ files << filename;
+ }
+ if (files.size() > 0)
+ if (openViewFiles(files) == true)
+ done(0);
+ }
+ }
+
+ if (msg.isEmpty() == false) {
+ QMessageBox::warning(this, pmProgname, msg,
+ QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
+ QMessageBox::NoButton, QMessageBox::NoButton);
+ }
+}