From 35f464b947838c10fc87c638f515733ac020f5f7 Mon Sep 17 00:00:00 2001 From: Praveen S K Date: Wed, 10 Jan 2024 14:06:56 +0530 Subject: [PATCH] Add Options to hide tab icons and and show full text in view area (#1071) * Added CSSPropertyHandler for handling selected tab image and full text Change-Id: I220507837cf3472bfb0f5d8a24d9d596568e232a * Added hide icons and show full text options for View tabs Added UI controls in View Preference page Added handlers to hide icons and show full text for view tabs in CTabRendering Change-Id: Ib719fcb114ec0b2edaa1a8a7d0c5dd5e4a1ca075 * Refactored SelectedImageVisibility handler Change-Id: I0c194113893a21069788b9a99907c419dedf0d6e * Added minimum chars tab handler,made icons & title prefs theme dependent * Added copyright header, improved variable/method names & code formatting * Refactored CSSPropertyHandlers and CTabRendering --------- Co-authored-by: Shubham Waghmare Co-authored-by: shubhamWaghmare-sap <57699330+shubhamWaghmare-sap@users.noreply.github.com> --- bundles/org.eclipse.e4.ui.css.swt/plugin.xml | 16 ++++ ...ropertySelectedImageVisibleSWTHandler.java | 40 +++++++++ ...rtyTabTextMinimumCharactersSWTHandler.java | 56 ++++++++++++ .../renderers/swt/CTabRendering.java | 86 ++++++++++++++++++- .../ui/internal/WorkbenchMessages.java | 3 + .../internal/dialogs/ViewsPreferencePage.java | 62 ++++++++++++- .../eclipse/ui/internal/messages.properties | 3 + 7 files changed, 262 insertions(+), 4 deletions(-) create mode 100644 bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/properties/custom/CSSPropertySelectedImageVisibleSWTHandler.java create mode 100644 bundles/org.eclipse.e4.ui.css.swt/src/org/eclipse/e4/ui/css/swt/properties/custom/CSSPropertyTabTextMinimumCharactersSWTHandler.java diff --git a/bundles/org.eclipse.e4.ui.css.swt/plugin.xml b/bundles/org.eclipse.e4.ui.css.swt/plugin.xml index 667c22e7861..965de7b1293 100644 --- a/bundles/org.eclipse.e4.ui.css.swt/plugin.xml +++ b/bundles/org.eclipse.e4.ui.css.swt/plugin.xml @@ -349,6 +349,14 @@ name="swt-tab-height"> + + + + + + + + + * The default value for this preference is: false (render + * CTabFolder's with icons) + *

+ */ + public static final String HIDE_ICONS_FOR_VIEW_TABS = "HIDE_ICONS_FOR_VIEW_TABS"; //$NON-NLS-1$ + + /** + * Default value for "hide icons" preference for view tabs + */ + public static final boolean HIDE_ICONS_FOR_VIEW_TABS_DEFAULT = false; + /** + * A named preference for setting CTabFolder's to show full text in view areas + *

+ * The default value for this preference is: false (render + * CTabFolder's without full text) + *

+ */ + public static final String SHOW_FULL_TEXT_FOR_VIEW_TABS = "SHOW_FULL_TEXT_FOR_VIEW_TABS"; //$NON-NLS-1$ + + /** + * Default value for "show full text" preference for view tabs + */ + public static final boolean SHOW_FULL_TEXT_FOR_VIEW_TABS_DEFAULT = false; + + private static int MIN_VIEW_CHARS = 1; + private static int MAX_VIEW_CHARS = 9999; + + private static final String EditorTag = "EditorStack"; //$NON-NLS-1$ // Constants for circle drawing static enum CirclePart { @@ -139,6 +175,8 @@ public CTabRendering(CTabFolder parent) { parent.addDisposeListener(e -> preferences.removePreferenceChangeListener(this)); cornerRadiusPreferenceChanged(); + showFullTextForViewTabsPreferenceChanged(); + hideIconsForViewTabsPreferenceChanged(); } @Override @@ -1253,13 +1291,55 @@ private void cornerRadiusPreferenceChanged() { @Override public void preferenceChange(PreferenceChangeEvent event) { - if (!USE_ROUND_TABS.equals(event.getKey())) { - return; + if (event.getKey().equals(USE_ROUND_TABS)) { + cornerRadiusPreferenceChanged(); + } else if (event.getKey().equals(HIDE_ICONS_FOR_VIEW_TABS)) { + hideIconsForViewTabsPreferenceChanged(); + } else if (event.getKey().equals(SHOW_FULL_TEXT_FOR_VIEW_TABS)) { + showFullTextForViewTabsPreferenceChanged(); + } + } + + private void showFullTextForViewTabsPreferenceChanged() { + boolean showFullText = getShowFullTextForViewTabsPreference(); + if (!isPartOfEditorStack()) { + if (showFullText) { + Optional lengthOfLongestItemText = Arrays.stream(parent.getItems()).map(CTabItem::getText) + .map(String::length) + .max(Integer::compare); + parent.setMinimumCharacters(lengthOfLongestItemText.orElseGet(() -> MAX_VIEW_CHARS)); + } else { + parent.setMinimumCharacters(MIN_VIEW_CHARS); + } + parent.redraw(); + } + } + + private void hideIconsForViewTabsPreferenceChanged() { + boolean hideIcons = getHideIconsForViewTabsPreference(); + if (!isPartOfEditorStack()) { + parent.setSelectedImageVisible(!hideIcons); + parent.setUnselectedImageVisible(!hideIcons); + parent.redraw(); } - cornerRadiusPreferenceChanged(); } private IEclipsePreferences getSwtRendererPreferences() { return InstanceScope.INSTANCE.getNode("org.eclipse.e4.ui.workbench.renderers.swt"); //$NON-NLS-1$ } + + private boolean isPartOfEditorStack() { + MUIElement element = (MUIElement) parent.getData(AbstractPartRenderer.OWNING_ME); + return element != null && element.getTags().contains(EditorTag); + } + + private boolean getHideIconsForViewTabsPreference() { + IEclipsePreferences preferences = getSwtRendererPreferences(); + return preferences.getBoolean(HIDE_ICONS_FOR_VIEW_TABS, HIDE_ICONS_FOR_VIEW_TABS_DEFAULT); + } + + private boolean getShowFullTextForViewTabsPreference() { + IEclipsePreferences preferences = getSwtRendererPreferences(); + return preferences.getBoolean(SHOW_FULL_TEXT_FOR_VIEW_TABS, SHOW_FULL_TEXT_FOR_VIEW_TABS_DEFAULT); + } } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java index a1f93b17a4f..d37b8fff5e9 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java @@ -462,6 +462,9 @@ public class WorkbenchMessages extends NLS { public static String ViewsPreference_visibleTabs_description; public static String ViewsPreference_enableMRU; public static String ViewsPreference_useColoredLabels; + public static String ViewsPreference_viewTabs_icons_and_titles_label; + public static String ViewsPreference_showFullTextForViewTabs; + public static String ViewsPreference_hideIconsForViewTabs; public static String ToggleFullScreenMode_ActivationPopup_Description; public static String ToggleFullScreenMode_ActivationPopup_Description_NoKeybinding; public static String ToggleFullScreenMode_ActivationPopup_DoNotShowAgain; diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java index e7779afae7f..d6f5cf79438 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java @@ -62,6 +62,8 @@ import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -107,6 +109,9 @@ public class ViewsPreferencePage extends PreferencePage implements IWorkbenchPre private Button themingEnabled; + private Button hideIconsForViewTabs; + private Button showFullTextForViewTabs; + @Override protected Control createContents(Composite parent) { initializeDialogUnits(parent); @@ -162,6 +167,11 @@ protected Control createContents(Composite parent) { createThemeIndependentComposits(comp); + // Theme dependent controls for Tab icons and titles in view areas + createShowFullTextForViewTabs(comp); + createHideIconsForViewTabs(comp); + createDependency(showFullTextForViewTabs, hideIconsForViewTabs); + if (currentTheme != null) { String colorsAndFontsThemeId = getColorAndFontThemeIdByThemeId(currentTheme.getId()); if (colorsAndFontsThemeId != null && !currentColorsAndFontsTheme.getId().equals(colorsAndFontsThemeId)) { @@ -180,6 +190,52 @@ private void createThemeIndependentComposits(Composite comp) { createEnableMruPref(comp); } + protected void createShowFullTextForViewTabs(Composite composite) { + IEclipsePreferences prefs = getSwtRendererPreferences(); + boolean actualValue = prefs.getBoolean(CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS, + CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS_DEFAULT); + createLabel(composite, ""); //$NON-NLS-1$ + createLabel(composite, WorkbenchMessages.ViewsPreference_viewTabs_icons_and_titles_label); + showFullTextForViewTabs = createCheckButton(composite, + WorkbenchMessages.ViewsPreference_showFullTextForViewTabs, actualValue); + } + + protected void createHideIconsForViewTabs(Composite composite) { + IEclipsePreferences prefs = getSwtRendererPreferences(); + boolean actualValue = prefs.getBoolean(CTabRendering.HIDE_ICONS_FOR_VIEW_TABS, + CTabRendering.HIDE_ICONS_FOR_VIEW_TABS_DEFAULT); + hideIconsForViewTabs = createCheckButton(composite, WorkbenchMessages.ViewsPreference_hideIconsForViewTabs, + actualValue); + } + + /** + * @param showFullTextForViewTabs + * @param hideIconsForViewTabs + */ + private void createDependency(Button parent, Button dependent) { + GridData gridData = new GridData(); + gridData.horizontalIndent = 20; + dependent.setLayoutData(gridData); + + boolean parentState = parent.getSelection(); + dependent.setEnabled(parentState); + + SelectionListener listener = new SelectionListener() { + @Override + public void widgetSelected(SelectionEvent e) { + boolean state = parent.getSelection(); + dependent.setEnabled(state); + if (!state) { + dependent.setSelection(state); + } + } + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + }; + parent.addSelectionListener(listener); + } + private List getCSSThemes(boolean highContrastMode) { ArrayList themes = new ArrayList<>(); for (ITheme theme : engine.getThemes()) { @@ -257,17 +313,19 @@ public void init(IWorkbench workbench) { @Override public boolean performOk() { + IEclipsePreferences prefs = getSwtRendererPreferences(); if (engine != null) { ITheme theme = getSelectedTheme(); if (theme != null) { engine.setTheme(getSelectedTheme(), !highContrastMode); } + prefs.putBoolean(CTabRendering.HIDE_ICONS_FOR_VIEW_TABS, hideIconsForViewTabs.getSelection()); + prefs.putBoolean(CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS, showFullTextForViewTabs.getSelection()); } IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); apiStore.setValue(IWorkbenchPreferenceConstants.USE_COLORED_LABELS, useColoredLabels.getSelection()); - IEclipsePreferences prefs = getSwtRendererPreferences(); prefs.putBoolean(StackRenderer.MRU_KEY, enableMru.getSelection()); boolean themingEnabledChanged = prefs.getBoolean(PartRenderingEngine.ENABLED_THEME_KEY, true) != themingEnabled .getSelection(); @@ -342,6 +400,8 @@ protected void performDefaults() { if (engine.getActiveTheme() != null) { themeIdCombo.setSelection(new StructuredSelection(engine.getActiveTheme())); } + hideIconsForViewTabs.setSelection(CTabRendering.HIDE_ICONS_FOR_VIEW_TABS_DEFAULT); + showFullTextForViewTabs.setSelection(CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS_DEFAULT); } IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); useColoredLabels.setSelection(apiStore.getDefaultBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)); diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties index f947077ec77..0323fecc052 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties @@ -430,6 +430,9 @@ ViewsPreference_useRoundTabs=&Use round tabs ViewsPreference_useColoredLabels = &Use mixed fonts and colors for labels ViewsPreference_visibleTabs_description = Visible tabs on overflow: ViewsPreference_enableMRU = Show &most recently used tabs +ViewsPreference_showFullTextForViewTabs = Always show full titles +ViewsPreference_hideIconsForViewTabs = Hide icons +ViewsPreference_viewTabs_icons_and_titles_label = Tab icons and titles in view areas: ToggleFullScreenMode_ActivationPopup_Description=You have gone full screen. Use the Toggle Full Screen command ({0}) to deactivate. ToggleFullScreenMode_ActivationPopup_Description_NoKeybinding=You have gone full screen. Use the Toggle Full Screen command to deactivate. ToggleFullScreenMode_ActivationPopup_DoNotShowAgain=Do not show again