2011-01-19 29 views
12

Đây là một câu hỏi chung nhưng vấn đề hiện tại của tôi xoay quanh việc xử lý menu.Trình đơn & hành động RCP của Eclipse: Định cấu hình hoặc mã?

Trong plugin bình thường với các tác vụ trình đơn đóng góp, bạn sẽ định cấu hình ActionSets v.v. trong cấu hình plugin.xml. Điều này rõ ràng là hợp lý.

Tôi đang làm việc trên ứng dụng RCP (thực sự là RAP) và tôi tự hỏi liệu có đáng để nỗ lực định cấu hình mọi thứ thông qua plugin.xml hay không. Plugin của tôi không phải tương tác với một plugin không xác định khác, về mặt lý thuyết, tôi có quyền kiểm soát. Tôi có thể thêm các menu và hành động theo chương trình.

Tôi đã cố gắng định cấu hình trình đơn chứa menu con. Tôi đã thử xác định ActionSets và liên kết một trong những bên kia nhưng không thành công. Một số mục cần phải được tắt tùy thuộc vào vai trò người dùng.

Tôi hình tôi có thể đã mã hóa toàn bộ lô trong vài phút nhưng tôi không chắc liệu điều đó có phù hợp với eclipse 'ethos' hay không.

Ý kiến ​​gì ở ngoài đó? Các ứng dụng sẽ nhận được khá lớn vì vậy tôi muốn có được cách tiếp cận ngay từ đầu. Có lẽ ai đó có thể chỉ cho tôi một ví dụ để định cấu hình trình đơn lồng nhau :-)

Trả lời

25

Ý kiến ​​của tôi là triển khai plugin.xml là cách để thực hiện.

chính của tôi hai lý do cho việc sử dụng phương pháp này:

  • Nó thực sự dễ dàng để cấu hình lại và tổ chức lại các menu và các nút mà không cần viết mã java.
  • Hiển thị phân cấp rất rõ ràng của cây menu.

Đây là đoạn mã triển khai thực đơn và menu con. Trong ví dụ này, chúng được thêm vào menu chính.

Bạn có thể dán vào plugin.xml của bạn:

<extension 
     name="Main Menu Contributions" 
     point="org.eclipse.ui.menus"> 
<menuContribution 
     allPopups="false" 
     locationURI="menu:org.eclipse.ui.main.menu"> 
    <menu 
      id="fileMenu" 
      label="File"> 
     <command 
       commandId="org.eclipse.ui.file.exit" 
       label="Exit" 
       style="push"> 
     </command> 
    </menu> 
    <menu 
      label="Edit"> 
     <command 
       commandId="org.eclipse.ui.edit.selectAll" 
       label="Select All" 
       style="push"> 
     </command> 
     <menu 
       label="Submenu"> 
      <command 
       commandId="org.eclipse.ui.edit.selectAll" 
       label="Select All Submenu" 
       style="push"> 
      </command> 
      <command 
       commandId="org.eclipse.ui.edit.delete" 
       label="Delete submenu" 
       style="push"> 
      </command> 
     </menu> 
    </menu> 
    </menuContribution> 
</extension> 

Đối với kích hoạt/hủy kích hoạt trình đơn, bạn phải sử dụng lõi Expressions để bật/tắt bộ xử lý lệnh. Nếu một lệnh không có bất kỳ trình xử lý hoạt động nào được đính kèm, lệnh này sẽ bị tắt. Vì vậy, mục menu gọi lệnh đó cũng sẽ bị tắt.

Đoạn mã sau đây cho biết cách tạo nút trên thanh công cụ của chế độ xem và được bật/tắt tùy thuộc vào giá trị của biến. Hãy nhớ rằng bạn sẽ phải thay đổi một số thứ trong mã này để làm cho nó hoạt động. Hầu hết các thay đổi là dành cho tên tham chiếu và triển khai lớp học.

Tạo nút trên thanh công cụ (plugin.xml):

<extension 
     name="View Toolbar Contributions" 
     point="org.eclipse.ui.menus"> 
     <menuContribution 
      allPopups="false" 
      locationURI="toolbar:myapp.views.MyView"> 
     <command 
      commandId="myapp.commands.PauseSound" 
      icon="" 
      label="Pause Playback Sound" 
      style="push" 
      tooltip="Pause"> 
     </command> 
    </menuContribution> 
</extension> 

Tạo lệnh (plugin.xml):

<extension 
     id="myapp.commands.PauseSound" 
     name="Pause sound command" 
     point="org.eclipse.ui.commands"> 
     <command 
      id="myapp.commands.PauseSound" 
      name="Pause Sound"> 
     </command> 
</extension> 

Tạo xử lý lệnh (plugin.xml):

<extension 
     point="org.eclipse.ui.handlers"> 
     <handler 
      commandId="myapp.commands.PauseSound"> 
     <activeWhen> 
      <with 
        variable="myapp.commands.sourceprovider.active"> 
       <or> 
        <equals 
         value="PLAYING"> 
        </equals> 
        <equals 
         value="PAUSED"> 
        </equals> 
       </or> 
      </with> 
     </activeWhen> 
     <class 
       class="myapp.rcp.commands.toolbar.PausePlayback"> 
     </class> 
     </handler> 
</extension> 

Tạo biến trạng thái cho lệnh (plugin.xml):

<extension 
     point="org.eclipse.ui.services"> 
     <sourceProvider 
      provider="myapp.commands.sourceprovider.CommandState"> 
     <variable 
       name="myapp.commands.sourceprovider.active" 
       priorityLevel="workbench"> 
     </variable> 
     </sourceProvider> 
    </extension> 

Thực hiện lớp mà thay đổi trạng thái của biến:

public class CommandState extends AbstractSourceProvider { 
    public final static String STATE = "myapp.commands.sourceprovider.active"; 
    public final static String STOPPED = "STOPPED"; 
    public final static String PLAYING = "PLAYING"; 
    public final static String PAUSED = "PAUSED"; 
    public final static String NOT_LOADED = "NOT_LOADED"; 

enum State { 
     NOT_LOADED, PLAYING, PAUSED, STOPPED 
    }; 
    private State curState = State.NOT_LOADED; 

    @Override 
    public void dispose() { 
    } 

    @Override 
    public String[] getProvidedSourceNames() { 
     return new String[] { STATE }; 
    } 

    // You cannot return NULL 
    @SuppressWarnings("unchecked") 
    @Override 
    public Map getCurrentState() { 
     Map map = new HashMap(1); 
     if (curState == State.PLAYING) 
      map.put(STATE, PLAYING); 
     else if (curState == State.STOPPED) 
      map.put(STATE, STOPPED); 
     else if (curState == State.PAUSED) 
      map.put(STATE, PAUSED); 

     return map; 
    } 

    public void setPlaying() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING); 
    } 

    public void setPaused() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED); 
    } 

    public void setStopped() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED); 
    } 

    public void setNotLoaded() { 
     fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED); 
    } 

} 

Thông tin chi tiết về cách để triển khai các tính năng này có thể được tìm thấy tại các địa điểm sau:

+4

+1 Ví dụ hay! –

+0

Tôi thấy toàn bộ kiểm tra, thay đổi, tải lại chu kỳ quá chậm, đặc biệt nếu bạn có nhiều menu ngữ cảnh cần gỡ lỗi với hành vi phức tạp.Nhưng tôi có thể xem nó sẽ hoạt động như thế nào cho ví dụ đó. –

0

Nếu bạn đang viết ứng dụng RCP, thực hành tốt là tạo các trình giữ chỗ trong ActionBarAdvisor của bạn. Trong khi đó sẽ xác định cấu trúc cơ bản của các menu và thanh công cụ của bạn, bạn có thể mở rộng menuContributions và sử dụng các lệnh để đóng góp các mục menu/công cụ thực tế.

1

Đối với Eclipse có hai cách khác nhau để góp phần vào sự Workbench: Hoạt động và Lệnh.

Tôi chắc chắn khuyên các Lệnh là mới hơn và nâng cao hơn Hành động. Những hạn chế của Hành động như được chỉ định tại đây (1):

  • Giao diện người dùng và xử lý luôn bị ràng buộc. Không có cách nào bạn có thể tách riêng nhau
  • Trong khi các hành động có thể được đóng góp cho các phần khác nhau của bàn làm việc (trình đơn bật lên/thanh công cụ), tất cả đều là các điểm mở rộng khác nhau và vì vậy bạn sẽ sao chép XML ở nhiều nơi. Điều tồi tệ nhất là không phải tất cả các điểm mở rộng đều mong đợi cùng một cấu hình.
  • Chỉ định Tác vụ ở nhiều nơi là một cơn ác mộng về bảo trì. Nếu bạn phải thay đổi biểu tượng của một hành động, bạn cần phải thay đổi ở tất cả các địa điểm.
  • Một vấn đề khác với sao chép Hoạt động trong plugin.xml là nhiều thể hiện của các Hoạt động tương tự sẽ được tạo ra trong bộ nhớ

    (1) Actions vs Commands

0

Để thêm hành động trong RCP bạn cũng có thể sử dụng ApplicationActinBarAcvisor.It là dễ dàng hơn so với giải pháp được đề cập ở trên Trong u này chỉ cần đầu tiên khai báo các hành động như là một đối tượng của IWorkbenchAction, sau đó trong phương pháp "bảo vệ void makeActions (IWorkbenchWindow cửa sổ)" u có thể đăng ký nó. Và bước cuối cùng là thêm nó vào menu. Mã sau sẽ giúp bạn.

1.First tuyên bố hành động: -

private IWorkbenchAction newAction 

2.Registering hành động: -

protected void makeActions(IWorkbenchWindow window) { 
newAction = ActionFactory.NEW_WIZARD_DROP_DOWN.create(window); 
    register(newAction); 
    newAction.setText("New"); 

3.Last bước là thêm hành động trong menu: -

MenuManager filemenu = new MenuManager("&File", "file"); 
    filemenu.add(newAction); 

Bạn cũng có thể thêm hành động trong thanh công cụ như sau: -

protected void fillCoolBar(ICoolBarManager coolBar) { 
    IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle()); 
    coolBar.add(toolbar); 
    toolbar.add(newAction); 
Các vấn đề liên quan