/*******************************************************************************
* Copyright (c) 2008 xored software, Inc. 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:
* xored software, Inc. - initial API and Implementation (Yuri Strot)
*******************************************************************************/
package com.xored.glance.internal.ui.panels;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
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;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import java.util.ArrayList;
import java.util.List;
/**
* @author Yuri Strot
*/
public class SearchDialog extends PopupDialog {
private Composite titleArea;
protected Text titleText;
private Font infoFont;
private Label info;
private Label progress;
private Control separator;
private static final GridDataFactory LAYOUTDATA_GRAB_BOTH = GridDataFactory.fillDefaults().grab(
true,
true);
private static final GridLayoutFactory POPUP_LAYOUT_FACTORY = GridLayoutFactory.fillDefaults().margins(
POPUP_MARGINWIDTH,
POPUP_MARGINHEIGHT).spacing(POPUP_HORIZONTALSPACING, POPUP_VERTICALSPACING);
protected static final String HELP_TEXT = "Enter search text";
public SearchDialog(final Shell parent) {
super(parent, SWT.RESIZE, true, false, false, true, false, null, null);
}
protected void applyBackgroundColor(final Color color) {
applyBackgroundColor(color, titleArea);
}
protected void applyColors(final Composite composite) {
applyForegroundColor(getForeground(), composite);
applyBackgroundColor(getBackground(), composite);
}
protected void applyFonts(final Composite composite) {
Dialog.applyDialogFont(composite);
if (info != null) {
final Font font = info.getFont();
final FontData[] fontDatas = font.getFontData();
for (int i = 0; i < fontDatas.length; i++) {
fontDatas[i].setHeight(fontDatas[i].getHeight() * 9 / 10);
}
infoFont = new Font(info.getDisplay(), fontDatas);
info.setFont(infoFont);
}
}
@Override
protected void configureShell(final Shell shell) {
super.configureShell(shell);
shell.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(final DisposeEvent e) {
handleClose();
}
});
}
@Override
protected Control createContents(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
POPUP_LAYOUT_FACTORY.applyTo(composite);
LAYOUTDATA_GRAB_BOTH.applyTo(composite);
titleArea = (Composite) createTitleMenuArea(composite);
separator = createHorizontalSeparator(composite);
createInfoTextArea(composite);
applyColors(composite);
applyFonts(composite);
return composite;
}
@Override
protected Control createInfoTextArea(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout(3, false);
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
progress = new Label(composite, SWT.LEFT);
// Status label
info = new Label(composite, SWT.RIGHT);
info.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
progress.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// factory.applyTo(info);
// factory.applyTo(progress);
final Color color = parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW);
info.setForeground(color);
progress.setForeground(color);
info.setText(HELP_TEXT);
return composite;
}
@Override
protected List<Control> getBackgroundColorExclusions() {
final List<Control> list = copyControls(super.getBackgroundColorExclusions());
if (separator != null) {
list.add(separator);
}
return list;
}
@Override
protected List<Control> getForegroundColorExclusions() {
final List<Control> list = copyControls(super.getForegroundColorExclusions());
if (info != null) {
list.add(info);
}
if (separator != null) {
list.add(separator);
}
return list;
}
protected void handleClose() {
if (infoFont != null && !infoFont.isDisposed()) {
infoFont.dispose();
}
infoFont = null;
}
@Override
protected void setInfoText(final String text) {
info.setText(text);
}
private List<Control> copyControls(List<?> list) {
List<Control> result = new ArrayList<Control>(list.size());
for (Control control : result) {
result.add(control);
}
return result;
}
/**
* Create a horizontal separator for the given parent.
*
* @param parent The parent composite.
* @return The Control representing the horizontal separator.
*/
private Control createHorizontalSeparator(final Composite parent) {
final Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL | SWT.LINE_DOT);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(separator);
return separator;
}
}