imakerplugin/com.nokia.s60tools.imaker/src/com/nokia/s60tools/imaker/internal/viewers/DebugTab.java
/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.s60tools.imaker.internal.viewers;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;
import com.nokia.s60tools.imaker.IMakerKeyConstants;
import com.nokia.s60tools.imaker.IMakerPlugin;
import com.nokia.s60tools.imaker.ImageFlasherHelpContextIDs;
import com.nokia.s60tools.imaker.Messages;
import com.nokia.s60tools.imaker.UIConfiguration;
import com.nokia.s60tools.imaker.UITarget;
import com.nokia.s60tools.imaker.internal.managers.ProjectManager;
import com.nokia.s60tools.imaker.internal.model.FileToImage;
import com.nokia.s60tools.imaker.internal.model.ImakerProperties;
import com.nokia.s60tools.imaker.internal.model.iContent.IContentFactory;
import com.nokia.s60tools.imaker.internal.model.iContent.IMAGESECTION;
import com.nokia.s60tools.imaker.internal.model.iContent.IbyEntry;
import com.nokia.s60tools.imaker.internal.model.iContent.ImageContent;
import com.nokia.s60tools.imaker.internal.providers.CheckBoxEditingSupport;
import com.nokia.s60tools.imaker.internal.providers.ComboEditingSupport;
import com.nokia.s60tools.imaker.internal.providers.TextEditingSupport;
public class DebugTab extends CTabItem implements IPropertyViewer {
public static final String CHECKED_IMAGE = "checked";
public static final String UNCHECKED_IMAGE = "unchecked";
public static final String WARNING_IMAGE = "warning";
public static final String ERROR_IMAGE = "error";
public static final String REL_PATTERN = ".*epoc32.release.+?(urel).*";
public static final String DEBUG_PATTERN = ".*epoc32.release.+?(udeb).*";
// For the checkbox images
private static ImageRegistry imageRegistry = IMakerPlugin.getDefault().getImageRegistry();
private IMakerTabsViewer tabsViewer;
private ProjectManager projectManager;
private TableViewer tableViewer;
private PreferencesTab mainTab;
private IContentFactory factory;
static {
String iconPath = "icons/";
imageRegistry.put(CHECKED_IMAGE, IMakerPlugin.getImageDescriptor(
iconPath + CHECKED_IMAGE + ".gif"
)
);
imageRegistry.put(UNCHECKED_IMAGE, IMakerPlugin.getImageDescriptor(
iconPath + UNCHECKED_IMAGE + ".gif"
)
);
imageRegistry.put(WARNING_IMAGE, IMakerPlugin.getImageDescriptor(
iconPath + WARNING_IMAGE + ".gif"
)
);
imageRegistry.put(ERROR_IMAGE, IMakerPlugin.getImageDescriptor(
iconPath + ERROR_IMAGE + ".gif"
)
);
}
public DebugTab(CTabFolder parent, int style, IMakerTabsViewer viewer, PreferencesTab main) {
super(parent, style);
this.tabsViewer = viewer;
this.projectManager = tabsViewer.getProjectManager();
setControl(createControl(parent));
this.mainTab = main;
this.factory = IContentFactory.eINSTANCE;
}
private void duplicateSelection() {
ISelection selection = tableViewer.getSelection();
if(selection!=null) {
IStructuredSelection ss = (IStructuredSelection) selection;
IbyEntry item = (IbyEntry) ss.getFirstElement();
IbyEntry copy = factory.createIbyEntry();
copy.setAction(item.getAction());
copy.setEnabled(item.isEnabled());
copy.setFile(item.getFile());
copy.setTarget(item.getTarget());
copy.setLocation(item.getLocation());
ImageContent ic = getInput();
int index = ic.getEntries().indexOf(item);
ic.getEntries().add(index+1, copy);
tableViewer.refresh();
}
}
private void deleteSelection() {
ISelection selection = tableViewer.getSelection();
if(selection!=null) {
IStructuredSelection ss = (IStructuredSelection) selection;
Object[] objects = ss.toArray();
for (int i = 0; i < objects.length; i++) {
IbyEntry fe = (IbyEntry) objects[i];
ImageContent ic = getInput();
ic.getEntries().remove(fe);
}
tableViewer.refresh();
}
}
private Control createControl(CTabFolder parent) {
Composite top = new Composite(parent,SWT.NONE);
top.setLayout(new GridLayout(2,false));
top.setLayoutData(new GridData(GridData.FILL_BOTH));
setHelpForControl(top, ImageFlasherHelpContextIDs.IMAKERDIALOG_CONTENTTAB);
// create table
Composite tableComp = getNewComposite(top);
Table table = new Table(tableComp,SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
GridData gridData = new GridData(GridData.FILL,GridData.FILL,true,true);
gridData.heightHint = 180;
table.setLayoutData(gridData);
table.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
if ((e.character == ' ')) {
StructuredSelection ss = (StructuredSelection) tableViewer.getSelection();
Iterator it = ss.iterator();
while (it.hasNext()) {
IbyEntry entry = (IbyEntry)it.next();
entry.setEnabled(!entry.isEnabled());
tableViewer.refresh(entry);
}
}
}
public void keyPressed(KeyEvent e) {}
});
// create controls
Composite controls = getNewComposite(top);
Button button = new Button(controls,SWT.PUSH|SWT.LEFT);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setText(Messages.getString("DebugTab.2"));
button.setToolTipText(Messages.getString("DebugTab.3"));
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
IbyEntry entry = factory.createIbyEntry();
ImageContent input = getInput();
FileToImage file = new FileToImage();
AddEditFileToTransferDialog dialog= new AddEditFileToTransferDialog(getControl().getShell(), file);
dialog.setTitle(Messages.getString("FileTransferTab.8"));
if (dialog.open() != Window.OK) {
return;
}
entry.setEnabled(file.getEnabled());
entry.setFile(file.getHostPath().substring(2));
entry.setTarget(file.getTargetPath());
input.getEntries().add(entry);
tableViewer.refresh();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
button = new Button(controls,SWT.PUSH|SWT.LEFT);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setText(Messages.getString("DebugTab.4"));
button.setToolTipText(Messages.getString("DebugTab.5"));
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
deleteSelection();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
button = new Button(controls,SWT.PUSH|SWT.LEFT);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setText(Messages.getString("DebugTab.24"));
button.setToolTipText(Messages.getString("DebugTab.25"));
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
duplicateSelection();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
button = new Button(controls,SWT.PUSH|SWT.LEFT);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setText(Messages.getString("DebugTab.6"));
button.setToolTipText(Messages.getString("DebugTab.7"));
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ImageContent input = getInput();
if(input!=null) {
if (!input.getEntries().isEmpty()) {
boolean confirm = MessageDialog
.openQuestion(
getControl().getShell(),
"Remove Entries",
"Clear the list before adding new entries, if any?");
if (confirm) {
input.getEntries().clear();
}
}
projectManager.populate(input);
tableViewer.refresh();
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
Composite enableButtons = new Composite(top,SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
enableButtons.setLayout(layout);
enableButtons.setLayoutData(new GridData());
button = new Button(enableButtons,SWT.PUSH|SWT.LEFT);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setText(Messages.getString("DebugTab.8"));
button.setToolTipText(Messages.getString("DebugTab.9"));
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ImageContent ic = getInput();
if(ic!=null) {
for (IbyEntry entry: ic.getEntries()) {
entry.setEnabled(true);
}
tableViewer.refresh();
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
button = new Button(enableButtons,SWT.PUSH|SWT.LEFT);
button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button.setText(Messages.getString("DebugTab.10"));
button.setToolTipText(Messages.getString("DebugTab.11"));
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ImageContent ic = getInput();
if(ic!=null) {
for (IbyEntry entry: ic.getEntries()) {
entry.setEnabled(false);
}
tableViewer.refresh();
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
tableViewer = new TableViewer(table);
tableViewer.getTable().setHeaderVisible(true);
tableViewer.getTable().setLinesVisible(true);
tableViewer.setContentProvider(new DebugContentProvider());
createColumns(tableViewer);
tableViewer.getTable().addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
if(e.character == SWT.DEL) {
deleteSelection();
}
}
public void keyPressed(KeyEvent e) {
}
});
tableViewer.setInput(getDefaultInput());
return top;
}
private void setHelpForControl(Control container, String id) {
PlatformUI.getWorkbench().getHelpSystem().setHelp(container, id);
}
private Object getDefaultInput() {
IContentFactory factory = IContentFactory.eINSTANCE;
ImageContent ic = factory.createImageContent();
return ic;
}
private Composite getNewComposite(Composite top) {
Composite comp = new Composite(top,SWT.NONE);
GridLayout layout = new GridLayout(1, true);
layout.marginWidth = 0;
layout.marginHeight = 0;
comp.setLayout(layout);
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.grabExcessHorizontalSpace = true;
comp.setLayoutData(layoutData);
return comp;
}
private void createColumns(TableViewer viewer) {
int columnSizes[] = {20,50,130,130,60,60};
TableViewerColumn column = new TableViewerColumn(viewer,SWT.NONE);
column.getColumn().setText(Messages.getString("DebugTab.12"));
column.getColumn().setToolTipText(Messages.getString("DebugTab.13"));
column.getColumn().setWidth(columnSizes[0]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
if(isWarning(element)) {
return imageRegistry.get(WARNING_IMAGE);
} else if(isError(element)) {
return imageRegistry.get(ERROR_IMAGE);
} else {
return null;
}
}
private IbyEntry getEntry(Object element) {
return (IbyEntry) element;
}
private boolean isWarning(Object element) {
IbyEntry entry = getEntry(element);
String location = " "+entry.getLocation().toString().toUpperCase()+" ";
String targets[] = mainTab.getSelectedTargets();
UIConfiguration pr = mainTab.getSelectedProduct();
for (int i = 0; i < targets.length; i++) {
String t = targets[i];
UITarget target = pr.getTarget(t);
if(target!=null&&target.getSteps()!=null) {
int index = target.getSteps().indexOf(location);
if(index!=-1) {
return false;
}
}
}
if(entry.getLocation()!=IMAGESECTION.ANY) {
mainTab.addTarget(entry.getLocation().getName());
}
return false;
}
private boolean isError(Object element) {
IbyEntry entry = getEntry(element);
String path = projectManager.getRoot()+entry.getFile();
File f = new File(path);
if(!f.exists()) {
String message = Messages.getString("DebugTab.1");
entry.setStatusMessage(message.replace("xxx", f.getAbsolutePath()));
return true;
}
return false;
}
@Override
public String getText(Object element) {
if(isWarning(element) || isError(element)) {
return getEntry(element).getStatusMessage();
}
return "";
}
});
// column.setEditingSupport(new CheckBoxEditingSupport(viewer, 0));
column = new TableViewerColumn(viewer,SWT.CENTER);
column.getColumn().setText(Messages.getString("DebugTab.14"));
column.getColumn().setToolTipText(Messages.getString("DebugTab.15"));
column.getColumn().setWidth(columnSizes[1]);
column.setLabelProvider( new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
IbyEntry ie = (IbyEntry) element;
String key = ie.isEnabled() ? CHECKED_IMAGE : UNCHECKED_IMAGE;
return imageRegistry.get(key);
}
@Override
public String getText(Object element) {
return "";
}
});
column.setEditingSupport(new CheckBoxEditingSupport(viewer, 1));
column = new TableViewerColumn(viewer,SWT.NONE);
column.getColumn().setText(Messages.getString("DebugTab.16"));
column.getColumn().setToolTipText(Messages.getString("DebugTab.17"));
column.getColumn().setWidth(columnSizes[2]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IbyEntry e = (IbyEntry) element;
return e.getFile();
}
});
column.setEditingSupport(new TextEditingSupport(viewer,2));
column = new TableViewerColumn(viewer,SWT.NONE);
column.getColumn().setText(Messages.getString("DebugTab.18"));
column.getColumn().setToolTipText(Messages.getString("DebugTab.19"));
column.getColumn().setWidth(columnSizes[3]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IbyEntry e = (IbyEntry) element;
return e.getTarget();
}
});
column.setEditingSupport(new TextEditingSupport(viewer,3));
column = new TableViewerColumn(viewer,SWT.NONE);
column.getColumn().setText(Messages.getString("DebugTab.20"));
column.getColumn().setToolTipText(Messages.getString("DebugTab.21"));
column.getColumn().setWidth(columnSizes[4]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IbyEntry e = (IbyEntry) element;
return e.getLocation().getLiteral();
}
});
column.setEditingSupport(new ComboEditingSupport(viewer,4));
column = new TableViewerColumn(viewer,SWT.LEFT);
column.getColumn().setText(Messages.getString("DebugTab.22"));
column.getColumn().setToolTipText(Messages.getString("DebugTab.23"));
column.getColumn().setWidth(columnSizes[5]);
column.setLabelProvider( new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IbyEntry e = (IbyEntry) element;
return e.getAction().getLiteral();
}
});
column.setEditingSupport(new ComboEditingSupport(viewer,5));
}
private class DebugContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
ImageContent ic = (ImageContent) inputElement;
return ic.getEntries().toArray();
}
public void dispose() {}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
}
/* (non-Javadoc)
* @see com.nokia.s60tools.imaker.internal.viewers.IPropertyViewer#addToProperties(com.nokia.s60tools.imaker.internal.model.ImakerProperties)
*/
public void addToProperties(ImakerProperties prop) {
ImageContent input = getInput();
List<IbyEntry> ls = new ArrayList<IbyEntry>();
ls.addAll(input.getEntries());
prop.put(IMakerKeyConstants.DEBUGFILES, ls);
}
/* (non-Javadoc)
* @see com.nokia.s60tools.imaker.internal.viewers.IPropertyViewer#restoreFromProperties(com.nokia.s60tools.imaker.internal.model.ImakerProperties)
*/
public void restoreFromProperties(ImakerProperties prop) {
ImageContent input = getInput();
EList<IbyEntry> entries = input.getEntries();
entries.clear();
Object ents = prop.get(IMakerKeyConstants.DEBUGFILES);
if(ents!=null) {
List<IbyEntry> ls = (List<IbyEntry>) ents;
entries.addAll(ls);
}
tableViewer.refresh();
}
private ImageContent getInput() {
return (ImageContent) tableViewer.getInput();
}
public void refesh() {
tableViewer.refresh();
}
// @Override
public void clear() {
getInput().getEntries().clear();
refesh();
}
}