File indexing completed on 2024-04-21 05:54:01

0001 /*
0002     This file is part of the Okteta program, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2006-2009, 2011, 2014 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "program.hpp"
0010 
0011 // program
0012 #include "about.hpp"
0013 #include "mainwindow.hpp"
0014 // Okteta Kasten
0015 #include <Kasten/Okteta/ByteArrayDocumentFactory>
0016 #include <Kasten/Okteta/ByteArrayViewFactory>
0017 #include <Kasten/Okteta/ByteArrayRawFileSynchronizerFactory>
0018 #include <Kasten/Okteta/ByteArrayStreamEncoderConfigEditorFactoryFactory>
0019 #include <Kasten/Okteta/ByteArrayDataGeneratorConfigEditorFactoryFactory>
0020 #include <Kasten/Okteta/ByteArrayStreamEncoderFactory>
0021 #include <Kasten/Okteta/ByteArrayDataGeneratorFactory>
0022 // tmp
0023 #include <Kasten/Okteta/ByteArrayViewProfileManager>
0024 // Kasten gui
0025 #include <Kasten/MultiDocumentStrategy>
0026 #include <Kasten/DialogHandler>
0027 #include <Kasten/ViewManager>
0028 #include <Kasten/ModelCodecViewManager>
0029 // Kasten core
0030 #include <Kasten/DocumentManager>
0031 #include <Kasten/DocumentCreateManager>
0032 #include <Kasten/DocumentSyncManager>
0033 #include <Kasten/ModelCodecManager>
0034 // KF
0035 #include <KDBusService>
0036 #include <KLocalizedString>
0037 #include <KCrash>
0038 // Qt
0039 #include <QCommandLineParser>
0040 #include <QVector>
0041 #include <QUrl>
0042 #include <QDir>
0043 
0044 namespace Kasten {
0045 
0046 // static constexpr char OffsetOptionId[] = "offset";
0047 // static constexpr char OffsetOptionShortId[] = "o";
0048 
0049 static
0050 int& preConstructionHookHack(int& argc)
0051 {
0052     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
0053     return argc;
0054 }
0055 
0056 
0057 OktetaProgram::OktetaProgram(int& argc, char* argv[])
0058     : mApp(preConstructionHookHack(argc), argv)
0059 {
0060     QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
0061     KLocalizedString::setApplicationDomain("okteta");
0062     KCrash::initialize();
0063 }
0064 
0065 OktetaProgram::~OktetaProgram()
0066 {
0067     delete mDocumentStrategy;
0068     delete mDocumentManager;
0069     delete mViewManager;
0070     delete mDialogHandler;
0071     delete mByteArrayViewProfileManager;
0072 }
0073 
0074 int OktetaProgram::execute()
0075 {
0076     mDocumentManager = new DocumentManager();
0077     mViewManager = new ViewManager();
0078     mDocumentStrategy = new MultiDocumentStrategy(mDocumentManager, mViewManager);
0079     mDialogHandler = new DialogHandler();
0080 
0081     OktetaAboutData aboutData;
0082     KAboutData::setApplicationData(aboutData);
0083     QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("okteta")));
0084 
0085     QCommandLineParser parser;
0086     aboutData.setupCommandLine(&parser);
0087 
0088     // urls to open
0089     parser.addPositionalArgument(QStringLiteral("urls"), i18n("File(s) to load."), QStringLiteral("[urls...]"));
0090 
0091     // offset option
0092 //     programOptions.add( OffsetOptionShortId );
0093 //     programOptions.add( OffsetOptionId, ki18n("Offset to set the cursor to"), 0 );
0094 
0095     parser.process(mApp);
0096 
0097     aboutData.processCommandLine(&parser);
0098 
0099     KDBusService programDBusService(KDBusService::Multiple | KDBusService::NoExitOnFailure);
0100 
0101     // TODO:
0102     mByteArrayViewProfileManager = new ByteArrayViewProfileManager();
0103     // mModelManagerManager->addModelManager( byteArrayViewProfileManager );
0104 
0105     const QVector<AbstractModelStreamEncoder*> encoderList =
0106         ByteArrayStreamEncoderFactory::createStreamEncoders();
0107 
0108     const QVector<AbstractModelDataGenerator*> generatorList =
0109         ByteArrayDataGeneratorFactory::createDataGenerators();
0110 
0111     const QVector<AbstractModelStreamEncoderConfigEditorFactory*> encoderConfigEditorFactoryList =
0112         ByteArrayStreamEncoderConfigEditorFactoryFactory::createFactorys();
0113 
0114     const QVector<AbstractModelDataGeneratorConfigEditorFactory*> generatorConfigEditorFactoryList =
0115         ByteArrayDataGeneratorConfigEditorFactoryFactory::createFactorys();
0116 
0117     mDocumentManager->codecManager()->setEncoders(encoderList);
0118     mDocumentManager->codecManager()->setGenerators(generatorList);
0119     mDocumentManager->codecManager()->setOverwriteDialog(mDialogHandler);
0120     mDocumentManager->createManager()->setDocumentFactory(new ByteArrayDocumentFactory());
0121     mDocumentManager->syncManager()->setDocumentSynchronizerFactory(new ByteArrayRawFileSynchronizerFactory());
0122     mDocumentManager->syncManager()->setOverwriteDialog(mDialogHandler);
0123     mDocumentManager->syncManager()->setSaveDiscardDialog(mDialogHandler);
0124 
0125     mViewManager->setViewFactory(new ByteArrayViewFactory(mByteArrayViewProfileManager));
0126     mViewManager->codecViewManager()->setEncoderConfigEditorFactories(encoderConfigEditorFactoryList);
0127     mViewManager->codecViewManager()->setGeneratorConfigEditorFactories(generatorConfigEditorFactoryList);
0128 
0129     auto* mainWindow = new OktetaMainWindow(this);
0130     mDialogHandler->setWidget(mainWindow);
0131 
0132     // started by session management?
0133     if (mApp.isSessionRestored() && KMainWindow::canBeRestored(1)) {
0134         mainWindow->restore(1);
0135     } else {
0136         // no session.. just start up normally
0137         const QStringList urls = parser.positionalArguments();
0138 
0139         // take arguments
0140         if (!urls.isEmpty()) {
0141             const QString currentPath = QDir::currentPath();
0142             for (const QString& url : urls) {
0143                 mDocumentStrategy->load(QUrl::fromUserInput(url, currentPath, QUrl::AssumeLocalFile));
0144             }
0145         }
0146 
0147         mainWindow->show();
0148 
0149     }
0150 
0151     return QApplication::exec();
0152 }
0153 
0154 void OktetaProgram::quit()
0155 {
0156     qApp->quit();
0157 }
0158 
0159 }