15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_file_chooser_dev.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_input_event.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/file_chooser_dev.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/file_ref.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/input_event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/instance_private.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/var_private.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MyInstance : public pp::InstancePrivate {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MyInstance(PP_Instance instance)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : pp::InstancePrivate(instance) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_factory_.Initialize(this);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleInputEvent(const pp::InputEvent& event) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (event.GetType()) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PP_INPUTEVENT_TYPE_MOUSEDOWN: {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pp::MouseInputEvent mouse_event(event);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_LEFT)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ShowFileChooser(false);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else if (mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_RIGHT)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ShowFileChooser(true);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowFileChooser(bool multi_select) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecreateConsole();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_FileChooserMode_Dev mode =
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (multi_select ? PP_FILECHOOSERMODE_OPENMULTIPLE
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      : PP_FILECHOOSERMODE_OPEN);
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::string accept_types = (multi_select ? "" : "text/plain");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chooser_ = pp::FileChooser_Dev(this, mode, accept_types);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chooser_.Show(callback_factory_.NewCallbackWithOutput(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &MyInstance::ShowSelectedFileNames));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowSelectedFileNames(int32_t result,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::vector<pp::FileRef>& files) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != PP_OK)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < files.size(); i++)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Log(files[i].GetName());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RecreateConsole() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::VarPrivate doc = GetWindowObject().GetProperty("document");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::VarPrivate body = doc.GetProperty("body");
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!console_.is_undefined())
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      body.Call("removeChild", console_);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    console_ = doc.Call("createElement", "pre");
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    console_.SetProperty("id", "console");
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    console_.GetProperty("style").SetProperty("backgroundColor", "lightgray");
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    body.Call("appendChild", console_);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Log(const pp::Var& var) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::VarPrivate doc = GetWindowObject().GetProperty("document");
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    console_.Call("appendChild", doc.Call("createTextNode", var));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    console_.Call("appendChild", doc.Call("createTextNode", "\n"));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::FileChooser_Dev chooser_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::CompletionCallbackFactory<MyInstance> callback_factory_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::VarPrivate console_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MyModule : public pp::Module {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MyModule() : pp::Module() {}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MyModule() {}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual pp::Instance* CreateInstance(PP_Instance instance) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new MyInstance(instance);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Factory function for your specialization of the Module object.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module* CreateModule() {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new MyModule();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
106