Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
   * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
   * Other names may be trademarks of their respective owners.
   * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Oracle in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  * Contributor(s):
  * The Original Software is NetBeans. The Initial Developer of the Original
  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
  * Microsystems, Inc. All Rights Reserved.
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
 package org.netbeans.modules.i18n;
Insert internationalized string at caret position (if it is not in guarded block).

Backported from prj40_prototype branch.

Petr Jiricka, Peter Zavadsky
 public class InsertI18nStringAction extends CookieAction {

Generated serial version UID.
     static final long serialVersionUID =-7002111874047983222L;
     // lifetime performAction:
     // Position where to insert the new i18n-string.
     private transient Position position;
     private transient I18nSupport support;
     private transient I18nPanel i18nPanel;
     private transient DataObject dataObject;
     public InsertI18nStringAction() {
Open I18nPanel and grab user response then update Document.

activatedNodes currently activated nodes
    protected void performAction (final Node[] activatedNodes) {
        try {
            final EditorCookie editorCookie = (activatedNodes[0]).getCookie(EditorCookie.class);
            if (editorCookie == null) {
                Util.debug(new IllegalArgumentException("Missing editor cookie!")); // NOI18N
            // Set data object.
             = activatedNodes[0].getCookie(DataObject.class);
            if ( == null) {
                Util.debug(new IllegalArgumentException("Missing DataObject!"));    // NOI18N
            JEditorPane[] panes = editorCookie.getOpenedPanes();
            if (panes == null || panes.length == 0) {
                //??? should it be tools action at all, once launched
                // from node it may raise this exception or it inserts
                // string in latest caret position in possibly hidden source
                Util.debug(new IllegalArgumentException("Missing editor pane!"));   // NOI18N
            // Set insert position.
             = NbDocument.createPosition(panes[0].getDocument(), panes[0].getCaret().getDot(), ..);
            // If there is a i18n action in run on the same editor, cancel it.
            try {
            } catch(IOException ex) {
                String msg = "Document loading failure " + .getName();    // NOI18N
            // Ensure caret is visible.
        } catch (BadLocationException blex) {
        } finally {
             = null;
             = null;
             = null;
             = null;

    private void insertI18nString() {
        try {
            I18nString i18nString = .getI18nString();
            if(i18nString.key == null || "".equals(i18nString.key)) {
            // Try to add key to bundle.
            // Create field if necessary.
            // PENDING, should not be performed here -> capability moves to i18n wizard.
            // Replace string.
            String code = i18nString.getReplaceString();
            .getDocument().insertString(.getOffset(), codenull);
        } catch (IllegalStateException e) {
            NotifyDescriptor.Message msg = new NotifyDescriptor.Message(
        } catch (BadLocationException e) {
                new NotifyDescriptor.Message(

Create panel used for specifying i18n string.
    private JPanel createPanel() throws IOException {
        I18nSupport.Factory factory = FactoryRegistry.getFactory(.getClass());
        if(factory == null)
            throw new IllegalStateException("I18N: No factory registered for data object type="+.getClass().getName()); // NOI18N
         = factory.create();
        //If you decide for caching impl it must be invalidated on
        //dataobject and document instabce change and update properties keys regularly.
        return ;

Basically I18nPanel wrapped by Ok, Cancel and Help buttons shown. Handles OK button.
    private void showModalPanel() throws IOException {
        DialogDescriptor dd = new DialogDescriptor(
            new HelpCtx(InsertI18nStringAction.class),
        Dialog dialog = DialogDisplayer.getDefault().createDialog(dd);
        if (dd.getValue() == .) {

Overrides superclass method. Adds additional test if i18n module has registered factory for this data object to be able to perform i18n action.
    protected boolean enable(Node[] activatedNodes) {
        if (!super.enable(activatedNodes)) return false;
        // if has an open editor pane must not be in a guarded block
        // PENDING>>
        // It causes StackOverflowError
        // I18nSupport.isGuardedPosittion() checks teh way it causes change cookies (remove add SaveCookie), what
        // in turn calls back enable method, it calls isGuardedPosition again etc. etc.
        /*final SourceCookie.Editor sec = (SourceCookie.Editor)(activatedNodes[0]).getCookie(SourceCookie.Editor.class);
        if (sec != null) {
            JEditorPane[] edits = sec.getOpenedPanes();
            if (edits != null && edits.length > 0) {
                int position = edits[0].getCaret().getDot();
                StyledDocument doc = sec.getDocument();
                DataObject obj = (DataObject)sec.getSource().getCookie(DataObject.class);
                if(I18nSupport.getI18nSupport(doc, obj).isGuardedPosition(position))
                    return false;
        // PENDING<<
        DataObject dataObject = activatedNodes[0].getCookie(DataObject.class);
        if (dataObject == nullreturn false;
	// check that the node has project
	if (FileOwnerQuery.getOwner(dataObject.getPrimaryFile()) == nullreturn false;
        if (FactoryRegistry.hasFactory(dataObject.getClass()) == falsereturn false;
        EditorCookie sec = (activatedNodes[0]).getCookie(EditorCookie.class);
        if (sec == nullreturn false;
        return hasOpenedPane(sec); // #188430

Checks whether at least one opened editor pane exists.

ec the EditorCookie associated to the editor pane.
(@code true} if the editor pane associated with the specified EditorCookie exists, otherwise (@code false}.
See also:
Bug 188430
    private boolean hasOpenedPane(EditorCookie ec) {
        JEditorPane pane = NbDocument.findRecentEditorPane(ec);
        return pane != null;

Implements superclass abstract method.

    protected int mode () {
        return ;

Implemenst superclass abstract method.

EditorCookie.class #see org.openide.cookies.EditorCookie
    protected Class[] cookieClasses () {
        return new Class [] {

Gets localized name of action. Overrides superclass method.
    public String getName() {
        return I18nUtil.getBundle().getString("CTL_InsertI18nString");

Gets the action's help context. Implemenst superclass abstract method.
    public HelpCtx getHelpCtx() {
        return new HelpCtx(.);
    protected boolean asynchronous() {
      return false;
New to GrepCode? Check out our FAQ X