/** @file ItemPickerDialog.java * * @author marco corvi * @date * * @brief TopoDroid drawing item picker dialog * -------------------------------------------------------- * Copyright This sowftare is distributed under GPL-3.0 or later * See the file COPYING. * -------------------------------------------------------- */ package com.topodroid.DistoX; import java.util.ArrayList; import android.os.Bundle; import android.app.Dialog; // import android.app.Activity; import android.content.Context; import android.content.Intent; import android.view.Window; import android.graphics.*; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.AdapterView; // import android.widget.AdapterView.OnItemClickListener; // import android.widget.TextView; import android.widget.ListView; import android.widget.GridView; import android.util.Log; class ItemPickerDialog extends MyDialog implements View.OnClickListener , IItemPicker // , View.OnLongClickListener // , AdapterView.OnItemClickListener { private final static float DIMXP = 1.8f; private final static float DIMXL = 2.2f; private final static float DIMYL = 1.9f; private int mItemType; // items type private int mPointPos; // item point position private int mLinePos; // item line position private int mAreaPos; // item area position private long mPlotType; private int mScale; private int mSelectedPoint; private int mSelectedLine; private int mSelectedArea; private Button mBTpoint; private Button mBTline; private Button mBTarea; private Button mBTsize; // private Button mBTleft; // private Button mBTright; // private Button mBTcancel; // private Button mBTok; private SeekBar mSeekBar; // private DrawingWindow mParent; private ItemDrawer mParent; //* private ListView mList = null; private GridView mList = null; private GridView mGrid = null; private GridView mGridL = null; private GridView mGridA = null; private ItemAdapter mPointAdapter = null; private ItemAdapter mLineAdapter = null; private ItemAdapter mAreaAdapter = null; private ItemAdapter mAdapter = null; private LinearLayout mRecentLayout; private ItemButton mRecent[]; // static int mLinePos; // static int mAreaPos; private SymbolPointLibrary mPointLib; private SymbolLineLibrary mLineLib; private SymbolAreaLibrary mAreaLib; /** * @param context context * @param parent DrawingWindow parent * @param type drawing type */ ItemPickerDialog( Context context, ItemDrawer parent, long type, int item_type ) { super( context, R.string.ItemPickerDialog ); mParent = parent; mPlotType = type; mItemType = item_type; // mParent.mSymbol; mPointLib = BrushManager.mPointLib; mLineLib = BrushManager.mLineLib; mAreaLib = BrushManager.mAreaLib; mScale = mParent.getPointScale(); mSelectedPoint = mParent.mCurrentPoint; mSelectedLine = mParent.mCurrentLine; mSelectedArea = mParent.mCurrentArea; } @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); // requestWindowFeature(Window.FEATURE_NO_TITLE); createAdapters( ( TDSetting.mPickerType == TDSetting.PICKER_LIST || TDSetting.mPickerType == TDSetting.PICKER_RECENT ) ); if ( TDSetting.mPickerType == TDSetting.PICKER_GRID || TDSetting.mPickerType == TDSetting.PICKER_GRID_3 ) { setContentView(R.layout.item_picker2_dialog); getWindow().setLayout( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT ); mGrid = (GridView) findViewById(R.id.item_grid); mGridL = (GridView) findViewById(R.id.item_grid_line); mGridA = (GridView) findViewById(R.id.item_grid_area); if ( TDSetting.mPickerType == TDSetting.PICKER_GRID ) { mGridL.setVisibility( View.GONE ); mGridA.setVisibility( View.GONE ); } else { LinearLayout.LayoutParams params; params = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, 0 ); params.weight = 10 + mPointAdapter.size(); mGrid.setLayoutParams( params ); params = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, 0 ); params.weight = 10 + mLineAdapter.size(); mGridL.setLayoutParams( params ); params = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, 0 ); params.weight = 10 + mAreaAdapter.size(); mGridA.setLayoutParams( params ); } // mGrid.setOnItemClickListener( this ); // mGrid.setDividerHeight( 2 ); mList = null; } else { // PICKER_LIST || PICKER_RECENT setContentView(R.layout.item_picker_dialog); getWindow().setLayout( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT ); // * mList = (ListView) findViewById(R.id.item_list); mList = (GridView) findViewById(R.id.item_list); // mList.setOnItemClickListener( this ); // * mList.setDividerHeight( 1 ); mGrid = null; mGridL = null; mGridA = null; } mRecentLayout = (LinearLayout) findViewById( R.id.layout2 ); mRecent = new ItemButton[ TDSetting.mRecentNr ]; int lw = LinearLayout.LayoutParams.WRAP_CONTENT; int lh = LinearLayout.LayoutParams.WRAP_CONTENT; LinearLayout.LayoutParams lllp = new LinearLayout.LayoutParams(lh,lw); lllp.setMargins(5, 2, 5, 2); for ( int k=0; k<TDSetting.mRecentNr; ++k ) { mRecent[k] = new ItemButton( mContext ); mRecent[k].setOnClickListener( this ); mRecentLayout.addView( mRecent[k], lllp ); } mBTpoint = (Button) findViewById(R.id.item_point); mBTline = (Button) findViewById(R.id.item_line ); mBTarea = (Button) findViewById(R.id.item_area ); mBTsize = (Button) findViewById(R.id.size); // mBTleft = (Button) findViewById(R.id.item_left ); // mBTright = (Button) findViewById(R.id.item_right ); mSeekBar = (SeekBar) findViewById(R.id.seekbar ); // mBTcancel = (Button) findViewById(R.id.item_cancel ); // mBTok = (Button) findViewById(R.id.item_ok ); if ( TDSetting.mPickerType == TDSetting.PICKER_GRID_3 ) { mBTpoint.setVisibility( View.GONE ); mBTline.setVisibility( View.GONE ); mBTarea.setVisibility( View.GONE ); } else { mBTpoint.setOnClickListener( this ); mBTline.setOnClickListener( this ); mBTarea.setOnClickListener( this ); } mBTsize.setOnClickListener( this ); // mBTsize.setOnLongClickListener( new View.OnLongClickListener() { // @Override // public boolean onLongClick( View v ) { // if ( mScale < DrawingPointPath.SCALE_XL ) { // ++mScale; // mParent.setPointScale( mScale ); // setTheTitle(); // } // return true; // } // } ); // mBTleft.setOnClickListener( this ); // mBTright.setOnClickListener( this ); mSeekBar.setOnSeekBarChangeListener( new OnSeekBarChangeListener() { public void onProgressChanged( SeekBar seekbar, int progress, boolean fromUser) { if ( fromUser ) { setItemAngle( (180 + progress)%360 ); } } public void onStartTrackingTouch(SeekBar seekbar) { } public void onStopTrackingTouch(SeekBar seekbar) { } } ); // } else { // mBTpoint.setVisibility( View.GONE ); // mBTarea.setVisibility( View.GONE ); // // mBTleft.setVisibility( View.GONE ); // // mBTright.setVisibility( View.GONE ); // mSeekBar.setVisibility( View.GONE ); // } // mBTcancel.setOnClickListener( this ); // mBTok.setOnClickListener( this ); // requestWindowFeature( Window.FEATURE_NO_TITLE ); // Log.v( TopoDroidApp.TAG, "ItemPickerDialog ... createAdapters" ); updateList(); updateRecentButtons( mItemType ); setTypeAndItem( mItemType, getAdapterPosition() ); // setTheTitle(); } private void setSeekBarProgress() { boolean orientable = false; ItemSymbol item = null; if ( mItemType == Symbol.POINT && mPointAdapter != null ) { item = mPointAdapter.get( mPointAdapter.getSelectedPos() ); } else if ( mItemType == Symbol.AREA && mAreaAdapter != null ) { item = mAreaAdapter.get( mAreaAdapter.getSelectedPos() ); } if ( item != null ) { SymbolInterface symbol = item.mSymbol; if ( symbol != null && symbol.isOrientable() ) { mSeekBar.setProgress( (180+symbol.getAngle())%360 ); orientable = true; } } mSeekBar.setEnabled( orientable ); } private void setItemAngle( int angle ) { ItemSymbol item = null; Symbol[] symbols = null; if ( mItemType == Symbol.POINT && mPointAdapter != null ) { item = mPointAdapter.get( mPointAdapter.getSelectedPos() ); symbols = ItemDrawer.mRecentPoint; } else if ( mItemType == Symbol.AREA && mAreaAdapter != null ) { item = mAreaAdapter.get( mAreaAdapter.getSelectedPos() ); symbols = ItemDrawer.mRecentArea; } if ( item != null ) { item.setAngle( angle ); if ( symbols != null ) { for ( int k=0; k<TDSetting.mRecentNr; ++k ) { Symbol p = symbols[k]; if ( p == null ) break; if ( p == item.mSymbol ) { mRecent[k].reset( p.getPaint(), p.getPath(), DIMXP, DIMXP ); break; } } } } } private int getAdapterPosition() { int index = 0; switch ( mItemType ) { case Symbol.POINT: if ( mPointAdapter != null ) index = mPointAdapter.getSelectedPos(); break; case Symbol.LINE: if ( mLineAdapter != null ) index = mLineAdapter.getSelectedPos(); break; case Symbol.AREA: if ( mAreaAdapter != null ) index = mAreaAdapter.getSelectedPos(); break; } return index; } private void setRecentButtons( Symbol symbols[], float sx, float sy ) { for ( int k=0; k<TDSetting.mRecentNr; ++k ) { Symbol p = symbols[k]; if ( p == null ) { mRecent[k].setVisibility( View.INVISIBLE ); } else { mRecent[k].reset( p.getPaint(), p.getPath(), sx, sy ); mRecent[k].setVisibility( View.VISIBLE ); } } } private void updateRecentButtons( int item_type ) { if ( TDSetting.mPickerType != TDSetting.PICKER_GRID_3 ) { // float sx=1.0f, sy=1.0f; if ( item_type == Symbol.POINT ) { mBTsize.setVisibility( View.VISIBLE ); setRecentButtons( ItemDrawer.mRecentPoint, DIMXP, DIMXP ); } else if ( item_type == Symbol.LINE ) { mBTsize.setVisibility( View.GONE ); setRecentButtons( ItemDrawer.mRecentLine, DIMXL, DIMYL ); } else if ( item_type == Symbol.AREA ) { mBTsize.setVisibility( View.GONE ); setRecentButtons( ItemDrawer.mRecentArea, DIMXL, DIMYL ); } } else { // nothing } } private void createAdapters( boolean use_text ) { // if ( TDSetting.mLevelOverBasic ) { mPointAdapter = new ItemAdapter( mContext, this, Symbol.POINT, R.layout.item, new ArrayList<ItemSymbol>() ); int np = mPointLib.mSymbolNr; for ( int i=0; i<np; ++i ) { SymbolPoint p = (SymbolPoint)mPointLib.getSymbolByIndex( i ); if ( p.isEnabled() ) { mPointAdapter.add( new ItemSymbol( mContext, this, Symbol.POINT, i, p, use_text ) ); } } } mLineAdapter = new ItemAdapter( mContext, this, Symbol.LINE, R.layout.item, new ArrayList<ItemSymbol>() ); int nl = mLineLib.mSymbolNr; for ( int j=0; j<nl; ++j ) { SymbolLine l = (SymbolLine)mLineLib.getSymbolByIndex( j ); if ( l.isEnabled() ) { mLineAdapter.add( new ItemSymbol( mContext, this, Symbol.LINE, j, l, use_text ) ); } } // if ( TDSetting.mLevelOverBasic ) { mAreaAdapter = new ItemAdapter( mContext, this, Symbol.AREA, R.layout.item, new ArrayList<ItemSymbol>() ); int na = mAreaLib.mSymbolNr; for ( int k=0; k<na; ++k ) { SymbolArea a = (SymbolArea)mAreaLib.getSymbolByIndex( k ); if ( a.isEnabled() ) { mAreaAdapter.add( new ItemSymbol( mContext, this, Symbol.AREA, k, a, use_text ) ); } } } mPointAdapter.setSelectedItem( mSelectedPoint ); mLineAdapter.setSelectedItem( mSelectedLine ); mAreaAdapter.setSelectedItem( mSelectedArea ); } private void updateList() { // Log.v( TopoDroidApp.TAG, "ItemPickerDialog ... update List type " + mItemType ); if ( TDSetting.mPickerType != TDSetting.PICKER_GRID_3 ) { switch ( mItemType ) { case Symbol.POINT: // if ( TDSetting.mLevelOverBasic ) { mAdapter = mPointAdapter; mBTpoint.getBackground().setColorFilter( Color.parseColor( "#ccccff" ), PorterDuff.Mode.LIGHTEN ); mBTline.getBackground().setColorFilter( Color.parseColor( "#cccccc" ), PorterDuff.Mode.DARKEN ); mBTarea.getBackground().setColorFilter( Color.parseColor( "#cccccc" ), PorterDuff.Mode.DARKEN ); mSeekBar.setVisibility( View.VISIBLE ); setSeekBarProgress(); } break; case Symbol.LINE: mAdapter = mLineAdapter; mBTpoint.getBackground().setColorFilter( Color.parseColor( "#cccccc" ), PorterDuff.Mode.DARKEN ); mBTline.getBackground().setColorFilter( Color.parseColor( "#ccccff" ), PorterDuff.Mode.LIGHTEN ); mBTarea.getBackground().setColorFilter( Color.parseColor( "#cccccc" ), PorterDuff.Mode.DARKEN ); mSeekBar.setVisibility( View.INVISIBLE ); break; case Symbol.AREA: // if ( TDSetting.mLevelOverBasic ) { mAdapter = mAreaAdapter; mBTpoint.getBackground().setColorFilter( Color.parseColor( "#cccccc" ), PorterDuff.Mode.DARKEN ); mBTline.getBackground().setColorFilter( Color.parseColor( "#cccccc" ), PorterDuff.Mode.DARKEN ); mBTarea.getBackground().setColorFilter( Color.parseColor( "#ccccff" ), PorterDuff.Mode.LIGHTEN ); mSeekBar.setVisibility( View.VISIBLE ); } break; } if ( mAdapter != null ) { if ( mList != null ) { mList.setAdapter( mAdapter ); mList.invalidate(); } else if ( mGrid != null ) { mGrid.setAdapter( mAdapter ); mGrid.invalidate(); } } } else { setShowSelected(); mGrid.setAdapter( mPointAdapter ); mGrid.invalidate(); mGridL.setAdapter( mLineAdapter ); mGridL.invalidate(); mGridA.setAdapter( mAreaAdapter ); mGridA.invalidate(); } } // used by triple grid GRID_3 private void setShowSelected() { switch ( mItemType ) { case Symbol.POINT: mPointAdapter.setShowSelected( true ); mLineAdapter.setShowSelected( false ); mAreaAdapter.setShowSelected( false ); break; case Symbol.LINE: mPointAdapter.setShowSelected( false ); mLineAdapter.setShowSelected( true ); mAreaAdapter.setShowSelected( false ); break; case Symbol.AREA: mPointAdapter.setShowSelected( false ); mLineAdapter.setShowSelected( false ); mAreaAdapter.setShowSelected( true ); break; } } private void setTheTitle() { StringBuilder title = new StringBuilder(); switch ( mItemType ) { case Symbol.POINT: title.append( "[" ); title.append( DrawingPointPath.scaleToStringUC( mScale ) ); title.append( "] " ); title.append( mContext.getResources().getString( R.string.POINT ) ); title.append( " " ); title.append( mPointLib.getSymbolName( mSelectedPoint ) ); break; case Symbol.LINE: title.append( mContext.getResources().getString( R.string.LINE ) ); title.append( " " ); title.append( mLineLib.getSymbolName( mSelectedLine ) ); break; case Symbol.AREA: title.append( mContext.getResources().getString( R.string.AREA ) ); title.append( " " ); title.append( mAreaLib.getSymbolName( mSelectedArea ) ); break; } // Log.v("DistoX", "set title " + title.toString() ); setTitle( title.toString() ); } // pos public void setTypeAndItem( int type, int index ) { // Log.v( TDLog.TAG, "set TypeAndItem type " + mItemType + " item " + index ); mItemType = type; ItemSymbol is; switch ( type ) { case Symbol.POINT: if ( mPointAdapter != null /* && TDSetting.mLevelOverBasic */ ) { is = mPointAdapter.get( index ); // Log.v( TDLog.TAG, "set TypeAndItem type point pos " + index + " index " + is.mIndex ); mSelectedPoint = is.mIndex; // mParent.pointSelected( is.mIndex, false ); // mPointAdapter.getSelectedItem() ); setSeekBarProgress(); } break; case Symbol.LINE: if ( mLineAdapter != null ) { is = mLineAdapter.get( index ); // Log.v( TDLog.TAG, "set TypeAndItem type line pos " + index + " index " + is.mIndex ); if ( mPlotType != PlotInfo.PLOT_SECTION || is.mIndex != BrushManager.mLineLib.mLineSectionIndex ) { mSelectedLine = is.mIndex; // mParent.lineSelected( is.mIndex, false ); // mLineAdapter.getSelectedItem() ); } else { } mSeekBar.setEnabled( false ); } break; case Symbol.AREA: if ( mAreaAdapter != null /* && TDSetting.mLevelOverBasic */ ) { // mAreaPos = index; is = mAreaAdapter.get( index ); // Log.v( TDLog.TAG, "set TypeAndItem type area pos " + index + " index " + is.mIndex ); mSelectedArea = is.mIndex; // mParent.areaSelected( is.mIndex, false ); // mAreaAdapter.getSelectedItem() ); setSeekBarProgress(); } break; } // cancel(); setShowSelected(); setTheTitle(); } // this is called tapping the tab-buttons on the top private void setTypeFromCurrent( ) { switch ( mItemType ) { case Symbol.POINT: // if ( TDSetting.mLevelOverBasic ) { // mParent.pointSelected( mSelectedPoint, false ); // mSeekBar.setEnabled( BrushManager.mPointLib.isPointOrientable( mSelectedPoint ) ); if ( mPointAdapter != null ) setTypeAndItem( mItemType, mPointAdapter.getSelectedPos() ); } break; case Symbol.LINE: // if ( ! PlotInfo.isAnySection( mPlotType ) ) { // mParent.lineSelected( mSelectedLine, false ); // } else { // } if ( mLineAdapter != null ) setTypeAndItem( mItemType, mLineAdapter.getSelectedPos() ); break; case Symbol.AREA: // if ( TDSetting.mLevelOverBasic ) { // mParent.areaSelected( mSelectedArea, false ); if ( mAreaAdapter != null ) setTypeAndItem( mItemType, mAreaAdapter.getSelectedPos() ); } break; } // setTypeAndItem( getAdapterPosition() ); setTheTitle(); } // void rotatePoint( int angle ) // { // if ( mPointAdapter == null ) return; // if ( TDSetting.mLevelOverBasic && mItemType == Symbol.POINT ) { // // Log.v( TopoDroidApp.TAG, "rotate point " + mSelectedPoint ); // mPointAdapter.rotatePoint( mSelectedPoint, angle ); // } // } void setPointOrientation( int angle ) { if ( mPointAdapter == null ) return; if ( /* TDSetting.mLevelOverBasic && */ mItemType == Symbol.POINT ) { // Log.v( TopoDroidApp.TAG, "rotate point " + mSelectedPoint ); mPointAdapter.setPointOrientation( mSelectedPoint, angle ); // ItemSymbol item = mPointAdapter.getSelectedItem(); // if ( item != null ) { // angle -= (int) item.mSymbol.getAngle(); // mPointAdapter.rotatePoint( mSelectedPoint, angle ); // } } } @Override public void onBackPressed () { // Log.v( TopoDroidApp.TAG, "onBackPressed type " + mItemType ); itemSelected(); cancel(); } private void itemSelected() { switch ( mItemType ) { case Symbol.POINT: // if ( TDSetting.mLevelOverBasic ) { // Log.v("DistoX", "selected point " + mSelectedPoint ); mParent.pointSelected( mSelectedPoint, true ); } break; case Symbol.LINE: // Log.v("DistoX", "selected line " + mSelectedLine ); mParent.lineSelected( mSelectedLine, true ); break; case Symbol.AREA: // if ( TDSetting.mLevelOverBasic ) { // Log.v("DistoX", "selected area " + mSelectedArea ); mParent.areaSelected( mSelectedArea, true ); } break; } } @Override public void onClick(View view) { // Log.v("DistoX", "ItemPicker onClick()" ); switch (view.getId()) { case R.id.item_point: // if ( TDSetting.mLevelOverBasic ) { if ( mItemType != Symbol.POINT ) { mItemType = Symbol.POINT; updateList(); updateRecentButtons( mItemType ); setTypeFromCurrent( ); } } break; case R.id.item_line: if ( mItemType != Symbol.LINE ) { mItemType = Symbol.LINE; updateList(); updateRecentButtons( mItemType ); setTypeFromCurrent( ); } break; case R.id.item_area: // if ( TDSetting.mLevelOverBasic ) { if ( mItemType != Symbol.AREA ) { mItemType = Symbol.AREA; updateList(); updateRecentButtons( mItemType ); setTypeFromCurrent( ); } } break; case R.id.size: if ( mScale < DrawingPointPath.SCALE_XL ) { ++ mScale; } else { mScale = DrawingPointPath.SCALE_XS; } mParent.setPointScale( mScale ); setTheTitle(); break; } try { ItemButton iv = (ItemButton)view; if ( iv != null ) { for ( int k=0; k<TDSetting.mRecentNr; ++k ) { if ( iv == mRecent[k] ) { setRecent( k ); return; } } } } catch ( ClassCastException e ) { } // it is ok // dismiss(); } // @Override // public void onItemClick( AdapterView adapter, View view, int pos, long id ) // { // Log.v( "DistoX", "ItemPicker onItemCLick()" ); // if ( mAdapter != null ) mAdapter.doClick( view ); // } private void setRecent( int k ) { Symbol p = null; if ( mItemType == Symbol.POINT ) { p = ItemDrawer.mRecentPoint[k]; } else if ( mItemType == Symbol.LINE ) { p = ItemDrawer.mRecentLine[k]; } else if ( mItemType == Symbol.AREA ) { p = ItemDrawer.mRecentArea[k]; } if ( p != null ) { if ( mAdapter != null ) mAdapter.setSelectedItem( p ); setSeekBarProgress(); } } public void closeDialog() { itemSelected(); dismiss(); } }