Ý 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:
+1 Ví dụ hay! –
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ụ đó. –