Skip to content

Commit 40edabf

Browse files
praveen-skpsratz
authored andcommitted
Added dynamic tab alignment support in MultiPageEditorPart
- Added a new preference for multi-page editor tab alignment. - Added a preference change listener to MultiPageEditorPart. - Updated tab style based on the user's preference.
1 parent c5928bb commit 40edabf

File tree

6 files changed

+96
-3
lines changed

6 files changed

+96
-3
lines changed

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEEditorsPreferencePage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ protected Control createContents(Composite parent) {
6262
createUseIPersistablePref(composite);
6363
createPromptWhenStillOpenPref(composite);
6464
createEditorReuseGroup(composite);
65+
createAlignMultiPageEditorTabsOnTop(composite);
6566

6667
applyDialogFont(composite);
6768

bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/IWorkbenchPreferenceConstants.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,21 @@ public interface IWorkbenchPreferenceConstants {
624624
*/
625625
String DISABLE_OPEN_EDITOR_IN_PLACE = "DISABLE_OPEN_EDITOR_IN_PLACE"; //$NON-NLS-1$
626626

627+
/**
628+
* Workbench preference id for whether the tabs in the multi-page editor is
629+
* displayed on top. Note that tabs will be shown in the top only if this
630+
* preference is <code>true</code>.
631+
*
632+
* Boolean-valued: <code>true</code> show the tabs on the top, and
633+
* <code>false</code> if shown at the bottom.
634+
* <p>
635+
* The default value for this preference is: <code>false</code>
636+
* </p>
637+
*
638+
* @since 3.133
639+
*/
640+
String ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP = "ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP"; //$NON-NLS-1$
641+
627642
/**
628643
* Workbench preference id for indicating the size of the list of most recently
629644
* used working sets.

bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ public class WorkbenchMessages extends NLS {
462462
public static String WorkbenchPreference_stickyCycleButton;
463463
public static String WorkbenchPreference_RunInBackgroundButton;
464464
public static String WorkbenchPreference_RunInBackgroundToolTip;
465+
public static String WorkbenchPreference_AlignMultiPageEditorTabsOnTopButton;
465466

466467
// --- Appearance ---
467468
public static String ViewsPreferencePage_Theme;

bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/EditorsPreferencePage.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public class EditorsPreferencePage extends PreferencePage implements IWorkbenchP
7474

7575
private Button allowInplaceEditor;
7676

77+
private Button alignMultiPageEditorTabsOnTop;
78+
7779
@Override
7880
protected Control createContents(Composite parent) {
7981
Composite composite = createComposite(parent);
@@ -132,6 +134,15 @@ protected void createPromptWhenStillOpenPref(Composite composite) {
132134
setButtonLayoutData(promptWhenStillOpenEditor);
133135
}
134136

137+
protected void createAlignMultiPageEditorTabsOnTop(Composite composite) {
138+
alignMultiPageEditorTabsOnTop = new Button(composite, SWT.CHECK);
139+
alignMultiPageEditorTabsOnTop
140+
.setText(WorkbenchMessages.WorkbenchPreference_AlignMultiPageEditorTabsOnTopButton);
141+
alignMultiPageEditorTabsOnTop.setSelection(
142+
getAPIPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP));
143+
setButtonLayoutData(alignMultiPageEditorTabsOnTop);
144+
}
145+
135146
protected Composite createComposite(Composite parent) {
136147
Composite composite = new Composite(parent, SWT.NULL);
137148
GridLayout layout = new GridLayout();
@@ -152,6 +163,8 @@ protected void performDefaults() {
152163
IPreferenceStore store = getPreferenceStore();
153164
allowInplaceEditor.setSelection(
154165
!getAPIPreferenceStore().getDefaultBoolean(IWorkbenchPreferenceConstants.DISABLE_OPEN_EDITOR_IN_PLACE));
166+
alignMultiPageEditorTabsOnTop.setSelection(getAPIPreferenceStore()
167+
.getDefaultBoolean(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP));
155168
useIPersistableEditor.setSelection(store.getDefaultBoolean(IPreferenceConstants.USE_IPERSISTABLE_EDITORS));
156169
promptWhenStillOpenEditor.setSelection(getAPIPreferenceStore()
157170
.getDefaultBoolean(IWorkbenchPreferenceConstants.PROMPT_WHEN_SAVEABLE_STILL_OPEN));
@@ -165,6 +178,8 @@ protected void performDefaults() {
165178
@Override
166179
public boolean performOk() {
167180
IPreferenceStore store = getPreferenceStore();
181+
getAPIPreferenceStore().setValue(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP,
182+
alignMultiPageEditorTabsOnTop.getSelection());
168183
getAPIPreferenceStore().setValue(IWorkbenchPreferenceConstants.DISABLE_OPEN_EDITOR_IN_PLACE,
169184
!allowInplaceEditor.getSelection());
170185
store.setValue(IPreferenceConstants.USE_IPERSISTABLE_EDITORS, useIPersistableEditor.getSelection());

bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ WorkbenchPreference_RunInBackgroundButton=Always r&un in background
419419
WorkbenchPreference_RunInBackgroundToolTip=Run long operations in the background where possible
420420
WorkbenchPreference_HeapStatusButton = Sho&w heap status
421421
WorkbenchPreference_HeapStatusButtonToolTip = Show the heap status area on the bottom of the window
422+
WorkbenchPreference_AlignMultiPageEditorTabsOnTopButton= &Align multi-page editor tabs on top
422423

423424

424425
# --- Appearance ---
@@ -493,7 +494,7 @@ OpenPerspectiveDialogAction_tooltip=Open Perspective
493494

494495
#---- General Preferences----
495496
PreferencePage_noDescription = (No description available)
496-
PreferencePageParameterValues_pageLabelSeparator = \ >\
497+
PreferencePageParameterValues_pageLabelSeparator = \ >\
497498
ThemingEnabled = E&nable theming
498499
ThemeChangeWarningText = Restart for the theme changes to take full effect
499500
ThemeChangeWarningTitle = Theme Changed

bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/part/MultiPageEditorPart.java

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
1919

20+
import java.beans.PropertyChangeListener;
2021
import java.util.ArrayList;
2122
import java.util.List;
2223
import org.eclipse.core.commands.AbstractHandler;
@@ -32,7 +33,9 @@
3233
import org.eclipse.jface.dialogs.IPageChangeProvider;
3334
import org.eclipse.jface.dialogs.IPageChangedListener;
3435
import org.eclipse.jface.dialogs.PageChangedEvent;
36+
import org.eclipse.jface.preference.IPreferenceStore;
3537
import org.eclipse.jface.resource.ImageDescriptor;
38+
import org.eclipse.jface.util.PropertyChangeEvent;
3639
import org.eclipse.jface.util.SafeRunnable;
3740
import org.eclipse.jface.viewers.ISelectionProvider;
3841
import org.eclipse.jface.viewers.SelectionChangedEvent;
@@ -56,13 +59,15 @@
5659
import org.eclipse.ui.IPartService;
5760
import org.eclipse.ui.IWorkbenchPart;
5861
import org.eclipse.ui.IWorkbenchPartSite;
62+
import org.eclipse.ui.IWorkbenchPreferenceConstants;
5963
import org.eclipse.ui.PartInitException;
6064
import org.eclipse.ui.handlers.IHandlerService;
6165
import org.eclipse.ui.internal.PartSite;
6266
import org.eclipse.ui.internal.WorkbenchPlugin;
6367
import org.eclipse.ui.internal.misc.Policy;
6468
import org.eclipse.ui.internal.services.INestable;
6569
import org.eclipse.ui.internal.services.IServiceLocatorCreator;
70+
import org.eclipse.ui.internal.util.PrefUtil;
6671
import org.eclipse.ui.services.IDisposable;
6772
import org.eclipse.ui.services.IServiceLocator;
6873

@@ -149,10 +154,31 @@ public abstract class MultiPageEditorPart extends EditorPart implements IPageCha
149154
private ListenerList<IPageChangedListener> pageChangeListeners = new ListenerList<>(ListenerList.IDENTITY);
150155

151156
/**
152-
* Creates an empty multi-page editor with no pages.
157+
* Creates an empty multi-page editor with no pages and registers a
158+
* {@link PropertyChangeListener} to listen for changes to the editor's
159+
* preference..
153160
*/
154161
protected MultiPageEditorPart() {
155162
super();
163+
getAPIPreferenceStore().addPropertyChangeListener(event -> {
164+
handlePropertyChange(event);
165+
});
166+
}
167+
168+
/**
169+
* Handles property change events related to editor preferences.
170+
*
171+
* <p>
172+
* This method is invoked when a property change occurs in the preference store.
173+
* </p>
174+
*
175+
* @param event the {@link PropertyChangeEvent} triggered by a change in the
176+
* preference store
177+
*/
178+
private void handlePropertyChange(PropertyChangeEvent event) {
179+
if (event.getProperty().equals(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP)) {
180+
updateContainer();
181+
}
156182
}
157183

158184
/**
@@ -264,7 +290,7 @@ protected CTabFolder createContainer(Composite parent) {
264290
// use SWT.FLAT style so that an extra 1 pixel border is not reserved
265291
// inside the folder
266292
parent.setLayout(new FillLayout());
267-
final CTabFolder newContainer = new CTabFolder(parent, SWT.BOTTOM | SWT.FLAT);
293+
final CTabFolder newContainer = new CTabFolder(parent, getPreferredTabStyle());
268294
newContainer.addSelectionListener(widgetSelectedAdapter(e -> {
269295
int newPageIndex = newContainer.indexOf((CTabItem) e.item);
270296
pageChange(newPageIndex);
@@ -291,6 +317,31 @@ protected CTabFolder createContainer(Composite parent) {
291317
return newContainer;
292318
}
293319

320+
/**
321+
* Determines the preferred tab style based on user preferences.
322+
* <p>
323+
* This method retrieves the user preference for aligning multi-page editor tabs
324+
* on top or bottom, and returns the corresponding SWT style constant.
325+
* </p>
326+
*
327+
* @return {@code SWT.TOP} if the user prefers tabs to be aligned on top,
328+
* {@code SWT.BOTTOM} if the user prefers tabs to be aligned on the
329+
* bottom.
330+
*/
331+
private int getPreferredTabStyle() {
332+
boolean alignTabsOnTop = getAPIPreferenceStore()
333+
.getBoolean(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP);
334+
int style = alignTabsOnTop ? SWT.TOP : SWT.BOTTOM;
335+
return style;
336+
}
337+
338+
/**
339+
* @since 3.133
340+
*/
341+
protected IPreferenceStore getAPIPreferenceStore() {
342+
return PrefUtil.getAPIPreferenceStore();
343+
}
344+
294345
/**
295346
* Creates a tab item at the given index and places the given control in the new
296347
* item. The item is a CTabItem with no style bits set.
@@ -1230,4 +1281,13 @@ public void run() {
12301281
});
12311282
}
12321283
}
1284+
1285+
private void updateContainer() {
1286+
Composite container = getContainer();
1287+
if (container instanceof CTabFolder tabFolder) {
1288+
tabFolder.setTabPosition(getPreferredTabStyle());
1289+
tabFolder.requestLayout();
1290+
}
1291+
}
1292+
12331293
}

0 commit comments

Comments
 (0)