Changeset 213:36f5cb12e1a2 for dwt/custom/CCombo.d
- Timestamp:
- 05/17/08 11:34:28 (8 months ago)
- Files:
-
- dwt/custom/CCombo.d (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
dwt/custom/CCombo.d
r212 r213 52 52 static import tango.text.convert.Format; 53 53 import dwt.dwthelper.utils; 54 import dwt.dwthelper.Runnable; 54 55 55 56 /** … … 153 154 } 154 155 if (getShell () is event.widget) { 155 handleFocus (DWT.FocusOut); 156 getDisplay().asyncExec(new class() Runnable { 157 public void run() { 158 if (isDisposed()) return; 159 handleFocus (DWT.FocusOut); 160 } 161 }); 156 162 } 157 163 } … … 166 172 }; 167 173 168 int [] comboEvents = [DWT.Dispose, DWT. Move, DWT.Resize];174 int [] comboEvents = [DWT.Dispose, DWT.FocusIn, DWT.Move, DWT.Resize]; 169 175 for (int i=0; i<comboEvents.length; i++) this.addListener (comboEvents [i], listener); 170 176 171 int [] textEvents = [DWT. KeyDown, DWT.KeyUp, DWT.MenuDetect, DWT.Modify, DWT.MouseDown, DWT.MouseUp, DWT.Traverse, DWT.FocusIn, DWT.Verify];177 int [] textEvents = [DWT.DefaultSelection, DWT.KeyDown, DWT.KeyUp, DWT.MenuDetect, DWT.Modify, DWT.MouseDown, DWT.MouseUp, DWT.MouseDoubleClick, DWT.MouseWheel, DWT.Traverse, DWT.FocusIn, DWT.Verify]; 172 178 for (int i=0; i<textEvents.length; i++) text.addListener (textEvents [i], listener); 173 179 174 int [] arrowEvents = [DWT. Selection, DWT.FocusIn];180 int [] arrowEvents = [DWT.MouseDown, DWT.MouseUp, DWT.Selection, DWT.FocusIn]; 175 181 for (int i=0; i<arrowEvents.length; i++) arrow.addListener (arrowEvents [i], listener); 176 182 … … 180 186 static int checkStyle (int style) { 181 187 int mask = DWT.BORDER | DWT.READ_ONLY | DWT.FLAT | DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT; 182 return style & mask;188 return DWT.NO_FOCUS | (style & mask); 183 189 } 184 190 /** … … 319 325 break; 320 326 } 327 case DWT.MouseDown: { 328 Event mouseEvent = new Event (); 329 mouseEvent.button = event.button; 330 mouseEvent.count = event.count; 331 mouseEvent.stateMask = event.stateMask; 332 mouseEvent.time = event.time; 333 mouseEvent.x = event.x; mouseEvent.y = event.y; 334 notifyListeners (DWT.MouseDown, mouseEvent); 335 event.doit = mouseEvent.doit; 336 break; 337 } 338 case DWT.MouseUp: { 339 Event mouseEvent = new Event (); 340 mouseEvent.button = event.button; 341 mouseEvent.count = event.count; 342 mouseEvent.stateMask = event.stateMask; 343 mouseEvent.time = event.time; 344 mouseEvent.x = event.x; mouseEvent.y = event.y; 345 notifyListeners (DWT.MouseUp, mouseEvent); 346 event.doit = mouseEvent.doit; 347 break; 348 } 321 349 case DWT.Selection: { 350 text.setFocus(); 322 351 dropDown (!isDropped ()); 323 352 break; … … 363 392 list = null; 364 393 arrow = null; 394 break; 395 case DWT.FocusIn: 396 Control focusControl = getDisplay ().getFocusControl (); 397 if (focusControl is arrow || focusControl is list) return; 398 if (isDropped()) { 399 list.setFocus(); 400 } else { 401 text.setFocus(); 402 } 365 403 break; 366 404 case DWT.Move: … … 466 504 public void deselect (int index) { 467 505 checkWidget (); 468 list.deselect (index); 506 if (0 <= index && index < list.getItemCount () && 507 index is list.getSelectionIndex() && 508 text.getText().equals(list.getItem(index))) { 509 text.setText(""); //$NON-NLS-1$ 510 list.deselect (index); 511 } 469 512 } 470 513 /** … … 484 527 public void deselectAll () { 485 528 checkWidget (); 529 text.setText(""); //$NON-NLS-1$ 486 530 list.deselectAll (); 487 531 } … … 490 534 if (!drop) { 491 535 popup.setVisible (false); 492 if (!isDisposed () && arrow.isFocusControl()) {536 if (!isDisposed () && isFocusControl()) { 493 537 text.setFocus(); 494 538 } … … 528 572 popup.setBounds (x, y, width, height); 529 573 popup.setVisible (true); 530 list.setFocus ();574 if (isFocusControl()) list.setFocus (); 531 575 } 532 576 /* … … 655 699 checkWidget (); 656 700 return list.getItems (); 701 } 702 /** 703 * Returns <code>true</code> if the receiver's list is visible, 704 * and <code>false</code> otherwise. 705 * <p> 706 * If one of the receiver's ancestors is not visible or some 707 * other condition makes the receiver not visible, this method 708 * may still indicate that it is considered visible even though 709 * it may not actually be showing. 710 * </p> 711 * 712 * @return the receiver's list's visibility state 713 * 714 * @exception DWTException <ul> 715 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> 716 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> 717 * </ul> 718 * 719 * @since 3.4 720 */ 721 public bool getListVisible () { 722 checkWidget (); 723 return isDropped(); 657 724 } 658 725 public override Menu getMenu() { … … 906 973 public void getLocation (AccessibleControlEvent e) { 907 974 Rectangle location = getBounds (); 908 Point pt = toDisplay (location.x, location.y);975 Point pt = getParent().toDisplay (location.x, location.y); 909 976 e.x = pt.x; 910 977 e.y = pt.y; … … 1003 1070 event.doit = false; 1004 1071 break; 1072 case DWT.TRAVERSE_TAB_NEXT: 1073 case DWT.TRAVERSE_TAB_PREVIOUS: 1074 event.doit = text.traverse(event.detail); 1075 event.detail = DWT.TRAVERSE_NONE; 1076 if (event.doit) dropDown(false); 1077 return; 1005 1078 default: 1006 1079 } … … 1094 1167 * it again. To prevent the popup from showing again, we will let the selection 1095 1168 * event of the arrow button hide the popup. 1169 * In Windows, hiding the popup during the deactivate causes the deactivate 1170 * to be called twice and the selection event to be disappear. 1096 1171 */ 1097 if ( "gtk".equals(DWT.getPlatform())) {1172 if (!"carbon".equals(DWT.getPlatform())) { 1098 1173 Point point = arrow.toControl(getDisplay().getCursorLocation()); 1099 1174 Point size = arrow.getSize(); … … 1318 1393 public override bool setFocus () { 1319 1394 checkWidget(); 1395 if (!isEnabled () || !isVisible ()) return false; 1320 1396 if (isFocusControl ()) return true; 1321 1397 return text.setFocus (); … … 1394 1470 checkWidget (); 1395 1471 return; 1472 } 1473 /** 1474 * Marks the receiver's list as visible if the argument is <code>true</code>, 1475 * and marks it invisible otherwise. 1476 * <p> 1477 * If one of the receiver's ancestors is not visible or some 1478 * other condition makes the receiver not visible, marking 1479 * it visible may not actually cause it to be displayed. 1480 * </p> 1481 * 1482 * @param visible the new visibility state 1483 * 1484 * @exception DWTException <ul> 1485 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> 1486 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> 1487 * </ul> 1488 * 1489 * @since 3.4 1490 */ 1491 public void setListVisible (bool visible) { 1492 checkWidget (); 1493 dropDown(visible); 1396 1494 } 1397 1495 public override void setMenu(Menu menu) { … … 1527 1625 break; 1528 1626 } 1627 case DWT.DefaultSelection: { 1628 dropDown (false); 1629 Event e = new Event (); 1630 e.time = event.time; 1631 e.stateMask = event.stateMask; 1632 notifyListeners (DWT.DefaultSelection, e); 1633 break; 1634 } 1529 1635 case DWT.KeyDown: { 1530 1636 Event keyEvent = new Event (); … … 1537 1643 event.doit = keyEvent.doit; 1538 1644 if (!event.doit) break; 1539 1540 if (event.character is DWT.CR) {1541 dropDown (false);1542 Event selectionEvent = new Event ();1543 selectionEvent.time = event.time;1544 selectionEvent.stateMask = event.stateMask;1545 notifyListeners (DWT.DefaultSelection, selectionEvent);1546 if (isDisposed ()) break;1547 }1548 1549 1645 if (event.keyCode is DWT.ARROW_UP || event.keyCode is DWT.ARROW_DOWN) { 1550 1646 event.doit = false; … … 1600 1696 } 1601 1697 case DWT.MouseDown: { 1698 Event mouseEvent = new Event (); 1699 mouseEvent.button = event.button; 1700 mouseEvent.count = event.count; 1701 mouseEvent.stateMask = event.stateMask; 1702 mouseEvent.time = event.time; 1703 mouseEvent.x = event.x; mouseEvent.y = event.y; 1704 notifyListeners (DWT.MouseDown, mouseEvent); 1705 if (isDisposed ()) break; 1706 event.doit = mouseEvent.doit; 1707 if (!event.doit) break; 1602 1708 if (event.button !is 1) return; 1603 1709 if (text.getEditable ()) return; … … 1609 1715 } 1610 1716 case DWT.MouseUp: { 1717 Event mouseEvent = new Event (); 1718 mouseEvent.button = event.button; 1719 mouseEvent.count = event.count; 1720 mouseEvent.stateMask = event.stateMask; 1721 mouseEvent.time = event.time; 1722 mouseEvent.x = event.x; mouseEvent.y = event.y; 1723 notifyListeners (DWT.MouseUp, mouseEvent); 1724 if (isDisposed ()) break; 1725 event.doit = mouseEvent.doit; 1726 if (!event.doit) break; 1611 1727 if (event.button !is 1) return; 1612 1728 if (text.getEditable ()) return; … … 1614 1730 break; 1615 1731 } 1732 case DWT.MouseDoubleClick: { 1733 Event mouseEvent = new Event (); 1734 mouseEvent.button = event.button; 1735 mouseEvent.count = event.count; 1736 mouseEvent.stateMask = event.stateMask; 1737 mouseEvent.time = event.time; 1738 mouseEvent.x = event.x; mouseEvent.y = event.y; 1739 notifyListeners (DWT.MouseDoubleClick, mouseEvent); 1740 break; 1741 } 1742 case DWT.MouseWheel: { 1743 Event keyEvent = new Event (); 1744 keyEvent.time = event.time; 1745 keyEvent.keyCode = event.count > 0 ? DWT.ARROW_UP : DWT.ARROW_DOWN; 1746 keyEvent.stateMask = event.stateMask; 1747 notifyListeners (DWT.KeyDown, keyEvent); 1748 if (isDisposed ()) break; 1749 event.doit = keyEvent.doit; 1750 if (!event.doit) break; 1751 if (event.count !is 0) { 1752 event.doit = false; 1753 int oldIndex = getSelectionIndex (); 1754 if (event.count > 0) { 1755 select (Math.max (oldIndex - 1, 0)); 1756 } else { 1757 select (Math.min (oldIndex + 1, getItemCount () - 1)); 1758 } 1759 if (oldIndex !is getSelectionIndex ()) { 1760 Event e = new Event(); 1761 e.time = event.time; 1762 e.stateMask = event.stateMask; 1763 notifyListeners (DWT.Selection, e); 1764 } 1765 if (isDisposed ()) break; 1766 } 1767 break; 1768 } 1616 1769 case DWT.Traverse: { 1617 1770 switch (event.detail) { 1618 case DWT.TRAVERSE_RETURN:1619 1771 case DWT.TRAVERSE_ARROW_PREVIOUS: 1620 1772 case DWT.TRAVERSE_ARROW_NEXT: … … 1624 1776 event.doit = false; 1625 1777 break; 1778 case DWT.TRAVERSE_TAB_PREVIOUS: 1779 event.doit = traverse(DWT.TRAVERSE_TAB_PREVIOUS); 1780 event.detail = DWT.TRAVERSE_NONE; 1781 return; 1626 1782 default: 1627 1783 } 1628 1629 1784 Event e = new Event (); 1630 1785 e.time = event.time;
