2525import java .awt .event .WindowEvent ;
2626import java .beans .PropertyChangeEvent ;
2727import java .beans .PropertyChangeListener ;
28+ import java .nio .file .Path ;
2829import javax .swing .*;
2930import javax .swing .UIManager .LookAndFeelInfo ;
3031import javax .swing .text .DefaultEditorKit ;
3132import javax .swing .text .JTextComponent ;
3233import javax .swing .text .Keymap ;
34+ import org .apache .commons .io .FilenameUtils ;
3335import packetproxy .common .FontManager ;
3436import packetproxy .common .I18nString ;
37+ import packetproxy .model .Database ;
38+ import packetproxy .model .Database .DatabaseMessage ;
3539import packetproxy .model .InterceptModel ;
40+ import packetproxy .model .PropertyChangeEventType ;
3641import packetproxy .util .PacketProxyUtility ;
3742
3843public class GUIMain extends JFrame implements PropertyChangeListener {
@@ -50,6 +55,7 @@ public class GUIMain extends JFrame implements PropertyChangeListener {
5055 private GUIVulCheckHelper gui_vulcheckhelper ;
5156 private GUILog gui_log ;
5257 private InterceptModel interceptModel ;
58+ private String version ;
5359
5460 public enum Panes {
5561 HISTORY , INTERCEPT , RESENDER , VULCHECKHELPER , BULKSENDER , EXTENSIONS , OPTIONS , LOG
@@ -99,11 +105,19 @@ private String getPaneString(Panes num) {
99105
100106 private GUIMain (String title ) {
101107 try {
108+ // Extract version from title (format: "PacketProxy X.Y.Z")
109+ this .version = title .replace ("PacketProxy " , "" );
102110
103111 setIcon ();
104112 gui_history = initProjectAndHistory ();
105113 setLookandFeel ();
106- setTitle (title );
114+
115+ // Register for database events
116+ Database .getInstance ().addPropertyChangeListener (this );
117+
118+ // Set initial title with project name
119+ updateTitle ();
120+
107121 setBounds (10 , 10 , 1100 , 850 );
108122 enableFullScreenForMac (this );
109123
@@ -326,14 +340,64 @@ private void setInterceptDownLight() {
326340 tabbedpane .repaint ();
327341 }
328342
343+ private String getProjectDisplayName () {
344+ try {
345+ Database db = Database .getInstance ();
346+ Path dbPath = db .getDatabasePath ();
347+
348+ if (dbPath == null ) {
349+ return "Unknown" ;
350+ }
351+
352+ String fileName = dbPath .getFileName ().toString ();
353+
354+ // Handle default database
355+ if (fileName .equals ("resources.sqlite3" )) {
356+ return "Default" ;
357+ }
358+
359+ // Handle temporary/loaded databases
360+ if (fileName .equals ("resources_temp.sqlite3" )) {
361+ return "Temporary" ;
362+ }
363+
364+ // Handle temporary projects (format: packetproxy-yyyyMMdd-HHmmss.sqlite3)
365+ if (fileName .startsWith ("packetproxy-" ) && fileName .matches ("packetproxy-\\ d{8}-\\ d{6}\\ .sqlite3" )) {
366+ return "Temporary" ;
367+ }
368+
369+ // Extract project name from filename (remove .sqlite3 extension)
370+ return FilenameUtils .removeExtension (fileName );
371+ } catch (Exception e ) {
372+ return "Unknown" ;
373+ }
374+ }
375+
376+ public void updateTitle () {
377+ String projectName = getProjectDisplayName ();
378+ String titleText = String .format ("PacketProxy %s - %s" , version , projectName );
379+ setTitle (titleText );
380+ }
381+
329382 @ Override
330383 public void propertyChange (PropertyChangeEvent evt ) {
384+ // Handle intercept model events
331385 if (interceptModel .getData () == null ) {
332386
333387 setInterceptDownLight ();
334388 } else {
335389
336390 setInterceptHighLight ();
337391 }
392+
393+ // Handle database reconnection events to update title
394+ if (PropertyChangeEventType .DATABASE_MESSAGE .matches (evt )) {
395+ if (evt .getNewValue () instanceof DatabaseMessage ) {
396+ DatabaseMessage msg = (DatabaseMessage ) evt .getNewValue ();
397+ if (msg == DatabaseMessage .RECONNECT ) {
398+ SwingUtilities .invokeLater (this ::updateTitle );
399+ }
400+ }
401+ }
338402 }
339403}
0 commit comments