| /* |
| * Copyright 2000-2010 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.intellij.plugins.intelliLang.inject.config.ui; |
| |
| import com.intellij.openapi.editor.Document; |
| import com.intellij.openapi.editor.ex.EditorEx; |
| import com.intellij.openapi.fileTypes.FileType; |
| import com.intellij.openapi.fileTypes.FileTypeManager; |
| import com.intellij.openapi.fileTypes.FileTypes; |
| import com.intellij.openapi.fileTypes.UnknownFileType; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.patterns.ElementPattern; |
| import com.intellij.patterns.compiler.PatternCompiler; |
| import com.intellij.patterns.compiler.PatternCompilerImpl; |
| import com.intellij.psi.PsiDocumentManager; |
| import com.intellij.psi.PsiElement; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.PsiFileFactory; |
| import com.intellij.ui.EditorTextField; |
| import org.intellij.plugins.intelliLang.inject.config.BaseInjection; |
| import org.intellij.plugins.intelliLang.inject.config.InjectionPlace; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.util.ArrayList; |
| |
| /** |
| * @author Gregory.Shrago |
| */ |
| public class BaseInjectionPanel extends AbstractInjectionPanel<BaseInjection> { |
| |
| // read by reflection |
| LanguagePanel myLanguagePanel; |
| JPanel myCenterPanel; |
| EditorTextField myTextArea; |
| AdvancedPanel myAdvancedPanel; |
| |
| private JPanel myRoot; |
| private JTextField myNameTextField; |
| private PatternCompiler<PsiElement> myHelper; |
| |
| public BaseInjectionPanel(BaseInjection injection, Project project) { |
| super(injection, project); |
| $$$setupUI$$$(); // see IDEA-9987 |
| myHelper = injection.getCompiler(); |
| final FileType groovy = FileTypeManager.getInstance().getFileTypeByExtension("groovy"); |
| final FileType realFileType = groovy == UnknownFileType.INSTANCE ? FileTypes.PLAIN_TEXT : groovy; |
| final PsiFile psiFile = PsiFileFactory.getInstance(project).createFileFromText("injection." + realFileType.getDefaultExtension(), realFileType, "", 0, true); |
| final Document document = PsiDocumentManager.getInstance(project).getDocument(psiFile); |
| psiFile.putUserData(BaseInjection.INJECTION_KEY, injection); |
| myTextArea = new EditorTextField(document, project, realFileType) { |
| @Override |
| protected EditorEx createEditor() { |
| final EditorEx ex = super.createEditor(); |
| ex.setVerticalScrollbarVisible(true); |
| ex.setHorizontalScrollbarVisible(true); |
| return ex; |
| } |
| |
| @Override |
| protected boolean isOneLineMode() { |
| return false; |
| } |
| }; |
| myCenterPanel.add(myTextArea, BorderLayout.CENTER); |
| myTextArea.setFontInheritedFromLAF(false); |
| //myTextArea.setFont(EditorColorsManager.getInstance().getGlobalScheme().getFont(EditorFontType.PLAIN)); |
| init(injection.copy()); |
| } |
| |
| protected void apply(BaseInjection other) { |
| final String displayName = myNameTextField.getText(); |
| if (StringUtil.isEmpty(displayName)) { |
| throw new IllegalArgumentException("Display name should not be empty"); |
| } |
| other.setDisplayName(displayName); |
| boolean enabled = true; |
| final StringBuilder sb = new StringBuilder(); |
| final ArrayList<InjectionPlace> places = new ArrayList<InjectionPlace>(); |
| for (String s : myTextArea.getText().split("\\s*\n\\s*")) { |
| final boolean nextEnabled; |
| if (s.startsWith("+")) { |
| nextEnabled = true; |
| s = s.substring(1).trim(); |
| } |
| else if (s.startsWith("-")) { |
| nextEnabled = false; |
| s = s.substring(1).trim(); |
| } |
| else { |
| sb.append(s.trim()); |
| continue; |
| } |
| if (sb.length() > 0) { |
| final String text = sb.toString(); |
| places.add(new InjectionPlace(myHelper.compileElementPattern(text), enabled)); |
| sb.setLength(0); |
| } |
| sb.append(s); |
| enabled = nextEnabled; |
| } |
| if (sb.length() > 0) { |
| final String text = sb.toString(); |
| places.add(new InjectionPlace(myHelper.compileElementPattern(text), enabled)); |
| } |
| for (InjectionPlace place : places) { |
| ElementPattern<PsiElement> pattern = place.getElementPattern(); |
| if (pattern instanceof PatternCompilerImpl.LazyPresentablePattern) { |
| try { |
| ((PatternCompilerImpl.LazyPresentablePattern)pattern).compile(); |
| } |
| catch (Throwable ex) { |
| throw (RuntimeException)new IllegalArgumentException("Pattern failed to compile:").initCause(ex); |
| } |
| } |
| } |
| other.setInjectionPlaces(places.toArray(new InjectionPlace[places.size()])); |
| } |
| |
| protected void resetImpl() { |
| final StringBuilder sb = new StringBuilder(); |
| for (InjectionPlace place : myOrigInjection.getInjectionPlaces()) { |
| sb.append(place.isEnabled()?"+ ":"- ").append(place.getText()).append("\n"); |
| } |
| myTextArea.setText(sb.toString()); |
| myNameTextField.setText(myOrigInjection.getDisplayName()); |
| } |
| |
| public JPanel getComponent() { |
| return myRoot; |
| } |
| |
| private void createUIComponents() { |
| myLanguagePanel = new LanguagePanel(myProject, myOrigInjection); |
| myAdvancedPanel = new AdvancedPanel(myProject, myOrigInjection); |
| } |
| |
| private void $$$setupUI$$$() { |
| } |
| |
| } |
| |