com.nokia.carbide.search.system.internal.ui.text.ReplaceAction2.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.search.system.internal.ui.text.ReplaceAction2.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation, Nokia and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.nokia.carbide.search.system.internal.ui.text;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;

import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.ITextFileBuffer;
import org.eclipse.core.filebuffers.ITextFileBufferManager;
import org.eclipse.core.filebuffers.LocationKind;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Item;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.actions.WorkspaceModifyOperation;

import com.nokia.carbide.search.system.internal.ui.SearchMessages;
import com.nokia.carbide.search.system.internal.ui.util.ExceptionHandler;
import com.nokia.carbide.search.system.ui.NewSearchUI;
import com.nokia.carbide.search.system.ui.text.AbstractTextSearchResult;
import com.nokia.carbide.search.system.ui.text.Match;

/* package */ class ReplaceAction2 extends Action {

    private IWorkbenchSite fSite;
    private IFileStore[] fElements;
    private FileSearchPage fPage;

    private static class ItemIterator implements Iterator {
        private Item[] fArray;
        private int fNextPosition;

        ItemIterator(Item[] array) {
            fArray = array;
            fNextPosition = 0;
        }

        public boolean hasNext() {
            return fNextPosition < fArray.length;
        }

        public Object next() {
            if (!hasNext())
                throw new NoSuchElementException();
            return fArray[fNextPosition++].getData();
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

    public ReplaceAction2(FileSearchPage page, IFileStore[] elements) {
        Assert.isNotNull(page);
        fSite = page.getSite();
        if (elements != null)
            fElements = elements;
        else
            fElements = new IFileStore[0];
        fPage = page;

        setText(SearchMessages.ReplaceAction_label_all);
        setEnabled(!(fElements.length == 0));
    }

    public ReplaceAction2(FileSearchPage page) {
        Assert.isNotNull(page);
        fSite = page.getSite();
        fPage = page;

        Item[] items = null;
        StructuredViewer viewer = fPage.getViewer();
        if (viewer instanceof TreeViewer) {
            items = ((TreeViewer) viewer).getTree().getItems();
        } else if (viewer instanceof TableViewer) {
            items = ((TableViewer) viewer).getTable().getItems();
        }
        fElements = collectFiles(new ItemIterator(items));

        setText(SearchMessages.ReplaceAction_label_all);
        setEnabled(!(fElements.length == 0));
    }

    public ReplaceAction2(FileSearchPage page, IStructuredSelection selection) {
        fSite = page.getSite();
        fPage = page;
        setText(SearchMessages.ReplaceAction_label_selected);
        fElements = collectFiles(selection.iterator());
        setEnabled(!(fElements.length == 0));
    }

    private IFileStore[] collectFiles(Iterator resources) {
        final Set files = new HashSet();
        final AbstractTextSearchResult result = fPage.getInput();
        if (result == null)
            return new IFileStore[0];
        while (resources.hasNext()) {
            IFileStore file = (IFileStore) resources.next();
            if (result.getMatchCount(file) > 0)
                files.add(file);
        }
        return (IFileStore[]) files.toArray(new IFileStore[files.size()]);
    }

    public void run() {
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        ISchedulingRule rule = workspace.getRuleFactory().modifyRule(workspace.getRoot());
        try {
            Platform.getJobManager().beginRule(rule, null);
            if (validateResources((FileSearchQuery) fPage.getInput().getQuery())) {
                ReplaceDialog2 dialog = new ReplaceDialog2(fSite.getShell(), fElements, fPage);
                dialog.open();
            }
        } catch (OperationCanceledException e) {
        } finally {
            Platform.getJobManager().endRule(rule);
        }
    }

    private boolean validateResources(final FileSearchQuery operation) {
        IFile[] readOnlyFiles = getReadOnlyFiles();
        IStatus status = ResourcesPlugin.getWorkspace().validateEdit(readOnlyFiles, fSite.getShell());
        if (!status.isOK()) {
            if (status.getSeverity() != IStatus.CANCEL) {
                ErrorDialog.openError(fSite.getShell(), SearchMessages.ReplaceAction2_error_validate_title,
                        SearchMessages.ReplaceAction2_error_validate_message, status);
            }
            return false;
        }

        final List outOfDateEntries = new ArrayList();
        for (int j = 0; j < fElements.length; j++) {
            IFileStore entry = fElements[j];
            Match[] markers = fPage.getDisplayedMatches(entry);
            for (int i = 0; i < markers.length; i++) {
                if (isOutOfDate((FileMatch) markers[i])) {
                    outOfDateEntries.add(entry);
                    break;
                }
            }
        }

        final List outOfSyncEntries = new ArrayList();
        //      for (int i= 0; i < fElements.length; i++) {
        //         IFileStore entry = fElements[i];
        //         if (isOutOfSync(entry)) {
        //            outOfSyncEntries.add(entry);
        //         }
        //      }

        if (outOfDateEntries.size() > 0 || outOfSyncEntries.size() > 0) {
            if (askForResearch(outOfDateEntries, outOfSyncEntries)) {
                ProgressMonitorDialog pmd = new ProgressMonitorDialog(fSite.getShell());
                try {
                    pmd.run(true, true, new WorkspaceModifyOperation(null) {
                        protected void execute(IProgressMonitor monitor) throws CoreException {
                            research(monitor, outOfDateEntries, operation);
                        }
                    });
                    return true;
                } catch (InvocationTargetException e) {
                    ExceptionHandler.handle(e, fSite.getShell(), SearchMessages.ReplaceAction_label,
                            SearchMessages.ReplaceAction_research_error);
                } catch (InterruptedException e) {
                    // canceled
                }
            }
            return false;
        }
        return true;
    }

    private IFile[] getReadOnlyFiles() {
        Set readOnly = new HashSet();
        for (int i = 0; i < fElements.length; i++) {
            if (fElements[i].fetchInfo().getAttribute(EFS.ATTRIBUTE_READ_ONLY))
                readOnly.add(fElements[i]);
        }
        IFile[] readOnlyArray = new IFile[readOnly.size()];
        return (IFile[]) readOnly.toArray(readOnlyArray);
    }

    private void research(IProgressMonitor monitor, List outOfDateEntries, FileSearchQuery operation)
            throws CoreException {
        String message = SearchMessages.ReplaceAction2_statusMessage;
        MultiStatus multiStatus = new MultiStatus(NewSearchUI.PLUGIN_ID, IStatus.OK, message, null);
        for (Iterator elements = outOfDateEntries.iterator(); elements.hasNext();) {
            IFile entry = (IFile) elements.next();
            IStatus status = research(operation, monitor, entry);
            if (status != null && !status.isOK()) {
                multiStatus.add(status);
            }
        }
        if (!multiStatus.isOK()) {
            throw new CoreException(multiStatus);
        }
    }

    private boolean askForResearch(List outOfDateEntries, List outOfSyncEntries) {
        SearchAgainConfirmationDialog dialog = new SearchAgainConfirmationDialog(fSite.getShell(),
                (ILabelProvider) fPage.getViewer().getLabelProvider(), outOfSyncEntries, outOfDateEntries);
        return dialog.open() == IDialogConstants.OK_ID;
    }

    private boolean isOutOfDate(FileMatch match) {

        if (match.getCreationTimeStamp() != match.getFile().fetchInfo().getLastModified())
            return true;
        ITextFileBufferManager bm = FileBuffers.getTextFileBufferManager();
        File file = null;
        try {
            file = match.getFile().toLocalFile(EFS.NONE, null);
        } catch (CoreException e) {
            return false;
        }
        ITextFileBuffer fb = bm.getTextFileBuffer(new Path(file.getAbsolutePath()), LocationKind.IFILE);
        if (fb != null && fb.isDirty())
            return true;
        return false;
    }

    //   private boolean isOutOfSync(IFileStore entry) {
    //      return !entry.isSynchronized(IResource.DEPTH_ZERO); 
    //   }

    private IStatus research(FileSearchQuery operation, final IProgressMonitor monitor, IFile entry) {
        Match[] matches = fPage.getDisplayedMatches(entry);
        IStatus status = operation.searchInFile(getResult(), monitor, entry);

        // always remove old matches
        for (int i = 0; i < matches.length; i++) {
            getResult().removeMatch(matches[i]);
        }
        return status;
    }

    private AbstractTextSearchResult getResult() {
        return fPage.getInput();
    }

}