Search in sources :

Example 1 with ComboBox

use of com.codename1.ui.ComboBox in project CodenameOne by codenameone.

the class HTMLComponent method processTag.

/**
 * Processes the given tag. This is the main processing method that calls all others and uses itself in a recursive manner.
 *
 * @param element The element to process
 * @param align The current alignment
 */
private void processTag(HTMLElement element, int align) {
    if ((cancelled) && (!cancelledCaught)) {
        return;
    }
    int curAlign = align;
    HTMLFont oldFont = font;
    int oldFontColor = textColor;
    for (int i = 0; i < element.getNumChildren(); i++) {
        if ((cancelled) && (!cancelledCaught)) {
            break;
        }
        HTMLElement child = (HTMLElement) element.getChildAt(i);
        // Process Tag Open
        switch(child.getTagId()) {
            case HTMLElement.TAG_TEXT:
                // String text=child.getAttributeById(HTMLElement.ATTR_TITLE);
                String text = child.getText();
                if ((curComboBox != null) && (optionTag)) {
                    // Text is inside an OPTION tag, i.e. belongs to a ComboBox
                    OptionItem oi = new OptionItem(text, optionValue);
                    curComboBox.addItem(oi);
                    if (optionSelected) {
                        curComboBox.setSelectedItem(oi);
                        if (curForm != null) {
                            curForm.setDefaultValue(curComboBox, oi);
                        }
                    }
                } else if (curTextArea != null) {
                    // Text is inside of a TEXTAREA tag
                    curTextArea.setText(text);
                    if (curForm != null) {
                        curForm.setDefaultValue(curTextArea, text);
                    }
                } else if (element.getTagId() == HTMLElement.TAG_LEGEND) {
                    // Note: this is element, i.e. the child's parent (child is TAG_TEXT, and if parent is TAG_LEGEND then we process this block)
                    if (fieldsets.size() > 0) {
                        Container fset = (Container) fieldsets.lastElement();
                        fset.getStyle().setBorder(Border.createLineBorder(1, text));
                        fset.getStyle().setPadding(Component.TOP, fset.getStyle().getFont().getHeight() + 1);
                    }
                } else if ((curTable != null) && (element.getTagId() == HTMLElement.TAG_CAPTION)) {
                    // Note: this is element, i.e. the child's parent (child is TAG_TEXT, and if parent is TAG_LEGEND then we process this block)
                    curTable.captionTextTag = child;
                } else {
                    // long startTextTime=System.currentTimeMillis();  //debug code for performance measurement
                    Vector comps = null;
                    if (preTagCount != 0) {
                        comps = showPreTagText(text, curAlign);
                    } else {
                        if (FIXED_WIDTH) {
                            comps = showTextFixedWidth(text, curAlign);
                        } else {
                            comps = showText(text, curAlign);
                        }
                    }
                    if (loadCSS) {
                        child.setAssociatedComponents(comps);
                    }
                // textTime+=(System.currentTimeMillis()-startTextTime); //debug code for performance measurement
                }
                break;
            case HTMLElement.TAG_A:
                link = child.getAttributeById(HTMLElement.ATTR_HREF);
                if ((link != null) && (docInfo == null) && (!DocumentInfo.isAbsoluteURL(link))) {
                    if (htmlCallback != null) {
                        htmlCallback.parsingError(HTMLCallback.ERROR_NO_BASE_URL, child.getTagName(), child.getAttributeName(new Integer(HTMLElement.ATTR_HREF)), link, "Disabling relative link (" + link + "), since page was set by setBody/setHTML/setDOM so there's no way to access relative URLs");
                    }
                    link = null;
                }
                if ((link != null) && (htmlCallback != null)) {
                    int linkProps = htmlCallback.getLinkProperties(this, convertURL(link));
                    if ((linkProps & HTMLCallback.LINK_FORBIDDEN) != 0) {
                        link = null;
                    } else if ((linkProps & HTMLCallback.LINK_VISTED) != 0) {
                        linkVisited = true;
                    }
                }
                anchor = child.getAttributeById(HTMLElement.ATTR_NAME);
                if (link != null) {
                    String aKey = child.getAttributeById(HTMLElement.ATTR_ACCESSKEY);
                    if ((aKey != null) && (aKey.length() == 1)) {
                        accesskey = aKey.charAt(0);
                    }
                }
                break;
            case HTMLElement.TAG_H1:
            case HTMLElement.TAG_H2:
            case HTMLElement.TAG_H3:
            case HTMLElement.TAG_H4:
            case HTMLElement.TAG_H5:
            case HTMLElement.TAG_H6:
                font = (HTMLFont) fonts.get(child.getTagName());
                if (font == null) {
                    font = oldFont;
                }
            // No break here intentionally
            case HTMLElement.TAG_P:
                curAlign = getHorizAlign(child.getAttributeById(HTMLElement.ATTR_ALIGN), align, true);
                adjustAlignment(align, curAlign);
                newLineIfNotEmpty(curAlign);
                newLineIfLastWasNotEmpty(curAlign);
                pushContainer(child);
                break;
            case HTMLElement.TAG_DIV:
            case // CENTER is practically DIV align=CENTER
            HTMLElement.TAG_CENTER:
                curAlign = child.getTagId() == HTMLElement.TAG_DIV ? getHorizAlign(child.getAttributeById(HTMLElement.ATTR_ALIGN), align, true) : Component.CENTER;
                adjustAlignment(align, curAlign);
                newLineIfNotEmpty(curAlign);
                pushContainer(child);
                break;
            case HTMLElement.TAG_FIELDSET:
                newLineIfNotEmpty(curAlign);
                Container newCont = new Container();
                newCont.setUIID("HTMLFieldset");
                if (fieldsets.size() == 0) {
                    // First fieldset shouldn't have margin
                    newCont.getStyle().setMargin(Component.LEFT, 0);
                }
                newCont.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
                curContainer.addComponent(newCont);
                fieldsets.addElement(newCont);
                curContainer = newCont;
                if (loadCSS) {
                    child.setAssociatedComponents(newCont);
                }
                break;
            case HTMLElement.TAG_BR:
                if (loadCSS) {
                    child.setAssociatedComponents(curLine);
                }
                newLine(curAlign);
                break;
            case HTMLElement.TAG_DL:
                newLineIfNotEmpty(curAlign);
                newLine(curAlign);
                pushContainer(child);
                break;
            case HTMLElement.TAG_DT:
                newLineIfNotEmpty(curAlign);
                pushContainer(child);
                break;
            case HTMLElement.TAG_UL:
            case HTMLElement.TAG_DIR:
            case HTMLElement.TAG_MENU:
                newLineIfNotEmpty(curAlign);
                ulLevel++;
                listIndent += INDENT_UL;
                if ((ulLevel == 1) && (olIndex == Integer.MIN_VALUE)) {
                    // newline only if it's the first list
                    newLine(curAlign);
                } else {
                    // extra indentation for level 2 and beyond
                    listIndent += INDENT_UL;
                }
                pushContainer(child);
                break;
            case HTMLElement.TAG_OL:
                newLineIfNotEmpty(curAlign);
                if (olIndex != Integer.MIN_VALUE) {
                    String indexStr = ORDERED_LIST_TYPE_IDENTIFIERS[listType] + "" + olIndex;
                    // new Integer(olIndex));
                    olUpperLevelIndex.addElement(indexStr);
                }
                // olIndex=1;
                olIndex = getInt(child.getAttributeById(HTMLElement.ATTR_START), 1);
                listType = getOrderedListType(child);
                if ((olUpperLevelIndex.size() == 0) && (ulLevel == 0)) {
                    // newline only if it's the first list
                    newLine(curAlign);
                } else {
                    // add indent only for second level - first one already gets it from the numbers alignment to a 4-digit number
                    listIndent += INDENT_OL;
                }
                pushContainer(child);
                break;
            case HTMLElement.TAG_LI:
                Container listItemCont = new Container(new BorderLayout());
                listItemCont.getStyle().setMargin(Component.LEFT, leftIndent + listIndent);
                curContainer.addComponent(listItemCont);
                containers.addElement(curContainer);
                HTMLListItem bullet = null;
                if (((HTMLElement) child.getParent()).getTagId() == HTMLElement.TAG_OL) {
                    olIndex = getInt(child.getAttributeById(HTMLElement.ATTR_VALUE), olIndex);
                    int itemListType = getOrderedListType(child, listType);
                    HTMLListIndex listIndex = new HTMLListIndex(olIndex, itemListType);
                    listIndex.getUnselectedStyle().setFgColor(textColor);
                    listIndex.getSelectedStyle().setFgColor(textColor);
                    listIndex.getUnselectedStyle().setFont(font.getFont());
                    bullet = listIndex;
                    // following aligns short and long numbers (assuming a 4-digit number as the maximum, as other browsers do)
                    bullet.getUnselectedStyle().setAlignment(Component.RIGHT);
                    bullet.setPreferredW(font.getFont().stringWidth("8888. "));
                } else {
                    bullet = new HTMLBullet(getUnorderedListType(child, ulLevel), font.getFont().getHeight(), textColor, this);
                }
                Container bulletCont = new Container(new BorderLayout());
                bulletCont.addComponent(BorderLayout.NORTH, bullet);
                listItemCont.addComponent(BorderLayout.WEST, bulletCont);
                Container listItemText = new Container(new BoxLayout(BoxLayout.Y_AXIS));
                listItemCont.addComponent(BorderLayout.CENTER, listItemText);
                curContainer = listItemText;
                if (loadCSS) {
                    child.setAssociatedComponents(listItemText);
                }
                break;
            case HTMLElement.TAG_BLOCKQUOTE:
                newLineIfNotEmpty(curAlign);
                updateMargin(INDENT_BLOCKQUOTE);
                newLine(curAlign);
                pushContainer(child);
                break;
            case HTMLElement.TAG_DD:
                newLineIfNotEmpty(curAlign);
                updateMargin(INDENT_DD);
                pushContainer(child);
                break;
            case HTMLElement.TAG_HR:
                newLineIfNotEmpty(curAlign);
                Label hr = new Label();
                hr.setUIID("HTMLHR");
                // hr.getStyle().setBorder(Border.createBevelRaised());
                int hrWidth = calcSize(width, child.getAttributeById(HTMLElement.ATTR_WIDTH), width, false);
                int hrHeight = getInt(child.getAttributeById(HTMLElement.ATTR_SIZE), HR_THICKNESS);
                hr.setPreferredW(hrWidth);
                hr.setPreferredH(hrHeight);
                curLine.addComponent(hr);
                newLine(curAlign);
                if (loadCSS) {
                    child.setAssociatedComponents(hr);
                }
                break;
            case HTMLElement.TAG_STYLE:
                break;
            case HTMLElement.TAG_IMG:
                handleImage(child, curAlign, null);
                break;
            case HTMLElement.TAG_PRE:
                preTagCount++;
                pushContainer(child);
            case HTMLElement.TAG_EM:
            case HTMLElement.TAG_STRONG:
            case HTMLElement.TAG_DFN:
            case HTMLElement.TAG_CODE:
            case HTMLElement.TAG_SAMP:
            case HTMLElement.TAG_KBD:
            case HTMLElement.TAG_VAR:
            case HTMLElement.TAG_CITE:
            case HTMLElement.TAG_TT:
                font = (HTMLFont) fonts.get(child.getTagName());
                if (font == null) {
                    font = oldFont;
                }
                break;
            case HTMLElement.TAG_B:
            case HTMLElement.TAG_I:
            case HTMLElement.TAG_BIG:
            case HTMLElement.TAG_SMALL:
                font = getCounterpartFont(child.getTagId(), font);
                break;
            case HTMLElement.TAG_FORM:
                curForm = new HTMLForm(this, child.getAttributeById(HTMLElement.ATTR_ACTION), child.getAttributeById(HTMLElement.ATTR_METHOD), child.getAttributeById(HTMLElement.ATTR_ENCTYPE));
                pushContainer(child);
                break;
            case HTMLElement.TAG_BUTTON:
                handleInput(child, curAlign);
                break;
            case HTMLElement.TAG_INPUT:
                handleInput(child, curAlign);
                break;
            case HTMLElement.TAG_SELECT:
                String multi = child.getAttributeById(HTMLElement.ATTR_MULTIPLE);
                // If a select tag has size specified, it will be shown as an open list, and not as Codename One combo, even if there's no multiple seection allowed
                if ((multi != null) || (child.getAttributeById(HTMLElement.ATTR_SIZE) != null)) {
                    curComboBox = new MultiComboBox(multi != null);
                    Container comboCont = new Container(new BorderLayout());
                    curComboBox.setItemGap(0);
                    comboCont.setUIID("ComboBox");
                    curComboBox.setUIID("List");
                    comboCont.addComponent(BorderLayout.CENTER, curComboBox);
                } else {
                    curComboBox = new HTMLComboBox();
                }
                String name = child.getAttributeById(HTMLElement.ATTR_NAME);
                if (curForm != null) {
                    curForm.addInput(name, curComboBox, null);
                }
                // Even if CSS is off, we need to associate it for HTMLElement.getCurentValue
                child.setAssociatedComponents(curComboBox);
                if (eventsListener != null) {
                    eventsListener.registerComponent(curComboBox, child);
                }
                if ((!PROCESS_HTML_MP1_ONLY) && (child.getAttributeById(HTMLElement.ATTR_DISABLED) != null)) {
                    curComboBox.setEnabled(false);
                }
                break;
            case HTMLElement.TAG_OPTGROUP:
                if (curComboBox != null) {
                    String label = child.getAttributeById(HTMLElement.ATTR_LABEL);
                    if (label != null) {
                        curComboBox.addItem(label);
                    }
                }
                break;
            case HTMLElement.TAG_OPTION:
                optionTag = true;
                optionValue = child.getAttributeById(HTMLElement.ATTR_VALUE);
                if ((curComboBox != null) && (child.getAttributeById(HTMLElement.ATTR_SELECTED) != null)) {
                    optionSelected = true;
                }
                break;
            case HTMLElement.TAG_TEXTAREA:
                curTextArea = new TextArea(getInt(child.getAttributeById(HTMLElement.ATTR_ROWS), DEFAULT_TEXTAREA_ROWS), getInt(child.getAttributeById(HTMLElement.ATTR_COLS), DEFAULT_TEXTAREA_COLS));
                if (!PROCESS_HTML_MP1_ONLY) {
                    if (child.getAttributeById(HTMLElement.ATTR_DISABLED) != null) {
                        curTextArea.setEnabled(false);
                    }
                    if (child.getAttributeById(HTMLElement.ATTR_READONLY) != null) {
                        curTextArea.setEditable(false);
                    }
                }
                addCmp(curTextArea, curAlign);
                if (eventsListener != null) {
                    eventsListener.registerComponent(curTextArea, child);
                }
                // Even if CSS is off, we need to associate it for HTMLElement.getCurentValue
                child.setAssociatedComponents(curTextArea);
                String aKey = element.getAttributeById(HTMLElement.ATTR_ACCESSKEY);
                if ((aKey != null) && (aKey.length() == 1)) {
                    // accessKeys.put(new Integer(aKey.charAt(0)), curTextArea);
                    addAccessKey(aKey.charAt(0), curTextArea, false);
                }
                break;
            case HTMLElement.TAG_Q:
                addQuote(child, curAlign, true);
                quoteTagCount++;
                break;
            case HTMLElement.TAG_TABLE:
                newLineIfNotEmpty(curAlign);
                if (curTable != null) {
                    tables.addElement(curTable);
                    HTMLTableModel newTable = new HTMLTableModel();
                    curTable = newTable;
                } else {
                    curTable = new HTMLTableModel();
                }
                // In fixed width mode we arbitrarily divide the size by a factor knowing that probably there are several cells (If we don't do it, labels inside the cell will be built up to the full width size, leaving no space for others)
                width = width / 2;
                break;
            case HTMLElement.TAG_TR:
                break;
            case HTMLElement.TAG_TH:
            case HTMLElement.TAG_TD:
                if (curTable != null) {
                    handleTableCell(child, curAlign);
                }
                break;
            case HTMLElement.TAG_LABEL:
                labelForID = child.getAttributeById(HTMLElement.ATTR_FOR);
                aKey = child.getAttributeById(HTMLElement.ATTR_ACCESSKEY);
                if ((aKey != null) && (aKey.length() == 1)) {
                    accesskey = aKey.charAt(0);
                }
                break;
            // HTML 4 tags
            case HTMLElement.TAG_FONT:
                // TODO - This will not work for nested font tags, need to either define color as a local parameter or create a vector stack
                textColor = HTMLElement.getColor(child.getAttributeById(HTMLElement.ATTR_COLOR), textColor);
                String family = child.getAttributeById(HTMLElement.ATTR_FACE);
                int size = getInt(child.getAttributeById(HTMLElement.ATTR_SIZE));
                if ((family != null) || (size != 0)) {
                    HTMLFont f = getClosestHTMLFont(family, size, 0, 0);
                    if (f != null) {
                        font = f;
                    }
                }
                break;
            case HTMLElement.TAG_U:
            case // INS (Inserted text) is rendered exactly like U (underline) in most browsers
            HTMLElement.TAG_INS:
                if (underlineCount == 0) {
                    textDecoration |= Style.TEXT_DECORATION_UNDERLINE;
                }
                underlineCount++;
                break;
            case HTMLElement.TAG_S:
            case HTMLElement.TAG_STRIKE:
            case // DEL (Deleted text) is rendered exactly like S (strikethru) in most browsers
            HTMLElement.TAG_DEL:
                if (strikethruCount == 0) {
                    textDecoration |= Style.TEXT_DECORATION_STRIKETHRU;
                }
                strikethruCount++;
                break;
            case HTMLElement.TAG_MAP:
                String mapName = child.getAttributeById(HTMLElement.ATTR_NAME);
                curImageMap = new ImageMapData(mapName);
                break;
            case HTMLElement.TAG_AREA:
                handleImageMapArea(child);
                break;
            case HTMLElement.TAG_SUP:
                superscript++;
                break;
            case HTMLElement.TAG_SUB:
                superscript--;
                break;
            case HTMLElement.TAG_TBODY:
                if (curTable != null) {
                    curTable.startSegment(HTMLTableModel.SEGMENT_TBODY);
                }
                break;
            case HTMLElement.TAG_THEAD:
                if (curTable != null) {
                    curTable.startSegment(HTMLTableModel.SEGMENT_THEAD);
                }
                break;
            case HTMLElement.TAG_TFOOT:
                if (curTable != null) {
                    curTable.startSegment(HTMLTableModel.SEGMENT_TFOOT);
                }
                break;
        }
        if (child.getNumChildren() > 0) {
            processTag(child, curAlign);
        }
        // Process close tag
        switch(child.getTagId()) {
            case HTMLElement.TAG_H1:
            case HTMLElement.TAG_H2:
            case HTMLElement.TAG_H3:
            case HTMLElement.TAG_H4:
            case HTMLElement.TAG_H5:
            case HTMLElement.TAG_H6:
                font = oldFont;
            case HTMLElement.TAG_P:
                // Restore previous alignment
                curAlign = align;
                newLineIfNotEmpty(curAlign);
                popContainer();
                newLine(curAlign);
                break;
            case HTMLElement.TAG_DIV:
            case HTMLElement.TAG_CENTER:
                // Restore previous alignment
                curAlign = align;
                newLineIfNotEmpty(curAlign);
                popContainer();
                break;
            case HTMLElement.TAG_FIELDSET:
                newLineIfNotEmpty(curAlign);
                Container fieldsetContainer = (Container) fieldsets.lastElement();
                curContainer = fieldsetContainer.getParent();
                fieldsets.removeElement(fieldsetContainer);
                break;
            case HTMLElement.TAG_BLOCKQUOTE:
                newLineIfNotEmpty(curAlign);
                newLine(curAlign);
                updateMargin(-INDENT_BLOCKQUOTE);
                popContainer();
                break;
            case HTMLElement.TAG_DT:
                popContainer();
                break;
            case HTMLElement.TAG_DD:
                newLineIfNotEmpty(curAlign);
                updateMargin(-INDENT_DD);
                popContainer();
                break;
            case HTMLElement.TAG_DL:
                newLine(curAlign);
                popContainer();
                break;
            case HTMLElement.TAG_A:
                link = null;
                linkVisited = false;
                mainLink = null;
                anchor = null;
                accesskey = '\0';
                break;
            case HTMLElement.TAG_UL:
            case HTMLElement.TAG_DIR:
            case HTMLElement.TAG_MENU:
                ulLevel--;
                if ((ulLevel == 0) && (olIndex == Integer.MIN_VALUE)) {
                    newLine(curAlign);
                } else {
                    // level 2 and beyond got extra indentation, so we remove it here
                    listIndent -= INDENT_UL;
                }
                listIndent -= INDENT_UL;
                popContainer();
                break;
            case HTMLElement.TAG_OL:
                if (olUpperLevelIndex.size() != 0) {
                    String indexStr = (String) olUpperLevelIndex.lastElement();
                    olUpperLevelIndex.removeElementAt(olUpperLevelIndex.size() - 1);
                    listType = getOrderedListType(indexStr.charAt(0), HTMLListIndex.LIST_NUMERIC);
                    olIndex = getInt(indexStr.substring(1));
                    // First level of ordered list doesn't get indentation, so we substract only if it's nested
                    listIndent -= INDENT_OL;
                } else {
                    olIndex = Integer.MIN_VALUE;
                }
                if ((olIndex == Integer.MIN_VALUE) && (ulLevel == 0)) {
                    // new line only if it is the last nested list
                    newLine(curAlign);
                }
                popContainer();
                break;
            case HTMLElement.TAG_LI:
                if (olIndex != Integer.MIN_VALUE) {
                    olIndex++;
                }
                newLineIfNotEmpty(curAlign);
                // We can't use popContainer, since with LI the container is pushed even when CSS is ignored, to provide the spacing between the list item bullet/number and the text (in a nested way if needed)
                Container prevContainer = (Container) containers.lastElement();
                curContainer = prevContainer;
                containers.removeElement(curContainer);
                // curContainer=listItemParentContainer;
                break;
            case HTMLElement.TAG_PRE:
                preTagCount--;
                popContainer();
            case HTMLElement.TAG_FONT:
                textColor = oldFontColor;
            case HTMLElement.TAG_EM:
            case HTMLElement.TAG_STRONG:
            case HTMLElement.TAG_DFN:
            case HTMLElement.TAG_CODE:
            case HTMLElement.TAG_SAMP:
            case HTMLElement.TAG_KBD:
            case HTMLElement.TAG_VAR:
            case HTMLElement.TAG_CITE:
            case HTMLElement.TAG_B:
            case HTMLElement.TAG_I:
            case HTMLElement.TAG_BIG:
            case HTMLElement.TAG_SMALL:
            case HTMLElement.TAG_TT:
                font = oldFont;
                break;
            case HTMLElement.TAG_FORM:
                if ((curForm != null) && (!curForm.hasSubmitButton) && (curForm.getNumFields() > 0)) {
                    // This is a fix for forms with no submit buttons which can be resulted due to the fact XHTML-MP doesn't support the BUTTON tag and also input type button with javascript
                    Button submitButton = new Button(curForm.createSubmitCommand(null, null));
                    addCmp(submitButton, curAlign);
                }
                curForm = null;
                popContainer();
                break;
            case HTMLElement.TAG_TEXTAREA:
                String name = child.getAttributeById(HTMLElement.ATTR_NAME);
                if (curForm != null) {
                    // This was moved to the end tag to enable auto complete support (i.e. if there's an autocomplete it overrides the default value)
                    curForm.addInput(name, curTextArea, null);
                }
                curTextArea = null;
                break;
            case HTMLElement.TAG_SELECT:
                if (curComboBox instanceof MultiComboBox) {
                    Container comboCont = curComboBox.getParent();
                    int minSize = Math.min(MIN_MULTI_COMBOBOX_ITEMS, curComboBox.size());
                    int maxSize = Math.min(curComboBox.size(), MAX_MULTI_COMBOBOX_ITEMS);
                    int size = Math.min(maxSize, Math.max(getInt(child.getAttributeById(HTMLElement.ATTR_SIZE)), minSize));
                    Component renderCmp = curComboBox.getRenderer().getListCellRendererComponent(curComboBox, "X", 0, false);
                    comboCont.setPreferredH((renderCmp.getPreferredH() + renderCmp.getStyle().getMargin(Component.TOP) + renderCmp.getStyle().getMargin(Component.BOTTOM) + curComboBox.getItemGap()) * size + curComboBox.getStyle().getPadding(Component.TOP) + curComboBox.getStyle().getPadding(Component.BOTTOM));
                    addCmp(comboCont, curAlign);
                } else {
                    addCmp(curComboBox, curAlign);
                }
                curComboBox = null;
                break;
            case HTMLElement.TAG_OPTION:
                optionTag = false;
                optionSelected = false;
                optionValue = null;
                break;
            case HTMLElement.TAG_Q:
                quoteTagCount--;
                addQuote(child, curAlign, false);
                break;
            case HTMLElement.TAG_TABLE:
                newLineIfNotEmpty(curAlign);
                // For a case that TR was not closed properly
                curTable.commitRowIfNotEmpty();
                if (curTable.getRowCount() != 0) {
                    // Don't add an empty table (Creates an exception in TableLayout and useless)
                    /*if (TABLES_LOCK_SIZE) {
                            for(int r=0;r<curTable.getRowCount();r++) {
                                for(int c=0;c<curTable.getColumnCount();c++) {
                                    Component cmp=(Component)curTable.getValueAt(r, c);
                                    if (cmp!=null) { // Can be null for cells that are "spanned over"
                                        cmp.setPreferredSize(cmp.getPreferredSize());
                                    }
                                }
                            }
                        }*/
                    HTMLTable table = new HTMLTable(curTable);
                    table.getStyle().setBgTransparency(0);
                    if (loadCSS) {
                        child.setAssociatedComponents(table);
                    }
                    int borderSize = getInt(child.getAttributeById(HTMLElement.ATTR_BORDER));
                    int[] borderPad = new int[4];
                    if (borderSize > 0) {
                        int frame = PROCESS_HTML_MP1_ONLY ? -1 : HTMLUtils.getStringVal(child.getAttributeById(HTMLElement.ATTR_FRAME), HTMLElement.ALLOWED_TABLE_FRAME_STRINGS);
                        Border border = Border.createLineBorder(borderSize);
                        if (frame == -1) {
                            for (int s = 0; s < borderPad.length; s++) {
                                borderPad[s] = borderSize;
                            }
                        } else {
                            Border[] borders = new Border[4];
                            for (int j = 0; j < HTMLElement.ALLOWED_TABLE_FRAME_VALS[frame].length; j++) {
                                int side = HTMLElement.ALLOWED_TABLE_FRAME_VALS[frame][j];
                                borders[side] = border;
                                borderPad[side] = borderSize;
                            }
                            border = Border.createCompoundBorder(borders[Component.TOP], borders[Component.BOTTOM], borders[Component.LEFT], borders[Component.RIGHT]);
                        }
                        table.getUnselectedStyle().setBorder(border);
                        table.getSelectedStyle().setBorder(border);
                        table.getUnselectedStyle().setPadding(borderPad[Component.TOP], borderPad[Component.BOTTOM], borderPad[Component.LEFT], borderPad[Component.RIGHT]);
                        table.getSelectedStyle().setPadding(borderPad[Component.TOP], borderPad[Component.BOTTOM], borderPad[Component.LEFT], borderPad[Component.RIGHT]);
                    } else {
                        table.getUnselectedStyle().setBorder(null);
                        table.getSelectedStyle().setBorder(null);
                        table.setDrawBorder(false);
                    }
                    if (!PROCESS_HTML_MP1_ONLY) {
                        int rules = HTMLUtils.getStringVal(child.getAttributeById(HTMLElement.ATTR_RULES), HTMLElement.ALLOWED_TABLE_RULES_STRINGS, Table.INNER_BORDERS_ALL);
                        table.setInnerBorderMode(rules);
                        int spacing = getInt(child.getAttributeById(HTMLElement.ATTR_CELLSPACING), -1);
                        if (spacing != -1) {
                            table.setBorderSpacing(spacing, spacing);
                        }
                        int padding = getInt(child.getAttributeById(HTMLElement.ATTR_CELLPADDING), -1);
                        if (padding != -1) {
                            for (int r = 0; r < curTable.getRowCount(); r++) {
                                for (int c = 0; c < curTable.getColumnCount(); c++) {
                                    Component cmp = (Component) curTable.getValueAt(r, c);
                                    if (cmp != null) {
                                        // Can be null for cells that are "spanned over"
                                        cmp.getUnselectedStyle().setPadding(padding, padding, padding, padding);
                                        cmp.getSelectedStyle().setPadding(padding, padding, padding, padding);
                                    }
                                }
                            }
                        }
                    }
                    if (curTable.captionTextTag != null) {
                        Container captionedTable = new Container(new BoxLayout(BoxLayout.Y_AXIS));
                        TextArea caption = new TextArea(curTable.captionTextTag.getText());
                        curTable.captionTextTag.setAssociatedComponents(caption);
                        caption.setUIID("HTMLTableCaption");
                        caption.setEditable(false);
                        caption.setFocusable(false);
                        caption.getStyle().setBorder(null);
                        caption.getStyle().setAlignment(Component.CENTER);
                        captionedTable.addComponent(caption);
                        captionedTable.addComponent(table);
                        addCmp(captionedTable, curAlign);
                    } else {
                        addCmp(table, curAlign);
                    }
                    newLineIfNotEmpty(curAlign);
                }
                if (tables.size() == 0) {
                    curTable = null;
                } else {
                    curTable = (HTMLTableModel) tables.lastElement();
                    tables.removeElement(curTable);
                }
                // In fixed width mode we arbitrarily divide the size by a factor knowing that probably there are several cells - here we restore the size back
                width = width * 2;
                if (width > displayWidth) {
                    width = displayWidth;
                }
                break;
            case HTMLElement.TAG_TR:
                if (curTable != null) {
                    curTable.commitRow();
                }
                break;
            case HTMLElement.TAG_TH:
            case HTMLElement.TAG_TD:
                if (curTable != null) {
                    newLineIfNotEmpty(curAlign);
                    curContainer = (Container) tableCells.lastElement();
                    tableCells.removeElement(curContainer);
                }
                break;
            case HTMLElement.TAG_LABEL:
                labelForID = null;
                accesskey = '\0';
                break;
            // HTML 4 tags
            case HTMLElement.TAG_U:
            case HTMLElement.TAG_INS:
                underlineCount--;
                if (underlineCount == 0) {
                    textDecoration -= Style.TEXT_DECORATION_UNDERLINE;
                }
                break;
            case HTMLElement.TAG_S:
            case HTMLElement.TAG_STRIKE:
            case HTMLElement.TAG_DEL:
                strikethruCount--;
                if (strikethruCount == 0) {
                    textDecoration -= Style.TEXT_DECORATION_STRIKETHRU;
                }
                break;
            case HTMLElement.TAG_MAP:
                if (curImageMap != null) {
                    if (imageMapData == null) {
                        imageMapData = new Hashtable();
                    }
                    imageMapData.put(curImageMap.name, curImageMap);
                    if ((imageMapComponents != null) && (imageMapComponents.containsKey(curImageMap.name))) {
                        HTMLImageMap imageMap = (HTMLImageMap) imageMapComponents.get(curImageMap.name);
                        imageMap.mapData = curImageMap;
                    }
                    curImageMap = null;
                }
                break;
            case HTMLElement.TAG_SUP:
                superscript--;
                break;
            case HTMLElement.TAG_SUB:
                superscript++;
                break;
            case HTMLElement.TAG_TBODY:
            case HTMLElement.TAG_THEAD:
            case HTMLElement.TAG_TFOOT:
                if (curTable != null) {
                    curTable.endSegment();
                }
                break;
        }
    }
}
Also used : TextArea(com.codename1.ui.TextArea) BoxLayout(com.codename1.ui.layouts.BoxLayout) Label(com.codename1.ui.Label) Container(com.codename1.ui.Container) BorderLayout(com.codename1.ui.layouts.BorderLayout) Button(com.codename1.ui.Button) RadioButton(com.codename1.ui.RadioButton) Component(com.codename1.ui.Component) Vector(java.util.Vector) Hashtable(java.util.Hashtable) Border(com.codename1.ui.plaf.Border)

Example 2 with ComboBox

use of com.codename1.ui.ComboBox in project CodenameOne by codenameone.

the class HTMLEventsListener method deregisterAll.

/**
 * Deregisters all the listeners, happens before a new page is loaded
 */
void deregisterAll() {
    for (Enumeration e = comps.keys(); e.hasMoreElements(); ) {
        Component cmp = (Component) e.nextElement();
        cmp.removeFocusListener(this);
        if (cmp instanceof Button) {
            // catches Button, CheckBox, RadioButton
            ((Button) cmp).removeActionListener(this);
        } else if (cmp instanceof List) {
            // catches ComboBox
            ((List) cmp).removeSelectionListener((SelectionListener) listeners.get(cmp));
        } else if (cmp instanceof TextArea) {
            ((TextArea) cmp).removeActionListener(this);
            if (cmp instanceof TextField) {
                ((TextField) cmp).removeDataChangeListener((DataChangedListener) listeners.get(cmp));
            }
        }
    }
    comps = new Hashtable();
    listeners = new Hashtable();
}
Also used : Enumeration(java.util.Enumeration) RadioButton(com.codename1.ui.RadioButton) Button(com.codename1.ui.Button) TextArea(com.codename1.ui.TextArea) Hashtable(java.util.Hashtable) TextField(com.codename1.ui.TextField) List(com.codename1.ui.List) Component(com.codename1.ui.Component) SelectionListener(com.codename1.ui.events.SelectionListener)

Example 3 with ComboBox

use of com.codename1.ui.ComboBox in project CodenameOne by codenameone.

the class HTMLEventsListener method registerComponent.

/**
 * Registeres the specified component/element duo to listen to all available events
 *
 * @param cmp The actual component
 * @param element The element representing the component
 */
void registerComponent(final Component cmp, final HTMLElement element) {
    comps.put(cmp, element);
    cmp.addFocusListener(this);
    if (cmp instanceof Button) {
        // catches Button, CheckBox, RadioButton
        ((Button) cmp).addActionListener(this);
    } else if (cmp instanceof List) {
        // catches ComboBox
        final List list = (List) cmp;
        list.addActionListener(this);
        SelectionListener sl = new // We create a listener and not listen ourself since the listener's method does not pass the event origin, so we need to make one listener per component
        SelectionListener() {

            public void selectionChanged(int oldSelected, int newSelected) {
                if (htmlC.getHTMLCallback() != null) {
                    htmlC.getHTMLCallback().selectionChanged(oldSelected, newSelected, htmlC, list, element);
                }
            }
        };
        list.addSelectionListener(sl);
        listeners.put(cmp, sl);
    } else if (cmp instanceof TextArea) {
        ((TextArea) cmp).addActionListener(this);
        if (cmp instanceof TextField) {
            final TextField tf = (TextField) cmp;
            DataChangedListener dcl = new // We create a listener and not listen ourself since the listener's method does not pass the event origin, so we need to make one listener per component
            DataChangedListener() {

                public void dataChanged(int type, int index) {
                    element.setAttributeById(HTMLElement.ATTR_VALUE, tf.getText());
                    if (htmlC.getHTMLCallback() != null) {
                        htmlC.getHTMLCallback().dataChanged(type, index, htmlC, tf, element);
                    }
                }
            };
            tf.addDataChangedListener(dcl);
            listeners.put(cmp, dcl);
        }
    }
}
Also used : RadioButton(com.codename1.ui.RadioButton) Button(com.codename1.ui.Button) TextArea(com.codename1.ui.TextArea) TextField(com.codename1.ui.TextField) DataChangedListener(com.codename1.ui.events.DataChangedListener) List(com.codename1.ui.List) SelectionListener(com.codename1.ui.events.SelectionListener)

Example 4 with ComboBox

use of com.codename1.ui.ComboBox in project CodenameOne by codenameone.

the class HTMLForm method submit.

/**
 * Called when the a form submit is needed.
 * This querys all form fields, creates a URL accordingly and sets it to the HTMLComponent
 */
void submit(String submitKey, String submitVal) {
    if (action == null) {
        return;
    }
    // If this is turned to true anywhere, the form will not be submitted
    boolean error = false;
    String url = action;
    String params = null;
    if (comps.size() > 0) {
        params = "";
        for (Enumeration e = comps.keys(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            Object input = comps.get(key);
            key = HTMLUtils.encodeString(key);
            String value = "";
            if (input instanceof String) {
                // hidden
                value = HTMLUtils.encodeString((String) input);
                params += key + "=" + value + "&";
            } else if (input instanceof Hashtable) {
                // checkbox / radiobutton
                Hashtable options = (Hashtable) input;
                for (Enumeration e2 = options.keys(); e2.hasMoreElements(); ) {
                    Button b = (Button) e2.nextElement();
                    if (b.isSelected()) {
                        params += key + "=" + HTMLUtils.encodeString((String) options.get(b)) + "&";
                    }
                }
            } else if (input instanceof TextArea) {
                // catches both textareas and text input fields
                TextArea tf = ((TextArea) input);
                String text = tf.getText();
                String errorMsg = null;
                if (HTMLComponent.SUPPORT_INPUT_FORMAT) {
                    boolean ok = false;
                    if (text.equals("")) {
                        // check empty - Note that emptyok/-wap-input-required overrides input format
                        if (emptyNotOk.contains(tf)) {
                            errorMsg = htmlC.getUIManager().localize("html.format.emptynotok", "Field can't be empty");
                            error = true;
                        } else if (emptyOk.contains(tf)) {
                            ok = true;
                        }
                    }
                    if ((!error) && (!ok)) {
                        // If there's already an error or it has been cleared by the emptyOK field, no need to check
                        HTMLInputFormat inputFormat = (HTMLInputFormat) inputFormats.get(tf);
                        if ((inputFormat != null) && (!inputFormat.verifyString(text))) {
                            String emptyStr = "";
                            if (emptyOk.contains(tf)) {
                                emptyStr = htmlC.getUIManager().localize("html.format.oremptyok", " or an empty string");
                            } else if (emptyNotOk.contains(tf)) {
                                emptyStr = htmlC.getUIManager().localize("html.format.andemptynotok", " and cannot be an empty string");
                            }
                            errorMsg = htmlC.getUIManager().localize("html.format.errordesc", "Malformed text. Correct value: ") + inputFormat.toString() + emptyStr;
                            error = true;
                        }
                    }
                }
                if (htmlC.getHTMLCallback() != null) {
                    int type = HTMLCallback.FIELD_TEXT;
                    if ((tf.getConstraint() & TextArea.PASSWORD) != 0) {
                        type = HTMLCallback.FIELD_PASSWORD;
                    }
                    text = htmlC.getHTMLCallback().fieldSubmitted(htmlC, tf, url, key, text, type, errorMsg);
                }
                if (errorMsg == null) {
                    params += key + "=" + HTMLUtils.encodeString(text) + "&";
                }
            } else if (input instanceof ComboBox) {
                // drop down lists (single selection)
                Object item = ((ComboBox) input).getSelectedItem();
                if (item instanceof OptionItem) {
                    value = ((OptionItem) item).getValue();
                    params += key + "=" + HTMLUtils.encodeString(value) + "&";
                }
            // if not - value may be an OPTGROUP label in an only optgroup combobox
            } else if (input instanceof MultiComboBox) {
                // drop down lists (multiple selection)
                Vector selected = ((MultiComboBox) input).getSelected();
                for (int i = 0; i < selected.size(); i++) {
                    Object item = selected.elementAt(i);
                    if (item instanceof OptionItem) {
                        value = ((OptionItem) item).getValue();
                        params += key + "=" + HTMLUtils.encodeString(value) + "&";
                    }
                // if not - value may be an OPTGROUP label in an only optgroup combobox
                }
            }
        }
        if (params.endsWith("&")) {
            // trim the extra &
            params = params.substring(0, params.length() - 1);
        }
    }
    // Add the submit button param, only if the key is non-null (unnamed submit buttons are not passed as parameters)
    if (submitKey != null) {
        if (params == null) {
            params = "";
        }
        if (!params.equals("")) {
            params = params + "&";
        }
        params = params + HTMLUtils.encodeString(submitKey) + "=" + HTMLUtils.encodeString(submitVal);
    }
    if (!error) {
        DocumentInfo docInfo = new DocumentInfo(url, params, isPostMethod);
        if ((encType != null) && (!encType.equals(""))) {
            docInfo.setEncoding(encType);
        }
        htmlC.setPage(docInfo);
    }
}
Also used : Enumeration(java.util.Enumeration) TextArea(com.codename1.ui.TextArea) Hashtable(java.util.Hashtable) ComboBox(com.codename1.ui.ComboBox) RadioButton(com.codename1.ui.RadioButton) Button(com.codename1.ui.Button) Vector(java.util.Vector)

Example 5 with ComboBox

use of com.codename1.ui.ComboBox in project CodenameOne by codenameone.

the class DefaultLookAndFeel method getListPreferredSizeImpl.

private Dimension getListPreferredSizeImpl(List l) {
    int width = 0;
    int height = 0;
    int selectedHeight;
    int selectedWidth;
    ListModel model = l.getModel();
    int numOfcomponents = Math.max(model.getSize(), l.getMinElementHeight());
    numOfcomponents = Math.min(numOfcomponents, l.getMaxElementHeight());
    Object prototype = l.getRenderingPrototype();
    Style unselectedEntryStyle = null;
    Style selectedEntryStyle;
    if (prototype != null) {
        ListCellRenderer renderer = l.getRenderer();
        Component cmp = renderer.getListCellRendererComponent(l, prototype, 0, false);
        height = cmp.getPreferredH();
        width = cmp.getPreferredW();
        unselectedEntryStyle = cmp.getStyle();
        cmp = renderer.getListCellRendererComponent(l, prototype, 0, true);
        selectedEntryStyle = cmp.getStyle();
        selectedHeight = Math.max(height, cmp.getPreferredH());
        selectedWidth = Math.max(width, cmp.getPreferredW());
    } else {
        int hightCalcComponents = Math.min(l.getListSizeCalculationSampleCount(), numOfcomponents);
        Object dummyProto = l.getRenderingPrototype();
        if (model.getSize() > 0 && dummyProto == null) {
            dummyProto = model.getItemAt(0);
        }
        ListCellRenderer renderer = l.getRenderer();
        for (int i = 0; i < hightCalcComponents; i++) {
            Object value;
            if (i < model.getSize()) {
                value = model.getItemAt(i);
            } else {
                value = dummyProto;
            }
            Component cmp = renderer.getListCellRendererComponent(l, value, i, false);
            if (cmp instanceof Container) {
                cmp.setShouldCalcPreferredSize(true);
            }
            unselectedEntryStyle = cmp.getStyle();
            height = Math.max(height, cmp.getPreferredH());
            width = Math.max(width, cmp.getPreferredW());
        }
        selectedEntryStyle = unselectedEntryStyle;
        selectedHeight = height;
        selectedWidth = width;
        if (model.getSize() > 0) {
            Object value = model.getItemAt(0);
            Component cmp = renderer.getListCellRendererComponent(l, value, 0, true);
            if (cmp instanceof Container) {
                cmp.setShouldCalcPreferredSize(true);
            }
            selectedHeight = Math.max(height, cmp.getPreferredH());
            selectedWidth = Math.max(width, cmp.getPreferredW());
            selectedEntryStyle = cmp.getStyle();
        }
    }
    if (unselectedEntryStyle != null) {
        selectedWidth += selectedEntryStyle.getMarginLeftNoRTL() + selectedEntryStyle.getMarginRightNoRTL();
        selectedHeight += selectedEntryStyle.getMarginTop() + selectedEntryStyle.getMarginBottom();
        width += unselectedEntryStyle.getMarginLeftNoRTL() + unselectedEntryStyle.getMarginRightNoRTL();
        height += unselectedEntryStyle.getMarginTop() + unselectedEntryStyle.getMarginBottom();
    }
    Style lStyle = l.getStyle();
    int verticalPadding = lStyle.getPaddingTop() + lStyle.getPaddingBottom();
    int horizontalPadding = lStyle.getPaddingRightNoRTL() + lStyle.getPaddingLeftNoRTL() + l.getSideGap();
    if (numOfcomponents == 0) {
        return new Dimension(horizontalPadding, verticalPadding);
    }
    // If combobox without ever importing the ComboBox class dependency
    if (l.getOrientation() > List.HORIZONTAL) {
        int boxWidth = l.getStyle().getFont().getHeight() + 2;
        return new Dimension(boxWidth + selectedWidth + horizontalPadding, selectedHeight + verticalPadding);
    } else {
        if (l.getOrientation() == List.VERTICAL) {
            return new Dimension(selectedWidth + horizontalPadding, selectedHeight + (height + l.getItemGap()) * (numOfcomponents - 1) + verticalPadding);
        } else {
            return new Dimension(selectedWidth + (width + l.getItemGap()) * (numOfcomponents - 1) + horizontalPadding, selectedHeight + verticalPadding);
        }
    }
}
Also used : Container(com.codename1.ui.Container) ListModel(com.codename1.ui.list.ListModel) ListCellRenderer(com.codename1.ui.list.ListCellRenderer) Dimension(com.codename1.ui.geom.Dimension) Component(com.codename1.ui.Component)

Aggregations

Button (com.codename1.ui.Button)5 RadioButton (com.codename1.ui.RadioButton)5 TextArea (com.codename1.ui.TextArea)5 Component (com.codename1.ui.Component)3 Enumeration (java.util.Enumeration)3 Hashtable (java.util.Hashtable)3 Vector (java.util.Vector)3 ComboBox (com.codename1.ui.ComboBox)2 Container (com.codename1.ui.Container)2 List (com.codename1.ui.List)2 TextField (com.codename1.ui.TextField)2 SelectionListener (com.codename1.ui.events.SelectionListener)2 ListModel (com.codename1.ui.list.ListModel)2 FontImage (com.codename1.ui.FontImage)1 Image (com.codename1.ui.Image)1 Label (com.codename1.ui.Label)1 DataChangedListener (com.codename1.ui.events.DataChangedListener)1 Dimension (com.codename1.ui.geom.Dimension)1 BorderLayout (com.codename1.ui.layouts.BorderLayout)1 BoxLayout (com.codename1.ui.layouts.BoxLayout)1