獨自等待
          那曾經從自己身邊溜走的人……
          posts - 0,comments - 3,trackbacks - 0
          在TableViewer或TreeViewer編輯時候,Eclipse提供了基本的CellEditor,如TextCellEditor、CheckboxCellEditor、ComboBoxCellEditor、DialogCellEditor等,但在實際應用過程中,我們通常有特殊需要,如下圖類型的單元格編輯器:

          實現的方式相當簡單,我組合了ComboBoxCellEditor、DialogCellEditor,其中ComboBox支持手工輸入,返回為String類型值(原ComboBoxCellEditor為Integer類型),貼下具體代碼吧:
          package com.test.ui.properties.invoke;

          import java.text.MessageFormat;

          import org.eclipse.core.runtime.Assert;
          import org.eclipse.jface.viewers.CellEditor;
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.custom.CCombo;
          import org.eclipse.swt.events.FocusAdapter;
          import org.eclipse.swt.events.FocusEvent;
          import org.eclipse.swt.events.FocusListener;
          import org.eclipse.swt.events.KeyAdapter;
          import org.eclipse.swt.events.KeyEvent;
          import org.eclipse.swt.events.ModifyEvent;
          import org.eclipse.swt.events.ModifyListener;
          import org.eclipse.swt.events.SelectionAdapter;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.events.TraverseEvent;
          import org.eclipse.swt.events.TraverseListener;
          import org.eclipse.swt.graphics.Color;
          import org.eclipse.swt.graphics.Font;
          import org.eclipse.swt.graphics.Point;
          import org.eclipse.swt.graphics.Rectangle;
          import org.eclipse.swt.widgets.Button;
          import org.eclipse.swt.widgets.Composite;
          import org.eclipse.swt.widgets.Control;
          import org.eclipse.swt.widgets.Layout;

          public abstract class ComboBoxDialogCellEditor extends CellEditor {

              
          //Combo Items
              private String[] items;

              
          private Composite editor;
              
              
          private CCombo comboBox;
              
              
          private Control contents;
              
              
          private Button button;
              
          private FocusListener buttonFocusListener;

              
          private ModifyListener modifyListener;
              
              
          private Object value = null;

              
          /**
               * Internal class for laying out the dialog.
               
          */

              
          private class DialogCellLayout extends Layout {
                  
          public void layout(Composite editor, boolean force) {
                      Rectangle bounds 
          = editor.getClientArea();
                      Point size 
          = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
                      
          if (contents != null{
                          contents.setBounds(
          00, bounds.width - size.x, bounds.height);
                      }

                      button.setBounds(bounds.width 
          - size.x, 0, size.x, bounds.height);
                  }


                  
          public Point computeSize(Composite editor, int wHint, int hHint,
                          
          boolean force) {
                      
          if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
                          
          return new Point(wHint, hHint);
                      }

                      Point contentsSize 
          = contents.computeSize(SWT.DEFAULT, SWT.DEFAULT,
                              force);
                      Point buttonSize 
          = button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
                              force);
                      
          // Just return the button width to ensure the button is not clipped
                      
          // if the label is long.
                      
          // The label will just use whatever extra width there is
                      Point result = new Point(buttonSize.x, Math.max(contentsSize.y,
                              buttonSize.y));
                      
          return result;
                  }

              }


              
          //Combo default style
              private static final int defaultStyle = SWT.NONE;

              
              
          public ComboBoxDialogCellEditor() {
                  setStyle(defaultStyle);
              }


              
          public ComboBoxDialogCellEditor(Composite parent, String[] items) {
                  
          this(parent, items, defaultStyle);
              }


              
          public ComboBoxDialogCellEditor(Composite parent, String[] items, int style) {
                  
          super(parent, style);
                  setItems(items);
              }


              
          public String[] getItems() {
                  
          return items;
              }


              
          public void setItems(String[] items) {
                  Assert.isNotNull(items);
                  
          this.items = items;
                  populateComboBoxItems();
              }

              
              
          protected Button createButton(Composite parent) {
                  Button result 
          = new Button(parent, SWT.DOWN);
                  result.setText(
          ""); //$NON-NLS-1$
                  return result;
              }


              
          protected Control createContents(Composite cell) {
                  comboBox 
          = new CCombo(cell, getStyle());
                  comboBox.setFont(cell.getFont());
                  populateComboBoxItems();

                  comboBox.addKeyListener(
          new KeyAdapter() {
                      
          public void keyPressed(KeyEvent e) {
                          keyReleaseOccured(e);
                      }

                  }
          );

                  comboBox.addModifyListener(getModifyListener());

                  comboBox.addSelectionListener(
          new SelectionAdapter() {
                      
          public void widgetDefaultSelected(SelectionEvent event) {
                          applyEditorValueAndDeactivate();
                      }

                      
                      
          public void widgetSelected(SelectionEvent event) {
                          value 
          = comboBox.getText();
                      }

                  }
          );
                  
                  comboBox.addTraverseListener(
          new TraverseListener() {
                      
          public void keyTraversed(TraverseEvent e) {
                          
          if (e.detail == SWT.TRAVERSE_ESCAPE
                                  
          || e.detail == SWT.TRAVERSE_RETURN) {
                              e.doit 
          = false;
                          }

                      }

                  }
          );

                  comboBox.addFocusListener(
          new FocusAdapter() {
                      
          public void focusLost(FocusEvent e) {
                          
          if(!button.isFocusControl()) {
                              ComboBoxDialogCellEditor.
          this.focusLost();
                          }

                      }

                  }
          );

                  
          return comboBox;
              }

              
              @Override
              
          protected Control createControl(Composite parent) {
                  Font font 
          = parent.getFont();
                  Color bg 
          = parent.getBackground();

                  editor 
          = new Composite(parent, getStyle());
                  editor.setFont(font);
                  editor.setBackground(bg);
                  editor.setLayout(
          new DialogCellLayout());

                  contents 
          = createContents(editor);
                  updateContents(value);
                  
                  button 
          = createButton(editor);
                  button.setFont(font);

                  button.addKeyListener(
          new KeyAdapter() {
                      
          public void keyReleased(KeyEvent e) {
                          
          if (e.character == '\u001b'// Escape
                              fireCancelEditor();
                          }

                      }

                  }
          );
                  button.addFocusListener(getButtonFocusListener());
                  button.addSelectionListener(
          new SelectionAdapter() {
                      
          public void widgetSelected(SelectionEvent event) {
                          button.removeFocusListener(getButtonFocusListener());
                          Object newValue 
          = openDialogBox(editor);
                          button.addFocusListener(getButtonFocusListener());
                          
          if (newValue != null{
                              
          boolean newValidState = isCorrect(newValue);
                              
          if (newValidState) {
                                  markDirty();
                                  doSetValue(newValue);
                              }
           else {
                                  setErrorMessage(MessageFormat.format(getErrorMessage(),
                                          
          new Object[] { newValue.toString() }));
                              }

                              fireApplyEditorValue();
                          }

                      }

                  }
          );

                  setValueValid(
          true);
                  
                  
          return editor;
              }


              
          public void deactivate() {
                  
          if (button != null && !button.isDisposed()) {
                      button.removeFocusListener(getButtonFocusListener());
                  }

                  
                  
          super.deactivate();
              }


              @Override
              
          protected Object doGetValue() {
                  
          return value;
              }


              @Override
              
          protected void doSetFocus() {
                  
          if (comboBox != null)
                      comboBox.setFocus();
              }


              @Override
              
          protected void doSetValue(Object value) {
                  
          this.value = value;
                  updateContents(value);
              }


              
          private void populateComboBoxItems() {
                  
          if (comboBox != null && items != null{
                      comboBox.removeAll();
                      
          for (int i = 0; i < items.length; i++{
                          comboBox.add(items[i], i);
                      }

                      comboBox.setText(
          "");
                  }

              }


              
          void applyEditorValueAndDeactivate() {
                  Object newValue 
          = comboBox.getText();
                  
          if (newValue != null && !newValue.equals(value.toString())) {
                      
          boolean newValidState = isCorrect(newValue);
                      
          if (newValidState) {
                          markDirty();
                          doSetValue(newValue);
                      }
           else {
                          setErrorMessage(MessageFormat.format(getErrorMessage(),
                                  
          new Object[] { newValue.toString() }));
                      }

                  }

                  fireApplyEditorValue();
                  deactivate();
              }

              
              
          /*
               *  (non-Javadoc)
               * @see org.eclipse.jface.viewers.CellEditor#focusLost()
               
          */

              
          protected void focusLost() {
                  
          if (isActivated()) {
                      applyEditorValueAndDeactivate();
                  }

              }


              
              
          /*
               * (non-Javadoc)
               * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
               
          */

              
          protected void keyReleaseOccured(KeyEvent keyEvent) {
                  
          if (keyEvent.character == '\r'// Return key
                      if (comboBox != null && !comboBox.isDisposed())
                          fireCancelEditor();
                  }
           else if (keyEvent.character == '\t'// tab key
                      applyEditorValueAndDeactivate();
                  }

              }


              
          protected void editOccured(ModifyEvent e) {
                  String value 
          = comboBox.getText();
                  
          if (value == null{
                      value 
          = "";//$NON-NLS-1$
                  }

                  Object typedValue 
          = value;
                  
          boolean oldValidState = isValueValid();
                  
          boolean newValidState = isCorrect(typedValue);
                  
          if (typedValue == null && newValidState) {
                      Assert.isTrue(
          false,
                              
          "Validator isn't limiting the cell editor's type range");//$NON-NLS-1$
                  }

                  
          if (!newValidState) {
                      
          // try to insert the current value into the error message.
                      setErrorMessage(MessageFormat.format(getErrorMessage(),
                              
          new Object[] { value }));
                  }

                  valueChanged(oldValidState, newValidState);
              }


              
          private ModifyListener getModifyListener() {
                  
          if (modifyListener == null{
                      modifyListener 
          = new ModifyListener() {
                          
          public void modifyText(ModifyEvent e) {
                              editOccured(e);
                          }

                      }
          ;
                  }

                  
          return modifyListener;
              }


              
          private FocusListener getButtonFocusListener() {
                  
          if (buttonFocusListener == null{
                      buttonFocusListener 
          = new FocusListener() {
                          
          public void focusGained(FocusEvent e) {};
                          
          public void focusLost(FocusEvent e) {
                              ComboBoxDialogCellEditor.
          this.focusLost();
                          }

                      }
          ;
                  }
          ;
                  
          return buttonFocusListener;
              }


              
          private void updateContents(Object value) {
                  Assert.isTrue(comboBox 
          != null);
                  
                  
          if (value != null &&  value instanceof String) {
                      comboBox.removeModifyListener(getModifyListener());
                      comboBox.setText((String) value);
                      comboBox.addModifyListener(getModifyListener());
                  }

              }

              
              
          protected abstract Object openDialogBox(Control cellEditorWindow);

          }

          posted on 2008-06-02 13:46 自由 閱讀(3936) 評論(2)  編輯  收藏 所屬分類: SWT

          FeedBack:
          # re: 自定義 CellEditor
          2012-12-01 18:41 | ljj
          怎么調用呢?能給個例子么?  回復  更多評論
            
          # re: 自定義 CellEditor[未登錄]
          2016-02-16 11:57 |
          有個問題請教一下,我使用swt table開發了一個小程序自己用,沒想到特別麻煩,table里用了TextCellEditor,在輸入編輯的時候能做到換行,輸入完以后表格里的文本只能顯示一行。求問高手,怎么才能實現表格里文本多行顯示?(不通過換行符,通過wrap這種方式)
          謝謝  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 华蓥市| 库伦旗| 资中县| 镇江市| 巨野县| 肥西县| 股票| 会泽县| 锡林郭勒盟| 安庆市| 黄龙县| 淮北市| 兴国县| 革吉县| 梅河口市| 东台市| 通山县| 合水县| 塘沽区| 肇东市| 咸丰县| 信丰县| 准格尔旗| 许昌市| 湖南省| 汉川市| 乌苏市| 威宁| 刚察县| 始兴县| 杭锦后旗| 申扎县| 兴业县| 舒城县| 文化| 凤山县| 策勒县| 南召县| 甘肃省| 乌拉特中旗| 大荔县|