com.iw.plugins.spindle.ui.PublicStaticFieldSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.iw.plugins.spindle.ui.PublicStaticFieldSelectionDialog.java

Source

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Spindle, an Eclipse Plugin for Tapestry.
 *
 * The Initial Developer of the Original Code is
 * Intelligent Works Incorporated.
 * Portions created by the Initial Developer are Copyright (C) 2002
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * 
 *  glongman@intelligentworks.com
 *
 * ***** END LICENSE BLOCK ***** */
package com.iw.plugins.spindle.ui;

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

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.SelectionDialog;

import com.iw.plugins.spindle.TapestryPlugin;
import com.iw.plugins.spindle.ui.dialogfields.DialogField;
import com.iw.plugins.spindle.ui.dialogfields.IDialogFieldChangedListener;
import com.iw.plugins.spindle.ui.dialogfields.StringButtonField;

public class PublicStaticFieldSelectionDialog extends TitleAreaDialog {

    private boolean editing;
    private StringButtonField typeField;
    private Table fields;

    private DialogAdapter adapter = new DialogAdapter();
    private ILabelProvider fieldRenderer = new JavaElementLabelProvider();

    private String dialogResult;
    private String existingBinding;
    private IJavaProject jproject;

    /**
     * Constructor for typeFieldDialog
     */
    public PublicStaticFieldSelectionDialog(Shell shell, IJavaProject project) {
        super(shell);
        this.jproject = project;
    }

    public PublicStaticFieldSelectionDialog(Shell shell, IJavaProject project, String existingBinding) {
        this(shell, project);
        this.existingBinding = existingBinding;
    }

    /**
     * @see AbstractDialog#createAreaContents(Composite)
     */
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);

        Composite innerContainer = new Composite(container, SWT.NONE);
        FormLayout layout = new FormLayout();
        layout.marginHeight = 4;
        layout.marginWidth = 4;
        innerContainer.setLayout(layout);

        //our container is embedded in a GridLayout 
        GridData gd = new GridData();
        gd.widthHint = 500;
        gd.heightHint = 300;

        innerContainer.setLayoutData(gd);

        typeField = new StringButtonField("Type:", 64);
        typeField.addListener(adapter);

        Control typeFieldControl = typeField.getControl(innerContainer);
        Text text = typeField.getTextControl(innerContainer);
        text.setEditable(false);
        text.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));

        FormData formData = new FormData();
        formData.top = new FormAttachment(0, 0);
        formData.left = new FormAttachment(0, 0);
        formData.right = new FormAttachment(100, 0);
        typeFieldControl.setLayoutData(formData);

        Control fieldListControl = createFieldList(innerContainer);

        formData = new FormData();
        formData.top = new FormAttachment(typeFieldControl, 4);
        formData.left = new FormAttachment(0, 0);
        formData.right = new FormAttachment(100, 0);
        formData.bottom = new FormAttachment(100, 0);
        fieldListControl.setLayoutData(formData);

        if (existingBinding != null) {
            populateFromExistingBinding();
        }

        setTitle("Choose Field Value");
        setMessage("Choose a Type and one of it public static fields", IMessageProvider.NONE);

        return container;
    }

    private Control createFieldList(Composite parent) {

        Composite container = new Composite(parent, SWT.NULL);
        FormLayout layout = new FormLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        container.setLayout(layout);

        Label label = new Label(container, SWT.NONE);
        label.setText("Fields:");

        FormData formData = new FormData();
        formData.width = 64;
        formData.top = new FormAttachment(0, 0);
        formData.left = new FormAttachment(0, 0);
        label.setLayoutData(formData);

        Table list = new Table(container, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);

        list.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event evt) {
                handleFieldSelectionChanged();
            }
        });

        list.addListener(SWT.MouseDoubleClick, new Listener() {
            public void handleEvent(Event evt) {
                handleDefaultSelected();
            }
        });

        list.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                fieldRenderer.dispose();
            }
        });

        formData = new FormData(300, 200);
        formData.top = new FormAttachment(0, 0);
        formData.left = new FormAttachment(label, 4);
        formData.right = new FormAttachment(100, 0);
        formData.bottom = new FormAttachment(100, 0);
        list.setLayoutData(formData);

        fields = list;

        return container;
    }

    private void populateFromExistingBinding() {

        int index = existingBinding.lastIndexOf(".");
        if (index > 0) {

            String qualifiedClass = existingBinding.substring(0, index);
            String fieldname = existingBinding.substring(index + 1);
            IType type = null;

            try {
                type = jproject.findType(qualifiedClass);
            } catch (JavaModelException e) {
                TapestryPlugin.getDefault().logException(e);
            }

            if (type != null) {

                typeField.setTextValue(qualifiedClass);
                updateFieldList(type);
                TableItem[] items = fields.getItems();
                TableItem found = null;

                int newSelection = -1;
                for (int i = 0; i < items.length; i++) {
                    if (items[i].getText().equals(fieldname)) {
                        newSelection = i;
                        found = items[i];
                        break;
                    }
                }

                if (newSelection >= 0) {
                    fields.select(newSelection);
                    fields.showItem(found);
                }
            }
        }
    }

    private void updateFieldList(IType type) {
        setErrorMessage("");
        List list = new ArrayList();
        try {

            IField[] foundFields = type.getFields();
            for (int i = 0; i < foundFields.length; i++) {
                int flags = foundFields[i].getFlags();
                if (Flags.isStatic(flags) && Flags.isPublic(flags)) {
                    list.add(foundFields[i]);
                }
            }
        } catch (JavaModelException jmex) {
            setErrorMessage("An error occured looking for fields in " + type.getElementName());
        }
        Object[] elements = list.toArray();
        int size = elements.length;
        if (size == 0) {
            setErrorMessage(type.getElementName() + "has no public static fields. choose another");
        }
        fields.setRedraw(false);
        int itemCount = fields.getItemCount();
        if (size < itemCount) {
            fields.remove(0, itemCount - size - 1);
        }
        TableItem[] items = fields.getItems();
        for (int i = 0; i < size; i++) {
            TableItem ti = null;
            if (i < itemCount) {
                ti = items[i];
            } else {
                ti = new TableItem(fields, i);
            }
            Image img = null;
            if (elements[i] instanceof IJavaElement) {
                ti.setText(fieldRenderer.getText(elements[i]));
                img = fieldRenderer.getImage(elements[i]);
            } else {
                ti.setText(elements[i].toString());
            }
            if (img != null) {
                ti.setImage(img);
            }
            ti.setData(elements[i]);
        }
        if (fields.getItemCount() > 0) {
            fields.setSelection(0);
        }
        fields.setRedraw(true);
        //    update();
    }

    private IField getSelectedField() {
        int index = fields.getSelectionIndex();
        if (index >= 0) {
            return (IField) fields.getItem(index).getData();
        }
        return null;
    }

    private void handleFieldSelectionChanged() {
        okToClose();
    }

    private void handleDefaultSelected() {
        if (okToClose()) {
            close();
        }
    }

    /**
     * @see AbstractDialog#performCancel()
     */
    protected boolean performCancel() {
        setReturnCode(CANCEL);
        return true;

    }

    protected void cancelPressed() {
        performCancel();
        close();
    }

    public boolean close() {
        return super.close();
    }

    protected boolean okToClose() {
        String typeName = typeField.getTextValue();
        IField selectedField = getSelectedField();
        if (typeName == null || "".equals(typeName) || selectedField == null) {
            setReturnCode(CANCEL);
            dialogResult = null;
            return false;
        }
        dialogResult = typeName + "." + getSelectedField().getElementName();
        setReturnCode(OK);
        return true;
    }

    public String getDialogResult() {
        return dialogResult;
    }

    protected class DialogAdapter implements IDialogFieldChangedListener {

        public void dialogFieldChanged(DialogField field) {
            okToClose();
        }

        /**
         * @see IDialogFieldChangedListener#dialogFieldButtonPressed(DialogField)
         */
        public void dialogFieldButtonPressed(DialogField field) {
            try {
                SelectionDialog dialog = JavaUI.createTypeDialog(getShell(), new ProgressMonitorDialog(getShell()),
                        SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_CLASSES, false);
                dialog.setMessage("");
                int result = dialog.open();
                if (result == SelectionDialog.OK) {
                    IType chosenType = (IType) dialog.getResult()[0];
                    typeField.setTextValue(chosenType.getFullyQualifiedName());
                    updateFieldList(chosenType);
                }
            } catch (JavaModelException jmex) {
                TapestryPlugin.getDefault().logException(jmex);
            }
        }

        /**
         * @see IDialogFieldChangedListener#dialogFieldStatusChanged(IStatus, DialogField)
         */
        public void dialogFieldStatusChanged(IStatus status, DialogField field) {
        }

    }
    //
    //  /*
    //   * @see Window#getInitialSize()
    //   */
    //  protected Point getInitialSize() {
    //    return new Point(525, 450);
    //  }

}