public TSpaceHint Select(TReflectionWindowStruc RW, double VisibleFactor, float pX, float pY) { double RW_SqrScale = Math.pow(RW.Scale(), 2); TSpaceHint Item = Items; while (Item != null) { if (RW.Container_IsNodeVisible(Item.BindingPointX, Item.BindingPointY)) { if ((Item.BaseSquare * RW_SqrScale) >= VisibleFactor) { TXYCoord P = RW.ConvertToScreen(Item.BindingPointX, Item.BindingPointY); if (((RW.Xmn <= P.X) && (P.X <= RW.Xmx)) && ((RW.Ymn <= P.Y) && (P.Y <= RW.Ymx))) { float W = 0; float H = 0; // . synchronized (ItemsImageDataFiles) { TSpaceHintImageDataFile ImageDataFile = ItemsImageDataFiles.ItemsTable.get(Item.InfoImageDATAFileID); if ((ImageDataFile != null) && (ImageDataFile.Data != null)) { RectF ImageRect = ImageDataFile.Data_GetDestinationRect(ItemImageMinSize); W = ImageRect.width() + 1.0F; H = ImageRect.height(); } } // . Rect TR = new Rect(); Item.paint.getTextBounds(Item.InfoString, 0, Item.InfoString.length(), TR); W += (TR.right - TR.left); if (Item.InfoStringFontSize > H) H = (TR.bottom - TR.top); // . if ((((P.X - ItemSpacing) <= pX) && (pX <= (P.X + W + ItemSpacing))) && ((((P.Y - H - ItemSpacing) <= pY) && (pY <= (P.Y + ItemSpacing))))) { Item.flSelected = true; return Item.Clone(); // . -> } } } } Item.flSelected = false; // . Item = Item.Next; } return null; }
public synchronized void DrawOnCanvas( TReflectionWindowStruc RW, double VisibleFactor, Canvas canvas) { double RW_SqrScale = Math.pow(RW.Scale(), 2); // . calculate max item number depends on image square int SquareOrderHintList_Size = 5 * 4; // . prepare square ordered item list TSpaceHintItem SquareOrderHintList = null; TSpaceHint Item = Items; while (Item != null) { if (RW.Container_IsNodeVisible(Item.BindingPointX, Item.BindingPointY)) { if ((Item.BaseSquare * RW_SqrScale) >= VisibleFactor) { TXYCoord P = RW.ConvertToScreen(Item.BindingPointX, Item.BindingPointY); if (((RW.Xmn <= P.X) && (P.X <= RW.Xmx)) && ((RW.Ymn <= P.Y) && (P.Y <= RW.Ymx))) { int Size = SquareOrderHintList_Size; TSpaceHintItem LastHintItem = null; TSpaceHintItem HintItem = SquareOrderHintList; while (HintItem != null) { if (HintItem.Item.BaseSquare < Item.BaseSquare) break; // . > // . Size--; if (Size <= 0) break; // . > // . LastHintItem = HintItem; HintItem = HintItem.Next; } if (Size > 0) if (LastHintItem != null) LastHintItem.Next = new TSpaceHintItem(Item, LastHintItem.Next); else SquareOrderHintList = new TSpaceHintItem(Item, SquareOrderHintList); } } } // . Item = Item.Next; } // . re-order item list and prepare a draw list TSpaceHint[] DrawItemList = new TSpaceHint[SquareOrderHintList_Size]; TSpaceHintItem HintItem = SquareOrderHintList; for (int I = SquareOrderHintList_Size - 1; I >= 0; I--) if (HintItem != null) { DrawItemList[I] = HintItem.Item; HintItem = HintItem.Next; } else break; // . > // . draw list for (int I = 0; I < DrawItemList.length; I++) { Item = DrawItemList[I]; if (Item != null) { TXYCoord P = RW.ConvertToScreen(Item.BindingPointX, Item.BindingPointY); // . draw image float Left = (float) P.X; boolean flImage = false; synchronized (ItemsImageDataFiles) { TSpaceHintImageDataFile ImageDataFile = ItemsImageDataFiles.ItemsTable.get(Item.InfoImageDATAFileID); if ((ImageDataFile != null) && (ImageDataFile.Data != null)) { RectF ImageRect = ImageDataFile.Data_GetDestinationRect(ItemImageMinSize); ImageRect.offset(Left, (float) (P.Y - ImageRect.height())); // . canvas.drawBitmap( ImageDataFile.Data, ImageDataFile.Data_GetOriginalRect(), ImageRect, DrawPointItemImagePaint); // . Left += ImageRect.width() + 1.0F; flImage = true; } } // . draw selection if it exists if (Item.flSelected) { Rect TR = new Rect(); Item.paint.getTextBounds(Item.InfoString, 0, Item.InfoString.length(), TR); float X0, Y0, X1, Y1; X0 = Left - ItemSpacing; Y0 = (float) P.Y - (TR.bottom - TR.top) - ItemSpacing; X1 = Left + (TR.right - TR.left) + ItemSpacing; Y1 = (float) P.Y + ItemSpacing; // . SelectedPaint.setColor(Color.argb(127, 255, 0, 0)); canvas.drawRect(X0, Y0, X1, Y1, SelectedPaint); float[] Points = {X0, Y0, X1, Y0, X1, Y0, X1, Y1, X1, Y1, X0, Y1, X0, Y1, X0, Y0}; SelectedPaint.setColor(Color.argb(255, 255, 0, 0)); canvas.drawLines(Points, SelectedPaint); } // . draw image if (!flImage) canvas.drawCircle((float) P.X, (float) P.Y, 3.0F, DrawPointPaint); // . draw text Paint ShadowPaint = new Paint(Item.paint); ShadowPaint.setColor(Color.BLACK); canvas.drawText(Item.InfoString, Left + 1, (float) P.Y + 1, ShadowPaint); canvas.drawText(Item.InfoString, Left, (float) P.Y, Item.paint); } } }
public int SupplyHintsWithImageDataFiles(TCanceller Canceller) throws Exception { ArrayList<TSpaceHint> _Hints = new ArrayList<TSpaceHint>(); synchronized (this) { TSpaceHint Item = Items; while (Item != null) { if ((Item.InfoImageDATAFileID != 0) && (ItemsImageDataFiles.ItemsTable.get(Item.InfoImageDATAFileID) == null)) { boolean flDataFileIsFound = false; int Sz = _Hints.size(); for (int I = 0; I < Sz; I++) if (_Hints.get(I).InfoImageDATAFileID == Item.InfoImageDATAFileID) { flDataFileIsFound = true; break; // . > } if (!flDataFileIsFound) { _Hints.add(Item); if (_Hints.size() >= SHWIDF_MAX_ITEMS_TO_PROCESS) break; // . > } } // . if (Canceller != null) Canceller.Check(); // . Item = Item.Next; } } if (_Hints.size() == 0) return SHWIDF_RESULT_NOITEMTOSUPPLY; // . -> int Sz = _Hints.size(); int[] _HintIDs = new int[Sz]; for (int I = 0; I < Sz; I++) _HintIDs[I] = _Hints.get(I).ID; // . byte[] Data = null; String url = PrepareHintImagesURL(_HintIDs); HttpURLConnection Connection = Reflector.Server.OpenConnection(url); try { InputStream in = Connection.getInputStream(); try { if (Canceller != null) Canceller.Check(); // . int RetSize = Connection.getContentLength(); if (RetSize == 0) throw new Exception(Reflector.context.getString(R.string.SUnknownServerResponse)); // . => Data = new byte[RetSize]; int Size; int SummarySize = 0; int ReadSize; while (SummarySize < Data.length) { ReadSize = Data.length - SummarySize; Size = in.read(Data, SummarySize, ReadSize); if (Size <= 0) throw new Exception( Reflector.context.getString(R.string.SConnectionIsClosedUnexpectedly)); // . => SummarySize += Size; } } finally { in.close(); } } finally { Connection.disconnect(); } ItemsImageDataFiles_FromZippedByteArray(Data, Canceller); // . final check for supply synchronized (this) { TSpaceHint Item = Items; while (Item != null) { if ((Item.InfoImageDATAFileID != 0) && (ItemsImageDataFiles.ItemsTable.get(Item.InfoImageDATAFileID) == null)) return SHWIDF_RESULT_SUPPLIEDPARTIALLY; // . -> // . if (Canceller != null) Canceller.Check(); // . Item = Item.Next; } } return SHWIDF_RESULT_SUPPLIED; }