blob: 72593c6b3a9b63e861ec0476e04086ebbbd76d8f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.dialogs;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.IPreferencePageContainer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
/**
* The PreferencesPageContainer is the container object for the preference pages
* in a node.
*/
public class PreferencesPageContainer implements IPreferencePageContainer {
private Composite control;
private ScrolledComposite scrolled;
private class PreferenceEntry {
Composite composite;
IPreferenceNode node;
String title;
int offset;
Label expandImage;
Label titleLabel;
Composite pageContainer;
/**
* Create a new instance of the receiver.
*
* @param displayedNode
* @param pageTitle
*/
PreferenceEntry(IPreferenceNode displayedNode, String pageTitle) {
node = displayedNode;
title = pageTitle;
}
/**
* Add the subnodes of the receiver.
*/
private void addSubNodes() {
IPreferenceNode[] subnodes = node.getSubNodes();
PreferenceEntry previous = null;
for (int i = 0; i < subnodes.length; i++) {
PreferenceEntry entry = createEntry(subnodes[i], subnodes[i]
.getLabelText(), offset + 1);
if (previous == null) {
entry.composite.moveBelow(this.composite);
} else {
entry.composite.moveBelow(previous.composite);
}
previous = entry;
}
}
/**
* Create the contents of the entry in parent. When laying this out
* indent the composite ident units.
*
* @param indent
*/
void createContents(int indent) {
composite = new Composite(control, SWT.NULL);
// Create the title area which will contain
// a title, message, and image.
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalIndent = IDialogConstants.SMALL_INDENT * indent;
composite.setLayoutData(gridData);
FormLayout layout = new FormLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
Font titleFont = JFaceResources.getBannerFont();
expandImage = new Label(composite, SWT.RIGHT);
expandImage.setText("+");//$NON-NLS-1$
expandImage.setFont(titleFont);
FormData imageData = new FormData();
imageData.top = new FormAttachment(0);
imageData.left = new FormAttachment(0,
IDialogConstants.HORIZONTAL_SPACING);
expandImage.setLayoutData(imageData);
// Title image
titleLabel = new Label(composite, SWT.LEFT);
titleLabel.setText(title);
titleLabel.setFont(titleFont);
FormData titleData = new FormData();
titleData.right = new FormAttachment(100);
titleData.top = new FormAttachment(0);
titleData.left = new FormAttachment(expandImage,
IDialogConstants.HORIZONTAL_SPACING);
titleLabel.setLayoutData(titleData);
titleLabel.addMouseListener(new MouseAdapter() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt.events.MouseEvent)
*/
public void mouseDown(MouseEvent e) {
if (pageContainer == null) {
boolean adjustScrollbars = false;
pageContainer = new Composite(composite, SWT.BORDER);
FormData containerData = new FormData();
containerData.top = new FormAttachment(titleLabel, 0);
containerData.left = new FormAttachment(0);
containerData.right = new FormAttachment(100);
pageContainer.setLayoutData(containerData);
pageContainer.setLayout(new GridLayout());
node.createPage();
node.getPage().createControl(pageContainer);
node.getPage().setContainer(
PreferencesPageContainer.this);
node.getPage().getControl().setLayoutData(
new GridData(GridData.FILL_BOTH));
adjustScrollbars = true;
Point contentSize = node.getPage().computeSize();
Rectangle totalArea = composite.getClientArea();
if (contentSize.x < totalArea.width) {
contentSize.x = totalArea.width;
}
node.getPage().setSize(contentSize);
if (adjustScrollbars) {
adjustScrollbars(contentSize);
}
expandImage.setText("-");//$NON-NLS-1$
addSubNodes();
setSelectionColors(composite.getDisplay()
.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
} else {
setSelectionColors(null);
pageContainer.dispose();
pageContainer = null;
expandImage.setText("+");//$NON-NLS-1$
}
control.layout(true);
}
});
offset = indent;
}
/**
* Set the background colors and the labels due to selection.
*
* @param highlight
* The highlight to set
*/
private void setSelectionColors(Color highlight) {
composite.setBackground(highlight);
titleLabel.setBackground(highlight);
expandImage.setBackground(highlight);
}
}
/**
* Create a new instance of the receiver.
*/
public PreferencesPageContainer() {
super();
}
/**
* Create the contents area of the composite.
*
* @param parent
* @param style
*/
void createContents(Composite parent, int style) {
scrolled = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
GridData newPageData = new GridData(GridData.FILL_BOTH);
scrolled.setLayoutData(newPageData);
control = new Composite(scrolled, style);
scrolled.setContent(control);
scrolled.setExpandVertical(true);
scrolled.setExpandHorizontal(true);
GridData controlData = new GridData(GridData.FILL_BOTH);
control.setLayoutData(controlData);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 1;
control.setLayout(layout);
}
/**
* Return the top level control
*
* @return Control
*/
Control getControl() {
return control;
}
/**
* Show the selected node. Return whether or not this succeeded.
*
* @param node
* @return <code>true</code> if the page selection was sucessful
* <code>false</code> is unsuccessful
*/
boolean show(IPreferenceNode node) {
createGeneralEntry(node);
control.layout(true);
return true;
}
/**
* Create an entry for the receiver with the general tag. Do not recurse
* through the children as this is the implied top node.
*
* @param node
*/
private void createGeneralEntry(IPreferenceNode node) {
PreferenceEntry entry = createEntry(node, "General", 0); //$NON-NLS-1$
entry.addSubNodes();
}
/**
* Create an entry with the given title for the IPreferenceNode with an
* indent i.
*
* @param node
* @param name
* @param indent
* @return the entry
*/
private PreferenceEntry createEntry(IPreferenceNode node, String name,
int indent) {
PreferenceEntry entry = new PreferenceEntry(node, name);
entry.createContents(indent);
return entry;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.IPreferencePageContainer#getPreferenceStore()
*/
public IPreferenceStore getPreferenceStore() {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.IPreferencePageContainer#updateButtons()
*/
public void updateButtons() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.IPreferencePageContainer#updateMessage()
*/
public void updateMessage() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.IPreferencePageContainer#updateTitle()
*/
public void updateTitle() {
// TODO Auto-generated method stub
}
/**
* Adjust the scrollbars for the content that just got added.
*
* @param contentSize
*/
private void adjustScrollbars(Point contentSize) {
Point size = control.getSize();
scrolled.setMinHeight(size.y + contentSize.y);
scrolled.setMinWidth(Math.max(size.x, contentSize.x));
}
}