com.eclipsesource.tabris.demos.enron.EnronExample.java Source code

Java tutorial

Introduction

Here is the source code for com.eclipsesource.tabris.demos.enron.EnronExample.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2011 EclipseSource 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:
 * EclipseSource - initial API and implementation
 ******************************************************************************/
package com.eclipsesource.tabris.demos.enron;

import static com.eclipsesource.tabris.widgets.enhancement.Widgets.onToolItem;
import static com.eclipsesource.tabris.widgets.enhancement.Widgets.onTree;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Device;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

import com.eclipsesource.tabris.demos.enron.EnronDataset.Folder;
import com.eclipsesource.tabris.demos.enron.EnronDataset.Node;
import com.eclipsesource.tabris.device.ClientDevice;
import com.eclipsesource.tabris.device.ClientDevice.Platform;
import com.eclipsesource.tabris.widgets.enhancement.Widgets;

public class EnronExample {

    // Change this path to your Enron maildir
    private static final String DEFAULT_DATASET_DIR = "/var/lib/tomcat5.5/shared/data/enron_mail_20110402/maildir";
    private static final String DATASET_DIR_PROP = "org.eclipse.rap.demo.enronDatasetDirectory";
    private TreeViewer viewer;
    private Composite parent;

    public void createMainArea(Composite parent) {
        this.parent = parent;
        createTreeArea(parent);
    }

    private void createTreeArea(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = ExampleUtil.createGridLayout();
        composite.setLayout(layout);
        viewer = new TreeViewer(composite, SWT.SINGLE | SWT.VIRTUAL);
        viewer.setUseHashlookup(true);
        onTree(viewer.getTree()).setBackButtonNavigationEnabled(true);
        TreeColumn treeColumn = new TreeColumn(viewer.getTree(), SWT.NONE);
        treeColumn.setWidth(200);
        TreeColumn treeColumn2 = new TreeColumn(viewer.getTree(), SWT.NONE);
        treeColumn2.setWidth(200);
        Tree tree = viewer.getTree();
        tree.setLinesVisible(true);
        tree.setToolTipText("Enron Mailbox");
        viewer.getControl().setLayoutData(ExampleUtil.createFillData());
        viewer.setLabelProvider(new EnronLabelProvider(parent.getDisplay()));
        viewer.setContentProvider(new EnronLazyContentProvider(viewer));
        viewer.setInput(getDataSet());
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object firstElement = selection.getFirstElement();
                if (firstElement instanceof Node) {
                    nodeSelected((Node) firstElement);
                }
            }
        });
    }

    private void nodeSelected(Node selectedNode) {
        if (selectedNode != null) {
            if (selectedNode.getFile().isFile()) {
                try {
                    Mail mail = new Mail(selectedNode.readContents());
                    Shell mailShell = new Shell(parent.getDisplay(), SWT.NO_TRIM);
                    mailShell.setBackground(mailShell.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
                    mailShell.setMaximized(true);
                    mailShell.setLayout(new FillLayout());
                    Widgets.onShell(mailShell).useAnimation();
                    createContentArea(mailShell, mail);
                    mailShell.open();
                } catch (IOException exception) {
                    throw new RuntimeException("Failed to read contents from node", exception);
                }
            }
        }
    }

    private void createContentArea(Composite parent, Mail mail) {
        final Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = ExampleUtil.createGridLayout();
        composite.setLayout(layout);
        ClientDevice clientDevice = RWT.getClient().getService(ClientDevice.class);
        if (clientDevice.getPlatform() != Platform.ANDROID) {
            createCloseButtonToolbar(composite);
        }
        createMailHeaderArea(composite, mail);
        createMailContentArea(composite, mail);
    }

    private void createCloseButtonToolbar(final Composite parent) {
        final ToolBar toolBar = new ToolBar(parent, SWT.NONE);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).grab(true, false).applyTo(toolBar);
        ToolItem titleItem = new ToolItem(toolBar, SWT.NONE);
        onToolItem(titleItem).useAsTitle();
        ToolItem closeToolItem = new ToolItem(toolBar, SWT.PUSH);
        closeToolItem.setText("Close");
        closeToolItem.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                parent.getShell().close();
            }
        });
    }

    private void createMailHeaderArea(Composite parent, Mail mail) {
        Composite header = new Composite(parent, SWT.NONE);
        header.setLayoutData(ExampleUtil.createHorzFillData());
        GridLayout headerLayout = new GridLayout(2, false);
        headerLayout.horizontalSpacing = 5;
        headerLayout.verticalSpacing = 5;
        header.setLayout(headerLayout);
        Color foreground = parent.getDisplay().getSystemColor(SWT.COLOR_WHITE);
        Label senderLabel = new Label(header, SWT.NONE);
        senderLabel.setForeground(foreground);
        senderLabel.setText("From:");
        senderLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
        Label senderText = new Label(header, SWT.SINGLE | SWT.READ_ONLY);
        senderText.setText(mail.sender);
        senderText.setForeground(foreground);
        GridData senderTextData = ExampleUtil.createHorzFillData();
        senderTextData.horizontalIndent = 2;
        senderText.setLayoutData(senderTextData);
        Label subjectLabel = new Label(header, SWT.NONE);
        subjectLabel.setForeground(foreground);
        subjectLabel.setText("Subject:");
        subjectLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
        Label subjectText = new Label(header, SWT.SINGLE | SWT.READ_ONLY);
        subjectText.setText(mail.subject);
        subjectText.setForeground(foreground);
        subjectText.setLayoutData(senderTextData);
    }

    private void createMailContentArea(Composite parent, Mail mail) {
        Composite bodyComp = new Composite(parent, SWT.NONE);
        bodyComp.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
        bodyComp.setLayoutData(ExampleUtil.createFillData());
        GridLayout bodyLayout = new GridLayout(1, false);
        bodyComp.setLayout(bodyLayout);
        Text messageText = new Text(bodyComp, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY);
        GridData messageTextData = ExampleUtil.createFillData();
        messageText.setLayoutData(messageTextData);
        messageText.setText(mail.content);
    }

    private static Node getDataSet() {
        try {
            File root = getRootDirectory();
            return new EnronDataset(root).getRootNode();
        } catch (IOException exception) {
            throw new IllegalStateException("Could not access data model", exception);
        }
    }

    private static File getRootDirectory() {
        String path = getRootDirectoryPath();
        File root = new File(path);
        if (!root.isDirectory()) {
            throw new RuntimeException("Enron dataset directory missing: " + root);
        }
        return root;
    }

    private static String getRootDirectoryPath() {
        String path = System.getProperty(DATASET_DIR_PROP);
        if (path == null) {
            path = DEFAULT_DATASET_DIR;
        }
        return path;
    }

    private static class Mail {

        private String sender;
        private String subject;
        private final String content;

        public Mail(String text) {
            String[] lines = text.split("\n");
            StringBuilder buffer = new StringBuilder();
            boolean headerFinished = false;
            for (String line : lines) {
                if (headerFinished) {
                    buffer.append(line);
                    buffer.append("\n");
                } else if (line.startsWith("From:")) {
                    sender = line.substring("From:".length()).trim();
                } else if (line.startsWith("Subject:")) {
                    subject = line.substring("Subject:".length()).trim();
                } else if ("".equals(line.trim())) {
                    headerFinished = true;
                }
            }
            content = buffer.toString();
        }
    }

    private static final class EnronLabelProvider extends CellLabelProvider {

        private static final String ICON_FILE = "/envelope.png";
        private static final String ICON_FOLDER = "/inbox.png";
        private static final int COLUMN_TITLE = 0;
        private static final int COLUMN_SUB_TITLE = 1;
        private final Image fileImage;
        private final Image folderImage;
        private final Device device;

        EnronLabelProvider(final Device device) {
            this.device = device;
            fileImage = createImage(device, ICON_FILE);
            folderImage = createImage(device, ICON_FOLDER);
        }

        @Override
        public void update(final ViewerCell cell) {
            Object element = cell.getElement();
            if (element instanceof Node) {
                Node node = (Node) element;
                int columnIndex = cell.getColumnIndex();
                switch (columnIndex) {
                case COLUMN_TITLE:
                    updateTitle(cell, node);
                    break;
                case COLUMN_SUB_TITLE:
                    cell.setForeground(device.getSystemColor(SWT.COLOR_DARK_GRAY));
                    updateSubTitle(cell, node);
                    break;
                }
            }
        }

        @Override
        public String getToolTipText(final Object element) {
            String result = "";
            if (element instanceof File) {
                File file = (File) element;
                result = file.getName();
            }
            return result;
        }

        private void updateTitle(ViewerCell cell, Node node) {
            if (node instanceof Folder) {
                cell.setText(node.getTitle());
                cell.setImage(folderImage);
            } else {
                cell.setText(node.getFrom());
                cell.setImage(fileImage);
            }
        }

        private void updateSubTitle(ViewerCell cell, Node node) {
            if (!(node instanceof Folder)) {
                cell.setText(node.getTitle());
            }
        }

        private static Image createImage(Device device, String name) {
            ClassLoader classLoader = EnronLabelProvider.class.getClassLoader();
            InputStream inputStream = classLoader.getResourceAsStream(name);
            Image result = null;
            if (inputStream != null) {
                result = new Image(device, inputStream);
            }
            return result;
        }
    }

    private static class EnronLazyContentProvider implements ILazyTreeContentProvider {

        private final TreeViewer viewer;

        public EnronLazyContentProvider(TreeViewer viewer) {
            this.viewer = viewer;
        }

        @Override
        public Object getParent(Object element) {
            Object result = null;
            if (element instanceof Node) {
                result = ((Node) element).getParent();
            }
            return result;
        }

        @Override
        public void updateElement(Object parent, int index) {
            if (parent instanceof Folder) {
                Folder folder = (Folder) parent;
                Node node = folder.getChild(index);
                if (node != null) {
                    viewer.replace(parent, index, node);
                    viewer.setChildCount(node, node.getChildCount());
                }
            }
        }

        @Override
        public void updateChildCount(Object element, int currentChildCount) {
            if (element instanceof Node) {
                Node node = (Node) element;
                int childCount = node.getChildCount();
                if (childCount != currentChildCount) {
                    viewer.setChildCount(element, childCount);
                }
            }
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // nothing
        }

        @Override
        public void dispose() {
            // nothing
        }
    }
}