Skip to content

Commit cbfd047

Browse files
authored
Merge pull request apache#7930 from troizet/improvements_show_parent_folder_name_in_tab_title
Small improvements to the “Show parent folder name in tab title” option
2 parents 94c0b0f + ad776db commit cbfd047

File tree

4 files changed

+72
-11
lines changed

4 files changed

+72
-11
lines changed

platform/core.multitabs/nbproject/project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# KIND, either express or implied. See the License for the
1515
# specific language governing permissions and limitations
1616
# under the License.
17-
javac.source=1.8
17+
javac.release=11
1818
javac.compilerargs=-Xlint -Xlint:-serial
1919
javadoc.arch=${basedir}/arch.xml
2020
nbm.needs.restart=true

platform/core.multitabs/src/org/netbeans/core/multitabs/Settings.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ public boolean isTabRowPerProject() {
8888
return impl.isTabRowPerProject();
8989
}
9090

91+
public boolean isShowFolderName() {
92+
return impl.isShowFolderName();
93+
}
94+
9195
/**
9296
* @return Maximum tab row count.
9397
*/

platform/core.multitabs/src/org/netbeans/core/multitabs/impl/DocumentSwitcherTable.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,26 @@ class DocumentSwitcherTable extends SwitcherTable {
6363

6464
private final JButton btnClose;
6565
private final Controller controller;
66-
private final ProjectColorTabDecorator decorator;
66+
private final ProjectColorTabDecorator projectColorTabDecorator;
67+
private final FolderNameTabDecorator folderNameDecorator;
6768
private final ItemBorder ITEM_BORDER = new ItemBorder();
6869
private final Border SEPARATOR_BORDER = BorderFactory.createEmptyBorder( 2, 2, 0, 5 );
6970

71+
private String itemText;
72+
7073
public DocumentSwitcherTable( Controller controller, SwitcherTableItem[] items, int y ) {
7174
super( items, y );
7275
this.controller = controller;
7376
btnClose = createCloseButton();
7477
if( Settings.getDefault().isSameProjectSameColor() ) {
75-
decorator = new ProjectColorTabDecorator();
78+
projectColorTabDecorator = new ProjectColorTabDecorator();
79+
} else {
80+
projectColorTabDecorator = null;
81+
}
82+
if( Settings.getDefault().isShowFolderName() ) {
83+
folderNameDecorator = new FolderNameTabDecorator(this);
7684
} else {
77-
decorator = null;
85+
folderNameDecorator = null;
7886
}
7987
ToolTipManager.sharedInstance().registerComponent( this );
8088
}
@@ -103,6 +111,13 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
103111
lbl.setIcon( null );
104112
lbl.setText( item.getHtmlName() );
105113
} else {
114+
if(null != folderNameDecorator && null != item) {
115+
TabData tab = item.getTabData();
116+
if(null != tab) {
117+
itemText = folderNameDecorator.getText(tab) + (item.isActive() ? " ←" : ""); //NOI18N
118+
lbl.setText(itemText);
119+
}
120+
}
106121
lbl.setBorder( ITEM_BORDER );
107122
}
108123
}
@@ -115,10 +130,10 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
115130
res.setBackground( renComponent.getBackground() );
116131
return res;
117132
}
118-
if( null != decorator && null != item && !selected ) {
133+
if( null != projectColorTabDecorator && null != item && !selected ) {
119134
TabData tab = item.getTabData();
120135
if( null != tab ) {
121-
ITEM_BORDER.color = decorator.getBackground( tab, selected);
136+
ITEM_BORDER.color = projectColorTabDecorator.getBackground( tab, selected);
122137
}
123138
}
124139
return renComponent;

platform/core.multitabs/src/org/netbeans/core/multitabs/impl/FolderNameTabDecorator.java

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,20 @@
2121
import java.awt.Color;
2222
import java.awt.Graphics;
2323
import java.awt.Rectangle;
24+
import java.io.File;
2425
import javax.swing.Icon;
26+
import javax.swing.UIManager;
2527
import org.netbeans.core.multitabs.TabDecorator;
2628
import org.netbeans.core.multitabs.prefs.SettingsImpl;
29+
import org.netbeans.swing.popupswitcher.SwitcherTable;
2730
import org.netbeans.swing.tabcontrol.TabData;
2831
import org.openide.filesystems.FileObject;
2932
import org.openide.loaders.DataObject;
3033
import org.openide.util.lookup.ServiceProvider;
3134
import org.openide.windows.TopComponent;
3235

36+
import static java.util.Objects.requireNonNullElse;
37+
3338
/**
3439
* Show the name of parent folder in tab's title.
3540
* http://netbeans.org/bugzilla/show_bug.cgi?id=222696
@@ -40,7 +45,27 @@
4045
public class FolderNameTabDecorator extends TabDecorator {
4146

4247
private final SettingsImpl settings = new SettingsImpl();
43-
private static final String pathSeparator = System.getProperty( "file.separator", "/" ); //NOI18N
48+
private final String fadeColor;
49+
private final boolean isTab;
50+
51+
/**
52+
* Decorator used for tabs
53+
*/
54+
public FolderNameTabDecorator() {
55+
fadeColor = fadeColor(
56+
requireNonNullElse(UIManager.getColor("nb.multitabs.foreground"), UIManager.getColor("TabbedPane.foreground")), //NOI18N
57+
requireNonNullElse(UIManager.getColor("nb.multitabs.background"), UIManager.getColor("TabbedPane.background")) //NOI18N
58+
);
59+
isTab = true;
60+
}
61+
62+
/**
63+
* Decorator used for switcher
64+
*/
65+
FolderNameTabDecorator(SwitcherTable switcher) {
66+
fadeColor = fadeColor(switcher.getForeground(), switcher.getBackground());
67+
isTab = false;
68+
}
4469

4570
@Override
4671
public String getText( TabData tab ) {
@@ -54,10 +79,14 @@ public String getText( TabData tab ) {
5479
if( fo.isData() ) {
5580
FileObject folder = fo.getParent();
5681
if( null != folder ) {
57-
String folderName = folder.getNameExt() + pathSeparator;
58-
String defaultText = tab.getText();
59-
60-
return merge( folderName, defaultText );
82+
String folderName = folder.getNameExt() + File.separator;
83+
// don't use faded colors in tabs when colored tabs are active
84+
// since it is difficult to get right with so many colors and shades involved
85+
// the switcher uses a line as marker instead of bg change and can continue using fade colors
86+
if (!(isTab && settings.isSameProjectSameColor())) {
87+
folderName = "<font color=\"" + fadeColor + "\">" + folderName + "</font>"; //NOI18N
88+
}
89+
return merge(folderName, tab.getText());
6190
}
6291
}
6392
}
@@ -100,4 +129,17 @@ private static String merge( String prefix, String baseText ) {
100129

101130
return res.toString();
102131
}
132+
133+
private String fadeColor(Color f, Color b) {
134+
float a = isDarkLaF() ? 0.7f : 0.6f;
135+
return String.format("#%02x%02x%02x", //NOI18N
136+
(int)(b.getRed() + a * (f.getRed() - b.getRed())),
137+
(int)(b.getGreen() + a * (f.getGreen() - b.getGreen())),
138+
(int)(b.getBlue() + a * (f.getBlue() - b.getBlue())));
139+
}
140+
141+
private static boolean isDarkLaF() {
142+
return UIManager.getBoolean("nb.dark.theme"); //NOI18N
143+
}
144+
103145
}

0 commit comments

Comments
 (0)