blob: 4d527f937a525b55a30102314a3a8aa3e1c3929d [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2010, 2020 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.ltk.ui.sourceediting.assist;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.statet.ecommons.preferences.core.Preference;
import org.eclipse.statet.ecommons.preferences.ui.ManagedConfigurationBlock;
import org.eclipse.statet.ecommons.runtime.core.StatusChangeListener;
import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
import org.eclipse.statet.ecommons.ui.util.MessageUtils;
import org.eclipse.statet.ecommons.ui.viewers.ViewerUtils.CheckboxTableComposite;
/**
* Configures Editor hover preferences.
*/
public class AdvancedInfoHoverConfigurationBlock extends ManagedConfigurationBlock {
private class CheckProvider implements ICheckStateProvider, ICheckStateListener {
@Override
public boolean isGrayed(final Object element) {
return false;
}
@Override
public boolean isChecked(final Object element) {
final InfoHoverDescriptor descriptor= (InfoHoverDescriptor) element;
return descriptor.isEnabled;
}
@Override
public void checkStateChanged(final CheckStateChangedEvent event) {
final InfoHoverDescriptor descriptor= (InfoHoverDescriptor) event.getElement();
descriptor.isEnabled= event.getChecked();
handleHoverListSelection();
}
}
private final InfoHoverRegistry registry;
private List<InfoHoverDescriptor> descriptors;
private CheckboxTableViewer hoverTableViewer;
private Text modifierEditor;
public AdvancedInfoHoverConfigurationBlock(final InfoHoverRegistry registry,
final StatusChangeListener statusListener) {
super(null, statusListener);
this.registry= registry;
}
@Override
protected void createBlockArea(final Composite pageComposite) {
final Map<Preference<?>, String> prefs= new HashMap<>();
prefs.put(this.registry.getPrefSeparateSettings(), this.registry.getSettingsGroupId());
setupPreferenceManager(prefs);
final Composite composite= new Composite(pageComposite, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
composite.setLayout(LayoutUtils.newCompositeGrid(2));
final CheckboxTableComposite tableComposite= new CheckboxTableComposite(composite,
SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
this.hoverTableViewer= tableComposite.viewer;
tableComposite.table.setHeaderVisible(true);
tableComposite.table.setLinesVisible(true);
{ final TableViewerColumn column= tableComposite.addColumn("Hover Type",
SWT.LEFT, new ColumnWeightData(1) );
column.setLabelProvider(new CellLabelProvider() {
@Override
public void update(final ViewerCell cell) {
final InfoHoverDescriptor descriptor= (InfoHoverDescriptor) cell.getElement();
cell.setText(descriptor.getName());
}
});
}
{ final TableViewerColumn column= tableComposite.addColumn("Modifier Keys",
SWT.LEFT, new ColumnWeightData(1) );
column.setLabelProvider(new CellLabelProvider() {
@Override
public void update(final ViewerCell cell) {
final InfoHoverDescriptor descriptor= (InfoHoverDescriptor) cell.getElement();
cell.setText(MessageUtils.getModifierString(descriptor.getStateMask()));
}
});
}
this.hoverTableViewer.setUseHashlookup(true);
this.hoverTableViewer.setContentProvider(new ArrayContentProvider());
this.hoverTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
handleHoverListSelection();
}
});
final CheckProvider checkProvider= new CheckProvider();
this.hoverTableViewer.setCheckStateProvider(checkProvider);
this.hoverTableViewer.addCheckStateListener(checkProvider);
// Text field for modifier string
{ final Label label= new Label(composite, SWT.LEFT);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
label.setText("&Modifier keys:");
this.modifierEditor= new Text(composite, SWT.BORDER);
this.modifierEditor.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
this.modifierEditor.addKeyListener(new KeyListener() {
@Override
public void keyPressed(final KeyEvent e) {
e.doit= false;
final InfoHoverDescriptor descriptor= getSelecteddescriptor();
if (descriptor == null) {
return;
}
if (e.keyCode > 0 && e.character == 0) {
descriptor.stateMask= ((e.stateMask | e.keyCode) & (SWT.CTRL | SWT.ALT | SWT.SHIFT | SWT.COMMAND));
}
else if (e.keyCode == SWT.DEL | e.keyCode == SWT.BS) {
descriptor.stateMask= 0;
}
else {
return;
}
AdvancedInfoHoverConfigurationBlock.this.modifierEditor.setText(MessageUtils.getModifierString(descriptor.getStateMask()));
AdvancedInfoHoverConfigurationBlock.this.hoverTableViewer.refresh(descriptor);
}
@Override
public void keyReleased(final KeyEvent e) {
}
});
LayoutUtils.addSmallFiller(composite, true);
this.descriptors= this.registry.loadCurrent();
this.hoverTableViewer.setInput(this.descriptors);
this.hoverTableViewer.getTable().setSelection(0);
handleHoverListSelection();
}
private InfoHoverDescriptor getSelecteddescriptor() {
return (InfoHoverDescriptor) ((IStructuredSelection) this.hoverTableViewer.getSelection()).getFirstElement();
}
private void handleHoverListSelection() {
final InfoHoverDescriptor descriptor= getSelecteddescriptor();
if (descriptor == null) {
this.modifierEditor.setText(""); //$NON-NLS-1$
this.modifierEditor.setEditable(false);
}
else {
this.modifierEditor.setText(MessageUtils.getModifierString(descriptor.stateMask));
this.modifierEditor.setEnabled(descriptor.isEnabled);
}
}
@Override
protected void updateControls() {
super.updateControls();
final List<InfoHoverDescriptor> updated= this.registry.applyPreferences(this, this.descriptors);
this.descriptors.clear();
this.descriptors.addAll(updated);
this.hoverTableViewer.refresh();
}
@Override
protected void updatePreferences() {
setPrefValues(this.registry.toPreferencesMap(this.descriptors));
super.updatePreferences();
}
}