View | Details | Raw Unified | Return to bug 58740
Collapse All | Expand All

(-)src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java (-26 / +46 lines)
Lines 25-30 Link Here
25
import java.util.ArrayList;
25
import java.util.ArrayList;
26
import java.util.Arrays;
26
import java.util.Arrays;
27
import java.util.Collections;
27
import java.util.Collections;
28
import java.util.HashMap;
28
import java.util.List;
29
import java.util.List;
29
import java.util.Map;
30
import java.util.Map;
30
import java.util.Map.Entry;
31
import java.util.Map.Entry;
Lines 76-82 Link Here
76
    private final List<CTXf> xfs = new ArrayList<CTXf>();
77
    private final List<CTXf> xfs = new ArrayList<CTXf>();
77
78
78
    private final List<CTDxf> dxfs = new ArrayList<CTDxf>();
79
    private final List<CTDxf> dxfs = new ArrayList<CTDxf>();
79
80
    
81
    // Use DualBidiMap
82
    //http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/bidimap/DualHashBidiMap.html
83
    private final Map<XSSFFont, Integer> fontsInverse = new HashMap<XSSFFont, Integer>();
84
    private final Map<XSSFCellFill, Integer> fillsInverse = new HashMap<XSSFCellFill, Integer>();
85
    private final Map<XSSFCellBorder, Integer> bordersInverse = new HashMap<XSSFCellBorder, Integer>();
86
    private final Map<CTXf, Integer> xfsInverse = new HashMap<CTXf, Integer>();
87
    
80
    /**
88
    /**
81
     * The first style id available for use as a custom style
89
     * The first style id available for use as a custom style
82
     */
90
     */
Lines 174-179 Link Here
174
                for (CTFont font : ctfonts.getFontArray()) {
182
                for (CTFont font : ctfonts.getFontArray()) {
175
                    // Create the font and save it. Themes Table supplied later
183
                    // Create the font and save it. Themes Table supplied later
176
                    XSSFFont f = new XSSFFont(font, idx);
184
                    XSSFFont f = new XSSFFont(font, idx);
185
                    fontsInverse.put(f, fonts.size());
177
                    fonts.add(f);
186
                    fonts.add(f);
178
                    idx++;
187
                    idx++;
179
                }
188
                }
Lines 181-187 Link Here
181
            CTFills ctfills = styleSheet.getFills();
190
            CTFills ctfills = styleSheet.getFills();
182
            if(ctfills != null){
191
            if(ctfills != null){
183
                for (CTFill fill : ctfills.getFillArray()) {
192
                for (CTFill fill : ctfills.getFillArray()) {
184
                    fills.add(new XSSFCellFill(fill));
193
                    XSSFCellFill xfill = new XSSFCellFill(fill);
194
                    fillsInverse.put(xfill, fills.size());
195
                    fills.add(xfill);
185
                }
196
                }
186
            }
197
            }
187
198
Lines 188-199 Link Here
188
            CTBorders ctborders = styleSheet.getBorders();
199
            CTBorders ctborders = styleSheet.getBorders();
189
            if(ctborders != null) {
200
            if(ctborders != null) {
190
                for (CTBorder border : ctborders.getBorderArray()) {
201
                for (CTBorder border : ctborders.getBorderArray()) {
191
                    borders.add(new XSSFCellBorder(border));
202
                    XSSFCellBorder xborder = new XSSFCellBorder(border);
203
                    bordersInverse.put(xborder, borders.size());
204
                    borders.add(xborder);
192
                }
205
                }
193
            }
206
            }
194
207
195
            CTCellXfs cellXfs = styleSheet.getCellXfs();
208
            CTCellXfs cellXfs = styleSheet.getCellXfs();
196
            if(cellXfs != null) xfs.addAll(Arrays.asList(cellXfs.getXfArray()));
209
            if(cellXfs != null) {
210
                for (CTXf ctxf : cellXfs.getXfArray()) {
211
                    xfsInverse.put(ctxf, xfs.size());
212
                    xfs.add(ctxf);
213
                }
214
            }
197
215
198
            CTCellStyleXfs cellStyleXfs = styleSheet.getCellStyleXfs();
216
            CTCellStyleXfs cellStyleXfs = styleSheet.getCellStyleXfs();
199
            if(cellStyleXfs != null) styleXfs.addAll(Arrays.asList(cellStyleXfs.getXfArray()));
217
            if(cellStyleXfs != null) styleXfs.addAll(Arrays.asList(cellStyleXfs.getXfArray()));
Lines 272-287 Link Here
272
     *  {@link XSSFFont#registerTo(StylesTable)}
290
     *  {@link XSSFFont#registerTo(StylesTable)}
273
     */
291
     */
274
    public int putFont(XSSFFont font, boolean forceRegistration) {
292
    public int putFont(XSSFFont font, boolean forceRegistration) {
275
        int idx = -1;
293
        if (!forceRegistration) {
276
        if(!forceRegistration) {
294
            Integer idx = fontsInverse.get(font);
277
            idx = fonts.indexOf(font);
295
            if (idx != null)
296
                return idx;
278
        }
297
        }
279
298
        int idx = fonts.size();
280
        if (idx != -1) {
299
        fontsInverse.put(font, idx);
281
            return idx;
282
        }
283
284
        idx = fonts.size();
285
        fonts.add(font);
300
        fonts.add(font);
286
        return idx;
301
        return idx;
287
    }
302
    }
Lines 300-311 Link Here
300
        return new XSSFCellStyle(idx, styleXfId, this, theme);
315
        return new XSSFCellStyle(idx, styleXfId, this, theme);
301
    }
316
    }
302
    public int putStyle(XSSFCellStyle style) {
317
    public int putStyle(XSSFCellStyle style) {
303
        CTXf mainXF = style.getCoreXf();
318
        return this.putCellXf(style.getCoreXf());
304
305
        if(! xfs.contains(mainXF)) {
306
            xfs.add(mainXF);
307
        }
308
        return xfs.indexOf(mainXF);
309
    }
319
    }
310
320
311
    public XSSFCellBorder getBorderAt(int idx) {
321
    public XSSFCellBorder getBorderAt(int idx) {
Lines 320-329 Link Here
320
     * @return the index of the added border
330
     * @return the index of the added border
321
     */
331
     */
322
    public int putBorder(XSSFCellBorder border) {
332
    public int putBorder(XSSFCellBorder border) {
323
        int idx = borders.indexOf(border);
333
        Integer idx = bordersInverse.get(border);
324
        if (idx != -1) {
334
        if (idx != null) {
325
            return idx;
335
            return idx;
326
        }
336
        }
337
        bordersInverse.put(border, borders.size());
327
        borders.add(border);
338
        borders.add(border);
328
        border.setThemesTable(theme);
339
        border.setThemesTable(theme);
329
        return borders.size() - 1;
340
        return borders.size() - 1;
Lines 357-366 Link Here
357
     * @return the index of the added fill
368
     * @return the index of the added fill
358
     */
369
     */
359
    public int putFill(XSSFCellFill fill) {
370
    public int putFill(XSSFCellFill fill) {
360
        int idx = fills.indexOf(fill);
371
        Integer idx = fillsInverse.get(fill);
361
        if (idx != -1) {
372
        if (idx != null) {
362
            return idx;
373
            return idx;
363
        }
374
        }
375
        fillsInverse.put(fill, fills.size());
364
        fills.add(fill);
376
        fills.add(fill);
365
        return fills.size() - 1;
377
        return fills.size() - 1;
366
    }
378
    }
Lines 574-592 Link Here
574
    private void initialize() {
586
    private void initialize() {
575
        //CTFont ctFont = createDefaultFont();
587
        //CTFont ctFont = createDefaultFont();
576
        XSSFFont xssfFont = createDefaultFont();
588
        XSSFFont xssfFont = createDefaultFont();
589
        fontsInverse.put(xssfFont, fonts.size());
577
        fonts.add(xssfFont);
590
        fonts.add(xssfFont);
578
591
579
        CTFill[] ctFill = createDefaultFills();
592
        CTFill[] ctFill = createDefaultFills();
580
        fills.add(new XSSFCellFill(ctFill[0]));
593
        XSSFCellFill xfill = new XSSFCellFill(ctFill[0]);
581
        fills.add(new XSSFCellFill(ctFill[1]));
594
        fillsInverse.put(xfill, fills.size());
595
        fills.add(xfill);
596
        xfill = new XSSFCellFill(ctFill[1]);
597
        fillsInverse.put(xfill, fills.size());
598
        fills.add(xfill);
582
599
583
        CTBorder ctBorder = createDefaultBorder();
600
        CTBorder ctBorder = createDefaultBorder();
584
        borders.add(new XSSFCellBorder(ctBorder));
601
        XSSFCellBorder xborder = new XSSFCellBorder(ctBorder);
602
        bordersInverse.put(xborder, borders.size());
603
        borders.add(xborder);
585
604
586
        CTXf styleXf = createDefaultXf();
605
        CTXf styleXf = createDefaultXf();
587
        styleXfs.add(styleXf);
606
        styleXfs.add(styleXf);
588
        CTXf xf = createDefaultXf();
607
        CTXf xf = createDefaultXf();
589
        xf.setXfId(0);
608
        xf.setXfId(0);
609
        xfsInverse.put(xf, xfs.size());
590
        xfs.add(xf);
610
        xfs.add(xf);
591
    }
611
    }
592
612

Return to bug 58740