/** @file SymbolAreaLibrary.java * * @author marco corvi * @date dec 2012 * * @brief TopoDroid drawing: area symbol library * -------------------------------------------------------- * Copyright This sowftare is distributed under GPL-3.0 or later * See the file COPYING. * -------------------------------------------------------- */ package com.topodroid.DistoX; import java.util.Locale; import java.util.ArrayList; import java.util.TreeSet; import java.io.File; import java.io.PrintWriter; import java.io.DataOutputStream; import java.io.IOException; import android.graphics.Paint; import android.graphics.Bitmap; import android.graphics.Shader; import android.graphics.BitmapShader; import android.graphics.Shader.TileMode; import android.content.res.Resources; import android.util.Log; class SymbolAreaLibrary extends SymbolLibrary { static final String DefaultAreas[] = { "blocks", "clay", "debris", "sand" }; int mAreaUserIndex; SymbolAreaLibrary( Resources res ) { super( "a_" ); mAreaUserIndex = 0; loadSystemAreas( res ); loadUserAreas(); makeEnabledList(); // Log.v("DistoX", "Areas " + mSymbolNr ); // for ( Symbol s : mSymbols ) Log.v("DistoX", "area " + s.getName() + " " + s.getThName() ); } boolean isCloseHorizontal( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? false : s.mCloseHorizontal; } // FIXME AREA_ORIENT double getAreaOrientation( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? 0 : s.mOrientation; } // FIXME AREA_ORIENT void rotateGrad( int k, double a ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); if ( s != null ) s.rotateGradArea( a ); } Bitmap getAreaBitmap( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? null : s.mBitmap; } Shader getAreaShader( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? null : s.mShader; } BitmapShader cloneAreaShader( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); if ( s == null ) return null; Bitmap b = s.mShaderBitmap; if ( b == null ) return null; BitmapShader ret = new BitmapShader( b, s.mXMode, s.mYMode ); return ret; } TileMode getAreaXMode( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? TileMode.REPEAT : s.mXMode; } TileMode getAreaYMode( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? TileMode.REPEAT : s.mYMode; } int getAreaColor( int k ) { SymbolArea s = (SymbolArea)getSymbolByIndex(k); return ( s == null )? 0xffffffff : s.mColor; } int areaCsxLayer( int k ) { return getSymbolCsxLayer(k); } int areaCsxType( int k ) { return getSymbolCsxType(k); } int areaCsxCategory( int k ) { return getSymbolCsxCategory(k); } int areaCsxPen( int k ) { return getSymbolCsxPen(k); } int areaCsxBrush( int k ) { return getSymbolCsxBrush(k); } // ======================================================================== private void loadSystemAreas( Resources res ) { // Log.v( TopoDroidApp.TAG, "load system areas"); if ( size() > 0 ) return; SymbolArea symbol = new SymbolArea( res.getString( R.string.tha_user ), "u:user", "user", 0x67cccccc, null, TileMode.REPEAT, TileMode.REPEAT, false ); symbol.mCsxLayer = 2; symbol.mCsxType = 3; symbol.mCsxCategory = 46; symbol.mCsxPen = 1; symbol.mCsxBrush = 2; addSymbol( symbol ); symbol = new SymbolArea( res.getString( R.string.tha_water ), "water", "water", 0x663366ff, null, TileMode.REPEAT, TileMode.REPEAT, true ); symbol.mCsxLayer = 2; symbol.mCsxType = 3; symbol.mCsxCategory = 46; symbol.mCsxPen = 1; symbol.mCsxBrush = 2; addSymbol( symbol ); } void loadUserAreas() { String locale = "name-" + TopoDroidApp.mLocale.toString().substring(0,2); String iso = "ISO-8859-1"; // String iso = "UTF-8"; // if ( locale.equals( "name-es" ) ) iso = "ISO-8859-1"; File dir = new File( TDPath.APP_AREA_PATH ); if ( dir.exists() ) { int systemNr = size(); File[] files = dir.listFiles(); for ( File file : files ) { SymbolArea symbol = new SymbolArea( file.getPath(), file.getName(), locale, iso ); if ( symbol.mThName == null ) { TDLog.Error( "area with null ThName " + file.getName() ); continue; } if ( ! hasSymbolByFilename( symbol.mThName ) ) { addSymbol( symbol ); String thname = symbol.mThName; String name = mPrefix + thname; boolean enable = false; if ( ! TopoDroidApp.mData.hasSymbolName( name ) ) { for ( int k=0; k<DefaultAreas.length; ++k ) { if ( DefaultAreas[k].equals( thname ) ) { enable = true; break; } } TopoDroidApp.mData.setSymbolEnabled( name, enable ); } else { enable = TopoDroidApp.mData.getSymbolEnabled( name ); } symbol.setEnabled( enable ); } } sortSymbolByName( systemNr ); } else { dir.mkdirs( ); } } boolean tryLoadMissingArea( String fname ) { String locale = "name-" + Locale.getDefault().toString().substring(0,2); String iso = "ISO-8859-1"; // String iso = "UTF-8"; // if ( locale.equals( "name-es" ) ) iso = "ISO-8859-1"; Symbol symbol = getSymbolByFilename( fname ); if ( symbol == null ) { String filename = TDPath.APP_SAVE_AREA_PATH + fname; File file = new File( filename ); if ( ! file.exists() ) return false; symbol = new SymbolArea( file.getPath(), file.getName(), locale, iso ); addSymbol( symbol ); } if ( symbol == null ) return false; if ( ! symbol.isEnabled() ) { symbol.setEnabled( true ); // TopoDroidApp.mData.isSymbolEnabled( mPrefix + symbol.mThName ) ); makeEnabledList(); } return true; } void makeEnabledListFromPalette( SymbolsPalette palette ) { makeEnabledListFromStrings( palette.mPaletteArea ); } }