blob: 71d6815525da97de63ef99a978aa531181487aaf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Laurent CARON
* 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:
* Laurent CARON (laurent.caron at gmail dot com) - Initial implementation and API
*******************************************************************************/
package org.mihalis.opal.preferenceWindow;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.mihalis.opal.flatButton.FlatButton;
import org.mihalis.opal.utils.SWTGraphicUtil;
/**
* Instances of this class are a container that allows the user to select a tab.
*/
class PWTabContainer extends Composite {
/** The tabs. */
private final List<PWTab> tabs;
/** The container. */
private Composite container;
/** The old button container image. */
private Image oldButtonContainerImage;
/** The buttons. */
private final List<FlatButton> buttons;
/** The button container. */
private Composite buttonContainer;
/**
* Constructor.
*
* @param parent parent composite
* @param style style (not used)
* @param tabs list of tabs
*/
PWTabContainer(final Composite parent, final int style, final List<PWTab> tabs) {
super(parent, style);
this.tabs = new ArrayList<PWTab>();
this.tabs.addAll(tabs);
this.buttons = new ArrayList<FlatButton>();
final GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
setLayout(gridLayout);
}
/**
* Build the container.
*/
void build() {
createButtonsContainer();
createButtons();
createContentContainer();
select(PreferenceWindow.getInstance().getSelectedTab());
}
/**
* Create the buttons container.
*/
private void createButtonsContainer() {
createContainer();
createButtonsContainerBackground();
}
/**
* Create the container.
*/
private void createContainer() {
this.buttonContainer = new Composite(this, SWT.NONE);
final GridData buttonContainerGridData = new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1);
buttonContainerGridData.heightHint = 63;
this.buttonContainer.setLayoutData(buttonContainerGridData);
this.buttonContainer.setBackground(getDisplay().getSystemColor(SWT.COLOR_WHITE));
final GridLayout gridLayout = new GridLayout(this.tabs.size(), false);
gridLayout.marginWidth = gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = gridLayout.verticalSpacing = 0;
gridLayout.marginBottom = 2;
this.buttonContainer.setLayout(gridLayout);
}
/**
* Create the background of the container.
*/
private void createButtonsContainerBackground() {
this.buttonContainer.addListener(SWT.Resize, new Listener() {
@Override
public void handleEvent(final Event event) {
final Rectangle rect = PWTabContainer.this.buttonContainer.getClientArea();
final Image image = new Image(getDisplay(), Math.max(1, rect.width), Math.max(1, rect.height));
final GC gc = new GC(image);
final Color grey = new Color(getDisplay(), 204, 204, 204);
gc.setForeground(grey);
gc.drawLine(0, rect.height - 1, rect.width, rect.height - 1);
grey.dispose();
gc.dispose();
PWTabContainer.this.buttonContainer.setBackgroundImage(image);
if (PWTabContainer.this.oldButtonContainerImage != null) {
PWTabContainer.this.oldButtonContainerImage.dispose();
}
PWTabContainer.this.oldButtonContainerImage = image;
}
});
SWTGraphicUtil.addDisposer(this.buttonContainer, this.oldButtonContainerImage);
}
/**
* Create the buttons.
*/
private void createButtons() {
for (int i = 0; i < this.tabs.size(); i++) {
final PWTab tab = this.tabs.get(i);
final FlatButton button = new FlatButton(this.buttonContainer, SWT.NONE);
button.setText(tab.getText());
button.setImage(tab.getImage());
final GridData gd;
if (i == this.tabs.size() - 1) {
gd = new GridData(GridData.BEGINNING, GridData.BEGINNING, true, false);
} else {
gd = new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false);
}
if (i == 0) {
gd.horizontalIndent = 5;
}
gd.widthHint = 75;
button.setLayoutData(gd);
final int index = i;
button.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(final SelectionEvent e) {
select(index);
}
});
this.buttons.add(button);
}
}
/**
* Select a given button.
*
* @param index index of the selected button
*/
void select(final int index) {
for (final Control c : this.container.getChildren()) {
c.dispose();
}
this.tabs.get(index).build(this.container);
this.container.layout();
for (int i = 0; i < this.buttons.size(); i++) {
this.buttons.get(i).setSelection(i == index);
}
}
/**
* Create the content container, ie the composite that will contain all
* widgets.
*/
private void createContentContainer() {
this.container = new Composite(this, SWT.NONE);
final GridData tempContainer = new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1);
tempContainer.widthHint = 700;
tempContainer.heightHint = 550;
this.container.setLayoutData(tempContainer);
}
}