[go: up one dir, main page]

JP4934045B2 - 携帯電話の対話型画像生成 - Google Patents

携帯電話の対話型画像生成 Download PDF

Info

Publication number
JP4934045B2
JP4934045B2 JP2007534980A JP2007534980A JP4934045B2 JP 4934045 B2 JP4934045 B2 JP 4934045B2 JP 2007534980 A JP2007534980 A JP 2007534980A JP 2007534980 A JP2007534980 A JP 2007534980A JP 4934045 B2 JP4934045 B2 JP 4934045B2
Authority
JP
Japan
Prior art keywords
ipprojectmanager
display
itopleft
iclientrect
map
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
JP2007534980A
Other languages
English (en)
Other versions
JP2008516482A (ja
Inventor
チギール,ルシアン
ピートライキー,イーホル
オパラ,アンドリュー
Original Assignee
バータンヴァ ドリオ データ,エル.エル.シー.
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by バータンヴァ ドリオ データ,エル.エル.シー. filed Critical バータンヴァ ドリオ データ,エル.エル.シー.
Publication of JP2008516482A publication Critical patent/JP2008516482A/ja
Application granted granted Critical
Publication of JP4934045B2 publication Critical patent/JP4934045B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/01Input arrangements or combined input and output arrangements for interaction between user and computer
    • G06F3/011Arrangements for interaction with the human body, e.g. for user immersion in virtual reality
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/01Input arrangements or combined input and output arrangements for interaction between user and computer
    • G06F3/048Interaction techniques based on graphical user interfaces [GUI]
    • G06F3/0481Interaction techniques based on graphical user interfaces [GUI] based on specific properties of the displayed interaction object or a metaphor-based environment, e.g. interaction with desktop elements like windows or icons, or assisted by a cursor's changing behaviour or appearance
    • G06F3/04817Interaction techniques based on graphical user interfaces [GUI] based on specific properties of the displayed interaction object or a metaphor-based environment, e.g. interaction with desktop elements like windows or icons, or assisted by a cursor's changing behaviour or appearance using icons
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/01Input arrangements or combined input and output arrangements for interaction between user and computer
    • G06F3/048Interaction techniques based on graphical user interfaces [GUI]
    • G06F3/0484Interaction techniques based on graphical user interfaces [GUI] for the control of specific functions or operations, e.g. selecting or manipulating an object, an image or a displayed text element, setting a parameter value or selecting a range
    • G06F3/0485Scrolling or panning
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04BTRANSMISSION
    • H04B1/00Details of transmission systems, not covered by a single one of groups H04B3/00 - H04B13/00; Details of transmission systems not characterised by the medium used for transmission
    • H04B1/38Transceivers, i.e. devices in which transmitter and receiver form a structural unit and in which at least one part is used for functions of transmitting and receiving
    • H04B1/3827Portable transceivers
    • H04B1/3833Hand-held transceivers
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M1/00Substation equipment, e.g. for use by subscribers
    • H04M1/72Mobile telephones; Cordless telephones, i.e. devices for establishing wireless links to base stations without route selection
    • H04M1/724User interfaces specially adapted for cordless or mobile telephones
    • H04M1/72403User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality
    • H04M1/72427User interfaces specially adapted for cordless or mobile telephones with means for local support of applications that increase the functionality for supporting games or graphical animations
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04MTELEPHONIC COMMUNICATION
    • H04M1/00Substation equipment, e.g. for use by subscribers
    • H04M1/72Mobile telephones; Cordless telephones, i.e. devices for establishing wireless links to base stations without route selection
    • H04M1/724User interfaces specially adapted for cordless or mobile telephones
    • H04M1/72469User interfaces specially adapted for cordless or mobile telephones for operating the device by selecting functions from two or more displayed items, e.g. menus or icons

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Signal Processing (AREA)
  • User Interface Of Digital Computer (AREA)
  • Mobile Radio Communication Systems (AREA)
  • Telephone Function (AREA)
  • Processing Or Creating Images (AREA)
  • Telephonic Communication Services (AREA)

Description

本発明は、画像を表示する携帯電話に関する。
携帯電話上のカラーディスプレイと、ソフトウェアアプリケーションを開発するオペレーティングシステムの出現により、デジタル画像は多様なアプリケーションにおいて携帯電話で使用されている。画像の美的価値はさておき、情報という観点からは、デジタル画像は、小さな携帯電話のディスプレイでテキストが伝達できるよりも遥かに大量の情報を伝達する。1つの絵は千語に値する。例えば、ある場所から別の場所へ行くための道順を見つけたいと望んでいる携帯電話のユーザーを考えてみると、地図の画像はテキストによる記述よりもはるかに大量の情報を伝達する。
今日では、多くの携帯電話はユーザーと、メニュー駆動のテキスト選択で対話する。そのようなインタフェースは面倒であり、各段階がキーの押下またはライトペンのタップを含む、ユーザー選択の多数の段階がしばしば含まれる。画像の使用は、インタフェースの簡略化および加速化という優位点を有する。
このように、携帯電話のユーザーが所望する情報を簡単かつ迅速な方法で見つけることを可能にする、直感的かつ美的なユーザーインターフェースを有する対話型画像生成アプリケーションが必要とされている。
本発明は、携帯電話上での対話型画像生成の方法およびシステムを提供する。本発明を使用すれば、携帯電話は、ユーザーが種々のサイトの仮想ツアーを対話的に見ることができ、また「ホットスポット」により1つのツアーから別のツアーへジャンプすることができるソフトウェアまたはハードウェアを動作させることができる。ホットスポットは、仮想ツアー内のアクティブ領域であり、ユーザーはアクティブ領域に固有の仮想ツアーへジャンプするためにホットスポットを起動できる。例えば、ユーザーは、市街地図内に位置するサイトのホットスポットを起動することにより、市街地図から、関心対象のサイトの仮想ツアーへジャンプできる。更に、本発明の好適な実施形態によれば、ホットスポットを、ダイヤル機能のような、携帯電話の機能を自動的に起動するために使用できる。例えば、あるサイトの仮想ツアーを見ているユーザーは、仮想ツアー内のホットスポットを起動することにより、そのサイトのオフィスへ自動的に電話をかけることができる。
本発明は好ましくは、仮想ツアー内に3つの表示画像を設ける。それは(i)地図表示画像(map view)と、(ii)「目の視点での表示画像(eye view)」と、(iii)メタ表示画像(meta-view)である。好ましくは、地図表示画像は、仮想ツアーの全体地図を示し、ユーザーはそれにより仮想ツアーが現在どこに位置しているかを知ることができる。好ましくは、目の視点での表示画像は、全体地図内に位置するあるサイトのパノラマシーンを示す。目の視点での表示画像はまた、サイトのより精細で詳細な地図も示すことができる。好ましくは、メタ表示画像は、仮想ツアーを行っているサイトを記述する情報テキストを示す。ユーザーは、携帯電話上の特定のキーを押すことにより、またはライトペンでディスプレイの領域をタップすることによりこれら3つの表示画像を切替えることができる。
このように、本発明は、携帯電話のディスプレイに表示された対話型仮想ツアー内のホットスポットに、携帯電話の機能を自動的にリンクする機能を提供するということは理解されよう。
本発明の好適な実施形態によれば、携帯電話のディスプレイに画像を表示することと、ユーザーが携帯電話の入力装置を使用してディスプレイのアクティブ領域を選択したことを検知することと、そのディスプレイのアクティブ領域に対応する携帯電話の機能を自動的に起動することとを含む、携帯電話上の対話型画像生成の方法がこのように提供される。
本発明の好適な実施形態によれば、携帯電話上に収納され、画像を表示するディスプレイと、携帯電話の内部に収納され、ディスプレイに結合され、ユーザーが携帯電話の入力装置を使用してディスプレイのアクティブ領域を選択したことを検知し、そのディスプレイのアクティブ領域に対応する携帯電話の機能を自動的に起動するプロセッサと、から成る携帯電話を含む対話型画像生成のシステムが更に提供される。
本発明の好適な実施形態によれば、コンピュータに、携帯電話のディスプレイに画像を表示するステップと、ユーザーが携帯電話の入力装置を使用してディスプレイのアクティブ領域を選択したことを検知するステップと、そのディスプレイのアクティブ領域に対応する携帯電話の機能を自動的に起動するステップと、を実行させるプログラムコードを格納するコンピュータ読み取り可能記憶媒体が更に提供される。
本発明の好適な実施形態によれば、携帯電話が現在インターネットに接続されているか否かを判断することと、接続されていれば、サーバーコンピュータに画像データを要求し、要求した画像データを受信し、携帯電話に格納されたローカル画像データと要求した画像データに基づいて携帯電話のディスプレイに画像を表示し、接続されていなければ、携帯電話に格納されたローカル画像データに基づいて携帯電話のディスプレイに画像を表示することと、ユーザーが携帯電話の入力装置を使用してディスプレイのアクティブ領域を選択したことを検知することと、そのディスプレイのアクティブ領域に対応する携帯電話の機能を自動的に起動することと、を含む携帯電話上の対話型画像生成の方法が更に提供される。
本発明の好適な実施形態によれば、携帯電話内に収納され、携帯電話が現在インターネットに接続されているか否かを判断する接続検出器と、携帯電話内に収納され、サーバーコンピュータから画像データを要求する送信機と、携帯電話内に収納され、要求した画像データを受信する受信機と、携帯電話に格納されたローカル画像データと要求した画像データを使用して画像を表示する携帯電話上のディスプレイと、接続検出器と、送信機と、受信機と、ディスプレイに結合され、ユーザーが携帯電話の入力装置を使用してディスプレイのアクティブ領域を選択したことを検出し、そのディスプレイのアクティブ領域に対応する携帯電話の機能を自動的に起動するための、携帯電話内のプロセッサと、から成る携帯電話を含む、携帯電話上の対話型画像生成のシステムが追加的に提供される。
プログラムコードを格納するコンピュータ読み取り可能記憶媒体であり、プログラムコードはコンピュータに、携帯電話が現在インターネットに接続されているか否かを判断するステップと、接続されていれば、サーバーコンピュータから画像データを要求し、要求した画像データを受信し、携帯電話に格納されたローカル画像データと、要求した画像データに基づいて携帯電話のディスプレイに画像を表示し、接続されていなければ、携帯電話に格納されたローカル画像データに基づいて携帯電話のディスプレイに画像を表示するステップと、ユーザーが携帯電話の入力装置を使用してディスプレイのアクティブ領域を選択したことを検知するステップと、そのディスプレイのアクティブ領域に対応する携帯電話の機能を自動的に起動するステップと、を実行させるコンピュータ読み取り可能記憶媒体。
本発明は、携帯電話上の対話型画像生成の方法とシステムに関する。
本発明は好ましくは、中央処理装置、プログラムとデータを格納するメモリ装置、キーパッド、およびディスプレイを含む携帯電話内で実現される。好ましくは、中央処理装置、メモリ装置、およびキーパッドとディスプレイのデバイスドライバは、従来のデータバスを使用して通信可能に結合される。好ましくは、中央処理装置はシンビアン(Symbian)OSのようなオペレーティングシステムを実行する。
図1A〜図2G(図1〜図2−4)は、ノキア(Nokia)の携帯電話内の本発明の動作を示す。
ここで図1Aを参照すると、キーパッド110と、コントロールボタンと、カラーディスプレイ120を含むノキアシリーズ(Nokia Series)60スマート携帯電話100が示されている。キーパッド110は10個の数字1〜0の従来のボタンと、「*」と「#」のボタンを含む。コントロールボタンは、4個の方向ボタン130、「OK」ボタン140、およびディスプレイ120の左下と右下に現れるコマンドを起動するためのボタン150を含む。当業者には、画面のタップ用のライトペンなど、他の入力装置もまた、キーボード110とボタン130、140、および150の代わりに、またはそれらと共に使用できるということは理解されよう。そのような入力装置は、例えば、ソニーエリクソン(Sony Ericsson)携帯電話に装備されている。
携帯電話100が起動すると、電話にロードされた種々のアプリケーション用のアイコン160がディスプレイ130に現れる。現在選択されているアプリケーションは、それを取り囲むボックス枠170により特定される。
ユーザーは、方向ボタン130を押すことにより種々のアイコン間を移動できる。ユーザーは、OKボタン140を押すことにより選択されたアプリケーションを始動できる。
そのような1つのアイコン160は、本発明の好適な実施形態に従う「アイシービュー(iSeeVU)」という名称の対話型画像生成アプリケーション用である。アイシービューが始動されると、図1Bに示すように、地図のリストがディスプレイ120に現れる。各地図は以下に記述するように、1つ以上のサイトの仮想ツアーである。
現在選択されている地図は斜線の入ったテキストにより示される。ユーザーは、上下方向ボタン130を押すことにより地図のリスト間を上下に移動でき、「OK」ボタンを押すことにより現在選択されている地図を起動できる。
ここで図2Aを参照すると、ディスプレイ120にパディントン(Paddington)の仮想ツアー用の地図が現された携帯電話100が示されている。パディントン地図は、ディスプレイ120の表示領域よりも大きいが、4個の方向ボタン130を使用して左右上下に移動することができる。
パディントン地図内には、「ホットスポット」と称される、正方形のアイコンで示されるアクティブ領域205がある。以下に記述するように、ユーザーがホットスポットを起動すると、仮想ツアーは1つの表示から別の表示にジャンプする。現在使用中のホットスポット210は、二重線の太い境界線215で指定されている。図2Aに示す図では、パディントン駅のホットスポットが、現在使用中のホットスポットである。これはまた、ディスプレイ120の上部の記述220によっても明白となる。好ましくは、ユーザーは、「*」キーを押すことにより1つのホットスポットから別のホットスポットに移動し、ユーザーは、「OK」ボタンを押すことにより現在選択されているホットスポットを起動する。
ここで図2Bを参照すると、ディスプレイ120の上部に「聖マリー病院(St. Mary's Hospital)」と記載されている、現在選択されている別のホットスポット225が示されている。ホットスポット225は、パディントンの地図において、プリードストリート(Praed Street)とノーフォーク(Norfolk)の交差点に位置している。
ユーザーが「OK」ボタンを押すことによりホットスポット225を起動すると、仮想ツアーは、図2Cに示すように、プリードストリートにある聖マリー病院のパノラマシーンへジャンプする。地図表示画像から、「目の視点による表示画像(Eye View)」と称されるパノラマシーンへの切替えはまた、タブ230と235によっても示されている。好ましくは、ユーザーはキーパッド110上の「1」キーを押すことにより、地図表示画像とパノラマシーンを切替えることができる。実際は、図2Fを参照して下記に記述するように、ユーザーが選択できる「メタ表示画像(Meta View)」と称される第3の表示画像があり、ユーザーはこの3つすべての表示画像間で切替えることができる。
聖マリー病院のパノラマシーンはディスプレイ120に収まりきれないほど大きい。好ましくは、ユーザーは、携帯電話上の方向ボタンを押すことにより、パノラマ内を移動できる。図2Dを参照すると、ユーザーが左方向矢印を押したときの聖マリー病院の表示画像が示されている。図2Cと図2Dの間でパノラマが移動した距離は、ホットスポット240により明白である。図2Cにおいて、ホットスポット240は、ディスプレイ120の中心近くに位置しており、図2Dでは、ホットスポット240は、右に移動している。
図2Aのパディントン駅に戻って、ユーザーがホットスポット210を起動したとき、仮想ツアーは、図2Eに示されるパディントン駅のパノラマ画像にジャンプする。図2Eには、ディスプレイ120の上部に「メタ/一般情報(META/General Information)」と記述されたホットスポット245が示されている。ホットスポット245は、情報ホットスポットである。ユーザーがホットスポット245を起動すると、表示画像は、図2Fに図示されまたタブ235と250に示されるように、目の視点による表示画像からメタ表示画像に切替わる。図2Fには、メタデータと称される、パディントン駅に関する情報テキストが示されている。この情報の下には、パディントン駅に関連する種々のサービスを呼出すための電話ホットスポット255がある。好ましくは、ユーザーは「*」キーを押すことにより電話ホットスポット間を移動する。現在選択されている電話ホットスポット260は、それを囲む正方形の枠265により示されている。ユーザーは、「OK」ボタンを押すことにより選択されている電話ホットスポットを起動する。
ここで図2Gを参照するが、この画面はユーザーが「テームズトレイン(Thames Trains)」ホットスポットを起動した後に現れる。テームズトレインの電話番号はディスプレイ120に現れる。ユーザーが左ボタン150を押して「Yes」を選択すると、携帯電話100は自動的にその電話番号をダイヤルする。
ここで図3A〜図3Hを参照すると、ロンドン(London)の仮想ツアーが示されている。そのような仮想ツアーは、ユーザーが、図1Bに示される地図のリストから「ロンドン」を選択して「OK」ボタンを押すと起動される。
図3Aには、携帯電話100の上部の記述320に示されるように、グレーターロンドン(Greater London)に対して現在選択されているホットスポット310を伴うロンドンの地図が示されている。右移動方向ボタン130を押すことにより、地図は右に移動する。地図の移動は、図3Aにおけるホットスポット310の位置を、図3Bの位置と比較することにより明白である。
ユーザーが「OK」ボタン140を押すことによりホットスポット310を起動すると、仮想ツアーは、ロンドンの地図表示画像(Map View)から、図3Cに示すグレーターロンドンの目の視点による表示画像(Eye View)にジャンプする。図3Cの地図は種々のホットスポット330を含み、現在選択されているホットスポット340は、ワーテルロー(Waterloo)の地図へのジャンプ用である。
ユーザーが「OK」ボタンを押すことによりホットスポット340を起動すると、仮想ツアーはグレーターロンドンの目の視点による表示画像(Eye View)から図3Dに示されるワーテルローの目の視点による表示画像(Eye View)へジャンプする。今度は、ワーテルローの地図はゴールデンジュビリーブリッジ(Golden Jubilee Bridge)へジャンプするためのホットスポット350を含む。
ユーザーが「OK」ボタン140を押すことによりホットスポット350を起動すると、仮想ツアーは図3Eに示されるゴールデンジュビリーブリッジのパノラマシーンにジャンプする。パノラマシーンは、ワーテルロー地図にジャンプして戻るためのホットスポット360を含む。ユーザーは、方向ボタン130を押すことによりパノラマ画像間を移動する。ユーザーはまた、「*」を押すことによりホットスポット間を移動することもできる。図3Fは、図3Eに示された区域から約90°回転した、メタデータホットスポット370を含むパノラマシーンの区域を示している。
ユーザーが「OK」ボタン140を押すことによりホットスポット370を起動すると、図3Gに示される情報テキストがディスプレイに現れる。図3Gには電話ホットスポット380が示され、ユーザーは「OK」ボタン140を押すことによりそれを起動できる。ユーザーがホットスポット380を起動すると、図3Hのように電話番号が表示され、ユーザーは左ボタン150を押すことによりディスプレイ上の左下にある「Yes」コマンドを選択する。これに応答して、携帯電話100は、表示された電話番号を自動的にダイヤルする。
本発明は好ましくは、ホットスポットが起動されたときに、ホットスポットの領域と取るべき行動を規定するXML文書を介して実現される。ここで、本発明の好適な実施形態による、図2A〜図2Gに示されたパディントンの仮想ツアーを実現するために使用されるXML文書のリストである付録A1を参照する。リストから分かるように、ImageFileのタグは、図4Aに示されるJPEG画像Paddington_map.jpgを参照する。なお、画像はその中に埋め込まれたホットスポットのアイコンを有している。
付録Aにおけるリストはまた、複数のホットスポットを含む。ユーザーが携帯電話の「*」キーを押すといつでも、ホットスポットを進めることになる。各ホットスポットは、(i)正規化された座標に基づく、ディスプレイ内のホットスポットの矩形の位置と、(ii)ホットスポットのXMLファイルと、(iii)ホットスポットの簡単な記述を含む「参考」を指定する。このように、聖マリー病院のホットスポットは、その幅が0.558から0.6に広がり、高さは0.620588から0.679412に広がる。これらの座標はディスプレイ全体が1の幅および高さを有するように正規化されている。聖マリー病院のホットスポットは、St_marys_hospital.xmlという名前のXMLファイルを参照し、「聖マリー病院」というテキストの「参考」を備えている。このように、このホットスポットが現在選択されているホットスポットのときは、図2Bに示すように「聖マリー病院」というテキストが携帯電話のディスプレイに現れる。このホットスポットがユーザーにより選択されると、仮想ツアーは、聖マリー病院のXMLファイルにジャンプする。
聖マリー病院のXMLファイルは、本発明の好適な実施形態による付録A2にリストされている。このリストは、図4Bに示される球形パノラマ画像St_marys_hospital.jpgを参照する。パノラマ画像のタグは、視野の垂直フィールドおよびピッチ範囲のようないくつかの視覚パラメータを含む。リストはまた2つのホットスポットを参照し、その1つは「プリードサウスワーフ(Praed South Wharf)」でありもう1つは、「プリードロンドンストリート(Praed London St)」である。なお、パノラマ画像は、その中に組み込まれた2つのホットスポットのアイコンを有している。
パディントン駅のXMLファイルは、本発明の好適な実施形態による付録A3にリストされている。このファイルは、付録A1にリストされているパディントン駅のホットスポットから呼び出される。このリストは、図4Cに示される球形パノラマ画像paddinton_station_interior.jpgを参照する。付録A3のリストは2つのホットスポットを示しており、1つは「プリードストリートへの歩道(Walkway to Praed St.)」と示され、もう1つは「メタ/一般情報テキスト」と示されている。一般情報テキストファイルは図2Fに示されたテキストを含む。電話ホットスポットの絵は図4Dに示されている。
携帯電話の自動ダイヤリングは好ましくは、シンビアンオペレーティングシステム機能であるcall.OpenNewCall (line, newCallName)およびcall.Dial (aPhoneNumber)を介して実現され、lineはシンビアンクラスRLineのインスタンスであり、callはシンビアンクラスRCallのインスタンスである。
上記の記述を読めば、当業者であれば、上述の方法およびシステムに適用可能な多数の明白な変形例があることを理解するであろう。このように、本明細書は、すでに携帯電話に格納されている画像コンテンツの対話型画像生成を記述したが、ある代替実施形態においては、画像コンテンツは、サーバーコンピュータから動的にダウンロードできる。具体的には、携帯電話のユーザーが、図1Aに示すアイシービューソフトウェアアプリケーションをサーバーコンピュータからダウンロードすると、そのダウンロードにはすべての画像コンテンツを含むか、一部の画像コンテンツを含むか、またはまったく画像コンテンツを含まないかもしれない。更に、携帯電話がアイシービューアプリケーションを実行するとき、携帯電話はインターネットに接続されていても、いなくてもよい。携帯電話がインターネットに接続されていないと、携帯電話は利用できるローカルコンテンツは何でも使用してアイシービューアプリケーションを実行する。携帯電話がインターネットに接続されていると、携帯電話がオンデマンドでコンテンツを引き出すか、サーバーが携帯電話にコンテンツを送るかのいずれかにより、携帯電話はサーバーからコンテンツをダウンロードする。
コンテンツを動的にダウンロードできる機能は、とりわけ、ユーザープロフィールに基づいてカスタムコンテンツをユーザーが利用可能にする機能、およびコンテンツを定期的に変更するという機能を含む、付加的機能を可能にする。
上述した明細書において、本発明は、その具体的な典型的実施形態を参照して記述された。しかし、付随する請求項に記載される本発明のより広い精神および範囲を逸脱することなく、この具体的な典型的実施形態に対して、種々の変形および変更が可能であることは明白であろう。従って、本明細書と図は、限定的な意味ではなく、例示的な意味を持つものと見なされるべきである。
図1A&図1B:本発明の好適な実施形態による、対話型画像生成アプリケーションを実行するノキア(Nokia)スマート携帯電話を示している。図1AApplication:アプリケーションTO-DO:予定事項リストHelp:ヘルプCommunic~:通信Tool:ツールConfigura:構成Option:オプションExit:終了iSeaVU:アイシービューLogs:ログ図1BiSeaVU:アイシービューMap view:地図表示画像London:ロンドンPaddington:パディントンReal estate demo:不動産デモRome:ローマWaterloe:ワーテルローCancel:キャンセル 図2A&B:本発明の好適な実施形態による、携帯電話上に表示されたパディントン駅(Paddington Station)の仮想ツアーを示している。図2APaddington Station:パディントン駅Map View:地図表示画像Help:ヘルプExit:終了図2BSt. Mary's Hospital:聖マリー病院Help:ヘルプExit:終了S Waarf Road:SワーフロードPREED:プリードNORFOLK:ノーフォークMap View:地図表示画像 図2C&D:同上図2CPread St. Mary's:プリード聖マリーEye View:目の視点での表示画像Help:ヘルプExit:終了図2DPread St. Mary's:プリード聖マリーEye View:目の視点での表示画像Help:ヘルプExit:終了 図2E&F:同上図2EMETA/General information:メタ/一般情報Eye View:目の視点での表示画像Help:ヘルプExit:終了図2FPhone:電話説明:パディントン駅へようこそ。この駅は最初、1854年にオープンし、最近再開発されました。Heathrow Express:ヒースロー急行Thamas train:テームズトレインHelp:ヘルプExit:終了 図2G:同上図2GPhone:電話説明:パディントン駅へようこそ。この駅は最初、1854年にオープンし、Phone:電話Dial this number?:この番号をダイヤルしますか? 図3A&B:本発明の好適な実施形態による、携帯電話上に表示されたロンドン(London)の仮想ツアーを示している。図3AGreater London:グレーターロンドンMap View:地図表示画像Help:ヘルプExit:終了図3BGreater London:グレーターロンドンMap View:地図表示画像Help:ヘルプExit:終了 図3C&D:同上図3CWaterloo:ワーテルローEye View:目の視点での表示画像Help:ヘルプExit:終了図3DGoldenjablee bridge:ゴールデンジャブリーブリッジEye View:目の視点での表示画像Help:ヘルプExit:終了 図3E&F:同上図3EWaterloo:ワーテルローEye View:目の視点での表示画像Help:ヘルプExit:終了図3FWaterloo:ワーテルローEye View:目の視点での表示画像Help:ヘルプExit:終了 図3G&H:同上図3GPhone:電話説明:息をのむような新しい庭園で、ロンドンの最も人気のある場所の1つで、園芸家の夢であり、王族の住まいであるウィンザー城への見学は、Call for more info.:更なる情報は、電話をHelp:ヘルプExit:終了図3HPhone:電話説明:息をのむような新しい庭園で、ロンドンの最も人気のある場所の1つで、園芸家の夢で、〜Dial this number?:この番号をダイヤルしますか? 図4A:本発明の好適な実施形態による、パディントン駅(Paddington Station)の仮想ツアーを生成するために使用される画像である。図4ABISHOP BRIDGE ROAD:ビショップブリッジロードLondon Street:ロンドンストリートS Wharf Street:SウヮーフストリートPREAD STREET:プリードストリートChapel Street:チャペルストリートFINISH:完了SALE PL:セールPLSUSSEX GARDENS:サセックスガーデンPaddington Station:パディントン駅EASTBOURRNETER:イーストバーンターSTART:スタートWinsland Street:ウィンズランドストリートNORFORK:ノーフォーク 図4B&C&D:同上図4DNational Rail equiry service:国有鉄道問合せサービスFirst Great Western:ファーストグレートウェスタンHeathrow Express:ヒースロー急行Thames Train:テームズトレインLeft luggage:置き忘れ荷物Lost property:紛失物説明:更に電話呼出しを表示するには左右にドラッグしてください。アイコンをタップすれば電話をか〜
符号の説明
100:携帯電話
110:キーパッド
120:カラーディスプレイ
130:4個の方向ボタン130
140:「OK」ボタン
150:左下と右下に現れるコマンドを起動するためのボタン
160:電話にロードされた種々のアプリケーション用のアイコン
170:ボックス枠
205:正方形のアイコンで示されるアクティブ領域
210:現在使用中のホットスポット
215:二重線の太い境界線215
220:記述
225:現在選択されている別のホットスポット
230:タブ
235:タブ
240:ホットスポット
245:ホットスポット
250:タブ
255:電話ホットスポット
260:現在選択されている電話ホットスポット
265:正方形の枠
310:現在選択されているホットスポット
320:記述
330:種々のホットスポット
340:ホットスポット
350:ホットスポット
370:メタデータホットスポット
380:電話ホットスポット
(付録)
付録A1〜A4は、本発明の好適な実施形態による、対話型画像生成のシステムを実現するために使用されるXMLファイルのソースリストである。
[0046] APPENDIX Al

[0047] <?xml version = "1.0" ?> <VirtualTourLocatio[pi]>

[0048] <ImageNavigator>

[0049] <ImageFile>PHOTOS/paddington_map.jpg</ImageFile>

[0050] <ViewerType>.l2D</ViewerType> </ImageNavigator> < Hotspot>

[0051] <Position>0.26 0.688235 0.302 0.750035</Position> <XMLSource>XML/paddington_station_interior.xml</XMLSource>

[0052] <Tip>Paddington Station</Tip> </Hotspot> < Hotspot>

[0053] <Position>0.74 0.370588 0.78 0.432353 </Position>

[0054] <XMLSource>XML/sale_place.xml</XMLSource>

[0055] <Tip>Sale Place</Tip> </Hotspot> <Hotspot>

[0056] <Position>0.67 0.461765 0.712 0.523529</Position>

[0057] <XMLSource>XML/south_wharf_road.xml</XMLSource>

[0058] <Tip>South Wharf</Tip> </Hotspot> <Hotspot>

[0059] <Position>O.558 0.620588 0.6 0.679412</Positio[pi]>

[0060] <XMLSource>XML/st_marys_hospital.xml</XMLSource>

[0061] <Tip>St. Mary's Hospital</Tip> </H[omicron]tspot> <Hotspot>

[0062] <Position>0.346 0.752941 0.388 0.814706</Position>

[0063] <XMLSource>XML/london_street.xml</XMLSource>

[0064] <Tip>London St</Tip> </Hotspot> <Hotspot>

[0065] <Position>O.836 0.220588 0.878 0.282388</Position> <XMLSource>XML/hilton_londo[pi]_metropole.xml </XMLSource>

[0066] <Tip>Hilton London Metropole</Tip> </Hotspot> </VirtualTourLocation>

[0067] APPENDIX A2

[0068] <?xml version = "1.0" ?> <VirtualTourLocation>

[0069] <ImageNavigator>

[0070] <ImageFile>PHOTOS/st_marys_hospital.jpg</ImageFile>

[0071] <ViewerType>Pano</ViewerType>

[0072] < panotype>SPHERE</panotype>

[0073] < pitchRange>-0.231 0.231 </pitchRange>

[0074] <vFov>-O.231 0.231</vFov>

[0075] <initialView>0.00286517 84.7636 26.4649</i[pi]itialView>

[0076] <Autospin>0</Autospin> </ImageNavigator> < Hotspot>

[0077] <XMLSource>XML/south_wharf_road.xml</XMLSource>

[0078] < Position>0.21572 0.730924 0.231289 0.904535</Position>

[0079] <Tip>Praed South Wharf</Tip> </Hotspot> < Hotspot>

[0080] <XMLSource>XML/london_street.xml</XMLSource>

[0081] < Position>0.752424 0.823293 0.767659 O.995984</Position>

[0082] <Tip>Praed London St</Tip> </Hotspot> </VirtualTourLocation>

[0083] APPENDIX A3

[0084] <?xml version = "1.0" ?> <VirtualTourLocation>

[0085] <ImageNavigator>

[0086] <ImageFile>PHOTOS/paddington_station_interior.jpg</ImageFile>

[0087] <ViewerType>Pano</ViewerType>

[0088] <panotype>SPHERE</panotype>

[0089] < pitchRange>-0.236 0.236</pitchRange>

[0090] <vFov>-O.236 0.236</vFov>

[0091] <i[pi]itialView>0.00286517 148.971 27.0379</initialView>

[0092] <Autospin>0</Autospin> </ImageNavigator> <Hotspot>

[0093] <XMLSource>XML/london_street.xml</XMLSource>

[0094] <Position>0.380086 0.650602 0.395028 0.817046</Position>

[0095] <Tip> Walkway To Praed St. </Tip> </Hotspot> <Hotspot>

[0096] <XMLSource>XML/paddington_Ge[pi]Info_meta.xml</XMLSource>

[0097] < Position>0.292291 0.666667 0.308291 O.847667</Position>

[0098] <Tip>META\General Information. txt</Tip> </Hotspot> </VirtualTourLocation> APPENDIX A4

[0099] <?xml version = "1.0" ?> <VirtualTourl_ocation>

[0100] <ImageNavigator>

[0101] <ImageFile>PHOTOS/paddington_GenInfo_meta.jpg</ImageFile>

[0102] <ViewerType>J2D</ViewerType> </ImageNavigator> <Hotspot>

[0103] <XMLSource>XML/paddington_station_interior.xml</XMLSource>

[0104] <Position>0.0148 0.111 0.0529 0.444</Position>

[0105] <Tip> Phone / +44 8457 484950</Tip> </Hotspot> < Hotspot>

[0106] <XML[Xi]ource>XML/paddington_station_i[pi]terior.xml </XMLSource>

[0107] <Position>0.229 0.143 0.2682 0.461 </Position>

[0108] <Tip>Phone / +44 8456 005604</Tip> </Hotspot> < Hotspot>

[0109] <XMLSource>XML/paddington_station_interior.xml</XMLSource>

[0110] <Position>0.403 0.127 0.4423 0.445</Position >

[0111] <Tip>Phone / +44 8456 001515</Tip> </Hotspot> < Hotspot>

[0112] <XMLSource>XML/paddington_station_interior.xml </XMLSource>

[0113] <Position>0.564 0.143 0.6032 0.461</Position>

[0114] <T[iota]p>Phone / +44 8453 303728</Tip> </Hotspot> <Hotspot>

[0115] <XMLSource>XML/paddington_station_interior.xml </XMLSource>

[0116] <Position>O.71 0.111 0.7492 0.444</Position>

[0117] <Tip>Phone / +44 2072 620344</Tip> </Hotspot> <Hotspot>

[0118] <XMLSource>XML/paddington_station_interior.xml </XMLSource>

[0119] < Position>0.852 0.127 0.8914 0.445</Position>

[0120] <Tip>Phone / +44 2072 620344</Tip> </Hotspot> </VirtualTourLocation>

[0121] APPENDIX Bl

[0122] const Tint KMaxPhoneLength = 0x10;

[0123] CHintController: :CHintController(): ipProjectManager(NULL), ipDrawEngine(NULL), ipProjectSniffler(NULL) { }

[0124] CHintController: : ~CHintController()

[0125] { delete ipProjectManager; delete ipProjectSniffler; delete ipDrawEngine; delete iScrollTimer; delete iLogFile; } void CHintController: :Constructl_()

[0126] { ipProjectSniffler = CHintProjectSniffler: :NewL(); if(!ipProjectSniffler->Sniff(KDataDirectoryC)) if( !ipProjectSniffler->Sniff(KDataDirectoryD)) if( !ipProjectSniffler->Sniff(KDataDirectoryE))

[0127] {

[0128] ShowErrorDialog(KNoContentErrorMsgLnl,

[0129] KNoContentErrorMsgLn2);

[0130] ExitApplicationO; return;

[0131] >

[0132] TFileName chosenProjDir; if(!ChooseProjectL(chosenProjDir))

[0133] {

[0134] ExitApplication(); return;

[0135] } ipProjectManager = CHintProjectManager: :NewL(chosenProjDir); ipProjectManager- >LoadVTourL(); ipDrawEngine = CHintDrawEngine: :NewL(); ipDrawEngine- >SetProject(ipProjectMa[pi]ager); ipDrawEngine->SetController(this); iPenDown = false; iPenDrag = false; iPenUp = false; iScrollTimer = CPeriodic: :NewL(CActive: :EPriorityStandard); iPointerEventDown.iPosition.iX = 0; iPointerEventDown.iPosition.iY = 0; iPointerEventDrag.iPosition.iX = 0; iPointerEventDrag.iPosition.iY = 0; iPointerEventUp.iPosition.iX = 0; iPointerEventUp.iPosition.iY = 0; >

[0136] TBool CHintController: :ChooseProjectL(TFileName& chosenProjDir, TBool bAddCrtNb) TBool bOk = true; RArray<TName> projects; CleanupClosePushL(projects); ipProjectSniffler->GetProjects(projects); if(projects.Count() == 1)

[0137] { ipProjectSniffler->GetProjectDir(projects[0], chosenProjDir); CleanupStack: :PopAndDestroy(); return bOk;

[0138] }

[0139] CDesCArrayFlat* items = new(ELeave) CDesCArrayFlat(projects.Count());

[0140] CleanupStack: : PushL(items); for(int i = 0; i < projects. CountQ; i + + )

[0141] {

[0142] TName name; if(bAddCrtNb)

[0143] { name.AppendNum(i + 1); name.Append(_L("\t"));

[0144] } name.Append(projects[i]); items- >AppendL(name);

[0145] }

[0146] Tint nChosenProj = 0; if(GetUserChosenProject(nChosenProj, items)) ipProjectSniffler->GetProjectDir(projects[nChosenProj], chosenProjDir); else bOk = false; items->Reset();

[0147] CleanupStack: :PopAndDestroy(); ' CleanupStack: :PopAndDestroy(); return bOk; }

[0148] TKeyResponse CHintController: :HandleKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)

[0149] {

[0150] TKeyResponse keyResponse = EKeyWasConsumed; Tint active = GetActiveViewIndex(); Tint count = GetViewCountQ; if( aType ! = EEventKey) return EKeyWasNotConsumed; TFileName metaFileName; ipProjectManager->GetProjectDirectory(metaFileName); switch (aKeyEvent. iScanCode)

[0151] { case EStdKeyUpArrow: ipDrawEngine->ScrollUp(); break; case EStdKeyDownArrow: ipDrawEngine->ScrollDown(); break; case EStdKeyLeftArrow: ipDrawEngine->ScrollLeft(); break; case EStdKeyRightArrow: ipDrawEngine->ScrollRight(); break; case 49: case 48: case 51:

[0152] { ipDrawEngine->ClearCache(); if(aKeyEvent.iScanCode == 49)

[0153] { active-; active = active < 0 ? count - 1 : active;

[0154] } else

[0155] { active+ + ; active = active % count; >

[0156] Display ViewNameBylndex(active); PrepareViewToActivate(active); SetActiveViewBylndex(active);

[0157] } break; case EStdKeyNkpAsterisk: case 42: case EStdKeyHash: case EStdKeyNkpMinus: ipProjectManager->GetCrtGallery()->inCrtHotSpot = ipProjectManager->GetCrtGallery()->GetNextHotSpot(aKeyEvent.iScanCode == 42 aKeyEvent.iScanCode == EStdKeyNkpAsterisk);

[0158] ShowTooltip(ipProjectManager->GetCrtGallery()- >GetCrtHotSpot()->iTip); ipDrawEngine->Update(); break; case EStdKeyDevice3: if(active == 0)

[0159] { ipDrawEngine->ClearCache(); CHintHotSpot* pCrtHotSpot = ipProjectManager- >GetCrtGallery()->GetCrtHotSpot(); bool bMetaSpot = false; TFileName& tip = pCrtHotSpot->iTip; if(tip.Find(KMetaFileTag) ! = KErrNotFound)

[0160] { bMetaSpot = true; metaFileName. Append (tip);

[0161] MetaViewSetFileNameL(metaFileName);

[0162] }

[0163] TFileName& link = pCrtHotSpot->iLink; if(!ipProjectManager->GalleryIsLoaded(link))

[0164] { ipProjectManager->LoadvTourl_ocationL(li[pi]k); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterTpCrtHotSpot = true;

[0165] > else

[0166] { TFileName& crtGalleryName = ipProjectMa[pi]ager- >GetCrtGallery()->iXMLFileName; if(link != crtGalleryName)

[0167] { <-> ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true- } }

[0168] Tint active = 1; if(bMetaSpot) active = 2;

[0169] DisplayViewNameBylndex(active); SetActiveViewBylndex(active); } else inactive == 1)

[0170] { ipDrawEngine->ClearCache(); CHintHotSpot* pCrtHotSpot = ipProjectManager- >GetCrtGallery()->GetCrtHotSpot(); bool bMetaSpot = false; TFileName& tip = pCrtHotSpot->iTip; if(tip.Fi[pi]d(KMetaFileTag) ! = KErrNotFound)

[0171] { bMetaSpot = true; metaFileName.Append(tip);

[0172] MetaViewSetFileNameL(metaFileName);

[0173] }

[0174] TFileName& link = pCrtHotSpot->iLink; if(!ipProjectManager->GalleryIsLoaded(link))

[0175] { ipProjectManager->LoadVTourLocationL(li[pi]k); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true; if(lbMetaSpot) ipDrawEngine->Update();

[0176] } else !

[0177] {

[0178] TFileNameS. crtGalleryName = ipProjectManager-

[0179] >GetCrtGallery()->iXMLFileName; if(link != crtGalleryName)

[0180] { ipProjectManager->SetCrtGallery(link); ipDrawE[pi]gine->ibCenterToCrtHotSpot = true; if(! bMetaSpot) ipDrawEngine->Update();

[0181] } else

[0182] { keyResponse = EKeyWasNotConsumed;

[0183] } } if(bMetaSpot)

[0184] { active = 2;

[0185] SetActiveViewBylndex(active); } } else if( active == 2 )

[0186] {

[0187] CHintHotSpot* pCrtHotSpot = ipProjectManager- >GetCrtGallery()->GetCrtHotSpot();

[0188] TFileName& tip = pCrtHotSpot->iTip; Tint pos = tip.Find(KMetaPhoneTag); if(pos ! = KErrNotFound) { pos += KMetaPhoneTag().Length(); Tint phoneNbLength = tip.LengthQ - pos; TBuf<KMaxPhoneLength> buf; buf = tip.Right(phoneNbLength); if(!ConfirmDialog(tip, KDialConfMsg)) break;

[0189] TRAPDferr. DialNumberUbun : ): if (err)

[0190] User: :InfoPrint(_L("Error dialing")); break;

[0191] } else if(tip.Find(KMetaEmailTag) I = KErrNotFound)

[0192] { break;

[0193] } } default: keyResponse = EKeyWasNotConsumed;

[0194] } return keyResponse;

[0195] } void CHintController: :PrepareViewToActivate(TInt active)

[0196] { inactive == 0)

[0197] {

[0198] HBufC* locationName = HBufC: :Newl_C(ipProjectManager- >GetCrtGallery()->iXMLFileName.Length());

[0199] *locationName = ipProjectManager->GetCrtGallery()->iXMLFileName; TFileName map; ipProjectManager->GetStartupLocation(map); if(!ipProjectManager->GalleryIsLoaded(map))

[0200] { ipProjectManager->LoadVTourLocationl_(map); ipProjectManager->SetCrtGallery(map); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0201] > else

[0202] { ipProjectManager->SetCrtGallery(map); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0203] >. ipProjectManager->GetCrtGallery()- >SetCurrentHotSpotByLink(*locationName);

[0204] CleanupStack: : PopAndDestroy(locationName);

[0205] } else if(active == 1)

[0206] { CHintHotSpot* pCrtHotSpot = ipProjectManager->GetCrtGallery()- >GetCrtHotSpot();

[0207] TFileName& link = pCrtHotSpot->il_ink; if(!ipProjectManager->GalleryIsLoaded(link))

[0208] { ipProjectManager->LoadVTourLocationL(link); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true; } else

[0209] { ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true; } } else inactive == 2)

[0210] {

[0211] CHintHotSpot* pCrtHotSpot = ipProjectManager->GetCrtGallery()- >GetCrtHotSpot();

[0212] TFileName& tip = pCrtHotSpot->iTip; i

[0213] TFileName& link = pCrtHotSpot->iLink; TFileName metaFileName; ipProjectManager->GetProjectDirectory(metaFileName); metaFileName.Append(tip); MetaViewSetFileNameL( metaFileName);

[0214] MetaViewUseDrawEngine(tip.Find(KMetaFileTag) != KErrNotFound); if(!ipProjectManager->GalleryIsLoaded(link))

[0215] { ipProjectManager->LoadVTourl_ocationL(link); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0216] } else

[0217] { ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0218] } void CHintController: :HandlePointerEventL(const TPointerEvent& aPointerEvent)

[0219] { switch(aPointerEvent.iType)

[0220] { case TPointerEvent: :EButtonlDown: iPenDown = true; iPenDrag = false; iPointerEventDown = aPointerEvent; iPointerEventDrag = aPointerEvent; break; case TPointerEvent: :EDrag: if([upsilon]PenDown) return; . iPenDrag = true;

[0221] {

[0222] TStdScanCode direction =

[0223] CheckPenDragDirection( iPointerEventDrag, aPointerEvent); switch (direction)

[0224] { case EStdKeyUpArrow: ipDrawEngine->ScrollDown(); break; case EStd Key Down Arrow: ipDrawEngine->ScrollUp(); break; case EStdKeyLeftArrow: ipDrawEngine->ScrollRight(); break; case EStdKeyRightArrow: ipDrawEngine->Scrolll_eft(); break; default: iPenDrag = false; } } iPointerEventDrag = aPointerEvent; break; case TPointerEvent: :EButtonlUp: if(iPenDrag && iScrollTimer && iScrollTimer->IsActive()) iScrollTimer->Cancel(); if([upsilon]PenDrag)

[0225] {

[0226] TPoint imagePos(0,0); ipDrawEngine->ImagePosFromScreenPos(imagePos, aPointerEvent.iPosition);

[0227] Tint nTappedSpot = ipProjectManager->GetCrtGallery()- >GetHotSpotFromPos(imagePos); if( nTappedSpot ! = -1)

[0228] { ipProjectManager->GetCrtGallery()->inCrtHotSpot nTappedSpot;

[0229] ShowTooltip(ipProjectManager->GetCrtGallery()- >GetCrtHotSpot()->iTip); ipDrawEngine->ibCenterToCrtHotSpot = false; ipDrawEngine->Update();

[0230] TKeyEvent aKeyEvent = {0}; aKeyEvent.iScanCode = EStdKeyDevice3; TEventCode aType; aType = EEventKey; HandleKeyEventUaKevEvent. aType) :

[0231] } } iPenDown = false; iPenDrag = false; iPointerEventUp = aPointerEvent; iPointerEventDrag. iPosition.iX = 0; iPointerEventDrag. iPosition.iY = 0; break; default:

[0232] {

[0233] Tint dummy = 1; dummy+ + ;

[0234] > } } void CHintController: :HandleUserTabSwitchEventL()

[0235] { if(ipDrawEngine) ipDrawEngine->ClearCache();

[0236] Tint index = GetActiveViewIndex(); PrepareViewToActivate( index); SetActiveViewBylndex(index); }

[0237] Tint CHintController: :ScrollTimerCallBack(TAny*)

[0238] { return 0;

[0239] }

[0240] TStdScanCode CHintController: :CheckPenDragDirection(const TPointerEvent& aPointerEventDragl, const TPointerEvent& aPointerEventDrag2)

[0241] {

[0242] TStdScanCode direction = EStdKeyNull;

[0243] TPoint delta = aPointerEventDrag2.iPosition - aPointerEventDragl. iPosition; if(delta.iX == 0 && delta. iY == 0)

[0244] { direction = EStdKeyNull;

[0245] > else if(delta.iX >= 0 && delta. iY >= 0)

[0246] { if(delta.iX > delta. iY) direction = EStdKeyRightArrow; else direction = EStdKeyDownArrow;

[0247] } else if(delta.iX >= 0 && delta. iY <= 0)

[0248] { delta. iY = -delta. iY; if(delta.iX > delta. iY) direction = EStdKeyRightArrow; else direction = EStdKeyUpArrow;

[0249] } else if(delta.iX <= 0 && delta. iY <= 0)

[0250] { delta. iX = -delta. iX; delta. iY = -delta. iY; if(delta.iX > delta. iY) direction = EStdKeyLeftArrow; else direction = EStdKeyUpArrow;

[0251] > else if(delta.iX <= 0 && delta. iY >= 0)

[0252] { delta. iX = -delta. iX; if(delta.iX > delta. iY) direction = EStdKeyLeftArrow; else direction = EStdKeyDownArrow;

[0253] } return direction;

[0254] } void CHintController: : DialNumberl_( const TDesC& aPhoneNumber)

[0255] {

[0256] RTelServer server;

[0257] CleanupClosePushLCserver);

[0258] User: : LeaveIfError(server.Connect());

[0259] TName tsy;

[0260] User: : LeaveIfError(server.GetTsyName(0, tsy)) ;

[0261] User: : LeaveIfError(server.LoadPhoneModu!e(tsy));

[0262] Tint numberPhones;

[0263] User: :LeaveIfError(server.EnumeratePhones(numberPhones));<'> if (numberPhones < 1)

[0264] User: : Leave(KErrNotFound);

[0265] RTelServer: :TPhoneInfo info;

[0266] User: : LeaveIfError(server.GetPhoneInfo(0, info));

[0267] RPhone phone;

[0268] CleanupClosePushL( phone);

[0269] User: : LeaveIfError(phone.Open(server, info.iName));

[0270] RPhone: :TLineInfo linelnfo;

[0271] User: : LeaveIfError(phone.GetLineInfo(0, linelnfo));

[0272] RLine line;

[0273] CleanupClosePushL(line);

[0274] User: : LeaveIfError(line.Open(phone, linelnfo. iName));

[0275] TBuf < 100> newCallName;

[0276] RCaII call;

[0277] CleanupClosePushL(call);

[0278] User: : LeaveIfError(call.OpenNewCall(line, newCallName));

[0279] User: :LeaveIfErrorfcall.Dialf aPhoneNumber));

[0280] CleanupStack: :PopAndDestroy(3);

[0281] User: : LeaveIfError(server.UnloadPhoneModule(tsy));

[0282] CleanupStack: :PopAndDestroy(&server); }

[0283] APPENDIX B 2

[0284] const Tint KScrollStep = 20; const Tint KScrollArrow = 5;

[0285] CHintDrawEngine* CHintDrawEngine: :NewL()

[0286] {

[0287] CHintDrawEngine* self = CHintDrawEngine: : NewLC();

[0288] CleanupStack: :Pop(); return self; }

[0289] CHintDrawEngine* CHintDrawEngine: :NewLC()

[0290] {

[0291] CHintDrawEngine* self = new (ELeave) CHintDrawEngineQ;

[0292] CleanupStack: : PushL(self); self->ConstructL(); return self; } void CHintDrawEngine: :Constructl_()

[0293] { ipProjectManager = NULL; ipDisplayCallback = NULL; ipController = NULL; ipArrlmages = new (ELeave) CArrayPtrFlat<CHintImageAdapter> (1);

[0294] }

[0295] CHintDrawEngine: :CHintDrawEngine() : iClientRect(0, 0,0,0)

[0296] { iCrtlmage = -1; iMaxCachedAdapters = 1; iTopLeft.iX = 0; iTopLeft.iY = 0; ibMarkHotSpots = false; ibCenterToCrtHotSpot = true; ibScrollUpBtn = false; ibScrollDownBtn = false; ibScrollLeftBtn = false; ibScrollRightBtn = false;

[0297] }

[0298] CHintDrawEngine: : ~CHintDrawEngine()

[0299] { ipProjectManager = NULL; ipDisplayCallback = NULL; ipController = NULL; if (ipArrlmages)

[0300] { for(TInt idx = 0; idx < ipArrImages->Count(); + + idx) ipArrImages->At(idx)->Cancel(); ipArrImages->ResetAndDestroy(); delete ipArrlmages; ipArrlmages = NULL; } > void CHintDrawEngine: :ClearCache()

[0301] { if (ipArrlmages)

[0302] { for(TInt idx = 0; idx < ipArrImages->Count(); + + idx) ipArrlmages- >At(idx)->Cancel(); ipArrlmages- >ResetAndDestroy (); delete ipArrlmages; ipArrlmages = NULL;

[0303] > iCrtlmage = -1; ipArrlmages = new (ELeave) CArrayPtrFlat<CHintImageAdapter> (1); } void CHintDrawEngine: :SetProject(CHintProjectManager* apHintProjectManager)

[0304] { ipProjectManager = apHintProjectManager;

[0305] > void CHintDrawEngine: :SetController(MHintController* apController)

[0306] { ipController = apController;

[0307] } void CHintDrawEngine: :Update()

[0308] {

[0309] CHintlmageNavigator* pCrtlmageNav = ipProjectManager->GetCrtImgNav(); . TFileName crtlmageName = pCrtImageNav->iImageFileName; Tint idx = 0; for(idx = 0; idx < ipArrImages->Count(); ++idx)

[0310] { if(crtImageName == ipArrImages->At(idx)->GetImageFileName()) break;

[0311] > if(idx == ipArrImages->Count())

[0312] {

[0313] CHintlmageAdapter* plmageAdapter = NULL; plmageAdapter =

[0314] CHintlmageAdapter: :NewLC(NEikonEnvironment: :EikEnv().DefaultDisplayMode()); plmageAdapter- >SetImageFileName(crtImageName); plmageAdapter- >SetDispCallback(ipDisplayCallback); plmageAdapter- >SetEngCallback(this); plmageAdapter- >ExecuteCommandL(EDecodeImage); ipArrImages->AppendL(pImageAdapter); CleanupStack: :Pop(pImageAdapter); iCrtlmage = idx;

[0315] > else

[0316] { iCrtlmage = idx; CheckScrollersO; if(ibCenterToCrtHotSpot)

[0317] CenterToCrtHotSpot(); if(ipDisplayCallback) ipDisplayCallback->Redraw(); } } void CHintDrawEngine: :CenterToCrtHotSpot()

[0318] {

[0319] CHintHotSpot* pSpot = NULL; pSpot = ipProjectManager->GetCrtGallery()->GetCrtHotSpot(); iTopLeft.iX = iClientRect.iTI.iX + iClientRect.Width()/2 - (pSpot->iX + pSpot- >iWidth / 2); iTopLeft.iY = iClientRect.iTI.iY + iClientRect.Height()/2 - (pSpot->iY + pSpot- >iHeight / 2);

[0320] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image());

[0321] Tint nBitmapHeight = bitmap->SizeInPixels().iHeight; if(iTopLeft.iY < = iClientRect.iTI.iY + iClientRect.HeightQ - nBitmapHeight) iTopLeft.iY = iClientRect.iTI.iY + iClientRect.Height() - nBitmapHeight; if(iTopLeft.iY >= iClientRect.iTI.iY) iTopLeft.iY = iClientRect.iTI.iY;

[0322] Tint nBitmapWidth = bit[pi][eta]ap->SizeInPixels().iWidth; if(iTopLeft.iX <= iClientRect.iTI.iX + iClientRect.Width() - nBitmapWidth) iTopLeft.iX = iClientRect.iTI.iX + iClientRect.Width() - nBitmapWidth; if(iTopLeft.iX >= iClientRect.iTI.iX) iTopLeft.iX = iClientRect.iTI.iX; <'>

[0323] > void CHintDrawEngine: :SystemRedraw()

[0324] { if(ipDisplayCallback) ipDisplayCallback->Redraw();

[0325] } void CHintDrawEngine: :ImageReady()

[0326] {

[0327] NormalizeHotSpots(iCrtlmage);

[0328] CenterToCrtHotSpot(); CheckScrollersO; ipController-> ImageReady (); if(ipDisplayCallback) ipDisplayCallback->Redraw();

[0329] } void CHintDrawEngine: :SetDisplayReference(MDisplayCallback* apDisplayRef)

[0330] { ipDisplayCallback = apDisplayRef; if(ipDisplayCallback)

[0331] { ipDisplayCallback->GetWindowClientRect(iClientRect);

[0332] TopLeft = iClientRect.iTI; > } void CHintDrawEngine: :Draw(CWindowGc& gc, const TRect&) const

[0333] { if(iCrtImage == -1) return; if(ipArrImages->At(iCrtImage)->GetErr() ! = KErrNone) return; if(!ipArrImages->At(iCrtImage)->ImageLoaded()) { return;

[0334] >

[0335] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image()); TBool bUseVirtualTI = false; if(ipProjectMa[pi]ager->GetCrtImgNav()->iViewerType == 1)

[0336] { if(iTopLeft.iX > iClientRect.iTI.iX)

[0337] {

[0338] TPoint virtTopLeft(iTopLeft.iX - bitmap->SizeInPixels().iWidth, iTopLeftiY); gc.BitBlt(virtTopLeft, bitmap); bUseVirtualTI = true;

[0339] } gc.BitBlt(iTopLeft, bitmap);

[0340] } else <~> gc.BitBlt(iTopLeft, bitmap); CHintHotSpot* pSpot = NULL; gc.SetPenColor(KRgbRed); if(ibMarkHotSpots)

[0341] { for(TInt idx = 0; idx < ipProjectManager->GetCrtGallery()- >ipArrHotSpots->Count(); ++idx)

[0342] { pSpot = ipProjectManager->GetCrtGallery()->ipArrHotSpots-

[0343] >At(idx); gc.DrawRect( TRect( iTopLeft + TPoint(pSpot->iX, pSpot->iY), TSize(pSpot->iWidth, pSpot->iHeight) ) ); if(bUseVirtualTI)

[0344] {

[0345] TPoint virtTopLeft(iTopLeft.iX - bitmap- >SizeInPixels().iWidth, iTopLeft. iY); gc.DrawRect( TRect( virtTopLeft + TPoint(pSpot->iX, pSpot- >iY), TSize(pSpot->iWidth, pSpot->iHeight) ) );

[0346] } }

[0347] } pSpot = ipProjectManager->GetCrtGallery()->GetCrtHotSpot(); gc.DrawRect( TRect( iTopLeft + TPoint(pSpot->iX - 2, pSpot->iY - 2), TSize(pSpot->iWidth + 4, pSpot->iHeight + 4) ) );

[0348] DrawScrollers(gc); } void CHintDrawEngine: :ScrollUp()

[0349] { if(iTopLeft.iY == iCljentRect.iTI.iY) return; iTopLeft. iY += KScrollStep; if ( iTopLeft. iY >= iClientRect.iTI.iY) iTopLeft. iY = iClientRect.iTI.iY; CheckScrollersO; SystemRedrawQ;

[0350] > void CHintDrawEngine: :ScrollDown() CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image());

[0351] Tint nBitmapHeight = bitmap->SizeInPixels().iHeight; if(iTopLeft.iY = = iClientRect.iTI.iY + iClientRect.Height() - nBitmapHeight) return; iTopLeft.iY -= KScrollStep; if(iTopLeft.iY <= iClientRect.iTI.iY + iClientRect.HeightQ - nBitmapHeight) iTopLeft.iY = iClientRect.iTI.iY + iClientRect.HeightQ - nBitmapHeight; CheckScrollersQ; SystemRedraw();

[0352] } void CHintDrawEngine: :ScrollLeft()

[0353] { if(ipProjectManager->GetCrtImgNav()->iViewerType == 1)

[0354] { iTopLeft.iX += KScrollStep; if(iTopLeft.iX >= iClientRect.Width())

[0355] {

[0356] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image()); Tint nBitmapWidth = bitmap->SizeInPixels().iWidth; iTopLeft.iX = iClientRect.Width() - nBitmapWidth; } } else

[0357] { if(iTopLeft.iX == iClientRect.iTI.iX) return; iTopLeft.iX += KScrollStep; if(iTopLeft.iX >= iClientRect.iTI.iX) iTopLeft.iX = iClientRect.iTI.iX;

[0358] }

[0359] CheckScrollersQ;

[0360] SystemRedrawQ;

[0361] void CHintDrawEngine: :ScrollRight()

[0362] {

[0363] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image()); Tint nBitmapWidth = bitmap->SizeInPixels().iWidth; if(ipProjectManager->GetCrtImgNav()->iViewerType == 1)

[0364] { iTopLeft.iX -= KScrollStep; if(iTopLeft.iX <= iClientRect.WidthQ - nBitmapWidth)

[0365] { iTopLeft.iX = iClientRect.WidthQ;

[0366] } } else

[0367] { if(iTopLeft.iX == iClientRect.iTI.iX + iClientRect.WidthQ - nBitmapWidth) return; iTopLeft.iX -= KScrollStep; if(iTopLeft.iX <= iClientRect.iTI.iX + iClientRect.WidthQ - nBitmapWidth) iTopLeft.iX = iClientRect.iTI.iX + iClientRect.WidthQ - nBitmapWidth; } CheckScrollersQ; SystemRedrawQ; } void CHintDrawEngine: :NormalizeHotSpots(TInt aCrtlmage)

[0368] {

[0369] CFbsBitmap* bitmap = &(ipArrImages->At(aCrtImage)->Image()); Tint nBitmapWidth = bitmap->SizeInPixels().iWidth; Tint nBitmapHeight = bitmap->SizeInPixels().iHeight; if(!nBitmapWidth inBitmapHeight)

[0370] {

[0371] ASSERT(false); return;

[0372] }

[0373] CHintHotSpot* pSpot = NULL; for(TInt idx = 0; idx < ipProjectManager->GetCrtGallery()->ipArrHotSpots- >Count(); + + idx)

[0374] { pSpot = ipProjectManager->GetCrtGallery()->ipArrHotSpots->At(idx); pSpot->iX = TInt(nBitmapWidth * pSpot->iXsReal); pSpot->iY = TInt(nBitmapHeight * pSpot->iYsReai); pSpot->iWidth = TInt(nBitmapWidth * (pSpot->iXeReal - pSpot- >iXsReal)); pSpot->iHeight = TInt(nBitmapHeight * (pSpot->iYeReal - pSpot- >iYsReal));

[0375] > ipProjectManager->GetCrtGallery()->SortTheSpots();

[0376] } void CHintDrawEngine: :SetMarkHotSpots(TBool abMarkThem)

[0377] { ibMarkHotSpots = abMarkThem;

[0378] > void CHintDrawEngine: :CheckScrollers()

[0379] {

[0380] CFbsBitmap* pBitmap = &(ipArrImages->At(iCrtImage)->Image()); if(lpBitmap) return; ibScrollUpBtn = (iTopLeft.iY < iClientRect.iTI.iY); ibScrollDownBtn = (iTopLeft.iY + pBitmap->SizeInPixels().iHeight > iClientRect.iBr.iY); ibScrollLeftBtn = (iTopLeft.iX < iClientRect.iTI.iX); ibScrollRightBtn = (iTopLeft.iX + pBitmap->SizeInPixels().iWidth > iClientRect.iBr.iX); if(ipProjectManager->GetCrtImgNav()->iViewerType == 1)

[0381] { ibScrollLeftBtn = false; ibScrollRightBtn = false; } } void CHintDrawEngine: : DrawScrollers(CWindowGc& gc) const

[0382] {

[0383] TPoint ptOrig = TPoint(iClientRect.iTl.iX, iClientRect.iTI.iY);

[0384] Tint width = iClientRect.WidthQ; Tint height = iClientRect.HeightQ; Tint arrow = KScrollArrow; if(ibScrollLeftBtn) { gc.Drawl_ine(ptOrig + TPoint(0, height/2), ptOrig + TPoint(arrow, height/2 - arrow)); gc.Draw[upsilon]ne(ptOrig + TPoint(0, height/2), ptOrig + TPoint(arrow, height/2 + arrow)); gc.DrawLine(ptOrig + TPoint(arrow, height/2 - arrow), ptOrig + TPoint(arrow, height/2 + arrow));

[0385] > if(ibScrollRightBtn)

[0386] { gc.DrawLine(ptOrig + TPoint(width - arrow, height/2 - arrow), ptOrig + TPoint(width, height/2)); gc.Drawl_ine(ptOrig + TPoint(width - arrow, height/2 + arrow), ptOrig + TPoint(width, height/2)); gc.DrawLine(ptOrig + TPoint(width - arrow, height/2 - arrow), ptOrig + TPoint(width - arrow, height/2 + arrow));

[0387] } if(ibScrollUpBtn)

[0388] { gc.DrawLine(ptOrig + TPoint(width/2 - arrow, arrow), ptOrig + TPoint(width/2, O)); gc.DrawLine(ptOrig + TPoint(width/2, 0), ptOrig + TPoint(width/2 + arrow, arrow)); gc.DrawLine(ptOrig + TPoint(width/2 - arrow, arrow), ptOrig + TPoint(width/2 + arrow, arrow));

[0389] > if(ibScrollDownBtn)

[0390] { gc.Drawl_ine(ptOrig + TPoint(width/2 - arrow, height - arrow), ptOrig +

[0391] TPoint(width/2, height)); gc.DrawLine(ptOrig + TPoint(width/2, height), ptOrig + TPoint(width/2 + arrow, height - arrow)); gc.DrawLine(ptOrig + TPoint(wi[0046] APPENDIX Al

[0047] <?xml version = "1.0" ?> <VirtualTourLocatio[pi]>

[0048] <ImageNavigator>

[0049] <ImageFile>PHOTOS/paddington_map.jpg</ImageFile>

[0050] <ViewerType>.l2D</ViewerType> </ImageNavigator> < Hotspot>

[0051] <Position>0.26 0.688235 0.302 0.750035</Position> <XMLSource>XML/paddington_station_interior.xml</XMLSource>

[0052] <Tip>Paddington Station</Tip> </Hotspot> < Hotspot>

[0053] <Position>0.74 0.370588 0.78 0.432353 </Position>

[0054] <XMLSource>XML/sale_place.xml</XMLSource>

[0055] <Tip>Sale Place</Tip> </Hotspot> <Hotspot>

[0056] <Position>0.67 0.461765 0.712 0.523529</Position>

[0057] <XMLSource>XML/south_wharf_road.xml</XMLSource>

[0058] <Tip>South Wharf</Tip> </Hotspot> <Hotspot>

[0059] <Position>O.558 0.620588 0.6 0.679412</Positio[pi]>

[0060] <XMLSource>XML/st_marys_hospital.xml</XMLSource>

[0061] <Tip>St. Mary's Hospital</Tip> </H[omicron]tspot> <Hotspot>

[0062] <Position>0.346 0.752941 0.388 0.814706</Position>

[0063] <XMLSource>XML/london_street.xml</XMLSource>

[0064] <Tip>London St</Tip> </Hotspot> <Hotspot>

[0065] <Position>O.836 0.220588 0.878 0.282388</Position> <XMLSource>XML/hilton_londo[pi]_metropole.xml </XMLSource>

[0066] <Tip>Hilton London Metropole</Tip> </Hotspot> </VirtualTourLocation>

[0067] APPENDIX A2

[0068] <?xml version = "1.0" ?> <VirtualTourLocation>

[0069] <ImageNavigator>

[0070] <ImageFile>PHOTOS/st_marys_hospital.jpg</ImageFile>

[0071] <ViewerType>Pano</ViewerType>

[0072] < panotype>SPHERE</panotype>

[0073] < pitchRange>-0.231 0.231 </pitchRange>

[0074] <vFov>-O.231 0.231</vFov>

[0075] <initialView>0.00286517 84.7636 26.4649</i[pi]itialView>

[0076] <Autospin>0</Autospin> </ImageNavigator> < Hotspot>

[0077] <XMLSource>XML/south_wharf_road.xml</XMLSource>

[0078] < Position>0.21572 0.730924 0.231289 0.904535</Position>

[0079] <Tip>Praed South Wharf</Tip> </Hotspot> < Hotspot>

[0080] <XMLSource>XML/london_street.xml</XMLSource>

[0081] < Position>0.752424 0.823293 0.767659 O.995984</Position>

[0082] <Tip>Praed London St</Tip> </Hotspot> </VirtualTourLocation>

[0083] APPENDIX A3

[0084] <?xml version = "1.0" ?> <VirtualTourLocation>

[0085] <ImageNavigator>

[0086] <ImageFile>PHOTOS/paddington_station_interior.jpg</ImageFile>

[0087] <ViewerType>Pano</ViewerType>

[0088] <panotype>SPHERE</panotype>

[0089] < pitchRange>-0.236 0.236</pitchRange>

[0090] <vFov>-O.236 0.236</vFov>

[0091] <i[pi]itialView>0.00286517 148.971 27.0379</initialView>

[0092] <Autospin>0</Autospin> </ImageNavigator> <Hotspot>

[0093] <XMLSource>XML/london_street.xml</XMLSource>

[0094] <Position>0.380086 0.650602 0.395028 0.817046</Position>

[0095] <Tip> Walkway To Praed St. </Tip> </Hotspot> <Hotspot>

[0096] <XMLSource>XML/paddington_Ge[pi]Info_meta.xml</XMLSource>

[0097] < Position>0.292291 0.666667 0.308291 O.847667</Position>

[0098] <Tip>META\General Information. txt</Tip> </Hotspot> </VirtualTourLocation> APPENDIX A4

[0099] <?xml version = "1.0" ?> <VirtualTourl_ocation>

[0100] <ImageNavigator>

[0101] <ImageFile>PHOTOS/paddington_GenInfo_meta.jpg</ImageFile>

[0102] <ViewerType>J2D</ViewerType> </ImageNavigator> <Hotspot>

[0103] <XMLSource>XML/paddington_station_interior.xml</XMLSource>

[0104] <Position>0.0148 0.111 0.0529 0.444</Position>

[0105] <Tip> Phone / +44 8457 484950</Tip> </Hotspot> < Hotspot>

[0106] <XML[Xi]ource>XML/paddington_station_i[pi]terior.xml </XMLSource>

[0107] <Position>0.229 0.143 0.2682 0.461 </Position>

[0108] <Tip>Phone / +44 8456 005604</Tip> </Hotspot> < Hotspot>

[0109] <XMLSource>XML/paddington_station_interior.xml</XMLSource>

[0110] <Position>0.403 0.127 0.4423 0.445</Position >

[0111] <Tip>Phone / +44 8456 001515</Tip> </Hotspot> < Hotspot>

[0112] <XMLSource>XML/paddington_station_interior.xml </XMLSource>

[0113] <Position>0.564 0.143 0.6032 0.461</Position>

[0114] <T[iota]p>Phone / +44 8453 303728</Tip> </Hotspot> <Hotspot>

[0115] <XMLSource>XML/paddington_station_interior.xml </XMLSource>

[0116] <Position>O.71 0.111 0.7492 0.444</Position>

[0117] <Tip>Phone / +44 2072 620344</Tip> </Hotspot> <Hotspot>

[0118] <XMLSource>XML/paddington_station_interior.xml </XMLSource>

[0119] < Position>0.852 0.127 0.8914 0.445</Position>

[0120] <Tip>Phone / +44 2072 620344</Tip> </Hotspot> </VirtualTourLocation>

[0121] APPENDIX Bl

[0122] const Tint KMaxPhoneLength = 0x10;

[0123] CHintController: :CHintController(): ipProjectManager(NULL), ipDrawEngine(NULL), ipProjectSniffler(NULL) { }

[0124] CHintController: : ~CHintController()

[0125] { delete ipProjectManager; delete ipProjectSniffler; delete ipDrawEngine; delete iScrollTimer; delete iLogFile; } void CHintController: :Constructl_()

[0126] { ipProjectSniffler = CHintProjectSniffler: :NewL(); if(!ipProjectSniffler->Sniff(KDataDirectoryC)) if( !ipProjectSniffler->Sniff(KDataDirectoryD)) if( !ipProjectSniffler->Sniff(KDataDirectoryE))

[0127] {

[0128] ShowErrorDialog(KNoContentErrorMsgLnl,

[0129] KNoContentErrorMsgLn2);

[0130] ExitApplicationO; return;

[0131] >

[0132] TFileName chosenProjDir; if(!ChooseProjectL(chosenProjDir))

[0133] {

[0134] ExitApplication(); return;

[0135] } ipProjectManager = CHintProjectManager: :NewL(chosenProjDir); ipProjectManager- >LoadVTourL(); ipDrawEngine = CHintDrawEngine: :NewL(); ipDrawEngine- >SetProject(ipProjectMa[pi]ager); ipDrawEngine->SetController(this); iPenDown = false; iPenDrag = false; iPenUp = false; iScrollTimer = CPeriodic: :NewL(CActive: :EPriorityStandard); iPointerEventDown.iPosition.iX = 0; iPointerEventDown.iPosition.iY = 0; iPointerEventDrag.iPosition.iX = 0; iPointerEventDrag.iPosition.iY = 0; iPointerEventUp.iPosition.iX = 0; iPointerEventUp.iPosition.iY = 0; >

[0136] TBool CHintController: :ChooseProjectL(TFileName& chosenProjDir, TBool bAddCrtNb) TBool bOk = true; RArray<TName> projects; CleanupClosePushL(projects); ipProjectSniffler->GetProjects(projects); if(projects.Count() == 1)

[0137] { ipProjectSniffler->GetProjectDir(projects[0], chosenProjDir); CleanupStack: :PopAndDestroy(); return bOk;

[0138] }

[0139] CDesCArrayFlat* items = new(ELeave) CDesCArrayFlat(projects.Count());

[0140] CleanupStack: : PushL(items); for(int i = 0; i < projects. CountQ; i + + )

[0141] {

[0142] TName name; if(bAddCrtNb)

[0143] { name.AppendNum(i + 1); name.Append(_L("\t"));

[0144] } name.Append(projects[i]); items- >AppendL(name);

[0145] }

[0146] Tint nChosenProj = 0; if(GetUserChosenProject(nChosenProj, items)) ipProjectSniffler->GetProjectDir(projects[nChosenProj], chosenProjDir); else bOk = false; items->Reset();

[0147] CleanupStack: :PopAndDestroy(); ' CleanupStack: :PopAndDestroy(); return bOk; }

[0148] TKeyResponse CHintController: :HandleKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)

[0149] {

[0150] TKeyResponse keyResponse = EKeyWasConsumed; Tint active = GetActiveViewIndex(); Tint count = GetViewCountQ; if( aType ! = EEventKey) return EKeyWasNotConsumed; TFileName metaFileName; ipProjectManager->GetProjectDirectory(metaFileName); switch (aKeyEvent. iScanCode)

[0151] { case EStdKeyUpArrow: ipDrawEngine->ScrollUp(); break; case EStdKeyDownArrow: ipDrawEngine->ScrollDown(); break; case EStdKeyLeftArrow: ipDrawEngine->ScrollLeft(); break; case EStdKeyRightArrow: ipDrawEngine->ScrollRight(); break; case 49: case 48: case 51:

[0152] { ipDrawEngine->ClearCache(); if(aKeyEvent.iScanCode == 49)

[0153] { active-; active = active < 0 ? count - 1 : active;

[0154] } else

[0155] { active+ + ; active = active % count; >

[0156] Display ViewNameBylndex(active); PrepareViewToActivate(active); SetActiveViewBylndex(active);

[0157] } break; case EStdKeyNkpAsterisk: case 42: case EStdKeyHash: case EStdKeyNkpMinus: ipProjectManager->GetCrtGallery()->inCrtHotSpot = ipProjectManager->GetCrtGallery()->GetNextHotSpot(aKeyEvent.iScanCode == 42 aKeyEvent.iScanCode == EStdKeyNkpAsterisk);

[0158] ShowTooltip(ipProjectManager->GetCrtGallery()- >GetCrtHotSpot()->iTip); ipDrawEngine->Update(); break; case EStdKeyDevice3: if(active == 0)

[0159] { ipDrawEngine->ClearCache(); CHintHotSpot* pCrtHotSpot = ipProjectManager- >GetCrtGallery()->GetCrtHotSpot(); bool bMetaSpot = false; TFileName& tip = pCrtHotSpot->iTip; if(tip.Find(KMetaFileTag) ! = KErrNotFound)

[0160] { bMetaSpot = true; metaFileName. Append (tip);

[0161] MetaViewSetFileNameL(metaFileName);

[0162] }

[0163] TFileName& link = pCrtHotSpot->iLink; if(!ipProjectManager->GalleryIsLoaded(link))

[0164] { ipProjectManager->LoadvTourl_ocationL(li[pi]k); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterTpCrtHotSpot = true;

[0165] > else

[0166] { TFileName& crtGalleryName = ipProjectMa[pi]ager- >GetCrtGallery()->iXMLFileName; if(link != crtGalleryName)

[0167] { <-> ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true- } }

[0168] Tint active = 1; if(bMetaSpot) active = 2;

[0169] DisplayViewNameBylndex(active); SetActiveViewBylndex(active); } else inactive == 1)

[0170] { ipDrawEngine->ClearCache(); CHintHotSpot* pCrtHotSpot = ipProjectManager- >GetCrtGallery()->GetCrtHotSpot(); bool bMetaSpot = false; TFileName& tip = pCrtHotSpot->iTip; if(tip.Fi[pi]d(KMetaFileTag) ! = KErrNotFound)

[0171] { bMetaSpot = true; metaFileName.Append(tip);

[0172] MetaViewSetFileNameL(metaFileName);

[0173] }

[0174] TFileName& link = pCrtHotSpot->iLink; if(!ipProjectManager->GalleryIsLoaded(link))

[0175] { ipProjectManager->LoadVTourLocationL(li[pi]k); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true; if(lbMetaSpot) ipDrawEngine->Update();

[0176] } else !

[0177] {

[0178] TFileNameS. crtGalleryName = ipProjectManager-

[0179] >GetCrtGallery()->iXMLFileName; if(link != crtGalleryName)

[0180] { ipProjectManager->SetCrtGallery(link); ipDrawE[pi]gine->ibCenterToCrtHotSpot = true; if(! bMetaSpot) ipDrawEngine->Update();

[0181] } else

[0182] { keyResponse = EKeyWasNotConsumed;

[0183] } } if(bMetaSpot)

[0184] { active = 2;

[0185] SetActiveViewBylndex(active); } } else if( active == 2 )

[0186] {

[0187] CHintHotSpot* pCrtHotSpot = ipProjectManager- >GetCrtGallery()->GetCrtHotSpot();

[0188] TFileName& tip = pCrtHotSpot->iTip; Tint pos = tip.Find(KMetaPhoneTag); if(pos ! = KErrNotFound) { pos += KMetaPhoneTag().Length(); Tint phoneNbLength = tip.LengthQ - pos; TBuf<KMaxPhoneLength> buf; buf = tip.Right(phoneNbLength); if(!ConfirmDialog(tip, KDialConfMsg)) break;

[0189] TRAPDferr. DialNumberUbun : ): if (err)

[0190] User: :InfoPrint(_L("Error dialing")); break;

[0191] } else if(tip.Find(KMetaEmailTag) I = KErrNotFound)

[0192] { break;

[0193] } } default: keyResponse = EKeyWasNotConsumed;

[0194] } return keyResponse;

[0195] } void CHintController: :PrepareViewToActivate(TInt active)

[0196] { inactive == 0)

[0197] {

[0198] HBufC* locationName = HBufC: :Newl_C(ipProjectManager- >GetCrtGallery()->iXMLFileName.Length());

[0199] *locationName = ipProjectManager->GetCrtGallery()->iXMLFileName; TFileName map; ipProjectManager->GetStartupLocation(map); if(!ipProjectManager->GalleryIsLoaded(map))

[0200] { ipProjectManager->LoadVTourLocationl_(map); ipProjectManager->SetCrtGallery(map); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0201] > else

[0202] { ipProjectManager->SetCrtGallery(map); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0203] >. ipProjectManager->GetCrtGallery()- >SetCurrentHotSpotByLink(*locationName);

[0204] CleanupStack: : PopAndDestroy(locationName);

[0205] } else if(active == 1)

[0206] { CHintHotSpot* pCrtHotSpot = ipProjectManager->GetCrtGallery()- >GetCrtHotSpot();

[0207] TFileName& link = pCrtHotSpot->il_ink; if(!ipProjectManager->GalleryIsLoaded(link))

[0208] { ipProjectManager->LoadVTourLocationL(link); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true; } else

[0209] { ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true; } } else inactive == 2)

[0210] {

[0211] CHintHotSpot* pCrtHotSpot = ipProjectManager->GetCrtGallery()- >GetCrtHotSpot();

[0212] TFileName& tip = pCrtHotSpot->iTip; i

[0213] TFileName& link = pCrtHotSpot->iLink; TFileName metaFileName; ipProjectManager->GetProjectDirectory(metaFileName); metaFileName.Append(tip); MetaViewSetFileNameL( metaFileName);

[0214] MetaViewUseDrawEngine(tip.Find(KMetaFileTag) != KErrNotFound); if(!ipProjectManager->GalleryIsLoaded(link))

[0215] { ipProjectManager->LoadVTourl_ocationL(link); ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0216] } else

[0217] { ipProjectManager->SetCrtGallery(link); ipDrawEngine->ibCenterToCrtHotSpot = true;

[0218] } void CHintController: :HandlePointerEventL(const TPointerEvent& aPointerEvent)

[0219] { switch(aPointerEvent.iType)

[0220] { case TPointerEvent: :EButtonlDown: iPenDown = true; iPenDrag = false; iPointerEventDown = aPointerEvent; iPointerEventDrag = aPointerEvent; break; case TPointerEvent: :EDrag: if([upsilon]PenDown) return; . iPenDrag = true;

[0221] {

[0222] TStdScanCode direction =

[0223] CheckPenDragDirection( iPointerEventDrag, aPointerEvent); switch (direction)

[0224] { case EStdKeyUpArrow: ipDrawEngine->ScrollDown(); break; case EStd Key Down Arrow: ipDrawEngine->ScrollUp(); break; case EStdKeyLeftArrow: ipDrawEngine->ScrollRight(); break; case EStdKeyRightArrow: ipDrawEngine->Scrolll_eft(); break; default: iPenDrag = false; } } iPointerEventDrag = aPointerEvent; break; case TPointerEvent: :EButtonlUp: if(iPenDrag && iScrollTimer && iScrollTimer->IsActive()) iScrollTimer->Cancel(); if([upsilon]PenDrag)

[0225] {

[0226] TPoint imagePos(0,0); ipDrawEngine->ImagePosFromScreenPos(imagePos, aPointerEvent.iPosition);

[0227] Tint nTappedSpot = ipProjectManager->GetCrtGallery()- >GetHotSpotFromPos(imagePos); if( nTappedSpot ! = -1)

[0228] { ipProjectManager->GetCrtGallery()->inCrtHotSpot nTappedSpot;

[0229] ShowTooltip(ipProjectManager->GetCrtGallery()- >GetCrtHotSpot()->iTip); ipDrawEngine->ibCenterToCrtHotSpot = false; ipDrawEngine->Update();

[0230] TKeyEvent aKeyEvent = {0}; aKeyEvent.iScanCode = EStdKeyDevice3; TEventCode aType; aType = EEventKey; HandleKeyEventUaKevEvent. aType) :

[0231] } } iPenDown = false; iPenDrag = false; iPointerEventUp = aPointerEvent; iPointerEventDrag. iPosition.iX = 0; iPointerEventDrag. iPosition.iY = 0; break; default:

[0232] {

[0233] Tint dummy = 1; dummy+ + ;

[0234] > } } void CHintController: :HandleUserTabSwitchEventL()

[0235] { if(ipDrawEngine) ipDrawEngine->ClearCache();

[0236] Tint index = GetActiveViewIndex(); PrepareViewToActivate( index); SetActiveViewBylndex(index); }

[0237] Tint CHintController: :ScrollTimerCallBack(TAny*)

[0238] { return 0;

[0239] }

[0240] TStdScanCode CHintController: :CheckPenDragDirection(const TPointerEvent& aPointerEventDragl, const TPointerEvent& aPointerEventDrag2)

[0241] {

[0242] TStdScanCode direction = EStdKeyNull;

[0243] TPoint delta = aPointerEventDrag2.iPosition - aPointerEventDragl. iPosition; if(delta.iX == 0 && delta. iY == 0)

[0244] { direction = EStdKeyNull;

[0245] > else if(delta.iX >= 0 && delta. iY >= 0)

[0246] { if(delta.iX > delta. iY) direction = EStdKeyRightArrow; else direction = EStdKeyDownArrow;

[0247] } else if(delta.iX >= 0 && delta. iY <= 0)

[0248] { delta. iY = -delta. iY; if(delta.iX > delta. iY) direction = EStdKeyRightArrow; else direction = EStdKeyUpArrow;

[0249] } else if(delta.iX <= 0 && delta. iY <= 0)

[0250] { delta. iX = -delta. iX; delta. iY = -delta. iY; if(delta.iX > delta. iY) direction = EStdKeyLeftArrow; else direction = EStdKeyUpArrow;

[0251] > else if(delta.iX <= 0 && delta. iY >= 0)

[0252] { delta. iX = -delta. iX; if(delta.iX > delta. iY) direction = EStdKeyLeftArrow; else direction = EStdKeyDownArrow;

[0253] } return direction;

[0254] } void CHintController: : DialNumberl_( const TDesC& aPhoneNumber)

[0255] {

[0256] RTelServer server;

[0257] CleanupClosePushLCserver);

[0258] User: : LeaveIfError(server.Connect());

[0259] TName tsy;

[0260] User: : LeaveIfError(server.GetTsyName(0, tsy)) ;

[0261] User: : LeaveIfError(server.LoadPhoneModu!e(tsy));

[0262] Tint numberPhones;

[0263] User: :LeaveIfError(server.EnumeratePhones(numberPhones));<'> if (numberPhones < 1)

[0264] User: : Leave(KErrNotFound);

[0265] RTelServer: :TPhoneInfo info;

[0266] User: : LeaveIfError(server.GetPhoneInfo(0, info));

[0267] RPhone phone;

[0268] CleanupClosePushL( phone);

[0269] User: : LeaveIfError(phone.Open(server, info.iName));

[0270] RPhone: :TLineInfo linelnfo;

[0271] User: : LeaveIfError(phone.GetLineInfo(0, linelnfo));

[0272] RLine line;

[0273] CleanupClosePushL(line);

[0274] User: : LeaveIfError(line.Open(phone, linelnfo. iName));

[0275] TBuf < 100> newCallName;

[0276] RCaII call;

[0277] CleanupClosePushL(call);

[0278] User: : LeaveIfError(call.OpenNewCall(line, newCallName));

[0279] User: :LeaveIfErrorfcall.Dialf aPhoneNumber));

[0280] CleanupStack: :PopAndDestroy(3);

[0281] User: : LeaveIfError(server.UnloadPhoneModule(tsy));

[0282] CleanupStack: :PopAndDestroy(&server); }

[0283] APPENDIX B 2

[0284] const Tint KScrollStep = 20; const Tint KScrollArrow = 5;

[0285] CHintDrawEngine* CHintDrawEngine: :NewL()

[0286] {

[0287] CHintDrawEngine* self = CHintDrawEngine: : NewLC();

[0288] CleanupStack: :Pop(); return self; }

[0289] CHintDrawEngine* CHintDrawEngine: :NewLC()

[0290] {

[0291] CHintDrawEngine* self = new (ELeave) CHintDrawEngineQ;

[0292] CleanupStack: : PushL(self); self->ConstructL(); return self; } void CHintDrawEngine: :Constructl_()

[0293] { ipProjectManager = NULL; ipDisplayCallback = NULL; ipController = NULL; ipArrlmages = new (ELeave) CArrayPtrFlat<CHintImageAdapter> (1);

[0294] }

[0295] CHintDrawEngine: :CHintDrawEngine() : iClientRect(0, 0,0,0)

[0296] { iCrtlmage = -1; iMaxCachedAdapters = 1; iTopLeft.iX = 0; iTopLeft.iY = 0; ibMarkHotSpots = false; ibCenterToCrtHotSpot = true; ibScrollUpBtn = false; ibScrollDownBtn = false; ibScrollLeftBtn = false; ibScrollRightBtn = false;

[0297] }

[0298] CHintDrawEngine: : ~CHintDrawEngine()

[0299] { ipProjectManager = NULL; ipDisplayCallback = NULL; ipController = NULL; if (ipArrlmages)

[0300] { for(TInt idx = 0; idx < ipArrImages->Count(); + + idx) ipArrImages->At(idx)->Cancel(); ipArrImages->ResetAndDestroy(); delete ipArrlmages; ipArrlmages = NULL; } > void CHintDrawEngine: :ClearCache()

[0301] { if (ipArrlmages)

[0302] { for(TInt idx = 0; idx < ipArrImages->Count(); + + idx) ipArrlmages- >At(idx)->Cancel(); ipArrlmages- >ResetAndDestroy (); delete ipArrlmages; ipArrlmages = NULL;

[0303] > iCrtlmage = -1; ipArrlmages = new (ELeave) CArrayPtrFlat<CHintImageAdapter> (1); } void CHintDrawEngine: :SetProject(CHintProjectManager* apHintProjectManager)

[0304] { ipProjectManager = apHintProjectManager;

[0305] > void CHintDrawEngine: :SetController(MHintController* apController)

[0306] { ipController = apController;

[0307] } void CHintDrawEngine: :Update()

[0308] {

[0309] CHintlmageNavigator* pCrtlmageNav = ipProjectManager->GetCrtImgNav(); . TFileName crtlmageName = pCrtImageNav->iImageFileName; Tint idx = 0; for(idx = 0; idx < ipArrImages->Count(); ++idx)

[0310] { if(crtImageName == ipArrImages->At(idx)->GetImageFileName()) break;

[0311] > if(idx == ipArrImages->Count())

[0312] {

[0313] CHintlmageAdapter* plmageAdapter = NULL; plmageAdapter =

[0314] CHintlmageAdapter: :NewLC(NEikonEnvironment: :EikEnv().DefaultDisplayMode()); plmageAdapter- >SetImageFileName(crtImageName); plmageAdapter- >SetDispCallback(ipDisplayCallback); plmageAdapter- >SetEngCallback(this); plmageAdapter- >ExecuteCommandL(EDecodeImage); ipArrImages->AppendL(pImageAdapter); CleanupStack: :Pop(pImageAdapter); iCrtlmage = idx;

[0315] > else

[0316] { iCrtlmage = idx; CheckScrollersO; if(ibCenterToCrtHotSpot)

[0317] CenterToCrtHotSpot(); if(ipDisplayCallback) ipDisplayCallback->Redraw(); } } void CHintDrawEngine: :CenterToCrtHotSpot()

[0318] {

[0319] CHintHotSpot* pSpot = NULL; pSpot = ipProjectManager->GetCrtGallery()->GetCrtHotSpot(); iTopLeft.iX = iClientRect.iTI.iX + iClientRect.Width()/2 - (pSpot->iX + pSpot- >iWidth / 2); iTopLeft.iY = iClientRect.iTI.iY + iClientRect.Height()/2 - (pSpot->iY + pSpot- >iHeight / 2);

[0320] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image());

[0321] Tint nBitmapHeight = bitmap->SizeInPixels().iHeight; if(iTopLeft.iY < = iClientRect.iTI.iY + iClientRect.HeightQ - nBitmapHeight) iTopLeft.iY = iClientRect.iTI.iY + iClientRect.Height() - nBitmapHeight; if(iTopLeft.iY >= iClientRect.iTI.iY) iTopLeft.iY = iClientRect.iTI.iY;

[0322] Tint nBitmapWidth = bit[pi][eta]ap->SizeInPixels().iWidth; if(iTopLeft.iX <= iClientRect.iTI.iX + iClientRect.Width() - nBitmapWidth) iTopLeft.iX = iClientRect.iTI.iX + iClientRect.Width() - nBitmapWidth; if(iTopLeft.iX >= iClientRect.iTI.iX) iTopLeft.iX = iClientRect.iTI.iX; <'>

[0323] > void CHintDrawEngine: :SystemRedraw()

[0324] { if(ipDisplayCallback) ipDisplayCallback->Redraw();

[0325] } void CHintDrawEngine: :ImageReady()

[0326] {

[0327] NormalizeHotSpots(iCrtlmage);

[0328] CenterToCrtHotSpot(); CheckScrollersO; ipController-> ImageReady (); if(ipDisplayCallback) ipDisplayCallback->Redraw();

[0329] } void CHintDrawEngine: :SetDisplayReference(MDisplayCallback* apDisplayRef)

[0330] { ipDisplayCallback = apDisplayRef; if(ipDisplayCallback)

[0331] { ipDisplayCallback->GetWindowClientRect(iClientRect);

[0332] TopLeft = iClientRect.iTI; > } void CHintDrawEngine: :Draw(CWindowGc& gc, const TRect&) const

[0333] { if(iCrtImage == -1) return; if(ipArrImages->At(iCrtImage)->GetErr() ! = KErrNone) return; if(!ipArrImages->At(iCrtImage)->ImageLoaded()) { return;

[0334] >

[0335] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image()); TBool bUseVirtualTI = false; if(ipProjectMa[pi]ager->GetCrtImgNav()->iViewerType == 1)

[0336] { if(iTopLeft.iX > iClientRect.iTI.iX)

[0337] {

[0338] TPoint virtTopLeft(iTopLeft.iX - bitmap->SizeInPixels().iWidth, iTopLeftiY); gc.BitBlt(virtTopLeft, bitmap); bUseVirtualTI = true;

[0339] } gc.BitBlt(iTopLeft, bitmap);

[0340] } else <~> gc.BitBlt(iTopLeft, bitmap); CHintHotSpot* pSpot = NULL; gc.SetPenColor(KRgbRed); if(ibMarkHotSpots)

[0341] { for(TInt idx = 0; idx < ipProjectManager->GetCrtGallery()- >ipArrHotSpots->Count(); ++idx)

[0342] { pSpot = ipProjectManager->GetCrtGallery()->ipArrHotSpots-

[0343] >At(idx); gc.DrawRect( TRect( iTopLeft + TPoint(pSpot->iX, pSpot->iY), TSize(pSpot->iWidth, pSpot->iHeight) ) ); if(bUseVirtualTI)

[0344] {

[0345] TPoint virtTopLeft(iTopLeft.iX - bitmap- >SizeInPixels().iWidth, iTopLeft. iY); gc.DrawRect( TRect( virtTopLeft + TPoint(pSpot->iX, pSpot- >iY), TSize(pSpot->iWidth, pSpot->iHeight) ) );

[0346] } }

[0347] } pSpot = ipProjectManager->GetCrtGallery()->GetCrtHotSpot(); gc.DrawRect( TRect( iTopLeft + TPoint(pSpot->iX - 2, pSpot->iY - 2), TSize(pSpot->iWidth + 4, pSpot->iHeight + 4) ) );

[0348] DrawScrollers(gc); } void CHintDrawEngine: :ScrollUp()

[0349] { if(iTopLeft.iY == iCljentRect.iTI.iY) return; iTopLeft. iY += KScrollStep; if ( iTopLeft. iY >= iClientRect.iTI.iY) iTopLeft. iY = iClientRect.iTI.iY; CheckScrollersO; SystemRedrawQ;

[0350] > void CHintDrawEngine: :ScrollDown() CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image());

[0351] Tint nBitmapHeight = bitmap->SizeInPixels().iHeight; if(iTopLeft.iY = = iClientRect.iTI.iY + iClientRect.Height() - nBitmapHeight) return; iTopLeft.iY -= KScrollStep; if(iTopLeft.iY <= iClientRect.iTI.iY + iClientRect.HeightQ - nBitmapHeight) iTopLeft.iY = iClientRect.iTI.iY + iClientRect.HeightQ - nBitmapHeight; CheckScrollersQ; SystemRedraw();

[0352] } void CHintDrawEngine: :ScrollLeft()

[0353] { if(ipProjectManager->GetCrtImgNav()->iViewerType == 1)

[0354] { iTopLeft.iX += KScrollStep; if(iTopLeft.iX >= iClientRect.Width())

[0355] {

[0356] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image()); Tint nBitmapWidth = bitmap->SizeInPixels().iWidth; iTopLeft.iX = iClientRect.Width() - nBitmapWidth; } } else

[0357] { if(iTopLeft.iX == iClientRect.iTI.iX) return; iTopLeft.iX += KScrollStep; if(iTopLeft.iX >= iClientRect.iTI.iX) iTopLeft.iX = iClientRect.iTI.iX;

[0358] }

[0359] CheckScrollersQ;

[0360] SystemRedrawQ;

[0361] void CHintDrawEngine: :ScrollRight()

[0362] {

[0363] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image()); Tint nBitmapWidth = bitmap->SizeInPixels().iWidth; if(ipProjectManager->GetCrtImgNav()->iViewerType == 1)

[0364] { iTopLeft.iX -= KScrollStep; if(iTopLeft.iX <= iClientRect.WidthQ - nBitmapWidth)

[0365] { iTopLeft.iX = iClientRect.WidthQ;

[0366] } } else

[0367] { if(iTopLeft.iX == iClientRect.iTI.iX + iClientRect.WidthQ - nBitmapWidth) return; iTopLeft.iX -= KScrollStep; if(iTopLeft.iX <= iClientRect.iTI.iX + iClientRect.WidthQ - nBitmapWidth) iTopLeft.iX = iClientRect.iTI.iX + iClientRect.WidthQ - nBitmapWidth; } CheckScrollersQ; SystemRedrawQ; } void CHintDrawEngine: :NormalizeHotSpots(TInt aCrtlmage)

[0368] {

[0369] CFbsBitmap* bitmap = &(ipArrImages->At(aCrtImage)->Image()); Tint nBitmapWidth = bitmap->SizeInPixels().iWidth; Tint nBitmapHeight = bitmap->SizeInPixels().iHeight; if(!nBitmapWidth inBitmapHeight)

[0370] {

[0371] ASSERT(false); return;

[0372] }

[0373] CHintHotSpot* pSpot = NULL; for(TInt idx = 0; idx < ipProjectManager->GetCrtGallery()->ipArrHotSpots- >Count(); + + idx)

[0374] { pSpot = ipProjectManager->GetCrtGallery()->ipArrHotSpots->At(idx); pSpot->iX = TInt(nBitmapWidth * pSpot->iXsReal); pSpot->iY = TInt(nBitmapHeight * pSpot->iYsReai); pSpot->iWidth = TInt(nBitmapWidth * (pSpot->iXeReal - pSpot- >iXsReal)); pSpot->iHeight = TInt(nBitmapHeight * (pSpot->iYeReal - pSpot- >iYsReal));

[0375] > ipProjectManager->GetCrtGallery()->SortTheSpots();

[0376] } void CHintDrawEngine: :SetMarkHotSpots(TBool abMarkThem)

[0377] { ibMarkHotSpots = abMarkThem;

[0378] > void CHintDrawEngine: :CheckScrollers()

[0379] {

[0380] CFbsBitmap* pBitmap = &(ipArrImages->At(iCrtImage)->Image()); if(lpBitmap) return; ibScrollUpBtn = (iTopLeft.iY < iClientRect.iTI.iY); ibScrollDownBtn = (iTopLeft.iY + pBitmap->SizeInPixels().iHeight > iClientRect.iBr.iY); ibScrollLeftBtn = (iTopLeft.iX < iClientRect.iTI.iX); ibScrollRightBtn = (iTopLeft.iX + pBitmap->SizeInPixels().iWidth > iClientRect.iBr.iX); if(ipProjectManager->GetCrtImgNav()->iViewerType == 1)

[0381] { ibScrollLeftBtn = false; ibScrollRightBtn = false; } } void CHintDrawEngine: : DrawScrollers(CWindowGc& gc) const

[0382] {

[0383] TPoint ptOrig = TPoint(iClientRect.iTl.iX, iClientRect.iTI.iY);

[0384] Tint width = iClientRect.WidthQ; Tint height = iClientRect.HeightQ; Tint arrow = KScrollArrow; if(ibScrollLeftBtn) { gc.Drawl_ine(ptOrig + TPoint(0, height/2), ptOrig + TPoint(arrow, height/2 - arrow)); gc.Draw[upsilon]ne(ptOrig + TPoint(0, height/2), ptOrig + TPoint(arrow, height/2 + arrow)); gc.DrawLine(ptOrig + TPoint(arrow, height/2 - arrow), ptOrig + TPoint(arrow, height/2 + arrow));

[0385] > if(ibScrollRightBtn)

[0386] { gc.DrawLine(ptOrig + TPoint(width - arrow, height/2 - arrow), ptOrig + TPoint(width, height/2)); gc.Drawl_ine(ptOrig + TPoint(width - arrow, height/2 + arrow), ptOrig + TPoint(width, height/2)); gc.DrawLine(ptOrig + TPoint(width - arrow, height/2 - arrow), ptOrig + TPoint(width - arrow, height/2 + arrow));

[0387] } if(ibScrollUpBtn)

[0388] { gc.DrawLine(ptOrig + TPoint(width/2 - arrow, arrow), ptOrig + TPoint(width/2, O)); gc.DrawLine(ptOrig + TPoint(width/2, 0), ptOrig + TPoint(width/2 + arrow, arrow)); gc.DrawLine(ptOrig + TPoint(width/2 - arrow, arrow), ptOrig + TPoint(width/2 + arrow, arrow));

[0389] > if(ibScrollDownBtn)

[0390] { gc.Drawl_ine(ptOrig + TPoint(width/2 - arrow, height - arrow), ptOrig +

[0391] TPoint(width/2, height)); gc.DrawLine(ptOrig + TPoint(width/2, height), ptOrig + TPoint(width/2 + arrow, height - arrow)); gc.DrawLine(ptOrig + TPoint(width/2 - arrow, height - arrow), ptOrig + TPoint(width/2 + arrow, height - arrow));

[0392] } } void CHintDrawEngine: :ImagePosFromScree[pi]Pos(TPoint& almagePos, const TPoint& aScreenPos)

[0393] { almagePos = aScreenPos - iTopLeft; if(iTopLeft.iX > iClientRect.iTI.iX && aScreenPos. iX < iTopLeft. iX)

[0394] {

[0395] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image());

[0396] TPoint virtTopLeft(iTopl_eft.iX - bitmap->SizeInPixels().iWidth, iTopLeft. iY); almagePos = aScreenPos - virtTopLeft; } } dth/2 - arrow, height - arrow), ptOrig + TPoint(width/2 + arrow, height - arrow));

[0392] } } void CHintDrawEngine: :ImagePosFromScree[pi]Pos(TPoint& almagePos, const TPoint& aScreenPos)

[0393] { almagePos = aScreenPos - iTopLeft; if(iTopLeft.iX > iClientRect.iTI.iX && aScreenPos. iX < iTopLeft. iX)

[0394] {

[0395] CFbsBitmap* bitmap = &(ipArrImages->At(iCrtImage)->Image());

[0396] TPoint virtTopLeft(iTopl_eft.iX - bitmap->SizeInPixels().iWidth, iTopLeft. iY); almagePos = aScreenPos - virtTopLeft; } }

Claims (15)

  1. 対話型画像生成の方法であり、
    携帯機器のディスプレイに地図を表示することとであって、前記地図は少なくとも1つのアクティブ領域を含む、ことと、
    前記少なくとも1つのアクティブ領域の第1の選択を検知することであって、前記第1の選択は前記携帯機器の入力装置に関連する、ことと、
    前記少なくとも1つのアクティブ領域に関連する、視点からの表示画像を表示することであって、前記視点からの表示画像は、少なくとも1つの第2のアクティブ領域を含み、前記視点は、第2の選択に基づいており、前記少なくとも1つの第2のアクティブ領域は前記携帯機器の機能を起動するように構成される、ことと、を含む方法。
  2. 携帯機器を含む対話型画像生成のシステムであって、
    ディスプレイと、
    プロセッサとを備え、
    前記プロセッサは、前記ディスプレイに地図を描画することであって、前記地図は少なくとも1つのアクティブ領域を含む、ことと、
    前記少なくとも1つのアクティブ領域の第1の選択を検知することであって、前記第1の選択は前記携帯機器の入力装置に関連する、ことと、
    前記少なくとも1つのアクティブ領域に関連する、視点からの表示画像を表示することであって、前記視点からの表示画像は少なくとも1つの第2のアクティブ領域を含み、前記視点は、第2の選択に基づいており、前記少なくとも1つの第2のアクティブ領域は前記携帯機器の機能を起動するように構成される、ことと、を実行するように構成される、システム。
  3. コンピュータ装置によって実行された場合に前記コンピュータ装置に処理を行わせる命令を格納するコンピュータ読み取り可能記憶媒体であって、前記処理は、
    携帯機器のディスプレイに地図を表示することとであって、前記地図は少なくとも1つのアクティブ領域を含む、ステップと、
    前記少なくとも1つのアクティブ領域の第1の選択を検知することであって、前記第1の選択は前記携帯機器の入力装置に関連する、ステップと、
    前記少なくとも1つのアクティブ領域に関連する、視点からの表示画像を表示することであって、前記視点からの表示画像は少なくとも1つの第2のアクティブ領域を含み、前記視点は、第2の選択に基づいており、前記少なくとも1つの第2のアクティブ領域は前記携帯機器の機能を起動するように構成される、ステップと、を含むコンピュータ読み取り可能記憶媒体。
  4. 前記機能は、
    通話を開始することと、
    テキストを表示することと、
    メディアを表示することと、
    のうち少なくとも1つを含む、請求項1記載の方法。
  5. 前記表示画像を表示することは、前記ディスプレイに合うように前記表示画像を正規化することを含む、請求項1記載の方法。
  6. 前記地図及び前記表示画像はそれぞれXMLファイルに関連する、請求項1記載の方法。
  7. 前記入力装置は、ライトペン、キーパッドのうち少なくとも1つを含む、請求項1記載の方法。
  8. 前記機能は、
    通話を開始することと、
    テキストを表示することと、
    メディアを表示することと、
    のうち少なくとも1つを含む、請求項2記載のシステム。
  9. 前記表示画像を表示することは、前記ディスプレイに合うように前記表示画像を正規化することを含む、請求項2記載のシステム。
  10. 前記地図及び前記表示画像はそれぞれXMLファイルに関連する、請求項2記載のシステム。
  11. 前記入力装置は、ライトペン、キーパッドのうち少なくとも1つを含む、請求項2記載のシステム。
  12. 前記機能は、
    通話を開始することと、
    テキストを表示することと、
    メディアを表示することと、
    のうち少なくとも1つを含む、請求項3記載のコンピュータ読み取り可能記憶媒体。
  13. 前記表示画像を表示することは、前記ディスプレイに合うように前記表示画像を正規化することを含む、請求項3記載のコンピュータ読み取り可能記憶媒体。
  14. 前記地図及び前記表示画像はそれぞれXMLファイルに関連する、請求項3記載のコンピュータ読み取り可能記憶媒体。
  15. 前記入力装置は、ライトペン、キーパッドのうち少なくとも1つを含む、請求項3記載のコンピュータ読み取り可能記憶媒体。
JP2007534980A 2004-10-05 2005-09-29 携帯電話の対話型画像生成 Expired - Lifetime JP4934045B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US10/958,727 US7529552B2 (en) 2004-10-05 2004-10-05 Interactive imaging for cellular phones
US10/958,727 2004-10-05
PCT/CA2005/001487 WO2006037210A1 (en) 2004-10-05 2005-09-29 Interactive imaging for cellular phones

Publications (2)

Publication Number Publication Date
JP2008516482A JP2008516482A (ja) 2008-05-15
JP4934045B2 true JP4934045B2 (ja) 2012-05-16

Family

ID=36126210

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007534980A Expired - Lifetime JP4934045B2 (ja) 2004-10-05 2005-09-29 携帯電話の対話型画像生成

Country Status (5)

Country Link
US (1) US7529552B2 (ja)
EP (2) EP1803312B1 (ja)
JP (1) JP4934045B2 (ja)
CN (1) CN101073277B (ja)
WO (1) WO2006037210A1 (ja)

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7373017B2 (en) * 2005-10-04 2008-05-13 Sony Corporation System and method for capturing adjacent images by utilizing a panorama mode
JPWO2005005927A1 (ja) * 2003-07-10 2007-09-20 株式会社アプリコット 道案内システムおよび道案内方法
US7676543B2 (en) * 2005-06-27 2010-03-09 Scenera Technologies, Llc Associating presence information with a digital image
US20070011171A1 (en) * 2005-07-08 2007-01-11 Nurminen Jukka K System and method for operation control functionality
US20070083918A1 (en) * 2005-10-11 2007-04-12 Cisco Technology, Inc. Validation of call-out services transmitted over a public switched telephone network
US8243895B2 (en) * 2005-12-13 2012-08-14 Cisco Technology, Inc. Communication system with configurable shared line privacy feature
US20070281668A1 (en) * 2006-05-31 2007-12-06 Cisco Technology, Inc. Dialing assistant that includes an interface with a geographic display
US8687785B2 (en) 2006-11-16 2014-04-01 Cisco Technology, Inc. Authorization to place calls by remote users
US7990394B2 (en) 2007-05-25 2011-08-02 Google Inc. Viewing and navigating within panoramic images, and applications thereof
US9477368B1 (en) 2009-03-31 2016-10-25 Google Inc. System and method of indicating the distance or the surface of an image of a geographical object
KR20110052124A (ko) * 2009-11-12 2011-05-18 삼성전자주식회사 파노라마 이미지 생성 및 조회 방법과 이를 이용한 휴대 단말기
US10217283B2 (en) 2015-12-17 2019-02-26 Google Llc Navigation through multidimensional images spaces
US10997761B2 (en) * 2018-11-09 2021-05-04 Imaginear Inc. Systems and methods for creating and delivering augmented reality content

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09163460A (ja) * 1995-12-12 1997-06-20 Sony Corp 無線電話機の操作支援システム
JPH10322436A (ja) * 1997-05-16 1998-12-04 Kokusai Electric Co Ltd 電話番号検索システム
JP2000076284A (ja) * 1998-08-31 2000-03-14 Sony Corp 情報処理装置および方法、並びに提供媒体
JP2002213984A (ja) * 2001-01-12 2002-07-31 Oojisu Soken:Kk パノラマ画像による案内システム、中央装置及び端末装置、並びにコンピュータプログラム及び記録媒体
JP2002281496A (ja) * 2001-03-19 2002-09-27 Sanyo Electric Co Ltd 画像表示システム、端末装置、コンピュータプログラム及び記録媒体
JP2002288541A (ja) * 2001-03-28 2002-10-04 Ntt Comware Corp 広告料課金システム、そのプログラムおよびそのプログラムが記録されたコンピュータ読み取り可能な記録媒体
JP2003241649A (ja) * 2002-02-14 2003-08-29 Sony Corp 携帯端末およびそれにおける地図作成方法
JP2004085807A (ja) * 2002-08-26 2004-03-18 Nikken Office System Kk 画像配信装置及び方法

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7321783B2 (en) * 1997-04-25 2008-01-22 Minerva Industries, Inc. Mobile entertainment and communication device
US6463304B2 (en) * 1999-03-04 2002-10-08 Openwave Systems Inc. Application launcher for a two-way mobile communications device
US6731316B2 (en) * 2000-02-25 2004-05-04 Kargo, Inc. Graphical layout and keypad response to visually depict and implement device functionality for interactivity with a numbered keypad
US7138962B2 (en) * 2000-03-29 2006-11-21 Eric Koenig Multi-task interactive wireless telecommunications device
US20020173344A1 (en) 2001-03-16 2002-11-21 Cupps Bryan T. Novel personal electronics device
US6938221B2 (en) * 2001-11-30 2005-08-30 Microsoft Corporation User interface for stylus-based user input
CN2563870Y (zh) * 2002-07-25 2003-07-30 北京中电未来通讯技术开发有限公司 带pda功能的手机
CN2574121Y (zh) * 2002-09-17 2003-09-17 鸿富锦精密工业(深圳)有限公司 便携式电子装置
US20040250220A1 (en) * 2003-06-09 2004-12-09 Mika Kalenius System, apparatus, and method for navigation in a hypertext document
KR100677303B1 (ko) * 2003-12-26 2007-02-05 엘지전자 주식회사 휴대 단말기
US7031728B2 (en) * 2004-09-21 2006-04-18 Beyer Jr Malcolm K Cellular phone/PDA communication system

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09163460A (ja) * 1995-12-12 1997-06-20 Sony Corp 無線電話機の操作支援システム
JPH10322436A (ja) * 1997-05-16 1998-12-04 Kokusai Electric Co Ltd 電話番号検索システム
JP2000076284A (ja) * 1998-08-31 2000-03-14 Sony Corp 情報処理装置および方法、並びに提供媒体
JP2002213984A (ja) * 2001-01-12 2002-07-31 Oojisu Soken:Kk パノラマ画像による案内システム、中央装置及び端末装置、並びにコンピュータプログラム及び記録媒体
JP2002281496A (ja) * 2001-03-19 2002-09-27 Sanyo Electric Co Ltd 画像表示システム、端末装置、コンピュータプログラム及び記録媒体
JP2002288541A (ja) * 2001-03-28 2002-10-04 Ntt Comware Corp 広告料課金システム、そのプログラムおよびそのプログラムが記録されたコンピュータ読み取り可能な記録媒体
JP2003241649A (ja) * 2002-02-14 2003-08-29 Sony Corp 携帯端末およびそれにおける地図作成方法
JP2004085807A (ja) * 2002-08-26 2004-03-18 Nikken Office System Kk 画像配信装置及び方法

Also Published As

Publication number Publication date
EP1803312A1 (en) 2007-07-04
US20060073853A1 (en) 2006-04-06
EP3557396B1 (en) 2025-03-26
EP3557396A1 (en) 2019-10-23
WO2006037210A1 (en) 2006-04-13
EP1803312B1 (en) 2019-02-13
US7529552B2 (en) 2009-05-05
EP1803312A4 (en) 2012-01-11
JP2008516482A (ja) 2008-05-15
CN101073277B (zh) 2012-12-12
CN101073277A (zh) 2007-11-14

Similar Documents

Publication Publication Date Title
US11797149B2 (en) Method of dividing screen areas and mobile terminal employing the same
US9310888B2 (en) Multimodal layout and rendering
CN100449386C (zh) 多层显示器和具有这种显示器的终端
JP4934045B2 (ja) 携帯電話の対話型画像生成
US8825090B1 (en) Communication device
KR20150094478A (ko) 사용자 단말 장치 및 이의 디스플레이 방법
GB2357220A (en) A telecommunication apparatus and method for requesting the download of respective pages of received information from a remote source
US7865215B2 (en) Magnification of currently selected menu item
US20030038790A1 (en) Information processing system, input/output apparatus, personal digital assistant, and display apparatus
US20080254783A1 (en) Mobile terminal and method for displaying image according to call therein
US9098194B2 (en) Keypad of mobile terminal and display method thereof
KR100541192B1 (ko) 화상정보를 수신하기 위한 무선 단말기 및 그 방법
CN110245206B (zh) 地图样式的获取方法、装置、服务器、终端及存储介质
JP2007180951A (ja) 携帯電話
KR20120114431A (ko) 고객 서비스의 개선 및 고객 센터의 상담 부하를 줄이기 위한 통신 단말기와 그를 이용한 고객 서비스 운영 시스템 및 고객 서비스 운영 방법
JP2018005425A (ja) 表示制御方法、端末、及びプログラム
KR101413980B1 (ko) 모바일 단말에서 테이블타입 문서의 적응형 편집 방법 및 이를 위한 테이블타입 문서 적응형 편집 프로그램을 기록한 컴퓨터로 판독가능한 기록매체
KR20140089714A (ko) 상태 바를 변경하는 모바일 장치 및 그 제어 방법
KR102091140B1 (ko) 서비스를 제공하는 방법 및 그 장치
CA2532123C (en) Magnification of currently selected menu item
KR101196742B1 (ko) 이동통신 단말기에서 다차원 그래픽을 이용하는 계층적인유저인터페이스 제공 장치 및 방법
KR101549552B1 (ko) 휴대 단말기 및 그 동작 제어방법
KR20090024416A (ko) 휴대 단말기 및 휴대 단말기의 기능 실행 방법
JP2009003296A (ja) クライアント装置、サーバベースコンピューティングシステムおよびプログラム
KR101145020B1 (ko) 이동 통신 단말기에서의 달력을 이용한 정보 제공 방법 및상기 방법을 수행하는 이동 통신 단말기

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20080704

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100806

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100831

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20101026

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20101125

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20101202

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20101228

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20110111

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110125

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110331

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110628

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110816

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20111115

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120124

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120217

R150 Certificate of patent or registration of utility model

Ref document number: 4934045

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150224

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250