summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-07 23:31:58 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-06-15 14:40:40 -0400
commit1897d60134e1cff31375f1c602196a99ece7fc86 (patch)
tree3bc7391f2c7a15e500370b58a24e45756a2d411d /src
parent7026aeaec859fd3632b1062e0cf14d2479c23076 (diff)
pulled java installation detection out of getFileExecutionContext() and into findJavaInstallation() because it was copy/pasted into EditExecutablesDialog
fixed FileDialogMemory::getOpenFileName() to also use the given directory correctly handle browse binary button
Diffstat (limited to 'src')
-rw-r--r--src/editexecutablesdialog.cpp104
-rw-r--r--src/editexecutablesdialog.h1
-rw-r--r--src/filedialogmemory.cpp16
-rw-r--r--src/organizercore.cpp70
-rw-r--r--src/organizercore.h2
5 files changed, 104 insertions, 89 deletions
diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp
index efcec8e0..08e2c3d1 100644
--- a/src/editexecutablesdialog.cpp
+++ b/src/editexecutablesdialog.cpp
@@ -22,10 +22,12 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "filedialogmemory.h"
#include "stackdata.h"
#include "modlist.h"
+#include "forcedloaddialog.h"
+#include "organizercore.h"
+
#include <QMessageBox>
#include <Shellapi.h>
#include <utility.h>
-#include "forcedloaddialog.h"
#include <algorithm>
using namespace MOBase;
@@ -321,6 +323,30 @@ void EditExecutablesDialog::on_forceLoadLibraries_toggled(bool checked)
save();
}
+void EditExecutablesDialog::on_browseBinary_clicked()
+{
+ const QString binaryName = FileDialogMemory::getOpenFileName(
+ "editExecutableBinary", this, tr("Select a binary"), ui->binary->text(),
+ tr("Executable (%1)").arg("*.exe *.bat *.jar"));
+
+ if (binaryName.isNull()) {
+ // canceled
+ return;
+ }
+
+ if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) {
+ setJarBinary(binaryName);
+ } else {
+ ui->binary->setText(QDir::toNativeSeparators(binaryName));
+ }
+
+ if (ui->title->text().isEmpty()) {
+ ui->title->setText(QFileInfo(binaryName).baseName());
+ }
+
+ save();
+}
+
void EditExecutablesDialog::on_browseWorkingDirectory_clicked()
{
QString dirName = FileDialogMemory::getExistingDirectory(
@@ -356,6 +382,30 @@ void EditExecutablesDialog::on_configureLibraries_clicked()
}
}
+void EditExecutablesDialog::setJarBinary(const QString& binaryName)
+{
+ auto java = OrganizerCore::findJavaInstallation(binaryName);
+
+ if (java.isEmpty()) {
+ QMessageBox::information(
+ this, tr("Java (32-bit) required"),
+ tr("MO requires 32-bit java to run this application. If you already "
+ "have it installed, select javaw.exe from that installation as "
+ "the binary."));
+ }
+
+ // only save once
+
+ m_settingUI = true;
+ ui->binary->setText(java);
+ ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath()));
+ ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\"");
+ m_settingUI = false;
+
+ save();
+}
+
+
void EditExecutablesDialog::resetInput()
@@ -465,58 +515,6 @@ void EditExecutablesDialog::on_add_clicked()
//refreshExecutablesWidget();
}
-void EditExecutablesDialog::on_browseBinary_clicked()
-{
- QString binaryName = FileDialogMemory::getOpenFileName(
- "editExecutableBinary", this, tr("Select a binary"), QString(),
- tr("Executable (%1)").arg("*.exe *.bat *.jar"));
-
- if (binaryName.isNull()) {
- // canceled
- return;
- }
-
- if (binaryName.endsWith(".jar", Qt::CaseInsensitive)) {
- QString binaryPath;
- { // try to find java automatically
- std::wstring binaryNameW = ToWString(binaryName);
- WCHAR buffer[MAX_PATH];
- if (::FindExecutableW(binaryNameW.c_str(), nullptr, buffer)
- > reinterpret_cast<HINSTANCE>(32)) {
- DWORD binaryType = 0UL;
- if (!::GetBinaryTypeW(binaryNameW.c_str(), &binaryType)) {
- qDebug("failed to determine binary type of \"%ls\": %lu", binaryNameW.c_str(), ::GetLastError());
- } else if (binaryType == SCS_32BIT_BINARY) {
- binaryPath = ToQString(buffer);
- }
- }
- }
- if (binaryPath.isEmpty()) {
- QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat);
- if (javaReg.contains("CurrentVersion")) {
- QString currentVersion = javaReg.value("CurrentVersion").toString();
- binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe");
- }
- }
- if (binaryPath.isEmpty()) {
- QMessageBox::information(this, tr("Java (32-bit) required"),
- tr("MO requires 32-bit java to run this application. If you already have it installed, select javaw.exe "
- "from that installation as the binary."));
- } else {
- ui->binary->setText(binaryPath);
- }
-
- ui->workingDirectory->setText(QDir::toNativeSeparators(QFileInfo(binaryName).absolutePath()));
- ui->arguments->setText("-jar \"" + QDir::toNativeSeparators(binaryName) + "\"");
- } else {
- ui->binary->setText(QDir::toNativeSeparators(binaryName));
- }
-
- if (ui->title->text().isEmpty()) {
- ui->title->setText(QFileInfo(binaryName).baseName());
- }
-}
-
void EditExecutablesDialog::on_remove_clicked()
{
if (QMessageBox::question(this, tr("Confirm"), tr("Really remove \"%1\" from executables?").arg(ui->title->text()),
diff --git a/src/editexecutablesdialog.h b/src/editexecutablesdialog.h
index 37b50127..1f3f0082 100644
--- a/src/editexecutablesdialog.h
+++ b/src/editexecutablesdialog.h
@@ -98,6 +98,7 @@ private:
void clearEdits();
void setEdits(const Executable& e);
void save();
+ void setJarBinary(const QString& binaryName);
void resetInput();
bool executableChanged();
diff --git a/src/filedialogmemory.cpp b/src/filedialogmemory.cpp
index 9607beb9..554a6235 100644
--- a/src/filedialogmemory.cpp
+++ b/src/filedialogmemory.cpp
@@ -61,14 +61,22 @@ QString FileDialogMemory::getOpenFileName(
const QString &dir, const QString &filter, QString *selectedFilter,
QFileDialog::Options options)
{
- std::pair<std::map<QString, QString>::iterator, bool> currentDir =
- instance().m_Cache.insert(std::make_pair(dirID, dir));
+ QString currentDir = dir;
+
+ if (currentDir.isEmpty()) {
+ auto itor = instance().m_Cache.find(dirID);
+ if (itor != instance().m_Cache.end()) {
+ currentDir = itor->first;
+ }
+ }
+
+ QString result = QFileDialog::getOpenFileName(
+ parent, caption, currentDir, filter, selectedFilter, options);
- QString result = QFileDialog::getOpenFileName(parent, caption, currentDir.first->second,
- filter, selectedFilter, options);
if (!result.isNull()) {
instance().m_Cache[dirID] = QFileInfo(result).path();
}
+
return result;
}
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 2172538e..c724e57f 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -1182,6 +1182,34 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const
return res;
}
+QString OrganizerCore::findJavaInstallation(const QString& jarFile)
+{
+ if (!jarFile.isEmpty()) {
+ // try to find java automatically based on the given jar file
+ std::wstring jarFileW = jarFile.toStdWString();
+
+ WCHAR buffer[MAX_PATH];
+ if (::FindExecutableW(jarFileW.c_str(), nullptr, buffer) > (HINSTANCE)32) {
+ DWORD binaryType = 0UL;
+ if (!::GetBinaryTypeW(buffer, &binaryType)) {
+ qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError());
+ } else if (binaryType == SCS_32BIT_BINARY || binaryType == SCS_64BIT_BINARY) {
+ return QString::fromWCharArray(buffer);
+ }
+ }
+ }
+
+ // second attempt: look to the registry
+ QSettings reg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat);
+ if (reg.contains("CurrentVersion")) {
+ QString currentVersion = reg.value("CurrentVersion").toString();
+ return reg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe");
+ }
+
+ // not found
+ return {};
+}
+
bool OrganizerCore::getFileExecutionContext(
QWidget* parent, const QFileInfo &targetInfo,
QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type)
@@ -1199,44 +1227,22 @@ bool OrganizerCore::getFileExecutionContext(
type = FileExecutionTypes::Executable;
return true;
} else if (extension.compare("jar", Qt::CaseInsensitive) == 0) {
- // types that need to be injected into
- std::wstring targetPathW = targetInfo.absoluteFilePath().toStdWString();
- QString binaryPath;
+ auto java = findJavaInstallation(targetInfo.absoluteFilePath());
- { // try to find java automatically
- WCHAR buffer[MAX_PATH];
- if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) {
- DWORD binaryType = 0UL;
- if (!::GetBinaryTypeW(buffer, &binaryType)) {
- qDebug("failed to determine binary type of \"%ls\": %lu", buffer, ::GetLastError());
- } else if (binaryType == SCS_32BIT_BINARY) {
- binaryPath = QString::fromWCharArray(buffer);
- }
- }
- }
- if (binaryPath.isEmpty() && (extension == "jar")) {
- // second attempt: look to the registry
- QSettings javaReg("HKEY_LOCAL_MACHINE\\Software\\JavaSoft\\Java Runtime Environment", QSettings::NativeFormat);
- if (javaReg.contains("CurrentVersion")) {
- QString currentVersion = javaReg.value("CurrentVersion").toString();
- binaryPath = javaReg.value(QString("%1/JavaHome").arg(currentVersion)).toString().append("\\bin\\javaw.exe");
- }
- }
- if (binaryPath.isEmpty()) {
- binaryPath = QFileDialog::getOpenFileName(
- parent, QObject::tr("Select binary"), QString(), QObject::tr("Binary") + " (*.exe)");
+ if (java.isEmpty()) {
+ java = QFileDialog::getOpenFileName(
+ parent, QObject::tr("Select binary"),
+ QString(), QObject::tr("Binary") + " (*.exe)");
}
- if (binaryPath.isEmpty()) {
+
+ if (java.isEmpty()) {
return false;
}
- binaryInfo = QFileInfo(binaryPath);
- if (extension == "jar") {
- arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath()));
- } else {
- arguments = QString("\"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath()));
- }
+ binaryInfo = QFileInfo(java);
+ arguments = QString("-jar \"%1\"").arg(QDir::toNativeSeparators(targetInfo.absoluteFilePath()));
type = FileExecutionTypes::Executable;
+
return true;
} else {
type = FileExecutionTypes::Other;
diff --git a/src/organizercore.h b/src/organizercore.h
index 8ed34e24..a4a57496 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -147,6 +147,8 @@ public:
void doAfterLogin(const std::function<void()> &function) { m_PostLoginTasks.append(function); }
+ static QString findJavaInstallation(const QString& jarFile={});
+
static bool getFileExecutionContext(
QWidget* parent, const QFileInfo &targetInfo,
QFileInfo &binaryInfo, QString &arguments, FileExecutionTypes& type);