/*************************************************************************************
* Copyright (c) 2010-2011 Red Hat, 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:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.jboss.tools.runtime.ui.internal.dialogs;
import java.io.File;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.jboss.tools.runtime.core.model.RuntimeDefinition;
import org.jboss.tools.runtime.core.model.RuntimePath;
import org.jboss.tools.runtime.ui.RuntimeUIActivator;
import org.jboss.tools.runtime.ui.internal.Messages;
import org.jboss.tools.runtime.ui.internal.preferences.JBossRuntimePreferencesInitializer;
/**
* @author snjeza
*
*/
public class EditRuntimePathDialog extends Dialog {
private RuntimePath runtimePath;
private RuntimeCheckboxTreeViewer treeViewer;
public EditRuntimePathDialog(Shell parentShell, RuntimePath runtimePath) {
super(parentShell);
setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER
| SWT.RESIZE | getDefaultOrientation());
this.runtimePath = runtimePath;
}
@Override
protected Control createDialogArea(Composite parent) {
getShell().setText(Messages.EditRuntimePathDialog_Edit_runtime_detection_path);
Composite area = (Composite) super.createDialogArea(parent);
Composite contents = new Composite(area, SWT.NONE);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 400;
gd.widthHint = 700;
contents.setLayoutData(gd);
contents.setLayout(new GridLayout(1, false));
applyDialogFont(contents);
initializeDialogUnits(area);
Composite pathComposite = new Composite(contents, SWT.NONE);
gd = new GridData(SWT.FILL, SWT.FILL, true, false);
pathComposite.setLayoutData(gd);
pathComposite.setLayout(new GridLayout(3, false));
Label pathLabel = new Label(pathComposite, SWT.NONE);
pathLabel.setText(Messages.EditRuntimePathDialog_Path);
final Text pathText = new Text(pathComposite, SWT.BORDER);
gd = new GridData(SWT.FILL, SWT.FILL, true, false);
pathText.setLayoutData(gd);
pathText.setText(runtimePath.getPath());
Button browseButton = new Button(pathComposite, SWT.NONE);
browseButton.setText(Messages.EditRuntimePathDialog_Browse);
browseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IDialogSettings dialogSettings = RuntimeUIActivator.getDefault().getDialogSettings();
DirectoryDialog dialog = new DirectoryDialog(getShell());
dialog.setMessage(Messages.EditRuntimePathDialog_Edit_Path);
dialog.setFilterPath(pathText.getText());
final String path = dialog.open();
if (path == null) {
return;
}
runtimePath.setPath(path);
dialogSettings.put(JBossRuntimePreferencesInitializer.LASTPATH, path);
pathText.setText(path);
refreshRuntimes(getShell(),
new RuntimePath[]{runtimePath}, treeViewer, false);
}
});
Label refreshLabel = new Label(pathComposite, SWT.NONE);
gd = new GridData(SWT.FILL, SWT.FILL, true, false);
gd.horizontalSpan = 2;
refreshLabel.setLayoutData(gd);
refreshLabel.setText(Messages.EditRuntimePathDialog_Runtimes_found_at_this_path);
final Button refreshButton = new Button(pathComposite, SWT.NONE);
refreshButton.setText(Messages.EditRuntimePathDialog_Refresh);
refreshButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
refreshRuntimes(getShell(),
new RuntimePath[]{runtimePath}, treeViewer, false);
}
});
pathText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
runtimePath.setPath(pathText.getText());
if (!pathText.getText().isEmpty()) {
refreshButton.setEnabled( (new File(pathText.getText()).isDirectory()) );
}
}
});
refreshButton.setEnabled( (new File(pathText.getText()).isDirectory()) );
treeViewer = createRuntimeViewer(new RuntimePath[]{runtimePath}, contents, 100);
treeViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
RuntimeDefinition definition = (RuntimeDefinition) event.getElement();
definition.setEnabled(!definition.isEnabled());
}
});
return area;
}
private RuntimeCheckboxTreeViewer createRuntimeViewer(final RuntimePath[] runtimePaths2, Composite composite, int heightHint) {
return new RuntimeCheckboxTreeViewer(composite, runtimePaths2, heightHint);
}
public static void refreshRuntimes(Shell shell, final RuntimePath[] runtimePaths,
final RuntimeCheckboxTreeViewer viewer, boolean needRefresh) {
SearchRuntimePathDialog dialog = SearchRuntimePathDialog.launchSearchRuntimePathDialog(
shell, runtimePaths, needRefresh, 15);
if (viewer != null) {
dialog.getShell().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
viewer.updateInput(runtimePaths);
}
});
}
}
}