From 82ab3761802e80a6cac747dc5cea0dc0eba4db62 Mon Sep 17 00:00:00 2001 From: Oleg Krasilnikov Date: Fri, 27 Apr 2007 09:06:34 +0000 Subject: [PATCH] Bug #182450 : TriButton update --- .../cdt/ui/newui/AbstractCPropertyTab.java | 21 ++---- .../org/eclipse/cdt/ui/newui/TriButton.java | 75 +++++++++++++++++-- 2 files changed, 75 insertions(+), 21 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java index 485979619b8..f39defb909f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/AbstractCPropertyTab.java @@ -325,34 +325,25 @@ public abstract class AbstractCPropertyTab implements ICPropertyTab { setupControl(b, span, mode); b.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { - triButtonPressed(event); + checkPressed(event); }}); return b; } /** - * Selection handler for checkbox created by method "setupCheck()" - * Descendants should override this method if they use "setupCheck". + * Selection handler for checkbox created + * by methods "setupCheck()" or "setupTri()" + * Descendants should override this method + * if they use "setupCheck". * Usually the method body will look like: * { - * Button b = (Button)e.widget; + * Control b = (Control)e.widget; * if (b.equals(myFirstCheckbox) { ... } * else if (b.equals(mySecondCheckbox) { ... } * ... } */ protected void checkPressed(SelectionEvent e) {} - /** - * Substitutes combo or button - * with its parent (triButton) - * @param e - */ - protected void triButtonPressed(SelectionEvent e) { - Control w = (Control)e.widget; - e.widget = w.getParent(); - checkPressed(e); - } - protected void setupControl(Control c, int span, int mode) { // although we use GridLayout usually, // exceptions can occur: do nothing. diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/TriButton.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/TriButton.java index 793203691a7..72f9a6e706d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/TriButton.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/TriButton.java @@ -1,6 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2007 Intel Corporation and others. + * 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: + * Intel Corporation - initial API and implementation + *******************************************************************************/ package org.eclipse.cdt.ui.newui; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; @@ -8,9 +25,10 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; -public class TriButton extends Composite { +public class TriButton extends Composite implements SelectionListener { private static final String[] ITEMS = {"No", "Yes", "?"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ public static final int NO = 0; @@ -21,7 +39,12 @@ public class TriButton extends Composite { private Button button = null; private Combo combo = null; private Label label = null; - + private List listeners = new LinkedList(); + + public TriButton(Composite parent, int style) { + this(parent, style, true); + } + public TriButton(Composite parent, int style, boolean _triMode) { super(parent, style); triMode = _triMode; @@ -30,12 +53,20 @@ public class TriButton extends Composite { combo = new Combo(this, style | SWT.READ_ONLY | SWT.DROP_DOWN); combo.setLayoutData(new GridData(GridData.BEGINNING)); combo.setItems(ITEMS); + combo.addSelectionListener(this); label = new Label(this, SWT.NONE); label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + label.addMouseListener(new MouseListener() { + public void mouseDoubleClick(MouseEvent e) {} + public void mouseDown(MouseEvent e) {} + public void mouseUp(MouseEvent e) { + processMouseUp(e); + }}); } else { setLayout(new GridLayout()); button = new Button(this, style | SWT.CHECK); button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + button.addSelectionListener(this); } } @@ -94,12 +125,44 @@ public class TriButton extends Composite { } public void addSelectionListener (SelectionListener listener) { - if (triMode) combo.addSelectionListener(listener); - else button.addSelectionListener(listener); + listeners.add(listener); } public void removeSelectionListener (SelectionListener listener) { - if (triMode) combo.removeSelectionListener(listener); - else button.removeSelectionListener(listener); + listeners.remove(listener); + } + + public void widgetDefaultSelected(SelectionEvent e) { + e.widget = this; + Iterator it = listeners.iterator(); + while (it.hasNext()) + ((SelectionListener)it.next()).widgetDefaultSelected(e); + } + public void widgetSelected(SelectionEvent e) { + e.widget = this; + Iterator it = listeners.iterator(); + while (it.hasNext()) + ((SelectionListener)it.next()).widgetSelected(e); } + private void processMouseUp(MouseEvent me) { + int x = combo.getSelectionIndex() + 1; + if (x < 0 || x > 2) x = 0; + combo.select(x); + + Event e = new Event(); + e.button = me.button; + e.count = me.count; + e.data = me.data; + e.display = me.display; + e.stateMask = me.stateMask; + e.time = me.time; + e.x = me.x; + e.y = me.y; + e.type = SWT.Selection; + e.doit = true; + e.item = this; + e.widget = this; + SelectionEvent se = new SelectionEvent(e); + widgetSelected(se); + } }