Dialog box with an edit control
We want now to construct the dialog box below.
We have to have a look at the corresponding IDL files. We begin with com.sun.star.awt.XTextComponent Interface.
//Listing 21 XTextComponent Interface : IDL File // IDL module com { module sun { module star { module awt { interface XTextComponent: com::sun::star::uno::XInterface { [oneway] void addTextListener( [in] com::sun::star::awt::XTextListener l ); [oneway] void removeTextListener( [in] com::sun::star::awt::XTextListener l ); [oneway] void setText( [in] string aText ); [oneway] void insertText( [in] com::sun::star::awt::Selection Sel, [in] string Text ); string getText(); string getSelectedText(); [oneway] void setSelection( [in] com::sun::star::awt::Selection aSelection ); com::sun::star::awt::Selection getSelection(); boolean isEditable(); [oneway] void setEditable( [in] boolean bEditable ); [oneway] void setMaxTextLen( [in] short nLen ); short getMaxTextLen(); }; }; }; }; };
![]() |
As shown in Figure above this example has a defect : the text is always added on the top instead on the bottom ! At the moment, I don't know how to resolve this problem : If I use the setText method I always obtain only one line, if I use insertText method I have to provide a selection. I take this selection with the getSelection but there is nothing selected and then this method return the beginning of the text.
Talk: please see here So let's have a look at the com.sun.star.awt.Selection IDL file module com { module sun { module star { module awt { struct Selection: com.sun.star.awt.Selection. { Min specifies the lower limit of the range. Max specifies the upper limit of the range. }; }; }; }; }; |
We show now the com.sun.star.awt.UnoControlEditModel IDL file :
//Listing 22 UnoControlEditModel Service : IDL File // IDL module com { module sun { module star { module awt { service UnoControlEditModel { service com::sun::star::awt::UnoControlModel; [property] short Align; [property] long BackgroundColor; [property] short Border; [optional, property] short EchoChar; [property] boolean Enabled; [property] com::sun::star::awt::FontDescriptor FontDescriptor; [property] short FontEmphasisMark; [property] short FontRelief; [property] boolean HScroll; [property] boolean HardLineBreaks; [property] string HelpText; [property] string HelpURL; [property] short MaxTextLen; [property] boolean MultiLine; [property] boolean Printable; [property] boolean ReadOnly; [property] boolean Tabstop; [property] string Text; [property] long TextColor; [property] long TextLineColor; [property] boolean VScroll; }; }; }; }; };
We use any of these properties in the example above. To construct it, I modify first the event listener of the previous example like the listing above :
//Listing 23 We first remplace XFixedText with XTextComponent interface // C++ .... // Don't forget to add : #include <com/sun/star/awt/XTextComponent.hpp> // Don't forget to add "com.sun.star.awt.XTextComponent \" in the makefile // Reference< XFixedText > xLabel(label,UNO_QUERY); //OLD Reference< XTextComponent > xLabel(label,UNO_QUERY); xLabel->insertText (xLabel->getSelection(), OUString::createFromAscii("Text1 ") + OUStr.valueOf((sal_Int32)_nCounts)+ OUString::createFromAscii("\n")); ....
and then I replace the “com.sun.star.awt.UnoControlFixedTextModel” control with "com.sun.star.awt.UnoControlEditModel". This is done with code :
//Listing 24 The UnoControlEditModel : an Example // C++ Reference< XInterface > xlabelModel = xMultiServiceFactory->createInstance( OUString::createFromAscii("com.sun.star.awt.UnoControlEditModel")); Reference< XPropertySet > xPSetLabel(xlabelModel,UNO_QUERY); value=20; val <<= value; xPSetLabel->setPropertyValue(OUString::createFromAscii("PositionX"),val); value=10; val <<= value; xPSetLabel->setPropertyValue(OUString::createFromAscii("PositionY"),val); value=110; val <<= value; xPSetLabel->setPropertyValue(OUString::createFromAscii("Width"),val); value=50; val <<= value; xPSetLabel->setPropertyValue(OUString::createFromAscii("Height"),val); xPSetLabel->setPropertyValue(OUString::createFromAscii("HScroll"),makeAny((sal_Bool)true)); xPSetLabel->setPropertyValue(OUString::createFromAscii("VScroll"),makeAny((sal_Bool)true)); xPSetLabel->setPropertyValue(OUString::createFromAscii("MultiLine"), makeAny((sal_Bool)true)); xPSetLabel->setPropertyValue(OUString::createFromAscii("HardLineBreaks"), makeAny((sal_Bool)true)); val <<=OUString::createFromAscii("Label1"); xPSetLabel->setPropertyValue(OUString::createFromAscii("Name"),val); xPSetLabel->setPropertyValue(OUString::createFromAscii("TabIndex"),makeAny((short)1));
We will construct a helper to simplify the task of writing such a code later on. But at first we have to speak about another kind of button : OK button. The property to change is "PushButtonType". Values taken by this property are given by a IDL file as usual :
Listing 25 PushButtonType enumeration : IDL File // IDL module com { module sun { module star { module awt { enum PushButtonType { STANDARD, OK, CANCEL, HELP }; }; }; }; };
The values are given by an enum type. We have already encountered such a problem and then know how to resolve it. I give here the code to add if you want an OK :
//Listing 26 adding a second “OK” button // C++ // second button : OK button // we need a second button modedl Reference< XInterface > xbuttonModel2 = xMultiServiceFactory->createInstance( OUString::createFromAscii("com.sun.star.awt.UnoControlButtonModel")); if (xbuttonModel.is()) printf("OK UnoControlButtonModel\n"); else printf("Error ... UnoControlButtonModel\n"); Reference< XPropertySet > xPSetButton2(xbuttonModel2,UNO_QUERY); if (xPSetButton2.is()) printf("OK XPropertySet\n"); else printf("Error ... XPropertySet\n"); // *** The following property is not position-independant !!!!! // Don't forget to add : #include <com/sun/star/awt/PushButtonType.hpp> // Don't forget to add "com.sun.star.awt.PushButtonType \" in the makefile // short is found with Inspector val <<= (short)PushButtonType_OK; xPSetButton2->setPropertyValue(OUString::createFromAscii("PushButtonType"),val); value=80; val <<= value; xPSetButton2->setPropertyValue(OUString::createFromAscii("PositionX"),val); value=70; val <<= value; xPSetButton2->setPropertyValue(OUString::createFromAscii("PositionY"),val); value=50; val <<= value; xPSetButton2->setPropertyValue(OUString::createFromAscii("Width"),val); value=14; val <<= value; xPSetButton2->setPropertyValue(OUString::createFromAscii("Height"),val); val <<=OUString::createFromAscii("Button2"); xPSetButton2->setPropertyValue(OUString::createFromAscii("Name"),val); xPSetButton2->setPropertyValue(OUString::createFromAscii("TabIndex"),makeAny((short)1)); val <<=OUString::createFromAscii("OK"); xPSetButton2->setPropertyValue(OUString::createFromAscii("Label"),val);
And then we have to add it and then to modify the insert listing's part like that :
//Listing 27 Inserting all control in container // C++ // insert all the control in container Reference< XNameContainer > xNameCont(xdialogModel,UNO_QUERY); if (xNameCont.is()) printf("OK XNameContainer\n"); else printf("Error ... XNameContainer\n"); val <<= xbuttonModel; // We insert first the button xNameCont->insertByName(OUString::createFromAscii("Button1") ,val); printf("First\n"); val <<= xbuttonModel2; xNameCont->insertByName(OUString::createFromAscii("Button2") ,val); //printf("First\n"); // We insert now the text control val <<= xlabelModel; xNameCont->insertByName(OUString::createFromAscii("Label1") , val);
Back to Playing with Window Toolkit AWT or to main page