|
|
|
This guide explains the UIQ Control Date Editor (CQikDateEditor). The Date editor is used for viewing a specific date. The control can also be used together with the Calendar pop-out control for changing the date in the Date Editor. If the Date Editor is used without the Calendar pop-out, it can only be used by the user to view a date, not change it.
The Date Editor has fields for day, month, year, and two separator characters.
The order of the fields and the style of the separator characters are automatically set to the format specified by the current locale.
The upper and lower date bounds for the editor are set during initialization. Values outside these bounds are invalid, and a warning is given when an attempt is made to enter such values. A flag can be used during initialization to suppress the capability to launch the pop-out calendar.
The following functionality can be used:
Set an earliest date allowed,
Set a latest date allowed,
Set an initial date,
Set whether the Date Editor uses a Calendar pop-out or not,
Change the font used in the Date Editor,
Toggle between dimmed state and normal state,
Change border properties.
By default, the following configuration applies:
The font in the Date Editor is set to the standard legend font for the system,
The control is not dimmed,
The default system border is used.
See the API documentation for Date Editor CQikDateEditor.
The Date Editor control is related to the Time Editor, Duration Editor, and Time and Date Editor controls. See the How To guides for Time Editor and Duration Editor.
Date Editor can be used by Calendar and Gregorian Calendar controls. See the How To guides for Calendar and Gregorian Calendar.
See even the API documentation for Time Editor (CQikTimeEditor), Duration Editor (CQikDurationEditor), Time and Date Editor (CQikTimeAndDateEditor), Calendar (CEikCalendar) and Gregorian Calendar (CQikGregorianCalendar).
The format that is displayed in Date Editor is dependent on the locale settings. For more information about locale settings see Locale Settings in the Symbian OS guide.
This section explains how the control is constructed, used and destroyed. Source code examples are used and explained to illustrate how the control is used.
Use the following #include directive:
#include <QikDateEditor.h>
Use the following LIBRARY directive in the project's mmp-file:
LIBRARY qikctl.lib
Use the following control identifier when specifying the control in resource data files. It is used by the framework when constructing the control from resource data:
EQikCtDateEditor
Resource files can be used to construct the control. The resource
to use is defined by the structure QIK_DATE_EDITOR, defined in Qikon.rh.
The minDate and maxDate elements are of the type DATE,
defined in Eikon.rh.
The structures look like this:
STRUCT QIK_DATE_EDITOR
{
STRUCT minDate; // DATE
STRUCT maxDate; // DATE
BYTE flags=0; // Permitted flags: EQikTimeWithoutPopout
}
STRUCT DATE
{
BYTE day=0; // from 0 to 27/28/29/30 inclusive
BYTE month=0; // from 0 to 11 inclusive
WORD year;
}
The values given in the structure definitions are default values. The structure QIK_DATE_EDITOR contains the following:
minDate - a structure of type DATE,
maxDate - a structure of type DATE,
flags - this element is assembled by performing a bitwise OR with the flags listed below. Available flags are defined in Qikon.hrh.
The structure DATE contains the following:
day identifies the day in the month, from 0 to 27/28/29/30 inclusive.
This series begins with zero, so the corresponding dates are 1st to 28th/29th/30th/31st.
month identifies the month, from 0 to 11 inclusive. This series begins with zero, so the corresponding numbers of the months are 1 to 12, that is, January to December.
year identifies the year.
Date Editor has no own flags of its own, but the flags in the base class Time Editor (CQikTTimeEditor) can be used:
|
Use the Control Factory Identifier EQikCtDateEditor in the resource structures
QIK_CONTROL, in element type,
and DLG_LINE, also in element type.
This section discusses four different ways of constructing controls. The first three ways describe how to construct and add a control to the view of an application. The view framework is used in all three cases but in three different ways. The fourth way describes how to construct and launch a dialog from an application. The dialog framework constructs the control and adds it to the dialog.
A common way to construct controls is to specify them in the resource files and let the framework construct them from there. Specifying the controls in resource files is the preferred way of constructing controls since it allows for easier modifications compared to creating them entirely from source code.
This section covers different ways of constructing the control.
The example below describes how to construct the control using the view framework.
The reason the example seems to be rather complex is because it demonstrates how to construct a complete view containing a Scrollable Container and a Layout Manager. It also encapsulates the control in a Building Block. The view supports both pen and softkey styles; support of both styles in a view is optional.
1) Declare an enumeration for the controls to be used in the view in a *.hrh file. Hrh files are files to be included both in resource files (*.rss) and C++ files.
/* Declare the IDs of the controls in a *.hrh file for use both in resource and cpp */
enum TMyViewControls
{
EMyViewScrollableContainer,
EMyViewBuildingBlock,
EMyViewDateEditor,
EMyViewNumberOfControls
};
2) Declare the controls used in the view in your resource (*.rss) file:
/* Declare the set of controls used in the view */
RESOURCE QIK_CONTROL_COLLECTION r_my_date_editor_view_controls
{
items =
{
QIK_CONTROL
{
unique_handle = EMyViewScrollableContainer;
type = EQikCtScrollableContainer;
control = r_my_date_editor_scroll_pane;
},
QIK_CONTROL
{
unique_handle = EMyViewDateEditor;
type = EQikCtDateEditor;
control = r_my_date_editor;
},
QIK_CONTROL
{
unique_handle = EMyViewBuildingBlock;
type = EQikCtCaptionedTwolineBuildingBlock;
control = r_my_date_editor_building_block;
}
};
}
3) Define the view and its contents in your resource file:
/* The view */
RESOURCE QIK_VIEW r_my_date_editor_view
{
pages = r_my_date_editor_viewpages;
}
/* The view page */
RESOURCE QIK_VIEW_PAGES r_my_date_editor_viewpages
{
pages =
{
QIK_VIEW_PAGE
{
container_unique_handle = EMyViewScrollableContainer;
page_content = r_my_date_editor_view_container_details;
}
};
}
4) Define the resource for the Scrollable Container used in the view:
/* The scrollable container used in the view */
RESOURCE QIK_SCROLLABLE_CONTAINER r_my_date_editor_scroll_pane
{
}
5) Declare the contents and properties for the Scrollable Container used in the view:
/* Contents of the Scrollable Container used in the view */
RESOURCE QIK_SCROLLABLE_CONTAINER_SETTINGS r_my_date_editor_view_container_details
{
controls =
{
QIK_CONTAINER_ITEM
{
unique_handle = EMyViewBuildingBlock;
}
};
}
6) Define the control resource structure used in the view:
/* The control used in the view */
RESOURCE QIK_DATE_EDITOR r_my_date_editor
{
minDate =
{
DATE
{
day = 0;
month = 0;
year = 2004;
}
};
maxDate =
{
DATE
{
day = 30;
month = 11;
year = 2010;
}
};
flags = 0; // can be left out, 0 is default.
}
7) Define the settings for the Building Block containing the control:
/* Settings for the EQikCtCaptionedTwolineBuildingBlock containing the control */
RESOURCE QIK_SYSTEM_BUILDING_BLOCK r_my_date_editor_building_block
{
content =
{
QIK_SLOT_CONTENT
{
slot_id = EQikItemSlot1;
caption = "Choose:";
},
QIK_SLOT_CONTENT
{
slot_id = EQikItemSlot2;
unique_handle = EMyViewDateEditor;
}
};
}
8) The configurations of the view:
RESOURCE QIK_VIEW_CONFIGURATIONS r_my_date_editor_ui_configurations
{
configurations=
{
QIK_VIEW_CONFIGURATION
{
ui_config_mode = KQikSoftkeyStylePortrait;
view = r_my_date_editor_view;
command_list = r_my_date_editor_commands;
},
QIK_VIEW_CONFIGURATION
{
ui_config_mode = KQikPenStyleTouchPortrait;
view = r_my_date_editor_view;
command_list = r_my_date_editor_commands;
}
};
}
9) The command list for the view:
RESOURCE QIK_COMMAND_LIST r_my_date_editor_commands
{
items =
{
// This command shall only be visible in debug mode because it is only
// used to find memory leaks during development of the application.
QIK_COMMAND
{
id = EEikCmdExit;
type = EQikCommandTypeScreen;
// Indicate that this command will only be visible in debug
stateFlags = EQikCmdFlagDebugOnly;
text = "Close (debug)";
}
};
}
10) The view framework constructs the view described in this example with this code:
void CMySinglePageView::ViewConstructL()
{
ViewConstructFromResourceL(R_MY_DATE_EDITOR_UI_CONFIGURATIONS, R_MY_DATE_EDITOR_VIEW_CONTROLS);
}
11) The result should look something like this:
The example below describes how to construct a Date Editor from resource with your own C++ code.
The reason the example seems to be rather complex is because it demonstrates how to construct a complete view containing a Scrollable Container and a Layout Manager. It also encapsulates the Date Editor in a Building Block.
This example uses the resource structures from the previous example. The following code creates the Date Editor:
#include <QikDateEditor.h>
#include <QikRowLayoutManager.h>
#include <QikGridLayoutManager.h>
#include <QikBuildingBlock.h>
void CMySinglePageView::ViewConstructL()
{
// Give a layout manager to the view
CQikGridLayoutManager* gl = CQikGridLayoutManager::NewLC();
SetLayoutManagerL(gl);
CleanupStack::Pop(gl);
// Create a container and give it to the view
ControlProvider()->ControlInfos().AddFromResourceL(R_MY_DATE_EDITOR_VIEW_CONTROLS);
CQikContainerBase* container = static_cast<CQikContainerBase*>(ControlProvider()->ControlConstructIfNeededL(EMyViewScrollableContainer, *this));
ASSERT(container);
Controls().AppendLC(container);
CleanupStack::Pop(container);
// Create a layout manager to be used inside the container
CQikRowLayoutManager* rowlayout = CQikRowLayoutManager::NewLC();
container->SetLayoutManagerL(rowlayout);
CleanupStack::Pop(rowlayout);
// Create the building block (containing a Date Editor) and
// add it to the container
CQikBuildingBlock* block = CQikBuildingBlock::CreateSystemBuildingBlockL(EQikCtCaptionedTwolineBuildingBlock);
container->AddControlLC(block, EMyViewBuildingBlock);
TResourceReader blockReader;
iCoeEnv->CreateResourceReaderLC(blockReader, R_MY_DATE_EDITOR_BUILDING_BLOCK);
block->ConstructFromResourceL(blockReader, *ControlProvider());
CleanupStack::PopAndDestroy(); //blockReader
CleanupStack::Pop(block);
}
What the code does
1) Initializes the Command Manager with an empty Command List. The controls placed in the view add their commands to the Command List when they receive focus.
2) Creates a Layout Manager for the view. The Grid Layout Manager fills the view with its only control in this example, the Scrollable Container.
3) Loads the control collection
R_MY_VIEW_CONTROLS into the Control Provider. Then the Control Provider is
asked to create the Scrollable Container.
4) Uses the MopGetObjectNoChaining function
to determine whether the control that was created really is a class of the type
CQikContainerBase before it is added to the view.
5) Creates a Layout Manager to control the layout inside the container. Adds the Layout Manager to the container.
6) Constructs the Building Block containing the Date Editor from the resource R_MY_BUILDING_BLOCK. Adds the Building Block to the container.
The Date Editor can also be created without a Building Block. In that case, replace the last section in the code above, from the "Create building block..." comment, with the following code.
Since a pointer to the control is declared here,
QikDateEditor.h needs to be included in the cpp-file and qikctl.lib in the mmp-file.
// Create the control and put in the container
TResourceReader reader;
iEikonEnv->CreateResourceReaderLC(reader, R_MY_DATE_EDITOR);
CQikDateEditor* dateEditor = new (ELeave) CQikDateEditor();
container->AddControlLC(dateEditor, EMyViewDateEditor);
dateEditor->ConstructFromResourceL(reader);
dateEditor->SetObserver(this);
dateEditor->SetUniqueHandle(EMyViewDateEditor);
CleanupStack::Pop(dateEditor);
CleanupStack::PopAndDestroy(); //reader
Use AddControlLC to add controls to a Scrollable Container.
Add the controls as soon as they are created. Do not push them onto the
Cleanup Stack before they are added. Do not pop them from the Cleanup Stack
until they are fully constructed. A TCleanupItem created in AddControlLC will make sure that
the control is both cleaned up and removed from the Components Array if a leave
occurs before the control is fully constructed.
The example below describes how to construct a Date Editor solely from C++ code.
The reason the example seems to be rather complex is because it demonstrates how to construct a complete view containing a Scrollable Container and a Layout Manager.
The following source code constructs a Date Editor:
#include <QikDateEditor.h>
#include <QikScrollableContainer.h>
#include <QikRowLayoutManager.h>
#include <QikGridLayoutManager.h>
#include <QikBuildingBlock.h>
void CMySinglePageView::ViewConstructL()
{
// Give a Layout Manager to the view
CQikGridLayoutManager* gridlayout = CQikGridLayoutManager::NewLC();
SetLayoutManagerL(gridlayout);
CleanupStack::Pop(gridlayout);
// Create a container and add it to the view
CQikScrollableContainer* container = new (ELeave) CQikScrollableContainer();
Controls().AppendLC(container);
container->ConstructL(EFalse);
CleanupStack::Pop(container);
// Create a Layout Manager to be used inside the container
CQikRowLayoutManager* rowlayout = CQikRowLayoutManager::NewLC();
container->SetLayoutManagerL(rowlayout);
CleanupStack::Pop(rowlayout);
// Create the control and add it to the container
CQikDateEditor* dateEditor = new (ELeave) CQikDateEditor();
container->AddControlLC(dateEditor, EMyViewDateEditor);
// Create and initiate your own time variables.
TTime minTime = TTime(TDateTime(2000, EJanuary, 0, 0, 0, 0, 0));
TTime maxTime = TTime(TDateTime(2010, EDecember, 30, 0, 0, 0, 0));
TTime nowTime = TTime(TDateTime(2005, EFebruary, 11, 9, 45, 0, 0));
// Do second phase construction
dateEditor->ConstructL(minTime, maxTime, nowTime, 0 /* flags*/);
dateEditor->SetObserver(this);
dateEditor->SetUniqueHandle(EMyViewDateEditor);
CleanupStack::Pop(dateEditor);
}
What the code does
1) Initializes the Command Manager with an empty Command List. The controls placed in the view add their commands to the Command List when they receive focus.
2) Creates a Layout Manager for the view. The Grid Layout Manager fills the view with its only control in this example, the Scrollable Container.
3) Instantiates a container and adds it to the view.
4) Creates a Layout Manager and adds it to the container.
5) Creates the Date Editor control from C++ code. Sets the view, this, to be an observer
of the Date Editor. The view's base class, CQikViewBase, handles focus changes in its
method HandleControlEventL. For more details see the section on below how to be notified with Control Events.
6) The result should look something like this:
The Date Editor can be constructed from resource files in dialogs as well. To construct a dialog from resource, a valid resource definition of the dialog must be in one of the project's resource files.
An example of a dialog resource containing the control is given below.
For more information about the dialog class and its resource structure see CEikDialog
and DIALOG in the API documentation.
1) Declare a dialog resource containing the Date Editor:
RESOURCE DIALOG r_my_date_editor_dialog
{
title = "Test of control in dialog";
flags = EEikDialogFlagWait;
items=
{
DLG_LINE
{
prompt = "Date Editor:";
itemflags = EQikDlgItemCtlIsEditInPlace;
type = EQikCtDateEditor;
control = QIK_DATE_EDITOR
{
minDate = DATE // Set to 15/04/1970.
{
day = 14; // Note this refers to the 15th day of the specified Month.
month = 3; // Note this refers to April.
year = 1970;
};
maxDate = DATE // Set to 31/12/2100.
{
day = 30; // Note this refers to the 31st day of the specified Month.
month = 11; // Note this refers to December.
year = 2100;
};
flags = 0;
};
}
};
}
The resource properties inside the Control Block are the same as the ones described in the previous section.
2) Launch the dialog using the following source code. The dialog resource ID is passed as an argument:
CEikDialog* dlg = new (ELeave) CEikDialog();
dlg->ExecuteLD(R_MY_DATE_EDITOR_DIALOG);
The function returns immediately if EEikDialogFlagWait has not
been specified in the dialog resource. If EEikDialogFlagWait is specified,
it returns when the dialog exits. The dialog framework will, in both situations, delete the
dialog appropriately as indicated by the D suffix of the ExcecuteLD function name.
3) The result should look something like this:
This section covers the most common functions used for interacting with the control.
When constructing the control with resource data, no reference to the control is available in the view class.
When constructing the control with code, the preferred way might be to not save a reference to the control.
In both these cases, the LocateControlByUniqueHandle function
is used to get a pointer to the control by supplying the control's unique handle. When constructing the view and the control
from code, you must explicitly set this unique handle by calling the method SetUniqueHandle.
See the code examples below.
Note that the function will return NULL if the control could not be
found. Always check the pointer before using it!
// Set the unique handle
dateEditor->SetUniqueHandle(EMyViewDateEditor);
// Get a pointer to the control
CQikDateEditor* dateEditor = LocateControlByUniqueHandle<CQikDateEditor>(EMyViewDateEditor);
In order to be notified when the control changes state you
must add an observer to the control. An observer is an object of the type
MCoeControlObserver. The observer will then receive a function call to its function
HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType) when the control changes state.
The view base class, CQikViewBase, implements the
MCoeControlObserver. The HandleControlEventL function must be overloaded in the
view class because the view inherits from CQikViewBase.
The following source code example shows how to add an object as an observer and how to receive events from the control:
void CMySinglePageView::ViewConstructL()
{
// Construction code
…
// Adding this object as an observer
dateEditor->SetObserver(this);
}
void CMySinglePageView::HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType)
{
// Call base class to handle focus management
CQikViewBase::HandleControlEventL(aControl, aEventType);
CQikDateEditor* dateEditor = LocateControlByUniqueHandle<CQikDateEditor>(EMyViewDateEditor);
if(aControl == dateEditor)
{
switch(aEventType)
{
case EEventStateChanged:
// The internal state of the Date Editor was changed,
// for example, due to another item being selected.
break;
case EEventRequestExit:
break;
case EEventRequestCancel:
break;
case EEventRequestFocus:
// The Date Editor received a pointer down event
break;
case EEventPrepareFocusTransition:
// A focus change is about to appear
break;
case EEventInteractionRefused:
// The Date Editor is dimmed and received a
// pointer down event.
break;
default:
break;
}
}
}
The reason for calling the base class’s HandleControlEventL function is
that the view base class, CQikViewBase, handles focus management between controls in the view.
If the control's observer is not a class which derives from CQikViewBase, focus management must be resolved by the observer itself. If a control requests
focus and does not get it from the observer, it will generate a panic in some cases if the observer does not leave.
For more details on the TCoeEvent
type, see class MCoeControlObserver in the API documentation.
Set the date in the control by using following code:
TTime time = TTime(TDateTime(2000, EJanuary, 0, 0, 0, 0, 0));
dateEditor->SetTimeL(time);
Get the edited date in the control by using following code:
TTime time = dateEditor->Time();
Set the minimum and maximum dates allowed in the control by using following code:
TTime maxtime = TTime(TDateTime(2100, EDecember, 30, 0, 0, 0, 0));
TTime mintime = TTime(TDateTime(2000, EJanuary, 0, 0, 0, 0, 0));
dateEditor->SetMinimumAndMaximum(mintime, maxtime);
Get the minimum and maximum dates allowed in the control by using following code::
TTime maxtime;
TTime mintime;
dateEditor->GetMinimumAndMaximum(mintime, maxtime);
Subclassing Date Editor is not recommended.