/* * Copyright (C) 2013 The Android Open Source Project * * 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 com.android.gallery3d.filtershow.editors; import android.content.Context; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.ToggleButton; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.controller.Control; import com.android.gallery3d.filtershow.controller.FilterView; import com.android.gallery3d.filtershow.controller.Parameter; import com.android.gallery3d.filtershow.controller.ParameterActionAndInt; import com.android.gallery3d.filtershow.filters.FilterGradRepresentation; import com.android.gallery3d.filtershow.filters.FilterRepresentation; import com.android.gallery3d.filtershow.imageshow.ImageGrad; import com.android.gallery3d.filtershow.imageshow.MasterImage; public class EditorGrad extends ParametricEditor implements OnSeekBarChangeListener, ParameterActionAndInt { private static final String LOGTAG = "EditorGrad"; public static final int ID = R.id.editorGrad; PopupMenu mPopupMenu; ToggleButton mAddModeButton; String mEffectName = ""; private static final int MODE_BRIGHTNESS = FilterGradRepresentation.PARAM_BRIGHTNESS; private static final int MODE_SATURATION = FilterGradRepresentation.PARAM_SATURATION; private static final int MODE_CONTRAST = FilterGradRepresentation.PARAM_CONTRAST; private static final int ADD_ICON = R.drawable.ic_grad_add; private static final int DEL_ICON = R.drawable.ic_grad_del; private int mSliderMode = MODE_BRIGHTNESS; ImageGrad mImageGrad; ParamAdapter []mAdapters = new ParamAdapter[3]; public EditorGrad() { super(ID, R.layout.filtershow_grad_editor, R.id.gradEditor); } @Override public void createEditor(Context context, FrameLayout frameLayout) { super.createEditor(context, frameLayout); mImageGrad = (ImageGrad) mImageShow; mImageGrad.setEditor(this); } public void clearAddMode() { mAddModeButton.setChecked(false); FilterRepresentation tmpRep = getLocalRepresentation(); if (tmpRep instanceof FilterGradRepresentation) { updateMenuItems((FilterGradRepresentation) tmpRep); } } @Override public void reflectCurrentFilter() { super.reflectCurrentFilter(); FilterRepresentation tmpRep = getLocalRepresentation(); if (tmpRep instanceof FilterGradRepresentation) { FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep; boolean f = rep.showParameterValue(); mImageGrad.setRepresentation(rep); } } public void updateSeekBar(FilterGradRepresentation rep) { if (ParametricEditor.useCompact(mContext)) { mControl.updateUI(); } else { updateParameters(); } } @Override public void onProgressChanged(SeekBar sbar, int progress, boolean arg2) { FilterRepresentation tmpRep = getLocalRepresentation(); if (tmpRep instanceof FilterGradRepresentation) { FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep; int min = rep.getParameterMin(mSliderMode); int value = progress + min; rep.setParameter(mSliderMode, value); mView.invalidate(); commitLocalRepresentation(); } } @Override public void openUtilityPanel(final LinearLayout accessoryViewList) { Button view = (Button) accessoryViewList.findViewById(R.id.applyEffect); if (useCompact(mContext)) { view.setText(mContext.getString(R.string.editor_grad_brightness)); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { showPopupMenu(accessoryViewList); } }); setUpPopupMenu(view); setEffectName(); } else { view.setText(mContext.getString(R.string.grad)); } } private void updateMenuItems(FilterGradRepresentation rep) { int n = rep.getNumberOfBands(); } public void setEffectName() { if (mPopupMenu != null) { MenuItem item = mPopupMenu.getMenu().findItem(R.id.editor_grad_brightness); mEffectName = item.getTitle().toString(); } } @Override public void setUtilityPanelUI(View actionButton, View editControl) { if (ParametricEditor.useCompact(mContext)) { super.setUtilityPanelUI(actionButton, editControl); return; } mSeekBar = (SeekBar) editControl.findViewById(R.id.primarySeekBar); if (mSeekBar != null) { mSeekBar.setVisibility(View.GONE); } LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout lp = (LinearLayout) inflater.inflate( R.layout.filtershow_grad_ui, (ViewGroup) editControl, true); mAdapters[0] = new ParamAdapter(R.id.gradContrastSeekBar, R.id.gradContrastValue, lp, MODE_CONTRAST); mAdapters[1] = new ParamAdapter(R.id.gradBrightnessSeekBar, R.id.gradBrightnessValue, lp, MODE_BRIGHTNESS); mAdapters[2] = new ParamAdapter(R.id.gradSaturationSeekBar, R.id.gradSaturationValue, lp, MODE_SATURATION); lp.findViewById(R.id.gradAddButton).setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { fireLeftAction(); } }); lp.findViewById(R.id.gradDelButton).setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { fireRightAction(); } }); setMenuIcon(false); } public void updateParameters() { FilterGradRepresentation rep = getGradRepresentation(); for (int i = 0; i < mAdapters.length; i++) { mAdapters[i].updateValues(rep); } } private class ParamAdapter implements OnSeekBarChangeListener { SeekBar mSlider; TextView mTextView; int mMin = -100; int mMax = 100; int mMode; public ParamAdapter(int seekId, int textId, LinearLayout layout, int mode) { mSlider = (SeekBar) layout.findViewById(seekId); mTextView = (TextView) layout.findViewById(textId); mSlider.setMax(mMax - mMin); mMode = mode; FilterGradRepresentation rep = getGradRepresentation(); if (rep != null){ updateValues(rep); } mSlider.setOnSeekBarChangeListener(this); } public void updateValues(FilterGradRepresentation rep) { int value = rep.getParameter(mMode); mTextView.setText(Integer.toString(value)); mSlider.setProgress(value - mMin); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { FilterGradRepresentation rep = getGradRepresentation(); int value = progress + mMin; rep.setParameter(mMode, value); if (mSliderMode != mMode) { mSliderMode = mMode; mEffectName = mContext.getResources().getString(getModeNameid(mMode)); mEffectName = mEffectName.toUpperCase(); } mTextView.setText(Integer.toString(value)); mView.invalidate(); commitLocalRepresentation(); } private int getModeNameid(int mode) { switch (mode) { case MODE_CONTRAST: return R.string.editor_grad_contrast; case MODE_BRIGHTNESS: return R.string.editor_grad_brightness; case MODE_SATURATION: return R.string.editor_grad_saturation; } return 0; } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } private void showPopupMenu(LinearLayout accessoryViewList) { Button button = (Button) accessoryViewList.findViewById(R.id.applyEffect); if (button == null) { return; } if (mPopupMenu == null) { setUpPopupMenu(button); } mPopupMenu.show(); ((FilterShowActivity)mContext).onShowMenu(mPopupMenu); } private void setUpPopupMenu(Button button) { mPopupMenu = new PopupMenu(mImageShow.getActivity(), button); mPopupMenu.getMenuInflater() .inflate(R.menu.filtershow_menu_grad, mPopupMenu.getMenu()); FilterGradRepresentation rep = (FilterGradRepresentation) getLocalRepresentation(); if (rep == null) { return; } updateMenuItems(rep); hackFixStrings(mPopupMenu.getMenu()); setEffectName(); updateText(); mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { FilterRepresentation tmpRep = getLocalRepresentation(); if (tmpRep instanceof FilterGradRepresentation) { FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep; int cmdID = item.getItemId(); switch (cmdID) { case R.id.editor_grad_brightness: mSliderMode = MODE_BRIGHTNESS; mEffectName = item.getTitle().toString(); break; case R.id.editor_grad_contrast: mSliderMode = MODE_CONTRAST; mEffectName = item.getTitle().toString(); break; case R.id.editor_grad_saturation: mSliderMode = MODE_SATURATION; mEffectName = item.getTitle().toString(); break; } updateMenuItems(rep); updateSeekBar(rep); commitLocalRepresentation(); mView.invalidate(); } return true; } }); } @Override public String calculateUserMessage(Context context, String effectName, Object parameterValue) { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return mEffectName; } int val = rep.getParameter(mSliderMode); return mEffectName.toUpperCase() + ((val > 0) ? " +" : " ") + val; } private FilterGradRepresentation getGradRepresentation() { FilterRepresentation tmpRep = getLocalRepresentation(); if (tmpRep instanceof FilterGradRepresentation) { return (FilterGradRepresentation) tmpRep; } return null; } @Override public int getMaximum() { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return 0; } return rep.getParameterMax(mSliderMode); } @Override public int getMinimum() { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return 0; } return rep.getParameterMin(mSliderMode); } @Override public int getDefaultValue() { return 0; } @Override public int getValue() { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return 0; } return rep.getParameter(mSliderMode); } @Override public String getValueString() { return null; } @Override public void setValue(int value) { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return; } rep.setParameter(mSliderMode, value); } @Override public String getParameterName() { return mEffectName; } @Override public String getParameterType() { return sParameterType; } @Override public void setController(Control c) { } @Override public void fireLeftAction() { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return; } rep.addBand(MasterImage.getImage().getOriginalBounds()); updateMenuItems(rep); updateSeekBar(rep); commitLocalRepresentation(); mView.invalidate(); } @Override public int getLeftIcon() { return ADD_ICON; } @Override public void fireRightAction() { FilterGradRepresentation rep = getGradRepresentation(); if (rep == null) { return; } rep.deleteCurrentBand(); updateMenuItems(rep); updateSeekBar(rep); commitLocalRepresentation(); mView.invalidate(); } @Override public int getRightIcon() { return DEL_ICON; } @Override public void setFilterView(FilterView editor) { } @Override public void copyFrom(Parameter src) { } }