/*******************************************************************************
* Copyright (c) 2015, 2015 IBM Corporation 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.ide.ui.utils;
import java.util.function.Consumer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
import melnorme.lang.ide.ui.LangUIMessages;
import melnorme.util.swt.SWTFactoryUtil;
import melnorme.utilbox.collections.Indexable;
import melnorme.utilbox.concurrency.OperationCancellation;
public class ControlUtils {
public static void createHorizontalSpacer(Composite topControl, int charHeight, PixelConverter pc) {
SWTFactoryUtil.createLabel(topControl, SWT.LEFT, "",
GridDataFactory.fillDefaults().hint(pc.convertHeightInCharsToPixels(charHeight), SWT.DEFAULT).create());
}
public static String openFileDialog(String initialValue, Shell shell) throws OperationCancellation {
FileDialog dialog = new FileDialog(shell);
if(!initialValue.isEmpty()) {
dialog.setFilterPath(initialValue);
}
String result = dialog.open();
if(result == null) {
throw new OperationCancellation();
}
return result;
}
public static Link createOpenPreferencesDialogLinkedText(final Composite topControl, String linkText) {
return createOpenPreferencesDialogLinkedText(topControl, linkText, null);
}
public static Link createOpenPreferencesDialogLinkedText(final Composite topControl, String linkText,
Consumer<Link> afterDialogOpen) {
Link link = new Link(topControl, SWT.NONE);
link.setText(linkText);
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PreferencesUtil.createPreferenceDialogOn(topControl.getShell(),e.text, null, null).open();
if(afterDialogOpen != null) {
afterDialogOpen.accept(link);
}
}
});
return link;
}
public static Link createOpenPreferencesDialogLink(Composite topControl, String prefPageId, String linkLabel,
Consumer<Link> afterDialogOpen) {
return createOpenPreferencesDialogLinkedText(topControl,
"<a href=\"" + prefPageId + "\">" + linkLabel + "</a>", afterDialogOpen);
}
public static void openStringVariableSelectionDialog_ForText(Text text) {
Shell shell = text.getShell();
try {
String variable = openStringVariableSelectionDialog(shell);
text.insert(variable);
} catch(OperationCancellation e) {
return;
}
}
public static String openStringVariableSelectionDialog(final Shell shell) throws OperationCancellation {
return openStringVariableSelectionDialog(new StringVariableSelectionDialog(shell));
}
public static String openStringVariableSelectionDialog(StringVariableSelectionDialog dialog)
throws OperationCancellation {
dialog.open();
String result = dialog.getVariableExpression();
if(result == null) {
throw new OperationCancellation();
}
return result;
}
public static String openProgramPathDialog(IProject project, Button button) throws OperationCancellation {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
button.getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider());
dialog.setTitle(LangUIMessages.ProgramPathDialog_title);
dialog.setMessage(LangUIMessages.ProgramPathDialog_message);
dialog.setInput(project);
dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
if(dialog.open() == IDialogConstants.OK_ID) {
IResource resource = (IResource) dialog.getFirstResult();
return resource.getProjectRelativePath().toPortableString();
}
throw new OperationCancellation();
}
public static <T> T setElementsAndOpenDialog(ElementListSelectionDialog elementListDialog, Indexable<T> configs)
throws OperationCancellation {
return setElementsAndOpenDialog(elementListDialog, configs.toArray());
}
@SuppressWarnings("unchecked")
public static <T> T setElementsAndOpenDialog(ElementListSelectionDialog elementListDialog, Object[] elements)
throws OperationCancellation {
elementListDialog.setElements(elements);
int result = elementListDialog.open();
if(result != Window.OK) {
throw new OperationCancellation();
}
return (T) elementListDialog.getFirstResult();
}
}