1 package com.proalpha.pds.paconnector;
3 import java.text.MessageFormat;
4 import java.util.Arrays;
6 import java.util.concurrent.CopyOnWriteArrayList;
8 import org.eclipse.core.resources.IFile;
9 import org.eclipse.core.resources.IProject;
10 import org.eclipse.core.resources.IResource;
11 import org.eclipse.core.resources.ResourcesPlugin;
12 import org.eclipse.core.runtime.CoreException;
13 import org.eclipse.core.runtime.IAdaptable;
14 import org.eclipse.core.runtime.IAdapterManager;
15 import org.eclipse.core.runtime.Platform;
16 import org.eclipse.core.runtime.SubMonitor;
17 import org.eclipse.jface.dialogs.MessageDialog;
18 import org.eclipse.jface.text.ITextSelection;
19 import org.eclipse.jface.viewers.ISelection;
20 import org.eclipse.jface.viewers.IStructuredSelection;
21 import org.eclipse.jface.viewers.ITreeSelection;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.ui.IEditorInput;
24 import org.eclipse.ui.IEditorPart;
25 import org.eclipse.ui.ISelectionService;
26 import org.eclipse.ui.IWorkbenchPage;
27 import org.eclipse.ui.IWorkbenchWindow;
28 import org.eclipse.ui.PlatformUI;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
32 import com.openedge.pdt.project.IOpenEdgeProject;
33 import com.openedge.pdt.project.IOpenEdgeProjectListener;
34 import com.openedge.pdt.project.OEProject;
35 import com.openedge.pdt.project.OEProjectPlugin;
36 import com.proalpha.pds.paconnector.utils.CheckPythonModules;
40 private final Logger logger = LoggerFactory.getLogger(
PaProjectManager.class);
42 private OpenEdgeProjectListener projectListener;
43 private List<PaProject> paProjects;
45 public List<PaProject> getPaProjects() {
49 private Boolean pythonVersionChecked =
false;
52 this.paProjects =
new CopyOnWriteArrayList<>();
53 this.projectListener =
new OpenEdgeProjectListener();
54 OEProjectPlugin.getDefault().getProjectManager().addOpenEdgeProjectListener(projectListener);
57 this.checkPythonVersions();
58 this.addOpenProjects();
65 private void addOpenProjects() {
66 List<IProject> projects = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
67 for (IProject project : projects) {
68 if (project.isOpen()) {
69 OEProject oeProject = (OEProject) OEProjectPlugin.getDefault().getOpenEdgeModel()
70 .getOpenEdgeProject(project);
71 if(oeProject !=
null) addPaProject(oeProject);
76 public void addPaProject(IOpenEdgeProject oeProject) {
77 if (canAddPaProject(oeProject)) {
79 paProjects.add(paProject);
80 this.checkPythonVersions();
84 public void addPaProject(
PaProject paProject) {
85 if (canAddPaProject(paProject.getOeProject())) {
86 paProjects.add(paProject);
87 this.checkPythonVersions();
91 private boolean canAddPaProject(IOpenEdgeProject oeProject) {
93 IProject project = oeProject.getProject();
94 if(project !=
null)
return project.hasNature(
"com.proalpha.pds.ui.proalphaNature");
96 }
catch (CoreException e) {
101 public void removePaProject(IOpenEdgeProject oeProject) {
102 paProjects.forEach(paProject -> {
103 if (paProject.getOeProject().equals(oeProject)) {
105 paProjects.remove(paProject);
110 public void openProjects(List<IProject> affectedProjects, SubMonitor monitor) {
111 for (IProject iProject : affectedProjects) {
112 SubMonitor subMonitor = monitor.newChild(1);
113 subMonitor.subTask(MessageFormat.format(
"Opening project {0}", iProject.getName()));
115 iProject.open(subMonitor);
116 }
catch (CoreException e) {
117 logger.error(
"Error while opening project {}", iProject);
124 public void closeProjects(List<IProject> affectedProjects, SubMonitor monitor) {
125 for (IProject iProject : affectedProjects) {
126 SubMonitor subMonitor = monitor.newChild(1);
127 subMonitor.subTask(MessageFormat.format(
"Closing project {0}", iProject.getName()));
129 iProject.close(subMonitor);
130 }
catch (CoreException e) {
131 logger.error(
"Error while closing project {}", iProject);
138 public PaProject getPaProject(IOpenEdgeProject oeProject) {
140 if (paProject.getOeProject().equals(oeProject))
146 public PaProject getPaProject(IProject iProject) {
148 OEProject oeProject = (OEProject) OEProjectPlugin.getDefault().getOpenEdgeModel().getOpenEdgeProject(iProject);
150 if (paProject.getOeProject().equals(oeProject))
163 IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
165 if (activeWorkbenchWindow ==
null) {
170 ISelectionService service = activeWorkbenchWindow.getService(ISelectionService.class);
172 if (service !=
null) {
173 ISelection selection = service.getSelection();
174 if (selection instanceof IStructuredSelection) {
175 if (((IStructuredSelection) selection).getFirstElement() instanceof IResource) {
176 IProject curProject = ((IResource) ((IStructuredSelection) selection).getFirstElement())
179 paProject = getPaProject(curProject);
185 if (paProject ==
null) {
191 IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
192 IEditorPart activeEditor = activePage.getActiveEditor();
193 IEditorInput curedit = activeEditor.getEditorInput();
194 IResource curresource = curedit.getAdapter(IResource.class);
195 IProject curProject = curresource.getProject();
196 paProject = getPaProject(curProject);
197 }
catch (NullPointerException e) {
204 public PaProject getPaProjectByProjectExplorer() {
205 ISelectionService ss = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService();
206 String projExpID =
"org.eclipse.ui.navigator.ProjectExplorer";
207 ISelection sel = ss.getSelection(projExpID);
208 Object selectedObject = sel;
209 if (sel instanceof IStructuredSelection) {
210 selectedObject = ((IStructuredSelection) sel).getFirstElement();
212 if (selectedObject instanceof IAdaptable) {
213 IResource res = ((IAdaptable) selectedObject).getAdapter(IResource.class);
214 return getPaProject(res.getProject());
219 public IFile getFileFromActiveSelection() {
222 IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
223 IAdapterManager adapterManager = Platform.getAdapterManager();
225 if (workbenchWindow !=
null && adapterManager !=
null) {
227 ISelectionService selectionService = workbenchWindow.getSelectionService();
228 ISelection activSelection = selectionService.getSelection();
230 if (activSelection instanceof ITreeSelection) {
231 Object input = ((ITreeSelection) activSelection).getFirstElement();
233 file = adapterManager.getAdapter(input, IFile.class);
236 else if (activSelection instanceof ITextSelection) {
237 IWorkbenchPage page = workbenchWindow.getActivePage();
238 IEditorPart editor = page.getActiveEditor();
239 if (editor !=
null) {
240 IEditorInput input = editor.getEditorInput();
241 file = adapterManager.getAdapter(input, IFile.class);
251 public void dispose() {
252 if (projectListener !=
null) {
253 OEProjectPlugin.getDefault().getProjectManager().removeOpenEdgeProjectListener(projectListener);
254 projectListener =
null;
258 private void checkPythonVersions() {
260 if (this.pythonVersionChecked)
263 CheckPythonModules pycheck =
new CheckPythonModules();
265 if (!pycheck.pythonVersionsMatch()) {
268 new Thread(
new Runnable() {
270 final String messagetext =
"To use this plugin version of proALPHA higher versions of python modules is needed. "
271 +
"To update the python module execute\n\n"
272 +
"python -m pip install pa_installer --upgrade --upgrade-strategy=eager\n\n"
273 +
"in a command line started with admin rights.";
278 }
catch (Exception e) {
280 Display.getDefault().asyncExec(
new Runnable() {
282 MessageDialog.openWarning(
283 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
284 "python not up to date", messagetext);
294 this.pythonVersionChecked =
true;
297 private class OpenEdgeProjectListener
implements IOpenEdgeProjectListener {
298 public void projectCreated(
final IOpenEdgeProject project) {
299 PaProjectManager.this.addPaProject(project);
302 public void projectDeleted(
final IOpenEdgeProject project) {
303 PaProjectManager.this.removePaProject(project);
PaProject getPaProjectByTextSelection()