package mobi.monaca.framework.nativeui.container; import static mobi.monaca.framework.nativeui.UIUtil.dip2px; import java.util.List; import mobi.monaca.framework.nativeui.UIContext; import mobi.monaca.framework.nativeui.component.Component; import mobi.monaca.framework.nativeui.component.SearchBoxComponent; import mobi.monaca.framework.nativeui.component.ToolbarComponent; import android.annotation.TargetApi; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; /** * This class represents toolbar view on native ui framework. */ public class ToolbarContainerView extends LinearLayout { protected LinearLayout left, center, right, titleWrapper, titleSubtitleWrapper, titleImageWrapper; protected UIContext context; protected FrameLayout content; private TextView titleView; private TextView subTitleMainTitleView; private TextView subtitleView; boolean isTop = true; // private int mShadowHeight; private ImageView titleImageView; private int mDefaultSubtitleFontSize; private int mDefaultTitleFontSize; protected final static int TITLE_ID = 0; protected final static int SUBTITLE_ID = 1; private static final String TAG = ToolbarContainerView.class.getSimpleName(); private static int mContentViewId = 10000; protected View createBorderView() { View v = new FrameLayout(context); v.setBackgroundColor(0xff000000); return v; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); boolean canResizeWidth = widthSpecMode != MeasureSpec.EXACTLY; if (canResizeWidth) { prepareCenterLayoutWidth(); } } protected void prepareCenterLayoutWidth() { int leftComponentWidth = measureInnerWidth(left); int rightComponentWidth = measureInnerWidth(right); int padding = dip2px(context, 2); MarginLayoutParams p = (MarginLayoutParams) center.getLayoutParams(); p.setMargins(leftComponentWidth + padding, 0, rightComponentWidth + padding, 0); center.setLayoutParams(p); } protected int measureInnerWidth(LinearLayout layout) { int result = 0; for (int i = 0; i < layout.getChildCount(); i++) { result += layout.getChildAt(i).getMeasuredWidth(); } return result; } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public ToolbarContainerView(UIContext context, boolean isTop) { super(context); this.context = context; this.isTop = isTop; setOrientation(LinearLayout.VERTICAL); setFocusable(true); setFocusableInTouchMode(true); content = new FrameLayout(context); mContentViewId++; // if we have toolbar on both top and bottom -> prevent same view id this.setId(mContentViewId); int borderWidth = context.getSettings().disableUIContainerBorder ? 0 : 1; addView(createBorderView(), new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, borderWidth)); addView(content, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); addView(createBorderView(), new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, borderWidth)); left = new LinearLayout(context); left.setOrientation(LinearLayout.HORIZONTAL); left.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); center = new LinearLayout(context); center.setOrientation(LinearLayout.HORIZONTAL); center.setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL); right = new LinearLayout(context); right.setOrientation(LinearLayout.HORIZONTAL); right.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); titleView = new TextView(context); titleView.setId(TITLE_ID); titleView.setTextColor(0xffffffff); titleView.setShadowLayer(1.0f, 0f, -1f, 0xcc000000); titleView.setTypeface(null, Typeface.BOLD); mDefaultTitleFontSize = context.getFontSizeFromDip(Component.BIG_TITLE_TEXT_DIP); titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultTitleFontSize); titleImageView = new ImageView(context); titleWrapper = new LinearLayout(context); titleWrapper.setOrientation(LinearLayout.HORIZONTAL); titleWrapper.setVisibility(View.GONE); titleWrapper.setGravity(Gravity.CENTER); titleWrapper.addView(titleView); titleImageWrapper = new LinearLayout(context); titleImageWrapper.setOrientation(LinearLayout.HORIZONTAL); titleImageWrapper.setVisibility(View.GONE); titleImageWrapper.setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL); titleImageWrapper.addView(titleImageView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER)); subTitleMainTitleView = new TextView(context); subTitleMainTitleView.setId(TITLE_ID); subTitleMainTitleView.setTextColor(0xffffffff); subTitleMainTitleView.setShadowLayer(1.0f, 0f, -1f, 0xcc000000); subTitleMainTitleView.setTypeface(null, Typeface.BOLD); subTitleMainTitleView.setPadding(0, 0, 0, 0); mDefaultSubtitleFontSize = context.getFontSizeFromDip(Component.TITLE_TEXT_DIP); subTitleMainTitleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mDefaultSubtitleFontSize); subtitleView = new TextView(context); subtitleView.setId(SUBTITLE_ID); subtitleView.setTextColor(0xffffffff); subtitleView.setShadowLayer(1.0f, 0f, -1f, 0xcc000000); subtitleView.setPadding(0, 0, 0, 0); subtitleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getFontSizeFromDip(Component.SUBTITLE_TEXT_DIP)); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT, Gravity.CENTER | Gravity.CENTER_VERTICAL); titleSubtitleWrapper = new LinearLayout(context); titleSubtitleWrapper.setOrientation(LinearLayout.VERTICAL); titleSubtitleWrapper.setVisibility(View.GONE); titleSubtitleWrapper.setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL); titleSubtitleWrapper.addView(subtitleView, lp); titleSubtitleWrapper.addView(subTitleMainTitleView, lp); FrameLayout.LayoutParams p = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.CENTER | Gravity.CENTER_VERTICAL); content.addView(left, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT, Gravity.LEFT | Gravity.CENTER_VERTICAL)); content.addView(right, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT, Gravity.RIGHT | Gravity.CENTER_VERTICAL)); content.addView(center, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT, Gravity.CENTER)); center.setGravity(Gravity.CENTER); content.addView(titleImageWrapper, p); content.addView(titleWrapper, p); content.addView(titleSubtitleWrapper, p); } public View getContentView() { return content; } public void setTitleImage(Drawable drawable) { } public void setTitleSubtitle(String title, String subtitle, Bitmap titleImage) { // MyLog.v(TAG, "setTitleSubtitle: title:" + title + ", subtitle:" + subtitle); if (titleImage != null) { titleImageWrapper.setVisibility(View.VISIBLE); titleSubtitleWrapper.setVisibility(View.GONE); titleWrapper.setVisibility(View.GONE); center.setVisibility(View.GONE); } else if (subtitle.length() > 0) { titleSubtitleWrapper.setVisibility(View.VISIBLE); titleWrapper.setVisibility(View.GONE); center.setVisibility(View.GONE); titleImageWrapper.setVisibility(View.GONE); } else if (title.length() > 0) { titleWrapper.setVisibility(View.VISIBLE); center.setVisibility(View.GONE); titleSubtitleWrapper.setVisibility(View.GONE); titleImageWrapper.setVisibility(View.GONE); } else { titleWrapper.setVisibility(View.GONE); center.setVisibility(View.VISIBLE); titleSubtitleWrapper.setVisibility(View.GONE); titleImageWrapper.setVisibility(View.GONE); } ((TextView) titleWrapper.findViewById(TITLE_ID)).setText(title); ((TextView) titleSubtitleWrapper.findViewById(TITLE_ID)).setText(title); ((TextView) titleSubtitleWrapper.findViewById(SUBTITLE_ID)).setText(subtitle); if (titleImage != null) { titleImageView.setImageBitmap(titleImage); } } public void setRightView(List<ToolbarComponent> list) { right.removeAllViews(); for (Component component : list) { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; params.setMargins(dip2px(context, 4), 0, 0, 0); right.addView(component.getView(), params); } } public void setLeftView(List<ToolbarComponent> list) { left.removeAllViews(); for (Component component : list) { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; params.setMargins(0, 0, dip2px(context, 4), 0); left.addView(component.getView(), params); } } public void setCenterView(List<ToolbarComponent> list, boolean expandItemWidth) { // MyLog.v(TAG, "setCenterView, list:" + list + ", expandItemWidth:" + expandItemWidth); center.removeAllViews(); if (expandItemWidth) { for (Component component : list) { FrameLayout container = new FrameLayout(context); FrameLayout.LayoutParams containerLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT); containerLayoutParams.gravity = Gravity.CENTER | Gravity.CENTER_VERTICAL; container.addView(component.getView(), containerLayoutParams); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(dip2px(context, 2), 0, dip2px(context, 2), 0); params.weight = 1; center.addView(container, params); } content.removeView(left); content.removeView(right); // content.removeView(titleWrapper); // content.removeView(titleSubtitleWrapper); } else { for (Component component : list) { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(dip2px(context, 2), 0, dip2px(context, 2), 0); if (component instanceof SearchBoxComponent) { params.width = LinearLayout.LayoutParams.MATCH_PARENT; } center.addView(component.getView(), params); } } } public void setTitleColor(String colorString) { // make sure we start with # sign format if (!colorString.startsWith("#")) { colorString = "#" + colorString; } if (titleView != null) { titleView.setTextColor(Color.parseColor(colorString)); } if (subTitleMainTitleView != null) { subTitleMainTitleView.setTextColor(Color.parseColor(colorString)); } } public void setSubtitleColor(String colorString) { // make sure we start with # sign format if (!colorString.startsWith("#")) { colorString = "#" + colorString; } subtitleView.setTextColor(Color.parseColor(colorString)); } public void setTitleFontScale(String titleFontScale) { if (titleFontScale == "") return; float titleFontScaleFloat = Float.parseFloat(titleFontScale); if (titleView != null) { titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleFontScaleFloat * mDefaultTitleFontSize); } } public void setSubitleFontScale(String subtitleFontScale) { if (subtitleFontScale == "") return; float titleFontScaleFloat = Float.parseFloat(subtitleFontScale); if (subtitleView != null) { subtitleView.setTextSize(titleFontScaleFloat * mDefaultSubtitleFontSize); } } }