de.defmacro.dandelion.internal.ui.views.apropos.AproposView.java Source code

Java tutorial

Introduction

Here is the source code for de.defmacro.dandelion.internal.ui.views.apropos.AproposView.java

Source

/*
 Dandelion, a Lisp plugin for Eclipse.
 Copyright (C) 2007 Michael Bohn
    
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
    
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
    
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package de.defmacro.dandelion.internal.ui.views.apropos;

import java.util.*;
import java.util.regex.Pattern;

import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.part.ViewPart;

import de.defmacro.dandelion.internal.LispPluginActivator;
import de.defmacro.dandelion.internal.core.LispCore;
import de.defmacro.dandelion.internal.core.connection.*;
import de.defmacro.dandelion.internal.core.meta.*;
import de.defmacro.dandelion.internal.ui.*;
import de.defmacro.dandelion.internal.ui.views.apropos.AproposQueryResultSorter.TSortBy;

public class AproposView extends ViewPart implements SelectionListener, IEnvironmentManagementListener {
    public static final String ID = LispPluginActivator.NS + ".views.aproposView";

    private static final String ALL_PACKAGES = "All Packages";
    private static final String TEXT_MODE_AND = "and";
    private static final String TEXT_MODE_OR = "or";
    private static final String TEXT_MODE_NOT = "not";
    private static final SortedSet<IMetaSymbol> EMPTY_INPUT = Collections
            .unmodifiableSortedSet(new TreeSet<IMetaSymbol>());

    private static final int COMBO_WIDTH_HINT = 200;
    private static final int CONNECT_STATE_WIDTH_HINT = 20;
    private static final Pattern SPLIT_PATTERN = Pattern.compile("\\s+");

    private static class ColumnSortListener extends SelectionAdapter {
        private TableViewer fTableViewer;
        private TSortBy fSortBy;

        public ColumnSortListener(final TableViewer tableViewer, final TSortBy sortBy) {
            this.fTableViewer = tableViewer;
            this.fSortBy = sortBy;
        }

        @Override
        public void widgetSelected(final SelectionEvent e) {
            fTableViewer.setSorter(new AproposQueryResultSorter(fSortBy));
        }
    }

    private TableViewer fViewer;

    private EnvironmentManager fEvalServerManager;
    private Combo fComboPackages;
    private Combo fComboServer;
    private Combo fComboMode;
    private Label fConnectionState;
    private Label fLabelSymbolInPackages;
    private Text fQueryText;

    public AproposView() {
        this.fEvalServerManager = LispCore.getEnvironmentManager();
    }

    @Override
    public void createPartControl(final Composite parent) {

        GridLayout parentLayout = new GridLayout(2, false);
        parentLayout.verticalSpacing = 0;
        parent.setLayout(parentLayout);

        fComboMode = new Combo(parent, SWT.READ_ONLY);
        fComboMode.add(TEXT_MODE_AND);
        fComboMode.add(TEXT_MODE_OR);
        fComboMode.add(TEXT_MODE_NOT);
        fComboMode.select(0);

        Composite input = new Composite(parent, SWT.NONE);
        input.setLayout(getElementLayout());
        input.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        fQueryText = new Text(input, SWT.BORDER);
        fQueryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Button button = new Button(input, SWT.PUSH);
        button.setText("Search");
        button.addSelectionListener(this);
        getSite().getShell().setDefaultButton(button); //als Default-Button registrieren

        Label lblConnection = new Label(parent, SWT.NONE);
        lblConnection.setText("Environment:");

        Composite serverAndState = new Composite(parent, SWT.NONE);
        serverAndState.setLayout(getElementLayout());

        fComboServer = new Combo(serverAndState, SWT.READ_ONLY);
        fComboServer.addSelectionListener(this);
        {
            GridData data = new GridData();
            data.widthHint = COMBO_WIDTH_HINT;
            fComboServer.setLayoutData(data);
        }

        fConnectionState = new Label(serverAndState, SWT.NONE);
        {
            GridData data = new GridData();
            data.widthHint = CONNECT_STATE_WIDTH_HINT;
            fConnectionState.setLayoutData(data);
        }

        Label lblPackage = new Label(parent, SWT.NONE);
        lblPackage.setText("Package:");

        Composite packageAndInfo = new Composite(parent, SWT.NONE);
        packageAndInfo.setLayout(getElementLayout());
        {
            GridData data = new GridData(GridData.FILL_HORIZONTAL);
            packageAndInfo.setLayoutData(data);
        }

        fComboPackages = new Combo(packageAndInfo, SWT.READ_ONLY);
        {
            GridData data = new GridData();
            data.widthHint = COMBO_WIDTH_HINT;
            fComboPackages.setLayoutData(data);
        }
        fComboPackages.addSelectionListener(this);
        fLabelSymbolInPackages = new Label(packageAndInfo, SWT.NONE);
        {
            GridData data = new GridData(GridData.FILL_HORIZONTAL);
            data.grabExcessHorizontalSpace = true;
            fLabelSymbolInPackages.setLayoutData(data);
        }

        doUpdateServerList();
        /*
        if( fEvalServerManager.hasEvalServer() ) {
           fillKnownEvalServer(fComboServer);
           IEvalServer defaultServer = fEvalServerManager.getDefaultEvalServer();
           updatePackageCombo(defaultServer);
           updateSymbolCount(defaultServer);
        }*/

        //TableViewer

        fViewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        {
            GridData data = new GridData(GridData.FILL_BOTH);
            data.horizontalSpan = 2;
            fViewer.getControl().setLayoutData(data);
        }

        fViewer.setContentProvider(new AproposQueryResultContentProvider());
        fViewer.setLabelProvider(new AproposQueryResultLabelProvider());
        fViewer.setSorter(new AproposQueryResultSorter(AproposQueryResultSorter.TSortBy.DEFAULT));
        fViewer.setInput(getViewSite());
        fViewer.getTable().setHeaderVisible(true);
        fViewer.getTable().setLinesVisible(true);

        addColumns(fViewer);
        fEvalServerManager.addEvalServerManagementListener(this);
    }

    private void doUpdateServerList() {
        fComboServer.removeAll();
        if (fEvalServerManager.hasEnvironment()) {
            fillKnownEvalServer(fComboServer);
            IEnvironment defaultServer = fEvalServerManager.getDefaultEnvironment();
            updatePackageCombo(defaultServer);
            updateSymbolCount(defaultServer);
            updateConnectStatus(defaultServer);
        }
    }

    private void addColumns(final TableViewer viewer) {
        TableColumn column1 = makeColumn(viewer, SWT.CENTER, TSortBy.TYP);
        column1.setWidth(22);

        TableColumn column5 = makeColumn(viewer, SWT.LEFT, TSortBy.PACKAGE);
        column5.setText("Package");
        column5.setWidth(200);

        TableColumn column2 = makeColumn(viewer, SWT.LEFT, TSortBy.SYMBOL_NAME);
        column2.setText("Symbol");
        column2.setWidth(200);

        TableColumn column3 = makeColumn(viewer, SWT.LEFT, TSortBy.TYP);
        column3.setText("Type");
        column3.setWidth(75);

        TableColumn column4 = makeColumn(viewer, SWT.LEFT, TSortBy.ARGUMENTS);
        column4.setText("Arguments");
        column4.setWidth(250);

        TableColumn column6 = makeColumn(viewer, SWT.LEFT, TSortBy.DOCUMENTATION);
        column6.setText("Documentation");
        column6.setWidth(250);
    }

    private TableColumn makeColumn(final TableViewer viewer, final int style, final TSortBy sortBy) {
        TableColumn column = new TableColumn(viewer.getTable(), style);
        column.addSelectionListener(new ColumnSortListener(viewer, sortBy));
        return column;
    }

    private GridLayout getElementLayout() {
        GridLayout layout = new GridLayout(2, false);
        layout.verticalSpacing = 0;
        layout.marginHeight = 3;
        return layout;
    }

    private void fillKnownEvalServer(final Combo combo) {
        if (fEvalServerManager.hasEnvironment()) {
            for (IEnvironment server : fEvalServerManager.getEnvironments(true)) {
                combo.add(server.toString());
            }

            IEnvironment defaultServer = fEvalServerManager.getDefaultEnvironment();
            combo.setText(defaultServer.toString());
            updateConnectStatus(defaultServer);
        }
    }

    private void updateConnectStatus(final IEnvironment server) {
        if (server != null) {
            if (fEvalServerManager.isConnected(server)) {
                fConnectionState.setImage(LispUI.getUIImageManager().get(UIImageConstants.ICON_CONNECT));
            } else {
                fConnectionState.setImage(LispUI.getUIImageManager().get(UIImageConstants.ICON_DISCONNECT));
            }
        }
    }

    private void initPackageCombo() {
        fComboPackages.removeAll();
        fComboPackages.add(ALL_PACKAGES);
    }

    private void updatePackageCombo(final IEnvironment server) {
        ISymbolStore store = fEvalServerManager.getSymbolStoreFor(server);
        initPackageCombo();
        for (String pack : store.getPackages()) {
            fComboPackages.add(pack);
        }

        fComboPackages.select(0);
    }

    private void updateSymbolCount(final IEnvironment server) {
        ISymbolStore store = fEvalServerManager.getSymbolStoreFor(server);
        String pack = fComboPackages.getText();
        int count = 0;
        String text;
        if (pack.equals(ALL_PACKAGES)) {
            count = store.getSymbolCount();
            text = " symbols in " + ALL_PACKAGES;
        } else {
            count = store.getSymbolCount(pack);
            text = " symbols in package " + pack;
        }
        fLabelSymbolInPackages.setText(count + text);
    }

    private IEnvironment findEvalServer(final String selectedText) {
        for (IEnvironment server : fEvalServerManager.getEnvironments()) {
            if (selectedText.equals(server.toString())) {
                return server;
            }
        }
        return null;
    }

    //----- Interface SelectionListener
    public void widgetDefaultSelected(final SelectionEvent e) {
        //no-op
    }

    public void widgetSelected(final SelectionEvent e) {
        if (e.getSource() instanceof Combo) {
            comboSelection(e);
        } else {
            startSearch();
        }
    }
    //----- Ende Interface SelectionListener

    private void startSearch() {
        IEnvironment selectedServer = findEvalServer(fComboServer.getText());
        if (selectedServer == null) {
            return;
        }

        String queryString = fQueryText.getText();
        String pack = fComboPackages.getText();
        String[] words;
        if (queryString == null || queryString.trim().equals("")) { //nichts eingegeben
            words = new String[] { "" }; //alles als Treffer liefern
        } else {
            words = SPLIT_PATTERN.split(queryString);
        }

        ISymbolStore store = fEvalServerManager.getSymbolStoreFor(selectedServer);
        SortedSet<IMetaSymbol> result;
        if (ALL_PACKAGES.equals(pack)) {
            result = store.fullTextQuery(Arrays.asList(words), getSelectedSearchMode());
        } else {
            result = store.fullTextQuery(pack, Arrays.asList(words), getSelectedSearchMode());
        }

        fViewer.setInput(result);
    }

    private TSearchMode getSelectedSearchMode() {
        String text = fComboMode.getText();
        if (TEXT_MODE_AND.equals(text)) {
            return TSearchMode.MODE_AND;
        } else if (TEXT_MODE_OR.equals(text)) {
            return TSearchMode.MODE_OR;
        } else {
            return TSearchMode.MODE_NOT;
        }
    }

    private void comboSelection(final SelectionEvent e) {
        Combo combo = (Combo) e.getSource();

        String selectedText = fComboServer.getItem(fComboServer.getSelectionIndex());
        IEnvironment server = findEvalServer(selectedText);
        if (server == null) {
            return;
        }

        if (combo == fComboServer) {
            fViewer.setInput(EMPTY_INPUT);
            updateConnectStatus(server);
            updatePackageCombo(server);
            updateSymbolCount(server);
        } else if (combo == fComboPackages) {
            updateSymbolCount(server);
        }
    }

    //----- Interface IEvalServerManagementListener
    public void connect(final IEnvironment server) {
        if (server.toString().equals(fComboServer.getText())) {
            updateConnectStatus(server);
        }
    }

    public void disconnect(final IEnvironment server) {
        doUpateServerState(server);
    }

    public void initialized(final IEnvironment server) {
        doUpateServerState(server);
    }

    public void startup(final IEnvironment server) {
        //no-op
    }

    public void serverAdded(final IEnvironment server) {
        doUpdateServerList();
    }

    public void serverRemoved(final IEnvironment server) {
        doUpdateServerList();
    }

    public void defaultChanged(IEnvironment newDefault) {
        //no-op
    }

    private void doUpateServerState(final IEnvironment server) {
        if (server.toString().equals(fComboServer.getText())) {
            updateConnectStatus(server);
            updatePackageCombo(server);
            updateSymbolCount(server);
        }
    }

    //----- Ende Interface IEvalServerManagementListener

    @Override
    public void setFocus() {
        fViewer.getControl().setFocus();
    }

    @Override
    public void dispose() {
        if (fEvalServerManager != null) {
            fEvalServerManager.removeEvalServerManagementListener(this);
        }
    }
}