use ::{_API};
use capi::sctypes::*;
use platform::{BaseWindow, OsWindow};
use host::{Host, HostHandler};
use dom::event::{EventHandler};
use std::rc::Rc;
pub type Flags = SCITER_CREATE_WINDOW_FLAGS;
pub use capi::scdef::{SCITER_CREATE_WINDOW_FLAGS};
pub enum Options {
SmoothScroll(bool),
FontSmoothing(u8),
TransparentWindow(bool),
AlphaWindow(bool),
}
pub struct Window
{
base: OsWindow,
host: Rc<Host>,
}
impl Window {
pub fn new() -> Window {
Builder::main_window().create()
}
pub fn create(rect: (i32, i32, i32, i32), flags: SCITER_CREATE_WINDOW_FLAGS, parent: Option<HWINDOW>) -> Window {
let mut base = OsWindow::new();
let hwnd = base.create(rect, flags as UINT, parent.unwrap_or(0 as HWINDOW));
assert!(!hwnd.is_null());
let wnd = Window { base: base, host: Rc::new(Host::attach(hwnd))};
return wnd;
}
pub fn attach(hwnd: HWINDOW) -> Window {
assert!(!hwnd.is_null());
Window { base: OsWindow::from(hwnd), host: Rc::new(Host::attach(hwnd)) }
}
pub fn get_host(&self) -> Rc<Host> {
Rc::clone(&self.host)
}
pub fn sciter_handler<Callback: HostHandler + Sized>(&mut self, handler: Callback) {
self.host.setup_callback(handler);
}
pub fn event_handler<Handler: EventHandler>(&mut self, handler: Handler) {
self.host.attach_handler(handler);
}
pub fn register_behavior<Factory>(&mut self, name: &str, factory: Factory)
where
Factory: Fn() -> Box<EventHandler> + 'static
{
self.host.register_behavior(name, factory);
}
pub fn load_file(&mut self, uri: &str) {
self.host.load_file(uri)
}
pub fn load_html(&mut self, html: &[u8], uri: Option<&str>) {
self.host.load_html(html, uri)
}
pub fn get_hwnd(&self) -> HWINDOW {
self.base.get_hwnd()
}
pub fn collapse(&self, hide: bool) {
self.base.collapse(hide)
}
pub fn expand(&self, maximize: bool) {
self.base.expand(maximize)
}
pub fn dismiss(&self) {
self.base.dismiss()
}
pub fn set_title(&mut self, title: &str) {
self.base.set_title(title)
}
pub fn get_title(&self) -> String {
self.base.get_title()
}
pub fn set_options(&self, options: Options) -> Result<(), ()> {
use capi::scdef::SCITER_RT_OPTIONS::*;
use self::Options::*;
let (option, value) = match options {
SmoothScroll(enable) => (SCITER_SMOOTH_SCROLL, enable as usize),
FontSmoothing(technology) => (SCITER_FONT_SMOOTHING, technology as usize),
TransparentWindow(enable) => (SCITER_TRANSPARENT_WINDOW, enable as usize),
AlphaWindow(enable) => (SCITER_ALPHA_WINDOW, enable as usize),
};
let ok = (_API.SciterSetOption)(self.get_hwnd(), option, value);
if ok != 0 {
Ok(())
} else {
Err(())
}
}
pub fn run_app(self) {
self.base.expand(false);
self.base.run_app();
}
pub fn run_loop(&self) {
self.base.run_app();
}
pub fn quit_app(&self) {
self.base.quit_app()
}
}
#[derive(Default)]
pub struct Builder {
flags: Flags,
rect: RECT,
parent: Option<HWINDOW>,
}
impl Builder {
pub fn main_window() -> Self {
Builder::main()
.resizeable()
.closeable()
.with_title()
}
pub fn popup_window() -> Self {
Builder::popup()
.closeable()
.with_title()
}
pub fn child_window() -> Self {
Builder::with_flags(SCITER_CREATE_WINDOW_FLAGS::SW_CHILD)
}
pub fn none() -> Self {
Builder::with_flags(SCITER_CREATE_WINDOW_FLAGS::SW_CHILD) }
pub fn with_flags(flags: Flags) -> Self {
let mut me = Builder::default();
me.flags = flags;
me
}
pub fn main() -> Self {
Builder::with_flags(SCITER_CREATE_WINDOW_FLAGS::SW_MAIN)
}
pub fn popup() -> Self {
Builder::with_flags(SCITER_CREATE_WINDOW_FLAGS::SW_POPUP)
}
pub fn tool() -> Self {
Builder::with_flags(SCITER_CREATE_WINDOW_FLAGS::SW_TOOL)
}
pub fn with_parent(mut self, parent: HWINDOW) -> Self {
self.parent = Some(parent);
self
}
pub fn with_size(mut self, size: (i32, i32)) -> Self {
self.rect.right = self.rect.left + size.0;
self.rect.bottom = self.rect.top + size.1;
self
}
pub fn with_pos(mut self, position: (i32, i32)) -> Self {
let size = self.rect.size();
self.rect.left = position.0;
self.rect.top = position.1;
self.rect.right = position.0 + size.cx;
self.rect.bottom = position.1 + size.cy;
self
}
pub fn with_rect(mut self, rect: (i32, i32, i32, i32)) -> Self {
self.rect = RECT {
left: rect.0,
top: rect.1,
right: rect.2,
bottom: rect.3,
};
self
}
pub fn with_title(self) -> Self {
self.or(SCITER_CREATE_WINDOW_FLAGS::SW_TITLEBAR)
}
pub fn resizeable(self) -> Self {
self.or(SCITER_CREATE_WINDOW_FLAGS::SW_RESIZEABLE)
}
pub fn fixed(self) -> Self {
self.and(SCITER_CREATE_WINDOW_FLAGS::SW_RESIZEABLE)
}
pub fn closeable(self) -> Self {
self.or(SCITER_CREATE_WINDOW_FLAGS::SW_CONTROLS)
}
pub fn glassy(self) -> Self {
self.or(SCITER_CREATE_WINDOW_FLAGS::SW_GLASSY)
}
pub fn alpha(self) -> Self {
self.or(SCITER_CREATE_WINDOW_FLAGS::SW_ALPHA)
}
fn or(mut self, flag: Flags) -> Self {
self.flags = self.flags | flag;
self
}
fn and(mut self, flag: Flags) -> Self {
let masked = self.flags as u32 & !(flag as u32);
self.flags = unsafe { ::std::mem::transmute(masked) };
self
}
pub fn create(self) -> Window {
let r = self.rect;
Window::create((r.left, r.top, r.right, r.bottom), self.flags, self.parent)
}
}