自定义eclipse视图和运行程序之间的通信?

时间:2009-11-05 09:11:16

标签: java eclipse eclipse-plugin

我正在开发一个项目,它是某种模拟的三维可视化。这个可视化是一个可以运行的独立的eclipse插件。问题在于gui被设想为具有自定义视图的新eclipse透视图,其中在运行时,在可视化运行时,在我们自己的透视图中的eclipse视图中,可视化中对象的属性值需要向用户显示,所以他可以看他们。

我怎样才能实现这一目标?它应该像某些调试模式,但用户可以在可视化运行时在对象之间切换并检查其属性的值。 你知道如何实现这个目标吗?有什么方法可以将事件发送到eclipse视图或类似的东西吗?

谢谢

1 个答案:

答案 0 :(得分:2)

是的,绝对可以让视图侦听其他对象的更改并进行更新。如果用户选择相关,您可以使用标准eclipse选择对象的方式(您希望监视视图根据客户在可视化中选择的内容来观察不同的内容吗?)。更重要的是,您可以设计一个支持侦听器的模型,以便其他对象(例如视图)可以监听可视化模型中的更改并自行更新。

在收听可视化中的更改时。您的视图可以挂钩到可视化模型中的任何侦听器接口。然后,当他们获得事件时,他们可以更新所有属性已更改并更新其显示。

在我的情况下,我有一个模型代表卡片中的卡片列表(不是常规扑克牌BTW,Magic the Gathering卡片)。 ModelElement,它是套牌中我所有不同插槽的基类(例如卡片,评论等),使用java.beans.PropertyChangeSupport来帮助实现对属性更改的支持():

public synchronized void addPropertyChangeListener (PropertyChangeListener listener)  {
    if (listener == null) {
        throw new IllegalArgumentException ("Property change listener cannot be null."); //$NON-NLS-1$
    }

    myPropertyChangeDelegate.addPropertyChangeListener (listener);
}


public synchronized void removePropertyChangeListener(PropertyChangeListener listener)  {
    if (listener != null) {
        myPropertyChangeDelegate.removePropertyChangeListener (listener);
    }
}


protected void firePropertyChange(String propertyName, Object oldValue, Object newValue)  {
    if (myPropertyChangeDelegate.hasListeners (propertyName))  {
        myPropertyChangeDelegate.firePropertyChange (propertyName, oldValue, newValue);
    }
}


/** Delegate used to implement property change support. */
private transient PropertyChangeSupport myPropertyChangeDelegate;

这样我的视图就可以连接并聆听当前套牌编辑器模型中的元素。例如,这里是大纲视图的deck元素监听器(称为DeckSlotTreeEditPart)中的一些代码,它代表当前套牌中大纲视图的卡片树,注释等中的元素:

public class DeckSlotTreeEditPart extends AbstractTreeEditPart implements PropertyChangeListener  {

... other code snipped

public void activate ()  {
    if (!isActive ()) {
        super.activate ();
        getDeckSlot ().addPropertyChangeListener (this);
    }
}


@Override
public void deactivate ()  {
    if (isActive ()) {
        super.deactivate ();
        getDeckSlot ().removePropertyChangeListener (this);
    }
}


public void propertyChange (PropertyChangeEvent evt)  {
    refreshVisuals ();
}


protected DeckSlot getDeckSlot ()  {
    return (DeckSlot)getModel ();
}

在您的情况下,您可以将视图挂钩到所需的可视化对象上的任何侦听接口,并在这些侦听器触发事件​​时自动更新它们。您可以使用PropertyChangeSupport或设计自己的侦听器接口(如果不存在)。

听取选择更改。以下是我的某个应用中的一个观看者的代码片段。此视图侦听编辑器或其他选择提供程序中的选择更改并更新自身以显示新选择的“卡片”对象的属性(请参阅eclipse.org help for ISelectionListener):

public class CardInfo extends ViewPart implements ISelectionListener, ICardHistoryDelegate, 
    IPinViewDelegate, IToggleSearchBarDelegate, ICardSearchListener  {

... other methods snipped

public void createPartControl (Composite parent)  {
    ... rest of method that actually creates the view components snipped

    //  Hook up to listen to selection changes
    getSite ().getWorkbenchWindow ().getSelectionService ().addSelectionListener (this);
}

public void selectionChanged (IWorkbenchPart part, ISelection selection)  {

    if (selection.isEmpty()  ||  !(selection instanceof IStructuredSelection))  {
        //  Do not clear the view even for empty selections or selections of another 
        //  type - just do nothing.  That way the last card looked at will be visible no 
        //  matter what else happens
        return;
    }

    //  Display the first selected element
    IStructuredSelection structuredSel = (IStructuredSelection)selection;
    Object firstSelectedObject = structuredSel.getFirstElement ();

    //  Get the ICard interface from the selection - using its IAdaptable interface
    if (firstSelectedObject == null  ||  !(firstSelectedObject instanceof IAdaptable))
        return; // no work to do
    ICard selectedCard = (ICard)((IAdaptable)firstSelectedObject).getAdapter(ICard.class);
    if (selectedCard == null)
        return; // no work to do

... rest of method that actually does something with new selection snipped

我的编辑器使用GEF,它为我的观点可以收听的eclipse工作台提供选择提供程序。

我希望有所帮助。

伊恩