From 004cbc3f98e99f37d6db5f685c122dbc5671595f Mon Sep 17 00:00:00 2001 From: Hiroki Tokunaga Date: Thu, 9 Apr 2026 19:35:37 +0900 Subject: [PATCH] feat: print the project name in the title bar --- .../java/core/packetproxy/gui/GUIMain.java | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/main/java/core/packetproxy/gui/GUIMain.java b/src/main/java/core/packetproxy/gui/GUIMain.java index f91cac5e..fe6d1a05 100644 --- a/src/main/java/core/packetproxy/gui/GUIMain.java +++ b/src/main/java/core/packetproxy/gui/GUIMain.java @@ -25,14 +25,19 @@ import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.nio.file.Path; import javax.swing.*; import javax.swing.UIManager.LookAndFeelInfo; import javax.swing.text.DefaultEditorKit; import javax.swing.text.JTextComponent; import javax.swing.text.Keymap; +import org.apache.commons.io.FilenameUtils; import packetproxy.common.FontManager; import packetproxy.common.I18nString; +import packetproxy.model.Database; +import packetproxy.model.Database.DatabaseMessage; import packetproxy.model.InterceptModel; +import packetproxy.model.PropertyChangeEventType; import packetproxy.util.PacketProxyUtility; public class GUIMain extends JFrame implements PropertyChangeListener { @@ -50,6 +55,7 @@ public class GUIMain extends JFrame implements PropertyChangeListener { private GUIVulCheckHelper gui_vulcheckhelper; private GUILog gui_log; private InterceptModel interceptModel; + private String version; public enum Panes { HISTORY, INTERCEPT, RESENDER, VULCHECKHELPER, BULKSENDER, EXTENSIONS, OPTIONS, LOG @@ -99,11 +105,19 @@ private String getPaneString(Panes num) { private GUIMain(String title) { try { + // Extract version from title (format: "PacketProxy X.Y.Z") + this.version = title.replace("PacketProxy ", ""); setIcon(); gui_history = initProjectAndHistory(); setLookandFeel(); - setTitle(title); + + // Register for database events + Database.getInstance().addPropertyChangeListener(this); + + // Set initial title with project name + updateTitle(); + setBounds(10, 10, 1100, 850); enableFullScreenForMac(this); @@ -326,8 +340,48 @@ private void setInterceptDownLight() { tabbedpane.repaint(); } + private String getProjectDisplayName() { + try { + Database db = Database.getInstance(); + Path dbPath = db.getDatabasePath(); + + if (dbPath == null) { + return "Unknown"; + } + + String fileName = dbPath.getFileName().toString(); + + // Handle default database + if (fileName.equals("resources.sqlite3")) { + return "Default"; + } + + // Handle temporary/loaded databases + if (fileName.equals("resources_temp.sqlite3")) { + return "Temporary"; + } + + // Handle temporary projects (format: packetproxy-yyyyMMdd-HHmmss.sqlite3) + if (fileName.startsWith("packetproxy-") && fileName.matches("packetproxy-\\d{8}-\\d{6}\\.sqlite3")) { + return "Temporary"; + } + + // Extract project name from filename (remove .sqlite3 extension) + return FilenameUtils.removeExtension(fileName); + } catch (Exception e) { + return "Unknown"; + } + } + + public void updateTitle() { + String projectName = getProjectDisplayName(); + String titleText = String.format("PacketProxy %s - %s", version, projectName); + setTitle(titleText); + } + @Override public void propertyChange(PropertyChangeEvent evt) { + // Handle intercept model events if (interceptModel.getData() == null) { setInterceptDownLight(); @@ -335,5 +389,15 @@ public void propertyChange(PropertyChangeEvent evt) { setInterceptHighLight(); } + + // Handle database reconnection events to update title + if (PropertyChangeEventType.DATABASE_MESSAGE.matches(evt)) { + if (evt.getNewValue() instanceof DatabaseMessage) { + DatabaseMessage msg = (DatabaseMessage) evt.getNewValue(); + if (msg == DatabaseMessage.RECONNECT) { + SwingUtilities.invokeLater(this::updateTitle); + } + } + } } }