/*******************************************************************************
* Copyright (c) 2013, 2014 Google, Inc 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:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.preferences;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.cdt.internal.ui.dialogs.IStatusChangeListener;
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.refactoring.includes.IncludeGroupStyle;
/**
* The preference block for configuring styles of different categories of include statements.
*/
public class IncludeGroupStyleBlock extends OptionsConfigurationBlock {
private final String description;
private IncludeGroupStyle style;
private final ArrayList<Button> checkBoxes = new ArrayList<>();
private final ArrayList<Text> textBoxes = new ArrayList<>();
private PixelConverter pixelConverter;
private Button checkBoxBlankLine;
private static final Key[] EMPTY_KEY_ARRAY = {};
public IncludeGroupStyleBlock(IStatusChangeListener context, IProject project,
IWorkbenchPreferenceContainer container, String description) {
super(context, project, EMPTY_KEY_ARRAY, container);
this.description = description;
}
public IncludeGroupStyle getStyle() {
return style;
}
public void setStyle(IncludeGroupStyle style) {
this.style = style;
}
@Override
protected Control createContents(Composite parent) {
pixelConverter = new PixelConverter(parent);
setShell(parent.getShell());
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.marginHeight = pixelConverter.convertHeightInCharsToPixels(1);
layout.marginWidth = 0;
composite.setLayout(layout);
composite.setFont(parent.getFont());
Group group = ControlFactory.createGroup(composite, description, 1);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite envelope = new Composite(group, SWT.NONE);
layout = new GridLayout(4, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
envelope.setLayout(layout);
addCheckBox(envelope, PreferencesMessages.IncludeGroupStyleBlock_keep_includes_together, 0,
new BooleanDataSource() {
@Override
public boolean get() {
return style.isKeepTogether();
}
@Override
public void set(boolean value) {
style.setKeepTogether(value);
}
});
checkBoxBlankLine = addCheckBox(envelope, PreferencesMessages.IncludeGroupStyleBlock_blank_line_before,
pixelConverter.convertHorizontalDLUsToPixels(10),
new BooleanDataSource() {
@Override
public boolean get() {
return style.isBlankLineBefore();
}
@Override
public void set(boolean value) {
style.setBlankLineBefore(value);
}
});
if (!style.getIncludeKind().hasChildren()) {
addCheckBox(envelope, PreferencesMessages.IncludeGroupStyleBlock_use_relative_path, 0,
new BooleanDataSource() {
@Override
public boolean get() {
return style.isRelativePath();
}
@Override
public void set(boolean value) {
style.setRelativePath(value);
}
});
addCheckBox(envelope, PreferencesMessages.IncludeGroupStyleBlock_use_angle_brackets, 0,
new BooleanDataSource() {
@Override
public boolean get() {
return style.isAngleBrackets();
}
@Override
public void set(boolean value) {
style.setAngleBrackets(value);
}
});
}
updateControls();
updateDependent();
return composite;
}
private Button addCheckBox(Composite parent, String label, int indent, BooleanDataSource dataSource) {
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= 3;
gd.horizontalIndent= indent;
Button checkBox= new Button(parent, SWT.CHECK);
checkBox.setFont(JFaceResources.getDialogFont());
checkBox.setText(label);
checkBox.setData(dataSource);
checkBox.setLayoutData(gd);
checkBox.addSelectionListener(getSelectionListener());
makeScrollableCompositeAware(checkBox);
checkBox.setSelection(dataSource.get());
checkBoxes.add(checkBox);
return checkBox;
}
@Override
protected void updateControls() {
super.updateControls();
for (int i= checkBoxes.size() - 1; i >= 0; i--) {
updateCheckBox(checkBoxes.get(i));
}
}
@Override
protected void updateCheckBox(Button checkBox) {
BooleanDataSource dataSource = (BooleanDataSource) checkBox.getData();
checkBox.setSelection(dataSource.get());
}
@Override
protected void controlChanged(Widget widget) {
if (widget instanceof Button) {
BooleanDataSource dataSource = (BooleanDataSource) widget.getData();
dataSource.set(((Button) widget).getSelection());
}
updateDependent();
}
private void updateDependent() {
checkBoxBlankLine.setEnabled(style.isKeepTogether());
}
@Override
protected void validateSettings(Key changedKey, String oldValue, String newValue) {
StatusInfo status = new StatusInfo();
fContext.statusChanged(status);
}
private interface BooleanDataSource {
boolean get();
void set(boolean value);
}
private interface StringDataSource {
String get();
void set(String value);
}
}