MobilityDesignerRichComponents

New set of the Rich SVG UI Components - DRAFT

Additional features to this functionality is described in this document.

Contents


Abstract

This document is overview of several new SVG related features over the Mobility Visual Designer, SVG Composer and Netbeans Java ME SVG libraries.

Motivation

Motivation is to extend group of existing SVG components to provide better support for creation of compelling UI on mobile platforms using SVG technology. This project contains three parts:

  • Java ME runtime libraries - new components in the Netbeans Java ME SVG library
  • New SVG components in the SVG Composer palette - SVG XML snippets
  • Improvements over the Mobility Visual Designer - new SVGForm component and code generation for SVG UI attached to the SVGForm component

Almost every component in the SVG Java ME library should have representation as a SVG XML snippet in the SVG Composer palette. Combining Java ME library with UI (SVG file) created using Mobility SVG Composer should be done on the Mobility Visual Designer level (source code generation level). Ideally user should just add created UI (SVG file) created in the SVG Composer to the SVGForm and code which binds Java ME library with UI (SVG file) should be automatically generated.

Functionality

Java ME Runtime library

Netbeans SVG Components library should contains following new components:

  • SVGForm
  • Button
  • Label
  • RadioButton
  • CheckBox
  • ComboBox
  • List
  • Slider
  • Spinner
  • TextField

Opened Visual Midlet should be updated automatically based on changes made in svg Image (Flow, Screen Editor and Source).

List contains only non abstract components. This library should be tested not only for reference implementation of Java ME CLDC/MIDP like WTK but also behavior of the components should be tested on real devices (emulators) like Nokia platforms (S40, S60) and Sony-Ericcson.

Example code:

Pattern shown below may be modified during the actual implementation of this feature

Code pattern example. It shows how to declare SVGForm and how to bind, add and create component to the container (SVGForm).

    //SVGForm declaration and binding SVG UI file with Jave ME component
    SVGForm svgForm = new SVGForm(getSvgImage("/svgForm.svg"), getDisplay());                                    
    
    //SVGRadioButton declaration with binding of the component to the particular ID in the SVG UI XML file and adding component to the SVGForm
    SVGRadioButton radioMale = svgForm.addRadioButton(new SVGButton(svgForm,"radio_male"));


Overview of the architecture of the Netbeans Java ME SVG Components library.

Architecture (diagram) shown below may be modified during the actual implementation of this feature


Image:SVGComponents_MobilityDesignerRichComponents.gif


Example of the SVG UI created using SVG Libraries running on the WTK.

Image:example_SVG2_MobilityDesignerRichComponents.png


Image:widgets_MobilityDesignerRichComponents.gif

The SVG Composer and the SVG Components Snippets

The SVG Composer should help users to create UI based on the components available in the palette. Each of the SVG UI Components should have SVG XML snippet. When user drops or modifies component using the SVG Composer XML code should be added or modified to the editing SVG UI file.

The SVG Composer with SVG components in the palette - PROTOTYPE

Image:svgcomposer_MobilityDesignerRichComponents.png


Short overview of SVG Components

The common idiom for SVG Component is :

....
SVGImage image = (SVGImage) SVGImage.createImage(getClass().getResourceAsStream("/svgImage.svg"), null);
svgForm = new SVGForm(image, Display.getDisplay(midlet));
SVGComponent component = new SVGTextField( svgForm, "textFieldID");
svgForm.add( component );
.....

Here "textFieldID" is SVG identifier ( value of attribute "id" ) of SVG element in snippet. See below for description of snippets for each component.

SVGForm - Visual Designer palette

The SVGForm should have functionality analogous to the Java ME MIDP 2.0 Form. This component should serve as a container for SVG components and should be available in the palette of the Visual Mobile Designer:

SVG Components which could be attached to the SVGForm:

  • SVGForm
  • Button
  • Label
  • RadioButton
  • CheckBox
  • ComboBox
  • List
  • Slider
  • Spinner
  • TextField

Overview of the components and SVG XML snippets available in the SVG Composer palette.

Button

SVGButton represents Button functionality. Here is SVG snippet for button:

<g transform="translate(130,276)" id="button_ok">
	<!-- Metadata information. Please don't edit. -->
	<text display="none">type=button</text>

        <rect x="0" y="0" rx="5" ry="5" width="80" height="30" fill="white"/>
        <rect x="2" y="2" rx="5" ry="5" width="80" height="31" fill="rgb(0,0,128)"/>
	<g>
		<text display="none">type=body</text>
		<rect id="button_ok_body" x="1" y="1" rx="5" ry="5" width="80" height="30" fill="rgb(176,196,222)" 
                         stroke="rgb(255,165,0)" stroke-width="0">
		    <animate attributeName="stroke-width" attributeType="XML" begin="button_ok.focusin" dur="0.25s" 
                                fill="freeze" to="2"/>
		    <animate attributeName="stroke-width" attributeType="XML" begin="button_ok.focusout" dur="0.25s" 
                                fill="freeze" to="0"/>
	            <!-- The third and fourth animation elements are used for animate button : on press, on release -->
		    <animate id="button_ok_body_pressed" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
                                fill="freeze" to="rgb(156,176,202)"/>
		    <animate id="button_ok_body_released" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
                                fill="freeze" to="rgb(176,196,222)"/>
		</rect>
	</g>
        <g>
	        <text id="button_ok_stext" x="24" y="23" fill="black" font-size="20">
		OK</text>
                <text display="none">type=shadow_text</text>
        </g>
        <g>
                <text id="button_ok_text" x="23" y="21" fill="gray" font-size="20">
		OK</text>
                <text display="none">type=text</text>
        </g>
    </g>


Label

SVGLabel is very simple component that could be not used at all ( because SVG file can contain any figure ). Here is snippet for it :

<g id="label_svg" transform="translate(130,200)">
   <text display="none">type=label</text>
   <g>
   <text id="label_svg_text" x="5" y="5" stroke="black" font-size="15"  font-family="SunSansSemiBold">
       Label
   </text>
   <text display="none">type=text</text>
   </g>
</g>

id="label_svg" is identifier for SVG components between other SVG tags. Metadata text type="label" is helping information that marks SVG tag "g" as SVG Component with type "label". This information could be used in Designer for identifying components. Also it should be used in Java source for component. It allows to deny some SVG elements in constructor of SVG component ( if it doesn't have appropriate type ).

There is a problem currently with usage of SVGLabels : each component gets focus on navigation via UP/DOWN buttons . So SVGLabel also can get focus. As result : some strange behavior with focus in process of navigation. Possible SVGLabel needs some method "labelFor(SVGCompoenent)" . In this case focus will set for component that is in argument of this method ( not for label ).

RadioButton

Radio button is represented by SVGRadioButton class. This is how it can be used :

SVGRadioButton male = new SVGRadioButton(svgForm, "radio_male");
SVGRadioButton female = new SVGRadioButton(svgForm, "radio_female");
svgForm.add(male);
svgForm.add(female);
SVGButtonGroup group = new SVGButtonGroup();
group.add( male );
group.add( female );

Here is SVG snippet for radio button( they should be included in group of buttons ):

<g id="radiobuttonframe" transform="translate(20,190)">
        <rect x="0" y="0" rx="5" ry="5" width="200" height="60" fill="none" stroke="#85a6cf" stroke-width="2"/>
        <g id="radio_male" transform="translate(7,5)">
	    <!-- Metadata information. Please don't edit. -->
	    <text display="none">type=radio</text>

            <rect x="0" y="0" rx="5" ry="5" width="185" height="24" fill="none" stroke="rgb(255,165,0)" 
                        stroke-width="2" visibility="hidden">
                <set attributeName="visibility" attributeType="XML" begin="radio_male.focusin" 
                         fill="freeze" to="visible"/>
                <set attributeName="visibility" attributeType="XML" begin="radio_male.focusout" 
                         fill="freeze" to="hidden"/>
            </rect>
            <circle cx="11" cy="12" r="8" fill="white" stroke="black" stroke-width="2"/>
	    <g>
		    <text display="none">type=dot</text>
		    <circle id="radio_male_dot" cx="11" cy="12" r="4" fill="black" visibility="hidden"/>
	    </g>
            <g>
                    <text id="radio_male_text" x="24" y="17" stroke="gray" font-size="15">
                     Male</text>
                    <!-- Metadata information. Please don't edit. -->
	            <text display="none">type=radio</text>
            </g>
        </g>

        <g id="radio_female" transform="translate(7,33)">
	    <!-- Metadata information. Please don't edit. -->
	    <text display="none">type=radio</text>

            <rect x="0" y="0" rx="5" ry="5" width="185" height="24" fill="none" stroke="rgb(255,165,0)" 
                               stroke-width="2" visibility="hidden">
                <set attributeName="visibility" attributeType="XML" begin="radio_female.focusin" 
                          fill="freeze" to="visible"/>
                <set attributeName="visibility" attributeType="XML" begin="radio_female.focusout" 
                          fill="freeze" to="hidden"/>
            </rect>
            <circle transform="translate(11, 12)" cx="0" cy="0" r="8" fill="white" stroke="black" stroke-width="2"/>
	    <g>
	    	<!-- Metadata information. Please don't edit. -->
		<text display="none">type=dot</text>

		<circle id="radio_female_dot" cx="11" cy="12" r="4" fill="black" visibility="hidden"/>
	    </g>
            <g>
                <text id="radio_female_text" x="24" y="17" stroke="gray" font-size="15">
                   Female</text>
                <!-- Metadata information. Please don't edit. -->
	        <text display="none">type=radio</text>
            </g>
        </g>
    </g>


CheckBox

Check box is represented by SVGCheckBox class. Here is SVG snippet :

<g id="checkbox_online" transform="translate(130,220)">
       <!-- Metadata information. Please don't edit. -->
       <text display="none">type=checkbox</text>

       <rect x="0" y="0" rx="5" ry="5" width="200" height="30" fill="none" stroke="rgb(255,165,0)" 
                    stroke-width="2" visibility="hidden">
           <set attributeName="visibility" attributeType="XML" begin="checkbox_online.focusin" fill="freeze" to="visible"/>
           <set attributeName="visibility" attributeType="XML" begin="checkbox_online.focusout" fill="freeze" to="hidden"/>
       </rect>
       <rect x="7.4" y="5" width="20" height="20" fill="white" stroke="black" stroke-width="2"/>
       <g>
               <!-- Metadata information. Please don't edit. -->
	       <text display="none">type=mark</text>
               <path id="checkbox_online_mark" transform="translate(12.5,15.5)"  d="M 0,0 5,5 5,-12" fill="none" 
                     stroke="black" stroke-width="2"/>
       </g>
       <g>
               <text id="checkbox_online_title" x="33.8" y="21.6" stroke="gray" font-size="15">
               Online</text>
               <!-- Metadata information. Please don't edit. -->
	       <text display="none">type=text</text>
       </g>
   </g>


ComboBox

ComboBox is represented by SVGComboBox class. This component is more complicated than previous components. It requires ComboBoxModel for accessing to contents of suggested choices and also editor for entering information manually ( if one don't want to use suggested choices but enter new value ). There are default implementation of ComboBoxModel : DefaultModel ( nested class in SVGComboBox ) and default editor is SVGTextField. So here is simple usage if SVGComboBox :

SVGComboBox box = new SVGComboBox ( svgForm ,"country_combobox");
svgForm.add( box );
Vector vector = new Vector(); 
vector.addElement("Item 1");
vector.addElement("Item 2");
vector.addElement("Item 3");
vector.addElement("Item 4");
vector.addElement("Item 5");
vector.addElement("Item 6");
box.setModel( new SVGComboBox.DefaultModel( vector ));

Here are SVG snippets for SVGComboBox :

<g id="country_combobox" transform="translate(20,180)">
	<!-- Metadata information. Please don't edit. -->
	<text display="none">type=combobox</text>

        <rect x="0" y="-5" rx="5" ry="5" width="90" height="30" fill="none" stroke="rgb(255,165,0)" 
               stroke-width="2" visibility="hidden">
            <set attributeName="visibility" attributeType="XML" begin="country_combobox.focusin" 
                fill="freeze" to="visible"/>
            <set attributeName="visibility" attributeType="XML" begin="country_combobox.focusout" 
                fill="freeze" to="hidden"/>
        </rect>
        <rect  x="5.0" y="0.0" width="80" height="20" fill="none" stroke="black" stroke-width="2"/>
	<g>
		<!-- Metadata information. Please don't edit. -->
		<text display="none">type=button</text>

		<rect id="country_combobox_button" x="66.0" y="1.0" width="18" height="18" fill="rgb(220,220,220)" 
			    stroke="black" stroke-width="1.5">
			<animate id="country_combobox_button_pressed" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
				fill="freeze" to="rgb(170,170,170)"/>
			<animate id="country_combobox_button_released" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
				fill="freeze" to="rgb(220,220,220)"/>
	</rect>
	</g>
	<polygon transform="translate(73,8)"  points="0,0 4,0 2,4" fill="blue" 
                  stroke="black" stroke-width="2"/>
	<g id="country_combobox_editor">
		<!-- this editor is SVGTextField component -->

		<!-- Metadata information. Please don't edit. -->
		<text display="none">type=editor</text>
		<text display="none">editable=false</text>
		<text display="none">enabled=true</text>

                <g>
		    <text id="country_combobox_editor_text" x="10" y="15" stroke="black" font-size="15" font-family="SunSansSemiBold">Item 1
		    </text>
                    <!-- Metadata information. Please don't edit. -->
	            <text display="none">type=text</text>
                </g>
		<rect visibility="hidden" x="5.0" y="0" width="60" height="20" />
	</g>
    </g>
<g id="country_combobox_list" visibility="hidden" transform="translate(20,200)">
		<!-- Metadata information. Please don't edit. -->
		<text display="none">ref=country_combobox</text>
		<text display="none">type=list</text>

                <g>
		        <text id="country_combobox_list_hidden_text" visibility="hidden" x="10" y="13" stroke="black" font-size="15" 
                         font-family="SunSansSemiBold">
			HIDDEN TEXT
		        </text>
                       <!-- Metadata information. Please don't edit. -->
			<text display="none">type=hidden_text</text>
                </g>
		<g>
			<!-- Metadata information. Please don't edit. -->
			<text display="none">type=bound</text>
			<rect id="country_combobox_list_bound" x="5.0" y="0.0" width="80" height="60" 
                               fill="white" stroke="black" stroke-width="2" visibility="inherit"/>
		</g>
		<g>
			<!-- Metadata information. Please don't edit. -->
			<text display="none">type=selection</text>
			<rect id="country_combobox_list_selection" x="5" y="0" stroke="black" 
                                 stroke-width="1" fill="rgb(200,200,255)" visibility="inherit" width="80" height="0"/>
		</g>
               <g id="country_combobox_list_current_selection" >
                       <!-- Metadata information. Please don't edit. -->
                       <text display="none">type=current_selection</text> 
                </g>

		<g  id="country_combobox_list_content" visibility="inherit">
			<!-- Metadata information. Please don't edit. -->
			<text display="none">type=content</text>
	       	</g>
	</g

The latter snippet should be at the end of SVG file ( between other such possible tags ). Otherwise it could appear "under" some SVG figure and it will not be visible when it opens. This snippet represent list of choices in combobox.

List

Class SVGList represents this component. It also requires class that implements ListModel . User should also implement SVGListCellRenderer and SelectionModel interfaces. There are DefaultListMoldel implementation for ListModel and default renderer with selection model implementations. Here is code snippet for SVGList creation:

SVGList list = new SVGList( svgForm ,  "list" );
svgForm.add( list );
Vector vector = new Vector();
vector.add("Item 1");
vector.add("Item 2");
list.setModel( new SVGList.DefaultListMoldel( vector));

Here is SVG snippet for SVGList:

<g id="list" transform="translate(20,220)" >
	    <g>
		<!-- Metadata information. Please don't edit. -->
		<text display="none">type=selection</text>
		
		<rect id="list_selection" x="5" y="0" stroke="black" stroke-width="1" fill="rgb(200,200,255)" 
                        visibility="inherit" width="80" height="0"/>
	    </g>
            <g>
	        <text id="list_hidden_text" visibility="hidden" x="10" y="13" stroke="black" font-size="15" font-family="SunSansSemiBold">
		HIDDEN TEXT
	        </text>
                <text display="none">type=hidden_text</text>
            </g>
             <g id="list_current_selection" >
                 <!-- Metadata information. Please don't edit. -->
                 <text display="none">type=current_selection</text> 
             </g>
	<g id="list_content"> 
		<!-- Metadata information. Please don't edit. -->
		<text display="none">type=content</text> 
	</g>
        <rect x="0" y="-5" rx="5" ry="5" width="90" height="70" fill="none" stroke="rgb(255,165,0)" 
                      stroke-width="2" visibility="hidden">
            <set attributeName="visibility" attributeType="XML" begin="list.focusin" fill="freeze" to="visible"/>
            <set attributeName="visibility" attributeType="XML" begin="list.focusout" fill="freeze" to="hidden"/>
        </rect>
	<g>
	        <!-- Metadata information. Please don't edit. -->
		<text display="none">type=bound</text>

		<rect id="list_bound" x="5.0" y="0.0" width="80" height="60" fill="none" stroke="black" stroke-width="2"/>
	</g>
    </g>

Slider

SVGSlider represents this component. Here is snippet for this class:

<g id="size_slider" transform="translate(20,110)">
	    <!-- Metadata information. Please don't edit. -->
	    <text display="none">type=slider</text>

        <rect x="0" y="-10" rx="5" ry="5" width="200" height="30" fill="none" stroke="rgb(255,165,0)" 
                       stroke-width="2" visibility="hidden">
            <set attributeName="visibility" attributeType="XML" begin="size_slider.focusin" fill="freeze" to="visible"/>
            <set attributeName="visibility" attributeType="XML" begin="size_slider.focusout" fill="freeze" to="hidden"/>
        </rect>
	<g id="size_slider_rule" >
	    <text display="none">type=rule</text>
	    <rect  x="10.0" y="1.0" width="180" height="4" fill="rgb(240,240,255)" stroke="black" stroke-width="1"/>
	</g>
        <g id="size_slider_knob"  transform="translate(0,-5)">
	    <text display="none">type=knob</text>
            <polygon transform="scale(0.2,0.2)"  points="20,10 80,10 80,40 50,70 20,40" 
			   fill="rgb(220,220,255)" stroke="black" stroke-width="1"/>
        </g>
    </g>

Spinner

SVGSpinner represents this component. This component could have custom editor ( that is SVGTextField by default ). Here is SVG snippet:

<g id="age_spinner"  transform="translate(20,140)">
	<!-- Metadata information. Please don't edit. -->
	<text display="none">type=spinner</text>

        <rect x="0" y="-5" rx="5" ry="5" width="44" height="30" fill="none" stroke="rgb(255,165,0)" 
                      stroke-width="2" visibility="hidden">
            <set attributeName="visibility" attributeType="XML" begin="age_spinner.focusin" fill="freeze" to="visible"/>
            <set attributeName="visibility" attributeType="XML" begin="age_spinner.focusout" fill="freeze" to="hidden"/>
        </rect>
        <rect  x="5.0" y="0.0" width="33" height="20" fill="none" stroke="black" stroke-width="2"/>
	<g id="age_spinner_editor" >
		<!-- this editor is SVGTextField component -->

		<!-- metadata definition-->
	        <text display="none">type=editor</text>
		<text display="none">editable=false</text>
		<text display="none">enabled=true</text>

                <g>
		     <text id="age_spinner_editor_text" x="10" y="15" stroke="black" font-size="15" font-family="SunSansSemiBold">
                      0</text>
                     <!-- Metadata information. Please don't edit. -->
			<text display="none">type=text</text>
                </g>


		<rect visibility="hidden" x="5.0" y="0" width="33" height="20"/>
	</g>
	<g>
	    	<!-- Metadata information. Please don't edit. -->
		<text display="none">type=up_button</text>

		<rect id="age_spinner_up_button" x="21.0" y="0.0" width="16" height="10" fill="rgb(220,220,220)" stroke="black" stroke-width="1.5">
			<animate id="age_spinner_up_button_pressed" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
                                  fill="freeze" to="rgb(170,170,170)"/>
			<animate id="age_spinner_up_button_realeased" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
                                  fill="freeze" to="rgb(220,220,220)"/>
		</rect>
	</g>
	<g>
	    	<!-- Metadata information. Please don't edit. -->
		<text display="none">type=down_button</text>

		<rect id="age_spinner_down_button" x="21.0" y="10.0" width="16" height="10" fill="rgb(220,220,220)" stroke="black" stroke-width="1.5">
			<animate id="age_spinner_down_button_pressed" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
                                   fill="freeze" to="rgb(170,170,170)"/>
			<animate id="age_spinner_down_button_realeased" attributeName="fill" attributeType="XML" begin="indefinite" dur="0.25s" 
                                   fill="freeze" to="rgb(220,220,220)"/>
		</rect>
	</g>
	<polygon transform="translate(28,6)"  points="0,0 2,0 1,-2" fill="blue" stroke="black" stroke-width="2"/>
	<polygon transform="translate(28,14)"  points="0,0 2,0 1,2" fill="blue" stroke="black" stroke-width="2"/>
    </g>

TextField (Optional - may not be in final version 1.0)

SVGTextField represent this component. Here is SVG snippet :

<g id="textfield_name" transform="translate(20,40)">
       <!-- Metadata information. Please don't edit. -->
   <text display="none">type=textfield</text>
       <text display="none">editable=true</text>
       <text display="none">enabled=true</text>

       <rect x="0" y="0" rx="5" ry="5" width="200" height="30" fill="none" stroke="black" stroke-width="2">
           <animate attributeName="stroke" attributeType="XML" begin="textfield_name.focusin" dur="0.25s" 
                       fill="freeze" to="rgb(255,165,0)"/>
           <animate attributeName="stroke" attributeType="XML" begin="textfield_name.focusout" dur="0.25s" 
                       fill="freeze" to="black"/>
       </rect>
       <g>
             <text  id="textfield_name_text" x="10" y="23" stroke="black" font-size="20" font-family="SunSansSemiBold">
             Some Text</text>
             <!-- Metadata information. Please don't edit. -->
             <text display="none">type=text</text>
       </g>
   <g>
           <!-- Metadata information. Please don't edit. -->
           <text display="none">type=caret</text>

           <rect id="textfield_name_caret" visibility="visible" x="20" y="4" 
              width="3" height="22" fill="black" stroke="black"/>
       </g>
   </g>


Mobility Visual Designer SVG Support

The Mobility Visual Designer should have new component SVGForm in the palette. Using SVGForm property editor developers should be able to add SVG UI (SVG file) created using the SVG Composer. During the code generation Visual Designer should generate code which binds UI SVG components with Java ME components based on the SVG file added to the SVGForm. The SVG UI file should be parsed and provide some feedback for developers before code generation (most likely right after is added to the SVGForm) to prevent possible problems during code generation. User should not be allow to edit SVG UI using Visual Designer.


Screenshot of Flow Designer:

Image:1_MobilityDesignerRichComponents.png


\ Screenshot of the Flow designer:
\
\ Image:4_MobilityDesignerRichComponents.png
\
\

Property Editor

Property Editor should give users possibility to attache SVG Image to the SVGForm component and also should give overview of the SVG Components recognized in the SVG file components.

Screenshot of the tab SVG Image File:
\
\ Image:2_MobilityDesignerRichComponents.png
\
\ Screenshot of the tab Recognized SVG Components:
\
\ Image:3_MobilityDesignerRichComponents.png
\
\

Code Generation Pattern

The SVGForm source code pattern which should be automatically generated based on actions taken in the Visual Designer.

public SVGForm getSvgForm() {
        if (svgForm == null) {
            // write pre-init user code here
            svgForm = new SVGForm(getSvgImage1(), getDisplay());
            svgForm.setTitle("svgForm");
            svgForm.add(getSvgButton());
            svgForm.add(getSvgButton1());
            svgForm.add(getSvgLabel());
            svgForm.add(getSvgTextField());
            svgForm.add(getSvgLabel1());
            svgForm.add(getSvgTextField1());
            // write post-init user code here
        }
        return svgForm;
    }

The SVGButton source code pattern which should be automatically generated based on actions taken in the Visual Designer. Rest of the SVG Components should follow same or similar pattern.

 public SVGButton getSvgButton() {
        if (svgButton == null) {
            // write pre-init user code here
            svgButton = new SVGButton(getSvgForm(), "button_0");
            // write post-init user code here
        }
        return svgButton;
    }



contact: Karol Harezlak

Not logged in. Log in, Register

By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2012, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo