de.stefanteitge.mtmx.workbench.ui.internal.view.GameExplorerView.java Source code

Java tutorial

Introduction

Here is the source code for de.stefanteitge.mtmx.workbench.ui.internal.view.GameExplorerView.java

Source

/*
 * This file is part of mtmX.
 *
 * mtmX 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.
 *
 * mtmX 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 mtmX.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.stefanteitge.mtmx.workbench.ui.internal.view;

import java.io.File;

import jtrfp.common.pod.PodFile;
import jtrfp.game.ITriGameDir;

import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;

import de.stefanteitge.mtmx.workbench.ui.GameProvider;
import de.stefanteitge.mtmx.workbench.ui.IGameProviderListener;
import de.stefanteitge.mtmx.workbench.ui.IconProvider;
import de.stefanteitge.mtmx.workbench.ui.internal.IconUtil;

public class GameExplorerView extends ViewPart {

    public static final String VIEW_ID = "de.stefanteitge.mtmx.workbench.ui.GameExplorerView";

    private IGameProviderListener listener;

    public GameExplorerView() {
    }

    @Override
    public void createPartControl(final Composite parent) {
        listener = new IGameProviderListener() {
            @Override
            public void listChanged() {
                createPartControl(parent);
            }
        };
        GameProvider.getInstance().setListener(listener);

        ITriGameDir gameDir = GameProvider.getInstance().getActiveGame();

        if (gameDir == null) {
            disposeChildren(parent);
            final Composite x = new Composite(parent, SWT.NONE);
            x.setLayout(new GridLayout(1, true));
            Label msgLabel = new Label(x, SWT.NONE);
            msgLabel.setText("No game configured under preferences.");
            parent.layout();
        } else {
            createTree(parent);
        }
    }

    private void createTree(Composite parent) {
        parent.setLayout(new FillLayout());

        disposeChildren(parent);

        TreeViewer treeViewer = new TreeViewer(parent);
        treeViewer.setContentProvider(new TreeContentProvider());
        treeViewer.setLabelProvider(new TreeLabelProvider());

        treeViewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                ISelection selection = event.getSelection();
                openRequested(selection);
            }
        });

        treeViewer.setInput(GameProvider.getInstance().getGameDirs());
        treeViewer.expandToLevel(2);
        getSite().setSelectionProvider(treeViewer);
        parent.layout();

    }

    private void disposeChildren(Composite parent) {
        Control[] controls = parent.getChildren();
        for (Control control : controls) {
            control.dispose();
        }
    }

    private void openRequested(ISelection selection) {
        // TODO: uncommented on removal of org.eclipse.ui.ide
        //      Object fe = Util.getFirstElement(selection);
        //      if (fe != null && fe instanceof File) {
        //         File file = (File) fe;
        //         IPath path = new Path(file.getAbsolutePath());
        //         IFileStore fileStore = EFS.getLocalFileSystem().getStore(path);
        //         if (fileStore.fetchInfo().exists()) {
        //            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        //            IWorkbenchPage page = window.getActivePage();
        //            try {
        //               IDE.openEditorOnFileStore(page, fileStore);
        //            } catch (PartInitException e) {
        //               // TODO: log
        //               e.printStackTrace();
        //            }
        //         }
        //      }
    }

    @Override
    public void setFocus() {
    }

    @Override
    public void dispose() {
        super.dispose();
        GameProvider.getInstance().setListener(null);
    }

    private static class TreeLabelProvider extends LabelProvider {

        @Override
        public Image getImage(Object element) {
            if (element instanceof PodsNode) {
                return IconProvider.getIconByPath(IconProvider.PODS_PATH);
            } else if (element instanceof IniNode) {
                return IconProvider.getIconByPath(IconProvider.INIS_PATH);
            } else if (element instanceof File) {
                return IconProvider.getIconByPath(IconProvider.INI_PATH);
            } else if (element instanceof ITriGameDir) {
                ITriGameDir mtmGameDir = (ITriGameDir) element;
                Image img = IconUtil.getSwtImage(mtmGameDir.getExeFile());
                return img;
            }

            return IconProvider.getIcon(element);
        }

        @Override
        public String getText(Object element) {
            if (element instanceof ITriGameDir) {
                return ((ITriGameDir) element).getGameName();
            } else if (element instanceof File) {
                return ((File) element).getName();
            }
            return super.getText(element);
        }

    }

    private static class TreeContentProvider implements ITreeContentProvider {

        @Override
        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof PodsNode) {
                return ((PodsNode) parentElement).gameDir.getPodFiles();
            } else if (parentElement instanceof IniNode) {
                ITriGameDir gameDir = ((IniNode) parentElement).gameDir;
                return gameDir.getIniFiles();
            } else if (parentElement instanceof ITriGameDir) {
                ITriGameDir gameDir = (ITriGameDir) parentElement;
                return new Object[] { new PodsNode(gameDir), new IniNode(gameDir) };
            }

            return null;
        }

        @Override
        public Object getParent(Object element) {
            if (element instanceof PodFile) {
                return null;
            }
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            Object[] children = getChildren(element);
            return children != null ? children.length > 0 : false;
        }

        @Override
        public Object[] getElements(Object inputElement) {
            if (inputElement instanceof ITriGameDir[]) {
                return (ITriGameDir[]) inputElement;
            }
            return new Object[] {};
        }

        @Override
        public void dispose() {
            // TODO Auto-generated method stub
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // TODO Auto-generated method stub
        }
    }

    private static class PodsNode {

        private final ITriGameDir gameDir;

        public PodsNode(ITriGameDir gameDir) {
            this.gameDir = gameDir;
        }

        @Override
        public String toString() {
            return "POD Files";
        }
    }

    private static class IniNode {

        private final ITriGameDir gameDir;

        public IniNode(ITriGameDir gameDir) {
            this.gameDir = gameDir;
        }

        @Override
        public String toString() {
            return "INI Files";
        }
    }
}