diff --git a/InstaSoftOfficeTool.csproj b/InstaSoftOfficeTool.csproj
index 908a07d..299c206 100644
--- a/InstaSoftOfficeTool.csproj
+++ b/InstaSoftOfficeTool.csproj
@@ -9,9 +9,9 @@
InstaSoft Zrt.
InstaSoft Office Tool
Copyright (c) InstaSoft Zrt. 2026
- 1.0.6
- 1.0.6.0
- 1.0.6.0
+ 1.0.7
+ 1.0.7.0
+ 1.0.7.0
app.manifest
latest
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 06d51b6..6ddb77f 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -42,7 +42,7 @@
Foreground="{StaticResource TextSecondaryBrush}" Margin="0,-2,0,0"/>
-
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
index 1b3271c..6b923b9 100644
--- a/MainWindow.xaml.cs
+++ b/MainWindow.xaml.cs
@@ -38,12 +38,13 @@ namespace InstaSoftOfficeTool
_config = new InstallConfig();
_wizardPages = new List
{
- new VersionPage(this, _config),
- new EditionPage(this, _config),
- new ConfigPage(this, _config),
- new ProductKeyPage(this, _config),
- new SummaryPage(this, _config),
- new ProgressPage(this, _config)
+ new VersionPage(this, _config), // 0
+ new EditionPage(this, _config), // 1
+ new ConfigPage(this, _config), // 2
+ new ProductKeyPage(this, _config), // 3
+ new SummaryPage(this, _config), // 4
+ new PreInstallCheckPage(this), // 5 — remove old Office
+ new ProgressPage(this, _config) // 6
};
_currentPageIndex = 0;
ShowCurrentPage();
@@ -91,8 +92,8 @@ namespace InstaSoftOfficeTool
StepIndicator.Children.Clear();
if (_currentFlow != "install") return;
- // Only show dots for install flow (6 steps, but last is progress - no dot)
- int totalDots = _wizardPages.Count - 1; // exclude progress page
+ // Only show dots for install flow (exclude PreInstallCheck + Progress)
+ int totalDots = _wizardPages.Count - 2;
for (int i = 0; i < totalDots; i++)
{
var dot = new Ellipse
@@ -122,14 +123,10 @@ namespace InstaSoftOfficeTool
BtnBack.Visibility = _currentPageIndex > 0 ? Visibility.Visible : Visibility.Visible;
BtnNext.Visibility = Visibility.Visible;
- // Last step before progress = "Telep\u00edt\u00e9s ind\u00edt\u00e1sa"
- if (_currentPageIndex == _wizardPages.Count - 2)
- {
- BtnNext.Content = "Telep\u00edt\u00e9s ind\u00edt\u00e1sa";
- }
- // On progress page, hide both
- else if (_currentPageIndex == _wizardPages.Count - 1 &&
- _wizardPages[_currentPageIndex] is ProgressPage)
+ // On SummaryPage = "Tov\u00e1bb"
+ // On PreInstallCheckPage or ProgressPage = hide
+ if (_wizardPages[_currentPageIndex] is PreInstallCheckPage ||
+ _wizardPages[_currentPageIndex] is ProgressPage)
{
BtnNext.Visibility = Visibility.Collapsed;
BtnBack.Visibility = Visibility.Collapsed;
@@ -174,12 +171,18 @@ namespace InstaSoftOfficeTool
}
ShowCurrentPage();
+ }
+ }
- // Auto-start if we're on progress page
- if (_wizardPages[_currentPageIndex] is ProgressPage progressPage)
- {
- progressPage.StartInstallation();
- }
+ public void ProceedToInstall()
+ {
+ // Jump to ProgressPage (last page in the wizard)
+ _currentPageIndex = _wizardPages.Count - 1;
+ ShowCurrentPage();
+
+ if (_wizardPages[_currentPageIndex] is ProgressPage progressPage)
+ {
+ progressPage.StartInstallation();
}
}
diff --git a/Pages/PreInstallCheckPage.xaml b/Pages/PreInstallCheckPage.xaml
new file mode 100644
index 0000000..d7d80d4
--- /dev/null
+++ b/Pages/PreInstallCheckPage.xaml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Pages/PreInstallCheckPage.xaml.cs b/Pages/PreInstallCheckPage.xaml.cs
new file mode 100644
index 0000000..5dbb69e
--- /dev/null
+++ b/Pages/PreInstallCheckPage.xaml.cs
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using InstaSoftOfficeTool.Models;
+using InstaSoftOfficeTool.Services;
+
+namespace InstaSoftOfficeTool.Pages
+{
+ public partial class PreInstallCheckPage : Page
+ {
+ private readonly MainWindow _main;
+ private List _detected;
+
+ public PreInstallCheckPage(MainWindow main)
+ {
+ InitializeComponent();
+ _main = main;
+ Loaded += (s, e) => DetectOffice();
+ }
+
+ private void DetectOffice()
+ {
+ _detected = OfficeDetector.Detect();
+ OfficeListPanel.Children.Clear();
+
+ if (_detected.Count == 0)
+ {
+ SubtitleText.Text = "Nincs kor\u00e1bbi Office telep\u00edt\u00e9s a g\u00e9pen.";
+ NoOfficeCard.Visibility = Visibility.Visible;
+ BtnRemove.Visibility = Visibility.Collapsed;
+ LicenseCleanupPanel.Visibility = Visibility.Collapsed;
+ BtnSkip.Content = "Tov\u00e1bb a telep\u00edt\u00e9shez \u2192";
+ return;
+ }
+
+ SubtitleText.Text = "A sz\u00e1m\u00edt\u00f3g\u00e9pen tal\u00e1lt Office telep\u00edt\u00e9sek. Az \u00faj Office telep\u00edt\u00e9se el\u0151tt aj\u00e1nlott elt\u00e1vol\u00edtani.";
+ BtnRemove.Visibility = Visibility.Visible;
+ LicenseCleanupPanel.Visibility = Visibility.Visible;
+
+ foreach (var office in _detected)
+ {
+ var cb = new CheckBox
+ {
+ Content = office.DisplayName +
+ (string.IsNullOrEmpty(office.Version) ? "" : " (" + office.Version + ")"),
+ IsChecked = true,
+ Style = (Style)FindResource("FluentCheckBox"),
+ Tag = office,
+ Margin = new Thickness(0, 4, 0, 4),
+ FontSize = 14
+ };
+ OfficeListPanel.Children.Add(cb);
+ }
+ }
+
+ private void BtnSkip_Click(object sender, RoutedEventArgs e)
+ {
+ _main.ProceedToInstall();
+ }
+
+ private async void BtnRemove_Click(object sender, RoutedEventArgs e)
+ {
+ BtnRemove.IsEnabled = false;
+ BtnSkip.IsEnabled = false;
+ LogPanel.Visibility = Visibility.Visible;
+
+ bool hasC2R = false;
+ foreach (UIElement child in OfficeListPanel.Children)
+ {
+ if (child is CheckBox cb && cb.IsChecked == true)
+ {
+ var office = (InstalledOffice)cb.Tag;
+ if (office.IsClickToRun)
+ {
+ hasC2R = true;
+ }
+ else if (!string.IsNullOrEmpty(office.ProductCode))
+ {
+ AppendLog("MSI elt\u00e1vol\u00edt\u00e1s: " + office.DisplayName);
+ var runner = new ProcessRunner();
+ runner.OutputReceived += msg => Dispatcher.Invoke(() => AppendLog(msg));
+ await runner.RunAsync("msiexec", "/x " + office.ProductCode + " /qb");
+ }
+ }
+ }
+
+ if (hasC2R)
+ {
+ AppendLog("Click-to-Run Office elt\u00e1vol\u00edt\u00e1sa...");
+ var downloader = new OdtDownloader();
+ downloader.StatusChanged += msg => Dispatcher.Invoke(() => AppendLog(msg));
+
+ bool ok = await downloader.DownloadAndExtractAsync();
+ if (ok)
+ {
+ string removeXml = OdtXmlGenerator.GenerateRemoveAll();
+ string xmlPath = Path.Combine(downloader.OdtFolder, "remove.xml");
+ File.WriteAllText(xmlPath, removeXml);
+
+ int exitCode = await downloader.RunRemoveAsync(xmlPath,
+ msg => Dispatcher.Invoke(() => AppendLog(msg)));
+
+ AppendLog(exitCode == 0
+ ? "Office sikeresen elt\u00e1vol\u00edtva."
+ : "Elt\u00e1vol\u00edt\u00e1s befejez\u0151d\u00f6tt (k\u00f3d: " + exitCode + ")");
+ }
+ }
+
+ if (CbCleanLicense.IsChecked == true)
+ {
+ AppendLog("Licenc-adatb\u00e1zis tiszt\u00edt\u00e1sa...");
+ var lm = new LicenseManager();
+ if (lm.FindOspp())
+ {
+ var cleanResult = await lm.RemoveAllKeysAsync();
+ AppendLog(cleanResult);
+ }
+ else
+ {
+ AppendLog("Az ospp.vbs nem tal\u00e1lhat\u00f3 \u2014 licenc-tiszt\u00edt\u00e1s kihagyva.");
+ }
+ }
+
+ AppendLog("K\u00e9sz. Tov\u00e1bbl\u00e9p\u00e9s az \u00faj Office telep\u00edt\u00e9s\u00e9hez...");
+
+ // Auto-proceed to install after short delay
+ await System.Threading.Tasks.Task.Delay(1500);
+ _main.ProceedToInstall();
+ }
+
+ private void AppendLog(string text)
+ {
+ LogText.Text += DateTime.Now.ToString("HH:mm:ss") + " " + text + "\n";
+ LogText.ScrollToEnd();
+ }
+ }
+}