/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#include "globals.hrc"
#include "fldtdlg.hrc"
#include "helpid.h"
TabPage TP_FLD_FUNC
{
	HelpID = HID_FLD_FUNC ;
	SVLook = TRUE ;
	Hide = TRUE ;
	Size = MAP_APPFONT ( 260 , 185 ) ;
	FixedText FT_FUNCTYPE
	{
		Pos = MAP_APPFONT ( 6 , 3 ) ;
		Size = MAP_APPFONT ( 76 , 8 ) ;
		Text [ en-US ] = "~Type" ;
		Left = TRUE ;
	};
	ListBox LB_FUNCTYPE
	{
	    HelpID = "sw:ListBox:TP_FLD_FUNC:LB_FUNCTYPE";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 6 , 14 ) ;
		Size = MAP_APPFONT ( 76 , 165 ) ;
		TabStop = TRUE ;
		Sort = FALSE ;
		AutoHScroll = TRUE ;
	};
	FixedText FT_FUNCSELECTION
	{
		Pos = MAP_APPFONT ( 88 , 3 ) ;
		Size = MAP_APPFONT ( 76 , 8 ) ;
		Text [ en-US ] = "S~elect" ;
		Hide = TRUE ;
		Left = TRUE ;
	};
	ListBox LB_FUNCSELECTION
	{
	    HelpID = "sw:ListBox:TP_FLD_FUNC:LB_FUNCSELECTION";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 88 , 14 ) ;
		Size = MAP_APPFONT ( 76 , 165 ) ;
		TabStop = TRUE ;
		Hide = TRUE ;
		Sort = TRUE ;
		AutoHScroll = TRUE ;
	};
	FixedText FT_FUNCFORMAT
	{
		Pos = MAP_APPFONT ( 88 , 3 ) ;
		Size = MAP_APPFONT ( 76 , 8 ) ;
		Left = TRUE ;
		Text [ en-US ] = "F~ormat" ;
	};
	ListBox LB_FUNCFORMAT
	{
	    HelpID = "sw:ListBox:TP_FLD_FUNC:LB_FUNCFORMAT";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 88 , 14 ) ;
		Size = MAP_APPFONT ( 76 , 165 ) ;
		TabStop = TRUE ;
	};
	FixedText FT_FUNCNAME
	{
		Pos = MAP_APPFONT ( 170 , 3 ) ;
		Size = MAP_APPFONT ( 84 , 8 ) ;
		Left = TRUE ;
		Text [ en-US ] = "Na~me" ;
	};
	Edit ED_FUNCNAME
	{
	    HelpID = "sw:Edit:TP_FLD_FUNC:ED_FUNCNAME";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 170 , 14 ) ;
		Size = MAP_APPFONT ( 84 , 12 ) ;
		TabStop = TRUE ;
		Left = TRUE ;
	};
	FixedText FT_FUNCVALUE
	{
		Pos = MAP_APPFONT ( 170 , 30 ) ;
		Size = MAP_APPFONT ( 84 , 8 ) ;
		Text [ en-US ] = "~Value" ;
		Left = TRUE ;
	};
	Edit ED_FUNCVALUE
	{
	    HelpID = "sw:Edit:TP_FLD_FUNC:ED_FUNCVALUE";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 170 , 41 ) ;
		Size = MAP_APPFONT ( 84 , 12 ) ;
		TabStop = TRUE ;
		Left = TRUE ;
	};
	FixedText FT_FUNCCOND1
	{
		Pos = MAP_APPFONT ( 170 , 30 ) ;
		Size = MAP_APPFONT ( 84 , 8 ) ;
		Left = TRUE ;
		Hide = TRUE ;
		Text [ en-US ] = "Then" ;
	};
	Edit ED_FUNCCOND1
	{
	    HelpID = "sw:Edit:TP_FLD_FUNC:ED_FUNCCOND1";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 170 , 41 ) ;
		Size = MAP_APPFONT ( 84 , 12 ) ;
		TabStop = TRUE ;
		Left = TRUE ;
		Hide = TRUE ;
	};
	FixedText FT_FUNCCOND2
	{
		Pos = MAP_APPFONT ( 170 , 57 ) ;
		Size = MAP_APPFONT ( 84 , 8 ) ;
		Left = TRUE ;
		Hide = TRUE ;
		Text [ en-US ] = "Else" ;
	};
	Edit ED_FUNCCOND2
	{
	    HelpID = "sw:Edit:TP_FLD_FUNC:ED_FUNCCOND2";
		Border = TRUE ;
		Pos = MAP_APPFONT ( 170 , 68 ) ;
		Size = MAP_APPFONT ( 84 , 12 ) ;
		TabStop = TRUE ;
		Left = TRUE ;
		Hide = TRUE ;
	};
	PushButton BT_FUNCMACRO
	{
	    HelpID = "sw:PushButton:TP_FLD_FUNC:BT_FUNCMACRO";
		Pos = MAP_APPFONT ( 204 , 165 ) ;
		Size = MAP_APPFONT ( 50 , 14 ) ;
		Text [ en-US ] = "~Macro..." ;
		Disable = TRUE ;
		TabStop = TRUE ;
	};
    FixedText FT_LISTITEM
    {
        Pos = MAP_APPFONT ( 170 , 3 ) ;
        Size = MAP_APPFONT ( 84 , 8 ) ;
        Hide = TRUE;
        Text [ en-US ] = "Ite~m" ;
	};
    Edit ED_LISTITEM
    {
        HelpID = "sw:Edit:TP_FLD_FUNC:ED_LISTITEM";
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 14 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Hide = TRUE;
    };
    PushButton PB_LISTADD
    {
        HelpID = "sw:PushButton:TP_FLD_FUNC:PB_LISTADD";
        Pos = MAP_APPFONT ( 170 , 29 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Hide = TRUE;
        Text [ en-US ] = "~Add" ;
	};
    FixedText FT_LISTITEMS
    {
        Pos = MAP_APPFONT ( 170 , 46 ) ;
        Size = MAP_APPFONT ( 84 , 8 ) ;
        Hide = TRUE;
        Text [ en-US ] = "Items on ~list" ;
	};
    ListBox LB_LISTITEMS
    {
        HelpID = "sw:ListBox:TP_FLD_FUNC:LB_LISTITEMS";
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 57 ) ;
        Size = MAP_APPFONT ( 83 , 44 ) ;
        TabStop = TRUE ;
        Sort = FALSE ;
        AutoHScroll = TRUE ;
    };
    PushButton PB_LISTREMOVE
    {
        HelpID = "sw:PushButton:TP_FLD_FUNC:PB_LISTREMOVE";
        Pos = MAP_APPFONT ( 203 , 104 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Hide = TRUE;
        Text [ en-US ] = "~Remove" ;
	};
    PushButton PB_LISTUP
    {
        HelpID = "sw:PushButton:TP_FLD_FUNC:PB_LISTUP";
        Pos = MAP_APPFONT ( 203 , 121 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Hide = TRUE;
        Text [ en-US ] = "Move ~Up" ;
	};
    PushButton PB_LISTDOWN
    {
        HelpID = "sw:PushButton:TP_FLD_FUNC:PB_LISTDOWN";
        Pos = MAP_APPFONT ( 203 , 138 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Hide = TRUE;
        Text [ en-US ] = "Move Do~wn" ;
	};
    FixedText FT_LISTNAME
    {
        Pos = MAP_APPFONT ( 170 , 156 ) ;
        Size = MAP_APPFONT ( 84 , 8 ) ;
        Hide = TRUE;
        Text [ en-US ] = "Na~me" ;
	};
    Edit ED_LISTNAME
    {
        HelpID = "sw:Edit:TP_FLD_FUNC:ED_LISTNAME";
        Border = TRUE ;
        Pos = MAP_APPFONT ( 170 , 167 ) ;
        Size = MAP_APPFONT ( 84 , 12 ) ;
        TabStop = TRUE ;
        Left = TRUE ;
        Hide = TRUE;
    };
    Text [ en-US ] = "Functions" ;
};



































