Split DefaultKeymap.xml into separate files for each keymap. This is much easier...
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / keymap / impl / DefaultKeymap.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.openapi.keymap.impl;
17
18 import com.intellij.openapi.components.ServiceManager;
19 import com.intellij.openapi.diagnostic.Logger;
20 import com.intellij.openapi.extensions.Extensions;
21 import com.intellij.openapi.keymap.Keymap;
22 import com.intellij.openapi.keymap.KeymapManager;
23 import com.intellij.openapi.util.InvalidDataException;
24 import com.intellij.openapi.util.JDOMUtil;
25 import org.jdom.Document;
26 import org.jdom.Element;
27 import org.jetbrains.annotations.NonNls;
28
29 import java.net.URL;
30 import java.util.ArrayList;
31 import java.util.List;
32
33 /**
34  * @author Eugene Belyaev
35  */
36 public class DefaultKeymap {
37   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.keymap.impl.DefaultKeymap");
38
39   @NonNls
40   private static final String KEY_MAP = "keymap";
41   @NonNls
42   private static final String NAME_ATTRIBUTE = "name";
43
44   private final ArrayList<Keymap> myKeymaps = new ArrayList<Keymap>();
45
46   public static DefaultKeymap getInstance() {
47     return ServiceManager.getService(DefaultKeymap.class);
48   }
49
50   public DefaultKeymap() {
51     for(BundledKeymapProvider provider: Extensions.getExtensions(BundledKeymapProvider.EP_NAME)) {
52       final List<String> fileNames = provider.getKeymapFileNames();
53       for (String fileName : fileNames) {
54         try {
55           final Document document = JDOMUtil.loadResourceDocument(new URL("file:///idea/" + fileName));
56           loadKeymapsFromElement(document.getRootElement());
57         }
58         catch (Exception e) {
59           LOG.error(e);
60         }
61       }
62     }
63   }
64
65   private void loadKeymapsFromElement(final Element element) throws InvalidDataException {
66     for (Element child : (List<Element>)element.getChildren()) {
67       if (KEY_MAP.equals(child.getName())) {
68         String keymapName = child.getAttributeValue(NAME_ATTRIBUTE);
69         DefaultKeymapImpl keymap = KeymapManager.MAC_OS_X_KEYMAP.equals(keymapName) ? new MacOSDefaultKeymap() : new DefaultKeymapImpl();
70         keymap.readExternal(child, myKeymaps.toArray(new Keymap[myKeymaps.size()]));
71         keymap.setName(keymapName);
72         myKeymaps.add(keymap);
73       }
74     }
75   }
76
77   public Keymap[] getKeymaps() {
78     return myKeymaps.toArray(new Keymap[myKeymaps.size()]);
79   }
80 }