package com.tibco.as.spacebar.ui.preferences;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
public abstract class TabbedPreferencePage extends AbstractPreferencePage {
private TabFolder folder;
/**
* Maximum number of columns for field editors.
*/
private int maxNumOfColumns;
/**
* Adds the given field editor to this page.
*
* @param editor
* the field editor
*/
@Override
protected void addField(FieldEditor editor) {
// needed for layout, since there is no way to get fields editor from
// parent
int numberOfControls = editor.getNumberOfControls();
maxNumOfColumns = Math.max(maxNumOfColumns, numberOfControls);
super.addField(editor);
}
@Override
protected void createFieldEditors(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.numColumns = getNumberOfColumns();
composite.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessHorizontalSpace = true;
composite.setLayoutData(gridData);
addFields(composite);
TabFolder folder = new TabFolder(composite, SWT.NONE);
GridData folderData = new GridData(GridData.FILL_BOTH);
folderData.horizontalSpan = getNumberOfColumns();
folder.setLayoutData(folderData);
addTabFields(folder);
Dialog.applyDialogFont(folder);
}
protected int getNumberOfColumns() {
return 2;
}
protected void addFields(Composite composite) {
}
protected abstract void addTabFields(TabFolder folder);
protected Composite createTab(TabFolder folder, String text) {
TabItem item = new TabItem(folder, SWT.NONE);
item.setText(text);
Composite composite = new Composite(folder, SWT.NONE);
composite.setLayout(new TabFolderLayout());
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessHorizontalSpace = true;
composite.setLayoutData(gridData);
item.setControl(composite);
return composite;
}
/**
* Adjust the layout of the field editors so that they are properly aligned.
*/
@Override
protected void adjustGridLayout() {
if (folder != null) {
TabItem[] items = folder.getItems();
for (int j = 0; j < items.length; j++) {
Composite composite = (Composite) items[j].getControl();
GridLayout layout = (GridLayout) composite.getLayout();
layout.numColumns = this.maxNumOfColumns;
layout.marginHeight = 5;
layout.marginWidth = 5;
}
}
// need to call super.adjustGridLayout() since
// fieldEditor.adjustForNumColumns() is protected
super.adjustGridLayout();
// reset the main container to a single column
((GridLayout) super.getFieldEditorParent().getLayout()).numColumns = 1;
}
/**
* Returns a parent composite for a field editor.
* <p>
* This value must not be cached since a new parent may be created each time
* this method called. Thus this method must be called each time a field
* editor is constructed.
* </p>
*
* @return a parent
*/
@Override
protected Composite getFieldEditorParent() {
if (folder == null || folder.getItemCount() == 0) {
return super.getFieldEditorParent();
}
return (Composite) folder.getItem(folder.getItemCount() - 1)
.getControl();
}
/**
* Adds a tab to the page.
*
* @param text
* the tab label
*/
public void addTab(String text) {
if (folder == null) {
// initialize tab folder
folder = new TabFolder(super.getFieldEditorParent(), SWT.NONE);
folder.setLayoutData(new GridData(GridData.FILL_BOTH));
}
TabItem item = new TabItem(folder, SWT.NONE);
item.setText(text);
Composite currentTab = new Composite(folder, SWT.NULL);
GridLayout layout = new GridLayout();
currentTab.setLayout(layout);
currentTab.setFont(super.getFieldEditorParent().getFont());
currentTab.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
item.setControl(currentTab);
}
protected Composite createTabItemComposite(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout basicLayout = new GridLayout();
basicLayout.numColumns = 2;
composite.setLayout(basicLayout);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = getNumberOfColumns();
composite.setLayoutData(gridData);
return composite;
}
}