2015-01-04 4 views
0

Я хотел бы изменить контекстное меню правой кнопки мыши для некоторых текстовых полей SWT.Как добавить пользовательское контекстное меню SWT для управления текстовым полем

Я хотел бы по-прежнему использовать некоторые параметры по умолчанию, такие как «Копировать», «Вырезать», «Вставить», но также хотел бы, чтобы пользовательское действие «Создать случайное» заполнило текстовое поле UUID.

Как добавить такое меню в элемент управления?

+0

Проверьте это http://stackoverflow.com/questions/25324633/how-can-we-add-menu-to-label-in-swt –

+0

[Соответствует] (http://stackoverflow.com/questions/7179464/свт-хау к воссоздавать-а-умолчанию-контекстное меню-для текстовых полей). – Baz

+0

спасибо, что работает для создания нового меню с настраиваемыми действиями, но как я могу добавить некоторые действия по умолчанию, такие как «Копировать», «Вставить обратно» в меню? Должен ли я создавать свои собственные версии для них или есть способ использовать реализацию по умолчанию? – tjsmith

ответ

1

вот что я придумал, чтобы добавить некоторые из стандартных функций (вырезать, копировать, вставить, выбрать все), а также пользовательские действия (генерировать UUID)

public static void addContextMenuWithUUID(final Text control) 
{ 
    Menu menu = new Menu(control); 
    MenuItem item = new MenuItem(menu, SWT.PUSH); 
    item.setText("Cut"); 
    item.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event event) 
     { 
      control.cut(); 
     } 
    }); 
    item = new MenuItem(menu, SWT.PUSH); 
    item.setText("Copy"); 
    item.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event event) 
     { 
      control.copy(); 
     } 
    }); 
    item = new MenuItem(menu, SWT.PUSH); 
    item.setText("Paste"); 
    item.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event event) 
     { 
      control.paste(); 
     } 
    }); 
    item = new MenuItem(menu, SWT.PUSH); 
    item.setText("Select All"); 
    item.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event event) 
     { 
      control.selectAll(); 
     } 
    }); 
    item = new MenuItem(menu, SWT.PUSH); 
    item.setText("Generate UUID"); 
    item.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event event) 
     { 
      control.setText(UUID.randomUUID().toString()); 
     } 
    }); 

    control.setMenu(menu); 
}  
1

Когда я должен был сделать что-то похоже, я это сделал,

Я принял класс TextActionHandler, предоставленный eclipse, и изменил код в соответствии с моими потребностями.

public final class TextActionHandler { 

enum TextAction { 

    CUT  (WorkbenchMessages.Workbench_cut, IWorkbenchCommandConstants.EDIT_CUT), 
    COPY  (WorkbenchMessages.Workbench_copy, IWorkbenchCommandConstants.EDIT_COPY), 
    PASTE  (WorkbenchMessages.Workbench_paste, IWorkbenchCommandConstants.EDIT_PASTE), 
    DELETE (WorkbenchMessages.Workbench_delete, null), 
    SELECT_ALL(WorkbenchMessages.Workbench_selectAll, WorkbenchCommandConstants.EDIT_SELECT_ALL); 

    private String text; 
    private String commandId; 

    private TextAction(String text, String commandId) { 
     this.text  = text; 
     this.commandId = commandId; 
    } 

    public String getCommandId() { 
     return commandId; 
    } 

    public String getText() { 
     return text; 
    } 
} 

public TextActionHandler(Text text) { 
    addText(text); 
} 

public TextActionHandler() { 
    super(); 
} 

public void addText(Text textControl) { 
    if (textControl == null) { 
     return; 
    } 
    textControl.addDisposeListener(new DisposeListener() { 
     @Override 
     public void widgetDisposed(DisposeEvent e) { 
      removeText(activeTextControl); 
     } 
    }); 
    textControl.addListener(SWT.Activate, textControlListener); 
    textControl.addListener(SWT.Deactivate, textControlListener); 

    textControl.addKeyListener(keyAdapter); 
    textControl.addMouseListener(mouseAdapter); 

    activeTextControl = textControl; 
    updateActionsEnableState(); 
} 

public void hookContextMenu() { 
    final MenuManager menuMgr = new MenuManager("#PMPopupMenu"); 
    menuMgr.setRemoveAllWhenShown(true); 
    menuMgr.addMenuListener(new IMenuListener() { 
     public void menuAboutToShow(IMenuManager manager) { 
      addContextMenuOptions(menuMgr); 
     } 
    }); 
    Menu menu = menuMgr.createContextMenu(activeTextControl); 
    activeTextControl.setMenu(menu); 
} 

private void addContextMenuOptions(MenuManager manager) { 
    manager.removeAll(); 
    manager.add(textCutAction); 
    manager.add(textCopyAction); 
    manager.add(textPasteAction); 
    manager.add(textDeleteAction); 
    manager.add(new Separator()); 
    manager.add(textSelectAllAction); 

    // add your own action handlers here 
} 

... 

// example. 
private final class CutActionHandler extends Action { 

    private CutActionHandler() { 
     setProperties(this, TextAction.CUT); 
     setEnabled(false); 
    } 

    @Override 
    public void runWithEvent(Event event) { 
     if (activeTextControl != null && !activeTextControl.isDisposed()) { 
      activeTextControl.cut(); 
      updateActionsEnableState(); 
     } 
    } 

    @Override 
    public boolean isEnabled() { 
     return activeTextControl != null && !activeTextControl.isDisposed() 
       && activeTextControl.getEditable() 
       && activeTextControl.getSelectionCount() > 0; 
    } 

    public void updateEnabledState() { 
     setEnabled(isEnabled()); 
    } 
} 

private void setProperties(Action action, TextAction actionEnum){ 

    action.setText(actionEnum.getText()); 
    action.setActionDefinitionId(actionEnum.getCommandId()); 
    action.setImageDescriptor(getImageDescriptor(actionEnum)); 
    action.setDisabledImageDescriptor(getDisabledImageDescriptor(actionEnum)); 

} 

}

Кроме того, вы можете иметь свой собственный ActionHandlers добавил. например, RandomGeneratorHandler. Чтобы подключить это к вашим текстовым полям, сделать

Text text = new Text(parent, SWT.NONE); 
... 
TextActionHandler handler = new TextActionHandler(); 
handler.addText(text); 
handler.hookContextMenu(); 

Примечания - я не представил полный класса здесь, для других действий, как копирование, вставка, удаление и выбрать все и т.д., вы должны сделать что-то подобное, как Cut , Я использовал тот же код, определенный в классе TextActionHandler.

Смежные вопросы