Calculator.java revision e2092454e13850c551550db9879fa4fa93218c75
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.calculator2; 18 19import android.app.Activity; 20import android.os.Bundle; 21import android.util.Log; 22import android.util.Config; 23import android.util.TypedValue; 24import android.view.Display; 25import android.view.Menu; 26import android.view.MenuItem; 27import android.view.View; 28import android.view.KeyEvent; 29import android.widget.Button; 30import android.widget.TextView; 31 32public class Calculator extends Activity implements PanelSwitcher.Listener { 33 EventListener mListener = new EventListener(); 34 private CalculatorDisplay mDisplay; 35 private Persist mPersist; 36 private History mHistory; 37 private Logic mLogic; 38 private PanelSwitcher mPanelSwitcher; 39 40 private static final int CMD_CLEAR_HISTORY = 1; 41 private static final int CMD_BASIC_PANEL = 2; 42 private static final int CMD_ADVANCED_PANEL = 3; 43 44 private static final int HVGA_WIDTH_PIXELS = 320; 45 46 static final int BASIC_PANEL = 0; 47 static final int ADVANCED_PANEL = 1; 48 49 private static final String LOG_TAG = "Calculator"; 50 private static final boolean DEBUG = false; 51 private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV; 52 private static final String STATE_CURRENT_VIEW = "state-current-view"; 53 54 @Override 55 public void onCreate(Bundle state) { 56 super.onCreate(state); 57 58 setContentView(R.layout.main); 59 60 mPersist = new Persist(this); 61 mHistory = mPersist.history; 62 63 mDisplay = (CalculatorDisplay) findViewById(R.id.display); 64 65 mLogic = new Logic(this, mHistory, mDisplay, (Button) findViewById(R.id.equal)); 66 HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic); 67 mHistory.setObserver(historyAdapter); 68 69 mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch); 70 if (mPanelSwitcher != null) { 71 mPanelSwitcher.setCurrentIndex(state==null ? 0 : state.getInt(STATE_CURRENT_VIEW, 0)); 72 mPanelSwitcher.setListener(this); 73 } 74 75 mListener.setHandler(mLogic, mPanelSwitcher); 76 mDisplay.setOnKeyListener(mListener); 77 78 setOnClickListener(R.id.digit0); 79 setOnClickListener(R.id.digit1); 80 setOnClickListener(R.id.digit2); 81 setOnClickListener(R.id.digit3); 82 setOnClickListener(R.id.digit4); 83 setOnClickListener(R.id.digit5); 84 setOnClickListener(R.id.digit6); 85 setOnClickListener(R.id.digit7); 86 setOnClickListener(R.id.digit8); 87 setOnClickListener(R.id.digit9); 88 setOnClickListener(R.id.dot); 89 90 setOnClickListener(R.id.plus); 91 setOnClickListener(R.id.minus); 92 setOnClickListener(R.id.div); 93 setOnClickListener(R.id.mul); 94 setOnClickListener(R.id.leftParen); 95 setOnClickListener(R.id.rightParen); 96 setOnClickListener(R.id.equal); 97 98 setOnClickListener(R.id.sin); 99 setOnClickListener(R.id.ln); 100 setOnClickListener(R.id.cos); 101 setOnClickListener(R.id.lg); 102 setOnClickListener(R.id.tan); 103 setOnClickListener(R.id.e); 104 setOnClickListener(R.id.pi); 105 setOnClickListener(R.id.power); 106 setOnClickListener(R.id.factorial); 107 setOnClickListener(R.id.sqrt); 108 109 View view; 110 if ((view = findViewById(R.id.del)) != null) { 111// view.setOnClickListener(mListener); 112 view.setOnLongClickListener(mListener); 113 } 114 /* 115 if ((view = findViewById(R.id.clear)) != null) { 116 view.setOnClickListener(mListener); 117 } 118 */ 119 } 120 121 private void setOnClickListener(int id) { 122 findViewById(id).setOnClickListener(mListener); 123 } 124 125 @Override 126 public boolean onCreateOptionsMenu(Menu menu) { 127 super.onCreateOptionsMenu(menu); 128 MenuItem item; 129 130 item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history); 131 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 132 item.setIcon(R.drawable.clear_history); 133 134 item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced); 135 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 136 item.setIcon(R.drawable.advanced); 137 138 item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic); 139 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 140 item.setIcon(R.drawable.simple); 141 142 return true; 143 } 144 145 @Override 146 public boolean onPrepareOptionsMenu(Menu menu) { 147 super.onPrepareOptionsMenu(menu); 148 menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null && 149 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL); 150 151 menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null && 152 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL); 153 154 return true; 155 } 156 157 @Override 158 public boolean onOptionsItemSelected(MenuItem item) { 159 switch (item.getItemId()) { 160 case CMD_CLEAR_HISTORY: 161 mHistory.clear(); 162 break; 163 164 case CMD_BASIC_PANEL: 165 if (mPanelSwitcher != null && 166 mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) { 167 mPanelSwitcher.moveRight(); 168 } 169 break; 170 171 case CMD_ADVANCED_PANEL: 172 if (mPanelSwitcher != null && 173 mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) { 174 mPanelSwitcher.moveLeft(); 175 } 176 break; 177 } 178 return super.onOptionsItemSelected(item); 179 } 180 181 @Override 182 protected void onSaveInstanceState(Bundle state) { 183 super.onSaveInstanceState(state); 184 if (mPanelSwitcher != null) { 185 state.putInt(STATE_CURRENT_VIEW, mPanelSwitcher.getCurrentIndex()); 186 } 187 } 188 189 @Override 190 public void onPause() { 191 super.onPause(); 192 mLogic.updateHistory(); 193 mPersist.save(); 194 } 195 196 @Override 197 public boolean onKeyDown(int keyCode, KeyEvent keyEvent) { 198 if (keyCode == KeyEvent.KEYCODE_BACK 199 && mPanelSwitcher != null && mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) { 200 mPanelSwitcher.moveRight(); 201 return true; 202 } else { 203 return super.onKeyDown(keyCode, keyEvent); 204 } 205 } 206 207 static void log(String message) { 208 if (LOG_ENABLED) { 209 Log.v(LOG_TAG, message); 210 } 211 } 212 213 /** 214 * The font sizes in the layout files are specified for a HVGA display. 215 * Adjust the font sizes accordingly if we are running on a different 216 * display. 217 */ 218 public void adjustFontSize(TextView view) { 219 float fontPixelSize = view.getTextSize(); 220 Display display = getWindowManager().getDefaultDisplay(); 221 int h = Math.min(display.getWidth(), display.getHeight()); 222 float ratio = (float)h/HVGA_WIDTH_PIXELS; 223 view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio); 224 } 225 226 @Override 227 public void onChange() { 228 invalidateOptionsMenu(); 229 } 230} 231