com.android.ide.eclipse.adt.internal.editors.layout.properties.FlagXmlPropertyDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.adt.internal.editors.layout.properties.FlagXmlPropertyDialog.java

Source

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (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.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.ide.eclipse.adt.internal.editors.layout.properties;

import com.android.annotations.NonNull;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.google.common.base.Splitter;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils;
import org.eclipse.wb.internal.core.utils.execution.RunnableEx;
import org.eclipse.wb.internal.core.utils.ui.dialogs.ResizableDialog;

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

class FlagXmlPropertyDialog extends ResizableDialog
        implements IStructuredContentProvider, ICheckStateListener, SelectionListener, KeyListener {
    private final String mTitle;
    private final XmlProperty mProperty;
    private final String[] mFlags;
    private final boolean mIsRadio;

    private Table mTable;
    private CheckboxTableViewer mViewer;

    FlagXmlPropertyDialog(@NonNull Shell parentShell, @NonNull String title, boolean isRadio,
            @NonNull String[] flags, @NonNull XmlProperty property) {
        super(parentShell, AdtPlugin.getDefault());
        mTitle = title;
        mIsRadio = isRadio;
        mFlags = flags;
        mProperty = property;
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(mTitle);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);

        mViewer = CheckboxTableViewer.newCheckList(container, SWT.BORDER | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
        mTable = mViewer.getTable();
        mTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        Composite workaround = PropertyFactory.addWorkaround(container);
        if (workaround != null) {
            workaround.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
        }

        mViewer.setContentProvider(this);
        mViewer.setInput(mFlags);

        String current = mProperty.getStringValue();
        if (current != null) {
            Object[] checked = null;
            if (mIsRadio) {
                checked = new String[] { current };
            } else {
                List<String> flags = new ArrayList<String>();
                for (String s : Splitter.on('|').omitEmptyStrings().trimResults().split(current)) {
                    flags.add(s);
                }
                checked = flags.toArray(new String[flags.size()]);
            }
            mViewer.setCheckedElements(checked);
        }
        if (mFlags.length > 0) {
            mTable.setSelection(0);
        }

        if (mIsRadio) {
            // Enforce single-item selection
            mViewer.addCheckStateListener(this);
        }
        mTable.addSelectionListener(this);
        mTable.addKeyListener(this);

        return container;
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    @Override
    protected Point getDefaultSize() {
        return new Point(450, 400);
    }

    @Override
    protected void okPressed() {
        // Apply the value
        ExecutionUtils.runLog(new RunnableEx() {
            @Override
            public void run() throws Exception {
                StringBuilder sb = new StringBuilder(30);
                for (Object o : mViewer.getCheckedElements()) {
                    if (sb.length() > 0) {
                        sb.append('|');
                    }
                    sb.append((String) o);
                }
                String value = sb.length() > 0 ? sb.toString() : null;
                mProperty.setValue(value);
            }
        });

        // close dialog
        super.okPressed();
    }

    // ---- Implements IStructuredContentProvider ----

    @Override
    public Object[] getElements(Object inputElement) {
        return (Object[]) inputElement;
    }

    @Override
    public void dispose() {
    }

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

    // ---- Implements ICheckStateListener ----

    @Override
    public void checkStateChanged(CheckStateChangedEvent event) {
        // Try to disable other elements that conflict with this
        boolean isChecked = event.getChecked();
        if (isChecked) {
            Object selected = event.getElement();
            for (Object other : mViewer.getCheckedElements()) {
                if (other != selected) {
                    mViewer.setChecked(other, false);
                }
            }
        } else {

        }
    }

    // ---- Implements SelectionListener ----

    @Override
    public void widgetSelected(SelectionEvent e) {
    }

    @Override
    public void widgetDefaultSelected(SelectionEvent e) {
        if (e.item instanceof TableItem) {
            TableItem item = (TableItem) e.item;
            item.setChecked(!item.getChecked());
        }
    }

    // ---- Implements KeyListener ----

    @Override
    public void keyPressed(KeyEvent e) {
        // Let space toggle checked state
        if (e.keyCode == ' ' /* SWT.SPACE requires Eclipse 3.7 */) {
            if (mTable.getSelectionCount() == 1) {
                TableItem item = mTable.getSelection()[0];
                item.setChecked(!item.getChecked());
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}