Posted on 2008-01-14 08:59
笑看人生 閱讀(2039)
評論(5) 編輯 收藏 所屬分類:
Java插件開發
這一節主要介紹如何給編輯器增加屬性頁,屬性頁主要用來顯示編輯器中選中對象的屬性的,比如在編輯器選中活動,可以在屬性頁上顯示活動的大小和位置等信息,要實現這一功能,首先要讓模型實現IPropertySource接口,我們讓模型的基類ModelElement實現這個接口,基類要實現這接口中六個方法,這六個方法如下:


/** *//** An empty property descriptor. */
private static final IPropertyDescriptor[] EMPTY_ARRAY = new IPropertyDescriptor[0];

/** *//**
* Returns a value for this property source that can be edited in a property sheet.

* @return this instance
*/

public Object getEditableValue()
{
return this;
}

/** *//**
* Children should override this. The default implementation returns an empty array.
*/

public IPropertyDescriptor[] getPropertyDescriptors()
{
return EMPTY_ARRAY;
}

/** *//**
* Children should override this. The default implementation returns null.
*/

public Object getPropertyValue(Object id)
{
// TODO Auto-generated method stub
return null;
}

/** *//**
* Children should override this. The default implementation returns false.
*/

public boolean isPropertySet(Object id)
{
// TODO Auto-generated method stub
return false;
}

/** *//**
* Children should override this. The default implementation does nothing.
*/

public void resetPropertyValue(Object id)
{
// TODO Auto-generated method stub
}

/** *//**
* Children should override this. The default implementation does nothing.
*/

public void setPropertyValue(Object id, Object value)
{
// TODO Auto-generated method stub
}
這六個方法的含義在JavaDoc中已經說的很清楚了,在這個類中我們還定義了IPropertyDescriptor類型的數組,這個數組的作用是存放要顯示屬性的名稱,由于根模型沒有什么可顯示的屬性,所以為空。當我們在編輯器中選中活動時,在屬性頁上要顯示它的屬性,因此我們應該在AbstractActivity類中覆蓋父類中相應的方法,代碼如下:

/** *//**
* 活動要顯示屬性的名稱
* There is one IPropertyDescriptor entry per editable property.
* @see #getPropertyDescriptors()
* @see #getPropertyValue(Object)
* @see #setPropertyValue(Object, Object)
*/
private static IPropertyDescriptor[] descriptors;

/**//*
* Initializes the property descriptors array.
* @see #getPropertyDescriptors()
* @see #getPropertyValue(Object)
* @see #setPropertyValue(Object, Object)
*/

static
{

descriptors = new IPropertyDescriptor[]
{
new TextPropertyDescriptor(XPOS_PROP, "X"), // id and

description pair
new TextPropertyDescriptor(YPOS_PROP, "Y"),
new TextPropertyDescriptor(WIDTH_PROP, "Width"),
new TextPropertyDescriptor(HEIGHT_PROP, "Height")
};
// use a custom cell editor validator for all four array entries

for (int i = 0; i < descriptors.length; i++)
{
((PropertyDescriptor) descriptors[i]).setValidator(new


ICellEditorValidator()
{

public String isValid(Object value)
{
int intValue = -1;

try
{
intValue = Integer.parseInt((String)

value);

} catch (NumberFormatException exc)
{
return "Not a number";
}
return (intValue >= 0) ? null : "Value must be >=

0";
}
});
}
} // static

/** *//**
* Returns an array of IPropertyDescriptors for this AbstractActivity.
* <p>The returned array is used to fill the property view, when the edit-part

corresponding
* to this model element is selected.</p>
* @see #descriptors
* @see #getPropertyValue(Object)
* @see #setPropertyValue(Object, Object)
*/

public IPropertyDescriptor[] getPropertyDescriptors()
{
return descriptors;
}

/** *//**
* Return the property value for the given propertyId, or null.
* <p>The property view uses the IDs from the IPropertyDescriptors array
* to obtain the value of the corresponding properties.</p>
* @see #descriptors
* @see #getPropertyDescriptors()
*/

public Object getPropertyValue(Object propertyId)
{

if (XPOS_PROP.equals(propertyId))
{
return Integer.toString(location.x);
}

if (YPOS_PROP.equals(propertyId))
{
return Integer.toString(location.y);
}

if (HEIGHT_PROP.equals(propertyId))
{
return Integer.toString(size.height);
}

if (WIDTH_PROP.equals(propertyId))
{
return Integer.toString(size.width);
}
return super.getPropertyValue(propertyId);
}

/** *//**
* Set the property value for the given property id.
* If no matching id is found, the call is forwarded to the superclass.
* <p>The property view uses the IDs from the IPropertyDescriptors array to set the

values
* of the corresponding properties.</p>
*/

public void setPropertyValue(Object propertyId, Object value)
{

if (XPOS_PROP.equals(propertyId))
{
int x = Integer.parseInt((String) value);
setLocation(new Point(x, location.y));

} else if (YPOS_PROP.equals(propertyId))
{
int y = Integer.parseInt((String) value);
setLocation(new Point(location.x, y));

} else if (HEIGHT_PROP.equals(propertyId))
{
int height = Integer.parseInt((String) value);
setSize(new Dimension(size.width, height));

} else if (WIDTH_PROP.equals(propertyId))
{
int width = Integer.parseInt((String) value);
setSize(new Dimension(width, size.height));

} else
{
super.setPropertyValue(propertyId, value);
}
}
我們首先定義一個IPropertyDescriptor類型的數組,然后初始化這個數組,該數組存放要顯示活動的屬性,這里我們顯示活動圖形的坐標,大小屬性,由于屬性頁既能顯示屬性,還能編輯屬性,而坐標和大小屬性只能輸入數字,所以我們加入了校驗,如果給這些屬性輸入字符,就拋異常。getPropertyValue方法就是得到IPropertyDescriptor數組中對應屬性名的屬性值,setPropertyValue方法就是對屬性值進行修改時,要同時修改模型的屬性,讓模型通知控制器來刷新視圖,例如我們修改坐標x的值,編輯器中活動
的位置就要發生改變,