View | Details | Raw Unified | Return to bug 257362 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mtj/internal/core/text/l10n/L10nLocale.java (-1 / +72 lines)
Lines 7-16 Link Here
7
 * http://www.eclipse.org/legal/epl-v10.html
7
 * http://www.eclipse.org/legal/epl-v10.html
8
 * 
8
 * 
9
 * Contributors:
9
 * Contributors:
10
 *     Diego Sandin (Motorola) - Initial Version
10
 *     Diego Sandin (Motorola)  - Initial Version
11
 *     David Marques (Motorola) - Implementing validation.
11
 */
12
 */
12
package org.eclipse.mtj.internal.core.text.l10n;
13
package org.eclipse.mtj.internal.core.text.l10n;
13
14
15
import java.util.LinkedList;
16
import java.util.List;
14
import java.util.Locale;
17
import java.util.Locale;
15
import java.util.StringTokenizer;
18
import java.util.StringTokenizer;
16
19
Lines 17-22 Link Here
17
import org.eclipse.core.runtime.IStatus;
20
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.core.runtime.Status;
21
import org.eclipse.core.runtime.Status;
19
import org.eclipse.mtj.core.IMTJCoreConstants;
22
import org.eclipse.mtj.core.IMTJCoreConstants;
23
import org.eclipse.mtj.core.internal.MTJCorePlugin;
24
import org.eclipse.mtj.internal.core.text.IDocumentElementNode;
20
import org.eclipse.osgi.util.NLS;
25
import org.eclipse.osgi.util.NLS;
21
26
22
public class L10nLocale extends L10nObject {
27
public class L10nLocale extends L10nObject {
Lines 138-146 Link Here
138
            setStatus(new Status(IStatus.OK, IMTJCoreConstants.PLUGIN_ID,
143
            setStatus(new Status(IStatus.OK, IMTJCoreConstants.PLUGIN_ID,
139
                    "Valid Locale"));
144
                    "Valid Locale"));
140
        }
145
        }
146
        
147
        syncronizeKeyStates();
148
    }
149
150
    /**
151
     * This method synchronizes the state of all entries in the locale.
152
     * 
153
     * @param locale target locale.
154
     */
155
    private void syncronizeKeyStates() {
156
        IDocumentElementNode[] entryNodes = this.getChildNodes();
157
        List<L10nEntry> cache = new LinkedList<L10nEntry>();
158
        for (IDocumentElementNode entryNode : entryNodes) {
159
            L10nEntry entry = (L10nEntry) entryNode;
160
            if (!cache.contains(entry)) {
161
                List<L10nEntry> duplicates = this
162
                        .findDuplicatedEntries(entry);
163
                if (duplicates.size() > 0) {
164
                    for (L10nEntry duplicate : duplicates) {
165
                        duplicate.setStatus(new Status(IStatus.ERROR,
166
                                MTJCorePlugin.PLUGIN_ID, null));
167
                        cache.add(duplicate);
168
                    }
169
                    entry.setStatus(new Status(IStatus.ERROR,
170
                            MTJCorePlugin.PLUGIN_ID, null));
171
                } else {
172
                    entry.setStatus(new Status(IStatus.OK,
173
                            MTJCorePlugin.PLUGIN_ID, null));
174
                }
175
            }
176
        }
177
    }
178
    
179
    /**
180
     * This method returns a list of all locale entries containing the
181
     * specified key.
182
     * 
183
     * @param locale target locale.
184
     * @param key entry key.
185
     * @return duplicated entries.
186
     */
187
    private List<L10nEntry> findDuplicatedEntries(L10nLocale locale,
188
            String key) {
189
        List<L10nEntry> duplicates = new LinkedList<L10nEntry>();
190
        IDocumentElementNode nodes[] = locale.getChildNodes();
191
        for (IDocumentElementNode node : nodes) {
192
            L10nEntry entry = (L10nEntry) node;
193
            if (entry.getKey().toUpperCase().equals(key.toUpperCase())) {
194
                duplicates.add(entry);
195
            }
196
        }
197
        return duplicates;
141
    }
198
    }
142
199
143
    /**
200
    /**
201
     * This method finds all locale entries duplicated with the specified
202
     * locale.
203
     * 
204
     * @param localeEntry target locale.
205
     * @return duplicated entries.
206
     */
207
    public List<L10nEntry> findDuplicatedEntries(L10nEntry localeEntry) {
208
        List<L10nEntry> duplicates = findDuplicatedEntries(
209
                (L10nLocale) localeEntry.getParent(), localeEntry.getKey());
210
        duplicates.remove(localeEntry);
211
        return duplicates;
212
    }
213
    
214
    /**
144
     * Since the compatibility with the LOcalization Data from MTJ version
215
     * Since the compatibility with the LOcalization Data from MTJ version
145
     * 0.9.1RC1 was broken, we try to convert the old XML format to the new one
216
     * 0.9.1RC1 was broken, we try to convert the old XML format to the new one
146
     */
217
     */
(-)src/org/eclipse/mtj/internal/core/text/l10n/L10nLocales.java (-1 / +10 lines)
Lines 7-16 Link Here
7
 * http://www.eclipse.org/legal/epl-v10.html
7
 * http://www.eclipse.org/legal/epl-v10.html
8
 * 
8
 * 
9
 * Contributors:
9
 * Contributors:
10
 *     Diego Sandin (Motorola) - Initial version                     
10
 *     Diego Sandin (Motorola) - Initial version
11
 *     David Marques (Motorola) - Implementing validation.                     
11
 */
12
 */
12
package org.eclipse.mtj.internal.core.text.l10n;
13
package org.eclipse.mtj.internal.core.text.l10n;
13
14
15
import org.eclipse.mtj.internal.core.text.IDocumentElementNode;
16
17
14
/**
18
/**
15
 * @since 0.9.1
19
 * @since 0.9.1
16
 */
20
 */
Lines 129-134 Link Here
129
     */
133
     */
130
    @Override
134
    @Override
131
    public void validate() {
135
    public void validate() {
136
        IDocumentElementNode[] localeNodes = this.getChildNodes();
137
        for (IDocumentElementNode localeNode : localeNodes) {
138
            L10nLocale locale = (L10nLocale) localeNode;
139
            locale.validate();
140
        }
132
    }
141
    }
133
142
134
}
143
}
(-)src/org/eclipse/mtj/internal/core/l10n/L10nBuilder.java (-2 / +3 lines)
Lines 11-17 Link Here
11
 *     David Marques (Motorola) - Using L10n Models.
11
 *     David Marques (Motorola) - Using L10n Models.
12
 *     David Marques (Motorola) - Fixing cleaning.
12
 *     David Marques (Motorola) - Fixing cleaning.
13
 *     David Marques (Motorola) - Removing all .properties from project
13
 *     David Marques (Motorola) - Removing all .properties from project
14
 *                                upon cleaning project.                     
14
 *                                upon cleaning project.    
15
 *     David Marques (Motorola) - Generating keys on upper case.                                                 
15
 */
16
 */
16
package org.eclipse.mtj.internal.core.l10n;
17
package org.eclipse.mtj.internal.core.l10n;
17
18
Lines 251-257 Link Here
251
            IDocumentElementNode[] nodes = locale.getChildNodes();
252
            IDocumentElementNode[] nodes = locale.getChildNodes();
252
            for (int i = 0; i < nodes.length; i++) {
253
            for (int i = 0; i < nodes.length; i++) {
253
                L10nEntry entry = (L10nEntry) nodes[i];
254
                L10nEntry entry = (L10nEntry) nodes[i];
254
                buffer.append(entry.getKey());
255
                buffer.append(entry.getKey().toUpperCase());
255
                buffer.append("="); //$NON-NLS-1$
256
                buffer.append("="); //$NON-NLS-1$
256
                buffer.append(entry.getValue());
257
                buffer.append(entry.getValue());
257
                buffer.append("\n"); //$NON-NLS-1$
258
                buffer.append("\n"); //$NON-NLS-1$
(-)src/org/eclipse/mtj/internal/core/l10n/L10nApi.java (-3 / +4 lines)
Lines 11-16 Link Here
11
 *     David Marques (Motorola) - Fixing propeties folder path
11
 *     David Marques (Motorola) - Fixing propeties folder path
12
 *     David Marques (Motorola) - Removing old classes from L10n API
12
 *     David Marques (Motorola) - Removing old classes from L10n API
13
 *                                upon API creation.
13
 *                                upon API creation.
14
 *     David Marques (Motorola) - Generating keys on upper case.
14
 */
15
 */
15
package org.eclipse.mtj.internal.core.l10n;
16
package org.eclipse.mtj.internal.core.l10n;
16
17
Lines 128-135 Link Here
128
            IDocumentElementNode[] entryNodes = locale.getChildNodes();
129
            IDocumentElementNode[] entryNodes = locale.getChildNodes();
129
            for (int i = 0; i < entryNodes.length; i++) {
130
            for (int i = 0; i < entryNodes.length; i++) {
130
                L10nEntry entry = (L10nEntry) entryNodes[i];
131
                L10nEntry entry = (L10nEntry) entryNodes[i];
131
                if (!keys.contains(entry.getKey())) {
132
                if (!keys.contains(entry.getKey().toUpperCase())) {
132
                    keys.add(entry.getKey());
133
                    keys.add(entry.getKey().toUpperCase());
133
                }
134
                }
134
            }
135
            }
135
        }
136
        }
Lines 229-235 Link Here
229
    private static String writeStringConstantDeclaration(String name,
230
    private static String writeStringConstantDeclaration(String name,
230
            String value) {
231
            String value) {
231
        return NLS.bind("\t\tpublic static final String {0} = \"{1}\";\n",
232
        return NLS.bind("\t\tpublic static final String {0} = \"{1}\";\n",
232
                new String[] { name.replace("-", "_"), value });
233
                new String[] { name.replace("-", "_"), value});
233
    }
234
    }
234
    
235
    
235
    /**
236
    /**
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/details/L10nEntryDetails.java (-1 / +10 lines)
Lines 8-13 Link Here
8
 * 
8
 * 
9
 * Contributors:
9
 * Contributors:
10
 *     Diego Sandin (Motorola) - Initial Version
10
 *     Diego Sandin (Motorola) - Initial Version
11
 *     David Marques (Motorola) - Synchronizing key states with outline. 
11
 */
12
 */
12
package org.eclipse.mtj.internal.ui.editors.l10n.details;
13
package org.eclipse.mtj.internal.ui.editors.l10n.details;
13
14
Lines 17-22 Link Here
17
import org.eclipse.mtj.internal.ui.editor.FormEntryAdapter;
18
import org.eclipse.mtj.internal.ui.editor.FormEntryAdapter;
18
import org.eclipse.mtj.internal.ui.editors.l10n.L10nInputContext;
19
import org.eclipse.mtj.internal.ui.editors.l10n.L10nInputContext;
19
import org.eclipse.mtj.internal.ui.editors.l10n.LocalesTreeSection;
20
import org.eclipse.mtj.internal.ui.editors.l10n.LocalesTreeSection;
21
import org.eclipse.mtj.internal.ui.editors.l10n.LocalizationDataEditor;
20
import org.eclipse.mtj.ui.internal.forms.parts.FormEntry;
22
import org.eclipse.mtj.ui.internal.forms.parts.FormEntry;
21
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.SWT;
22
import org.eclipse.swt.widgets.Composite;
24
import org.eclipse.swt.widgets.Composite;
Lines 21-26 Link Here
21
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.SWT;
22
import org.eclipse.swt.widgets.Composite;
24
import org.eclipse.swt.widgets.Composite;
23
import org.eclipse.ui.forms.IFormPart;
25
import org.eclipse.ui.forms.IFormPart;
26
import org.eclipse.ui.forms.editor.FormEditor;
24
import org.eclipse.ui.forms.events.HyperlinkEvent;
27
import org.eclipse.ui.forms.events.HyperlinkEvent;
25
28
26
public class L10nEntryDetails extends L10nAbstractDetails {
29
public class L10nEntryDetails extends L10nAbstractDetails {
Lines 113-119 Link Here
113
     */
116
     */
114
    private void createLocaleEntryListeners() {
117
    private void createLocaleEntryListeners() {
115
        keyEntry.setFormEntryListener(new FormEntryAdapter(this) {
118
        keyEntry.setFormEntryListener(new FormEntryAdapter(this) {
116
            @Override
119
            
117
            public void textValueChanged(FormEntry entry) {
120
            public void textValueChanged(FormEntry entry) {
118
                // Ensure data object is defined
121
                // Ensure data object is defined
119
                if (localeEntry != null) {
122
                if (localeEntry != null) {
Lines 119-124 Link Here
119
                if (localeEntry != null) {
122
                if (localeEntry != null) {
120
                    {
123
                    {
121
                        localeEntry.setKey(keyEntry.getValue());
124
                        localeEntry.setKey(keyEntry.getValue());
125
                        localeEntry.getParent().validate();
126
                        
127
                        FormEditor editor = getPage().getEditor();
128
                        if (editor instanceof LocalizationDataEditor) {
129
                            ((LocalizationDataEditor) editor).displayLocaleKeysConflict(localeEntry.getLocales());
130
                        }
122
                    }
131
                    }
123
                }
132
                }
124
            }
133
            }
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/details/L10nLocaleDetails.java (+3 lines)
Lines 8-13 Link Here
8
 * 
8
 * 
9
 * Contributors:
9
 * Contributors:
10
 *     Diego Sandin (Motorola) - Initial Version
10
 *     Diego Sandin (Motorola) - Initial Version
11
 *     David Marques (Motorola) - Synchronizing locale states with outline.
11
 */
12
 */
12
package org.eclipse.mtj.internal.ui.editors.l10n.details;
13
package org.eclipse.mtj.internal.ui.editors.l10n.details;
13
14
Lines 182-187 Link Here
182
                        locale
183
                        locale
183
                                .setCountryCode(localeCountryCodeEntry
184
                                .setCountryCode(localeCountryCodeEntry
184
                                        .getValue());
185
                                        .getValue());
186
                        locale.validate();
185
                    }
187
                    }
186
                }
188
                }
187
            }
189
            }
Lines 213-218 Link Here
213
                            {
215
                            {
214
                                locale.setLanguageCode(localeLanguageCodeEntry
216
                                locale.setLanguageCode(localeLanguageCodeEntry
215
                                        .getValue());
217
                                        .getValue());
218
                                locale.validate();
216
                            }
219
                            }
217
                        }
220
                        }
218
                    }
221
                    }
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/pages/L10nSourcePage.java (-1 / +30 lines)
Lines 16-22 Link Here
16
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.core.runtime.IProgressMonitor;
17
import org.eclipse.core.runtime.IStatus;
17
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.jface.viewers.ILabelProvider;
18
import org.eclipse.jface.viewers.ILabelProvider;
19
import org.eclipse.jface.viewers.ISelectionChangedListener;
19
import org.eclipse.jface.viewers.ITreeContentProvider;
20
import org.eclipse.jface.viewers.ITreeContentProvider;
21
import org.eclipse.jface.viewers.SelectionChangedEvent;
20
import org.eclipse.jface.viewers.ViewerComparator;
22
import org.eclipse.jface.viewers.ViewerComparator;
21
import org.eclipse.mtj.core.internal.MTJCorePlugin;
23
import org.eclipse.mtj.core.internal.MTJCorePlugin;
22
import org.eclipse.mtj.internal.core.l10n.L10nApi;
24
import org.eclipse.mtj.internal.core.l10n.L10nApi;
Lines 23-33 Link Here
23
import org.eclipse.mtj.internal.core.text.IDocumentAttributeNode;
25
import org.eclipse.mtj.internal.core.text.IDocumentAttributeNode;
24
import org.eclipse.mtj.internal.core.text.IDocumentElementNode;
26
import org.eclipse.mtj.internal.core.text.IDocumentElementNode;
25
import org.eclipse.mtj.internal.core.text.IDocumentRange;
27
import org.eclipse.mtj.internal.core.text.IDocumentRange;
28
import org.eclipse.mtj.internal.core.text.IEditingModel;
26
import org.eclipse.mtj.internal.core.text.l10n.L10nLocales;
29
import org.eclipse.mtj.internal.core.text.l10n.L10nLocales;
27
import org.eclipse.mtj.internal.core.text.l10n.L10nModel;
30
import org.eclipse.mtj.internal.core.text.l10n.L10nModel;
28
import org.eclipse.mtj.internal.ui.MTJUIMessages;
31
import org.eclipse.mtj.internal.ui.MTJUIMessages;
32
import org.eclipse.mtj.internal.ui.editor.ISortableContentOutlinePage;
29
import org.eclipse.mtj.internal.ui.editor.MTJFormEditor;
33
import org.eclipse.mtj.internal.ui.editor.MTJFormEditor;
34
import org.eclipse.mtj.internal.ui.editor.SourceOutlinePage;
30
import org.eclipse.mtj.internal.ui.editor.XMLSourcePage;
35
import org.eclipse.mtj.internal.ui.editor.XMLSourcePage;
36
import org.eclipse.mtj.internal.ui.editors.l10n.L10nSourceOutlinePage;
31
import org.eclipse.mtj.ui.internal.MTJUIPlugin;
37
import org.eclipse.mtj.ui.internal.MTJUIPlugin;
32
38
33
/**
39
/**
Lines 45-50 Link Here
45
    }
51
    }
46
52
47
    /* (non-Javadoc)
53
    /* (non-Javadoc)
54
     * @see org.eclipse.mtj.internal.ui.editor.MTJSourcePage#createOutlinePage()
55
     */
56
    protected ISortableContentOutlinePage createOutlinePage() {
57
        SourceOutlinePage sourceOutlinePage = new L10nSourceOutlinePage(
58
                (MTJFormEditor) getEditor(), (IEditingModel) getInputContext()
59
                        .getModel(), createOutlineLabelProvider(),
60
                createOutlineContentProvider(),
61
                createDefaultOutlineComparator(), createOutlineComparator());
62
63
        fOutlinePage = sourceOutlinePage;
64
        fOutlineSelectionChangedListener = new ISelectionChangedListener() {
65
            public void selectionChanged(SelectionChangedEvent event) {
66
                updateSelection(event);
67
            }
68
        };
69
        fOutlinePage
70
                .addSelectionChangedListener(fOutlineSelectionChangedListener);
71
        getSelectionProvider().addSelectionChangedListener(sourceOutlinePage);
72
        fEditorSelectionChangedListener = new MTJSourcePageChangedListener();
73
        fEditorSelectionChangedListener.install(getSelectionProvider());
74
        return fOutlinePage;
75
    }
76
    
77
    /* (non-Javadoc)
48
     * @see org.eclipse.mtj.internal.ui.editor.MTJSourcePage#createOutlineComparator()
78
     * @see org.eclipse.mtj.internal.ui.editor.MTJSourcePage#createOutlineComparator()
49
     */
79
     */
50
    @Override
80
    @Override
Lines 167-171 Link Here
167
            MTJCorePlugin.log(IStatus.ERROR, e);
197
            MTJCorePlugin.log(IStatus.ERROR, e);
168
        }
198
        }
169
    }
199
    }
170
171
}
200
}
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/LocalesTreeSection.java (-11 / +29 lines)
Lines 7-13 Link Here
7
 * http://www.eclipse.org/legal/epl-v10.html
7
 * http://www.eclipse.org/legal/epl-v10.html
8
 * 
8
 * 
9
 * Contributors:
9
 * Contributors:
10
 *     Diego Sandin (Motorola) - Initial Version
10
 *     Diego Sandin (Motorola)  - Initial Version
11
 *     David Marques (Motorola) - Synchronizing key states with outline. 
11
 */
12
 */
12
package org.eclipse.mtj.internal.ui.editors.l10n;
13
package org.eclipse.mtj.internal.ui.editors.l10n;
13
14
Lines 52-57 Link Here
52
import org.eclipse.ui.actions.ActionFactory;
53
import org.eclipse.ui.actions.ActionFactory;
53
import org.eclipse.ui.actions.ContributionItemFactory;
54
import org.eclipse.ui.actions.ContributionItemFactory;
54
import org.eclipse.ui.dialogs.PatternFilter;
55
import org.eclipse.ui.dialogs.PatternFilter;
56
import org.eclipse.ui.forms.editor.FormEditor;
55
import org.eclipse.ui.forms.widgets.FormToolkit;
57
import org.eclipse.ui.forms.widgets.FormToolkit;
56
import org.eclipse.ui.forms.widgets.Section;
58
import org.eclipse.ui.forms.widgets.Section;
57
import org.eclipse.ui.keys.IBindingService;
59
import org.eclipse.ui.keys.IBindingService;
Lines 558-573 Link Here
558
     * 
560
     * 
559
     * @param event the update event
561
     * @param event the update event
560
     */
562
     */
561
    private void handleModelChangeType(IModelChangedEvent event) {
563
    private void handleModelChangeType(final IModelChangedEvent event) {
562
        // Get the changed object
564
        
563
        Object[] objects = event.getChangedObjects();
565
        localesTree.getControl().getDisplay().asyncExec(new Runnable() {
564
        L10nObject object = (L10nObject) objects[0];
566
            public void run() {
565
567
                if (localesTree.getControl().isDisposed()) {
566
        if (object != null) { // Update the element in the tree viewer
568
                    return;
567
            object.validate();
569
                }                
568
            localesTree.update(object, null);
570
                
569
            localesTree.refresh();
571
                // Get the changed object
570
        }
572
                Object[] objects = event.getChangedObjects();
573
                L10nObject object = (L10nObject) objects[0];
574
                
575
                if (object != null) { // Update the element in the tree viewer
576
                    localesTree.update(object, null);
577
                    localesTree.refresh();
578
                }
579
            }
580
        });
571
    }
581
    }
572
582
573
    /**
583
    /**
Lines 760-765 Link Here
760
770
761
        // Create the adapted listener for the filter entry field
771
        // Create the adapted listener for the filter entry field
762
        filteredTree.createUIListenerEntryFilter(this);
772
        filteredTree.createUIListenerEntryFilter(this);
773
        
774
        L10nLocales locales = model.getLocales();
775
        locales.validate();
776
        
777
        FormEditor editor = getPage().getEditor();
778
        if (editor instanceof LocalizationDataEditor) {
779
            ((LocalizationDataEditor) editor).displayLocaleKeysConflict(locales);
780
        }
763
    }
781
    }
764
782
765
    /* (non-Javadoc)
783
    /* (non-Javadoc)
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/LocalizationDataEditor.java (+34 lines)
Lines 9-14 Link Here
9
 * Contributors:
9
 * Contributors:
10
 *     Diego Sandin (Motorola) - Initial Version
10
 *     Diego Sandin (Motorola) - Initial Version
11
 *     David Marques (Motorola) - Overriding doSave method.
11
 *     David Marques (Motorola) - Overriding doSave method.
12
 *     David Marques (Motorola) - Synchronizing key states with outline. 
12
 */
13
 */
13
package org.eclipse.mtj.internal.ui.editors.l10n;
14
package org.eclipse.mtj.internal.ui.editors.l10n;
14
15
Lines 14-19 Link Here
14
15
15
import java.io.File;
16
import java.io.File;
16
import java.util.Iterator;
17
import java.util.Iterator;
18
import java.util.List;
17
19
18
import org.eclipse.core.resources.IFile;
20
import org.eclipse.core.resources.IFile;
19
import org.eclipse.core.runtime.CoreException;
21
import org.eclipse.core.runtime.CoreException;
Lines 19-24 Link Here
19
import org.eclipse.core.runtime.CoreException;
21
import org.eclipse.core.runtime.CoreException;
20
import org.eclipse.core.runtime.IProgressMonitor;
22
import org.eclipse.core.runtime.IProgressMonitor;
21
import org.eclipse.core.runtime.IStatus;
23
import org.eclipse.core.runtime.IStatus;
24
import org.eclipse.jface.dialogs.IMessageProvider;
22
import org.eclipse.jface.viewers.ISelection;
25
import org.eclipse.jface.viewers.ISelection;
23
import org.eclipse.jface.viewers.IStructuredSelection;
26
import org.eclipse.jface.viewers.IStructuredSelection;
24
import org.eclipse.mtj.core.internal.MTJCorePlugin;
27
import org.eclipse.mtj.core.internal.MTJCorePlugin;
Lines 23-28 Link Here
23
import org.eclipse.jface.viewers.IStructuredSelection;
26
import org.eclipse.jface.viewers.IStructuredSelection;
24
import org.eclipse.mtj.core.internal.MTJCorePlugin;
27
import org.eclipse.mtj.core.internal.MTJCorePlugin;
25
import org.eclipse.mtj.internal.core.l10n.L10nApi;
28
import org.eclipse.mtj.internal.core.l10n.L10nApi;
29
import org.eclipse.mtj.internal.core.text.l10n.L10nLocale;
30
import org.eclipse.mtj.internal.core.text.l10n.L10nLocales;
26
import org.eclipse.mtj.internal.core.text.l10n.L10nModel;
31
import org.eclipse.mtj.internal.core.text.l10n.L10nModel;
27
import org.eclipse.mtj.internal.core.text.l10n.L10nObject;
32
import org.eclipse.mtj.internal.core.text.l10n.L10nObject;
28
import org.eclipse.mtj.internal.ui.editor.ISortableContentOutlinePage;
33
import org.eclipse.mtj.internal.ui.editor.ISortableContentOutlinePage;
Lines 35-40 Link Here
35
import org.eclipse.mtj.internal.ui.editors.l10n.pages.L10nSourcePage;
40
import org.eclipse.mtj.internal.ui.editors.l10n.pages.L10nSourcePage;
36
import org.eclipse.mtj.internal.ui.editors.l10n.pages.LocalizationPage;
41
import org.eclipse.mtj.internal.ui.editors.l10n.pages.LocalizationPage;
37
import org.eclipse.mtj.ui.IMTJUIConstants;
42
import org.eclipse.mtj.ui.IMTJUIConstants;
43
import org.eclipse.osgi.util.NLS;
38
import org.eclipse.ui.IEditorInput;
44
import org.eclipse.ui.IEditorInput;
39
import org.eclipse.ui.IFileEditorInput;
45
import org.eclipse.ui.IFileEditorInput;
40
import org.eclipse.ui.IStorageEditorInput;
46
import org.eclipse.ui.IStorageEditorInput;
Lines 39-44 Link Here
39
import org.eclipse.ui.IFileEditorInput;
45
import org.eclipse.ui.IFileEditorInput;
40
import org.eclipse.ui.IStorageEditorInput;
46
import org.eclipse.ui.IStorageEditorInput;
41
import org.eclipse.ui.PartInitException;
47
import org.eclipse.ui.PartInitException;
48
import org.eclipse.ui.forms.IMessageManager;
42
import org.eclipse.ui.forms.editor.IFormPage;
49
import org.eclipse.ui.forms.editor.IFormPage;
43
50
44
/**
51
/**
Lines 81-86 Link Here
81
88
82
    }
89
    }
83
90
91
    @Override
92
    protected void pageChange(int newPageIndex) {
93
        super.pageChange(newPageIndex);
94
        IFormPage page = getActivePageInstance();
95
        if (page instanceof LocalizationPage) {
96
            L10nModel model = (L10nModel) inputContextManager.findContext(L10nInputContext.CONTEXT_ID).getModel();
97
            if (model != null) {                
98
                displayLocaleKeysConflict(model.getLocales());
99
            }
100
        }
101
    }
102
    
84
    /* (non-Javadoc)
103
    /* (non-Javadoc)
85
     * @see org.eclipse.mtj.internal.ui.editor.MTJFormEditor#getSelection()
104
     * @see org.eclipse.mtj.internal.ui.editor.MTJFormEditor#getSelection()
86
     */
105
     */
Lines 223-226 Link Here
223
    protected InputContext getInputContext(Object object) {
242
    protected InputContext getInputContext(Object object) {
224
        return inputContextManager.findContext(L10nInputContext.CONTEXT_ID);
243
        return inputContextManager.findContext(L10nInputContext.CONTEXT_ID);
225
    }
244
    }
245
    
246
    /**
247
     * Displays conflicting locales message.
248
     * 
249
     * @param locales locales.
250
     */
251
    public void displayLocaleKeysConflict(L10nLocales locales) {
252
        List<L10nLocale> conflicted = L10nUtil.findConflictedLocales(locales);
253
        IMessageManager  manager = getActivePageInstance().getManagedForm().getMessageManager();
254
        manager.removeAllMessages();
255
        for (L10nLocale locale : conflicted) {
256
            String message = NLS.bind("Locale keys are case insensitive. The locale {0} has duplicated keys.", locale.getName());
257
            manager.addMessage(locale, message, null, IMessageProvider.ERROR);
258
        }
259
    }
226
}
260
}
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/L10nUtil.java (+60 lines)
Line 0 Link Here
1
package org.eclipse.mtj.internal.ui.editors.l10n;
2
3
import java.util.LinkedList;
4
import java.util.List;
5
6
import org.eclipse.core.runtime.IStatus;
7
import org.eclipse.mtj.internal.core.text.IDocumentElementNode;
8
import org.eclipse.mtj.internal.core.text.l10n.L10nEntry;
9
import org.eclipse.mtj.internal.core.text.l10n.L10nLocale;
10
import org.eclipse.mtj.internal.core.text.l10n.L10nLocales;
11
12
/**
13
 * Copyright (c) 2008 Motorola.
14
 * 
15
 * All rights reserved. This program and the accompanying materials
16
 * are made available under the terms of the Eclipse Public License v1.0
17
 * which accompanies this distribution, and is available at
18
 * http://www.eclipse.org/legal/epl-v10.html
19
 * 
20
 * Contributors:
21
 *     David Marques (Motorola) - Initial Version 
22
 */
23
public class L10nUtil {
24
25
    /**
26
     * This method finds all conflicting locales.
27
     * 
28
     * @param locales target locales instance.
29
     * @return the list of all conflicting locales.
30
     */
31
    public static List<L10nLocale> findConflictedLocales(L10nLocales locales) {
32
        List<L10nLocale> conflicted = new LinkedList<L10nLocale>();
33
        IDocumentElementNode[] localeNodes = locales.getChildNodes();
34
        for (IDocumentElementNode localeNode : localeNodes) {
35
            L10nLocale locale = (L10nLocale) localeNode;
36
            if (localeHasKeyConflicts(locale)) {
37
                conflicted.add(locale);
38
            }
39
        }
40
        return conflicted;
41
    }
42
43
    /**
44
     * Checks whether the specified locale has conflicting keys.
45
     * 
46
     * @param locale target locale instance.
47
     * @return true if there are conslicts false otherwise.
48
     */
49
    private static boolean localeHasKeyConflicts(L10nLocale locale) {
50
        IDocumentElementNode nodes[] = locale.getChildNodes();
51
        for (IDocumentElementNode node : nodes) {
52
            L10nEntry entry = (L10nEntry) node;
53
            if (entry.getStatus().getSeverity() == IStatus.ERROR) {
54
                return true;
55
            }
56
        }
57
        return false;
58
    }
59
60
}
(-)src/org/eclipse/mtj/internal/ui/editors/l10n/L10nSourceOutlinePage.java (+71 lines)
Line 0 Link Here
1
/**
2
 * Copyright (c) 2008 Motorola.
3
 * 
4
 * All rights reserved. This program and the accompanying materials
5
 * are made available under the terms of the Eclipse Public License v1.0
6
 * which accompanies this distribution, and is available at
7
 * http://www.eclipse.org/legal/epl-v10.html
8
 * 
9
 * Contributors:
10
 *     David Marques (Motorola) - Initial Version 
11
 */
12
package org.eclipse.mtj.internal.ui.editors.l10n;
13
14
import org.eclipse.jface.text.IDocument;
15
import org.eclipse.jface.viewers.IBaseLabelProvider;
16
import org.eclipse.jface.viewers.IContentProvider;
17
import org.eclipse.jface.viewers.ViewerComparator;
18
import org.eclipse.mtj.internal.core.text.IEditingModel;
19
import org.eclipse.mtj.internal.core.text.l10n.L10nModel;
20
import org.eclipse.mtj.internal.ui.editor.MTJFormEditor;
21
import org.eclipse.mtj.internal.ui.editor.SourceOutlinePage;
22
import org.eclipse.swt.widgets.Control;
23
24
public class L10nSourceOutlinePage extends SourceOutlinePage {
25
26
    /**
27
     * Creates a new content outline page for the XML editor.
28
     * 
29
     * @param editor
30
     * @param model
31
     * @param lProvider
32
     * @param cProvider
33
     * @param defaultComparator
34
     * @param comparator
35
     */
36
    public L10nSourceOutlinePage(MTJFormEditor editor, IEditingModel model,
37
            IBaseLabelProvider provider, IContentProvider provider2,
38
            ViewerComparator defaultComparator, ViewerComparator comparator) {
39
        super(editor, model, provider, provider2, defaultComparator, comparator);
40
    }
41
    
42
    @Override
43
    public void reconciled(IDocument document) {
44
        
45
        final Control control = getControl();
46
        if ((control == null) || control.isDisposed()) {
47
            return;
48
        }
49
        
50
        control.getDisplay().asyncExec(new Runnable() {
51
            public void run() {
52
                if (control.isDisposed()) {
53
                    return;
54
                }                
55
                if (model instanceof L10nModel) {            
56
                    ((L10nModel) model).getLocales().validate();
57
                }
58
            }
59
        });
60
        super.reconciled(document);
61
    }
62
63
    /**
64
     * Validates the model.
65
     */
66
    public void refresh() {
67
        if (model instanceof L10nModel) {            
68
            ((L10nModel) model).getLocales().validate();
69
        }
70
    }
71
}
(-)src/org/eclipse/mtj/internal/ui/editor/SourceOutlinePage.java (-1 / +2 lines)
Lines 9-14 Link Here
9
 * Contributors:
9
 * Contributors:
10
 *     IBM Corporation         - initial API and implementation
10
 *     IBM Corporation         - initial API and implementation
11
 *     Diego Sandin (Motorola) - Adapted code from org.eclipse.pde.ui
11
 *     Diego Sandin (Motorola) - Adapted code from org.eclipse.pde.ui
12
 *     David Marques (Motorola) - Changing several attributes access.
12
 */
13
 */
13
package org.eclipse.mtj.internal.ui.editor;
14
package org.eclipse.mtj.internal.ui.editor;
14
15
Lines 45-51 Link Here
45
     * from our parent.
46
     * from our parent.
46
     */
47
     */
47
    private ArrayList<ISelectionChangedListener> listenerList;
48
    private ArrayList<ISelectionChangedListener> listenerList;
48
    private IEditingModel model;
49
    protected IEditingModel model;
49
    private boolean sorted;
50
    private boolean sorted;
50
    private ViewerComparator viewerComparator;
51
    private ViewerComparator viewerComparator;
51
    TreeViewer viewer;
52
    TreeViewer viewer;
(-)src/org/eclipse/mtj/internal/ui/editor/MTJFormEditor.java (+4 lines)
Lines 54-59 Link Here
54
import org.eclipse.mtj.internal.ui.editor.context.IInputContextListener;
54
import org.eclipse.mtj.internal.ui.editor.context.IInputContextListener;
55
import org.eclipse.mtj.internal.ui.editor.context.InputContext;
55
import org.eclipse.mtj.internal.ui.editor.context.InputContext;
56
import org.eclipse.mtj.internal.ui.editor.context.InputContextManager;
56
import org.eclipse.mtj.internal.ui.editor.context.InputContextManager;
57
import org.eclipse.mtj.internal.ui.editors.l10n.L10nSourceOutlinePage;
57
import org.eclipse.mtj.ui.IMTJUIConstants;
58
import org.eclipse.mtj.ui.IMTJUIConstants;
58
import org.eclipse.mtj.ui.internal.MTJUIPlugin;
59
import org.eclipse.mtj.ui.internal.MTJUIPlugin;
59
import org.eclipse.search.ui.text.ISearchEditorAccess;
60
import org.eclipse.search.ui.text.ISearchEditorAccess;
Lines 891-896 Link Here
891
        ISortableContentOutlinePage outline = null;
892
        ISortableContentOutlinePage outline = null;
892
        if (page instanceof MTJSourcePage) {
893
        if (page instanceof MTJSourcePage) {
893
            outline = ((MTJSourcePage) page).getContentOutline();
894
            outline = ((MTJSourcePage) page).getContentOutline();
895
            if ((outline != null) && (outline instanceof L10nSourceOutlinePage)) {
896
                ((L10nSourceOutlinePage) outline).refresh();
897
            }
894
        } else {
898
        } else {
895
            outline = getFormOutline();
899
            outline = getFormOutline();
896
            if ((outline != null) && (outline instanceof FormOutlinePage)) {
900
            if ((outline != null) && (outline instanceof FormOutlinePage)) {
(-)src/org/eclipse/mtj/internal/ui/editor/MTJSourcePage.java (-6 / +7 lines)
Lines 7-14 Link Here
7
 * http://www.eclipse.org/legal/epl-v10.html
7
 * http://www.eclipse.org/legal/epl-v10.html
8
 * 
8
 * 
9
 * Contributors:
9
 * Contributors:
10
 *     IBM Corporation         - initial API and implementation
10
 *     IBM Corporation          - initial API and implementation
11
 *     Diego Sandin (Motorola) - Adapted code from org.eclipse.pde.ui/PDESourcePage
11
 *     Diego Sandin (Motorola)  - Adapted code from org.eclipse.pde.ui/PDESourcePage
12
 *     David Marques (Motorola) - Changing several attributes access.
12
 */
13
 */
13
package org.eclipse.mtj.internal.ui.editor;
14
package org.eclipse.mtj.internal.ui.editor;
14
15
Lines 80-86 Link Here
80
     * 
81
     * 
81
     * @since 0.9.1
82
     * @since 0.9.1
82
     */
83
     */
83
    private class MTJSourcePageChangedListener implements
84
    public class MTJSourcePageChangedListener implements
84
            ISelectionChangedListener {
85
            ISelectionChangedListener {
85
86
86
        /**
87
        /**
Lines 146-158 Link Here
146
    /**
147
    /**
147
     * The editor selection changed listener.
148
     * The editor selection changed listener.
148
     */
149
     */
149
    private MTJSourcePageChangedListener fEditorSelectionChangedListener;
150
    protected MTJSourcePageChangedListener fEditorSelectionChangedListener;
150
    private String fId;
151
    private String fId;
151
    private int fIndex;
152
    private int fIndex;
152
    private InputContext fInputContext;
153
    private InputContext fInputContext;
153
    private ISortableContentOutlinePage fOutlinePage;
154
    protected ISortableContentOutlinePage fOutlinePage;
154
    private Object fSelection;
155
    private Object fSelection;
155
    private ISelectionChangedListener fOutlineSelectionChangedListener;
156
    protected ISelectionChangedListener fOutlineSelectionChangedListener;
156
157
157
    /**
158
    /**
158
     * @param editor
159
     * @param editor

Return to bug 257362