/** * Aptana Studio * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.ide.syncing.ui.old.views; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import com.aptana.core.util.ArrayUtil; import com.aptana.ide.syncing.core.old.ISyncResource; import com.aptana.ide.syncing.core.old.SyncFolder; import com.aptana.ide.syncing.core.old.SyncState; /** * @author Kevin Sawicki (ksawicki@aptana.com) * @author Michael Xia (mxia@aptana.com) */ public class SmartSyncContentProvider implements ITreeContentProvider { private List<ISyncResource> fCurrentResources; private int fSyncDirection; private int fPresentationType; private boolean fDeleteRemoteFiles; private boolean fDeleteLocalFiles; /** * Constructor. */ public SmartSyncContentProvider() { fCurrentResources = new ArrayList<ISyncResource>(); } /** * Gets the current list of displayed resources. * * @return an array of current resources displayed */ public ISyncResource[] getCurrentResources() { return fCurrentResources.toArray(new ISyncResource[fCurrentResources.size()]); } /** * Sets the sync direction. * * @param direction * the direction for doing the sync */ public void setSyncDirection(int direction) { fSyncDirection = direction; } /** * Sets the presentation type. * * @param type * the type of presentation for the viewer */ public void setPresentationType(int type) { fPresentationType = type; } /** * Sets the indication of if deleting remote files is selected. * * @param delete * true if deleting remote files is selected, false otherwise */ public void setDeleteRemoteFiles(boolean delete) { fDeleteRemoteFiles = delete; } /** * Sets the indication of if deleting local files is selected. * * @param delete * true if deleting local files is selected, false otherwise */ public void setDeleteLocalFiles(boolean delete) { fDeleteLocalFiles = delete; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof SyncFolder && fPresentationType == OptionsToolBar.TREE_VIEW) { // finds the direct children that are in the list of files to be synced ISyncResource[] children = ((SyncFolder) parentElement).members(); List<ISyncResource> resources = new ArrayList<ISyncResource>(); for (ISyncResource child : children) { if (fCurrentResources.contains(child)) { resources.add(child); } else if (child instanceof SyncFolder && !resources.contains(child)) { // if a folder contains a file in the list, it needs to be // included SyncFolder folder = (SyncFolder) child; List<ISyncResource> subs = folder.getAllFiles(); for (ISyncResource resource : fCurrentResources) { if (subs.contains(resource)) { resources.add(child); break; } } } } return resources.toArray(new ISyncResource[resources.size()]); } return ArrayUtil.NO_OBJECTS; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object) */ public Object getParent(Object element) { if (element instanceof ISyncResource) { return ((ISyncResource) element).getParent(); } return null; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object) */ public boolean hasChildren(Object element) { if (element instanceof SyncFolder && fPresentationType == OptionsToolBar.TREE_VIEW) { return !((SyncFolder) element).isEmpty(); } return false; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(Object) */ public Object[] getElements(Object inputElement) { fCurrentResources.clear(); if (inputElement instanceof SyncFolder) { ISyncResource[] all = ((SyncFolder) inputElement).getAllFiles().toArray(new ISyncResource[0]); if (fSyncDirection == DirectionToolBar.UPLOAD || fSyncDirection == DirectionToolBar.DOWNLOAD || fSyncDirection == DirectionToolBar.FORCE_UPLOAD || fSyncDirection == DirectionToolBar.FORCE_DOWNLOAD) { int state; for (ISyncResource resource : all) { state = resource.getSyncState(); if (fSyncDirection == DirectionToolBar.UPLOAD || fSyncDirection == DirectionToolBar.FORCE_UPLOAD) { if (state == SyncState.ClientItemOnly || state == SyncState.ClientItemIsNewer) { fCurrentResources.add(resource); } else if (fDeleteRemoteFiles && state == SyncState.ServerItemOnly) { fCurrentResources.add(resource); } else if (state == SyncFolder.MIXED) { fCurrentResources.add(resource); } } else if (fSyncDirection == DirectionToolBar.DOWNLOAD || fSyncDirection == DirectionToolBar.FORCE_DOWNLOAD) { if (state == SyncState.ServerItemIsNewer || state == SyncState.ServerItemOnly) { fCurrentResources.add(resource); } else if (fDeleteLocalFiles && state == SyncState.ClientItemOnly) { fCurrentResources.add(resource); } else if (state == SyncFolder.MIXED) { fCurrentResources.add(resource); } } } if (fPresentationType == OptionsToolBar.TREE_VIEW) { return getChildren(inputElement); } } else { for (ISyncResource resource : all) { fCurrentResources.add(resource); } if (fPresentationType == OptionsToolBar.TREE_VIEW) { return getChildren(inputElement); } } } return fCurrentResources.toArray(new ISyncResource[fCurrentResources.size()]); } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#dispose() */ public void dispose() { } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#inputChanged(Viewer, Object, Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }