ch.ntb.inf.deep.eclipse.ui.view.GPRView.java Source code

Java tutorial

Introduction

Here is the source code for ch.ntb.inf.deep.eclipse.ui.view.GPRView.java

Source

/*
 * Copyright 2011 - 2013 NTB University of Applied Sciences in Technology
 * Buchs, Switzerland, http://www.ntb.ch/inf
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 *   
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */

package ch.ntb.inf.deep.eclipse.ui.view;

import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import ch.ntb.inf.deep.eclipse.ui.model.RegModel;
import ch.ntb.inf.deep.eclipse.ui.model.Register;
import ch.ntb.inf.deep.launcher.Launcher;
import ch.ntb.inf.deep.target.TargetConnection;
import ch.ntb.inf.deep.target.TargetConnectionException;

/**
 * This sample class demonstrates how to plug-in a new
 * workbench view. The view shows data obtained from the
 * model. The sample creates a dummy model on the fly,
 * but a real implementation would connect to the model
 * available either in this or another plug-in (e.g. the workspace).
 * The view is connected to the model using a content provider.
 * <p>
 * The view uses a label provider to define how model
 * objects should be presented in the view. Each
 * view can present the same model objects using
 * different labels and icons, if needed. Alternatively,
 * a single label provider can be shared between views
 * in order to ensure that objects of the same type are
 * presented in the same way everywhere.
 * <p>
 */

public class GPRView extends ViewPart implements ISelectionListener {

    /**
     * The ID of the view as specified by the extension.
     */
    public static final String ID = "ch.ntb.inf.deep.ui.GPRView";

    private TableViewer viewer;
    private Action toHex;
    private Action toDez;
    private Action toBin;
    private Action refresh;
    private Action suspend;
    private Action resume;
    private ch.ntb.inf.deep.eclipse.ui.model.RegModel model;
    private final String helpContextId = "ch.ntb.inf.deep.ui.register.viewer";

    /*
     * The content provider class is responsible for providing objects to the
     * view. It can wrap existing objects in adapters or simply return objects
     * as-is. These objects may be sensitive to the current input of the view,
     * or ignore it and always show the same content (like Task List, for
     * example).
     */

    class ViewContentProvider implements IStructuredContentProvider {

        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            Register dummy = new Register();
            Register[] regs = null;
            if (model != null) {
                regs = model.getMod(0);
            }
            if (model == null || model.getMod(0) == null) {
                regs = new Register[32];
                for (int i = 0; i < 32; i++) {
                    regs[i] = new Register("GPR" + i, 0, 0);
                }
            }
            if (regs.length < 32) {
                return regs;
            }
            //Group in blocks of 4 elements
            int regCount = 0;
            Register[] gpr = new Register[39];
            for (int i = 0; i < gpr.length; i++) {
                if (i == 4 || i == 9 || i == 14 || i == 19 || i == 24 || i == 29 || i == 34) {
                    gpr[i] = dummy;
                } else {
                    gpr[i] = regs[regCount];
                    regCount++;
                }
            }
            return gpr;
        }

    }

    class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {

        public String getColumnText(Object obj, int index) {
            switch (index) {
            case 0:
                if (((Register) obj).name == null) {
                    return "";
                }
                return ((Register) obj).name;
            case 1:
                if (((Register) obj).name == null) {
                    return "";
                }
                if (((Register) obj).representation == 0) {//BIN
                    String value = Integer.toBinaryString(((Register) obj).value);
                    String temp = "";

                    // complete to 32 Bit
                    int length = 32 - value.length();
                    for (int y = 0; y < length; y++) {
                        temp = temp + "0";
                    }
                    value = temp + value;

                    // insert Spaces
                    int z = 4;
                    temp = value.substring(0, 4);
                    for (int x = 0; x < 7; x++) {
                        temp = temp + " " + value.substring(z, z + 4);
                        z = z + 4;
                    }
                    return temp;
                }
                if (((Register) obj).representation == 1) {//HEX
                    return "0x" + Integer.toHexString(((Register) obj).value);
                }
                if (((Register) obj).representation == 2) {//DEZ
                    return Integer.toString(((Register) obj).value);
                }
            default:
                throw new RuntimeException("Should not happen");
            }
        }

        public Image getColumnImage(Object obj, int index) {
            return null;
        }
    }

    public void createPartControl(Composite parent) {
        //Create Viewer
        viewer = new TableViewer(parent, SWT.V_SCROLL | SWT.FULL_SELECTION);
        //Create Columns
        String[] titels = { "Register", "Value" };
        int[] bounds = { 60, 230 };
        for (int i = 0; i < titels.length; i++) {
            TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText(titels[i]);
            column.getColumn().setWidth(bounds[i]);
            column.getColumn().setResizable(true);
            column.getColumn().setMoveable(false);
        }
        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        //Set Providers after table init
        viewer.setLabelProvider(new ViewLabelProvider());
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setSorter(null);
        //set input after init Providers
        update();//needs to init model
        viewer.setInput(getViewSite());

        // Create the help context id for the viewer's control
        PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), helpContextId);
        createActions();
        hookContextMenu();
        contributeToActionBars();
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                GPRView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager menu) {
    }

    protected void fillContextMenu(IMenuManager menu) {
        menu.add(toHex);
        menu.add(toBin);
        menu.add(toDez);

        // Other plug-ins can contribute there actions here
        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(refresh);
        manager.add(suspend);
        manager.add(resume);
    }

    public RegModel getModel() {
        return model;
    }

    public Viewer getViewer() {
        return viewer;
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }

    protected void createActions() {
        toHex = new Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof Register) {
                    ((Register) obj).representation = 1;
                }
                viewer.refresh();
            }
        };
        toHex.setText("ToHex");
        toDez = new Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof Register) {
                    ((Register) obj).representation = 2;
                }
                viewer.refresh();
            }
        };
        toDez.setText("ToDez");
        toBin = new Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof Register) {
                    ((Register) obj).representation = 0;
                }
                viewer.refresh();
            }
        };
        toBin.setText("ToBin");
        refresh = new Action() {
            public void run() {
                update();
                viewer.refresh();
            }
        };
        refresh.setText("Refresh");
        ImageDescriptor img = ImageDescriptor
                .createFromImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_TOOL_REDO));
        refresh.setImageDescriptor(img);
        suspend = new Action() {
            public void run() {
                TargetConnection bdi = Launcher.getTargetConnection();
                if (bdi == null)
                    return;
                try {
                    if (!bdi.isConnected()) {//reopen
                        bdi.openConnection();
                    }
                    if (bdi.getTargetState() != TargetConnection.stateDebug) {
                        bdi.stopTarget();
                    }
                } catch (TargetConnectionException e) {
                    e.printStackTrace();
                }
                update();
                viewer.refresh();
            }
        };
        suspend.setText("Suspend");
        img = ImageDescriptor
                .createFromImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_STOP));
        suspend.setImageDescriptor(img);
        resume = new Action() {
            public void run() {
                TargetConnection bdi = Launcher.getTargetConnection();
                if (bdi == null)
                    return;
                try {
                    if (!bdi.isConnected()) {//reopen
                        bdi.openConnection();
                    }
                    if (bdi.getTargetState() == TargetConnection.stateDebug) {
                        bdi.startTarget();
                    }
                } catch (TargetConnectionException e) {
                    e.printStackTrace();
                }
            }
        };
        resume.setText("Resume");
        img = ImageDescriptor
                .createFromImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ADD));
        resume.setImageDescriptor(img);
    }

    public void dispose() {
        model.clearMod(0);
        getSite().getWorkbenchWindow().getSelectionService()
                .removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
        super.dispose();
    }

    @Override
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
    }

    private synchronized void update() {
        if (model == null) {
            model = RegModel.getInstance();
        } else {
            model.updateGPRModel();
        }
        if (model.getMod(0) != null) {
            viewer.setInput(model);
            viewer.getControl().setEnabled(true);
            viewer.refresh();
        }
    }
}