155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Eclipse Public License, Version 1.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.eclipse.org/org/documents/epl-v10.php
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1769425d803b34589309a69eddc53a338e1409b30cXavier Ducrohetpackage com.android.ide.eclipse.adt.internal.editors.layout;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
19026ba97e98e0527d910e15c4e1512893a777a8d2Xavier Ducrohetimport com.android.ide.common.resources.ResourceFolder;
2098aedb192efc5169227231043f511cd50bdd9ac9Tor Norbyeimport com.android.ide.eclipse.adt.internal.editors.common.CommonXmlEditor;
2160a544ae112b5b6a7bba76e3357f143bc207ce6bXavier Ducrohetimport com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
22868a7bbe7c5862c02483ef8f71276fc551d40d60Xavier Ducrohetimport com.android.resources.ResourceFolderType;
2355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.core.resources.IFile;
2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.IEditorInput;
2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.IEditorMatchingStrategy;
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.IEditorReference;
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.PartInitException;
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.part.FileEditorInput;
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/**
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Matching strategy for the Layout Editor. This is used to open all configurations of a layout
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * in the same editor.
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
35e50549f54810c29bffc681e39d33158ab2a8f26eRaphaelpublic class LayoutEditorMatchingStrategy implements IEditorMatchingStrategy {
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
37ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye    @Override
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public boolean matches(IEditorReference editorRef, IEditorInput input) {
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // first check that the file being opened is a layout file.
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (input instanceof FileEditorInput) {
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            FileEditorInput fileInput = (FileEditorInput)input;
42aa80eb0797889e53c43ef91bb8e63d8d9d5f1d24Raphael Moll
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // get the IFile object and check it's in one of the layout folders.
44fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye            IFile file = fileInput.getFile();
45dcd506c6482e7476941a6d4c14b6dd5eb51c85f9Tor Norbye            ResourceManager manager = ResourceManager.getInstance();
46fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye            ResourceFolder resFolder = manager.getResourceFolder(file);
47aa80eb0797889e53c43ef91bb8e63d8d9d5f1d24Raphael Moll
4898aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye            // Per the IEditorMatchingStrategy documentation, editorRef.getEditorInput()
4998aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye            // is expensive so try exclude files that definitely don't match, such
5098aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye            // as those with the wrong extension or wrong file name
51fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye            if (!file.getName().equals(editorRef.getName()) ||
5298aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye                    !editorRef.getId().equals(CommonXmlEditor.ID)) {
5398aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye                return false;
5498aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye            }
5598aedb192efc5169227231043f511cd50bdd9ac9Tor Norbye
56e50549f54810c29bffc681e39d33158ab2a8f26eRaphael            // if it's a layout, we now check the name of the fileInput against the name of the
5755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // file being currently edited by the editor since those are independent of the config.
5855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (resFolder != null && resFolder.getType() == ResourceFolderType.LAYOUT) {
5955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                try {
6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    IEditorInput editorInput = editorRef.getEditorInput();
6155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (editorInput instanceof FileEditorInput) {
6255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        FileEditorInput editorFileInput = (FileEditorInput)editorInput;
63fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye                        IFile editorFile = editorFileInput.getFile();
64aa80eb0797889e53c43ef91bb8e63d8d9d5f1d24Raphael Moll
65fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye                        ResourceFolder editorFolder = manager.getResourceFolder(editorFile);
66dcd506c6482e7476941a6d4c14b6dd5eb51c85f9Tor Norbye                        if (editorFolder == null
67dcd506c6482e7476941a6d4c14b6dd5eb51c85f9Tor Norbye                                || editorFolder.getType() != ResourceFolderType.LAYOUT) {
68dcd506c6482e7476941a6d4c14b6dd5eb51c85f9Tor Norbye                            return false;
69dcd506c6482e7476941a6d4c14b6dd5eb51c85f9Tor Norbye                        }
70dcd506c6482e7476941a6d4c14b6dd5eb51c85f9Tor Norbye
71fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye                        return editorFile.getProject().equals(file.getProject())
72fe51dba2aa25e559786e5da315d4db714ffe7559Tor Norbye                            && editorFile.getName().equals(file.getName());
7355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
7455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } catch (PartInitException e) {
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // we do nothing, we'll just return false.
7655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
7855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
7955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return false;
8055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
8155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
82