diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/CellView.java b/android/src/main/java/com/qliktrialreactnativestraighttable/CellView.java index 30490462..d9977899 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/CellView.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/CellView.java @@ -28,6 +28,8 @@ public class CellView extends LinearLayout implements SelectionsObserver { content = new ClickableTextView(context, selectionsEngine, scrollView); } else if(type.equals("image")) { content = new ClickableImageView(context, selectionsEngine, scrollView, this); + } else if(type.equals("miniChart")) { + content = new MiniChartView(context); } this.scrollView = scrollView; this.selectionsEngine = selectionsEngine; @@ -95,7 +97,7 @@ public void onClear() { public void onRecycled() { DataCell cell = content.getCell(); - if (cell.isDim) { + if (cell != null && cell.isDim) { selectionsEngine.remove(this); } } diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/ClickableImageView.java b/android/src/main/java/com/qliktrialreactnativestraighttable/ClickableImageView.java index 46395797..b963ac2b 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/ClickableImageView.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/ClickableImageView.java @@ -95,7 +95,7 @@ private void fitToWidth(DataColumn column, Bitmap image) { } public void setSizing(DataColumn column, Bitmap image) { - switch (column.imageSize) { + switch (column.representation.imageSize) { case "alwaysFit": alwaysFit(); break; @@ -116,7 +116,7 @@ public void setAlignment(DataColumn column) { LinearLayout wrapper = (LinearLayout) container.getParent(); setTranslationY(0); - switch (column.imagePosition) { + switch (column.representation.imagePosition) { case "topCenter": wrapper.setGravity(Gravity.LEFT); break; diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/ColumnWidthFactory.java b/android/src/main/java/com/qliktrialreactnativestraighttable/ColumnWidthFactory.java index d2157ca2..e156ecf4 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/ColumnWidthFactory.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/ColumnWidthFactory.java @@ -3,6 +3,7 @@ import android.content.Context; import android.util.Log; import android.view.View; +import android.widget.FrameLayout; import android.widget.TextView; import java.util.List; @@ -36,7 +37,8 @@ public void autoSize(CustomHorizontalScrollView contextView) { if (resized) { requestLayoutHeaderView(); - EventUtils.sendOnColumnResize(contextView, this.columnList); + FrameLayout parent = (FrameLayout)contextView.getParent(); + EventUtils.sendOnColumnResize(parent, this.columnList); } } diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/CustomRecyclerView.java b/android/src/main/java/com/qliktrialreactnativestraighttable/CustomRecyclerView.java index 41d75a60..a8a19a03 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/CustomRecyclerView.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/CustomRecyclerView.java @@ -3,6 +3,8 @@ import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Color; +import android.view.View; +import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.recyclerview.widget.DividerItemDecoration; @@ -70,7 +72,8 @@ public void onScrolled(@NonNull RecyclerView rv, int dx, int dy) { && dataProvider.needsMore()) { // start the fetch dataProvider.setLoading(true); - EventUtils.sendEventToJSFromView(scrollView, "onEndReached"); + FrameLayout parent = (FrameLayout) scrollView.getParent(); + EventUtils.sendEventToJSFromView(parent, "onEndReached"); } } } diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/DataCell.java b/android/src/main/java/com/qliktrialreactnativestraighttable/DataCell.java index df3d0efe..e67ce19a 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/DataCell.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/DataCell.java @@ -23,6 +23,7 @@ public class DataCell { int rawColIdx; boolean isNumber; int textGravity = Gravity.LEFT; + qMiniChart miniChart; public DataCell(ReadableMap source, DataColumn column) { qText = source.getString("qText"); qElemNumber = source.getInt("qElemNumber"); @@ -51,6 +52,7 @@ public DataCell(ReadableMap source, DataColumn column) { DataProvider.addImagePath(imageUrl); } } + miniChart = source.hasKey("qMiniChart") ? new qMiniChart(source.getMap("qMiniChart")) : null; } diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/DataColumn.java b/android/src/main/java/com/qliktrialreactnativestraighttable/DataColumn.java index 44ab6ad6..6c8dd270 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/DataColumn.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/DataColumn.java @@ -16,25 +16,19 @@ public class DataColumn { public Boolean isDim = false; public int width = 200; public String label; - public String type; public String id; public String align; public String sortDirection; - public String imageUrl; - public String imageSize; - public String imagePosition; + public Representation representation; public List stylingInfo; public int dataColIdx = 0; public boolean active = false; public DataColumn(ReadableMap source) { - ReadableMap representation = source.getMap("representation"); + ReadableMap representationMap = source.getMap("representation"); + representation = new Representation(representationMap); stylingInfo = source.getArray("stylingInfo").toArrayList(); - type = representation.getString("type"); - imageUrl = representation.getString("imageUrl"); - imageSize = representation.getString("imageSize"); - imagePosition = representation.getString("imagePosition"); - imageSize = representation.getString("imageSize"); + isDim = source.getBoolean("isDim"); width = source.getInt("width"); label = source.getString("label"); diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/DataProvider.java b/android/src/main/java/com/qliktrialreactnativestraighttable/DataProvider.java index 50447bfe..0f3de02b 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/DataProvider.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/DataProvider.java @@ -152,16 +152,16 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int int width = column.width; ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(width, TableTheme.rowHeight); - if (column.type.equals("image")) { + if (column.representation.type.equals("image")) { RelativeLayout wrapper = new RelativeLayout(parent.getContext()); - -// RelativeLayout container = new RelativeLayout(parent.getContext()); - CellView cellView = new CellView(parent.getContext(), "image", this.selectionsEngine, this.scrollView); RelativeLayout.LayoutParams cellLayoutParams = new RelativeLayout.LayoutParams(-1,-1); -// container.addView(cellView); wrapper.addView(cellView, cellLayoutParams); rowView.addView(wrapper, layoutParams); + } else if(column.representation.type.equals("miniChart")) { + CellView cellView = new CellView(parent.getContext(), "miniChart", this.selectionsEngine, this.scrollView); + + rowView.addView(cellView); } else { CellView cellView = new CellView(parent.getContext(), "text", this.selectionsEngine, this.scrollView); ClickableTextView textView = (ClickableTextView) cellView.content; @@ -294,7 +294,8 @@ public void onViewRecycled(RecyclerView.ViewHolder viewHolder) { } public void onEndPan(CustomHorizontalScrollView contextView) { - EventUtils.sendOnColumnResize(contextView, dataColumns); + FrameLayout parent = (FrameLayout) contextView.getParent(); + EventUtils.sendOnColumnResize(parent, dataColumns); } } diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/EventUtils.java b/android/src/main/java/com/qliktrialreactnativestraighttable/EventUtils.java index ebb33fc4..ad907ffd 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/EventUtils.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/EventUtils.java @@ -3,6 +3,7 @@ import android.content.Context; import android.util.Log; import android.view.View; +import android.widget.FrameLayout; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactContext; @@ -15,7 +16,7 @@ import java.util.List; public class EventUtils { - public static void sendEventToJSFromView(CustomHorizontalScrollView contextView, String eventName) { + public static void sendEventToJSFromView(FrameLayout contextView, String eventName) { if (contextView != null) { WritableMap event = Arguments.createMap(); ReactContext context = (ReactContext) contextView.getContext(); @@ -23,7 +24,7 @@ public static void sendEventToJSFromView(CustomHorizontalScrollView contextView, context.getJSModule(RCTEventEmitter.class).receiveEvent(contextView.getId(), eventName, event); } } - public static void sendEventToJSFromView(CustomHorizontalScrollView contextView, String eventName, WritableMap event) { + public static void sendEventToJSFromView(FrameLayout contextView, String eventName, WritableMap event) { if (contextView != null) { ReactContext context = (ReactContext) contextView.getContext(); // here the documentation is still using the old receiveEvent, so not sure what to use???? @@ -31,7 +32,7 @@ public static void sendEventToJSFromView(CustomHorizontalScrollView contextView, } } - public static void sendOnColumnResize(CustomHorizontalScrollView contextView, List dataColumns) { + public static void sendOnColumnResize(FrameLayout contextView, List dataColumns) { WritableArray widths = Arguments.createArray(); for(int i = 0; i < dataColumns.size(); i++) { widths.pushDouble(PixelUtils.pxToDp(dataColumns.get(i).width)); @@ -41,7 +42,7 @@ public static void sendOnColumnResize(CustomHorizontalScrollView contextView, Li EventUtils.sendEventToJSFromView(contextView, "onColumnsResized", event); } - public static void sendOnHeaderTapped(CustomHorizontalScrollView contextView, DataColumn column) { + public static void sendOnHeaderTapped(FrameLayout contextView, DataColumn column) { WritableMap event = Arguments.createMap(); try { String columnJSONString = column.toEvent(); diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/HeaderCell.java b/android/src/main/java/com/qliktrialreactnativestraighttable/HeaderCell.java index 36c36771..af467af5 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/HeaderCell.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/HeaderCell.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Color; import android.view.MotionEvent; +import android.widget.FrameLayout; import androidx.annotation.NonNull; @@ -42,12 +43,13 @@ public void handleSingleTap() { if(column.sortDirection == null && column.active) { return; } - EventUtils.sendOnHeaderTapped(scrollView, column); - + FrameLayout parent = (FrameLayout)scrollView.getParent(); + EventUtils.sendOnHeaderTapped(parent, column); + } public void handleDown() { - if(column.sortDirection == null && column.active) { + if(column.sortDirection == null && column.active) { return; } this.setBackgroundColor(Color.LTGRAY); diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniBarChartRenderer.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniBarChartRenderer.java new file mode 100644 index 00000000..ccfaf505 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniBarChartRenderer.java @@ -0,0 +1,29 @@ +package com.qliktrialreactnativestraighttable; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; + +public class MiniBarChartRenderer extends MiniChartRenderer { + + Rect bar = new Rect(); + + public MiniBarChartRenderer(qMiniChart chartData, Representation representation) { + super(chartData, representation); + } + + @Override + public void render(Canvas canvas) { + float x = padding + (horizontalPadding / 2.0f); + paint.setColor(miniChartInfo.colors.main.color); + for(int i = 0; i < miniChartData.matrix.rows.size(); i++) { + float value = (float) miniChartData.matrix.rows.get(i).columns.get(1).qNum; + float height = value * scale; + float y = xAxis - height ; + float b = xAxis; + setColor(i, value, miniChartData.matrix.rows.size()); + canvas.drawRect(x, y, x + bandwidth, b, paint); + x += padding * 2.0f + bandwidth; + } + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartInfo.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartInfo.java new file mode 100644 index 00000000..a9033b77 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartInfo.java @@ -0,0 +1,66 @@ +package com.qliktrialreactnativestraighttable; + +import android.graphics.Color; + +import com.facebook.react.bridge.ReadableMap; + +public class MiniChartInfo { + public String type; + public Boolean showDots; + public YAxis yAxis; + public ChartColors colors; + + class YAxis { + public String position; + public String scale; + public YAxis(ReadableMap data) { + position = data.hasKey("position") ? data.getString("position") : ""; + scale = data.hasKey("scale") ? data.getString("scale") : ""; + } + } + + class MiniChartColor { + public String colorValue; + public int index; + int color; + boolean valid = false; + public MiniChartColor(ReadableMap data) { + colorValue = data.hasKey("color") ? data.getString("color") : "none"; + index = data.hasKey("index") ? data.getInt("index") : 0; + if(!colorValue.equals("none")) { + color = Color.parseColor(colorValue); + valid = true; + } + } + } + + class ChartColors { + public MiniChartColor first; + public MiniChartColor last; + public MiniChartColor min; + public MiniChartColor max; + public MiniChartColor negative; + public MiniChartColor positive; + public MiniChartColor main; + public ChartColors(ReadableMap data) { + first = getMiniChartColor("first", data); + last = getMiniChartColor("last", data); + min = getMiniChartColor("min", data); + max = getMiniChartColor("max", data); + negative = getMiniChartColor("negative", data); + positive = getMiniChartColor("positive", data); + main = getMiniChartColor("main", data); + } + + MiniChartColor getMiniChartColor(String name, ReadableMap data) { + return data.hasKey(name) ? new MiniChartColor(data.getMap(name)) : null; + } + } + + MiniChartInfo(ReadableMap data) { + type = data.hasKey("type") ? data.getString("type") : ""; + showDots = data.hasKey("showDots") ? data.getBoolean("showDots") : false; + yAxis = data.hasKey("yAxis") ? new YAxis(data.getMap("yAxis")) : null; + colors = data.hasKey("colors") ? new ChartColors(data.getMap("colors")) : null; + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartRenderer.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartRenderer.java new file mode 100644 index 00000000..f6e153be --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartRenderer.java @@ -0,0 +1,79 @@ +package com.qliktrialreactnativestraighttable; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; + +public class MiniChartRenderer { + qMiniChart miniChartData = null; + MiniChartInfo miniChartInfo = null; + Representation representation = null; + Rect bounds = new Rect(); + Paint paint = new Paint(); + float horizontalPadding = 20.0f; + float verticalPadding = 8.0f; + float bandwidth = 0.0f; + float padding = 0.0f; + float scale = 0.0f; + float yScale = 1.0f; + float xAxis = 0.0f; + + public MiniChartRenderer(qMiniChart chartData, Representation representation ) { + this.representation = representation; + miniChartData = chartData; + miniChartInfo = representation.miniChart; + paint.setColor(Color.RED); + + + } + + public void updateData(qMiniChart chartData, Representation representation) { + miniChartData = chartData; + this.representation = representation; + } + + public void resetScales(Rect bounds) { + this.bounds = bounds; + if(miniChartData != null) { + if(miniChartInfo.yAxis != null && miniChartInfo.yAxis.scale.equals("global")) { + float min = Math.min((float) representation.globalMin, 0.0f); + yScale = (float) representation.globalMax - min; + } else { + float min = Math.min((float) miniChartData.qMin, 0.0f); + yScale = (float) (miniChartData.qMax - min); + } + setBandwidth(); + setScales(); + } + } + + protected void setBandwidth() { + float width = bounds.width() - horizontalPadding; + float totalBandWidth = width / miniChartData.matrix.rows.size(); + bandwidth = totalBandWidth * 0.8f; + padding = totalBandWidth * 0.1f; + } + + protected void setScales() { + float height = bounds.height() - (verticalPadding * 2.0f); + scale = height / yScale; + xAxis = miniChartData.qMin < 0.0 ? (float)bounds.height() + ((float)miniChartData.qMin * scale) : bounds.height(); + } + + protected void setColor(int index, float value, int count) { + if(miniChartInfo.colors.max.valid && value == (float) miniChartData.qMax) { + paint.setColor(miniChartInfo.colors.max.color); + } else if(miniChartInfo.colors.min.valid && value == (float) miniChartData.qMin) { + paint.setColor(miniChartInfo.colors.min.color); + } else if(miniChartInfo.colors.first.valid && index == 0) { + paint.setColor(miniChartInfo.colors.first.color); + } else if(miniChartInfo.colors.last.valid && index == count - 1) { + paint.setColor(miniChartInfo.colors.last.color); + } else { + paint.setColor(miniChartInfo.colors.main.color); + } + } + + public void render(Canvas canvas) {} +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartView.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartView.java new file mode 100644 index 00000000..ca694069 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniChartView.java @@ -0,0 +1,76 @@ +package com.qliktrialreactnativestraighttable; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.view.GestureDetector; +import android.view.View; + +public class MiniChartView extends View implements Content { + Rect bounds = new Rect(); + Paint paint = new Paint(); + DataCell dataCell = null; + MiniChartRenderer miniChartRenderer = null; + + public MiniChartView(Context context) { + super(context); + paint.setColor(Color.BLUE); + } + + public void setData(DataCell cell, DataColumn column) { + if(miniChartRenderer == null) { + if (cell.miniChart != null && column.representation != null) { + if (column.representation.miniChart != null) { + if (column.representation.miniChart.type.equals("bars")) { + miniChartRenderer = new MiniBarChartRenderer(cell.miniChart, column.representation); + } else if(column.representation.miniChart.type.equals("dots")) { + miniChartRenderer = new MiniDotsChartRenderer(cell.miniChart, column.representation); + } else if(column.representation.miniChart.type.equals("sparkline")) { + miniChartRenderer = new MiniSparkLinesRenderer(cell.miniChart, column.representation); + } else if(column.representation.miniChart.type.equals("posNeg")) { + miniChartRenderer = new MiniPosNegRenderer(cell.miniChart, column.representation); + } + } + } + } else { + miniChartRenderer.updateData(cell.miniChart, column.representation); + } + this.invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + if(miniChartRenderer != null){ + canvas.getClipBounds(bounds); + miniChartRenderer.resetScales(bounds); + miniChartRenderer.render(canvas); + } + } + + @Override + public void updateBackgroundColor() { + // no selections + } + + @Override + public void setGestureDetector(GestureDetector gestureDetector) { + + } + + @Override + public void toggleSelected() { + // no selections + } + + @Override + public void setCell(DataCell cell) { + dataCell = cell; + } + + @Override + public DataCell getCell() { + return dataCell; + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniDotsChartRenderer.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniDotsChartRenderer.java new file mode 100644 index 00000000..6401e55c --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniDotsChartRenderer.java @@ -0,0 +1,52 @@ +package com.qliktrialreactnativestraighttable; + +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Rect; + +public class MiniDotsChartRenderer extends MiniChartRenderer{ + float dotRadius = 8.0f; + public MiniDotsChartRenderer(qMiniChart chartData, Representation representation) { + super(chartData, representation); + } + + @Override + public void render(Canvas canvas) { + dotRadius = Math.max(Math.min(8.0f, bandwidth / 2.0f), 2.0f); + float x = padding + (horizontalPadding / 2.0f); + paint.setColor(miniChartInfo.colors.main.color); + for(int i = 0; i < miniChartData.matrix.rows.size(); i++) { + float value = (float) miniChartData.matrix.rows.get(i).columns.get(1).qNum; + float height = value * scale; + float y = xAxis - height ; + setColor(i, value, miniChartData.matrix.rows.size()); + canvas.drawCircle(x, y, dotRadius, paint); + x += padding * 2.0f + bandwidth; + } + } + + public void renderColorValues(Canvas canvas) { + dotRadius = Math.max(Math.min(8.0f, bandwidth / 2.0f), 2.0f); + float x = padding + (horizontalPadding / 2.0f); + paint.setColor(miniChartInfo.colors.main.color); + for(int i = 0; i < miniChartData.matrix.rows.size(); i++) { + float value = (float) miniChartData.matrix.rows.get(i).columns.get(1).qNum; + float height = value * scale; + float y = xAxis - height ; + if(miniChartInfo.colors.max.valid && value == (float) miniChartData.qMax) { + paint.setColor(miniChartInfo.colors.max.color); + canvas.drawCircle(x, y, dotRadius, paint); + } else if(miniChartInfo.colors.min.valid && value == (float) miniChartData.qMin) { + paint.setColor(miniChartInfo.colors.min.color); + canvas.drawCircle(x, y, dotRadius, paint); + } else if(miniChartInfo.colors.first.valid && i == 0) { + paint.setColor(miniChartInfo.colors.first.color); + canvas.drawCircle(x, y, dotRadius, paint); + } else if(miniChartInfo.colors.last.valid && i == miniChartData.matrix.rows.size() - 1) { + paint.setColor(miniChartInfo.colors.last.color); + canvas.drawCircle(x, y, dotRadius, paint); + } + x += padding * 2.0f + bandwidth; + } + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniPosNegRenderer.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniPosNegRenderer.java new file mode 100644 index 00000000..429c94cf --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniPosNegRenderer.java @@ -0,0 +1,36 @@ +package com.qliktrialreactnativestraighttable; + +import android.graphics.Canvas; + +public class MiniPosNegRenderer extends MiniChartRenderer{ + public MiniPosNegRenderer(qMiniChart chartData, Representation representation) { + super(chartData, representation); + } + + @Override + public void render(Canvas canvas) { + float x = padding + (horizontalPadding / 2.0f); + float barHeight = (bounds.height() - (verticalPadding*2)) / 2.0f; + xAxis = bounds.height() / 2.0f; + for(int i = 0; i < miniChartData.matrix.rows.size(); i++) { + float value = (float) miniChartData.matrix.rows.get(i).columns.get(1).qNum; + float y = xAxis - barHeight ; + float b = xAxis; + if(value < 0) { + y += barHeight; + b = bounds.height() - verticalPadding; + } + setColor(value); + canvas.drawRect(x, y, x + bandwidth, b, paint); + x += padding * 2.0f + bandwidth; + } + } + + protected void setColor(float value) { + if(value < 0) { + paint.setColor(miniChartInfo.colors.negative.color); + } else { + paint.setColor(miniChartInfo.colors.positive.color); + } + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/MiniSparkLinesRenderer.java b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniSparkLinesRenderer.java new file mode 100644 index 00000000..7bec75c9 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/MiniSparkLinesRenderer.java @@ -0,0 +1,64 @@ +package com.qliktrialreactnativestraighttable; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; + +public class MiniSparkLinesRenderer extends MiniChartRenderer { + Path path = new Path(); + MiniDotsChartRenderer dots = null; + public MiniSparkLinesRenderer(qMiniChart chartData, Representation representation) { + super(chartData, representation); + dots = new MiniDotsChartRenderer(chartData, representation); + } + + @Override + public void render(Canvas canvas) { + float x = padding + (horizontalPadding / 2.0f); + paint.setColor(miniChartInfo.colors.main.color); + startPath(x, canvas); + + for(int i = 1; i < miniChartData.matrix.rows.size(); i++) { + float value = (float) miniChartData.matrix.rows.get(i).columns.get(1).qNum; + float height = value * scale; + float y = xAxis - height ; + float x2 = x + padding * 2.0f + bandwidth; + path.lineTo(x2, y); + x += padding * 2.0f + bandwidth; + } + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(2); + canvas.drawPath(path, paint); + if(miniChartInfo.showDots) { + dots.render(canvas); + } else { + dots.renderColorValues(canvas); + } + } + protected void startPath(float x, Canvas canvas) { + path.reset(); + + if(miniChartData.matrix.rows.size() > 0) { + float value = (float) miniChartData.matrix.rows.get(0).columns.get(1).qNum; + float height = value * scale; + float y = xAxis - height ; + path.moveTo(x, y); + } + } + + @Override + public void updateData(qMiniChart chartData, Representation representation) { + super.updateData(chartData, representation); + if(dots != null) { + dots.updateData(chartData, representation); + } + } + + public void resetScales(Rect bounds) { + super.resetScales(bounds); + if(dots != null) { + dots.resetScales(bounds); + } + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/Representation.java b/android/src/main/java/com/qliktrialreactnativestraighttable/Representation.java new file mode 100644 index 00000000..d19c3b05 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/Representation.java @@ -0,0 +1,25 @@ +package com.qliktrialreactnativestraighttable; + +import com.facebook.react.bridge.ReadableMap; + +public class Representation { + public String imageUrl; + public String imageSize; + public String imagePosition; + public String type; + public double globalMax = 0.0; + public double globalMin = 0.0; + public MiniChartInfo miniChart; + + Representation(ReadableMap data) { + type = data.getString("type"); + imageUrl = data.getString("imageUrl"); + imageSize = data.getString("imageSize"); + imagePosition = data.getString("imagePosition"); + imageSize = data.getString("imageSize"); + + globalMax = data.hasKey("globalMax") ? data.getDouble("globalMax") : 0.0; + globalMin = data.hasKey("globalMin") ? data.getDouble("globalMin") : 0.0; + miniChart = data.hasKey("miniChart") ? new MiniChartInfo(data.getMap("miniChart")) : null; + } +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/RowViewHolder.java b/android/src/main/java/com/qliktrialreactnativestraighttable/RowViewHolder.java index 9121502d..f89e384e 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/RowViewHolder.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/RowViewHolder.java @@ -36,7 +36,7 @@ public void setData(DataRow dataRow) { int columnIndex = cell.colIdx; DataColumn column = dataProvider.dataColumns.get(columnIndex); - if(column.type.equals("image")) { + if(column.representation.type.equals("image")) { ViewGroup wrapper = (ViewGroup) row.getChildAt(columnIndex); CellView cellView = (CellView) wrapper.getChildAt(0); ViewGroup.LayoutParams layout = cellView.getLayoutParams(); @@ -53,6 +53,10 @@ public void setData(DataRow dataRow) { imageView.setImageBitmap(imageBitmap); imageView.setSizing(column, imageBitmap); imageView.setAlignment(column); + } else if(column.representation.type.equals("miniChart")) { + ViewGroup wrapper = (ViewGroup) row.getChildAt(columnIndex); + MiniChartView miniChartView = (MiniChartView) wrapper.getChildAt(0); + miniChartView.setData(cell, column); } else { CellView cellView = (CellView) row.getChildAt(columnIndex); cellView.setData(cell); @@ -73,11 +77,11 @@ public void updateColumnRepresentation() { for(int i = 0; i < this.row.getChildCount(); i++) { DataColumn column = dataProvider.dataColumns.get(i); - if(column.type.equals("image")) { + if(column.representation.type.equals("image")) { RelativeLayout wrapper = (RelativeLayout) row.getChildAt(i); RelativeLayout container = (RelativeLayout) wrapper.getChildAt(0); ClickableImageView imageView = (ClickableImageView) container.getChildAt(0); - Bitmap imageBitmap = dataProvider.getImageData(column.imageUrl); + Bitmap imageBitmap = dataProvider.getImageData(column.representation.imageUrl); if(imageBitmap == null) { continue; } diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/SelectionsEngine.java b/android/src/main/java/com/qliktrialreactnativestraighttable/SelectionsEngine.java index 0d2e6676..f07145dc 100644 --- a/android/src/main/java/com/qliktrialreactnativestraighttable/SelectionsEngine.java +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/SelectionsEngine.java @@ -2,6 +2,7 @@ import android.util.Log; import android.view.View; +import android.widget.FrameLayout; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.WritableArray; @@ -45,7 +46,8 @@ public void selectionsChanged(CustomHorizontalScrollView contextView, String s) array.pushString(selectionsString); } args.putArray("selections", array); - EventUtils.sendEventToJSFromView(contextView, "onSelectionsChanged", args); + FrameLayout parent = (FrameLayout) contextView.getParent(); + EventUtils.sendEventToJSFromView(parent, "onSelectionsChanged", args); } public void clearSelections() { diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/qMatrix.java b/android/src/main/java/com/qliktrialreactnativestraighttable/qMatrix.java new file mode 100644 index 00000000..8bd8fe02 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/qMatrix.java @@ -0,0 +1,45 @@ +package com.qliktrialreactnativestraighttable; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableType; + +import java.util.ArrayList; +import java.util.List; + +public class qMatrix { + public List rows = new ArrayList<>(); + + class qMatrixColumn { + public double qElemNumber; + public double qNum = 0.0; + public String qText; + public qMatrixColumn(ReadableMap data) { + qElemNumber = data.hasKey("qElemNumber") ? data.getDouble("qElemNumber") : 0.0; + if(data.hasKey("qNum")) { + ReadableType rt = data.getType("qNum"); + if(rt == ReadableType.Number) { + qNum = data.getDouble("qNum"); + } + } + qText = data.hasKey("qText") ? data.getString("qText") : ""; + } + } + + class qMatrixRow { + public List columns = new ArrayList<>(); + public qMatrixRow(ReadableArray dataArray) { + for(int i = 0; i < dataArray.size(); i++) { + columns.add(new qMatrixColumn(dataArray.getMap(i))); + } + } + } + + public qMatrix(ReadableArray dataArray) { + for(int i = 0; i < dataArray.size(); i++) { + ReadableArray da = dataArray.getArray(i); + rows.add(new qMatrixRow(da)); + } + } + +} diff --git a/android/src/main/java/com/qliktrialreactnativestraighttable/qMiniChart.java b/android/src/main/java/com/qliktrialreactnativestraighttable/qMiniChart.java new file mode 100644 index 00000000..65134b05 --- /dev/null +++ b/android/src/main/java/com/qliktrialreactnativestraighttable/qMiniChart.java @@ -0,0 +1,18 @@ +package com.qliktrialreactnativestraighttable; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; + +public class qMiniChart { + public double qMin; + public double qMax; + public qMatrix matrix; + public qMiniChart(ReadableMap data) { + qMin = data.hasKey("qMin") ? data.getDouble("qMin") : 0.0; + qMax = data.hasKey("qMax") ? data.getDouble("qMax") : 0.0; + ReadableArray dataArray = data.hasKey("qMatrix") ? data.getArray("qMatrix") : null; + if(dataArray != null) { + matrix = new qMatrix(dataArray); + } + } +}