1 19 20 package org.netbeans.modules.xml.wsdl.ui.netbeans.module; 21 22 import java.awt.EventQueue ; 23 import java.io.IOException ; 24 import java.io.Serializable ; 25 import java.util.ArrayList ; 26 import java.util.Enumeration ; 27 import java.util.List ; 28 import java.util.Set ; 29 import javax.swing.text.AbstractDocument ; 30 import javax.swing.text.StyledDocument ; 31 import org.netbeans.core.api.multiview.MultiViewHandler; 32 import org.netbeans.core.api.multiview.MultiViews; 33 import org.netbeans.core.spi.multiview.CloseOperationHandler; 34 import org.netbeans.core.spi.multiview.CloseOperationState; 35 import org.netbeans.modules.xml.retriever.catalog.Utilities; 36 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 37 import org.netbeans.modules.xml.wsdl.model.WSDLModelFactory; 38 import org.netbeans.modules.xml.xam.ModelSource; 39 import org.netbeans.modules.xml.xam.ui.undo.QuietUndoManager; 40 import org.openide.DialogDisplayer; 41 import org.openide.NotifyDescriptor; 42 import org.openide.awt.UndoRedo; 43 import org.openide.cookies.CloseCookie; 44 import org.openide.cookies.EditCookie; 45 import org.openide.cookies.EditorCookie; 46 import org.openide.cookies.LineCookie; 47 import org.openide.cookies.OpenCookie; 48 import org.openide.filesystems.FileLock; 49 import org.openide.filesystems.FileObject; 50 import org.openide.loaders.DataObject; 51 import org.openide.text.CloneableEditor; 52 import org.openide.text.CloneableEditorSupport; 53 import org.openide.text.CloneableEditorSupport.Pane; 54 import org.openide.text.DataEditorSupport; 55 import org.openide.util.NbBundle; 56 import org.openide.util.Task; 57 import org.openide.util.TaskListener; 58 import org.openide.windows.CloneableTopComponent; 59 import org.openide.windows.Mode; 60 import org.openide.windows.TopComponent; 61 import org.openide.windows.WindowManager; 62 63 64 69 public class WSDLEditorSupport extends DataEditorSupport 70 implements WSDLModelCookie, OpenCookie, EditCookie, 71 EditorCookie.Observable, LineCookie, CloseCookie { 72 73 private transient Task prepareTask2; 74 75 79 public WSDLEditorSupport(WSDLDataObject sobj) { 80 super(sobj, new WSDLEditorEnv(sobj)); 81 setMIMEType("text/xml"); 82 } 85 86 87 91 public WSDLEditorEnv getEnv() { 92 return (WSDLEditorEnv)env; 93 } 94 95 @Override 96 protected Pane createPane() { 97 TopComponent tc = WSDLMultiViewFactory.createMultiView( 98 (WSDLDataObject) getDataObject()); 99 Mode editorMode = WindowManager.getDefault().findMode( 103 WSDLEditorSupport.EDITOR_MODE); 104 if (editorMode != null) { 105 editorMode.dockInto(tc); 106 } 107 return (Pane) tc; 108 } 109 110 114 public static boolean isLastView(TopComponent tc) { 115 116 if (!(tc instanceof CloneableTopComponent)) 117 return false; 118 119 boolean oneOrLess = true; 120 Enumeration en = 121 ((CloneableTopComponent)tc).getReference().getComponents(); 122 if (en.hasMoreElements()) { 123 en.nextElement(); 124 if (en.hasMoreElements()) 125 oneOrLess = false; 126 } 127 128 return oneOrLess; 129 } 130 131 @Override 133 public void initializeCloneableEditor(CloneableEditor editor) { 134 super.initializeCloneableEditor(editor); 135 EventQueue.invokeLater(new Runnable () { 138 public void run() { 139 updateTitles(); 141 } 142 }); 143 } 144 145 @Override 146 protected void updateTitles() { 147 151 super.updateTitles(); 153 154 EventQueue.invokeLater(new Runnable () { 156 public void run() { 157 List <TopComponent> associatedTCs = new ArrayList <TopComponent>(); 164 DataObject targetDO = getDataObject(); 165 TopComponent activeTC = TopComponent.getRegistry().getActivated(); 166 if (activeTC != null && targetDO == (DataObject) activeTC.getLookup().lookup( 167 DataObject.class)) { 168 associatedTCs.add(activeTC); 169 } 170 Set openTCs = TopComponent.getRegistry().getOpened(); 171 for (Object tc : openTCs) { 172 TopComponent tcc = (TopComponent) tc; 173 if (targetDO == (DataObject) tcc.getLookup().lookup( 174 DataObject.class)) { 175 associatedTCs.add(tcc); 176 } 177 } 178 for (TopComponent tc : associatedTCs) { 179 MultiViewHandler mvh = MultiViews.findMultiViewHandler(tc); 182 if (mvh != null) { 183 tc.setHtmlDisplayName(messageHtmlName()); 184 String name = messageName(); 185 tc.setDisplayName(name); 186 tc.setName(name); 187 tc.setToolTipText(messageToolTip()); 188 } 189 } 190 } 191 }); 192 } 193 194 @Override 195 protected UndoRedo.Manager createUndoRedoManager() { 196 return new QuietUndoManager(super.createUndoRedoManager()); 199 } 202 203 208 public QuietUndoManager getUndoManager() { 209 return (QuietUndoManager) getUndoRedo(); 210 } 211 212 @Override 213 public Task prepareDocument() { 214 Task task = super.prepareDocument(); 215 if (task != prepareTask2) { 217 prepareTask2 = task; 218 task.addTaskListener(new TaskListener() { 219 public void taskFinished(Task task) { 220 QuietUndoManager undo = getUndoManager(); 221 StyledDocument doc = getDocument(); 222 synchronized (undo) { 223 undo.setDocument((AbstractDocument ) doc); 225 if (!undo.isCompound()) { 226 doc.removeUndoableEditListener(undo); 230 addUndoManagerToModel(undo); 232 } 233 } 234 prepareTask2 = null; 235 } 236 }); 237 } 238 return task; 239 } 240 public Task reloadDocument() { 241 Task task = super.reloadDocument(); 242 task.addTaskListener(new TaskListener() { 243 public void taskFinished(Task task) { 244 EventQueue.invokeLater(new Runnable () { 245 public void run() { 246 QuietUndoManager undo = getUndoManager(); 247 StyledDocument doc = getDocument(); 248 synchronized (undo) { 251 if (!undo.isCompound()) { 252 doc.removeUndoableEditListener(undo); 253 } 254 } 255 } 256 }); 257 } 258 }); 259 return task; 260 } 261 262 protected void notifyClosed() { 263 QuietUndoManager undo = getUndoManager(); 265 StyledDocument doc = getDocument(); 266 synchronized (undo) { 267 if (doc != null) { 269 doc.removeUndoableEditListener(undo); 270 undo.endCompound(); 271 undo.setDocument(null); 272 } 273 try { 274 WSDLModel model = getModel(); 275 if (model != null) { 276 model.removeUndoableEditListener(undo); 277 } 278 undo.setModel(null); 280 } catch (IOException ioe) { 281 } 284 } 285 super.notifyClosed(); 286 } 287 288 public WSDLModel getModel() throws IOException { 289 WSDLDataObject dobj = getEnv().getWSDLDataObject(); 290 ModelSource modelSource = Utilities.getModelSource(dobj.getPrimaryFile(), true); 291 if(modelSource != null) { 292 return WSDLModelFactory.getDefault().getModel(modelSource); 293 } 294 295 return null; 296 } 297 298 305 public void addUndoManagerToDocument() { 306 QuietUndoManager undo = getUndoManager(); 310 StyledDocument doc = getDocument(); 311 synchronized (undo) { 312 try { 313 WSDLModel model = getModel(); 314 if (model != null) { 315 model.removeUndoableEditListener(undo); 316 } 317 undo.setModel(null); 319 } catch (IOException ioe) { 320 } 323 if (doc != null) { 325 doc.removeUndoableEditListener(undo); 327 doc.addUndoableEditListener(undo); 328 undo.beginCompound(); 333 } 334 } 335 } 336 337 344 public void removeUndoManagerFromDocument() { 345 QuietUndoManager undo = getUndoManager(); 347 StyledDocument doc = getDocument(); 348 synchronized (undo) { 349 if (doc != null) { 351 doc.removeUndoableEditListener(undo); 352 undo.endCompound(); 353 } 354 addUndoManagerToModel(undo); 357 } 358 } 359 360 368 private void addUndoManagerToModel(QuietUndoManager undo) { 369 try { 371 WSDLModel model = getModel(); 372 if (model != null) { 373 model.removeUndoableEditListener(undo); 375 model.addUndoableEditListener(undo); 376 undo.setModel(model); 380 } 381 } catch (IOException ioe) { 382 } 384 } 385 386 392 public boolean silentClose() { 393 return super.close(false); 394 } 395 396 399 public void syncModel() { 400 try { 404 if(getModel() != null) { 405 getModel().sync(); 406 } 407 } catch (Throwable ioe) { 408 NotifyDescriptor nd = new NotifyDescriptor.Message(NbBundle.getMessage(WSDLEditorSupport.class, "MSG_NotWellformedWsdl"), NotifyDescriptor.ERROR_MESSAGE); 410 DialogDisplayer.getDefault().notify(nd); 411 } 412 413 } 414 415 419 422 protected static class WSDLEditorEnv extends DataEditorSupport.Env { 423 424 static final long serialVersionUID =1099957785497677206L; 425 426 public WSDLEditorEnv(WSDLDataObject obj) { 427 super(obj); 428 } 429 430 public CloneableEditorSupport findTextEditorSupport() { 431 return getWSDLDataObject().getWSDLEditorSupport(); 432 } 433 434 public WSDLDataObject getWSDLDataObject(){ 435 return (WSDLDataObject) getDataObject(); 436 } 437 438 @Override 439 protected FileObject getFile() { 440 return getDataObject().getPrimaryFile(); 441 } 442 443 @Override 444 protected FileLock takeLock() throws IOException { 445 return getDataObject().getPrimaryFile().lock(); 446 } 447 } 448 449 450 451 452 456 462 public static class CloseHandler implements CloseOperationHandler, Serializable { 463 private static final long serialVersionUID =-3838395157610633251L; 464 private DataObject dataObject; 465 466 private CloseHandler() { 467 super(); 468 } 469 470 public CloseHandler(DataObject dobj) { 471 dataObject = dobj; 472 } 473 474 private WSDLEditorSupport getWSDLEditorSupport() { 475 return dataObject instanceof WSDLDataObject ? 476 ((WSDLDataObject) dataObject).getWSDLEditorSupport() : null; 477 } 478 479 public boolean resolveCloseOperation(CloseOperationState[] elements) { 480 WSDLEditorSupport wsdlEditor = getWSDLEditorSupport(); 481 boolean canClose = wsdlEditor != null ? wsdlEditor.canClose() : true; 482 if (canClose) { 488 dataObject.setModified(false); 489 } 490 return canClose; 491 } 492 } 493 } 494 | Popular Tags |