/*
* Copyright 2013 Elina Vartiainen and Simon Robinson
*
* This file is part of Com-Me.
*
* 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.
*/
package ac.robinson.mediaphonejavame.component;
import java.util.Vector;
import ac.robinson.mediaphonejavame.MediaPhoneMidlet;
import ac.robinson.mediaphonejavame.provider.Frame;
import ac.robinson.mediaphonejavame.provider.Narrative;
import ac.robinson.mediaphonejavame.util.UIUtilities;
import com.sun.lwuit.Container;
import com.sun.lwuit.geom.Rectangle;
import com.sun.lwuit.layouts.BoxLayout;
/**
* Visualises a a narrative as a list of FrameComponents. Also takes care of the navigating between narratives and
* frames within a narrative.
*/
public class NarrativeComponent extends Container {
private boolean mIsAddNarrativeButton = false;
private int mDragX = -1;
private boolean mDragged = false;
private static int mComponentWidth = 0;
private Narrative mNarrative = null;
private Vector mFrameComponents = new Vector();
private int mFocusedItem = 0;
public NarrativeComponent(Narrative narrative) {
mNarrative = narrative;
Vector frames = narrative.getFrames();
setLayout(new BoxLayout(BoxLayout.X_AXIS));
setFocusable(true);
setNextFocusLeft(this);
setNextFocusRight(this);
setScrollableX(true);
setScrollVisible(true);
for (int i = 0, n = frames.size(); i < n; i++) {
Frame frame = (Frame) frames.elementAt(i);
FrameComponent frameComponent = new FrameComponent();
frameComponent.setImage(frame.getImage());
frameComponent.setAudio(frame.getAudio());
frameComponent.setText(frame.getText());
addComponent(frameComponent);
mFrameComponents.addElement(frameComponent);
}
// the new narrative/frame button
FrameComponent frameComponent = new FrameComponent(true);
addComponent(frameComponent);
mFrameComponents.addElement(frameComponent);
if (frames.size() == 0) {
mIsAddNarrativeButton = true;
}
}
public void setNarrative(Narrative narrative) {
mNarrative = narrative;
}
public Narrative getNarrative() {
return mNarrative;
}
public void setAsAddNarrativeButton(boolean isAddNarrativeButton) {
mIsAddNarrativeButton = isAddNarrativeButton;
}
public boolean isAddNarrativeButton() {
return mIsAddNarrativeButton;
}
public void focusGained() {
super.focusGained();
mFocusedItem = 0;
if (!mFrameComponents.isEmpty()) {
((FrameComponent) mFrameComponents.elementAt(mFocusedItem)).setFocus(true);
getStyle().setBgTransparency(52); // colour doesn't work; 52 = approximately cccccc (HIGHLIGHT_COLOUR)
getStyle().setBgColor(0x000000);
}
}
public void focusLost() {
super.focusLost();
if (!mFrameComponents.isEmpty()) {
((FrameComponent) mFrameComponents.elementAt(mFocusedItem)).setFocus(false);
mFocusedItem = 0;
getStyle().setBgTransparency(0);
getStyle().setBgColor(0xffffff);
}
}
public void pointerPressed(int x, int y) {
int previousItem = mFocusedItem;
for (int i = 0, n = mFrameComponents.size(); i < n; i++) {
if (((FrameComponent) mFrameComponents.elementAt(i)).contains(x, y)) {
mFocusedItem = i;
}
}
if (previousItem != mFocusedItem) {
FrameComponent focused = ((FrameComponent) mFrameComponents.elementAt(previousItem));
focused.setFocus(false);
focused = ((FrameComponent) mFrameComponents.elementAt(mFocusedItem));
focused.setFocus(true);
}
mDragged = false;
mDragX = x;
}
public void pointerReleased(int x, int y) {
if (!mDragged) {
int newFocus = -1;
for (int i = 0, n = mFrameComponents.size(); i < n; i++) {
if (((FrameComponent) mFrameComponents.elementAt(i)).contains(x, y)) {
newFocus = i;
break;
}
}
if (mFocusedItem == newFocus) {
keyReleased(UIUtilities.SOFT_KEY_MIDDLE[0]);
}
}
}
public void pointerDragged(int x, int y) {
int scrollDistance = (mDragX - x);
if (scrollDistance == 0) {
return;
}
int xStart = getScrollX() + (scrollDistance > 0 ? getWidth() : scrollDistance);
if (mComponentWidth <= 0) {
// +4 as getWidth doesn't include borders TODO: find a function for border size
mComponentWidth = ((FrameComponent) mFrameComponents.elementAt(mFocusedItem)).getWidth() + 4;
}
int maxX = mComponentWidth * mFrameComponents.size();
if (xStart < 0) {
xStart = 0;
} else if (xStart + scrollDistance > maxX) {
xStart = maxX - scrollDistance;
}
scrollRectToVisible(new Rectangle(xStart, 0, scrollDistance, getHeight()), this);
mDragged = true;
mDragX = x;
}
public void keyReleased(int keyCode) {
// MediaPhone.log("Key pressed: " + keyCode); // for key numbers, see: http://www.iteye.com/topic/179073
FrameComponent focused = (FrameComponent) mFrameComponents.elementAt(mFocusedItem);
for (int i = 0; i < UIUtilities.SOFT_KEY_MIDDLE.length; i++) {
if (keyCode == UIUtilities.SOFT_KEY_MIDDLE[i]) {
if (mIsAddNarrativeButton) {
MediaPhoneMidlet.getInstance().showFrameEditorForm(null);
} else if (focused.isAddFrameButton()) {
MediaPhoneMidlet.getInstance().showFrameEditorForm(mNarrative);
} else {
MediaPhoneMidlet.getInstance().showFrameEditorForm(mNarrative, mFocusedItem);
}
return;
}
}
focused.setFocus(false);
boolean rightKey = false;
for (int i = 0; i < UIUtilities.SOFT_KEY_RIGHT.length; i++) {
if (keyCode == UIUtilities.SOFT_KEY_RIGHT[i]) {
mFocusedItem = mFocusedItem + 1 >= mFrameComponents.size() ? 0 : mFocusedItem + 1;
rightKey = true;
break;
}
}
if (!rightKey) {
for (int i = 0; i < UIUtilities.SOFT_KEY_LEFT.length; i++) {
if (keyCode == UIUtilities.SOFT_KEY_LEFT[i]) {
mFocusedItem = mFocusedItem - 1 < 0 ? mFrameComponents.size() - 1 : mFocusedItem - 1;
break;
}
}
}
focused = (FrameComponent) mFrameComponents.elementAt(mFocusedItem);
focused.setFocus(true);
scrollComponentToVisible(focused);
repaint();
}
}