com.application.areca.launcher.gui.composites.TreeComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.application.areca.launcher.gui.composites.TreeComposite.java

Source

package com.application.areca.launcher.gui.composites;

import java.util.Iterator;

import javax.swing.event.TreeSelectionEvent;

import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

import com.application.areca.AbstractRecoveryTarget;
import com.application.areca.Identifiable;
import com.application.areca.TargetGroup;
import com.application.areca.launcher.gui.Application;
import com.application.areca.launcher.gui.common.ArecaImages;

/**
 * <BR>
 * @author Olivier PETRUCCI
 * <BR>
 *
 */

/*
Copyright 2005-2009, Olivier PETRUCCI.
    
This file is part of Areca.
    
Areca 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 2 of the License, or
(at your option) any later version.
    
Areca 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 Areca; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
public class TreeComposite extends Composite implements MouseListener, Listener {

    protected Tree tree;
    protected Application application = Application.getInstance();

    public TreeComposite(Composite parent) {
        super(parent, SWT.NONE);
        setLayout(new FillLayout());

        TreeViewer viewer = new TreeViewer(this, SWT.BORDER);
        tree = viewer.getTree();
        tree.addMouseListener(this);
        tree.addListener(SWT.Selection, this);

        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                if (application.isCurrentObjectTarget()) {
                    application.showEditTarget(application.getCurrentTarget());
                } else if (application.isCurrentObjectProcess()) {
                    application.showEditGroup(application.getCurrentTargetGroup());
                }
            }
        });

        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
        final int operation = DND.DROP_MOVE;

        final DragSource source = new DragSource(tree, operation);
        source.setTransfer(types);
        source.addDragListener(new DragSourceAdapter() {
            public void dragStart(DragSourceEvent event) {
                TreeItem[] selection = tree.getSelection();
                if (selection.length > 0 && selection[0].getData() instanceof AbstractRecoveryTarget) {
                    event.doit = true;
                } else {
                    event.doit = false;
                }
            };

            public void dragSetData(DragSourceEvent event) {
                event.data = "dummy data";
            }
        });

        DropTarget target = new DropTarget(tree, operation);
        target.setTransfer(types);
        target.addDropListener(new DropTargetAdapter() {
            public void dragEnter(DropTargetEvent event) {
                event.detail = DND.DROP_NONE;
                event.feedback = DND.FEEDBACK_NONE;
            }

            public void dragOver(DropTargetEvent event) {
                event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
                if (event.item != null && isValidTreeItem((TreeItem) event.item)) {
                    event.feedback |= DND.FEEDBACK_SELECT;
                    event.detail = operation;
                } else {
                    event.feedback |= DND.FEEDBACK_NONE;
                    event.detail = DND.DROP_NONE;
                }
            }

            public void drop(DropTargetEvent event) {
                if (event.item != null) {
                    TreeItem item = (TreeItem) event.item;
                    AbstractRecoveryTarget draggedTarget = Application.getInstance().getCurrentTarget();
                    TargetGroup sourceProcess = draggedTarget.getGroup();
                    TargetGroup destinationProcess = extractRecoveryProcess(item);

                    if (!destinationProcess.equals(sourceProcess)) {
                        sourceProcess.removeTarget(draggedTarget);

                        if (destinationProcess.getTargetById(draggedTarget.getId()) != null) {
                            // A target with same ID already exists
                            draggedTarget.setId(destinationProcess.getNextFreeTargetId());
                        }

                        destinationProcess.addTarget(draggedTarget);
                        draggedTarget.setGroup(destinationProcess);
                    }

                    application.saveProcess(sourceProcess);
                    application.saveProcess(destinationProcess);
                    refresh();
                }
            }
        });

        refresh();
    }

    private TargetGroup extractRecoveryProcess(TreeItem item) {
        if (item == null) {
            return null;
        } else {
            Object data = item.getData();
            if (data instanceof TargetGroup) {
                return (TargetGroup) data;
            } else {
                AbstractRecoveryTarget tg = (AbstractRecoveryTarget) data;
                return tg.getGroup();
            }
        }
    }

    private boolean isValidTreeItem(TreeItem item) {
        TargetGroup process = extractRecoveryProcess(item);
        return process != null
                && !(process.getUid().equals(Application.getInstance().getCurrentTargetGroup().getUid()));
    }

    public void refresh() {
        tree.removeAll();
        String currentObjectId = Application.getInstance().getCurrentObject() != null
                ? Application.getInstance().getCurrentObject().getUid()
                : null;

        if (Application.getInstance().getWorkspace() != null) {
            Iterator iter = Application.getInstance().getWorkspace().getSortedGroupIterator();
            while (iter.hasNext()) {
                TreeItem processNode = new TreeItem(tree, SWT.NONE);
                TargetGroup process = (TargetGroup) iter.next();
                fillProcessData(processNode, process, currentObjectId);
                processNode.setExpanded(true);
            }
        }
    }

    private void fillProcessData(TreeItem processNode, TargetGroup process, String currentObjectId) {
        processNode.setText(" " + process.getName());
        processNode.setImage(ArecaImages.ICO_REF_PROCESS);
        processNode.setData(process);

        Iterator iter = process.getSortedTargetIterator();
        while (iter.hasNext()) {
            TreeItem targetNode = new TreeItem(processNode, SWT.NONE);
            AbstractRecoveryTarget target = (AbstractRecoveryTarget) iter.next();

            targetNode.setText(" " + target.getTargetName());
            targetNode.setImage(ArecaImages.ICO_REF_TARGET);
            targetNode.setData(target);

            if (target.getUid().equals(currentObjectId)) {
                tree.setSelection(targetNode);
            }
        }

        if (process.getUid().equals(currentObjectId)) {
            tree.setSelection(processNode);
        }
    }

    public void setSelectedTarget(AbstractRecoveryTarget target) {
        if (target != null) {
            TreeItem processNode = null;
            TargetGroup process = target.getGroup();
            TreeItem[] processes = tree.getItems();
            for (int i = 0; i < processes.length; i++) {
                TreeItem child = processes[i];
                TargetGroup cProcess = (TargetGroup) child.getData();
                if (cProcess.getSource().equals(process.getSource())) {
                    processNode = child;
                    break;
                }
            }

            TreeItem[] targets = processNode.getItems();
            for (int i = 0; i < targets.length; i++) {
                TreeItem child = targets[i];
                AbstractRecoveryTarget cTarget = (AbstractRecoveryTarget) child.getData();
                if (cTarget.equals(target)) {
                    tree.setSelection(child);
                    break;
                }
            }
        }
    }

    public void mouseDoubleClick(MouseEvent e) {
    }

    public void mouseDown(MouseEvent e) {
        TreeItem item = tree.getItem(new Point(e.x, e.y));

        if (item != null) {
            if (item.getData() instanceof AbstractRecoveryTarget) {
                showMenu(e, Application.getInstance().getTargetContextMenu());
            } else if (item.getData() instanceof TargetGroup) {
                showMenu(e, Application.getInstance().getProcessContextMenu());
            } else {
                showMenu(e, Application.getInstance().getWorkspaceContextMenu());
            }
        }
    }

    private void showMenu(MouseEvent e, Menu m) {
        if (e.button == 3) {
            m.setVisible(true);
        }
    }

    public void mouseUp(MouseEvent e) {
    }

    public void valueChanged(TreeSelectionEvent e) {
        Application.getInstance().setCurrentObject((Identifiable) e.getSource(), false);
    }

    public void handleEvent(Event event) {
        Application.getInstance().setCurrentObject((Identifiable) event.item.getData(), false);
    }
}