EmptyTablePlaceholder.java
上传用户:hengxinggs
上传日期:2008-01-15
资源大小:212k
文件大小:6k
源码类别:

PlugIns编程

开发平台:

Java

  1. /*
  2.  * Copyright (C) 2005 David Orme <djo@coconut-palm-software.com>
  3.  * 
  4.  * All rights reserved. This program and the accompanying materials
  5.  * are made available under the terms of the Eclipse Public License v1.0
  6.  * which accompanies this distribution, and is available at
  7.  * http://www.eclipse.org/legal/epl-v10.html
  8.  *
  9.  * Contributors:
  10.  *     David Orme     - Initial API and implementation
  11.  */
  12. package org.eclipse.jface.examples.databinding.compositetable.internal;
  13. import org.eclipse.jface.examples.databinding.compositetable.InternalCompositeTable;
  14. import org.eclipse.swt.SWT;
  15. import org.eclipse.swt.events.ControlAdapter;
  16. import org.eclipse.swt.events.ControlEvent;
  17. import org.eclipse.swt.events.ControlListener;
  18. import org.eclipse.swt.events.DisposeEvent;
  19. import org.eclipse.swt.events.DisposeListener;
  20. import org.eclipse.swt.events.FocusEvent;
  21. import org.eclipse.swt.events.FocusListener;
  22. import org.eclipse.swt.events.KeyEvent;
  23. import org.eclipse.swt.events.KeyListener;
  24. import org.eclipse.swt.events.PaintEvent;
  25. import org.eclipse.swt.events.PaintListener;
  26. import org.eclipse.swt.events.TraverseEvent;
  27. import org.eclipse.swt.events.TraverseListener;
  28. import org.eclipse.swt.graphics.Color;
  29. import org.eclipse.swt.graphics.Point;
  30. import org.eclipse.swt.widgets.Canvas;
  31. import org.eclipse.swt.widgets.Composite;
  32. import org.eclipse.swt.widgets.Control;
  33. import org.eclipse.swt.widgets.Display;
  34. /**
  35.  * Class EmptyTablePlaceholder.  An SWT control that is displayed in the table when
  36.  * there are no rows to display.  It has four purposes:
  37.  * 
  38.  * <ul>
  39.  * <li>Prompt the user to hit <INS> to insert a new (first) row.
  40.  * <li>Indicate if the table has focus using a dashed line around the outside.
  41.  * <li>Actually accept focus for the table when there are no other controls to do so.
  42.  * <li>Forward the insert key event back to the table when the user needs to insert a row.
  43.  * </ul>
  44.  * 
  45.  * @author djo
  46.  */
  47. public class EmptyTablePlaceholder extends Canvas {
  48. private boolean focusControl = false;
  49. private InternalCompositeTable parentTable = null;
  50. private final Color RED;
  51. /**
  52.  * Constructor EmptyTablePlaceholder.  Construct an EmptyTablePlaceholder control.
  53.  * 
  54.  * @param parent The parent control
  55.  * @param style Style bits.  These are the same as what Canvas accepts.
  56.  */
  57. public EmptyTablePlaceholder(Composite parent, int style) {
  58. super(parent, style);
  59. parentTable = (InternalCompositeTable) parent.getParent();
  60. parent.addControlListener(controlListener);
  61. addTraverseListener(traverseListener);
  62. addFocusListener(focusListener);
  63. addKeyListener(keyListener);
  64. addPaintListener(paintListener);
  65. addDisposeListener(disposeListener);
  66. RED = Display.getCurrent().getSystemColor(SWT.COLOR_RED);
  67. setBackground(getParent().getBackground());
  68. resize();
  69. }
  70. /**
  71.  * Make sure we remove our listeners...
  72.  */
  73. private DisposeListener disposeListener = new DisposeListener() {
  74. public void widgetDisposed(DisposeEvent e) {
  75. removeTraverseListener(traverseListener);
  76. removeFocusListener(focusListener);
  77. removeKeyListener(keyListener);
  78. removePaintListener(paintListener);
  79. removeDisposeListener(disposeListener);
  80. getParent().removeControlListener(controlListener);
  81. }
  82. };
  83. /**
  84.  * Handle resize events so we can redraw ourselves correctly.
  85.  */
  86. private ControlListener controlListener = new ControlAdapter() {
  87. public void controlResized(ControlEvent e) {
  88. resize();
  89. }
  90. };
  91. /**
  92.  * Actually resize ourself.
  93.  */
  94. private void resize() {
  95. Point headerSize = new Point(0, 0);
  96. Control header = parentTable.getHeaderControl();
  97. if (header != null) {
  98. headerSize = header.getSize();
  99. }
  100. Point parentSize = getParent().getSize();
  101. setBounds(0, headerSize.y+2, parentSize.x-4, parentSize.y - headerSize.y-6);
  102. }
  103. // The message property
  104. private String message = "Press [INS] to create a new row."; //$NON-NLS-1$
  105. /**
  106.  * Return the prompt message that will be displayed to the user inside this control.
  107.  * 
  108.  * @return The message string.
  109.  */
  110. public String getMessage() {
  111. return message;
  112. }
  113. /**
  114.  * Set the prompt message that will be displayed to the user inside this control.
  115.  * 
  116.  * @param message The message to display.
  117.  */
  118. public void setMessage(String message) {
  119. this.message = message;
  120. redraw();
  121. }
  122. /**
  123.  * Paint the control.
  124.  */
  125. private PaintListener paintListener = new PaintListener() {
  126. public void paintControl(PaintEvent e) {
  127. Color oldColor = e.gc.getForeground();
  128. int oldLineStyle = e.gc.getLineStyle();
  129. int oldLineWidth = e.gc.getLineWidth();
  130. try {
  131. if (focusControl) {
  132. e.gc.setLineStyle(SWT.LINE_DASH);
  133. e.gc.setLineWidth(2);
  134. Point parentSize = getSize();
  135. e.gc.drawRectangle(1, 2, parentSize.x-2, parentSize.y-3);
  136. }
  137. e.gc.setForeground(RED);
  138. e.gc.drawText(getMessage(), 3, 3);
  139. } finally {
  140. e.gc.setForeground(oldColor);
  141. e.gc.setLineStyle(oldLineStyle);
  142. e.gc.setLineWidth(oldLineWidth);
  143. }
  144. }
  145. };
  146. /**
  147.  * When we gain/lose focus, redraw ourselves appropriately
  148.  */
  149. private FocusListener focusListener = new FocusListener() {
  150. public void focusGained(FocusEvent e) {
  151. focusControl = true;
  152. redraw();
  153. }
  154. public void focusLost(FocusEvent e) {
  155. focusControl = false;
  156. redraw();
  157. }
  158. };
  159. /**
  160.  * Permit focus events via keyboard.
  161.  */
  162. private TraverseListener traverseListener = new TraverseListener() {
  163.  public void keyTraversed(TraverseEvent e) {
  164. }
  165. };
  166. /**
  167.  * Forward the insert key back to our parent for handling.
  168.  */
  169. private KeyListener keyListener = new KeyListener() {
  170. public void keyPressed(KeyEvent e) {
  171. if (e.keyCode == SWT.INSERT)
  172. parentTable.keyPressed(null, e);
  173. }
  174. public void keyReleased(KeyEvent e) {
  175. }
  176. };
  177. }