From 1591db611f5a59961e8cb643a4ba684bbe896fb3 Mon Sep 17 00:00:00 2001
From: Alexey Borokhvostov <troizet@gmail.com>
Date: Thu, 31 Oct 2024 22:43:21 +0700
Subject: [PATCH] =?UTF-8?q?Small=20improvements=20to=20the=20=E2=80=9CShow?=
 =?UTF-8?q?=20parent=20folder=20name=20in=20tab=20title=E2=80=9D=20option:?=
 =?UTF-8?q?=20-=20parent=20folder=20name=20is=20displayed=20in=20opened=20?=
 =?UTF-8?q?documents=20list;=20-=20parent=20folder=20name=20is=20displayed?=
 =?UTF-8?q?=20in=20a=20different=20color=20from=20the=20file=20name.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../org/netbeans/core/multitabs/Settings.java |  4 +++
 .../multitabs/impl/DocumentSwitcherTable.java | 25 +++++++++++++++----
 .../impl/FolderNameTabDecorator.java          |  4 ++-
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/platform/core.multitabs/src/org/netbeans/core/multitabs/Settings.java b/platform/core.multitabs/src/org/netbeans/core/multitabs/Settings.java
index c41aa91512aa..2982808c7b73 100644
--- a/platform/core.multitabs/src/org/netbeans/core/multitabs/Settings.java
+++ b/platform/core.multitabs/src/org/netbeans/core/multitabs/Settings.java
@@ -88,6 +88,10 @@ public boolean isTabRowPerProject() {
         return impl.isTabRowPerProject();
     }
 
+    public boolean isShowFolderName() {
+        return impl.isShowFolderName();
+    }
+
     /**
      * @return Maximum tab row count.
      */
diff --git a/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/DocumentSwitcherTable.java b/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/DocumentSwitcherTable.java
index 4ff3786b3ac2..4fe8f4b80160 100644
--- a/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/DocumentSwitcherTable.java
+++ b/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/DocumentSwitcherTable.java
@@ -63,18 +63,26 @@ class DocumentSwitcherTable extends SwitcherTable {
 
     private final JButton btnClose;
     private final Controller controller;
-    private final ProjectColorTabDecorator decorator;
+    private final ProjectColorTabDecorator projectColorTabDecorator;
+    private final FolderNameTabDecorator folderNameDecorator;
     private final ItemBorder ITEM_BORDER = new ItemBorder();
     private final Border SEPARATOR_BORDER = BorderFactory.createEmptyBorder( 2, 2, 0, 5 );
 
+    private String itemText;
+
     public DocumentSwitcherTable( Controller controller, SwitcherTableItem[] items, int y ) {
         super( items, y );
         this.controller = controller;
         btnClose = createCloseButton();
         if( Settings.getDefault().isSameProjectSameColor() ) {
-            decorator = new ProjectColorTabDecorator();
+            projectColorTabDecorator = new ProjectColorTabDecorator();
+        } else {
+            projectColorTabDecorator = null;
+        }
+        if( Settings.getDefault().isShowFolderName() ) {
+            folderNameDecorator = new FolderNameTabDecorator();
         } else {
-            decorator = null;
+            folderNameDecorator = null;
         }
         ToolTipManager.sharedInstance().registerComponent( this );
     }
@@ -103,6 +111,13 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
                 lbl.setIcon( null );
                 lbl.setText( item.getHtmlName() );
             } else {
+                if(null != folderNameDecorator && null != item) {
+                    TabData tab = item.getTabData();
+                    if(null != tab) {
+                        itemText = folderNameDecorator.getText(tab) + (item.isActive() ? " ←" : ""); //NOI18N
+                        lbl.setText(itemText);
+                    }
+                }
                 lbl.setBorder( ITEM_BORDER );
             }
         }
@@ -115,10 +130,10 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
             res.setBackground( renComponent.getBackground() );
             return res;
         }
-        if( null != decorator && null != item && !selected ) {
+        if( null != projectColorTabDecorator && null != item && !selected ) {
             TabData tab = item.getTabData();
             if( null != tab ) {
-                ITEM_BORDER.color = decorator.getBackground( tab, selected);
+                ITEM_BORDER.color = projectColorTabDecorator.getBackground( tab, selected);
             }
         }
         return renComponent;
diff --git a/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/FolderNameTabDecorator.java b/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/FolderNameTabDecorator.java
index c9fab2d77250..a21f90c50a07 100644
--- a/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/FolderNameTabDecorator.java
+++ b/platform/core.multitabs/src/org/netbeans/core/multitabs/impl/FolderNameTabDecorator.java
@@ -41,6 +41,8 @@ public class FolderNameTabDecorator extends TabDecorator {
 
     private final SettingsImpl settings = new SettingsImpl();
     private static final String pathSeparator = System.getProperty( "file.separator", "/" ); //NOI18N
+    private static final String FONT_COLOR = "<font color=\"#9f9d9b\">"; //NOI18N
+    private static final String FONT_COLOR_END = "</font>"; //NOI18N
 
     @Override
     public String getText( TabData tab ) {
@@ -54,7 +56,7 @@ public String getText( TabData tab ) {
                 if( fo.isData() ) {
                     FileObject folder = fo.getParent();
                     if( null != folder ) {
-                        String folderName = folder.getNameExt() + pathSeparator;
+                        String folderName = FONT_COLOR + folder.getNameExt() + pathSeparator + FONT_COLOR_END;
                         String defaultText = tab.getText();
 
                         return merge( folderName, defaultText );