@Override
  protected final void actionPerformed(PhpModule phpModule) {
    // called via shortcut
    if (!CakePhpUtils.isCakePHP(phpModule)) {
      return;
    }

    JTextComponent editor = EditorRegistry.lastFocusedComponent();
    if (editor == null) {
      return;
    }

    Document document = editor.getDocument();
    if (document == null) {
      return;
    }

    FileObject fileObject = NbEditorUtilities.getFileObject(document);
    if (fileObject == null) {
      return;
    }
    // get go to files
    CakePhpGoToStatusFactory factory = CakePhpGoToStatusFactory.getInstance();
    CakePhpGoToStatus status = factory.create(fileObject, editor.getCaretPosition());
    final List<GoToItem> items = getGoToItems(status);
    if (items == null || items.isEmpty()) {
      return;
    }

    // if there are multiple items, show popup list
    if (items.size() == 1 && !CakePreferences.isShowPopupForOneItem(phpModule)) {
      for (GoToItem item : items) {
        UiUtils.open(item.getFileObject(), item.getOffset());
        return;
      }
    }

    // show popup
    try {
      Rectangle rectangle = editor.modelToView(editor.getCaretPosition());
      final Point point = new Point(rectangle.x, rectangle.y + rectangle.height);
      SwingUtilities.convertPointToScreen(point, editor);
      SwingUtilities.invokeLater(
          new Runnable() {
            @Override
            public void run() {
              String title = getPopupTitle();
              if (title == null) {
                title = ""; // NOI18N
              }
              PopupUtil.showPopup(new GoToPopup(title, items), title, point.x, point.y, true, 0);
            }
          });
    } catch (BadLocationException ex) {
      Exceptions.printStackTrace(ex);
    }
  }
  public static Project GetProjectFromDocument(Document document) {
    try {
      FileObject fileObject =
          (FileObject) NbEditorUtilities.getDataObject(document).files().toArray()[0];
      return FileOwnerQuery.getOwner(fileObject);
    } catch (Exception ex) {

      return null;
    }
  }
 @Override
 protected StyledDocument createStyledDocument(EditorKit kit) {
   StyledDocument doc = super.createStyledDocument(kit);
   // Enter the file object in to InputAtrributes. It can be used by lexer.
   InputAttributes attributes = new InputAttributes();
   FileObject fileObject = NbEditorUtilities.getFileObject(doc);
   final GsfLanguage lng = language.getGsfLanguage();
   if (lng != null) {
     attributes.setValue(lng.getLexerLanguage(), FileObject.class, fileObject, false);
   }
   doc.putProperty(InputAttributes.class, attributes);
   return doc;
 }
 /** *** Annotation Stuff ******* */
 static void processAnnotations(
     NbEditorDocument doc,
     List<PPLine> lineList) { // XXX needs to be split for errors and warnings
   final ArrayList<ErrorDescription> errs = new ArrayList();
   DataObject dob = NbEditorUtilities.getDataObject(doc);
   FileObject fo = dob == null ? null : dob.getPrimaryFile();
   for (PPLine line : lineList) {
     for (PPLine.Error err : line.getErrors()) {
       PPToken tok = err.token;
       int shift =
           (tok.getType() == LineParserTokens.END_OF_FILE
                   || tok.getType() == LineParserTokens.END_OF_LINE
                   || tok.getType() == LineParserTokens.OTHER_TEXT)
               ? Math.max(1, tok.getPadding().length())
               : 0;
       int loff = NbDocument.findLineOffset(doc, line.getLineNumber() - 1);
       errs.add(
           ErrorDescriptionFactory.createErrorDescription(
               err.warning ? Severity.WARNING : Severity.ERROR,
               err.message,
               fo,
               loff + tok.getColumn() - shift,
               loff + tok.getColumn() + tok.getText().length()));
     }
     ArrayList<Fix> fixes = new ArrayList();
     int start = Utilities.getRowStartFromLineOffset(doc, line.getLineNumber() - 1);
     if (line.getTokens().size() > 1
         && "//#include".equals(line.getTokens().get(0).getText())) { // NOI18N
       fixes.add(
           new InlineIncludeHint(
               (NbEditorDocument) doc, start, line.getTokens().get(1).getText()));
     } else if (line.getType() == PPLine.OLDIF || line.getType() == PPLine.OLDENDIF) {
       PPBlockInfo b = line.getBlock();
       while (b != null && b.getType() != PPLine.OLDIF) {
         b = b.getParent();
       }
       if (b != null) fixes.add(new ReplaceOldSyntaxHint(doc, lineList, b));
     }
     if (line.getType() == PPLine.UNKNOWN)
       fixes.add(new DisableHint((NbEditorDocument) doc, start));
     if (fixes.size() > 0)
       errs.add(
           ErrorDescriptionFactory.createErrorDescription(
               Severity.HINT,
               NbBundle.getMessage(DocumentPreprocessor.class, "LBL_PreprocessorHint"),
               fixes,
               doc,
               line.getLineNumber())); // NOI18N
   }
   HintsController.setErrors(doc, "preprocessor-errors", errs); // NOI18N
 }
 public MarkOccurrencesHighlighter(Document doc) {
   rp = new RequestProcessor(MarkOccurrencesHighlighter.class);
   bag = new OffsetsBag(doc);
   weakDoc = new WeakReference<Document>((Document) doc);
   DataObject dobj = NbEditorUtilities.getDataObject(weakDoc.get());
   if (dobj != null) {
     EditorCookie pane = dobj.getLookup().lookup(EditorCookie.class);
     JEditorPane[] panes = pane.getOpenedPanes();
     if (panes != null && panes.length > 0) {
       comp = panes[0];
       comp.addCaretListener(this);
     }
   }
 }
  @Override
  public CompletionTask createTask(int queryType, JTextComponent component) {
    if (queryType != CompletionProvider.COMPLETION_QUERY_TYPE) {
      return null;
    }

    Document doc = component.getDocument();
    FileObject fileObject = NbEditorUtilities.getFileObject(doc);
    if (fileObject == null) {
      return null;
    }

    PhpModule phpModule = PhpModule.forFileObject(fileObject);
    if (!YiiUtils.isYii(phpModule)) {
      return null;
    }
    return createTask(queryType, component, phpModule);
  }
 static String getFileName(JTextComponent targetComponent) {
   FileObject fo = NbEditorUtilities.getFileObject(targetComponent.getDocument());
   return fo.getName();
 }