X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/db0f0001f905e4140934225ea55f9b24a3041804..dc8c32fb3f7033d6fdfa7e1b64eaa77884da678a:/src/eu/alefzero/owncloud/ui/QuickAction.java
diff --git a/src/eu/alefzero/owncloud/ui/QuickAction.java b/src/eu/alefzero/owncloud/ui/QuickAction.java
new file mode 100644
index 00000000..6f61253b
--- /dev/null
+++ b/src/eu/alefzero/owncloud/ui/QuickAction.java
@@ -0,0 +1,289 @@
+/* ownCloud Android client application
+ * Copyright (C) 2011 Bartek Przybylski
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+package eu.alefzero.owncloud.ui;
+
+import android.content.Context;
+
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+
+import eu.alefzero.owncloud.R;
+import eu.alefzero.owncloud.R.id;
+import eu.alefzero.owncloud.R.layout;
+import eu.alefzero.owncloud.R.style;
+
+/**
+ * Popup window, shows action list as icon and text like the one in Gallery3D app.
+ *
+ * @author Lorensius. W. T
+ */
+public class QuickAction extends CustomPopup {
+ private final View root;
+ private final ImageView mArrowUp;
+ private final ImageView mArrowDown;
+ private final LayoutInflater inflater;
+ private final Context context;
+
+ protected static final int ANIM_GROW_FROM_LEFT = 1;
+ protected static final int ANIM_GROW_FROM_RIGHT = 2;
+ protected static final int ANIM_GROW_FROM_CENTER = 3;
+ protected static final int ANIM_REFLECT = 4;
+ protected static final int ANIM_AUTO = 5;
+
+ private int animStyle;
+ private ViewGroup mTrack;
+ private ScrollView scroller;
+ private ArrayList actionList;
+
+ /**
+ * Constructor
+ *
+ * @param anchor {@link View} on where the popup window should be displayed
+ */
+ public QuickAction(View anchor) {
+ super(anchor);
+
+ actionList = new ArrayList();
+ context = anchor.getContext();
+ inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ root = (ViewGroup) inflater.inflate(R.layout.popup, null);
+
+ mArrowDown = (ImageView) root.findViewById(R.id.arrow_down);
+ mArrowUp = (ImageView) root.findViewById(R.id.arrow_up);
+
+ setContentView(root);
+
+ mTrack = (ViewGroup) root.findViewById(R.id.tracks);
+ scroller = (ScrollView) root.findViewById(R.id.scroller);
+ animStyle = ANIM_AUTO;
+ }
+
+ /**
+ * Set animation style
+ *
+ * @param animStyle animation style, default is set to ANIM_AUTO
+ */
+ public void setAnimStyle(int animStyle) {
+ this.animStyle = animStyle;
+ }
+
+ /**
+ * Add action item
+ *
+ * @param action {@link ActionItem} object
+ */
+ public void addActionItem(ActionItem action) {
+ actionList.add(action);
+ }
+
+ /**
+ * Show popup window. Popup is automatically positioned, on top or bottom of anchor view.
+ *
+ */
+ public void show () {
+ preShow();
+
+ int xPos, yPos;
+
+ int[] location = new int[2];
+
+ mAnchor.getLocationOnScreen(location);
+
+ Rect anchorRect = new Rect(location[0], location[1], location[0] + mAnchor.getWidth(), location[1]
+ + mAnchor.getHeight());
+
+ createActionList();
+
+ root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+ root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+ int rootHeight = root.getMeasuredHeight();
+ int rootWidth = root.getMeasuredWidth();
+
+ int screenWidth = mWManager.getDefaultDisplay().getWidth();
+ int screenHeight = mWManager.getDefaultDisplay().getHeight();
+
+ //automatically get X coord of popup (top left)
+ if ((anchorRect.left + rootWidth) > screenWidth) {
+ xPos = anchorRect.left - (rootWidth-mAnchor.getWidth());
+ } else {
+ if (mAnchor.getWidth() > rootWidth) {
+ xPos = anchorRect.centerX() - (rootWidth/2);
+ } else {
+ xPos = anchorRect.left;
+ }
+ }
+
+ int dyTop = anchorRect.top;
+ int dyBottom = screenHeight - anchorRect.bottom;
+
+ boolean onTop = (dyTop > dyBottom) ? true : false;
+
+ if (onTop) {
+ if (rootHeight > dyTop) {
+ yPos = 15;
+ LayoutParams l = scroller.getLayoutParams();
+ l.height = dyTop - mAnchor.getHeight();
+ } else {
+ yPos = anchorRect.top - rootHeight;
+ }
+ } else {
+ yPos = anchorRect.bottom;
+
+ if (rootHeight > dyBottom) {
+ LayoutParams l = scroller.getLayoutParams();
+ l.height = dyBottom;
+ }
+ }
+
+ showArrow(((onTop) ? R.id.arrow_down : R.id.arrow_up), anchorRect.centerX()-xPos);
+
+ setAnimationStyle(screenWidth, anchorRect.centerX(), onTop);
+
+ mWindow.showAtLocation(mAnchor, Gravity.NO_GRAVITY, xPos, yPos);
+ }
+
+ /**
+ * Set animation style
+ *
+ * @param screenWidth screen width
+ * @param requestedX distance from left edge
+ * @param onTop flag to indicate where the popup should be displayed. Set TRUE if displayed on top of anchor view
+ * and vice versa
+ */
+ private void setAnimationStyle(int screenWidth, int requestedX, boolean onTop) {
+ int arrowPos = requestedX - mArrowUp.getMeasuredWidth()/2;
+
+ switch (animStyle) {
+ case ANIM_GROW_FROM_LEFT:
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);
+ break;
+
+ case ANIM_GROW_FROM_RIGHT:
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);
+ break;
+
+ case ANIM_GROW_FROM_CENTER:
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);
+ break;
+
+ case ANIM_REFLECT:
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Reflect : R.style.Animations_PopDownMenu_Reflect);
+ break;
+
+ case ANIM_AUTO:
+ if (arrowPos <= screenWidth/4) {
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Left : R.style.Animations_PopDownMenu_Left);
+ } else if (arrowPos > screenWidth/4 && arrowPos < 3 * (screenWidth/4)) {
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Center : R.style.Animations_PopDownMenu_Center);
+ } else {
+ mWindow.setAnimationStyle((onTop) ? R.style.Animations_PopUpMenu_Right : R.style.Animations_PopDownMenu_Right);
+ }
+
+ break;
+ }
+ }
+
+ /**
+ * Create action list
+ */
+ private void createActionList() {
+ View view;
+ String title;
+ Drawable icon;
+ OnClickListener listener;
+
+ for (int i = 0; i < actionList.size(); i++) {
+ title = actionList.get(i).getTitle();
+ icon = actionList.get(i).getIcon();
+ listener = actionList.get(i).getOnClickListerner();
+
+ view = getActionItem(title, icon, listener);
+
+ view.setFocusable(true);
+ view.setClickable(true);
+
+ mTrack.addView(view);
+ }
+ }
+
+ /**
+ * Get action item {@link View}
+ *
+ * @param title action item title
+ * @param icon {@link Drawable} action item icon
+ * @param listener {@link View.OnClickListener} action item listener
+ * @return action item {@link View}
+ */
+ private View getActionItem(String title, Drawable icon, OnClickListener listener) {
+ LinearLayout container = (LinearLayout) inflater.inflate(R.layout.action_item, null);
+
+ ImageView img = (ImageView) container.findViewById(R.id.icon);
+ TextView text = (TextView) container.findViewById(R.id.title);
+
+ if (icon != null) {
+ img.setImageDrawable(icon);
+ }
+
+ if (title != null) {
+ text.setText(title);
+ }
+
+ if (listener != null) {
+ container.setOnClickListener(listener);
+ }
+
+ return container;
+ }
+
+ /**
+ * Show arrow
+ *
+ * @param whichArrow arrow type resource id
+ * @param requestedX distance from left screen
+ */
+ private void showArrow(int whichArrow, int requestedX) {
+ final View showArrow = (whichArrow == R.id.arrow_up) ? mArrowUp : mArrowDown;
+ final View hideArrow = (whichArrow == R.id.arrow_up) ? mArrowDown : mArrowUp;
+
+ final int arrowWidth = mArrowUp.getMeasuredWidth();
+
+ showArrow.setVisibility(View.VISIBLE);
+
+ ViewGroup.MarginLayoutParams param = (ViewGroup.MarginLayoutParams)showArrow.getLayoutParams();
+
+ param.leftMargin = requestedX - arrowWidth / 2;
+
+ hideArrow.setVisibility(View.INVISIBLE);
+ }
+}
\ No newline at end of file