package com.arm.cmsis.pack.project.ui.handlers;
import java.util.Map;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
import com.arm.cmsis.pack.data.ICpFile;
import com.arm.cmsis.pack.enums.EFileCategory;
import com.arm.cmsis.pack.enums.EFileRole;
import com.arm.cmsis.pack.info.ICpFileInfo;
import com.arm.cmsis.pack.project.CpProjectPlugIn;
import com.arm.cmsis.pack.project.IRteProject;
import com.arm.cmsis.pack.project.Messages;
import com.arm.cmsis.pack.project.RteProjectStorage;
import com.arm.cmsis.pack.project.utils.ProjectUtils;
import com.arm.cmsis.pack.utils.Utils;
public class UpdateConfigFileHandler extends AbstractHandler implements IElementUpdater {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelection(event);
if (!(selection instanceof IStructuredSelection)) {
return null;
}
IStructuredSelection sel = (IStructuredSelection) selection;
for (Object obj : sel.toArray()) {
IFile file = ProjectUtils.getRteFileResource(obj);
String dstFile = file.getProjectRelativePath().toString();
ICpFileInfo fi = ProjectUtils.getCpFileInfo(file);
ICpFile f = fi.getFile();
String srcFile = f.getAbsolutePath(f.getName());
EFileRole role = fi.getRole();
if (role == EFileRole.CONFIG || role == EFileRole.COPY) {
int index = -1;
EFileCategory cat = fi.getCategory();
if (cat.isHeader() || cat.isSource()) {
String baseSrc = Utils.extractBaseFileName(srcFile);
String baseDst = Utils.extractBaseFileName(dstFile);
int len = baseSrc.length() + 1;
if (baseDst.length() > len) {
String instance = baseDst.substring(len);
try {
index = Integer.decode(instance);
} catch (NumberFormatException e) {
// do nothing, use -1
}
}
}
try {
int bCopied = ProjectUtils.copyFile(file.getProject(), srcFile, dstFile, index, null, true);
if (bCopied == 1) {
// do the version update and save it in the .cproject file
fi.setVersion(f.getVersion());
IRteProject rteProject = CpProjectPlugIn.getRteProjectManager()
.getRteProject(file.getProject());
RteProjectStorage projectStorage = rteProject.getProjectStorage();
projectStorage.setConfigFileVersion(dstFile, f.getVersion());
projectStorage.save(CoreModel.getDefault().getProjectDescription(file.getProject()));
rteProject.save();
}
} catch (CoreException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
public void updateElement(UIElement element, @SuppressWarnings("rawtypes") Map parameters) {
ISelectionService selectionService = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
ISelection selection = selectionService.getSelection("org.eclipse.ui.navigator.ProjectExplorer"); //$NON-NLS-1$
if (selection instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) selection;
if (sel.size() == 1) {
Object obj = sel.getFirstElement();
IFile file = ProjectUtils.getRteFileResource(obj);
ICpFileInfo fi = ProjectUtils.getCpFileInfo(file);
if (fi == null || fi.getFile() == null) {
return;
}
int versionDiff = fi.getVersionDiff();
String versionText = " (" + fi.getVersion() + " -> " + fi.getFile().getVersion() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (versionDiff < 0) {
element.setText(Messages.UpdateConfigFileHandler_Upgrade + file.getName() + versionText);
} else if (versionDiff > 2) {
element.setText(Messages.UpdateConfigFileHandler_Downgrade + file.getName() + versionText);
}
} else if (sel.size() > 1) {
element.setText(Messages.UpdateConfigFileHandler_UpdateSelectedFiles);
}
}
}
}