Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/IntegerMask.java')
-rw-r--r--plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/IntegerMask.java216
1 files changed, 216 insertions, 0 deletions
diff --git a/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/IntegerMask.java b/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/IntegerMask.java
new file mode 100644
index 00000000000..de609cd4b74
--- /dev/null
+++ b/plugins/infra/ui/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/editors/IntegerMask.java
@@ -0,0 +1,216 @@
+/*****************************************************************************
+ * Copyright (c) 2011 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Thibault Le Ouay t.leouay@sherpa-eng.com - Add binding implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.widgets.editors;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.papyrus.infra.widgets.Activator;
+import org.eclipse.papyrus.infra.widgets.messages.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+public class IntegerMask extends AbstractValueEditor implements SelectionListener, IChangeListener, DisposeListener {
+
+ private Button[] checkboxes;
+
+ private int currentValue;
+
+ private final Composite checkboxContainer;
+
+ private boolean refreshCheckboxes = true;
+
+ public IntegerMask(final Composite parent, final int style) {
+ super(parent, style);
+ checkboxContainer = new Composite(this, style);
+ checkboxContainer.setLayoutData(getDefaultLayoutData());
+ checkboxContainer.setLayout(new GridLayout(2, true));
+ checkboxContainer.addDisposeListener(this);
+ }
+
+ @Override
+ protected GridData getLabelLayoutData() {
+ GridData data = super.getLabelLayoutData();
+ data.verticalAlignment = SWT.BEGINNING;
+ return data;
+ }
+
+ @Override
+ public Object getValue() {
+ int totalValue = 0;
+ for (Button button : checkboxes) {
+ int value = (Integer) button.getData("IntValue"); //$NON-NLS-1$
+ if (button.getSelection()) {
+ totalValue |= value;
+ }
+ }
+ return totalValue;
+ }
+
+ @Override
+ public void dispose() {
+ if (modelProperty != null) {
+ modelProperty.removeChangeListener(this);
+ }
+ super.dispose();
+ }
+
+ @Override
+ public Object getEditableType() {
+ return Integer.class;
+ }
+
+ @Override
+ public void setReadOnly(final boolean readOnly) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean isReadOnly() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void setMasks(final String[] values) {
+ Map<Integer, String> masks = new HashMap<Integer, String>();
+ int intValue = 1;
+ for (String value : values) {
+ masks.put(intValue, value);
+ intValue <<= 1;
+ }
+ setMasks(masks);
+ }
+
+ public void setMasks(final Map<Integer, String> values) {
+ if (values.size() > 32) {
+ StringLabel label = new StringLabel(checkboxContainer, SWT.NONE);
+ label.getValueLabel().setImage(Activator.getDefault().getImage("/icons/error.gif")); //$NON-NLS-1$
+ label.getValueLabel().setText(Messages.IntegerMask_ErrorTooManyValues);
+ checkboxes = new Button[0];
+ } else {
+ if (checkboxes != null) {
+ disposeCheckboxes();
+ }
+
+ checkboxes = new Button[values.size()];
+
+ int i = 0;
+ for (Entry<Integer, String> mask : values.entrySet()) {
+ int intValue = mask.getKey();
+ String value = mask.getValue();
+ checkboxes[i] = new Button(checkboxContainer, SWT.CHECK);
+ checkboxes[i].setText(value);
+ checkboxes[i].setData("IntValue", intValue); //$NON-NLS-1$
+ checkboxes[i].addSelectionListener(this);
+ i++;
+ }
+ }
+ }
+
+ protected void disposeCheckboxes() {
+ for (Button button : checkboxes) {
+ button.removeSelectionListener(this);
+ button.dispose();
+ }
+ }
+
+ public void setNumColumns(final int numColumns) {
+ ((GridLayout) checkboxContainer.getLayout()).numColumns = numColumns;
+ checkboxContainer.layout();
+ layout();
+ }
+
+ @Override
+ public void doBinding() {
+ // We don't do a real databinding here
+ modelProperty.addChangeListener(this);
+
+ refreshCheckboxes();
+ }
+
+ protected void refreshCheckboxes() {
+ if (!refreshCheckboxes) {
+ return;
+ }
+
+ int totalValue = getCurrentValue();
+ for (Button button : checkboxes) {
+ int value = (Integer) button.getData("IntValue"); //$NON-NLS-1$
+ button.setSelection((totalValue & value) != 0);
+ }
+ }
+
+ @Override
+ public void setToolTipText(final String text) {
+ super.setLabelToolTipText(text);
+ }
+
+ @Override
+ public void widgetSelected(final SelectionEvent e) {
+ Button button = (Button) e.widget;
+ int value = (Integer) button.getData("IntValue"); //$NON-NLS-1$
+ int totalValue = getCurrentValue();
+ if (button.getSelection()) {
+ totalValue |= value;
+ } else {
+ totalValue &= ~value;
+ }
+ setCurrentValue(totalValue);
+ }
+
+ protected void setCurrentValue(final int value) {
+ if (modelProperty != null) {
+ refreshCheckboxes = false;
+ modelProperty.setValue(value);
+ refreshCheckboxes = true;
+ }
+ currentValue = value;
+
+ commit();
+ }
+
+ protected Integer getCurrentValue() {
+ if (modelProperty != null) {
+ Object value = modelProperty.getValue();
+ return value == null ? 0 : (Integer) value;
+ } else {
+ return currentValue;
+ }
+ }
+
+ @Override
+ public void widgetDefaultSelected(final SelectionEvent e) {
+ // Nothing
+ }
+
+ public int getNumColumns() {
+ return ((GridLayout) checkboxContainer.getLayout()).numColumns;
+ }
+
+ @Override
+ public void handleChange(final ChangeEvent event) {
+ refreshCheckboxes();
+ }
+
+
+}

Back to the top