blob: a0727f543a399d700782284709bb332f3fb339c5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 vogella GmbH.
* 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:
* Simon Scholz <simon.scholz@vogella.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.e4.tools.preference.spy.parts;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.property.Properties;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.di.extensions.Preference;
import org.eclipse.e4.tools.preference.spy.constants.PreferenceConstants;
import org.eclipse.e4.tools.preference.spy.constants.PreferenceSpyEventTopics;
import org.eclipse.e4.tools.preference.spy.model.PreferenceEntry;
import org.eclipse.e4.tools.preference.spy.model.PreferenceEntry.Fields;
import org.eclipse.e4.tools.preference.spy.model.PreferenceEntryManager;
import org.eclipse.e4.tools.preference.spy.model.PreferenceEntryPatternFilter;
import org.eclipse.e4.tools.preference.spy.model.PreferenceNodeEntry;
import org.eclipse.e4.tools.preference.spy.parts.viewer.PreferenceEntriesContentProvider;
import org.eclipse.e4.tools.preference.spy.parts.viewer.PreferenceEntryViewerComparator;
import org.eclipse.e4.tools.preference.spy.parts.viewer.PreferenceMapLabelProvider;
import org.eclipse.e4.tools.preference.spy.parts.viewer.PreferenceSpyEditingSupport;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.databinding.swt.DisplayRealm;
import org.eclipse.jface.resource.FontDescriptor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.FilteredTree;
@SuppressWarnings("restriction")
public class PreferenceSpyPart implements TreeViewerPart {
private FilteredTree filteredTree;
private boolean hierarchicalLayoutPreference;
private PreferenceEntryManager preferenceEntryManager;
@PostConstruct
public void postConstruct(Composite parent, final ESelectionService selectionService, EModelService modelService,
MWindow window) {
preferenceEntryManager = new PreferenceEntryManager();
PreferenceEntryPatternFilter patternFilter = new PreferenceEntryPatternFilter();
patternFilter.setIncludeLeadingWildcard(true);
filteredTree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter,
true);
Tree table = filteredTree.getViewer().getTree();
table.setHeaderVisible(true);
table.setLinesVisible(true);
filteredTree.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
@SuppressWarnings("unchecked")
ArrayList<PreferenceEntry> preferenceEntries = new ArrayList<PreferenceEntry>(
((IStructuredSelection) selection).toList());
selectionService.setSelection(preferenceEntries);
}
}
});
createColumn(Fields.nodePath, "Nodepath", 300);
createColumn(Fields.key, "Key", 300);
createColumn(Fields.oldValue, "Old Value", 150);
createColumn(Fields.newValue, "New Value", 150);
filteredTree.getViewer().setComparator(new PreferenceEntryViewerComparator());
FontDescriptor fontDescriptor = getBoldFontDescriptor();
Realm realm = DisplayRealm.getRealm(filteredTree.getViewer().getControl().getDisplay());
PreferenceEntriesContentProvider contentProvider = new PreferenceEntriesContentProvider(
BeanProperties.set("preferenceEntries",
PreferenceNodeEntry.class).setFactory(realm), null);
contentProvider.setHierarchicalLayout(hierarchicalLayoutPreference);
filteredTree.getViewer().setContentProvider(contentProvider);
filteredTree.getViewer().setLabelProvider(
new PreferenceMapLabelProvider(fontDescriptor, Properties.observeEach(
contentProvider.getKnownElements(), BeanProperties.values(PreferenceEntry.class, new String[] { "nodePath",
"key", "oldValue", "newValue" }))));
filteredTree.getViewer().setInput(preferenceEntryManager);
}
private FontDescriptor getBoldFontDescriptor() {
Font origFont = filteredTree.getViewer().getControl().getFont();
FontDescriptor fontDescriptor = FontDescriptor.createFrom(origFont);
return fontDescriptor.setStyle(SWT.BOLD);
}
private void createColumn(Fields field, String columnName, int width) {
TreeViewerColumn viewerColumn = new TreeViewerColumn(filteredTree.getViewer(), SWT.NONE);
viewerColumn.getColumn().setWidth(width);
viewerColumn.getColumn().setText(columnName);
viewerColumn.setLabelProvider(new ColumnLabelProvider());
viewerColumn.setEditingSupport(new PreferenceSpyEditingSupport(filteredTree.getViewer(), field));
}
@Inject
public void layoutChanged(
@Preference(value = PreferenceConstants.HIERARCHICAL_LAYOUT) boolean hierarchicalLayoutPreference) {
this.hierarchicalLayoutPreference = hierarchicalLayoutPreference;
if (filteredTree != null && !filteredTree.getViewer().getControl().isDisposed()) {
PreferenceEntriesContentProvider contentProvider = (PreferenceEntriesContentProvider) filteredTree
.getViewer().getContentProvider();
contentProvider.setHierarchicalLayout(hierarchicalLayoutPreference);
filteredTree.getViewer().refresh();
}
}
@Inject
@Optional
public void preferenceChanged(
@UIEventTopic(PreferenceSpyEventTopics.PREFERENCESPY_PREFERENCE_CHANGED) PreferenceChangeEvent event) {
PreferenceNodeEntry preferenceNodeEntry = preferenceEntryManager.getRecentPreferenceNodeEntry(event.getNode()
.absolutePath());
PreferenceEntry preferenceEntry = new PreferenceEntry(event.getNode().absolutePath(), event.getKey());
preferenceEntry.setRecentlyChanged(true);
if (null == preferenceNodeEntry) {
preferenceNodeEntry = new PreferenceNodeEntry(event.getNode().absolutePath());
preferenceNodeEntry.setRecentlyChanged(true);
preferenceNodeEntry.addChildren(preferenceEntry);
preferenceEntry.setParent(preferenceNodeEntry);
preferenceEntryManager.addChildren(preferenceNodeEntry);
filteredTree.getViewer().setInput(preferenceEntryManager);
preferenceEntryManager.putRecentPreferenceEntry(event.getNode().absolutePath(), preferenceNodeEntry);
} else {
preferenceEntry.setParent(preferenceNodeEntry);
PreferenceEntry existingPreferenceEntry = findPreferenceEntry(preferenceEntry);
if (existingPreferenceEntry != null) {
preferenceEntry = existingPreferenceEntry;
} else {
preferenceNodeEntry.addChildren(preferenceEntry);
}
}
preferenceEntry.setOldValue(String.valueOf(event.getOldValue()));
preferenceEntry.setNewValue(String.valueOf(event.getNewValue()));
long currentTimeMillis = System.currentTimeMillis();
preferenceEntry.setTime(currentTimeMillis);
preferenceEntry.getParent().setTime(currentTimeMillis);
filteredTree.getViewer().refresh();
}
private PreferenceEntry findPreferenceEntry(PreferenceEntry preferenceEntry) {
PreferenceEntry parent = preferenceEntry.getParent();
if (parent instanceof PreferenceNodeEntry) {
IObservableSet preferenceEntries = ((PreferenceNodeEntry) parent).getPreferenceEntries();
for (Object object : preferenceEntries) {
if (object instanceof PreferenceEntry) {
PreferenceEntry existingPreferenceEntry = (PreferenceEntry) object;
if (existingPreferenceEntry.getKey().equals(preferenceEntry.getKey())) {
return existingPreferenceEntry;
}
}
}
}
return null;
}
@Inject
@Optional
public void preferenceChanged(
@UIEventTopic(PreferenceSpyEventTopics.PREFERENCESPY_PREFERENCE_SHOW) Collection<PreferenceEntry> preferenceEntries) {
preferenceEntryManager.addChildren(preferenceEntries);
filteredTree.getViewer().refresh();
}
@Inject
@Optional
public void DeletePreferenceEntries(
@UIEventTopic(PreferenceSpyEventTopics.PREFERENCESPY_PREFERENCE_ENTRIES_DELETE) List<PreferenceEntry> preferenceEntries) {
if (preferenceEntries != null && !preferenceEntries.isEmpty()) {
for (PreferenceEntry preferenceEntry : preferenceEntries) {
preferenceEntryManager.removeChildren(preferenceEntry);
}
preferenceEntryManager.removeChildren(preferenceEntries);
filteredTree.getViewer().refresh();
}
}
@Inject
@Optional
public void DeleteAllPreferenceEntries(
@UIEventTopic(PreferenceSpyEventTopics.PREFERENCESPY_PREFERENCE_ENTRIES_DELETE_ALL) List<PreferenceEntry> preferenceEntries) {
if (preferenceEntryManager != null) {
preferenceEntryManager.clearRecentPreferenceNodeEntry();
preferenceEntryManager.getPreferenceEntries().clear();
filteredTree.getViewer().refresh();
}
}
@Override
public TreeViewer getViewer() {
return filteredTree.getViewer();
}
}