Skip to content

Commit

Permalink
Added dynamic tab alignment support in MultiPageEditorPart
Browse files Browse the repository at this point in the history
- 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.
  • Loading branch information
praveen-skp committed Sep 11, 2024
1 parent adbbaa6 commit 3407252
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ protected Control createContents(Composite parent) {
createUseIPersistablePref(composite);
createPromptWhenStillOpenPref(composite);
createEditorReuseGroup(composite);
createAlignMultiPageEditorTabsOnTop(composite);

applyDialogFont(composite);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,21 @@ public interface IWorkbenchPreferenceConstants {
*/
String DISABLE_OPEN_EDITOR_IN_PLACE = "DISABLE_OPEN_EDITOR_IN_PLACE"; //$NON-NLS-1$

/**
* Workbench preference id for whether the tabs in the multi-page editor is
* displayed on top. Note that tabs will be shown in the top only if this
* preference is <code>true</code>.
*
* Boolean-valued: <code>true</code> show the tabs on the top, and
* <code>false</code> if shown at the bottom.
* <p>
* The default value for this preference is: <code>false</code>
* </p>
*
* @since 3.133
*/
String ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP = "ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP"; //$NON-NLS-1$

/**
* Workbench preference id for indicating the size of the list of most recently
* used working sets.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,7 @@ public class WorkbenchMessages extends NLS {
public static String WorkbenchPreference_stickyCycleButton;
public static String WorkbenchPreference_RunInBackgroundButton;
public static String WorkbenchPreference_RunInBackgroundToolTip;
public static String WorkbenchPreference_AlignMultiPageEditorTabsOnTopButton;

// --- Appearance ---
public static String ViewsPreferencePage_Theme;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ public class EditorsPreferencePage extends PreferencePage implements IWorkbenchP

private Button allowInplaceEditor;

private Button alignMultiPageEditorTabsOnTop;

@Override
protected Control createContents(Composite parent) {
Composite composite = createComposite(parent);
Expand Down Expand Up @@ -130,6 +132,15 @@ protected void createPromptWhenStillOpenPref(Composite composite) {
setButtonLayoutData(promptWhenStillOpenEditor);
}

protected void createAlignMultiPageEditorTabsOnTop(Composite composite) {
alignMultiPageEditorTabsOnTop = new Button(composite, SWT.CHECK);
alignMultiPageEditorTabsOnTop
.setText(WorkbenchMessages.WorkbenchPreference_AlignMultiPageEditorTabsOnTopButton);
alignMultiPageEditorTabsOnTop.setSelection(
getAPIPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP));
setButtonLayoutData(alignMultiPageEditorTabsOnTop);
}

protected Composite createComposite(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
Expand All @@ -150,6 +161,8 @@ protected void performDefaults() {
IPreferenceStore store = getPreferenceStore();
allowInplaceEditor.setSelection(
!getAPIPreferenceStore().getDefaultBoolean(IWorkbenchPreferenceConstants.DISABLE_OPEN_EDITOR_IN_PLACE));
alignMultiPageEditorTabsOnTop.setSelection(getAPIPreferenceStore()
.getDefaultBoolean(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP));
useIPersistableEditor.setSelection(store.getDefaultBoolean(IPreferenceConstants.USE_IPERSISTABLE_EDITORS));
promptWhenStillOpenEditor.setSelection(getAPIPreferenceStore()
.getDefaultBoolean(IWorkbenchPreferenceConstants.PROMPT_WHEN_SAVEABLE_STILL_OPEN));
Expand All @@ -163,6 +176,8 @@ protected void performDefaults() {
@Override
public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
getAPIPreferenceStore().setValue(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP,
alignMultiPageEditorTabsOnTop.getSelection());
getAPIPreferenceStore().setValue(IWorkbenchPreferenceConstants.DISABLE_OPEN_EDITOR_IN_PLACE,
!allowInplaceEditor.getSelection());
store.setValue(IPreferenceConstants.USE_IPERSISTABLE_EDITORS, useIPersistableEditor.getSelection());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ WorkbenchPreference_RunInBackgroundButton=Always r&un in background
WorkbenchPreference_RunInBackgroundToolTip=Run long operations in the background where possible
WorkbenchPreference_HeapStatusButton = Sho&w heap status
WorkbenchPreference_HeapStatusButtonToolTip = Show the heap status area on the bottom of the window
WorkbenchPreference_AlignMultiPageEditorTabsOnTopButton= &Align multi-page editor tabs on top


# --- Appearance ---
Expand Down Expand Up @@ -493,10 +494,10 @@ OpenPerspectiveDialogAction_tooltip=Open Perspective

#---- General Preferences----
PreferencePage_noDescription = (No description available)
PreferencePageParameterValues_pageLabelSeparator = \ >\
PreferencePageParameterValues_pageLabelSeparator = \ >\
ThemingEnabled = E&nable theming
ThemeChangeWarningText = Restart for the theme changes to take full effect
ThemeChangeWarningTitle = Theme Changed
ThemeChangeWarningTitle = Theme Changed
# --- Workbench -----
WorkbenchPreference_openMode=Open mode
WorkbenchPreference_doubleClick=D&ouble click
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

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

import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
Expand All @@ -32,7 +33,9 @@
import org.eclipse.jface.dialogs.IPageChangeProvider;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
Expand All @@ -56,13 +59,15 @@
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.misc.Policy;
import org.eclipse.ui.internal.services.INestable;
import org.eclipse.ui.internal.services.IServiceLocatorCreator;
import org.eclipse.ui.internal.util.PrefUtil;
import org.eclipse.ui.services.IDisposable;
import org.eclipse.ui.services.IServiceLocator;

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

/**
* Creates an empty multi-page editor with no pages.
* Creates an empty multi-page editor with no pages and registers a
* {@link PropertyChangeListener} to listen for changes to the editor's
* preference..
*/
protected MultiPageEditorPart() {
super();
getAPIPreferenceStore().addPropertyChangeListener(event -> {
handlePropertyChange(event);
});
}

/**
* Handles property change events related to editor preferences.
*
* <p>
* This method is invoked when a property change occurs in the preference store.
* </p>
*
* @param event the {@link PropertyChangeEvent} triggered by a change in the
* preference store
*/
private void handlePropertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP)) {
updateContainer();
}
}

/**
Expand Down Expand Up @@ -264,7 +290,7 @@ protected CTabFolder createContainer(Composite parent) {
// use SWT.FLAT style so that an extra 1 pixel border is not reserved
// inside the folder
parent.setLayout(new FillLayout());
final CTabFolder newContainer = new CTabFolder(parent, SWT.BOTTOM | SWT.FLAT);
final CTabFolder newContainer = new CTabFolder(parent, getPreferredTabStyle());
newContainer.addSelectionListener(widgetSelectedAdapter(e -> {
int newPageIndex = newContainer.indexOf((CTabItem) e.item);
pageChange(newPageIndex);
Expand All @@ -291,6 +317,31 @@ protected CTabFolder createContainer(Composite parent) {
return newContainer;
}

/**
* Determines the preferred tab style based on user preferences.
* <p>
* This method retrieves the user preference for aligning multi-page editor tabs
* on top or bottom, and returns the corresponding SWT style constant.
* </p>
*
* @return {@code SWT.TOP} if the user prefers tabs to be aligned on top,
* {@code SWT.BOTTOM} if the user prefers tabs to be aligned on the
* bottom.
*/
private int getPreferredTabStyle() {
boolean alignTabsOnTop = getAPIPreferenceStore()
.getBoolean(IWorkbenchPreferenceConstants.ALIGN_MULTI_PAGE_EDITOR_TABS_ON_TOP);
int style = alignTabsOnTop ? SWT.TOP : SWT.BOTTOM;
return style;
}

/**
* @since 3.133
*/
protected IPreferenceStore getAPIPreferenceStore() {
return PrefUtil.getAPIPreferenceStore();
}

/**
* Creates a tab item at the given index and places the given control in the new
* item. The item is a CTabItem with no style bits set.
Expand Down Expand Up @@ -1230,4 +1281,13 @@ public void run() {
});
}
}

private void updateContainer() {
Composite container = getContainer();
if (container instanceof CTabFolder tabFolder) {
tabFolder.setTabPosition(getPreferredTabStyle());
tabFolder.requestLayout();
}
}

}

0 comments on commit 3407252

Please sign in to comment.