package tern.eclipse.ide.ui.preferences;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import tern.eclipse.ide.core.IIDETernRepository;
import tern.eclipse.ide.core.TernCorePlugin;
import tern.eclipse.ide.internal.ui.TernUIMessages;
import tern.eclipse.ide.ui.wizards.ImportTernRepositoryWizard;
import tern.utils.StringUtils;
public class TernRepositoryFieldEditor extends ComboViewerFieldEditor {
private static final int NB_BUTTONS = 1;
private final IWorkbench workbench;
private Button importButton;
private Button addButton;
public TernRepositoryFieldEditor(String name, String labelText, Composite parent, IWorkbench workbench) {
super(name, labelText, parent);
this.workbench = workbench;
Collection list = new ArrayList();
list.add(TernUIMessages.TernRepositoryFieldEditor_ternRepository_none);
list.addAll(TernCorePlugin.getTernRepositoryManager().getRepositories());
super.setLabelProvider(IDETernRepositoryLabelProvider.INSTANCE);
super.setInput(list);
}
@Override
protected void adjustForNumColumns(int numColumns) {
super.adjustForNumColumns(numColumns - NB_BUTTONS);
}
@Override
public int getNumberOfControls() {
return super.getNumberOfControls() + NB_BUTTONS;
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, numColumns - 1);
importButton = getImportButtonControl(parent);
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
int widthHint = convertHorizontalDLUsToPixels(importButton, IDialogConstants.BUTTON_WIDTH);
gd.widthHint = Math.max(widthHint, importButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
importButton.setLayoutData(gd);
/*addButton = getAddButtonControl(parent);
gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
widthHint = convertHorizontalDLUsToPixels(addButton, IDialogConstants.BUTTON_WIDTH);
gd.widthHint = Math.max(widthHint, addButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
addButton.setLayoutData(gd);*/
}
protected Button getImportButtonControl(Composite parent) {
if (importButton == null) {
importButton = new Button(parent, SWT.PUSH);
importButton.setText(TernUIMessages.Button_import);
importButton.setFont(parent.getFont());
importButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
boolean oldValid = isValid();
openImportDialogIfNeeded();
refreshValidState();
boolean newValid = isValid();
if (oldValid != newValid) {
fireValueChanged(IS_VALID, oldValid, newValid);
}
}
});
importButton.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
importButton = null;
}
});
} else {
checkParent(importButton, parent);
}
return importButton;
}
protected Button getAddButtonControl(Composite parent) {
if (addButton == null) {
addButton = new Button(parent, SWT.PUSH);
addButton.setText(TernUIMessages.Button_add);
addButton.setFont(parent.getFont());
addButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
}
});
addButton.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
addButton = null;
}
});
} else {
checkParent(addButton, parent);
}
return addButton;
}
@Override
protected void fireValueChanged(String property, Object oldValue, Object newValue) {
openImportDialogIfNeeded();
super.fireValueChanged(property, oldValue, newValue);
}
@Override
protected boolean checkState() {
Object selectedRepository = getSelectedValue();
if (selectedRepository == null || selectedRepository instanceof String) {
showErrorMessage(TernUIMessages.TernRepositoryFieldEditor_ternRepository_err_not_selected);
return false;
}
IIDETernRepository repository = (IIDETernRepository) selectedRepository;
if (!repository.isImported()) {
showErrorMessage(TernUIMessages.TernRepositoryFieldEditor_ternRepository_err_not_imported);
return false;
}
clearErrorMessage();
return true;
}
private void openImportDialogIfNeeded() {
Object selectedRepository = getSelectedValue();
if (selectedRepository == null || selectedRepository instanceof String) {
importButton.setEnabled(false);
return;
}
IIDETernRepository repository = (IIDETernRepository) selectedRepository;
if (!repository.isImported()) {
Shell shell = getLabelControl().getShell();
ImportTernRepositoryWizard wizard = new ImportTernRepositoryWizard(repository);
wizard.init(workbench, null);
WizardDialog dialog = new WizardDialog(shell, wizard);
dialog.open();
if (!repository.isImported()) {
importButton.setEnabled(true);
return;
}
getViewer().refresh(true);
}
importButton.setEnabled(false);
}
@Override
public void setEnabled(boolean enabled, Composite parent) {
super.setEnabled(enabled, parent);
setImportButtonEnabled(enabled);
if (addButton != null) {
addButton.setEnabled(enabled);
}
}
private void setImportButtonEnabled(boolean enabled) {
if (importButton != null) {
if (!enabled) {
importButton.setEnabled(enabled);
} else {
Object selectedValue = getSelectedValue();
importButton.setEnabled(selectedValue instanceof IIDETernRepository
&& !((IIDETernRepository) selectedValue).isImported());
}
}
}
private static class IDETernRepositoryLabelProvider extends LabelProvider {
public static final ILabelProvider INSTANCE = new IDETernRepositoryLabelProvider();
@Override
public String getText(Object element) {
if (element instanceof IIDETernRepository) {
IIDETernRepository repository = (IIDETernRepository) element;
return repository.isImported() ? repository.getName()
: repository.getName() + TernUIMessages.TernRepositoryFieldEditor_ternRepository_not_imported;
}
return super.getText(element);
}
}
@Override
protected String getPreferenceValue(Object selectedObject) {
if (selectedObject instanceof String) {
return "";
}
return ((IIDETernRepository) selectedObject).getName();
}
@Override
protected Object getValueFromPreference(String preferenceValue) {
if (StringUtils.isEmpty(preferenceValue)) {
return TernUIMessages.TernRepositoryFieldEditor_ternRepository_none;
}
return TernCorePlugin.getTernRepositoryManager().getRepository(preferenceValue);
}
@Override
protected void updateComboForValue(String value) {
super.updateComboForValue(value);
setImportButtonEnabled(true);
}
@Override
public boolean isValid() {
if (!getLabelControl().isEnabled()) {
return true;
}
return super.isValid();
}
}