// 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 net.sourceforge.eclipsejetty.launch.configuration;
import static net.sourceforge.eclipsejetty.launch.util.JettyLaunchUI.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import net.sourceforge.eclipsejetty.JettyPlugin;
import net.sourceforge.eclipsejetty.JettyPluginM2EUtils;
import net.sourceforge.eclipsejetty.JettyPluginUtils;
import net.sourceforge.eclipsejetty.Messages;
import net.sourceforge.eclipsejetty.launch.util.JettyLaunchConfigurationAdapter;
import net.sourceforge.eclipsejetty.launch.util.JettyLaunchConfigurationDelegate;
import net.sourceforge.eclipsejetty.util.Dependency;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchDelegate;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
/**
* UI
*
* @author Christian Köberl
* @author Manfred Hantschel
*/
public class JettyLaunchDependencyConfigurationTab extends AbstractJettyLaunchConfigurationTab
{
private final JettyLaunchDependencyEntryList dependencyEntryList;
private final ModifyDialogListener modifyDialogListener;
private Label m2eLabel;
private Button mavenIncludeCompile;
private Button mavenIncludeProvided;
private Button mavenIncludeRuntime;
private Button mavenIncludeTest;
private Button mavenIncludeSystem;
private Button mavenIncludeImport;
private Button mavenIncludeNone;
private Text dependencyFilterText;
private Table dependencyTable;
private boolean dependencyTableFormatted = false;
private String defaultFilterText;
public JettyLaunchDependencyConfigurationTab()
{
modifyDialogListener = new ModifyDialogListener();
dependencyEntryList = new JettyLaunchDependencyEntryList(modifyDialogListener);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
* @wbp.parser.entryPoint
*/
public void createControl(final Composite parent)
{
Composite tabComposite = createTabComposite(parent, 2, false);
createMavenGroup(tabComposite);
createOtherGroup(tabComposite);
createTableGroup(tabComposite);
setControl(tabComposite);
}
private void createMavenGroup(Composite tabComposite)
{
Composite mavenGroup = createTopComposite(tabComposite, SWT.NONE, 3, -1, false, 1, 1);
createLabel(mavenGroup, Messages.depConfigTab_mavenGroupTitle, 224, SWT.LEFT, 1, 1);
mavenIncludeCompile =
createButton(mavenGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeCompileButton,
Messages.depConfigTab_mavenIncludeCompileButtonTip, 224, 1, 1, modifyDialogListener);
mavenIncludeProvided =
createButton(mavenGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeProvidedButton,
Messages.depConfigTab_mavenIncludeProvidedButtonTip, -1, 1, 1, modifyDialogListener);
m2eLabel = createLabel(mavenGroup, JettyPluginUtils.EMPTY, 224, SWT.LEFT, 1, 2);
mavenIncludeRuntime =
createButton(mavenGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeRuntimeButton,
Messages.depConfigTab_mavenIncludeRuntimeButtonTip, 224, 1, 1, modifyDialogListener);
mavenIncludeSystem =
createButton(mavenGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeSystemButton,
Messages.depConfigTab_mavenIncludeSystemButtonTip, -1, 1, 1, modifyDialogListener);
mavenIncludeTest =
createButton(mavenGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeTestButton,
Messages.depConfigTab_mavenIncludeTestButtonTip, 224, 1, 1, modifyDialogListener);
mavenIncludeImport =
createButton(mavenGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeImportButton,
Messages.depConfigTab_mavenIncludeImportButtonTip, -1, 1, 1, modifyDialogListener);
createImage(tabComposite, JettyPlugin.getIcon(JettyPlugin.JETTY_PLUGIN_DEPENDENCY_LOGO), 96, SWT.CENTER,
SWT.TOP, 1, 1);
}
private void createOtherGroup(Composite tabComposite)
{
Composite otherGroup = createTopComposite(tabComposite, SWT.NONE, 3, -1, false, 2, 1);
createLabel(otherGroup, Messages.depConfigTab_otherGroupTitle, 224, SWT.LEFT, 1, 1);
mavenIncludeNone =
createButton(otherGroup, SWT.CHECK, Messages.depConfigTab_mavenIncludeNoneButton,
Messages.depConfigTab_mavenIncludeNoneButtonTip, 224, 2, 1, modifyDialogListener);
}
private void createTableGroup(Composite tabComposite)
{
Composite tableGroup = createTopComposite(tabComposite, SWT.NONE, 3, -1, true, 2, 1);
defaultFilterText = Messages.depConfigTab_dependencyFilterDefault;
dependencyFilterText =
createText(tableGroup, SWT.BORDER, Messages.depConfigTab_dependencyFilterTip, -1, -1, 3, 1,
new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
final ILaunchConfiguration configuration = getCurrentLaunchConfiguration();
if (configuration != null)
{
updateTable(JettyLaunchConfigurationAdapter.getInstance(configuration), true);
dependencyTable.getDisplay().syncExec(new Runnable()
{
public void run()
{
updateTable(JettyLaunchConfigurationAdapter.getInstance(configuration), true);
}
});
}
}
});
final Color defaultFilterColor = dependencyFilterText.getForeground();
dependencyFilterText.addFocusListener(new FocusListener()
{
public void focusLost(FocusEvent e)
{
if (dependencyFilterText.getText().trim().length() == 0)
{
dependencyFilterText.setText(defaultFilterText);
dependencyFilterText.selectAll();
dependencyFilterText.setForeground(dependencyFilterText.getDisplay().getSystemColor(
SWT.COLOR_DARK_GRAY));
ILaunchConfiguration configuration = getCurrentLaunchConfiguration();
if (configuration != null)
{
updateTable(JettyLaunchConfigurationAdapter.getInstance(configuration), true);
}
}
}
public void focusGained(FocusEvent e)
{
if (defaultFilterText.equalsIgnoreCase(dependencyFilterText.getText().trim()))
{
dependencyFilterText.setText(JettyPluginUtils.EMPTY);
dependencyFilterText.setForeground(defaultFilterColor);
ILaunchConfiguration configuration = getCurrentLaunchConfiguration();
if (configuration != null)
{
updateTable(JettyLaunchConfigurationAdapter.getInstance(configuration), true);
}
}
}
});
dependencyFilterText.setText(defaultFilterText);
dependencyFilterText.selectAll();
dependencyFilterText.setForeground(dependencyFilterText.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
dependencyTable =
createTable(tableGroup, SWT.BORDER | SWT.HIDE_SELECTION, 320, 128, 3, 1,
Messages.depConfigTab_dependencyTableInclude, Messages.depConfigTab_dependencyTableName,
Messages.depConfigTab_dependencyTableGlobal, Messages.depConfigTab_dependencyTableScope,
Messages.depConfigTab_dependencyTablePath);
Composite buttonComposite = createComposite(tableGroup, SWT.NONE, 4, -1, false, 3, 1);
createButton(buttonComposite, SWT.NONE, Messages.depConfigTab_dependencyTableResetButton,
Messages.depConfigTab_dependencyTableResetButtonTip, 196, 1, 1, new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
dependencyEntryList.reset();
updateLaunchConfigurationDialog();
}
});
createLabel(buttonComposite, JettyPluginUtils.EMPTY, -1, SWT.LEFT, 1, 1);
createImage(buttonComposite, JettyPlugin.getJettyIcon(), 16, SWT.CENTER, SWT.CENTER, 1, 1);
createLink(buttonComposite, SWT.NONE, Messages.depConfigTab_homepageLink, SWT.RIGHT, 1, 1, new Listener()
{
public void handleEvent(Event event)
{
Program.launch("http://eclipse-jetty.github.io/"); //$NON-NLS-1$
}
});
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
*/
public String getName()
{
return Messages.depConfigTab_title;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
*/
@Override
public Image getImage()
{
return JettyPlugin.getJettyDependencyIcon();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getMessage()
*/
@Override
public String getMessage()
{
return Messages.depConfigTab_message;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
*/
@Override
public void initializeFrom(final ILaunchConfiguration configuration)
{
super.initializeFrom(configuration);
try
{
JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(configuration);
mavenIncludeCompile.setSelection(!adapter.isScopeCompileExcluded());
mavenIncludeProvided.setSelection(!adapter.isScopeProvidedExcluded());
mavenIncludeRuntime.setSelection(!adapter.isScopeRuntimeExcluded());
mavenIncludeSystem.setSelection(!adapter.isScopeSystemExcluded());
mavenIncludeTest.setSelection(!adapter.isScopeTestExcluded());
mavenIncludeImport.setSelection(!adapter.isScopeImportExcluded());
mavenIncludeNone.setSelection(!adapter.isScopeNoneExcluded());
updateTable(adapter, true);
}
catch (final CoreException e)
{
JettyPlugin.error(Messages.depConfigTab_initializeFailed, e);
}
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void setDefaults(final ILaunchConfigurationWorkingCopy configuration)
{
// intentionally left blank
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
*/
public void performApply(final ILaunchConfigurationWorkingCopy configuration)
{
JettyLaunchConfigurationAdapter adapter = JettyLaunchConfigurationAdapter.getInstance(configuration);
try
{
adapter.updateConfigVersion();
adapter.setScopeCompileExcluded(!mavenIncludeCompile.getSelection());
adapter.setScopeProvidedExcluded(!mavenIncludeProvided.getSelection());
adapter.setScopeRuntimeExcluded(!mavenIncludeRuntime.getSelection());
adapter.setScopeSystemExcluded(!mavenIncludeSystem.getSelection());
adapter.setScopeTestExcluded(!mavenIncludeTest.getSelection());
adapter.setScopeImportExcluded(!mavenIncludeImport.getSelection());
adapter.setScopeNoneExcluded(!mavenIncludeNone.getSelection());
adapter.setExcludedGenericIds(dependencyEntryList.createExcludedGenericIds());
adapter.setIncludedGenericIds(dependencyEntryList.createIncludedGenericIds());
adapter.setGlobalGenericIds(dependencyEntryList.createGlobalGenericIds());
deprecatedPerformApply(adapter);
updateTable(adapter, false);
}
catch (CoreException e)
{
JettyPlugin.error(Messages.depConfigTab_performApplyFailed, e);
}
}
@SuppressWarnings("deprecation")
private void deprecatedPerformApply(JettyLaunchConfigurationAdapter adapter) throws CoreException
{
adapter.setExcludedLibs(dependencyEntryList.createExcludedLibs());
adapter.setIncludedLibs(dependencyEntryList.createIncludedLibs());
adapter.setGlobalLibs(dependencyEntryList.createGlobalLibs());
}
/**
* {@inheritDoc}
*
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
*/
@Override
public boolean isValid(final ILaunchConfiguration configuration)
{
setErrorMessage(null);
setMessage(null);
boolean scopeable = false;
m2eLabel.setText(JettyPluginUtils.EMPTY);
if (JettyPluginM2EUtils.isM2EAvailable())
{
try
{
scopeable =
JettyPluginM2EUtils.getMavenProjectFacade(JettyLaunchConfigurationAdapter
.getInstance(configuration)) != null;
}
catch (CoreException e)
{
// ignore
}
if (!scopeable)
{
m2eLabel.setText(Messages.depConfigTab_noM2ENature);
}
}
else
{
m2eLabel.setText(Messages.depConfigTab_m2eNotAvailable);
}
mavenIncludeCompile.setEnabled(scopeable);
mavenIncludeProvided.setEnabled(scopeable);
mavenIncludeRuntime.setEnabled(scopeable);
mavenIncludeTest.setEnabled(scopeable);
mavenIncludeSystem.setEnabled(scopeable);
mavenIncludeImport.setEnabled(scopeable);
mavenIncludeNone.setEnabled(true);
setDirty(true);
return true;
}
/**
* Updates the dependency table
*
* @param adapter the configuration adapter
* @param updateType true to update the types of the entries
*/
private void updateTable(final JettyLaunchConfigurationAdapter adapter, final boolean updateType)
{
dependencyTable.getDisplay().asyncExec(new Runnable()
{
public void run()
{
try
{
ILaunchDelegate[] delegates =
adapter.getConfiguration().getType().getDelegates(new HashSet<String>(Arrays.asList("run"))); //$NON-NLS-1$
if (delegates.length == 1)
{
JettyLaunchConfigurationDelegate delegate =
(JettyLaunchConfigurationDelegate) delegates[0].getDelegate();
Collection<Dependency> originalClasspathEntries = delegate.getOriginalClasspathEntries(adapter);
Collection<Dependency> webappClasspathEntries =
delegate.getWebappClasspathEntries(adapter, originalClasspathEntries);
Collection<Dependency> globalWebappClasspathEntries =
delegate.getGlobalWebappClasspathEntries(adapter, webappClasspathEntries);
if (dependencyEntryList.update(adapter, dependencyTable, originalClasspathEntries,
webappClasspathEntries, globalWebappClasspathEntries, updateType,
getDependencyTableFilterPattern()))
{
if (!dependencyTableFormatted)
{
for (int i = 0; i < dependencyTable.getColumnCount(); i += 1)
{
dependencyTable.getColumn(i).pack();
}
}
if (dependencyTable.getItemCount() > 0)
{
dependencyTableFormatted = true;
}
}
}
}
catch (CoreException e)
{
JettyPlugin.error(Messages.depConfigTab_dependencyTableUpdateFailed, e);
}
}
});
}
protected String getDependencyTableFilterPattern()
{
String text = dependencyFilterText.getText().trim();
if (defaultFilterText.equalsIgnoreCase(text))
{
return "*"; //$NON-NLS-1$
}
return "*" + text + "*"; //$NON-NLS-1$ //$NON-NLS-2$
}
public final class ModifyDialogListener implements ModifyListener, SelectionListener
{
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@SuppressWarnings("synthetic-access")
public void modifyText(final ModifyEvent e)
{
updateLaunchConfigurationDialog();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(final SelectionEvent arg0)
{
// intentionally left blank
}
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@SuppressWarnings("synthetic-access")
public void widgetSelected(final SelectionEvent arg0)
{
updateLaunchConfigurationDialog();
}
}
}