blob: 7e50b21c62d79fd62172ceb9aab7558ed5cfbc95 [file] [log] [blame]
/**
* Copyright (c) 2018, 2020 Angelo ZERR.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - [CodeMining] Provide Java References/Implementation CodeMinings - Bug 529127
* IBM Corporation
*/
package org.eclipse.jdt.internal.ui.preferences;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.Shell;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.jdt.internal.ui.preferences.FilteredPreferenceTree.PreferenceTreeNode;
import org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
/**
* Configures Java Editor code mining preferences.
*
* @since 3.16
*/
public class JavaEditorCodeMiningConfigurationBlock extends OptionsConfigurationBlock {
// Preference store keys
// --------------------- General
private static final Key PREF_CODEMINING_ENABLED= getJDTUIKey(
PreferenceConstants.EDITOR_CODEMINING_ENABLED);
private static final Key PREF_SHOW_CODEMINING_AT_LEAST_ONE= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_CODEMINING_AT_LEAST_ONE);
private static final Key PREF_SHOW_REFERENCES= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_REFERENCES);
private static final Key PREF_SHOW_REFERENCES_ON_TYPES= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_REFERENCES_ON_TYPES);
private static final Key PREF_SHOW_REFERENCES_ON_FIELDS= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_REFERENCES_ON_FIELDS);
private static final Key PREF_SHOW_REFERENCES_ON_METHODS= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_REFERENCES_ON_METHODS);
private static final Key PREF_SHOW_IMPLEMENTATIONS= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_IMPLEMENTATIONS);
private static final Key PREF_SHOW_PARAMETER_NAMES= getJDTUIKey(
PreferenceConstants.EDITOR_JAVA_CODEMINING_SHOW_PARAMETER_NAMES);
private static final String SETTINGS_SECTION_NAME= "JavaEditorCodeMiningConfigurationBlock"; //$NON-NLS-1$
private static final String[] TRUE_FALSE= new String[] { "true", "false" }; //$NON-NLS-1$ //$NON-NLS-2$
private PixelConverter fPixelConverter;
private Button atLeastOneCheckBox;
private PreferenceTree fFilteredPrefTree;
public JavaEditorCodeMiningConfigurationBlock(IStatusChangeListener context,
IWorkbenchPreferenceContainer container) {
super(context, null, getAllKeys(), container);
}
public static Key[] getAllKeys() {
return new Key[] { PREF_CODEMINING_ENABLED, PREF_SHOW_CODEMINING_AT_LEAST_ONE, PREF_SHOW_REFERENCES, PREF_SHOW_REFERENCES_ON_TYPES, PREF_SHOW_REFERENCES_ON_FIELDS,
PREF_SHOW_REFERENCES_ON_METHODS,
PREF_SHOW_IMPLEMENTATIONS, PREF_SHOW_PARAMETER_NAMES };
}
@Override
protected Control createContents(Composite parent) {
fPixelConverter= new PixelConverter(parent);
Shell shell= parent.getShell();
setShell(shell);
Composite mainComp= new Composite(parent, SWT.NONE);
mainComp.setFont(parent.getFont());
GridLayout layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
mainComp.setLayout(layout);
// Add enabled code mining checkbox
String text= PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_enableCodeMining_label;
Button codeMiningEnabledCheckBox= addCheckBoxWithLink(mainComp, text, PREF_CODEMINING_ENABLED, TRUE_FALSE, 0, SWT.DEFAULT, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if ("org.eclipse.ui.preferencePages.GeneralTextEditor".equals(e.text)) { //$NON-NLS-1$
PreferencesUtil.createPreferenceDialogOn(shell, e.text, null, null);
}
}
});
// - Only if there is at least one result
atLeastOneCheckBox= addCheckBox(mainComp,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showCodeMining_atLeastOne_label,
PREF_SHOW_CODEMINING_AT_LEAST_ONE, TRUE_FALSE, LayoutUtil.getIndent());
Composite commonComposite= createCodeMiningContent(mainComp);
GridData gridData= new GridData(GridData.FILL, GridData.FILL, true, true);
gridData.heightHint= fPixelConverter.convertHeightInCharsToPixels(20);
commonComposite.setLayoutData(gridData);
codeMiningEnabledCheckBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateEnableStates();
}
});
atLeastOneCheckBox.setEnabled(codeMiningEnabledCheckBox.getSelection());
fFilteredPrefTree.setEnabled(codeMiningEnabledCheckBox.getSelection());
validateSettings(null, null, null);
return mainComp;
}
private Composite createCodeMiningContent(Composite parent) {
// Create filtered tree which contains code minings
fFilteredPrefTree= new PreferenceTree(this, parent,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_common_description, false);
final ScrolledPageContent sc1= fFilteredPrefTree.getScrolledPageContent();
int nColumns= 1;
Composite composite= sc1.getBody();
GridLayout layout= new GridLayout(nColumns, false);
layout.marginHeight= 0;
layout.marginWidth= 0;
composite.setLayout(layout);
// --- General
createGeneralSection(nColumns, composite);
IDialogSettings settingsSection= JavaPlugin.getDefault().getDialogSettings().getSection(SETTINGS_SECTION_NAME);
restoreSectionExpansionStates(settingsSection);
return sc1;
}
private void createGeneralSection(int nColumns, Composite parent) {
int defaultIndent= 0;
int extraIndent= LayoutUtil.getIndent();
String label= PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_section_general;
Key twistieKey= OptionsConfigurationBlock.getLocalKey("JavaEditorCodeMiningPreferencePage_section_general"); //$NON-NLS-1$
PreferenceTreeNode<?> section= fFilteredPrefTree.addExpandableComposite(parent, label, nColumns, twistieKey,
null, false);
ExpandableComposite excomposite= getExpandableComposite(twistieKey);
Composite inner= createInnerComposite(excomposite, nColumns, parent.getFont());
// - Show references
PreferenceTreeNode<Button> showReferences= fFilteredPrefTree.addCheckBox(inner,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showReferences_label, PREF_SHOW_REFERENCES,
TRUE_FALSE, defaultIndent, section);
// - Show references (On types)
fFilteredPrefTree.addCheckBox(inner,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showReferences_onTypes_label,
PREF_SHOW_REFERENCES_ON_TYPES, TRUE_FALSE, extraIndent, showReferences);
// - Show references (On fields)
fFilteredPrefTree.addCheckBox(inner,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showReferences_onFields_label,
PREF_SHOW_REFERENCES_ON_FIELDS, TRUE_FALSE, extraIndent, showReferences);
// - Show references (On methods)
fFilteredPrefTree.addCheckBox(inner,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showReferences_onMethods_label,
PREF_SHOW_REFERENCES_ON_METHODS, TRUE_FALSE, extraIndent, showReferences);
// - Show implementations
fFilteredPrefTree.addCheckBox(inner,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showImplementations_label,
PREF_SHOW_IMPLEMENTATIONS, TRUE_FALSE, defaultIndent, section);
// - Show parameter names
fFilteredPrefTree.addCheckBox(inner,
PreferencesMessages.JavaEditorCodeMiningConfigurationBlock_showParameterNames_label,
PREF_SHOW_PARAMETER_NAMES, TRUE_FALSE, defaultIndent, section);
}
private void updateEnableStates() {
boolean enabledCodeMining= getCheckBox(PREF_CODEMINING_ENABLED).getSelection();
if (enabledCodeMining) {
// Show references checkboxes
atLeastOneCheckBox.setEnabled(true);
fFilteredPrefTree.setEnabled(true);
boolean showReferences= getCheckBox(PREF_SHOW_REFERENCES).getSelection();
getCheckBox(PREF_SHOW_REFERENCES_ON_TYPES).setEnabled(showReferences);
getCheckBox(PREF_SHOW_REFERENCES_ON_FIELDS).setEnabled(showReferences);
getCheckBox(PREF_SHOW_REFERENCES_ON_METHODS).setEnabled(showReferences);
// Show implementations checkboxes
getCheckBox(PREF_SHOW_IMPLEMENTATIONS).getSelection();
getCheckBox(PREF_SHOW_PARAMETER_NAMES).getSelection();
} else {
atLeastOneCheckBox.setEnabled(false);
fFilteredPrefTree.setEnabled(false);
}
}
private Composite createInnerComposite(ExpandableComposite excomposite, int nColumns, Font font) {
Composite inner= new Composite(excomposite, SWT.NONE);
inner.setFont(font);
inner.setLayout(new GridLayout(nColumns, false));
excomposite.setClient(inner);
return inner;
}
@Override
protected void validateSettings(Key changedKey, String oldValue, String newValue) {
if (!areSettingsEnabled()) {
return;
}
if (changedKey != null) {
if (PREF_CODEMINING_ENABLED.equals(changedKey) || PREF_SHOW_REFERENCES.equals(changedKey) || PREF_SHOW_IMPLEMENTATIONS.equals(changedKey)) {
updateEnableStates();
}
} else {
updateEnableStates();
}
fContext.statusChanged(new StatusInfo());
}
@Override
protected String[] getFullBuildDialogStrings(boolean workspaceSettings) {
return null;
}
@Override
public void dispose() {
IDialogSettings section= JavaPlugin.getDefault().getDialogSettings().addNewSection(SETTINGS_SECTION_NAME);
storeSectionExpansionStates(section);
super.dispose();
}
}