/*******************************************************************************
* Copyright (c) 2016 ARM Ltd. and others
* 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:
* ARM Ltd and ARM Germany GmbH - Initial API and implementation
*******************************************************************************/
package com.arm.cmsis.pack.installer.ui;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import com.arm.cmsis.pack.CpPlugIn;
import com.arm.cmsis.pack.ICpEnvironmentProvider;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.ICpExample;
import com.arm.cmsis.pack.data.ICpItem;
import com.arm.cmsis.pack.data.ICpPack;
import com.arm.cmsis.pack.events.RteEvent;
import com.arm.cmsis.pack.events.RteEventProxy;
import com.arm.cmsis.pack.installer.ui.views.PackInstallerView;
import com.arm.cmsis.pack.installer.ui.views.PackPropertyView;
import com.arm.cmsis.pack.rte.boards.IRteBoardDeviceItem;
import com.arm.cmsis.pack.rte.devices.IRteDeviceItem;
import com.arm.cmsis.pack.rte.examples.IRteExampleItem;
/**
* Class responsible for synchronizing Pack Installer Views
*/
public class PackInstallerViewController extends RteEventProxy implements ISelectionListener {
public final static String INSTALLER_UI_FILTER_CHANGED = "installer.ui.filter.changed"; //$NON-NLS-1$
public final static String INSTALLER_UI_PACK_CHANGED = "installer.ui.pack.changed"; //$NON-NLS-1$
protected PackInstallerViewFilter fFilter = null;
protected ICpPack fSelectedPack = null;
public PackInstallerViewController() {
}
public void clear() {
fSelectedPack = null;
removeAllListeners();
if(fFilter != null) {
fFilter.clear();
fFilter = null;
}
}
@Override
public void handle(RteEvent event) {
if(event.getTopic().equals(RteEvent.PACKS_RELOADED)) {
fSelectedPack = null;
if (fFilter != null) {
fFilter.clear();
}
}
super.handle(event);
}
public ICpPack getSelectedPack() {
return fSelectedPack;
}
public PackInstallerViewFilter getFilter() {
if(fFilter == null) {
fFilter = createFilter();
}
return fFilter;
}
public PackInstallerViewFilter createFilter() {
return new PackInstallerViewFilter();
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if(part instanceof PackInstallerView) {
updateSelectedPack((IStructuredSelection)selection);
PackInstallerView view = (PackInstallerView)part;
if(view.isFilterSource()) {
boolean changed = getFilter().setSelection(part, (IStructuredSelection) selection);
if(changed) {
emitRteEvent(INSTALLER_UI_FILTER_CHANGED, null);
}
}
}
}
static public ICpPack getPackFromSelection(ISelection selection) {
if(selection == null || !(selection instanceof IStructuredSelection)) {
return null;
}
IStructuredSelection sel = (IStructuredSelection) selection;
if(sel.size() == 1) {
return getPackFromObject(sel.getFirstElement());
}
return null;
}
static public ICpPack getPackFromObject(Object o) {
if(o == null) {
return null;
}
if(o instanceof IStructuredSelection) {
return getPackFromSelection((ISelection) o);
}
ICpItem item = null;
if(o instanceof ICpItem) {
item = (ICpItem)o;
} else if(o instanceof IRteBoardDeviceItem) {
IRteBoardDeviceItem board = (IRteBoardDeviceItem)o;
item = board.getBoard();
} else if(o instanceof IRteDeviceItem) {
IRteDeviceItem device = (IRteDeviceItem)o;
item = device.getDevice();
} else if(o instanceof IRteExampleItem) {
IRteExampleItem example = (IRteExampleItem)o;
item = example.getExample();
}
if(item != null) {
return item.getPack();
}
return null;
}
protected void updateSelectedPack(IStructuredSelection selection) {
ICpPack pack = getPackFromSelection(selection);
if(fSelectedPack == pack) {
return;
}
fSelectedPack = pack;
emitRteEvent(INSTALLER_UI_PACK_CHANGED, fSelectedPack);
}
public void showPackProperties(ISelection selection) {
if(selection != null && selection instanceof IStructuredSelection) {
updateSelectedPack((IStructuredSelection)selection);
}
IWorkbench wb = PlatformUI.getWorkbench();
if(wb == null) {
return;
}
IWorkbenchWindow wbw = wb.getActiveWorkbenchWindow();
if(wbw == null || wbw.getActivePage() == null) {
return;
}
try {
wbw.getActivePage().showView(PackPropertyView.ID);
} catch (PartInitException e) {
e.printStackTrace();
}
}
public void copyExample(ICpExample cpExample) {
ICpEnvironmentProvider envProvider = CpPlugIn.getEnvironmentProvider();
if(envProvider == null) {
return;
}
IAdaptable copyResult = envProvider.copyExample(cpExample);
if(copyResult == null) {
return;
}
@SuppressWarnings("cast")
IProject project = (IProject) copyResult.getAdapter(IProject.class);
if (project == null) {
return;
}
IWorkbench wb = PlatformUI.getWorkbench();
if (wb != null) {
IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
if (window != null) {
IPerspectiveDescriptor persDescription = wb.getPerspectiveRegistry().findPerspectiveWithId("org.eclipse.cdt.ui.CPerspective"); //$NON-NLS-1$
IWorkbenchPage page = window.getActivePage();
if (page != null && persDescription != null) {
page.setPerspective(persDescription);
try {
String rteConf = project.getName() + '.' + CmsisConstants.RTECONFIG;
IResource r = project.findMember(rteConf);
if(r != null && r.exists() && r.getType() == IResource.FILE) {
IDE.openEditor(page, project.getFile(rteConf));
}
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
}
}
}