GrxItemView.java
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008, AIST, the University of Tokyo and General Robotix Inc.
3  * All rights reserved. This program is made available under the terms of the
4  * Eclipse Public License v1.0 which accompanies this distribution, and is
5  * available at http://www.eclipse.org/legal/epl-v10.html
6  * Contributors:
7  * General Robotix Inc.
8  * National Institute of Advanced Industrial Science and Technology (AIST)
9  */
10 /*
11  * GrxItemView.java
12  *
13  * Copyright (C) 2007 GeneralRobotix, Inc.
14  * All Rights Reserved
15  *
16  * @author Yuichiro Kawasumi (General Robotix, Inc.)
17  */
18 
19 package com.generalrobotix.ui.view;
20 
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Vector;
25 import java.util.Iterator;
26 
27 import org.eclipse.jface.action.Action;
28 import org.eclipse.jface.action.MenuManager;
29 import org.eclipse.jface.viewers.ISelection;
30 import org.eclipse.jface.viewers.ISelectionChangedListener;
31 import org.eclipse.jface.viewers.IStructuredSelection;
32 import org.eclipse.jface.viewers.ITreeContentProvider;
33 import org.eclipse.jface.viewers.IViewerLabelProvider;
34 import org.eclipse.jface.viewers.LabelProvider;
35 import org.eclipse.jface.viewers.SelectionChangedEvent;
36 import org.eclipse.jface.viewers.StructuredSelection;
37 import org.eclipse.jface.viewers.TreeViewer;
38 import org.eclipse.jface.viewers.Viewer;
39 import org.eclipse.jface.viewers.ViewerLabel;
40 
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.graphics.Image;
43 import org.eclipse.swt.widgets.Composite;
44 import org.eclipse.swt.widgets.Event;
45 import org.eclipse.swt.widgets.Listener;
46 import org.eclipse.swt.widgets.Tree;
47 import org.eclipse.ui.ISharedImages;
48 import org.eclipse.ui.PlatformUI;
49 
66 
67 @SuppressWarnings("serial")
71 public class GrxItemView extends GrxBaseView {
72 
73  GrxItemViewPart vp;
74 
75  TreeViewer tv;
76  MenuManager menuMgr= new MenuManager();
77 
78  private List<GrxBasePlugin> baseItems_ = new ArrayList<GrxBasePlugin>();
86  @SuppressWarnings("unchecked")
87  public GrxItemView(String name, GrxPluginManager manager, GrxBaseViewPart vp, Composite parent) {
88  super(name, manager, vp, parent);
89 
90  tv = new TreeViewer(composite_);
91  tv.setContentProvider( new TreeContentProvider() );
92  tv.setLabelProvider( new TreeLabelProvider() );
93 
94  Tree t = tv.getTree();
95 
96  // When an item is left-clicked, the item becomes "current item".
97  tv.addSelectionChangedListener(new ISelectionChangedListener() {
98  public void selectionChanged(SelectionChangedEvent event) {
99  ISelection selection = event.getSelection();
100  for (Object o : ((IStructuredSelection) selection).toArray() ){
101  if ( GrxBaseItem.class.isAssignableFrom(o.getClass()) ){
102  manager_.focusedItem((GrxBaseItem)o);
103  }else if(o instanceof String){
104  manager_.focusedItem(manager_.getProject());
105  }
106  }
107  }
108  });
109  // ダブルクリックでアイテムの選択状態をトグル
110  t.addListener ( SWT.DefaultSelection, new Listener () {
111  public void handleEvent (Event event) {
112  ISelection selection = tv.getSelection();
113  for (Object o : ((IStructuredSelection) selection).toArray() ){
114  if ( GrxBaseItem.class.isAssignableFrom(o.getClass()) ){
115  manager_.setSelectedItem( (GrxBaseItem)o, !((GrxBaseItem)o).isSelected() );
116  }
117  }
118  }
119  });
120 
121  // 右クリックメニュー
122  t.setMenu(menuMgr.createContextMenu( t ));
123  t.addListener ( SWT.MenuDetect, new Listener () {
124  public void handleEvent (Event event) {
125  ISelection selection = tv.getSelection();
126  Object o = ((IStructuredSelection) selection).getFirstElement();
127  menuMgr.removeAll(); // とりあえずメニュー削除
128 
129  // project name
130  if (o instanceof String){
131  Vector<Action> menus = manager_.getProject().getMenu();
132  for( Action a: menus){
133  menuMgr.add(a);
134  }
135  }
136 
137  // アイテムのクラス
138  if( Class.class.isAssignableFrom( o.getClass() ) ){
139  if( GrxBaseItem.class.isAssignableFrom( (Class<?>)o ) ) {
140  Vector<Action> menus = manager_.getItemMenu( (Class<? extends GrxBaseItem>) o );
141  for( Action a: menus){
142  menuMgr.add(a);
143  }
144  }
145  }
146  // アイテムのインスタンス
147  if( GrxBasePlugin.class.isAssignableFrom( o.getClass() ) ){
148  Vector<Action> menus = ((GrxBasePlugin)o).getMenu();
149  for( Action a: menus){
150  menuMgr.add(a);
151  }
152  Vector<MenuManager> subMenus = ((GrxBasePlugin)o).getSubMenu();
153  for( MenuManager m: subMenus){
154  menuMgr.add(m);
155  }
156  }
157  }
158  });
159 
160  // ツリーの構築
161  tv.setInput( manager_ );
162 
163  manager_.registerItemChangeListener(this, GrxBaseItem.class);
164  setUp();
165  }
166 
167  public void setUp(){
168  Iterator<GrxBasePlugin> it0 = baseItems_.iterator();
169  while(it0.hasNext())
170  it0.next().deleteObserver(this);
171  baseItems_.clear();
172  GrxModeInfoItem mode = manager_.getMode();
173  Iterator<Class<? extends GrxBaseItem>> it = mode.activeItemClassList_.listIterator();
174  while (it.hasNext()){
175  Class<? extends GrxBaseItem> local = (Class<? extends GrxBaseItem>)it.next();
176  if ( manager_.isItemVisible( local ) ){
177  Map<String, ?> map = (Map<String, ?>) manager_.getItemMap(local);
178  Iterator itI = map.values().iterator();
179  while(itI.hasNext()){
180  GrxBaseItem baseItem = (GrxBaseItem) itI.next();
181  baseItems_.add(baseItem);
182  baseItem.addObserver(this);
183  if(baseItem instanceof GrxModelItem){
184  GrxModelItem model = (GrxModelItem)baseItem;
185  GrxLinkItem root = model.rootLink();
186  if (root != null){
187  addchildrenObserver(root);
188  }
189  }
190  }
191  }
192  }
193  GrxProjectItem projectItem = manager_.getProject();
194  if(!projectItem.getObserver().contains(this))
195  projectItem.addObserver(this);
196  updateTree();
197  }
198 
200  baseItems_.add(item);
201  item.addObserver(this);
202  Vector<GrxTransformItem> children = ((GrxTransformItem)item).children_;
203  for(int i=0; i<children.size(); i++){
204  addchildrenObserver(children.get(i));
205  }
206  }
207 
211  class TreeContentProvider implements ITreeContentProvider {
212 
213  Object[] gets( Object o ) {
214  // root(PluginManager) -> プロジェクト名
215  if( o instanceof GrxPluginManager ) {
216  Object[] os = { ((GrxPluginManager)o).getProjectName() };
217  return os;
218  }
219 
220  // プロジェクト名 -> アイテムのクラスのリスト
221  if( o instanceof String ) {
222  GrxModeInfoItem mode = manager_.getMode();
223 
224  ArrayList<Class<? extends GrxBaseItem>> localList = new ArrayList<Class<? extends GrxBaseItem>>();
225  Iterator<Class<? extends GrxBaseItem>> it = mode.activeItemClassList_.listIterator();
226  //grxuirc.xmlの属性値grxui.mode.item.visibleを導入してvisibleがtrueのものをふるい分けして表示
227  while (it.hasNext()){
228  Class<? extends GrxBaseItem> local = (Class<? extends GrxBaseItem>)it.next();
229  if ( manager_.isItemVisible( local ) ){
230  localList.add( local );
231  }
232  }
233  return localList.toArray();
234  }
235 
236  // アイテムのクラス -> インスタンスのリスト
237  if( o instanceof Class ) {
238  if( GrxBaseItem.class.isAssignableFrom( (Class<?>)o ) ) {
239  OrderedHashMap oMap = manager_.pluginMap_.get( o);
240  return oMap.values().toArray();
241  }
242  }
243  // GrxModelItem -> ルートのリンクを返す
244  if (o instanceof GrxModelItem){
245  GrxModelItem model = (GrxModelItem)o;
246  if (model.rootLink() != null){
247  //Object[] os = {((GrxModelItem)o).rootLink()};
248  Vector<GrxExtraJointItem> extraJointList = ((GrxModelItem)o).extraJoints_;
249  Object[] os = new Object[extraJointList.size() + 1];
250  os[0] = ((GrxModelItem)o).rootLink();
251  for(int i=0; i<extraJointList.size(); i++)
252  os[i+1] = extraJointList.get(i);
253  return os;
254  }else{
255  return null;
256  }
257  }
258  // GrxLinkItem -> 子供のリンク,センサ、形状を返す
259  if (o instanceof GrxLinkItem){
260  GrxLinkItem link = (GrxLinkItem)o;
261  return link.children_.toArray();
262  }
263 
264  // GrxLinkItem -> 子供の形状を返す
265  if (o instanceof GrxSegmentItem){
266  GrxSegmentItem link = (GrxSegmentItem)o;
267  return link.children_.toArray();
268  }
269 
270  // GrxSensorItem -> 子供の形状を返す
271  if (o instanceof GrxSensorItem){
272  GrxSensorItem sensor = (GrxSensorItem)o;
273  return sensor.children_.toArray();
274  }
275 
276  // GrxHwcItem -> 子供の形状を返す
277  if (o instanceof GrxHwcItem){
278  GrxHwcItem hwc = (GrxHwcItem)o;
279  return hwc.children_.toArray();
280  }
281 
282  // その他
283  return null;
284  }
285  public Object[] getChildren(Object parentElement) { return gets(parentElement); }
286  public Object getParent(Object element) { return null; }
287  public boolean hasChildren(Object element) {
288  Object[] os = gets(element);
289  return os != null && os.length > 0;
290  }
291  public Object[] getElements(Object inputElement) { return gets(inputElement); }
292  public void dispose() {}
293  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
294  }
295 
299  class TreeLabelProvider extends LabelProvider implements IViewerLabelProvider{
300 
301  public String getText(Object object) {
302  // アイテムのクラス
303  if( object instanceof Class ) {
304  if( GrxBaseItem.class.isAssignableFrom( (Class<?>) object ) ) {
305  return manager_.getItemTitle( (Class<? extends GrxBaseItem>)object );
306  }
307  // アイテムのインスタンス
308  }else{
309  if( GrxBaseItem.class.isAssignableFrom( object.getClass() ) ) {
310  return ((GrxBaseItem)object).getName();
311  }
312  }
313  // Other
314  return object.toString();
315  }
316 
317  public Image getImage( Object o ){
318  if( GrxBaseItem.class.isAssignableFrom( o.getClass() ) ) {
319  if( ((GrxBaseItem)o).getIcon() == null )
320  return PlatformUI.getWorkbench().getSharedImages().getImage(
321  ISharedImages.IMG_OBJ_FILE);
322  return ((GrxBaseItem)o).getIcon();
323  }
324  return PlatformUI.getWorkbench().getSharedImages().getImage(
325  ISharedImages.IMG_OBJ_FOLDER);
326  }
327 
328  public void updateLabel(ViewerLabel label, Object element) {
329  label.setText( getText(element) );
330  label.setImage( getImage(element) );
331  if( GrxBaseItem.class.isAssignableFrom( element.getClass() ) ) {
332  //選択
333  if( ((GrxBaseItem)element).isSelected() ) {
334  label.setForeground( Activator.getDefault().getColor("black") );
335  //非選択
336  } else{
337  label.setForeground( Activator.getDefault().getColor("gray") );
338  label.setText( "("+getText(element)+")" );
339  }
340  }
341  }
342  }
343 
347  public void updateTree() {
348  tv.refresh();
349  tv.expandToLevel(3);
350  }
351 
352  public void update(GrxBasePlugin plugin, Object... arg) {
353  if((String)arg[0]!="PropertyChange")
354  return;
355  updateTree();
356  }
357 
358  public void registerItemChange(GrxBaseItem item, int event){
359  switch(event){
361  if(!baseItems_.contains(item)){
362  item.addObserver(this);
363  baseItems_.add(item);
364  }
365  break;
367  if(baseItems_.contains(item)){
368  item.deleteObserver(this);
369  baseItems_.remove(item);
370  }
371  break;
372  default:
373  break;
374  }
375  updateTree();
376  if(event==GrxPluginManager.FOCUSED_ITEM){
377  List<GrxBasePlugin> l = new ArrayList<GrxBasePlugin>();
378  l.add(item);
379  tv.setSelection(new StructuredSelection(l), true);
380  }
381  }
382 
383  public void shutdown(){
384  manager_.removeItemChangeListener(this, GrxBaseItem.class);
385  Iterator<GrxBasePlugin> it = baseItems_.iterator();
386  while(it.hasNext()){
387  it.next().deleteObserver(this);
388  }
389  manager_.getProject().deleteObserver(this);
390  }
391 
392 }
void registerItemChange(GrxBaseItem item, int event)
ArrayList< GrxObserver > getObserver()
void addchildrenObserver(GrxBaseItem item)
#define null
our own NULL pointer
Definition: IceTypes.h:57
png_infop png_charpp name
Definition: png.h:2382
item corresponds to a robot model
png_uint_32 i
Definition: png.h:2735
item which have a transformation
GrxLinkItem rootLink()
get root link
string a
t
This view shows tree of various items.
プラグイン管理クラス GrxUIの核になるクラス。プラグインのロード等の、初期化を実行する。 プラグインとそ...
def getText(self, nodes=None)
#define local
Definition: crc32.c:31
org
char * arg
Definition: cdjpeg.h:136
void update(GrxBasePlugin plugin, Object... arg)
ArrayList< Class<? extends GrxBaseItem > > activeItemClassList_
void * object
Definition: jmemsys.h:48


openhrp3
Author(s): AIST, General Robotix Inc., Nakamura Lab of Dept. of Mechano Informatics at University of Tokyo
autogenerated on Thu Sep 8 2022 02:24:03