--- /dev/null
+package org.simantics.workbench.internal.contributions.search;\r
+\r
+\r
+import org.eclipse.core.expressions.Expression;\r
+import org.eclipse.ui.IWorkbench;\r
+import org.eclipse.ui.IWorkbenchPartSite;\r
+import org.eclipse.ui.IWorkbenchWindow;\r
+import org.eclipse.ui.internal.expressions.ActivePartExpression;\r
+import org.eclipse.ui.internal.expressions.WorkbenchWindowExpression;\r
+import org.eclipse.ui.internal.services.IWorkbenchLocationService;\r
+import org.eclipse.ui.services.AbstractServiceFactory;\r
+import org.eclipse.ui.services.IServiceLocator;\r
+import org.simantics.workbench.search.ISearchService;\r
+\r
+public class SearchServiceFactory extends AbstractServiceFactory {\r
+\r
+\r
+ @SuppressWarnings("rawtypes")\r
+ @Override\r
+ public Object create(Class serviceInterface, IServiceLocator parentLocator,\r
+ IServiceLocator locator) {\r
+ if (!ISearchService.class.equals(serviceInterface))\r
+ return null;\r
+ IWorkbenchLocationService wls = (IWorkbenchLocationService) locator\r
+ .getService(IWorkbenchLocationService.class);\r
+ final IWorkbench wb = wls.getWorkbench();\r
+ if (wb == null) {\r
+ return null;\r
+ }\r
+ \r
+ Object parent = parentLocator.getService(serviceInterface);\r
+ if (parent == null) {\r
+ return new SearchServiceImpl();\r
+ }\r
+ final IWorkbenchWindow window = wls.getWorkbenchWindow();\r
+ final IWorkbenchPartSite site = wls.getPartSite();\r
+ if (site == null) {\r
+ Expression exp = new WorkbenchWindowExpression(window);\r
+ return new SlaveSearchService((ISearchService)parent, exp);\r
+ }\r
+ if (parent instanceof SlaveSearchService) {\r
+ Expression parentExp = ((SlaveSearchService) parent).getDefaultExpression();\r
+ return new NestableSearchService((ISearchService)parent, parentExp);\r
+ }\r
+ \r
+ Expression exp = new ActivePartExpression(site.getPart());\r
+ return new SlaveSearchService((ISearchService)parent, exp);\r
+ }\r
+\r
+}\r