/**
* 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 static org.mybatis.generator.eclipse.ui.launcher.tabs.LauncherUtils.getTextOrBlank;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.mybatis.generator.eclipse.ui.Messages;
import org.mybatis.generator.eclipse.ui.content.ConfigVerifyer;
/**
* It is a bit of an extravagance to have this in a separate class from the tab,
* but doing so allows us to use the Eclipse SWT designer.
*
* @author Jeff Butler
*
*/
public class ConfigurationComposite extends AbstractGeneratorComposite {
private ConfigurationTab configurationTab;
private Map<LoggingButtonData, Button> loggingButtonMap = new HashMap<LoggingButtonData, Button>();
/**
* Create the composite.
*
* @param parent
* @param style
*/
public ConfigurationComposite(Composite parent, int style, final ConfigurationTab configurationTab) {
super(parent, style);
this.configurationTab = configurationTab;
setLayout(new GridLayout(1, false));
createFileNameGroup(this, Messages.CONFIGURATION_TAB_FILE_GROUP_TITLE);
createLoggingSelectorGroup();
}
private void createLoggingSelectorGroup() {
Group loggingButtonGroup = new Group(this, SWT.NONE);
loggingButtonGroup.setText(Messages.CONFIGURATION_TAB_LOGGER_GROUP_TITLE);
GridLayout groupLayout = new GridLayout(LoggingButtonData.values().length, false);
loggingButtonGroup.setLayout(groupLayout);
loggingButtonGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
loggingButtonGroup.setFont(this.getFont());
SelectionListener listener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Button button = (Button) e.widget;
if (button.getSelection()) {
updateLaunchConfigurationDialog();
}
}
};
for (LoggingButtonData data : LoggingButtonData.values()) {
Button b = new Button(loggingButtonGroup, SWT.RADIO);
b.setText(data.displayText());
b.setData(data);
b.addSelectionListener(listener);
loggingButtonMap.put(data, b);
}
}
public boolean isValid() {
try {
String fileName = txtFileName.getText();
String fullPath = VariablesPlugin.getDefault().getStringVariableManager()
.performStringSubstitution(fileName);
File file = new File(fullPath);
if (file.exists()) {
ConfigVerifyer cv = new ConfigVerifyer(file);
if (cv.isConfigurationFile()) {
configurationTab.setErrorMessage(null);
return true;
} else {
configurationTab.setErrorMessage(Messages.CONFIGURATION_TAB_INVALID_MESSAGE);
return false;
}
} else {
configurationTab.setErrorMessage(Messages.FILE_PICKER_FILE_DOESNT_EXIST);
return false;
}
} catch (CoreException e) {
return false;
}
}
public void initializeFrom(ILaunchConfiguration configuration) {
selectLoggingButton(getTextOrBlank(configuration, ATTR_LOGGING_IMPLEMENTATION));
txtFileName.setText(getTextOrBlank(configuration, ATTR_CONFIGURATION_FILE_NAME));
try {
javaProjectName = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String) null);
} catch (CoreException e) {
javaProjectName = null;
}
}
private void selectLoggingButton(String setting) {
deselectAllLoggingButtons();
if ("".equals(setting)) {
selectDefaultLoggingButton();
return;
}
try {
LoggingButtonData data = LoggingButtonData.valueOf(setting);
Button button = loggingButtonMap.get(data);
button.setSelection(true);
} catch (Exception e) {
selectDefaultLoggingButton();
}
}
private void deselectAllLoggingButtons() {
for (Button button : loggingButtonMap.values()) {
button.setSelection(false);
}
}
private void selectDefaultLoggingButton() {
for (Button button : loggingButtonMap.values()) {
LoggingButtonData data = (LoggingButtonData) button.getData();
if (data.isDefault()) {
button.setSelection(true);
break;
}
}
}
private Button getSelectedLoggingButton() {
Button rc = null;
for (Button button : loggingButtonMap.values()) {
if (button.getSelection()) {
rc = button;
}
}
return rc;
}
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
Button button = getSelectedLoggingButton();
LoggingButtonData data = (LoggingButtonData) button.getData();
if (data.isDefault()) {
configuration.removeAttribute(ATTR_LOGGING_IMPLEMENTATION);
} else {
configuration.setAttribute(ATTR_LOGGING_IMPLEMENTATION, data.name());
}
configuration.setAttribute(ATTR_CONFIGURATION_FILE_NAME, txtFileName.getText());
configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, javaProjectName);
}
@Override
protected void updateLaunchConfigurationDialog() {
configurationTab.updateLaunchConfigurationDialog();
}
@Override
protected String getDialogTitle() {
return Messages.CONFIGURATION_TAB_FILE_PICKER_DIALOG_TITLE;
}
@Override
protected String[] getAcceptableFileExtension() {
return new String[] { "*.*", "*.xml" }; //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
protected String getDialogMessage() {
return Messages.CONFIGURATION_TAB_FILE_PICKER_DIALOG_MESSAGE;
}
@Override
protected ViewerFilter getViewerFilter() {
return new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IContainer) {
return true;
}
if (element instanceof IFile) {
IFile file = (IFile) element;
ConfigVerifyer cv = new ConfigVerifyer(file);
return cv.isConfigurationFile();
}
return false;
}
};
}
}