| /* |
| * 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) { |
| } |
| } |