/*
* PaneManagerDemo.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* Licensed 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.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings. However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies. For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/
package com.rim.samples.device.ui.panemanagerdemo;
import net.rim.device.api.command.Command;
import net.rim.device.api.command.CommandHandler;
import net.rim.device.api.command.ReadOnlyCommandMetadata;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.pane.HorizontalScrollableController;
import net.rim.device.api.ui.component.pane.HorizontalScrollableTitleView;
import net.rim.device.api.ui.component.pane.HorizontalTabController;
import net.rim.device.api.ui.component.pane.HorizontalTabTitleView;
import net.rim.device.api.ui.component.pane.Pane;
import net.rim.device.api.ui.component.pane.PaneManagerController;
import net.rim.device.api.ui.component.pane.PaneManagerModel;
import net.rim.device.api.ui.component.pane.PaneManagerView;
import net.rim.device.api.ui.component.pane.PaneView;
import net.rim.device.api.ui.component.pane.TitleView;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.BorderFactory;
import net.rim.device.api.util.StringProvider;
/**
* The PaneManager API allows you to add UI components to your application which
* are displayed separately in multiple views, selectable by tabs on the top of
* the screen. There are two display styles available, scrolling headings and
* distinct tabs.
*/
public class PaneManagerDemo extends UiApplication {
/**
* Entry point for the application
*
* @param args
* Command line arguments (not used)
*/
public static void main(final String[] args) {
final UiApplication app = new PaneManagerDemo();
app.enterEventDispatcher();
}
/**
* Creates a new PaneManagerDemo object
*/
public PaneManagerDemo() {
pushScreen(new PaneManagerDemoScreen());
}
/**
* Main screen for the application. Displays three panes switchable via
* horizontal scroll field or tabs, depending on user selection.
*/
private final static class PaneManagerDemoScreen extends MainScreen {
/**
* Creates a new PaneManagerDemoScreen object
*/
public PaneManagerDemoScreen() {
super(Field.FOCUSABLE);
// Instantiate the model for the pane manager and enable looping
final PaneManagerModel model = new PaneManagerModel();
model.enableLooping(true);
// Create a pane
VerticalFieldManager vfm = new VerticalFieldManager();
vfm.add(new LabelField("Data 1"));
final XYEdges edgesOne = new XYEdges(1, 1, 1, 1);
vfm.setBorder(BorderFactory.createRoundedBorder(edgesOne));
final Pane pane =
new Pane(new LabelField("Pane 1", Field.FOCUSABLE
| Field.FIELD_HCENTER), vfm);
// Add the pane to the model
model.addPane(pane);
// Create a second pane
vfm = new VerticalFieldManager();
for (int i = 0; i < 30; i++) {
vfm.add(new LabelField("Data " + i, Field.FOCUSABLE));
}
final LabelField iconTextLabelField =
new LabelField("Pane 2", Field.FOCUSABLE
| Field.FIELD_HCENTER);
model.addPane(new Pane(iconTextLabelField, vfm));
// Create a third pane
vfm = new VerticalFieldManager();
final ButtonField button =
new ButtonField("Button", ButtonField.CONSUME_CLICK
| ButtonField.NEVER_DIRTY);
button.setChangeListener(new FieldChangeListener() {
public void fieldChanged(final Field field, final int context) {
Dialog.inform("Button activated.");
}
});
vfm.add(button);
model.addPane(new Pane(new LabelField("Pane 3", Field.FOCUSABLE
| Field.FIELD_HCENTER), vfm));
// Choose which pane the model is displaying
model.setCurrentlySelectedIndex(1);
// Create the header and initialize the model and visual properties
TitleView header;
PaneManagerController controller;
header = new HorizontalScrollableTitleView(Field.FOCUSABLE);
((HorizontalScrollableTitleView) header).enableArrows(true);
controller = new HorizontalScrollableController();
header.setModel(model);
final XYEdges edgesFour = new XYEdges(4, 4, 4, 4);
header.setBorder(BorderFactory.createRoundedBorder(edgesFour));
// Set arrow images
final Bitmap leftArrow = Bitmap.getBitmapResource("leftArrow.png");
final Bitmap rightArrow =
Bitmap.getBitmapResource("rightArrow.png");
if (leftArrow != null) {
header.setLeftArrow(leftArrow);
}
if (rightArrow != null) {
header.setRightArrow(rightArrow);
}
// Create the PaneView object, which will display the panes and is
// controlled by the model.
final PaneView paneView = new PaneView(Field.FOCUSABLE);
paneView.setBorder(BorderFactory.createSimpleBorder(edgesOne));
paneView.setModel(model);
// Initialize the PaneManagerView
final PaneManagerView paneManagerView =
new PaneManagerView(Field.FOCUSABLE, header, paneView);
paneManagerView.setModel(model);
paneManagerView.setBorder(BorderFactory
.createRoundedBorder(edgesFour));
model.setView(paneManagerView);
// Initialize the Controller
controller.setModel(model);
controller.setView(paneManagerView);
model.setController(controller);
paneManagerView.setController(controller);
add(paneManagerView);
final MenuItem myItem =
new MenuItem(new StringProvider("Switch View"), 0x230010, 0);
myItem.setCommand(new Command(new SwitchViewCommandHandler(
paneManagerView, leftArrow, rightArrow, edgesFour)));
addMenuItem(myItem);
}
}
/**
* A CommandHandler that toggles the view mode
*/
private final static class SwitchViewCommandHandler extends CommandHandler {
private final PaneManagerView _paneManagerView;
private final Bitmap _leftArrow;
private final Bitmap _rightArrow;
private final XYEdges _edgesFour;
/**
* Create a SwitchViewCommandHandler object
*
* @param paneManagerView
* The PaneManagerView
* @param leftArrow
* The left arrow for the scroll view
* @param rightArrow
* The right arrow for the scroll view
* @param edgesFour
* XYEdges object representing the thickness of the border in
* pixels
*/
public SwitchViewCommandHandler(final PaneManagerView paneManagerView,
final Bitmap leftArrow, final Bitmap rightArrow,
final XYEdges edgesFour) {
_paneManagerView = paneManagerView;
_leftArrow = leftArrow;
_rightArrow = rightArrow;
_edgesFour = edgesFour;
}
/**
* @see CommandHandler#execute(ReadOnlyCommandMetadata, Object)
*/
public void execute(final ReadOnlyCommandMetadata metadata,
final Object context) {
// Check to be sure everything is instantiated
if (_paneManagerView == null) {
return;
}
final PaneManagerModel model = _paneManagerView.getModel();
TitleView header = _paneManagerView.getTitle();
if (header == null || model == null) {
return;
}
PaneManagerController controller = null;
// Switch the header style based on current style
if (header instanceof HorizontalScrollableTitleView) {
header = new HorizontalTabTitleView(Field.FOCUSABLE);
((HorizontalTabTitleView) header)
.setNumberOfDisplayedTabs(model.numberOfPanes());
controller = new HorizontalTabController();
} else if (header instanceof HorizontalTabTitleView) {
header = new HorizontalScrollableTitleView(Field.FOCUSABLE);
((HorizontalScrollableTitleView) header).enableArrows(true);
controller = new HorizontalScrollableController();
if (_leftArrow != null) {
header.setLeftArrow(_leftArrow);
}
if (_rightArrow != null) {
header.setRightArrow(_rightArrow);
}
}
// Set up references between objects
header.setModel(model);
header.setBorder(BorderFactory.createRoundedBorder(_edgesFour));
if (controller != null) {
_paneManagerView.setController(controller);
model.setController(controller);
controller.setView(_paneManagerView);
controller.setModel(model);
}
_paneManagerView.setTitle(header);
}
}
}