blob: 5e1e7029ff84656c5add6d69068ee528485498da [file] [log] [blame]
/*
* 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) {
}
}