com.sap.dirigible.ide.workspace.ui.viewer.WorkspaceViewer.java Source code

Java tutorial

Introduction

Here is the source code for com.sap.dirigible.ide.workspace.ui.viewer.WorkspaceViewer.java

Source

/*******************************************************************************
 * Copyright (c) 2014 SAP AG or an SAP affiliate company. All rights reserved.
 * 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 com.sap.dirigible.ide.workspace.ui.viewer;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;

import com.sap.dirigible.ide.workspace.RemoteResourcesPlugin;

public class WorkspaceViewer {

    private static final String WORKSPACE_MENU = "Workspace Menu"; //$NON-NLS-1$

    private final TreeViewer viewer;

    private final MenuManager menuManager;

    private final IResourceChangeListener changeListener = new CustomResourceChangeListener();

    public WorkspaceViewer(Composite parent, int style) {
        this(parent, style, RemoteResourcesPlugin.getWorkspace());
    }

    private WorkspaceViewer(Composite parent, int style, IWorkspace workspace) {
        // Create and configure viewer
        PatternFilter filter = new PatternFilter();
        FilteredTree tree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, filter, true);
        viewer = tree.getViewer();
        viewer.setContentProvider(new WorkspaceContentProvider());
        viewer.setLabelProvider(new WorkspaceLabelProvider());
        viewer.setSorter(new WorkspaceSorter());

        //      viewer.addDragSupport(
        //            DND.DROP_MOVE,
        //            WorkspaceDragSourceListener.SUPPORTED_DND_SOURCE_TRANSFER_TYPES,
        //            new WorkspaceDragSourceListener(viewer));
        //      viewer.addDropSupport(
        //            DND.DROP_MOVE,
        //            WorkspaceDropTargetListener.SUPPORTED_DND_TARGET_TRANSFER_TYPES,
        //            new WorkspaceDropTargetListener(viewer, workspace));

        viewer.getControl().addDisposeListener(new DisposeListener() {
            /**
             * 
             */
            private static final long serialVersionUID = 2504065180094207979L;

            public void widgetDisposed(DisposeEvent event) {
                releaseData();
            }
        });

        // Configure context menu
        menuManager = new MenuManager(WORKSPACE_MENU, "sample.MenuManager"); //$NON-NLS-1$
        menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
        final Menu menu = menuManager.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);

        if (workspace != null) {
            setInput(workspace.getRoot());
        } else {
            setInput(null);
        }
    }

    public MenuManager getMenuManager() {
        return menuManager;
    }

    public ISelectionProvider getSelectionProvider() {
        return viewer;
    }

    public Control getControl() {
        return (viewer != null) ? viewer.getControl() : null;
    }

    public TreeViewer getViewer() {
        return viewer;
    }

    public void setInput(IContainer container) {
        final IContainer currentInput = getInput();
        if (!areEqual(currentInput, container)) {
            changeInput(currentInput, container);
        }
        // container.getWorkspace().addResourceChangeListener(changeListener);
        // viewer.setInput(container);
    }

    public IContainer getInput() {
        return (IContainer) viewer.getInput();
    }

    public void refresh() {
        Object[] elements = viewer.getExpandedElements();
        viewer.refresh();
        viewer.setExpandedElements(elements);
    }

    public void setFocus() {
        viewer.getControl().setFocus();
    }

    public void dispose() {
        viewer.getControl().dispose();
    }

    private void changeInput(IContainer oldInput, IContainer newInput) {
        final IWorkspace oldWorkspace = (oldInput != null) ? oldInput.getWorkspace() : null;
        final IWorkspace newWorkspace = (newInput != null) ? newInput.getWorkspace() : null;
        if (!areEqual(oldWorkspace, newWorkspace)) {
            changeWorkspace(oldWorkspace, newWorkspace);
        }
        viewer.setInput(newInput);
    }

    private void changeWorkspace(IWorkspace oldWorkspace, IWorkspace newWorkspace) {
        if (oldWorkspace != null) {
            oldWorkspace.removeResourceChangeListener(changeListener);
        }
        if (newWorkspace != null) {
            newWorkspace.addResourceChangeListener(changeListener);
        }
    }

    private boolean areEqual(Object a, Object b) {
        if (a != null) {
            return a.equals(b);
        } else {
            return (b == null);
        }
    }

    private void releaseData() {
        final IContainer input = getInput();
        if (input != null) {
            input.getWorkspace().removeResourceChangeListener(changeListener);
        }
    }

    private class CustomResourceChangeListener implements IResourceChangeListener {
        public void resourceChanged(IResourceChangeEvent event) {
            if (!viewer.getControl().isDisposed()) {
                //            viewer.getContentProvider().dispose();
                //            viewer.setContentProvider(new WorkspaceContentProvider());
                refresh();
            }
        }
    }

}