1 27 28 package org.nightlabs.editor2d.outline; 29 30 import java.beans.PropertyChangeEvent ; 31 import java.beans.PropertyChangeListener ; 32 import java.util.Collection ; 33 import java.util.Iterator ; 34 35 import org.apache.log4j.Logger; 36 import org.eclipse.core.runtime.IAdaptable; 37 import org.eclipse.draw2d.J2DLightweightSystem; 38 import org.eclipse.draw2d.LightweightSystem; 39 import org.eclipse.draw2d.MarginBorder; 40 import org.eclipse.draw2d.Viewport; 41 import org.eclipse.draw2d.parts.ScrollableThumbnail; 42 import org.eclipse.draw2d.parts.Thumbnail; 43 import org.eclipse.gef.ContextMenuProvider; 44 import org.eclipse.gef.EditPartViewer; 45 import org.eclipse.gef.LayerConstants; 46 import org.eclipse.gef.RootEditPart; 47 import org.eclipse.gef.editparts.J2DScalableFreeformRootEditPart; 48 import org.eclipse.gef.editparts.ZoomManager; 49 import org.eclipse.gef.ui.actions.ActionRegistry; 50 import org.eclipse.gef.ui.parts.ContentOutlinePage; 51 import org.eclipse.jface.action.Action; 52 import org.eclipse.jface.action.IAction; 53 import org.eclipse.jface.action.IMenuManager; 54 import org.eclipse.jface.action.IToolBarManager; 55 import org.eclipse.swt.SWT; 56 import org.eclipse.swt.events.DisposeEvent; 57 import org.eclipse.swt.events.DisposeListener; 58 import org.eclipse.swt.widgets.Canvas; 59 import org.eclipse.swt.widgets.Composite; 60 import org.eclipse.swt.widgets.Control; 61 import org.eclipse.ui.IActionBars; 62 import org.eclipse.ui.actions.ActionFactory; 63 import org.eclipse.ui.part.IPageSite; 64 import org.eclipse.ui.part.PageBook; 65 import org.holongate.j2d.J2DCanvas; 66 import org.nightlabs.base.resource.SharedImages; 67 import org.nightlabs.editor2d.AbstractEditor; 68 import org.nightlabs.editor2d.EditorContextMenuProvider; 69 import org.nightlabs.editor2d.EditorPlugin; 70 import org.nightlabs.editor2d.j2dswt.MLDCPaintable; 71 import org.nightlabs.editor2d.outline.filter.FilterManager; 72 73 74 public class EditorOutlinePage 75 extends ContentOutlinePage 76 implements IAdaptable 77 { 78 public static final Logger LOGGER = Logger.getLogger(EditorOutlinePage.class.getName()); 79 80 static final int ID_OUTLINE = 0; 81 static final int ID_OVERVIEW = 1; 82 static final int ID_FILTER = 3; 83 84 protected AbstractEditor editor; 85 protected FilterManager filterMan; 86 protected IAction showFilterAction; 87 88 protected PageBook pageBook; 89 protected Control outline; 90 protected IAction showOutlineAction; 91 protected IAction showOverviewAction; 92 protected IAction filterOutlineAction; 93 protected Thumbnail thumbnail; 94 protected DisposeListener disposeListener; 95 96 protected Canvas overview; 97 98 public EditorOutlinePage(AbstractEditor editor, EditPartViewer viewer){ 99 super(viewer); 100 this.editor = editor; 101 this.filterMan = editor.getFilterManager(); 102 filterMan.addPropertyChangeListener(filterListener); 103 } 104 105 public void init(IPageSite pageSite) { 106 super.init(pageSite); 107 ActionRegistry registry = editor.getOutlineActionRegistry(); 108 IActionBars bars = pageSite.getActionBars(); 109 String id = ActionFactory.UNDO.getId(); 110 bars.setGlobalActionHandler(id, registry.getAction(id)); 111 id = ActionFactory.REDO.getId(); 112 bars.setGlobalActionHandler(id, registry.getAction(id)); 113 id = ActionFactory.DELETE.getId(); 114 bars.setGlobalActionHandler(id, registry.getAction(id)); 115 bars.updateActionBars(); 116 } 117 118 protected void configureOutlineViewer() 119 { 120 getViewer().setEditDomain(editor.getOutlineEditDomain()); 121 getViewer().setEditPartFactory(editor.getOutlineEditPartFactory()); 122 ContextMenuProvider provider = editor.getContextMenuProvider(); 123 getViewer().setContextMenu(provider); 124 getSite().registerContextMenu( 126 EditorContextMenuProvider.CONTEXT_MENU_ID, provider, getSite().getSelectionProvider()); 128 getViewer().setKeyHandler(editor.getCommonKeyHandler()); 129 IToolBarManager tbm = getSite().getActionBars().getToolBarManager(); 132 133 IMenuManager menuMan = getSite().getActionBars().getMenuManager(); 134 createFilterEntries(menuMan); 135 136 showOutlineAction = new Action() { 138 public void run() { 139 showPage(ID_OUTLINE); 140 } 141 }; 142 showOutlineAction.setImageDescriptor(SharedImages.getSharedImageDescriptor( 145 EditorPlugin.getDefault(), EditorOutlinePage.class, "Outline")); 146 147 tbm.add(showOutlineAction); 148 149 showOverviewAction = new Action() { 151 public void run() { 152 showPage(ID_OVERVIEW); 153 } 154 }; 155 showOverviewAction.setImageDescriptor(SharedImages.getSharedImageDescriptor( 158 EditorPlugin.getDefault(), EditorOutlinePage.class, "Overview")); 159 tbm.add(showOverviewAction); 160 161 showPage(ID_OUTLINE); 162 } 163 164 protected IAction createFilterAction(final Class c) 165 { 166 IAction filterAction = new Action() { 167 public void run() { 168 filterMan.setFilter(c); 169 } 170 }; 171 filterAction.setText(filterMan.getTypeName(c)); 172 return filterAction; 173 } 174 175 protected void createFilterEntries(IMenuManager menuMan) 176 { 177 IAction filterNoneAction = new Action() { 178 public void run() { 179 filterMan.setAllFiltersAvailable(); 180 } 181 }; 182 filterNoneAction.setText(EditorPlugin.getResourceString("action.filter.none")); 183 menuMan.add(filterNoneAction); 184 185 for (Iterator it = filterMan.getAllFilters().iterator(); it.hasNext(); ) 186 { 187 Class c = (Class ) it.next(); 188 IAction filterAction = createFilterAction(c); 189 menuMan.add(filterAction); 190 } 191 } 192 193 public void createControl(Composite parent){ 194 pageBook = new PageBook(parent, SWT.NONE); 195 outline = getViewer().createControl(pageBook); 196 199 overview = new J2DCanvas(pageBook, SWT.NONE, new MLDCPaintable(editor.getMultiLayerDrawComponent())); 201 pageBook.showPage(outline); 202 configureOutlineViewer(); 203 hookOutlineViewer(); 204 initializeOutlineViewer(); 205 } 206 207 public void dispose(){ 208 unhookOutlineViewer(); 209 if (thumbnail != null) { 210 thumbnail.deactivate(); 211 thumbnail = null; 212 } 213 super.dispose(); 214 } 216 217 public Object getAdapter(Class type) { 218 if (type == ZoomManager.class) 219 return editor.getOutlineGraphicalViewer().getProperty(ZoomManager.class.toString()); 220 return null; 221 } 222 223 public Control getControl() { 224 return pageBook; 225 } 226 227 protected void hookOutlineViewer(){ 228 editor.getOutlineSelectionSynchronizer().addViewer(getViewer()); 229 } 230 231 protected void initializeOutlineViewer(){ 232 setContents(editor.getMultiLayerDrawComponent()); 233 } 234 235 protected void initializeOverview() 257 { 258 LightweightSystem lws = new J2DLightweightSystem(overview); 259 RootEditPart rep = editor.getOutlineGraphicalViewer().getRootEditPart(); 261 if (rep instanceof J2DScalableFreeformRootEditPart) { 262 J2DScalableFreeformRootEditPart root = (J2DScalableFreeformRootEditPart)rep; 263 thumbnail = new ScrollableThumbnail((Viewport)root.getFigure()); 265 thumbnail.setBorder(new MarginBorder(3)); 266 thumbnail.setSource(root.getLayer(LayerConstants.PRINTABLE_LAYERS)); 267 lws.setContents(thumbnail); 268 disposeListener = new DisposeListener() { 269 public void widgetDisposed(DisposeEvent e) { 270 if (thumbnail != null) { 271 thumbnail.deactivate(); 272 thumbnail = null; 273 } 274 } 275 }; 276 editor.getEditor().addDisposeListener(disposeListener); 277 } 278 } 279 280 public void setContents(Object contents) { 281 getViewer().setContents(contents); 282 } 283 284 protected void showPage(int id) { 285 if (id == ID_OUTLINE) { 286 showOutlineAction.setChecked(true); 287 showOverviewAction.setChecked(false); 288 pageBook.showPage(outline); 289 if (thumbnail != null) 290 thumbnail.setVisible(false); 291 } 292 else if (id == ID_OVERVIEW) { 293 if (thumbnail == null) 294 initializeOverview(); 295 showOutlineAction.setChecked(false); 296 showOverviewAction.setChecked(true); 297 pageBook.showPage(overview); 298 thumbnail.setVisible(true); 299 } 300 } 301 302 protected void unhookOutlineViewer(){ 303 editor.getOutlineSelectionSynchronizer().removeViewer(getViewer()); 304 if (disposeListener != null && editor.getEditor() != null && !editor.getEditor().isDisposed()) 305 editor.getEditor().removeDisposeListener(disposeListener); 306 } 307 308 protected PropertyChangeListener filterListener = new PropertyChangeListener () 309 { 310 public void propertyChange(PropertyChangeEvent pce) 311 { 312 if (pce.getPropertyName().equals(FilterManager.FILTER_CHANGED)) 313 { 314 getViewer().setContents(editor.getMultiLayerDrawComponent()); 315 } 316 else if (pce.getPropertyName().equals(FilterManager.FILTER_ADDED)) 317 { 318 Object o = pce.getNewValue(); 319 if (o instanceof Class ) { 320 IMenuManager menuMan = getSite().getActionBars().getMenuManager(); 321 Class c = (Class ) o; 322 menuMan.add(createFilterAction(c)); 323 getViewer().setContents(editor.getMultiLayerDrawComponent()); 324 } 325 } 326 else if (pce.getPropertyName().equals(FilterManager.FILTERS_ADDED)) 327 { 328 Object o = pce.getNewValue(); 329 if (o instanceof Collection ) { 330 IMenuManager menuMan = getSite().getActionBars().getMenuManager(); 331 Collection classes = (Collection ) o; 332 for (Iterator it = classes.iterator(); it.hasNext(); ) { 333 Class c = (Class ) it.next(); 334 menuMan.add(createFilterAction(c)); 335 } 336 getViewer().setContents(editor.getMultiLayerDrawComponent()); 337 } 338 } 339 } 340 }; 341 342 } 343 | Popular Tags |