2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com
.intellij
.ide
.fileTemplates
.impl
;
19 import com
.intellij
.ide
.IdeBundle
;
20 import com
.intellij
.ide
.fileTemplates
.*;
21 import com
.intellij
.ide
.util
.PropertiesComponent
;
22 import com
.intellij
.openapi
.Disposable
;
23 import com
.intellij
.openapi
.actionSystem
.*;
24 import com
.intellij
.openapi
.application
.ApplicationManager
;
25 import com
.intellij
.openapi
.diagnostic
.Logger
;
26 import com
.intellij
.openapi
.extensions
.Extensions
;
27 import com
.intellij
.openapi
.options
.ConfigurationException
;
28 import com
.intellij
.openapi
.options
.SearchableConfigurable
;
29 import com
.intellij
.openapi
.ui
.DialogWrapper
;
30 import com
.intellij
.openapi
.ui
.Messages
;
31 import com
.intellij
.openapi
.util
.Comparing
;
32 import com
.intellij
.openapi
.util
.Disposer
;
33 import com
.intellij
.openapi
.util
.IconLoader
;
34 import com
.intellij
.openapi
.vfs
.VirtualFile
;
35 import com
.intellij
.ui
.TabbedPaneWrapper
;
36 import com
.intellij
.util
.ArrayUtil
;
37 import com
.intellij
.util
.Function
;
38 import com
.intellij
.util
.containers
.ContainerUtil
;
39 import gnu
.trove
.THashSet
;
40 import org
.jetbrains
.annotations
.NonNls
;
41 import org
.jetbrains
.annotations
.NotNull
;
42 import org
.jetbrains
.annotations
.Nullable
;
45 import javax
.swing
.event
.ChangeEvent
;
46 import javax
.swing
.event
.ChangeListener
;
48 import java
.text
.MessageFormat
;
50 import java
.util
.List
;
58 public class AllFileTemplatesConfigurable
implements SearchableConfigurable
{
59 private static final Logger LOG
= Logger
.getInstance("#com.intellij.ide.fileTemplates.impl.AllFileTemplatesConfigurable");
60 private JPanel myMainPanel
;
61 private FileTemplateTab myCurrentTab
;
62 private FileTemplateTab myTemplatesList
;
63 private FileTemplateTab myIncludesList
;
64 private FileTemplateTab myCodeTemplatesList
;
65 private FileTemplateTab myJ2eeTemplatesList
;
66 private JComponent myToolBar
;
67 private TabbedPaneWrapper myTabbedPane
;
68 private FileTemplateConfigurable myEditor
;
69 private boolean myModified
= false;
70 private JComponent myEditorComponent
;
71 private static final int TEMPLATE_ID
= 0;
72 private static final int PATTERN_ID
= 1;
73 private static final int CODE_ID
= 2;
74 private static final int J2EE_ID
= 3;
75 private static final Icon ourIcon
= IconLoader
.getIcon("/general/fileTemplates.png");
76 private FileTemplateTab
[] myTabs
;
77 private static final String TEMPLATES_TITLE
= IdeBundle
.message("tab.filetemplates.templates");
78 private static final String INCLUDES_TITLE
= IdeBundle
.message("tab.filetemplates.includes");
79 private static final String CODE_TITLE
= IdeBundle
.message("tab.filetemplates.code");
80 private static final String J2EE_TITLE
= IdeBundle
.message("tab.filetemplates.j2ee");
81 private Disposable myUIDisposable
;
83 @NonNls private static final String CURRENT_TAB
= "FileTemplates.CurrentTab";
84 @NonNls private static final String SELECTED_TEMPLATE
= "FileTemplates.SelectedTemplate";
86 public Icon
getIcon() {
90 private void onRemove() {
91 myCurrentTab
.removeSelected();
95 private void onAdd() {
97 final FileTemplateDefaultExtension
[] defaultExtensions
= Extensions
.getExtensions(FileTemplateDefaultExtension
.EP_NAME
);
98 if (defaultExtensions
.length
> 0) {
99 ext
= defaultExtensions
[0].value
;
101 createTemplate(IdeBundle
.message("template.unnamed"), ext
, "");
104 private FileTemplate
createTemplate(@NotNull String prefName
, @NotNull @NonNls String extension
, @NotNull String content
) {
105 FileTemplate
[] templates
= myCurrentTab
.getTemplates();
106 ArrayList
<String
> names
= new ArrayList
<String
>(templates
.length
);
107 for (FileTemplate template
: templates
) {
108 names
.add(template
.getName());
110 String name
= prefName
;
112 while (names
.contains(name
)) {
113 name
= prefName
+ " (" + ++i
+ ")";
115 FileTemplate newTemplate
= new FileTemplateImpl(content
, name
, extension
);
116 myCurrentTab
.addTemplate(newTemplate
);
118 myCurrentTab
.selectTemplate(newTemplate
);
120 myEditor
.focusToNameField();
124 private void onClone() {
125 FileTemplate selected
= myCurrentTab
.getSelectedTemplate();
126 if (selected
== null) return;
128 final FileTemplate
[] templates
= myCurrentTab
.getTemplates();
129 ArrayList
<String
> names
= new ArrayList
<String
>(templates
.length
);
130 for (FileTemplate template
: templates
) {
131 names
.add(template
.getName());
133 @SuppressWarnings({"UnresolvedPropertyKey"})
134 String nameTemplate
= IdeBundle
.message("template.copy.N.of.T");
135 String name
= MessageFormat
.format(nameTemplate
, "", selected
.getName());
137 while (names
.contains(name
)) {
138 name
= MessageFormat
.format(nameTemplate
, ++i
+ " ", selected
.getName());
140 FileTemplate newTemplate
= new FileTemplateImpl(selected
.getText(), name
, selected
.getExtension());
141 myCurrentTab
.addTemplate(newTemplate
);
143 myCurrentTab
.selectTemplate(newTemplate
);
147 public String
getDisplayName() {
148 return IdeBundle
.message("title.file.templates");
151 public String
getHelpTopic() {
152 int index
= myTabbedPane
.getSelectedIndex();
155 return "fileTemplates.templates";
157 return "fileTemplates.includes";
159 return "fileTemplates.code";
161 return "fileTemplates.j2ee";
163 throw new IllegalStateException("wrong index: " + index
);
167 public JComponent
createComponent() {
168 myUIDisposable
= Disposer
.newDisposable();
169 myTemplatesList
= new FileTemplateTabAsList(TEMPLATES_TITLE
) {
170 public void onTemplateSelected() {
171 onListSelectionChanged();
174 myIncludesList
= new FileTemplateTabAsList(INCLUDES_TITLE
) {
175 public void onTemplateSelected() {
176 onListSelectionChanged();
179 myCodeTemplatesList
= new FileTemplateTabAsList(CODE_TITLE
) {
180 public void onTemplateSelected() {
181 onListSelectionChanged();
184 myCurrentTab
= myTemplatesList
;
186 List
<FileTemplateTab
> allTabs
= new ArrayList
<FileTemplateTab
>(Arrays
.asList(myTemplatesList
, myIncludesList
, myCodeTemplatesList
));
188 final Set
<FileTemplateGroupDescriptorFactory
> factories
= new THashSet
<FileTemplateGroupDescriptorFactory
>();
189 factories
.addAll(Arrays
.asList(ApplicationManager
.getApplication().getComponents(FileTemplateGroupDescriptorFactory
.class)));
190 factories
.addAll(Arrays
.asList(Extensions
.getExtensions(FileTemplateGroupDescriptorFactory
.EXTENSION_POINT_NAME
)));
192 if (!factories
.isEmpty()) {
193 myJ2eeTemplatesList
= new FileTemplateTabAsTree(J2EE_TITLE
) {
194 public void onTemplateSelected() {
195 onListSelectionChanged();
198 protected FileTemplateNode
initModel() {
199 SortedSet
<FileTemplateGroupDescriptor
> categories
= new TreeSet
<FileTemplateGroupDescriptor
>(new Comparator
<FileTemplateGroupDescriptor
>() {
200 public int compare(FileTemplateGroupDescriptor o1
, FileTemplateGroupDescriptor o2
) {
201 return o1
.getTitle().compareTo(o2
.getTitle());
206 for (FileTemplateGroupDescriptorFactory templateGroupFactory
: factories
) {
207 ContainerUtil
.addIfNotNull(templateGroupFactory
.getFileTemplatesDescriptor(), categories
);
210 //noinspection HardCodedStringLiteral
211 return new FileTemplateNode("ROOT", null, ContainerUtil
.map2List(categories
, new Function
<FileTemplateGroupDescriptor
, FileTemplateNode
>() {
212 public FileTemplateNode
fun(FileTemplateGroupDescriptor s
) {
213 return new FileTemplateNode(s
);
218 allTabs
.add(myJ2eeTemplatesList
);
220 myTabs
= allTabs
.toArray(new FileTemplateTab
[allTabs
.size()]);
221 myTabbedPane
= new TabbedPaneWrapper(myUIDisposable
);
222 myTabbedPane
.setTabLayoutPolicy(JTabbedPane
.SCROLL_TAB_LAYOUT
);
223 for (FileTemplateTab tab
: myTabs
) {
224 myTabbedPane
.addTab(tab
.getTitle(), new JScrollPane(tab
.getComponent()));
227 myTabbedPane
.addChangeListener(new ChangeListener() {
228 public void stateChanged(ChangeEvent e
) {
233 DefaultActionGroup group
= new DefaultActionGroup();
234 AnAction removeAction
= new AnAction(IdeBundle
.message("action.remove.template"), null, IconLoader
.getIcon("/general/remove.png")) {
235 public void actionPerformed(AnActionEvent e
) {
239 public void update(AnActionEvent e
) {
241 FileTemplate selectedItem
= myCurrentTab
.getSelectedTemplate();
242 e
.getPresentation().setEnabled(selectedItem
!= null && !isInternalTemplate(selectedItem
.getName(), myCurrentTab
.getTitle()));
245 AnAction addAction
= new AnAction(IdeBundle
.message("action.create.template"), null, IconLoader
.getIcon("/general/add.png")) {
246 public void actionPerformed(AnActionEvent e
) {
250 public void update(AnActionEvent e
) {
252 e
.getPresentation().setEnabled(!(myCurrentTab
== myCodeTemplatesList
|| myCurrentTab
== myJ2eeTemplatesList
));
255 AnAction cloneAction
= new AnAction(IdeBundle
.message("action.copy.template"), null, IconLoader
.getIcon("/actions/copy.png")) {
256 public void actionPerformed(AnActionEvent e
) {
260 public void update(AnActionEvent e
) {
262 e
.getPresentation().setEnabled(myCurrentTab
!= myCodeTemplatesList
263 && myCurrentTab
!= myJ2eeTemplatesList
264 && myCurrentTab
.getSelectedTemplate() != null);
267 AnAction resetAction
= new AnAction(IdeBundle
.message("action.reset.to.default"), null, IconLoader
.getIcon("/actions/reset.png")) {
268 public void actionPerformed(AnActionEvent e
) {
272 public void update(AnActionEvent e
) {
274 FileTemplate selectedItem
= myCurrentTab
.getSelectedTemplate();
275 FileTemplateManagerImpl manager
= FileTemplateManagerImpl
.getInstanceImpl();
276 e
.getPresentation().setEnabled(selectedItem
!= null
277 && !selectedItem
.isDefault()
279 manager
.getDefaultTemplate(selectedItem
.getName(), selectedItem
.getExtension()) !=
283 group
.add(addAction
);
284 group
.add(removeAction
);
285 group
.add(cloneAction
);
286 group
.add(resetAction
);
287 addAction
.registerCustomShortcutSet(CommonShortcuts
.INSERT
, myCurrentTab
.getComponent());
288 removeAction
.registerCustomShortcutSet(CommonShortcuts
.DELETE
,
289 myCurrentTab
.getComponent());
291 myToolBar
= ActionManager
.getInstance().createActionToolbar(ActionPlaces
.UNKNOWN
, group
, true).getComponent();
293 myEditor
= new FileTemplateConfigurable();
295 myEditor
.addChangeListener(new ChangeListener() {
296 public void stateChanged(ChangeEvent e
) {
300 myMainPanel
= new JPanel(new GridBagLayout()) {
301 public void doLayout() {
305 // Layout manager is ignored
306 myMainPanel
.add(myToolBar
,
307 new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints
.WEST
,
308 GridBagConstraints
.HORIZONTAL
, new Insets(2, 2, 2, 2), 0, 0));
309 myMainPanel
.add(myTabbedPane
.getComponent(),
310 new GridBagConstraints(0, 1, 1, 1, 0.0, 1.0, GridBagConstraints
.NORTHWEST
, GridBagConstraints
.BOTH
,
311 new Insets(2, 2, 2, 2), 0, 0));
312 myEditorComponent
= myEditor
.createComponent();
313 myMainPanel
.add(myEditorComponent
,
314 new GridBagConstraints(1, 0, 1, 2, 1.0, 1.0, GridBagConstraints
.CENTER
, GridBagConstraints
.BOTH
,
315 new Insets(2, 2, 2, 2), 0, 0));
317 myMainPanel
.setMinimumSize(new Dimension(400, 300));
318 myMainPanel
.setPreferredSize(new Dimension(700, 500));
323 private void onReset() {
324 FileTemplate selected
= myCurrentTab
.getSelectedTemplate();
325 if (selected
!= null) {
326 if (Messages
.showOkCancelDialog(IdeBundle
.message("prompt.reset.to.original.template"),
327 IdeBundle
.message("title.reset.template"), Messages
.getQuestionIcon()) !=
328 DialogWrapper
.OK_EXIT_CODE
) {
331 FileTemplateImpl template
= (FileTemplateImpl
)selected
;
333 template
.resetToDefault();
339 private void onEditorChanged() {
344 private void onTabChanged() {
345 int selectedIndex
= myTabbedPane
.getSelectedIndex();
346 if (0 <= selectedIndex
&& selectedIndex
< myTabs
.length
) {
347 myCurrentTab
= myTabs
[selectedIndex
];
349 onListSelectionChanged();
352 private void onListSelectionChanged() {
353 FileTemplate selectedValue
= myCurrentTab
.getSelectedTemplate();
354 FileTemplate prevTemplate
= myEditor
== null ?
null : myEditor
.getTemplate();
355 if (prevTemplate
!= selectedValue
) {
356 LOG
.assertTrue(myEditor
!= null, "selected:" + selectedValue
+ "; prev:" + prevTemplate
);
357 //selection has changed
358 if (myEditor
.isModified()) {
364 catch (ConfigurationException e
) {
365 myCurrentTab
.selectTemplate(prevTemplate
);
366 Messages
.showErrorDialog(myMainPanel
, e
.getMessage(), IdeBundle
.message("title.cannot.save.current.template"));
370 if (selectedValue
== null) {
371 myEditor
.setTemplate(null, FileTemplateManagerImpl
.getInstanceImpl().getDefaultTemplateDescription());
374 selectTemplate(selectedValue
);
379 private void selectTemplate(FileTemplate template
) {
380 VirtualFile defDesc
= null;
381 if (myCurrentTab
== myTemplatesList
) {
382 defDesc
= FileTemplateManagerImpl
.getInstanceImpl().getDefaultTemplateDescription();
384 else if (myCurrentTab
== myIncludesList
) {
385 defDesc
= FileTemplateManagerImpl
.getInstanceImpl().getDefaultIncludeDescription();
387 if (myEditor
.getTemplate() != template
) {
388 myEditor
.setTemplate(template
, defDesc
);
389 final boolean isInternal
= isInternalTemplate(template
.getName(), myCurrentTab
.getTitle());
390 myEditor
.setShowInternalMessage(isInternal ?
" " : null);
391 myEditor
.setShowAdjustCheckBox(myTemplatesList
== myCurrentTab
);
395 // internal template could not be removed and should be rendered bold
396 @SuppressWarnings({"SimplifiableIfStatement"})
397 public static boolean isInternalTemplate(String templateName
, String templateTabTitle
) {
398 if (templateName
== null) return false;
399 if (Comparing
.strEqual(templateTabTitle
, TEMPLATES_TITLE
)) {
400 return isInternalTemplateName(templateName
);
402 if (Comparing
.strEqual(templateTabTitle
, CODE_TITLE
)) {
405 if (Comparing
.strEqual(templateTabTitle
, J2EE_TITLE
)) {
408 if (Comparing
.strEqual(templateTabTitle
, INCLUDES_TITLE
)) {
409 return Comparing
.strEqual(templateName
, FileTemplateManager
.FILE_HEADER_TEMPLATE_NAME
);
415 private static boolean isInternalTemplateName(final String templateName
) {
416 for(InternalTemplateBean bean
: Extensions
.getExtensions(InternalTemplateBean
.EP_NAME
)) {
417 if (Comparing
.strEqual(templateName
, bean
.name
)) return true;
422 private void doMainPanelLayout() {
423 Dimension toolbarPreferredSize
= myToolBar
.getPreferredSize();
424 Dimension mainPanelSize
= myMainPanel
.getSize();
425 Dimension scrollPanePreferedSize
= myTabbedPane
.getComponent().getPreferredSize();
426 if (mainPanelSize
.width
< 1 || mainPanelSize
.height
< 1) {
429 int leftWidth
= scrollPanePreferedSize
.width
;
430 leftWidth
= Math
.min(leftWidth
, mainPanelSize
.width
/ 5);
431 leftWidth
= Math
.max(leftWidth
, 300); //to prevent tabs from scrolling
432 //todo[myakovlev] Calculate tabs preferred size
433 leftWidth
= Math
.max(leftWidth
, toolbarPreferredSize
.width
);
436 int width
= toolbarPreferredSize
.width
;
437 int height
= toolbarPreferredSize
.height
;
438 myToolBar
.setBounds(x
, y
, width
, height
);
440 width
= leftWidth
+ 2;
441 height
= Math
.max(1, mainPanelSize
.height
- 2 - y
);
442 myTabbedPane
.getComponent().setBounds(x
, y
, width
, height
);
445 width
= Math
.max(1, mainPanelSize
.width
- 2 - x
);
446 height
= Math
.max(1, mainPanelSize
.height
- 2 - y
);
447 myEditorComponent
.setBounds(x
, y
, width
, height
);
448 myEditorComponent
.revalidate();
451 private void initLists() {
452 FileTemplateManager templateManager
= FileTemplateManager
.getInstance();
453 FileTemplate
[] templates
= templateManager
.getAllTemplates();
454 FileTemplate
[] internals
= templateManager
.getInternalTemplates();
455 FileTemplate
[] templatesAndInternals
= ArrayUtil
.mergeArrays(internals
, templates
, FileTemplate
.class);
456 myTemplatesList
.init(templatesAndInternals
);
457 myIncludesList
.init(templateManager
.getAllPatterns());
458 myCodeTemplatesList
.init(templateManager
.getAllCodeTemplates());
459 if (myJ2eeTemplatesList
!= null) {
460 myJ2eeTemplatesList
.init(templateManager
.getAllJ2eeTemplates());
464 public boolean isModified() {
465 return myModified
|| myEditor
!= null && myEditor
.isModified();
469 * If apply is acceptable, returns true. If no, returns false and fills error string.
471 private boolean canApply(final boolean showErrorDialog
, String
[] errorString
) {
472 for (FileTemplateTab list
: myTabs
) {
473 if (!canApply(showErrorDialog
, errorString
, list
)) return false;
478 private boolean canApply(final boolean showErrorDialog
, String
[] errorString
, FileTemplateTab list
) {
479 final FileTemplate
[] templates
= myCurrentTab
.getTemplates();
480 ArrayList
<String
> allNames
= new ArrayList
<String
>();
481 FileTemplate itemWithError
= null;
482 String errorMessage
= null;
483 String errorTitle
= null;
484 boolean errorInName
= true;
485 for (FileTemplate template
: templates
) {
486 if (isInternalTemplateName(template
.getName())) continue;
487 String currName
= template
.getName();
488 String currExt
= template
.getExtension();
489 if (currName
.length() == 0) {
490 itemWithError
= template
;
491 errorMessage
= IdeBundle
.message("error.please.specify.a.name.for.this.template");
492 errorTitle
= IdeBundle
.message("title.template.name.not.specified");
493 errorString
[0] = IdeBundle
.message("error.please.specify.template.name");
496 if (allNames
.contains(currName
)) {
497 itemWithError
= template
;
498 errorMessage
= IdeBundle
.message("error.please.specify.a.different.name.for.this.template");
499 errorTitle
= IdeBundle
.message("title.template.already.exists");
500 errorString
[0] = IdeBundle
.message("error.template.with.such.name.already.exists");
503 if (currExt
.length() == 0) {
504 itemWithError
= template
;
505 errorMessage
= IdeBundle
.message("error.please.specify.extension");
506 errorTitle
= IdeBundle
.message("title.template.extension.not.specified");
507 errorString
[0] = IdeBundle
.message("error.please.specify.template.extension");
511 allNames
.add(currName
);
513 if (itemWithError
== null) {
517 final String _errorString
= errorMessage
;
518 final String _errorTitle
= errorTitle
;
519 final boolean _errorInName
= errorInName
;
520 myTabbedPane
.setSelectedIndex(Arrays
.asList(myTabs
).indexOf(list
));
521 selectTemplate(itemWithError
);
522 list
.selectTemplate(itemWithError
);
523 ApplicationManager
.getApplication().invokeLater(new Runnable() {
525 if (showErrorDialog
) {
526 Messages
.showMessageDialog(myMainPanel
, _errorString
, _errorTitle
, Messages
.getErrorIcon());
529 myEditor
.focusToNameField();
532 myEditor
.focusToExtensionField();
540 private void fireListChanged() {
541 myCurrentTab
.fireDataChanged();
542 if (myMainPanel
!= null) {
543 myMainPanel
.revalidate();
547 public void apply() throws ConfigurationException
{
548 if (myEditor
!= null && myEditor
.isModified()) {
552 String
[] errorString
= new String
[1];
553 if (!canApply(false, errorString
)) {
554 throw new ConfigurationException(errorString
[0]);
558 ArrayList
<FileTemplate
> newModifiedItems
= new ArrayList
<FileTemplate
>();
559 FileTemplate
[] templates
= myTemplatesList
.getTemplates();
560 newModifiedItems
.addAll(Arrays
.asList(templates
));
561 FileTemplateManager templatesManager
= FileTemplateManager
.getInstance();
562 apply(newModifiedItems
, myTemplatesList
.savedTemplates
, TEMPLATE_ID
, templatesManager
.getAllTemplates());
565 newModifiedItems
= new ArrayList
<FileTemplate
>();
566 templates
= myIncludesList
.getTemplates();
567 newModifiedItems
.addAll(Arrays
.asList(templates
));
568 apply(newModifiedItems
, myIncludesList
.savedTemplates
, PATTERN_ID
, templatesManager
.getAllPatterns());
570 //Apply code templates
571 newModifiedItems
= new ArrayList
<FileTemplate
>();
572 templates
= myCodeTemplatesList
.getTemplates();
573 newModifiedItems
.addAll(Arrays
.asList(templates
));
574 apply(newModifiedItems
, myCodeTemplatesList
.savedTemplates
, CODE_ID
, templatesManager
.getAllCodeTemplates());
576 //Apply J2EE templates
577 if (myJ2eeTemplatesList
!= null) {
578 newModifiedItems
= new ArrayList
<FileTemplate
>();
579 templates
= myJ2eeTemplatesList
.getTemplates();
580 newModifiedItems
.addAll(Arrays
.asList(templates
));
581 apply(newModifiedItems
, myJ2eeTemplatesList
.savedTemplates
, J2EE_ID
, templatesManager
.getAllJ2eeTemplates());
584 FileTemplateManager
.getInstance().saveAll();
586 if (myEditor
!= null) {
593 private static void removeTemplate(FileTemplate aTemplate
, int listId
, boolean fromDiskOnly
) {
594 FileTemplateManager manager
= FileTemplateManager
.getInstance();
595 if (listId
== TEMPLATE_ID
) {
596 if (!aTemplate
.isInternal()) {
597 manager
.removeTemplate(aTemplate
, fromDiskOnly
);
599 manager
.removeInternal(aTemplate
);
602 else if (listId
== PATTERN_ID
) {
603 manager
.removePattern(aTemplate
, fromDiskOnly
);
605 else if (listId
== CODE_ID
) {
606 manager
.removeCodeTemplate(aTemplate
, fromDiskOnly
);
608 else if (listId
== J2EE_ID
) {
609 manager
.removeJ2eeTemplate(aTemplate
, fromDiskOnly
);
613 private static void apply(ArrayList
<FileTemplate
> newModifiedItems
,
614 Map
<FileTemplate
,FileTemplate
> savedTemplate2ModifiedTemplate
,
616 FileTemplate
[] templates
) {
617 FileTemplateManager templatesManager
= FileTemplateManager
.getInstance();
618 if (listId
== TEMPLATE_ID
) {
619 FileTemplate
[] internals
= templatesManager
.getInternalTemplates();
620 templates
= ArrayUtil
.mergeArrays(internals
, templates
, FileTemplate
.class);
622 ArrayList
<FileTemplate
> savedTemplates
= new ArrayList
<FileTemplate
>();
623 // Delete removed and fill savedTemplates
624 for (FileTemplate aTemplate
: templates
) {
625 FileTemplate aModifiedTemplate
= savedTemplate2ModifiedTemplate
.get(aTemplate
);
626 if (newModifiedItems
.contains(aModifiedTemplate
)) {
627 savedTemplates
.add(aTemplate
);
629 removeTemplate(aTemplate
, listId
, false);
630 savedTemplate2ModifiedTemplate
.remove(aTemplate
);
633 // Now all removed templates deleted from table, savedTemplates contains all templates in table
634 for (FileTemplate aTemplate
: savedTemplates
) {
635 FileTemplate aModifiedTemplate
= savedTemplate2ModifiedTemplate
.get(aTemplate
);
636 LOG
.assertTrue(aModifiedTemplate
!= null);
637 aTemplate
.setAdjust(aModifiedTemplate
.isAdjust());
638 if (!aModifiedTemplate
.isDefault()) {
639 FileTemplateUtil
.copyTemplate(aModifiedTemplate
, aTemplate
);
641 if (!aTemplate
.isDefault()) {
642 removeTemplate(aTemplate
, listId
, true);
647 // Add new templates to table
648 for (FileTemplate aModifiedTemplate
: newModifiedItems
) {
649 LOG
.assertTrue(aModifiedTemplate
!= null);
650 if (!savedTemplate2ModifiedTemplate
.containsValue(aModifiedTemplate
)) {
651 if (listId
== TEMPLATE_ID
) {
652 templatesManager
.addTemplate(aModifiedTemplate
.getName(), aModifiedTemplate
.getExtension()).setText(aModifiedTemplate
.getText());
654 else if (listId
== PATTERN_ID
) {
655 templatesManager
.addPattern(aModifiedTemplate
.getName(), aModifiedTemplate
.getExtension()).setText(aModifiedTemplate
.getText());
657 else if (listId
== CODE_ID
) {
658 templatesManager
.addCodeTemplate(aModifiedTemplate
.getName(), aModifiedTemplate
.getExtension()).setText(aModifiedTemplate
.getText());
660 else if (listId
== J2EE_ID
) {
661 templatesManager
.addJ2eeTemplate(aModifiedTemplate
.getName(), aModifiedTemplate
.getExtension()).setText(aModifiedTemplate
.getText());
667 public void reset() {
670 final PropertiesComponent component
= PropertiesComponent
.getInstance();
671 final String tabName
= component
.getValue(CURRENT_TAB
);
673 for (FileTemplateTab tab
: myTabs
) {
674 if (Comparing
.strEqual(tab
.getTitle(), tabName
)) {
676 myTabbedPane
.setSelectedIndex(idx
);
677 final String selectedTemplate
= component
.getValue(SELECTED_TEMPLATE
);
678 final FileTemplate
[] templates
= myCurrentTab
.getTemplates();
679 for (FileTemplate template
: templates
) {
680 if (Comparing
.strEqual(template
.getName(), selectedTemplate
)) {
681 tab
.selectTemplate(template
);
692 public void disposeUIResources() {
693 if (myCurrentTab
!= null) {
694 final PropertiesComponent propertiesComponent
= PropertiesComponent
.getInstance();
695 propertiesComponent
.setValue(CURRENT_TAB
, myCurrentTab
.getTitle());
696 final FileTemplate template
= myCurrentTab
.getSelectedTemplate();
697 if (template
!= null) {
698 propertiesComponent
.setValue(SELECTED_TEMPLATE
, template
.getName());
702 if (myEditor
!= null) {
703 myEditor
.disposeUIResources();
705 myEditorComponent
= null;
708 if (myUIDisposable
!= null) {
709 Disposer
.dispose(myUIDisposable
);
710 myUIDisposable
= null;
716 myTemplatesList
= null;
717 myCodeTemplatesList
= null;
718 myIncludesList
= null;
719 myJ2eeTemplatesList
= null;
722 public void createNewTemplate(@NotNull String preferredName
, @NotNull String extension
, @NotNull String text
) {
723 createTemplate(preferredName
, extension
, text
);
726 public String
getId() {
727 return "fileTemplates";
731 public Runnable
enableSearch(String option
) {