/**
* Copyright 2006-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mybatis.generator.eclipse.ui.launcher.tabs;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.jface.viewers.ViewerFilter;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.mybatis.generator.eclipse.ui.Activator;
import org.mybatis.generator.eclipse.ui.Messages;
import org.mybatis.generator.eclipse.ui.launcher.GeneratorLaunchConstants;
import org.mybatis.generator.eclipse.ui.launcher.GeneratorLaunchShortcut;
import org.mybatis.generator.internal.util.StringUtility;
/**
* This abstract class includes support and UI for selecting a file from the
* workspace or file system.
*
* This class is heavily influenced by the Eclipse XSL launcher UI and I am
* grateful for the inspiration.
*
* @author Jeff Butler
*
*/
public abstract class AbstractGeneratorComposite extends Composite implements GeneratorLaunchConstants {
protected Text txtFileName;
protected String javaProjectName;
private Button btnBrowseWorkplace;
private Button btnBrowseFileSystem;
private ISelectionStatusValidator selectionStatusVerifier = new ISelectionStatusValidator() {
@Override
public IStatus validate(Object[] selection) {
if (selection.length == 0) {
return new Status(Status.ERROR, Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
}
for (int i = 0; i < selection.length; i++) {
if (!(selection[i] instanceof IFile)) {
return new Status(Status.ERROR, Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
}
}
return new Status(Status.OK, Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
}
};
public AbstractGeneratorComposite(Composite parent, int style) {
super(parent, style);
}
protected Composite createFileNameGroup(Composite parent, String groupText) {
Group group = new Group(parent, SWT.NONE);
group.setText(groupText);
GridLayout groupLayout = new GridLayout(2, false);
group.setLayout(groupLayout);
group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
group.setFont(parent.getFont());
createFileNameTextbox(group);
createFileNameBrowseButtons(group);
return group;
}
private void createFileNameTextbox(Composite parent) {
Composite fileNameComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = 0;
layout.marginLeft = 0;
layout.marginHeight = 0;
fileNameComposite.setLayout(layout);
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
fileNameComposite.setLayoutData(gd);
txtFileName = new Text(fileNameComposite, SWT.SINGLE | SWT.BORDER);
txtFileName.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
});
gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
txtFileName.setLayoutData(gd);
txtFileName.setFont(parent.getFont());
}
private void createFileNameBrowseButtons(Composite parent) {
new Label(parent, SWT.NONE);
Composite buttonComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
buttonComposite.setLayout(layout);
GridData gd = new GridData(SWT.END, SWT.CENTER, false, false);
buttonComposite.setLayoutData(gd);
buttonComposite.setFont(parent.getFont());
btnBrowseWorkplace = new Button(buttonComposite, SWT.NONE);
btnBrowseWorkplace.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IResource chosenFile = chooseFileFromWorkspace();
if (chosenFile != null) {
IPath path = chosenFile.getFullPath();
txtFileName.setText("${workspace_loc:" + path.toString() + "}"); //$NON-NLS-1$ //$NON-NLS-2$
javaProjectName = GeneratorLaunchShortcut.getJavaProjectNameFromResource(chosenFile);
}
}
});
btnBrowseWorkplace.setText(Messages.FILE_PICKER_BROWSE_WORKSPACE);
btnBrowseFileSystem = new Button(buttonComposite, SWT.NONE);
btnBrowseFileSystem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
chooseFileFromFileSystem();
}
});
btnBrowseFileSystem.setText(Messages.FILE_PICKER_BROWSE_FILE_SYSTEM);
}
protected IResource chooseFileFromWorkspace() {
ElementTreeSelectionDialog esd = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
esd.setTitle(getDialogTitle());
esd.setMessage(getDialogMessage());
esd.setAllowMultiple(false);
esd.setValidator(selectionStatusVerifier);
esd.addFilter(getViewerFilter());
esd.setInput(ResourcesPlugin.getWorkspace().getRoot());
esd.setInitialSelection(getWorkspaceResource());
int rc = esd.open();
if (rc == 0) {
Object[] elements = esd.getResult();
if (elements.length > 0) {
return (IResource) elements[0];
}
}
return null;
}
private IResource getWorkspaceResource() {
String path = txtFileName.getText();
if (path.length() > 0) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
try {
if (path.startsWith("${workspace_loc:")) { //$NON-NLS-1$
IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
path = manager.performStringSubstitution(path, false);
}
File f = new File(path);
IFile[] files;
files = root.findFilesForLocationURI(f.toURI());
if (files.length <= 0) {
return null;
}
return files[0];
} catch (CoreException e) {
return null;
}
}
return null;
}
protected void chooseFileFromFileSystem() {
String currentWorkingDir = txtFileName.getText();
String selected = null;
FileDialog dialog = new FileDialog(getShell());
if (StringUtility.stringHasValue(currentWorkingDir)) {
File path = new File(currentWorkingDir);
if (path.exists()) {
dialog.setFilterPath(currentWorkingDir);
}
}
dialog.setText(getDialogTitle());
dialog.setFilterExtensions(getAcceptableFileExtension());
selected = dialog.open();
if (selected != null) {
txtFileName.setText(selected);
javaProjectName = null;
}
}
protected abstract void updateLaunchConfigurationDialog();
protected abstract String getDialogTitle();
protected abstract String getDialogMessage();
protected abstract String[] getAcceptableFileExtension();
protected abstract ViewerFilter getViewerFilter();
}