org.xmind.ui.internal.sharing.SharedMapsContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.xmind.ui.internal.sharing.SharedMapsContentProvider.java

Source

/* ******************************************************************************
 * Copyright (c) 2006-2012 XMind Ltd. and others.
 * 
 * This file is a part of XMind 3. XMind releases 3 and
 * above are dual-licensed under the Eclipse Public License (EPL),
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 * and the GNU Lesser General Public License (LGPL), 
 * which is available at http://www.gnu.org/licenses/lgpl.html
 * See http://www.xmind.net/license.html for details.
 * 
 * Contributors:
 *     XMind Ltd. - initial API and implementation
 *******************************************************************************/
package org.xmind.ui.internal.sharing;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.xmind.core.internal.sharing.AbstractSharedMap;
import org.xmind.core.internal.sharing.LocalNetworkSharing;
import org.xmind.core.internal.sharing.RemoteSharedLibrary;
import org.xmind.core.sharing.IContactManager;
import org.xmind.core.sharing.ILocalSharedLibrary;
import org.xmind.core.sharing.IRemoteSharedLibrary;
import org.xmind.core.sharing.ISharedLibrary;
import org.xmind.core.sharing.ISharedMap;
import org.xmind.core.sharing.ISharingListener;
import org.xmind.core.sharing.ISharingService;
import org.xmind.core.sharing.SharingConstants;
import org.xmind.core.sharing.SharingEvent;
import org.xmind.core.sharing.SharingEvent.Type;

class SharedMapsContentProvider implements ITreeContentProvider, ISharingListener {

    private Viewer viewer = null;

    public SharedMapsContentProvider() {
    }

    public Object[] getElements(Object inputElement) {
        if (inputElement instanceof ISharingService)
            return getCategories((ISharingService) inputElement);
        return new Object[0];
    }

    private Object[] getCategories(ISharingService sharingService) {
        IPreferenceStore prefStore = LocalNetworkSharingUI.getDefault().getPreferenceStore();
        String arrangeMode = prefStore.getString(SharingConstants.PREF_ARRANGE_MODE);

        List<Object> categories = new ArrayList<Object>();
        ILocalSharedLibrary localLibrary = sharingService.getLocalLibrary();

        if (IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(arrangeMode)
                || SharingConstants.ARRANGE_MODE_PEOPLE.equals(arrangeMode)) {
            localLibrary.sortMaps(AbstractSharedMap.MAP_COMPARATOR);
            categories.add(localLibrary);
            categories.addAll(sharingService.getRemoteLibraries());
            Collections.sort(categories, LIBRARY_COMPARATOR);
        } else {
            RemoteSharedLibrary bigLibrary = new RemoteSharedLibrary(null,
                    SharingMessages.SharedMapsContentProvider_remoteLibraryName);
            List<ISharedMap> maps = new ArrayList<ISharedMap>();
            for (IRemoteSharedLibrary remote : sharingService.getRemoteLibraries()) {
                if (!sharingService.getContactManager().isContact(remote.getContactID()))
                    continue;

                for (ISharedMap map : remote.getMaps()) {
                    maps.add(map);
                }
            }
            bigLibrary.addMaps(maps);
            if (SharingConstants.ARRANGE_MODE_NAME.equals(arrangeMode)) {
                localLibrary.sortMaps(AbstractSharedMap.MAP_COMPARATOR);
            } else if (SharingConstants.ARRANGE_MODE_TIME.equals(arrangeMode)) {
                localLibrary.sortMaps(AbstractSharedMap.MAP_COMPARATOR_BY_MODIFIED_TIME);
                bigLibrary.sortMaps(AbstractSharedMap.MAP_COMPARATOR_BY_MODIFIED_TIME);
            }
            categories.add(localLibrary);
            categories.add(bigLibrary);
        }
        return categories.toArray();
    }

    public Object[] getChildren(Object parentElement) {
        if (parentElement instanceof ISharedLibrary) {
            return ((ISharedLibrary) parentElement).getMaps();
        }
        return new Object[0];
    }

    public boolean hasChildren(Object element) {
        if (element instanceof ISharedLibrary)
            return ((ISharedLibrary) element).hasMaps();
        return false;
    }

    public void dispose() {
    }

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        this.viewer = viewer;
        if (oldInput instanceof ISharingService) {
            ((ISharingService) oldInput).removeSharingListener(this);
        }
        if (newInput instanceof ISharingService) {
            ((ISharingService) newInput).addSharingListener(this);
        }
    }

    public Object getParent(Object element) {
        if (element instanceof ISharedMap) {
            return ((ISharedMap) element).getSharedLibrary();
        }
        return null;
    }

    public void handleSharingEvent(final SharingEvent event) {
        if (viewer == null || viewer.getControl() == null || viewer.getControl().isDisposed())
            return;

        viewer.getControl().getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (viewer == null || viewer.getControl() == null || viewer.getControl().isDisposed())
                    return;
                handleSharingEventInUI(event);
            }
        });
    }

    private void handleSharingEventInUI(SharingEvent event) {
        Type type = event.getType();
        if (type == SharingEvent.Type.LIBRARY_ADDED || type == SharingEvent.Type.LIBRARY_REMOVED
                || type == SharingEvent.Type.SHARED_MAP_ADDED || type == SharingEvent.Type.SHARED_MAP_REMOVED
                || type == SharingEvent.Type.SERVICE_STATUS_CHANGED || type == SharingEvent.Type.CONTACT_ADDED) {
            if (type == SharingEvent.Type.SERVICE_STATUS_CHANGED) {

            }
            viewer.refresh();
        } else if (type == SharingEvent.Type.LIBRARY_NAME_CHANGED) {
            ((StructuredViewer) viewer).update(event.getLibrary(), null);
        } else if (type == SharingEvent.Type.SHARED_MAP_UPDATED) {
            Object[] updatedElements = new Object[] { event.getMap() };
            ((SharedMapLabelProvider) ((StructuredViewer) viewer).getLabelProvider())
                    .invalidateImageCache(updatedElements);
        }
    }

    private static final Comparator<Object> LIBRARY_COMPARATOR = new Comparator<Object>() {
        public int compare(Object o1, Object o2) {
            if (o1 instanceof ILocalSharedLibrary)
                return -1;

            if (o2 instanceof ILocalSharedLibrary)
                return 1;

            if (o1 instanceof IRemoteSharedLibrary && o2 instanceof IRemoteSharedLibrary) {
                IRemoteSharedLibrary r1 = (IRemoteSharedLibrary) o1;
                IRemoteSharedLibrary r2 = (IRemoteSharedLibrary) o2;

                int code;

                code = compareConnect(r1, r2);
                if (code != 0)
                    return code;

                code = compareContactID(r1, r2);
                if (code != 0)
                    return code;

                return compareName(r1.getName(), r2.getName());
            }
            return 0;
        }

        private int compareConnect(IRemoteSharedLibrary r1, IRemoteSharedLibrary r2) {
            IContactManager manager = LocalNetworkSharing.getDefault().getSharingService().getContactManager();

            boolean connect1 = manager.isContact(r1.getContactID());
            boolean connect2 = manager.isContact(r2.getContactID());

            if (connect1 && connect2)
                return compareName(r1.getName(), r2.getName());
            if (connect1)
                return -1;
            if (connect2)
                return 1;
            return 0;
        }

        private int compareContactID(IRemoteSharedLibrary r1, IRemoteSharedLibrary r2) {
            String id1 = r1.getContactID();
            String id2 = r2.getContactID();

            if (id1 != null && !"".equals(id1) //$NON-NLS-1$
                    && id2 != null && !"".equals(id2)) //$NON-NLS-1$
                return compareName(r1.getName(), r2.getName());
            if (id1 != null && !"".equals(id1)) //$NON-NLS-1$
                return -1;
            if (id2 != null && !"".equals(id2)) //$NON-NLS-1$
                return 1;
            return 0;
        }

        private int compareName(String name1, String name2) {
            if (name1 != null && name2 != null)
                return name1.compareTo(name2);
            if (name1 != null)
                return -1;
            if (name2 != null)
                return 1;
            return 0;
        }

    };
}