Files
loongoffice/android/source/src/java/org/libreoffice/overlay/CalcHeadersController.java
Christian Lohmaier d67358d05c lint: remove redundant type casts (findViewById to object of type)
Change-Id: I0ec35ea5817d110ca20942ce9d95e0120848580a
2017-09-24 13:58:16 +02:00

232 lines
11 KiB
Java

package org.libreoffice.overlay;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.RectF;
import android.graphics.drawable.ColorDrawable;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupWindow;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.libreoffice.LOEvent;
import org.libreoffice.LOKitShell;
import org.libreoffice.LibreOfficeMainActivity;
import org.libreoffice.R;
import org.mozilla.gecko.gfx.LayerView;
import java.util.ArrayList;
import static org.libreoffice.UnitConverter.twipToPixel;
public class CalcHeadersController {
private static final String LOGTAG = CalcHeadersController.class.getSimpleName();
private final CalcHeadersView mCalcRowHeadersView;
private final CalcHeadersView mCalcColumnHeadersView;
private LibreOfficeMainActivity mContext;
public CalcHeadersController(LibreOfficeMainActivity context, LayerView layerView) {
mContext = context;
mContext.getDocumentOverlay().setCalcHeadersController(this);
mCalcRowHeadersView = context.findViewById(R.id.calc_header_row);
mCalcColumnHeadersView = context.findViewById(R.id.calc_header_column);
if (mCalcColumnHeadersView == null || mCalcRowHeadersView == null) {
Log.e(LOGTAG, "Failed to initialize Calc headers - View is null");
} else {
mCalcRowHeadersView.initialize(layerView, true);
mCalcColumnHeadersView.initialize(layerView, false);
}
LOKitShell.sendEvent(new LOEvent(LOEvent.UPDATE_CALC_HEADERS));
context.findViewById(R.id.calc_header_top_left).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LOKitShell.sendEvent(new LOEvent(LOEvent.UNO_COMMAND, ".uno:SelectAll"));
if (mCalcColumnHeadersView == null) return;
mCalcColumnHeadersView.showHeaderPopup(new PointF());
}
});
}
public void setupHeaderPopupView() {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
String[] rowOrColumn = {"Row","Column"};
CalcHeadersView[] headersViews= {mCalcRowHeadersView, mCalcColumnHeadersView};
for (int i = 0; i < rowOrColumn.length; i++) {
// create popup window
final String tempName = rowOrColumn[i];
final CalcHeadersView tempView = headersViews[i];
final View headerPopupView = inflater.inflate(R.layout.calc_header_popup, null);
final PopupWindow popupWindow = new PopupWindow(headerPopupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
headerPopupView.findViewById(R.id.calc_header_popup_optimal_length_dialog).setVisibility(View.GONE);
popupWindow.setFocusable(false);
}
});
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new ColorDrawable());
popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
tempView.setHeaderPopupWindow(popupWindow);
// set up child views in the popup window
headerPopupView.findViewById(R.id.calc_header_popup_insert).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LOKitShell.sendEvent(new LOEvent(LOEvent.UNO_COMMAND, ".uno:Insert"+tempName+"s"));
tempView.dismissPopupWindow();
mContext.setDocumentChanged(true);
}
});
headerPopupView.findViewById(R.id.calc_header_popup_delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LOKitShell.sendEvent(new LOEvent(LOEvent.UNO_COMMAND, ".uno:Delete"+tempName+"s"));
tempView.dismissPopupWindow();
mContext.setDocumentChanged(true);
}
});
headerPopupView.findViewById(R.id.calc_header_popup_hide).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LOKitShell.sendEvent(new LOEvent(LOEvent.UNO_COMMAND, ".uno:Hide"+tempName));
tempView.dismissPopupWindow();
mContext.setDocumentChanged(true);
}
});
headerPopupView.findViewById(R.id.calc_header_popup_show).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LOKitShell.sendEvent(new LOEvent(LOEvent.UNO_COMMAND, ".uno:Show"+tempName));
tempView.dismissPopupWindow();
mContext.setDocumentChanged(true);
}
});
headerPopupView.findViewById(R.id.calc_header_popup_optimal_length).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = headerPopupView.findViewById(R.id.calc_header_popup_optimal_length_dialog);
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.GONE);
popupWindow.setFocusable(false);
popupWindow.update();
} else {
popupWindow.dismiss();
view.setVisibility(View.VISIBLE);
popupWindow.setFocusable(true);
popupWindow.showAtLocation(tempView, Gravity.CENTER, 0, 0);
LOKitShell.getMainHandler().post(new Runnable() {
@Override
public void run() {
Snackbar.make(tempView, R.string.calc_alert_double_click_optimal_length, Snackbar.LENGTH_LONG).show();
}
});
}
}
});
headerPopupView.findViewById(R.id.calc_header_popup_optimal_length_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = ((EditText)headerPopupView.findViewById(R.id.calc_header_popup_optimal_length_text)).getText().toString();
tempView.sendOptimalLengthRequest(text);
tempView.dismissPopupWindow();
mContext.setDocumentChanged(true);
}
});
headerPopupView.findViewById(R.id.calc_header_popup_adjust_length).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mContext.getDocumentOverlay().showAdjustLengthLine(tempView == mCalcRowHeadersView, tempView);
tempView.dismissPopupWindow();
mContext.setDocumentChanged(true);
}
});
((Button)headerPopupView.findViewById(R.id.calc_header_popup_adjust_length))
.setText(tempView == mCalcRowHeadersView ? R.string.calc_adjust_height : R.string.calc_adjust_width);
((Button)headerPopupView.findViewById(R.id.calc_header_popup_optimal_length))
.setText(tempView == mCalcRowHeadersView ? R.string.calc_optimal_height : R.string.calc_optimal_width);
}
}
public void setHeaders(String headers) {
HeaderInfo parsedHeaders = parseHeaderInfo(headers);
if (parsedHeaders != null) {
mCalcRowHeadersView.setHeaders(parsedHeaders.rowLabels, parsedHeaders.rowDimens);
mCalcColumnHeadersView.setHeaders(parsedHeaders.columnLabels, parsedHeaders.columnDimens);
showHeaders();
} else {
Log.e(LOGTAG, "Parse header info JSON failed.");
}
}
public void showHeaders() {
LOKitShell.getMainHandler().post(new Runnable() {
@Override
public void run() {
mCalcColumnHeadersView.invalidate();
mCalcRowHeadersView.invalidate();
}
});
}
private HeaderInfo parseHeaderInfo(String headers) {
HeaderInfo headerInfo = new HeaderInfo();
try {
JSONObject collectiveResult = new JSONObject(headers);
JSONArray rowResult = collectiveResult.getJSONArray("rows");
for (int i = 0; i < rowResult.length(); i++) {
headerInfo.rowLabels.add(rowResult.getJSONObject(i).getString("text"));
headerInfo.rowDimens.add(twipToPixel(rowResult.getJSONObject(i).getLong("size"), LOKitShell.getDpi(mContext)));
}
JSONArray columnResult = collectiveResult.getJSONArray("columns");
for (int i = 0; i < columnResult.length(); i++) {
headerInfo.columnLabels.add(columnResult.getJSONObject(i).getString("text"));
headerInfo.columnDimens.add(twipToPixel(columnResult.getJSONObject(i).getLong("size"), LOKitShell.getDpi(mContext)));
}
return headerInfo;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
public void showHeaderSelection(RectF cellCursorRect) {
mCalcRowHeadersView.setHeaderSelection(cellCursorRect);
mCalcColumnHeadersView.setHeaderSelection(cellCursorRect);
showHeaders();
}
public void setPendingRowOrColumnSelectionToShowUp(boolean b) {
mCalcRowHeadersView.setPendingRowOrColumnSelectionToShowUp(b);
mCalcColumnHeadersView.setPendingRowOrColumnSelectionToShowUp(b);
}
public boolean pendingRowOrColumnSelectionToShowUp() {
return mCalcColumnHeadersView.pendingRowOrColumnSelectionToShowUp()
|| mCalcRowHeadersView.pendingRowOrColumnSelectionToShowUp();
}
private class HeaderInfo {
ArrayList<String> rowLabels;
ArrayList<Float> rowDimens;
ArrayList<String> columnLabels;
ArrayList<Float> columnDimens;
private HeaderInfo() {
rowLabels = new ArrayList<String>();
rowDimens = new ArrayList<Float>();
columnDimens = new ArrayList<Float>();
columnLabels = new ArrayList<String>();
}
}
}