blob: 0ae3f3880e38108a568d91f92984622494d63a17 [file] [log] [blame]
/*
* Copyright (c) 2011 Google 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
*/
package com.google.eclipse.protobuf.ui.preferences.locations;
import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
import static org.eclipse.xtext.util.Strings.isEmpty;
import static com.google.eclipse.protobuf.ui.preferences.locations.DirectorySelectionDialogs.showFileSystemDirectorySelectionDialog;
import static com.google.eclipse.protobuf.ui.preferences.locations.DirectorySelectionDialogs.showWorkspaceDirectorySelectionDialog;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.addDirectoryPath;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.browseFileSystem;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.browseWorkspace;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.directory;
import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.isWorkspacePathCheck;
import static com.google.eclipse.protobuf.ui.preferences.pages.TextWidgets.setEditable;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.google.eclipse.protobuf.ui.preferences.pages.InputDialog;
/**
* Dialog where users can select a path (in the workspace or file system) to be included in resolution of imports.
*
* @author alruiz@google.com (Alex Ruiz)
*/
public class AddDirectoryDialog extends InputDialog {
private static final String DIRECTORY_PATH_FORMAT = "${workspace_loc:%s}";
private final IProject project;
private String selectedPath;
private Text txtPath;
private Button btnWorkspace;
private Button btnIsWorkspacePath;
private Button btnFileSystem;
/**
* Creates a new </code>{@link AddDirectoryDialog}</code>.
* @param parent a shell which will be the parent of the new instance.
* @param project the project whose properties the user is modifying.
*/
public AddDirectoryDialog(Shell parent, IProject project) {
super(parent, addDirectoryPath);
this.project = project;
}
@Override protected Control createDialogArea(Composite parent) {
Composite cmpDialogArea = (Composite) super.createDialogArea(parent);
GridLayout gridLayout = (GridLayout) cmpDialogArea.getLayout();
gridLayout.numColumns = 2;
Label label = new Label(cmpDialogArea, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
label.setText(directory);
txtPath = new Text(cmpDialogArea, SWT.BORDER);
txtPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
setEditable(txtPath, false);
Composite cmpCheckBox = new Composite(cmpDialogArea, SWT.NONE);
cmpCheckBox.setEnabled(false);
cmpCheckBox.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
cmpCheckBox.setLayout(new GridLayout(1, false));
btnIsWorkspacePath = new Button(cmpCheckBox, SWT.CHECK);
btnIsWorkspacePath.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
btnIsWorkspacePath.setSize(158, 24);
btnIsWorkspacePath.setText(isWorkspacePathCheck);
Composite cmpButtons = new Composite(cmpDialogArea, SWT.NONE);
cmpButtons.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
cmpButtons.setLayout(new GridLayout(2, true));
new Label(cmpButtons, SWT.NONE);
btnWorkspace = new Button(cmpButtons, SWT.NONE);
btnWorkspace.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnWorkspace.setText(browseWorkspace);
new Label(cmpButtons, SWT.NONE);
btnFileSystem = new Button(cmpButtons, SWT.NONE);
btnFileSystem.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnFileSystem.setText(browseFileSystem);
addEventListeners();
applyDialogFont(cmpDialogArea);
return cmpDialogArea;
}
private void addEventListeners() {
btnWorkspace.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
IPath path = showWorkspaceDirectorySelectionDialog(getShell(), enteredPathText());
if (path != null) {
path = ProjectVariable.replaceProjectNameWithProjectVariable(path, project);
txtPath.setText(path.toString().trim());
btnIsWorkspacePath.setSelection(true);
}
}
});
btnFileSystem.addSelectionListener(new SelectionAdapter() {
@Override public void widgetSelected(SelectionEvent e) {
String path = showFileSystemDirectorySelectionDialog(getShell(), enteredPathText());
if (path != null) {
txtPath.setText(path.trim());
btnIsWorkspacePath.setSelection(false);
}
}
});
txtPath.addModifyListener(new ModifyListener() {
@Override public void modifyText(ModifyEvent e) {
boolean hasText = !isEmpty(enteredPathText());
getButton(OK_ID).setEnabled(hasText);
}
});
}
@Override protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
getButton(OK_ID).setEnabled(false);
txtPath.setFocus();
}
@Override protected void okPressed() {
selectedPath = enteredPathText();
if (btnIsWorkspacePath.getSelection()) {
selectedPath = String.format(DIRECTORY_PATH_FORMAT, selectedPath);
}
super.okPressed();
}
private String enteredPathText() {
return txtPath.getText().trim();
}
/**
* Returns the path selected by the user.
* @return the path selected by the user.
*/
public String selectedPath() {
return selectedPath;
}
}