Skip to content

Commit

Permalink
Fix size of tab items when large text padding is used
Browse files Browse the repository at this point in the history
The recently introduced option to not show images in tab folders
currently works as follows: A large padding is applied to the tab item
as a separator with the text being centered within this padding. For
tabs showing a close icon (which in particular is the currently selected
on), this icon is added right at the right end of the tab item, such
that the text is centered in between the left end of the tab item and
the close button. This does not look perfect and while the padding is
necessary as a separator for tabs only containing a text, having close
icons and, in case of the selected tab, also a different background is
sufficient as a separator.

This change adapts the appearance of tab items having a close icon when
having images disabled. It uses the same size for the tab as if no close
icon was drawn and then reduces the area in which the text is centered
to the remaining space left to the close icon. This looks cleaner and
has the effect that tabs within a tab folder have a fixed with, such
that when changing the selection all tabs keep their size and positions.
Only the texts within the tab items change their positions depending on
whether the close icon is shown or not.
  • Loading branch information
HeikoKlare committed Jan 19, 2024
1 parent c118c8a commit 0bf36e3
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2972,19 +2972,17 @@ boolean setItemSize(GC gc) {
for (int i = 0; i < items.length; i++) {
CTabItem tab = items[i];
int width = widths[i];
if (tab.height != tabHeight || tab.width != width) {
changed = true;
tab.shortenedText = null;
tab.shortenedTextWidth = 0;
tab.height = tabHeight;
tab.width = width;
tab.closeRect.width = tab.closeRect.height = 0;
if (showClose || tab.showClose) {
if (i == selectedIndex || showUnselectedClose) {
Point closeSize = renderer.computeSize(CTabFolderRenderer.PART_CLOSE_BUTTON, SWT.NONE, gc, SWT.DEFAULT, SWT.DEFAULT);
tab.closeRect.width = closeSize.x;
tab.closeRect.height = closeSize.y;
}
changed = true;
tab.shortenedText = null;
tab.shortenedTextWidth = 0;
tab.height = tabHeight;
tab.width = width;
tab.closeRect.width = tab.closeRect.height = 0;
if (showClose || tab.showClose) {
if (i == selectedIndex || showUnselectedClose) {
Point closeSize = renderer.computeSize(CTabFolderRenderer.PART_CLOSE_BUTTON, SWT.NONE, gc, SWT.DEFAULT, SWT.DEFAULT);
tab.closeRect.width = closeSize.x;
tab.closeRect.height = closeSize.y;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,14 +358,10 @@ protected Point computeSize (int part, int state, GC gc, int wHint, int hHint) {
}
}

width += getTextPadding(item, state) * 2;

if (shouldDrawCloseIcon(item)) {
if (!applyLargeTextPadding(parent)) {
if (width > 0) width += INTERNAL_SPACING;
} else {
if (width > 0) width -= INTERNAL_SPACING;
}
if (shouldApplyLargeTextPadding(parent)) {
width += getLargeTextPadding(item) * 2;
} else if (shouldDrawCloseIcon(item)) {
if (width > 0) width += INTERNAL_SPACING;
width += computeSize(PART_CLOSE_BUTTON, SWT.NONE, gc, SWT.DEFAULT, SWT.DEFAULT).x;
}
}
Expand All @@ -385,26 +381,19 @@ private boolean shouldDrawCloseIcon(CTabItem item) {
}

/**
* Returns padding for the text of a tab when image is not available or is hidden.
*
* @param item CTabItem
* @param state current state
*
* Returns padding for the text of a tab item when showing images is disabled for the tab folder.
*/
private int getTextPadding(CTabItem item, int state) {
private int getLargeTextPadding(CTabItem item) {
CTabFolder parent = item.getParent();
String text = item.getText();

if (text != null && parent.getMinimumCharacters() != 0) {
if (applyLargeTextPadding(parent)) {
return TABS_WITHOUT_ICONS_PADDING;
}
return TABS_WITHOUT_ICONS_PADDING;
}

return 0;
}

private boolean applyLargeTextPadding(CTabFolder tabFolder) {
private boolean shouldApplyLargeTextPadding(CTabFolder tabFolder) {
return !tabFolder.showSelectedImage && !tabFolder.showUnselectedImage;
}

Expand Down Expand Up @@ -1438,7 +1427,7 @@ void drawSelected(int itemIndex, GC gc, Rectangle bounds, int state ) {
}

// draw Text
xDraw += getTextPadding(item, state);
xDraw += getLeftTextMargin(item);
int textWidth = rightEdge - xDraw - (trim.width + trim.x);
if (!parent.single && item.closeRect.width > 0) textWidth -= item.closeRect.width + INTERNAL_SPACING;
if (textWidth > 0) {
Expand Down Expand Up @@ -1478,6 +1467,17 @@ void drawSelected(int itemIndex, GC gc, Rectangle bounds, int state ) {
}
}

private int getLeftTextMargin(CTabItem item) {
int margin = 0;
if (shouldApplyLargeTextPadding(parent)) {
margin += getLargeTextPadding(item);
if (shouldDrawCloseIcon(item)) {
margin -= item.closeRect.width / 2;
}
}
return margin;
}

void drawTabArea(GC gc, Rectangle bounds, int state) {
Point size = parent.getSize();
int[] shape = null;
Expand Down Expand Up @@ -1652,7 +1652,7 @@ void drawUnselected(int index, GC gc, Rectangle bounds, int state) {
}
}
// draw Text
xDraw += getTextPadding(item, state);
xDraw += getLeftTextMargin(item);
int textWidth = x + width - xDraw - (trim.width + trim.x);
if (shouldDrawCloseIcon(item)) {
textWidth -= item.closeRect.width + INTERNAL_SPACING;
Expand Down

0 comments on commit 0bf36e3

Please sign in to comment.