/**
* Copyright (c) 2010, 2011 Darmstadt University of Technology.
* 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:
* Sebastian Proksch - initial API and implementation
*/
package org.eclipse.recommenders.internal.apidocs.rcp;
import static org.eclipse.recommenders.internal.apidocs.rcp.ApidocsViewUtils.*;
import static org.eclipse.recommenders.utils.Throws.throwUnsupportedOperation;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.recommenders.apidocs.rcp.ApidocProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
public class ProviderArea {
private final ApidocProvider provider;
private Composite container;
private Composite title;
private Composite status;
private Composite content;
private final GridLayoutFactory layoutFactory = GridLayoutFactory.fillDefaults().spacing(0, 0);
private final GridDataFactory layoutDataFactory = GridDataFactory.fillDefaults().grab(true, false);
public ProviderArea(final ApidocProvider provider) {
this.provider = provider;
}
public void createControl(final Composite parent) {
container = createComposite(parent);
Label separator = new Label(container, SWT.HORIZONTAL | SWT.SEPARATOR);
separator.setLayoutData(layoutDataFactory.indent(0, 5).create());
createTitleArea();
status = createComposite(container);
content = createComposite(container);
hide();
}
private void createTitleArea() {
title = createComposite(container);
final String providerName = provider.getDescription().getName();
final Image providerImage = provider.getDescription().getImage();
final CLabel l = new CLabel(title, SWT.NONE);
l.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
setInfoForegroundColor(l);
setInfoBackgroundColor(l);
l.setText(providerName);
l.setImage(providerImage);
}
private Composite createComposite(final Composite parent) {
final Composite c = new Composite(parent, SWT.NONE);
setInfoBackgroundColor(c);
c.setLayout(layoutFactory.create());
c.setLayoutData(layoutDataFactory.create());
return c;
}
public Composite getContentArea() {
return content;
}
public void showContent() {
setVisible(title, true);
setVisible(status, false);
setVisible(content, true);
setVisible(container, true);
layout();
}
public void showStatus() {
setVisible(title, true);
setVisible(status, true);
setVisible(content, false);
setVisible(container, true);
layout();
}
public void hide() {
setVisible(title, false);
setVisible(status, false);
setVisible(content, false);
setVisible(container, false);
layout();
}
/**
* relayout is needed afterwards
*/
private static void setVisible(final Composite d, final boolean isVisible) {
d.setVisible(isVisible);
final Object layoutData = d.getLayoutData();
if (layoutData instanceof GridData) {
final GridData gridData = (GridData) layoutData;
gridData.exclude = !isVisible;
// if (isVisible) {
// gridData.heightHint = -1;
// } else {
// gridData.heightHint = 0;
// }
// d.setLayoutData(gridData);
} else {
throwUnsupportedOperation("layout of provided composite not supported"); //$NON-NLS-1$
}
}
public void layout() {
status.layout();
content.layout();
container.layout();
}
public Point getLocation() {
return container.getLocation();
}
public void moveAbove(final ProviderArea area) {
container.moveAbove(area.container);
}
public void moveBelow(final ProviderArea area) {
container.moveBelow(area.container);
}
public void cleanup() {
disposeChildren(status);
disposeChildren(content);
}
private static void disposeChildren(final Composite parent) {
for (final Control child : parent.getChildren()) {
child.dispose();
}
}
public void setStatus(final String statusMessage) {
disposeChildren(status);
final Link link = new Link(status, SWT.NONE);
link.setText(statusMessage);
link.setBackground(link.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
layout();
}
public void setStatusWithCallback(final String statusMessage, final SelectionListener listener) {
disposeChildren(status);
final Link link = new Link(status, SWT.NONE);
link.setText(statusMessage);
link.setBackground(link.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
link.addSelectionListener(listener);
layout();
}
}