ruby.refactoring/src/org/netbeans/modules/refactoring/ruby/DiffElement.java
author enebo@netbeans.org
Tue, 22 Apr 2014 15:36:21 -0500
changeset 4559 7a0a8afa3e90
parent 4117 6e1f647524a5
permissions -rw-r--r--
Bump jruby-parser and hopefully see green (commented out tests pass individually -- some state surviving to kill them later -- workaround for now)
     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * Contributor(s):
    28  *
    29  * The Original Software is NetBeans. The Initial Developer of the Original
    30  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun
    31  * Microsystems, Inc. All Rights Reserved.
    32  *
    33  * If you wish your version of this file to be governed by only the CDDL
    34  * or only the GPL Version 2, indicate your decision by adding
    35  * "[Contributor] elects to include this software in this distribution
    36  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    37  * single choice of license, a recipient has the option to distribute
    38  * your version of this file under either the CDDL, the GPL Version 2 or
    39  * to extend the choice of license to its licensees as provided above.
    40  * However, if you add GPL Version 2 code and therefore, elected the GPL
    41  * Version 2 license, then the option applies only if the new code is
    42  * made subject to such option by the copyright holder.
    43  */
    44 package org.netbeans.modules.refactoring.ruby;
    45 
    46 import java.io.IOException;
    47 import java.lang.ref.WeakReference;
    48 import org.netbeans.modules.csl.spi.support.ModificationResult;
    49 import org.netbeans.modules.csl.spi.support.ModificationResult.Difference;
    50 import org.netbeans.modules.refactoring.spi.SimpleRefactoringElementImplementation;
    51 import org.openide.filesystems.FileLock;
    52 import org.openide.filesystems.FileObject;
    53 import org.openide.text.PositionBounds;
    54 import org.openide.util.Exceptions;
    55 import org.openide.util.Lookup;
    56 import org.openide.util.lookup.Lookups;
    57 
    58 /**
    59  *
    60  * @author Jan Becicka
    61  */
    62  public class DiffElement extends SimpleRefactoringElementImplementation {
    63      
    64     private PositionBounds bounds;
    65     private String displayText;
    66     private FileObject parentFile;
    67     private Difference diff;
    68     private ModificationResult modification;
    69     private WeakReference<String> newFileContent;
    70     
    71     public DiffElement(Difference diff, PositionBounds bounds, FileObject parentFile, ModificationResult modification) {
    72         this.bounds = bounds;
    73         this.displayText = diff.getDescription();
    74         this.parentFile = parentFile;
    75         this.diff = diff;
    76         this.modification = modification;
    77     }
    78 
    79     @Override
    80     public String getDisplayText() {
    81         return displayText;
    82     }
    83 
    84     @Override
    85     public Lookup getLookup() {
    86 //        Object composite = ElementGripFactory.getDefault().get(parentFile, bounds.getBegin().getOffset());
    87 //        if (composite==null)
    88 //            composite = parentFile;
    89 //        return Lookups.fixed(composite, diff);
    90         return Lookups.fixed(diff);
    91     }
    92     
    93     @Override
    94     public void setEnabled(boolean enabled) {
    95         diff.exclude(!enabled);
    96         newFileContent = null;
    97         super.setEnabled(enabled);
    98     }
    99 
   100     @Override
   101     public PositionBounds getPosition() {
   102         return bounds;
   103     }
   104 
   105     public String getText() {
   106         return displayText;
   107     }
   108 
   109     @Override
   110     public void performChange() {
   111         String oldFileName = diff.getOldText();
   112         String newFileName = diff.getNewText();
   113 
   114         if (parentFile.getName().equals(oldFileName)) {
   115             try {
   116                 FileLock fileLock = parentFile.lock();
   117                 parentFile.rename(fileLock, newFileName, "ruby"); // NOI18N
   118                 fileLock.releaseLock();
   119             } catch (IOException e) {
   120                 Exceptions.printStackTrace(e);
   121             }
   122         }
   123 
   124     }
   125 
   126     @Override
   127     public FileObject getParentFile() {
   128         return parentFile;
   129     }
   130     
   131     @Override
   132     protected String getNewFileContent() {
   133         String result;
   134         if (newFileContent !=null) {
   135             result = newFileContent.get();
   136             if (result!=null)
   137                 return result;
   138         }
   139         try {
   140             result = modification.getResultingSource(parentFile);
   141         } catch (IOException ex) {
   142             Exceptions.printStackTrace(ex);
   143             return null;
   144         }
   145         newFileContent = new WeakReference<String>(result);
   146         return result;
   147     }
   148     
   149     public static DiffElement create(Difference diff, FileObject fileObject, ModificationResult modification) {
   150         PositionBounds bounds = new PositionBounds(diff.getStartPosition(), diff.getEndPosition());
   151         
   152         return new DiffElement(diff, bounds, fileObject, modification);
   153     }    
   154 }