blob: e3b4b90b01723b7ccc3a06a4acbc69306928297b [file] [log] [blame]
/**
* Copyright (c) 2017 CEA.
* 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:
* CEA - initial API and implementation and/or initial documentation
*/
/**
* Navigator Widget with the filter bar on the top
*/
package org.eclipse.sensinact.studio.navigator.device;
import org.apache.log4j.Logger;
import org.eclipse.emf.transaction.ResourceSetChangeEvent;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetListener;
import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetManager;
import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
import org.eclipse.sensinact.studio.navigator.device.commands.OpenResourceInvokerHandler;
import org.eclipse.sensinact.studio.navigator.device.doubleclick.BasicQueryResourceHelper;
import org.eclipse.sensinact.studio.navigator.device.filter.SensinactFilteredTree;
import org.eclipse.sensinact.studio.navigator.device.filter.SensinactPatternFilter;
import org.eclipse.sensinact.studio.navigator.device.toolbar.dialog.GatewayConfigDialog;
import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
import org.eclipse.sensinact.studio.resource.Gateway;
import org.eclipse.sensinact.studio.resource.Resource;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.navigator.NavigatorContentService;
import org.eclipse.ui.navigator.CommonDragAdapter;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.eclipse.ui.part.ViewPart;
/**
* @author Etienne Gandrille
*/
public class DeviceNavigatorFilterView extends ViewPart implements ResourceModelSetListener,IDoubleClickListener {
private static final Logger logger = Logger.getLogger(DeviceNavigatorFilterView.class);
public static final String VIEW_ID = "org.eclipse.sensinact.studio.navigator.device";
private TreeViewer viewer;
private NavigatorContentService contentService;
private FilteredTree tree;
@Override
public void createPartControl(Composite aParent) {
contentService = new NavigatorContentService(super.getViewSite().getId());
PatternFilter filter = new SensinactPatternFilter();
filter.setIncludeLeadingWildcard(true);
tree = new SensinactFilteredTree(this, aParent, SWT.H_SCROLL | SWT.V_SCROLL, filter, true);
viewer = tree.getViewer();
getSite().setSelectionProvider(viewer);
GridData gd = new GridData(GridData.FILL_BOTH);
tree.setLayoutData(gd);
viewer.setSorter(new DeviceNavigatorSorter());
viewer.setContentProvider(new DeviceNavigatorContentProvider());
viewer.setLabelProvider(new DeviceNavigatorLabelProvider());
viewer.setSelection(getSite().getSelectionProvider().getSelection());
INavigatorContentService ncs = contentService;//getSite().getService(INavigatorContentService.class);
CommonDragAdapter cd = new CommonDragAdapter(ncs, getSite().getSelectionProvider());
int ops = org.eclipse.swt.dnd.DND.DROP_MOVE | org.eclipse.swt.dnd.DND.DROP_COPY;
Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() };
viewer.addDragSupport(ops, transfers, cd);
viewer.addDoubleClickListener(this);
try {
tree.getViewer().setInput(ModelEditor.getInstance().getViewerInput());
} catch (InterruptedException e) {
logger.error("Error while setting input for the view", e);
}
IHandlerService handlerService = (IHandlerService) getSite()
.getService(IHandlerService.class);
OpenResourceInvokerHandler invoker=new OpenResourceInvokerHandler();
handlerService.activateHandler(VIEW_ID,invoker);
MenuManager menuMgr = new MenuManager();
Menu menu = menuMgr.createContextMenu(tree.getViewer().getControl());
tree.getViewer().getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, tree.getViewer());
ResourceModelSetManager.getInstance().subscribe(this);
}
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
Object element = selection.getFirstElement();
Shell parent = getViewSite().getShell();
if (element != null && element instanceof Resource) {
Resource resource = (Resource) element;
BasicQueryResourceHelper manager = new BasicQueryResourceHelper(parent, resource);
try {
manager.execute();
} catch (InterruptedException e) {
logger.error("Error during double click handler processing", e);
}
}
if (element != null && element instanceof Gateway) {
Gateway gateway = (Gateway) element;
GatewayHttpConfig config = ConfigurationManager.getGateway(gateway.getName());
if (config == null) {
MessageDialog.openError(parent, "Error", "Can't find gateway " + gateway.getName());
logger.error("Can't find gateway " + gateway.getName());
} else {
GatewayConfigDialog dialog = new GatewayConfigDialog(parent, config.getName(), config.getURL().getHost(), config.getURL().getPort(), config.getTimeout(), config.getUsername(), config.getPassword());
if (dialog.open() == Window.OK) {
GatewayHttpConfig gatewayConfig = dialog.getGateway();
if (! ConfigurationManager.addGateway(gatewayConfig))
MessageDialog.openError(parent, "Update Error", "Please check logs.");
}
}
}
}
@Override
public void modelSetUpdated(ResourceSetChangeEvent event) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if(contentService!=null){
contentService.getActivationService().persistExtensionActivations();
contentService.update();
contentService.dispose();
}
// tree.update();
viewer.refresh();
}
});
}
@Override
public void setFocus() {
viewer.getTree().setFocus();
}
}