/**************************************************************
 * 
 * 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 <mmmergepage.hrc>
#include <dbui.hrc>
#include <helpid.h>

TabPage DLG_MM_MERGE_PAGE
{
    HelpID = HID_MM_MERGEPAGE ;
    Size = MAP_APPFONT ( 260 , 250 ) ;
    Hide = TRUE ;

    FixedText FI_HEADER
    {
        Pos = MAP_APPFONT ( 6 , 8 ) ;
        Size = MAP_APPFONT ( 248 , 8 ) ;
        Text [ en-US ] = "Personalize the mail merge documents";
    };
    FixedText  FI_EDIT
    {
        Pos = MAP_APPFONT ( 6 , 27 ) ;
        Size = MAP_APPFONT ( 248 , 38 ) ;
        WordBreak = TRUE;
        Text [ en-US ] = "You can personalize particular documents. Clicking '%1' will temporarily reduce the wizard to a small window so you can edit your document. After editing the document, return to the wizard by clicking 'Return to Mail Merge Wizard' in the small window.";
    };
    PushButton PB_EDIT
    {
        HelpID = "sw:PushButton:DLG_MM_MERGE_PAGE:PB_EDIT";
        Pos = MAP_APPFONT ( 70 , 67 ) ;
        Size = MAP_APPFONT ( 120 , 14 ) ;
        Text [ en-US ] = "~Edit individual document...";
    };
    FixedLine  FL_FIND
    {
        Pos = MAP_APPFONT ( 6 , 102 ) ;
        Size = MAP_APPFONT ( 248 , 8 ) ;
        Text [ en-US ] = "~Find";
    };
    FixedText  FT_FIND
    {
        Pos = MAP_APPFONT ( 16 ,116 ) ;
        Size = MAP_APPFONT ( 45 , 8 ) ;
        Text [ en-US ] = "~Search for:";
    };
    Edit       ED_FIND
    {
        HelpID = "sw:Edit:DLG_MM_MERGE_PAGE:ED_FIND";
        Pos = MAP_APPFONT ( 55 ,114 ) ;
        Size = MAP_APPFONT ( 140 , 12 ) ;
        Border = TRUE;
    };
    PushButton PB_FIND
    {
        HelpID = "sw:PushButton:DLG_MM_MERGE_PAGE:PB_FIND";
        Pos = MAP_APPFONT ( 198 ,113 ) ;
        Size = MAP_APPFONT ( 50 , 14 ) ;
        Text [ en-US ] = "~Find...";
    };
    CheckBox   CB_WHOLEWORDS
    {
        HelpID = "sw:CheckBox:DLG_MM_MERGE_PAGE:CB_WHOLEWORDS";
        Pos = MAP_APPFONT ( 55 , 131 ) ;
        Size = MAP_APPFONT ( 180 , 10 ) ;
        Text [ en-US ] = "Whole wor~ds only";
    };
    CheckBox   CB_BACKWARDS
    {
        HelpID = "sw:CheckBox:DLG_MM_MERGE_PAGE:CB_BACKWARDS";
        Pos = MAP_APPFONT ( 55 , 144 ) ;
        Size = MAP_APPFONT ( 180 , 10 ) ;
        Text [ en-US ] = "Back~wards";
    };
    CheckBox   CB_MATCHCASE
    {
        HelpID = "sw:CheckBox:DLG_MM_MERGE_PAGE:CB_MATCHCASE";
        Pos = MAP_APPFONT ( 55 , 157 ) ;
        Size = MAP_APPFONT ( 180 , 10 ) ;
        Text [ en-US ] = "Ma~tch case";
    };
};



