3

私は SWT と Eclipse のプラグインを使用しています。ワークスペースからのみファイルを選択する必要があります。ワークスペースでディレクトリを選択するためのコンポーネント、ファイル システムでファイルを選択するためのコンポーネントを作成しましたが、ワークスペースからファイルを選択するためのコンポーネントが見つかりません。

今、私はorg.eclipse.swt.widgets.FileDialogfilter を使用して設定していますsetFilterPath(Platform.getLocation().toOSString())。ただし、ユーザーはワークスペース以外のファイルを選択できます。ワークスペース内からのみファイルを設定できる必要があります。

4

3 に答える 3

5

回答ありがとうございます。独自のコンポーネントを作成して使用します。また、ファイルを選択するためのフィルターを追加します。

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.WorkbenchLabelProvider;

/**
 * @author Alexey Prybytkouski
 */
public class ResourceFileSelectionDialog extends ElementTreeSelectionDialog {

    private String[] extensions;

    private static ITreeContentProvider contentProvider = new ITreeContentProvider() {
        public Object[] getChildren(Object element) {
            if (element instanceof IContainer) {
                try {
                    return ((IContainer) element).members();
                }
                catch (CoreException e) {
                }
            }
            return null;
        }

        public Object getParent(Object element) {
            return ((IResource) element).getParent();
        }

        public boolean hasChildren(Object element) {
            return element instanceof IContainer;
        }

        public Object[] getElements(Object input) {
            return (Object[]) input;
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    };

    private static final IStatus OK = new Status(IStatus.OK, PLUGIN_ID, 0, "", null);
    private static final IStatus ERROR = new Status(IStatus.ERROR, PLUGIN_ID, 0, "", null);

    /*
     * Validator
     */
    private ISelectionStatusValidator validator = new ISelectionStatusValidator() {
        public IStatus validate(Object[] selection) {
            return selection.length == 1 && selection[0] instanceof IFile
                    && checkExtension(((IFile) selection[0]).getFileExtension()) ? OK : ERROR;
        }
    };

    public ResourceFileSelectionDialog(String title, String message, String[] type) {
        this(Display.getDefault().getActiveShell(), WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
                contentProvider);
        this.extensions = type;

        setTitle(title);
        setMessage(message);

        setInput(computeInput());
        setValidator(validator);
    }

    public ResourceFileSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
        super(parent, labelProvider, contentProvider);
    }

    /*
     * Show projects
     */
    private Object[] computeInput() {
        /*
         * Refresh projects tree.
         */
        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        for (int i = 0; i < projects.length; i++) {
            try {
                projects[i].refreshLocal(IResource.DEPTH_INFINITE, null);
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }

        try {
            ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_ONE, null);
        } catch (CoreException e) {
        }
        List<IProject> openProjects = new ArrayList<IProject>(projects.length);
        for (int i = 0; i < projects.length; i++) {
            if (projects[i].isOpen()) {
                openProjects.add(projects[i]);
            }
        }
        return openProjects.toArray();
    }

    /*
     * Check file extension
     */
    private boolean checkExtension(String name) {
        if (name.equals("*")) {
            return true;
        }

        for (int i = 0; i < extensions.length; i++) {
            if (extensions[i].equals(name)) {
                return true;
            }
        }
        return false;
    }
}

そして呼び出します:

ResourceFileSelectionDialog dialog = new ResourceFileSelectionDialog("Title", "Message", new String[] { "properties" });
dialog.open();

例1

例2

于 2013-02-08T14:49:36.550 に答える
3

これを試して。これで、ワークスペースをブラウズできるはずです。

eclipse.ui およびresourcesプラグインを依存関係として追加する必要があります。

ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
    Display.getDefault().getActiveShell(), 
    new WorkbenchLabelProvider(), 
    new BaseWorkbenchContentProvider());

dialog.open();
于 2013-02-07T19:04:43.180 に答える
1

ユーザーの操作をそのように制御できる SWT コンポーネントを私は知りません。

したがって、ここでの最善の解決策は次のとおりだと思います。

フォルダーの内容を読み取り、それをユーザーに表示するウィンドウを作成し、ルート フォルダー (この場合はワークスペース フォルダー) のサブフォルダー以外のナビゲーションの可能性をユーザーに与えないようにすることができます。

次の例を参照してください: http://www.ibm.com/developerworks/opensource/library/os-ecgui1/ http://www.ibm.com/developerworks/library/os-ecgui2/

于 2013-02-07T13:21:59.773 に答える