1717
1818import static org .eclipse .swt .events .SelectionListener .widgetSelectedAdapter ;
1919
20+ import java .beans .PropertyChangeListener ;
2021import java .util .ArrayList ;
2122import java .util .List ;
2223import org .eclipse .core .commands .AbstractHandler ;
3233import org .eclipse .jface .dialogs .IPageChangeProvider ;
3334import org .eclipse .jface .dialogs .IPageChangedListener ;
3435import org .eclipse .jface .dialogs .PageChangedEvent ;
36+ import org .eclipse .jface .preference .IPreferenceStore ;
3537import org .eclipse .jface .resource .ImageDescriptor ;
38+ import org .eclipse .jface .util .PropertyChangeEvent ;
3639import org .eclipse .jface .util .SafeRunnable ;
3740import org .eclipse .jface .viewers .ISelectionProvider ;
3841import org .eclipse .jface .viewers .SelectionChangedEvent ;
5659import org .eclipse .ui .IPartService ;
5760import org .eclipse .ui .IWorkbenchPart ;
5861import org .eclipse .ui .IWorkbenchPartSite ;
62+ import org .eclipse .ui .IWorkbenchPreferenceConstants ;
5963import org .eclipse .ui .PartInitException ;
6064import org .eclipse .ui .handlers .IHandlerService ;
6165import org .eclipse .ui .internal .PartSite ;
6266import org .eclipse .ui .internal .WorkbenchPlugin ;
6367import org .eclipse .ui .internal .misc .Policy ;
6468import org .eclipse .ui .internal .services .INestable ;
6569import org .eclipse .ui .internal .services .IServiceLocatorCreator ;
70+ import org .eclipse .ui .internal .util .PrefUtil ;
6671import org .eclipse .ui .services .IDisposable ;
6772import 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