diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/internal/workbench/renderers/swt/BasicPartList.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/internal/workbench/renderers/swt/BasicPartList.java index 27d5cc2ab81..47e90c5940a 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/internal/workbench/renderers/swt/BasicPartList.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/internal/workbench/renderers/swt/BasicPartList.java @@ -72,7 +72,7 @@ public Font getFont(Object element) { public String getText(Object element) { if (element instanceof MDirtyable && ((MDirtyable) element).isDirty()) { - return "*" + ((MUILabel) element).getLocalizedLabel(); //$NON-NLS-1$ + return ((MUILabel) element).getLocalizedLabel() + " ●"; //$NON-NLS-1$ } return ((MUILabel) element).getLocalizedLabel(); } diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/CTabRendering.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/CTabRendering.java index f44e67e2297..5d08697a336 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/CTabRendering.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/CTabRendering.java @@ -90,6 +90,21 @@ public class CTabRendering extends CTabFolderRenderer implements ICTabRendering, */ public static final boolean SHOW_FULL_TEXT_FOR_VIEW_TABS_DEFAULT = false; + /** + * A named preference for setting CTabFolder's to be rendered with dirty + * indicator overlay on close button + *

+ * The default value for this preference is: false (render + * CTabFolder's with icons) + *

+ */ + public static final String SHOW_DIRTY_INDICATOR_ON_TABS = "SHOW_DIRTY_INDICATOR_ON_TABS"; //$NON-NLS-1$ + + /** + * Default value for "dirty indicator" preference for tabs + */ + public static final boolean SHOW_DIRTY_INDICATOR_ON_TABS_DEFAULT = false; + private static int MIN_VIEW_CHARS = 1; private static int MAX_VIEW_CHARS = Integer.MAX_VALUE; @@ -616,6 +631,7 @@ void drawSelectedTab(int itemIndex, GC gc, Rectangle bounds) { } if (selectedTabHighlightColor != null) { + Color originalBackground = gc.getBackground(); gc.setBackground(selectedTabHighlightColor); boolean highlightOnTop = drawTabHighlightOnTop; if (onBottom) { @@ -627,6 +643,7 @@ void drawSelectedTab(int itemIndex, GC gc, Rectangle bounds) { int widthAdjustment = cornerSize == SQUARE_CORNER ? 0 : 1; gc.fillRectangle(bounds.x + horizontalOffset, bounds.y + verticalOffset, bounds.width - widthAdjustment, highlightHeight); + gc.setBackground(originalBackground); } if (backgroundPattern != null) { diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java index 9d5eb842923..ed76dd4d35d 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java @@ -647,6 +647,7 @@ protected void updateTab(CTabItem cti, MPart part, String attName, Object newVal break; case UIEvents.Dirtyable.DIRTY: cti.setText(getLabel(part, part.getLocalizedLabel())); + cti.setShowDirty(part.isDirty() && getShowDirtyIndicatorForTabsFromPreferences()); break; case UIEvents.UILabel.ICONURI: changePartTabImage(part, cti); @@ -683,7 +684,8 @@ private String getLabel(MUILabel itemPart, String newName) { newName = LegacyActionTools.escapeMnemonics(newName); } - if (itemPart instanceof MDirtyable && ((MDirtyable) itemPart).isDirty()) { + if (itemPart instanceof MDirtyable && ((MDirtyable) itemPart).isDirty() + && !getShowDirtyIndicatorForTabsFromPreferences()) { newName = '*' + newName; } return newName; @@ -822,6 +824,11 @@ private boolean getMRUValueFromPreferences() { return preferences.getBoolean(MRU_KEY, initialMRUValue); } + private boolean getShowDirtyIndicatorForTabsFromPreferences() { + return preferences.getBoolean(CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS, + CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS_DEFAULT); + } + private void updateMRUValue(CTabFolder tabFolder) { boolean actualMRUValue = getMRUValue(); tabFolder.setMRUVisible(actualMRUValue); diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/FilteredTableBaseHandler.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/FilteredTableBaseHandler.java index b28e4ddde03..36082e76ef6 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/FilteredTableBaseHandler.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/FilteredTableBaseHandler.java @@ -815,7 +815,7 @@ private PerspectiveLabelProvider getPerspectiveLabelProvider() { /** Returns the text for the given {@link WorkbenchPartReference} */ protected String getWorkbenchPartReferenceText(WorkbenchPartReference ref) { if (ref.isDirty()) { - return "*" + ref.getTitle(); //$NON-NLS-1$ + return ref.getTitle() + " ●"; //$NON-NLS-1$ } return ref.getTitle(); } diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchMessages.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchMessages.java index ec1e7cc8554..df116af06b9 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchMessages.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbenchMessages.java @@ -477,6 +477,8 @@ public class WorkbenchMessages extends NLS { public static String ViewsPreference_viewTabs_icons_and_titles_label; public static String ViewsPreference_showFullTextForViewTabs; public static String ViewsPreference_hideIconsForViewTabs; + public static String ViewsPreference_viewTabs_preferences_label; + public static String ViewsPreference_showDirtyIndicatorForTabs; 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/eclipseui/org/eclipse/ui/internal/WorkbookEditorsHandler.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbookEditorsHandler.java index 8164d4ecffb..f834b8a6b0d 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbookEditorsHandler.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/WorkbookEditorsHandler.java @@ -82,6 +82,11 @@ public class WorkbookEditorsHandler extends FilteredTableBaseHandler { */ private static final String DIRTY_PREFIX = "*"; //$NON-NLS-1$ + /** + * Prefix used to mark Editors that are dirty (unsaved changes). + */ + private static final String DIRTY_INDICATOR = " ●"; //$NON-NLS-1$ + /** * Used to signify that matching path segments have been omitted from modified * file paths. @@ -298,7 +303,7 @@ private Path getPathSegment(Integer segmentIndex, java.nio.file.Path path) { */ private String prependDirtyIndicationIfDirty(EditorReference editorReference, String labelText) { if (editorReference.isDirty()) { - return DIRTY_PREFIX + labelText; + return labelText + DIRTY_INDICATOR; // DIRTY_PREFIX + labelText; } return labelText; } diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java index 5f9e07422b0..28e724497a6 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/ViewsPreferencePage.java @@ -123,6 +123,8 @@ public class ViewsPreferencePage extends PreferencePage implements IWorkbenchPre private Button hideIconsForViewTabs; private Button showFullTextForViewTabs; + private Button showDirtyIndicatorForTabs; + @Override protected Control createContents(Composite parent) { initializeDialogUnits(parent); @@ -186,6 +188,8 @@ protected Control createContents(Composite parent) { createHideIconsForViewTabs(comp); createDependency(showFullTextForViewTabs, hideIconsForViewTabs); + createShowDiryIndicatorForTabs(comp); + createHiDPISettingsGroup(comp); if (currentTheme != null) { @@ -246,6 +250,15 @@ protected void createHideIconsForViewTabs(Composite composite) { actualValue); } + protected void createShowDiryIndicatorForTabs(Composite composite) { + boolean actualValue = getSwtRendererPreference(CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS, + CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS_DEFAULT); + createLabel(composite, ""); //$NON-NLS-1$ + createLabel(composite, WorkbenchMessages.ViewsPreference_viewTabs_preferences_label); + showDirtyIndicatorForTabs = createCheckButton(composite, + WorkbenchMessages.ViewsPreference_showDirtyIndicatorForTabs, actualValue); + } + private boolean getSwtRendererPreference(String prefName, boolean defaultValue) { return Platform.getPreferencesService().getBoolean(PREF_QUALIFIER_ECLIPSE_E4_UI_WORKBENCH_RENDERERS_SWT, prefName, defaultValue, null); @@ -362,6 +375,7 @@ public boolean performOk() { } prefs.putBoolean(CTabRendering.HIDE_ICONS_FOR_VIEW_TABS, hideIconsForViewTabs.getSelection()); prefs.putBoolean(CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS, showFullTextForViewTabs.getSelection()); + prefs.putBoolean(CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS, showDirtyIndicatorForTabs.getSelection()); } IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); @@ -458,6 +472,8 @@ protected void performDefaults() { showFullTextForViewTabs.setSelection(defaultPrefs.getBoolean(CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS, CTabRendering.SHOW_FULL_TEXT_FOR_VIEW_TABS_DEFAULT)); showFullTextForViewTabs.notifyListeners(SWT.Selection, null); + showDirtyIndicatorForTabs.setSelection(defaultPrefs.getBoolean(CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS, + CTabRendering.SHOW_DIRTY_INDICATOR_ON_TABS_DEFAULT)); } IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); useColoredLabels.setSelection(apiStore.getDefaultBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)); diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/WorkbenchEditorsDialog.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/WorkbenchEditorsDialog.java index 4084dc88066..863c267945c 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/WorkbenchEditorsDialog.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/dialogs/WorkbenchEditorsDialog.java @@ -682,7 +682,7 @@ String[] getText() { text = new String[2]; if (editorRef != null) { if (editorRef.isDirty()) { - text[0] = "*" + editorRef.getTitle(); //$NON-NLS-1$ + text[0] = editorRef.getTitle() + " ●"; //$NON-NLS-1$ } else { text[0] = editorRef.getTitle(); } diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/messages.properties b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/messages.properties index ead0040533a..ed2e47d9bd4 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/messages.properties +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/messages.properties @@ -435,6 +435,8 @@ 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: +ViewsPreference_showDirtyIndicatorForTabs = Indicate unsaved changes by overlaying the close button +ViewsPreference_viewTabs_preferences_label = Tab preferences: 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 diff --git a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/quickaccess/providers/EditorElement.java b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/quickaccess/providers/EditorElement.java index 6097d74ef1b..dddd7992e10 100644 --- a/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/quickaccess/providers/EditorElement.java +++ b/bundles/org.eclipse.ui.workbench/eclipseui/org/eclipse/ui/internal/quickaccess/providers/EditorElement.java @@ -28,7 +28,8 @@ */ public class EditorElement extends QuickAccessElement { - private static final String DIRTY_MARK = "*"; //$NON-NLS-1$ +// private static final String DIRTY_PREFIX = "*"; //$NON-NLS-1$ + private static final String DIRTY_INDICATOR = " ●"; //$NON-NLS-1$ private IEditorReference editorReference; private boolean dirty; @@ -65,7 +66,8 @@ public ImageDescriptor getImageDescriptor() { @Override public String getLabel() { - return (dirty ? DIRTY_MARK : "") + editorReference.getTitle() + separator + editorReference.getTitleToolTip(); //$NON-NLS-1$ + return editorReference.getTitle() + (dirty ? DIRTY_INDICATOR : "") + separator //$NON-NLS-1$ + + editorReference.getTitleToolTip(); } @Override