com.magicparser.gui.composite.PartComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.magicparser.gui.composite.PartComposite.java

Source

/*
 * This file is part of l2jserver2 <l2jserver2.com>.
 *
 * l2jserver2 is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * l2jserver2 is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with l2jserver2.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.magicparser.gui.composite;

import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.wb.swt.SWTResourceManager;

import com.magicparser.gui.viewers.PartTreeContentProvider;
import com.magicparser.net.packet.Part;
import com.magicparser.net.packet.ProtocolPacket;
import com.magicparser.net.packet.parts.ForPart;
import com.magicparser.util.ByteUtils;
import com.magicparser.util.SWTUtils;

/**
 * @author <a href="http://www.rogiel.com">Rogiel</a>
 * 
 */
public class PartComposite extends Composite {
    /**
     * The SWT styled text for hex packet dump
     */
    private final StyledText hexPacketData;
    /**
     * The SWT styled text for plain packet dump
     */
    private final StyledText plainPacketData;
    /**
     * The SWT tree viewer that displays the parsed packet
     */
    private final TreeViewer treeViewer;
    /**
     * The scrolled packet composite
     */
    private final ScrolledComposite scrolledComposite;
    /**
     * The predefined hex opcode style range
     */
    private final StyleRange hexOpcodeStyleRange;

    /**
     * @param parent
     *            the parent composite
     */
    public PartComposite(final Composite parent) {
        super(parent, SWT.NONE);
        setLayout(new FillLayout(SWT.HORIZONTAL));

        SashForm sashForm = new SashForm(this, SWT.VERTICAL);

        scrolledComposite = new ScrolledComposite(sashForm, SWT.BORDER | SWT.V_SCROLL);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);
        scrolledComposite.addMouseMoveListener(new MouseMoveListener() {
            @Override
            public void mouseMove(MouseEvent e) {
                scrolledComposite.forceFocus();
            }
        });

        Composite composite = new Composite(scrolledComposite, SWT.NONE);
        GridLayout gl_composite = new GridLayout(2, false);
        gl_composite.verticalSpacing = 0;
        gl_composite.marginWidth = 0;
        gl_composite.marginHeight = 0;
        gl_composite.horizontalSpacing = 0;
        composite.setLayout(gl_composite);
        scrolledComposite.setContent(composite);
        scrolledComposite.pack();

        hexPacketData = new StyledText(composite, SWT.READ_ONLY);
        GridData gd_hexPacketData = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1);
        gd_hexPacketData.widthHint = 340;
        gd_hexPacketData.minimumWidth = 340;
        hexPacketData.setSize(320, 234);
        hexPacketData.setLayoutData(gd_hexPacketData);
        hexPacketData.setEnabled(false);
        hexPacketData.setFont(SWTResourceManager.getFont("Courier New", 9, SWT.NORMAL));

        plainPacketData = new StyledText(composite, SWT.READ_ONLY);
        GridData gd_plainPacketData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gd_plainPacketData.widthHint = 140;
        gd_hexPacketData.minimumWidth = 140;
        plainPacketData.setLayoutData(gd_plainPacketData);
        plainPacketData.setEnabled(false);
        plainPacketData.setFont(SWTResourceManager.getFont("Courier New", 9, SWT.NORMAL));

        Composite treeComposite = new Composite(sashForm, SWT.BORDER);
        GridLayout compositeLayout = new GridLayout(1, false);
        compositeLayout.verticalSpacing = 0;
        compositeLayout.marginWidth = 0;
        compositeLayout.marginHeight = 0;
        compositeLayout.horizontalSpacing = 0;
        treeComposite.setLayout(compositeLayout);

        treeViewer = new TreeViewer(treeComposite, SWT.NONE);
        treeViewer.setAutoExpandLevel(10);
        treeViewer.setUseHashlookup(true);
        Tree tree = treeViewer.getTree();
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        treeViewer.setContentProvider(new PartTreeContentProvider());
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            private final StyleRange styleRange = new StyleRange();
            private final StyleRange styleRange2 = new StyleRange();
            private Part<?, ?> lastPart;

            @Override
            public void selectionChanged(SelectionChangedEvent e) {
                final Object object = ((StructuredSelection) e.getSelection()).getFirstElement();
                if (object instanceof Part) {
                    final Part<?, ?> part = (Part<?, ?>) object;
                    if (styleRange.background != null)
                        styleRange.background.dispose();
                    styleRange.background = null;
                    hexPacketData.setStyleRange(styleRange);
                    if (styleRange2.background != null)
                        styleRange2.background.dispose();
                    styleRange2.background = null;
                    plainPacketData.setStyleRange(styleRange2);

                    if (lastPart != null)
                        colorizePart(lastPart);
                    lastPart = part;
                    styleRange.start = part.getOffset() * 3;
                    styleRange.length = part.getLength() * 3 - 1;
                    styleRange.background = PartComposite.this.getDisplay().getSystemColor(SWT.COLOR_RED);
                    hexPacketData.setStyleRange(styleRange);

                    styleRange2.start = part.getOffset();
                    styleRange2.length = part.getLength();
                    styleRange2.background = PartComposite.this.getDisplay().getSystemColor(SWT.COLOR_RED);
                    plainPacketData.setStyleRange(styleRange2);

                    hexPacketData.setSelection(part.getOffset() * 3);
                    hexPacketData.showSelection();

                    plainPacketData.setSelection(part.getOffset());
                    plainPacketData.showSelection();
                }
            }
        });

        TreeViewerColumn treeViewerColumn_1 = new TreeViewerColumn(treeViewer, SWT.NONE);
        // treeViewerColumn_1.setEditingSupport(new PartNameEditingSupport(
        // treeViewer));
        TreeColumn trclmnName = treeViewerColumn_1.getColumn();
        trclmnName.setWidth(170);
        trclmnName.setText("Name");
        treeViewerColumn_1.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element.getClass().isArray())
                    return null;
                final Part<?, ?> part = (Part<?, ?>) element;
                return part.getName();
            }

            @Override
            public Image getImage(Object element) {
                if (element.getClass().isArray())
                    return null;
                final Part<?, ?> part = (Part<?, ?>) element;
                return SWTUtils.loadImage(getDisplay(), "/icons/" + part.getIcon() + ".png");
            }
        });

        TreeViewerColumn treeViewerColumn_2 = new TreeViewerColumn(treeViewer, SWT.NONE);
        TreeColumn trclmnValue = treeViewerColumn_2.getColumn();
        trclmnValue.setWidth(138);
        trclmnValue.setText("Value");
        treeViewerColumn_2.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element.getClass().isArray())
                    return null;
                final Part<?, ?> part = (Part<?, ?>) element;
                return part.getValueAsString();
            }
        });

        // TreeViewerColumn treeViewerColumn_3 = new
        // TreeViewerColumn(treeViewer,
        // SWT.NONE);
        // TreeColumn trclmnReadValue = treeViewerColumn_3.getColumn();
        // trclmnReadValue.setWidth(138);
        // trclmnReadValue.setText("Value");
        // treeViewerColumn_3.setLabelProvider(new CellLabelProvider() {
        // @Override
        // public void update(ViewerCell cell) {
        // final TreeItem item = (TreeItem) cell.getItem();
        //
        // final TreeEditor editor = new TreeEditor(item.getParent());
        // final Button button = new Button(item.getParent(), SWT.NONE);
        // // button.setText("Remove part");
        // button.setImage(SWTUtils.loadImage(item, "/icons/plus.png"));
        // editor.setEditor(button, item, cell.getColumnIndex());
        // button.pack();
        //
        // item.addDisposeListener(new DisposeListener() {
        // @Override
        // public void widgetDisposed(DisposeEvent e) {
        // editor.dispose();
        // }
        // });
        // item.getParent().add
        //
        // editor.grabHorizontal = true;
        // editor.minimumWidth = button.getSize().x;
        // editor.minimumHeight = button.getSize().y;
        // editor.horizontalAlignment = SWT.LEFT;
        // }
        // });

        sashForm.setWeights(new int[] { 1, 1 });

        hexOpcodeStyleRange = new StyleRange();
        hexOpcodeStyleRange.background = hexPacketData.getDisplay().getSystemColor(SWT.COLOR_YELLOW);
        hexOpcodeStyleRange.start = 0;
        hexOpcodeStyleRange.length = 2;
        hexOpcodeStyleRange.fontStyle = SWT.BOLD;
    }

    /**
     * Sets the currently selected packet
     * 
     * @param packet
     *            the packet
     */
    public void setPacket(ProtocolPacket packet) {
        hexPacketData.setText(ByteUtils.hexDump(packet.getContent()));
        hexPacketData.setStyleRange(hexOpcodeStyleRange);

        plainPacketData.setText(ByteUtils.printData(packet.getContent(), packet.getContent().remaining()));
        colorizeDump(packet);

        treeViewer.setInput(packet);
        scrolledComposite.setMinSize(scrolledComposite.getContent().computeSize(SWT.DEFAULT, SWT.DEFAULT));
    }

    /**
     * Colorizes the whole packet hex dump
     * 
     * @param packet
     *            the packet
     */
    public void colorizeDump(ProtocolPacket packet) {
        for (final Part<?, ?> part : packet.getParts()) {
            colorizePart(part);
        }
    }

    /**
     * Colorizes the packet part
     * 
     * @param part
     *            the part
     */
    public void colorizePart(Part<?, ?> part) {
        if (part instanceof ForPart) {
            for (Part<?, ?>[] parts : ((ForPart) part).getValue()) {
                for (Part<?, ?> forPart : parts) {
                    colorizePart(forPart);
                }
            }
        } else {
            if (part.getColor() == null)
                return;
            StyleRange styleRange = new StyleRange();
            styleRange.start = part.getOffset() * 3;
            styleRange.length = part.getLength() * 3 - 1;
            styleRange.background = new Color(hexPacketData.getDisplay(), part.getColor());
            hexPacketData.setStyleRange(styleRange);
        }
    }

    @Override
    protected void checkSubclass() {
        // Disable the check that prevents subclassing of SWT components
    }
}